]> Git Repo - binutils.git/blame - gas/config/tc-mips.c
*** empty log message ***
[binutils.git] / gas / config / tc-mips.c
CommitLineData
252b5132 1/* tc-mips.c -- assemble code for a MIPS chip.
81912461 2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
c67a084a
NC
3 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4 Free Software Foundation, Inc.
252b5132
RH
5 Contributed by the OSF and Ralph Campbell.
6 Written by Keith Knowles and Ralph Campbell, working independently.
7 Modified for ECOFF and R4000 support by Ian Lance Taylor of Cygnus
8 Support.
9
10 This file is part of GAS.
11
12 GAS is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
ec2655a6 14 the Free Software Foundation; either version 3, or (at your option)
252b5132
RH
15 any later version.
16
17 GAS is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
21
22 You should have received a copy of the GNU General Public License
23 along with GAS; see the file COPYING. If not, write to the Free
4b4da160
NC
24 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
25 02110-1301, USA. */
252b5132
RH
26
27#include "as.h"
28#include "config.h"
29#include "subsegs.h"
3882b010 30#include "safe-ctype.h"
252b5132 31
252b5132
RH
32#include "opcode/mips.h"
33#include "itbl-ops.h"
c5dd6aab 34#include "dwarf2dbg.h"
5862107c 35#include "dw2gencfi.h"
252b5132
RH
36
37#ifdef DEBUG
38#define DBG(x) printf x
39#else
40#define DBG(x)
41#endif
42
43#ifdef OBJ_MAYBE_ELF
44/* Clean up namespace so we can include obj-elf.h too. */
17a2f251
TS
45static int mips_output_flavor (void);
46static int mips_output_flavor (void) { return OUTPUT_FLAVOR; }
252b5132
RH
47#undef OBJ_PROCESS_STAB
48#undef OUTPUT_FLAVOR
49#undef S_GET_ALIGN
50#undef S_GET_SIZE
51#undef S_SET_ALIGN
52#undef S_SET_SIZE
252b5132
RH
53#undef obj_frob_file
54#undef obj_frob_file_after_relocs
55#undef obj_frob_symbol
56#undef obj_pop_insert
57#undef obj_sec_sym_ok_for_reloc
58#undef OBJ_COPY_SYMBOL_ATTRIBUTES
59
60#include "obj-elf.h"
61/* Fix any of them that we actually care about. */
62#undef OUTPUT_FLAVOR
63#define OUTPUT_FLAVOR mips_output_flavor()
64#endif
65
66#if defined (OBJ_ELF)
67#include "elf/mips.h"
68#endif
69
70#ifndef ECOFF_DEBUGGING
71#define NO_ECOFF_DEBUGGING
72#define ECOFF_DEBUGGING 0
73#endif
74
ecb4347a
DJ
75int mips_flag_mdebug = -1;
76
dcd410fe
RO
77/* Control generation of .pdr sections. Off by default on IRIX: the native
78 linker doesn't know about and discards them, but relocations against them
79 remain, leading to rld crashes. */
80#ifdef TE_IRIX
81int mips_flag_pdr = FALSE;
82#else
83int mips_flag_pdr = TRUE;
84#endif
85
252b5132
RH
86#include "ecoff.h"
87
88#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
89static char *mips_regmask_frag;
90#endif
91
85b51719 92#define ZERO 0
741fe287 93#define ATREG 1
252b5132
RH
94#define TREG 24
95#define PIC_CALL_REG 25
96#define KT0 26
97#define KT1 27
98#define GP 28
99#define SP 29
100#define FP 30
101#define RA 31
102
103#define ILLEGAL_REG (32)
104
741fe287
MR
105#define AT mips_opts.at
106
252b5132
RH
107/* Allow override of standard little-endian ECOFF format. */
108
109#ifndef ECOFF_LITTLE_FORMAT
110#define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
111#endif
112
113extern int target_big_endian;
114
252b5132 115/* The name of the readonly data section. */
4d0d148d 116#define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
252b5132 117 ? ".rdata" \
056350c6
NC
118 : OUTPUT_FLAVOR == bfd_target_coff_flavour \
119 ? ".rdata" \
252b5132
RH
120 : OUTPUT_FLAVOR == bfd_target_elf_flavour \
121 ? ".rodata" \
122 : (abort (), ""))
123
a4e06468
RS
124/* Ways in which an instruction can be "appended" to the output. */
125enum append_method {
126 /* Just add it normally. */
127 APPEND_ADD,
128
129 /* Add it normally and then add a nop. */
130 APPEND_ADD_WITH_NOP,
131
132 /* Turn an instruction with a delay slot into a "compact" version. */
133 APPEND_ADD_COMPACT,
134
135 /* Insert the instruction before the last one. */
136 APPEND_SWAP
137};
138
47e39b9d
RS
139/* Information about an instruction, including its format, operands
140 and fixups. */
141struct mips_cl_insn
142{
143 /* The opcode's entry in mips_opcodes or mips16_opcodes. */
144 const struct mips_opcode *insn_mo;
145
146 /* True if this is a mips16 instruction and if we want the extended
147 form of INSN_MO. */
148 bfd_boolean use_extend;
149
150 /* The 16-bit extension instruction to use when USE_EXTEND is true. */
151 unsigned short extend;
152
153 /* The 16-bit or 32-bit bitstring of the instruction itself. This is
154 a copy of INSN_MO->match with the operands filled in. */
155 unsigned long insn_opcode;
156
157 /* The frag that contains the instruction. */
158 struct frag *frag;
159
160 /* The offset into FRAG of the first instruction byte. */
161 long where;
162
163 /* The relocs associated with the instruction, if any. */
164 fixS *fixp[3];
165
a38419a5
RS
166 /* True if this entry cannot be moved from its current position. */
167 unsigned int fixed_p : 1;
47e39b9d 168
708587a4 169 /* True if this instruction occurred in a .set noreorder block. */
47e39b9d
RS
170 unsigned int noreorder_p : 1;
171
2fa15973
RS
172 /* True for mips16 instructions that jump to an absolute address. */
173 unsigned int mips16_absolute_jump_p : 1;
15be625d
CM
174
175 /* True if this instruction is complete. */
176 unsigned int complete_p : 1;
47e39b9d
RS
177};
178
a325df1d
TS
179/* The ABI to use. */
180enum mips_abi_level
181{
182 NO_ABI = 0,
183 O32_ABI,
184 O64_ABI,
185 N32_ABI,
186 N64_ABI,
187 EABI_ABI
188};
189
190/* MIPS ABI we are using for this output file. */
316f5878 191static enum mips_abi_level mips_abi = NO_ABI;
a325df1d 192
143d77c5
EC
193/* Whether or not we have code that can call pic code. */
194int mips_abicalls = FALSE;
195
aa6975fb
ILT
196/* Whether or not we have code which can be put into a shared
197 library. */
198static bfd_boolean mips_in_shared = TRUE;
199
252b5132
RH
200/* This is the set of options which may be modified by the .set
201 pseudo-op. We use a struct so that .set push and .set pop are more
202 reliable. */
203
e972090a
NC
204struct mips_set_options
205{
252b5132
RH
206 /* MIPS ISA (Instruction Set Architecture) level. This is set to -1
207 if it has not been initialized. Changed by `.set mipsN', and the
208 -mipsN command line option, and the default CPU. */
209 int isa;
1f25f5d3
CD
210 /* Enabled Application Specific Extensions (ASEs). These are set to -1
211 if they have not been initialized. Changed by `.set <asename>', by
212 command line options, and based on the default architecture. */
213 int ase_mips3d;
deec1734 214 int ase_mdmx;
e16bfa71 215 int ase_smartmips;
74cd071d 216 int ase_dsp;
8b082fb1 217 int ase_dspr2;
ef2e4d86 218 int ase_mt;
252b5132
RH
219 /* Whether we are assembling for the mips16 processor. 0 if we are
220 not, 1 if we are, and -1 if the value has not been initialized.
221 Changed by `.set mips16' and `.set nomips16', and the -mips16 and
222 -nomips16 command line options, and the default CPU. */
223 int mips16;
224 /* Non-zero if we should not reorder instructions. Changed by `.set
225 reorder' and `.set noreorder'. */
226 int noreorder;
741fe287
MR
227 /* Non-zero if we should not permit the register designated "assembler
228 temporary" to be used in instructions. The value is the register
229 number, normally $at ($1). Changed by `.set at=REG', `.set noat'
230 (same as `.set at=$0') and `.set at' (same as `.set at=$1'). */
231 unsigned int at;
252b5132
RH
232 /* Non-zero if we should warn when a macro instruction expands into
233 more than one machine instruction. Changed by `.set nomacro' and
234 `.set macro'. */
235 int warn_about_macros;
236 /* Non-zero if we should not move instructions. Changed by `.set
237 move', `.set volatile', `.set nomove', and `.set novolatile'. */
238 int nomove;
239 /* Non-zero if we should not optimize branches by moving the target
240 of the branch into the delay slot. Actually, we don't perform
241 this optimization anyhow. Changed by `.set bopt' and `.set
242 nobopt'. */
243 int nobopt;
244 /* Non-zero if we should not autoextend mips16 instructions.
245 Changed by `.set autoextend' and `.set noautoextend'. */
246 int noautoextend;
a325df1d
TS
247 /* Restrict general purpose registers and floating point registers
248 to 32 bit. This is initially determined when -mgp32 or -mfp32
249 is passed but can changed if the assembler code uses .set mipsN. */
250 int gp32;
251 int fp32;
fef14a42
TS
252 /* MIPS architecture (CPU) type. Changed by .set arch=FOO, the -march
253 command line option, and the default CPU. */
254 int arch;
aed1a261
RS
255 /* True if ".set sym32" is in effect. */
256 bfd_boolean sym32;
037b32b9
AN
257 /* True if floating-point operations are not allowed. Changed by .set
258 softfloat or .set hardfloat, by command line options -msoft-float or
259 -mhard-float. The default is false. */
260 bfd_boolean soft_float;
261
262 /* True if only single-precision floating-point operations are allowed.
263 Changed by .set singlefloat or .set doublefloat, command-line options
264 -msingle-float or -mdouble-float. The default is false. */
265 bfd_boolean single_float;
252b5132
RH
266};
267
037b32b9
AN
268/* This is the struct we use to hold the current set of options. Note
269 that we must set the isa field to ISA_UNKNOWN and the ASE fields to
270 -1 to indicate that they have not been initialized. */
271
a325df1d 272/* True if -mgp32 was passed. */
a8e8e863 273static int file_mips_gp32 = -1;
a325df1d
TS
274
275/* True if -mfp32 was passed. */
a8e8e863 276static int file_mips_fp32 = -1;
a325df1d 277
037b32b9
AN
278/* 1 if -msoft-float, 0 if -mhard-float. The default is 0. */
279static int file_mips_soft_float = 0;
280
281/* 1 if -msingle-float, 0 if -mdouble-float. The default is 0. */
282static int file_mips_single_float = 0;
252b5132 283
e972090a
NC
284static struct mips_set_options mips_opts =
285{
037b32b9
AN
286 /* isa */ ISA_UNKNOWN, /* ase_mips3d */ -1, /* ase_mdmx */ -1,
287 /* ase_smartmips */ 0, /* ase_dsp */ -1, /* ase_dspr2 */ -1, /* ase_mt */ -1,
288 /* mips16 */ -1, /* noreorder */ 0, /* at */ ATREG,
289 /* warn_about_macros */ 0, /* nomove */ 0, /* nobopt */ 0,
290 /* noautoextend */ 0, /* gp32 */ 0, /* fp32 */ 0, /* arch */ CPU_UNKNOWN,
291 /* sym32 */ FALSE, /* soft_float */ FALSE, /* single_float */ FALSE
e7af610e 292};
252b5132
RH
293
294/* These variables are filled in with the masks of registers used.
295 The object format code reads them and puts them in the appropriate
296 place. */
297unsigned long mips_gprmask;
298unsigned long mips_cprmask[4];
299
300/* MIPS ISA we are using for this output file. */
e7af610e 301static int file_mips_isa = ISA_UNKNOWN;
252b5132 302
738f4d98 303/* True if any MIPS16 code was produced. */
a4672219
TS
304static int file_ase_mips16;
305
3994f87e
TS
306#define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32 \
307 || mips_opts.isa == ISA_MIPS32R2 \
308 || mips_opts.isa == ISA_MIPS64 \
309 || mips_opts.isa == ISA_MIPS64R2)
310
b12dd2e4
CF
311/* True if we want to create R_MIPS_JALR for jalr $25. */
312#ifdef TE_IRIX
1180b5a4 313#define MIPS_JALR_HINT_P(EXPR) HAVE_NEWABI
b12dd2e4 314#else
1180b5a4
RS
315/* As a GNU extension, we use R_MIPS_JALR for o32 too. However,
316 because there's no place for any addend, the only acceptable
317 expression is a bare symbol. */
318#define MIPS_JALR_HINT_P(EXPR) \
319 (!HAVE_IN_PLACE_ADDENDS \
320 || ((EXPR)->X_op == O_symbol && (EXPR)->X_add_number == 0))
b12dd2e4
CF
321#endif
322
1f25f5d3
CD
323/* True if -mips3d was passed or implied by arguments passed on the
324 command line (e.g., by -march). */
325static int file_ase_mips3d;
326
deec1734
CD
327/* True if -mdmx was passed or implied by arguments passed on the
328 command line (e.g., by -march). */
329static int file_ase_mdmx;
330
e16bfa71
TS
331/* True if -msmartmips was passed or implied by arguments passed on the
332 command line (e.g., by -march). */
333static int file_ase_smartmips;
334
ad3fea08
TS
335#define ISA_SUPPORTS_SMARTMIPS (mips_opts.isa == ISA_MIPS32 \
336 || mips_opts.isa == ISA_MIPS32R2)
e16bfa71 337
74cd071d
CF
338/* True if -mdsp was passed or implied by arguments passed on the
339 command line (e.g., by -march). */
340static int file_ase_dsp;
341
ad3fea08
TS
342#define ISA_SUPPORTS_DSP_ASE (mips_opts.isa == ISA_MIPS32R2 \
343 || mips_opts.isa == ISA_MIPS64R2)
344
65263ce3
TS
345#define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
346
8b082fb1
TS
347/* True if -mdspr2 was passed or implied by arguments passed on the
348 command line (e.g., by -march). */
349static int file_ase_dspr2;
350
351#define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2 \
352 || mips_opts.isa == ISA_MIPS64R2)
353
ef2e4d86
CF
354/* True if -mmt was passed or implied by arguments passed on the
355 command line (e.g., by -march). */
356static int file_ase_mt;
357
ad3fea08
TS
358#define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2 \
359 || mips_opts.isa == ISA_MIPS64R2)
360
ec68c924 361/* The argument of the -march= flag. The architecture we are assembling. */
fef14a42 362static int file_mips_arch = CPU_UNKNOWN;
316f5878 363static const char *mips_arch_string;
ec68c924
EC
364
365/* The argument of the -mtune= flag. The architecture for which we
366 are optimizing. */
367static int mips_tune = CPU_UNKNOWN;
316f5878 368static const char *mips_tune_string;
ec68c924 369
316f5878 370/* True when generating 32-bit code for a 64-bit processor. */
252b5132
RH
371static int mips_32bitmode = 0;
372
316f5878
RS
373/* True if the given ABI requires 32-bit registers. */
374#define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
375
376/* Likewise 64-bit registers. */
707bfff6
TS
377#define ABI_NEEDS_64BIT_REGS(ABI) \
378 ((ABI) == N32_ABI \
379 || (ABI) == N64_ABI \
316f5878
RS
380 || (ABI) == O64_ABI)
381
ad3fea08 382/* Return true if ISA supports 64 bit wide gp registers. */
707bfff6
TS
383#define ISA_HAS_64BIT_REGS(ISA) \
384 ((ISA) == ISA_MIPS3 \
385 || (ISA) == ISA_MIPS4 \
386 || (ISA) == ISA_MIPS5 \
387 || (ISA) == ISA_MIPS64 \
388 || (ISA) == ISA_MIPS64R2)
9ce8a5dd 389
ad3fea08
TS
390/* Return true if ISA supports 64 bit wide float registers. */
391#define ISA_HAS_64BIT_FPRS(ISA) \
392 ((ISA) == ISA_MIPS3 \
393 || (ISA) == ISA_MIPS4 \
394 || (ISA) == ISA_MIPS5 \
395 || (ISA) == ISA_MIPS32R2 \
396 || (ISA) == ISA_MIPS64 \
397 || (ISA) == ISA_MIPS64R2)
398
af7ee8bf
CD
399/* Return true if ISA supports 64-bit right rotate (dror et al.)
400 instructions. */
707bfff6
TS
401#define ISA_HAS_DROR(ISA) \
402 ((ISA) == ISA_MIPS64R2)
af7ee8bf
CD
403
404/* Return true if ISA supports 32-bit right rotate (ror et al.)
405 instructions. */
707bfff6
TS
406#define ISA_HAS_ROR(ISA) \
407 ((ISA) == ISA_MIPS32R2 \
408 || (ISA) == ISA_MIPS64R2 \
409 || mips_opts.ase_smartmips)
410
7455baf8
TS
411/* Return true if ISA supports single-precision floats in odd registers. */
412#define ISA_HAS_ODD_SINGLE_FPR(ISA) \
413 ((ISA) == ISA_MIPS32 \
414 || (ISA) == ISA_MIPS32R2 \
415 || (ISA) == ISA_MIPS64 \
416 || (ISA) == ISA_MIPS64R2)
af7ee8bf 417
ad3fea08
TS
418/* Return true if ISA supports move to/from high part of a 64-bit
419 floating-point register. */
420#define ISA_HAS_MXHC1(ISA) \
421 ((ISA) == ISA_MIPS32R2 \
422 || (ISA) == ISA_MIPS64R2)
423
e013f690 424#define HAVE_32BIT_GPRS \
ad3fea08 425 (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
ca4e0257 426
e013f690 427#define HAVE_32BIT_FPRS \
ad3fea08 428 (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
ca4e0257 429
ad3fea08
TS
430#define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
431#define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
ca4e0257 432
316f5878 433#define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
e013f690 434
316f5878 435#define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
e013f690 436
3b91255e
RS
437/* True if relocations are stored in-place. */
438#define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
439
aed1a261
RS
440/* The ABI-derived address size. */
441#define HAVE_64BIT_ADDRESSES \
442 (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
443#define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
e013f690 444
aed1a261
RS
445/* The size of symbolic constants (i.e., expressions of the form
446 "SYMBOL" or "SYMBOL + OFFSET"). */
447#define HAVE_32BIT_SYMBOLS \
448 (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
449#define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
ca4e0257 450
b7c7d6c1
TS
451/* Addresses are loaded in different ways, depending on the address size
452 in use. The n32 ABI Documentation also mandates the use of additions
453 with overflow checking, but existing implementations don't follow it. */
f899b4b8 454#define ADDRESS_ADD_INSN \
b7c7d6c1 455 (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
f899b4b8
TS
456
457#define ADDRESS_ADDI_INSN \
b7c7d6c1 458 (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
f899b4b8
TS
459
460#define ADDRESS_LOAD_INSN \
461 (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
462
463#define ADDRESS_STORE_INSN \
464 (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
465
a4672219 466/* Return true if the given CPU supports the MIPS16 ASE. */
3396de36
TS
467#define CPU_HAS_MIPS16(cpu) \
468 (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0 \
469 || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
a4672219 470
60b63b72
RS
471/* True if CPU has a dror instruction. */
472#define CPU_HAS_DROR(CPU) ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
473
474/* True if CPU has a ror instruction. */
475#define CPU_HAS_ROR(CPU) CPU_HAS_DROR (CPU)
476
dd3cbb7e
NC
477/* True if CPU has seq/sne and seqi/snei instructions. */
478#define CPU_HAS_SEQ(CPU) ((CPU) == CPU_OCTEON)
479
b19e8a9b
AN
480/* True if CPU does not implement the all the coprocessor insns. For these
481 CPUs only those COP insns are accepted that are explicitly marked to be
482 available on the CPU. ISA membership for COP insns is ignored. */
483#define NO_ISA_COP(CPU) ((CPU) == CPU_OCTEON)
484
c8978940
CD
485/* True if mflo and mfhi can be immediately followed by instructions
486 which write to the HI and LO registers.
487
488 According to MIPS specifications, MIPS ISAs I, II, and III need
489 (at least) two instructions between the reads of HI/LO and
490 instructions which write them, and later ISAs do not. Contradicting
491 the MIPS specifications, some MIPS IV processor user manuals (e.g.
492 the UM for the NEC Vr5000) document needing the instructions between
493 HI/LO reads and writes, as well. Therefore, we declare only MIPS32,
494 MIPS64 and later ISAs to have the interlocks, plus any specific
495 earlier-ISA CPUs for which CPU documentation declares that the
496 instructions are really interlocked. */
497#define hilo_interlocks \
498 (mips_opts.isa == ISA_MIPS32 \
499 || mips_opts.isa == ISA_MIPS32R2 \
500 || mips_opts.isa == ISA_MIPS64 \
501 || mips_opts.isa == ISA_MIPS64R2 \
502 || mips_opts.arch == CPU_R4010 \
503 || mips_opts.arch == CPU_R10000 \
504 || mips_opts.arch == CPU_R12000 \
3aa3176b
TS
505 || mips_opts.arch == CPU_R14000 \
506 || mips_opts.arch == CPU_R16000 \
c8978940 507 || mips_opts.arch == CPU_RM7000 \
c8978940
CD
508 || mips_opts.arch == CPU_VR5500 \
509 )
252b5132
RH
510
511/* Whether the processor uses hardware interlocks to protect reads
81912461
ILT
512 from the GPRs after they are loaded from memory, and thus does not
513 require nops to be inserted. This applies to instructions marked
514 INSN_LOAD_MEMORY_DELAY. These nops are only required at MIPS ISA
515 level I. */
252b5132 516#define gpr_interlocks \
e7af610e 517 (mips_opts.isa != ISA_MIPS1 \
fef14a42 518 || mips_opts.arch == CPU_R3900)
252b5132 519
81912461
ILT
520/* Whether the processor uses hardware interlocks to avoid delays
521 required by coprocessor instructions, and thus does not require
522 nops to be inserted. This applies to instructions marked
523 INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
524 between instructions marked INSN_WRITE_COND_CODE and ones marked
525 INSN_READ_COND_CODE. These nops are only required at MIPS ISA
526 levels I, II, and III. */
bdaaa2e1 527/* Itbl support may require additional care here. */
81912461
ILT
528#define cop_interlocks \
529 ((mips_opts.isa != ISA_MIPS1 \
530 && mips_opts.isa != ISA_MIPS2 \
531 && mips_opts.isa != ISA_MIPS3) \
532 || mips_opts.arch == CPU_R4300 \
81912461
ILT
533 )
534
535/* Whether the processor uses hardware interlocks to protect reads
536 from coprocessor registers after they are loaded from memory, and
537 thus does not require nops to be inserted. This applies to
538 instructions marked INSN_COPROC_MEMORY_DELAY. These nops are only
539 requires at MIPS ISA level I. */
540#define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
252b5132 541
6b76fefe
CM
542/* Is this a mfhi or mflo instruction? */
543#define MF_HILO_INSN(PINFO) \
b19e8a9b
AN
544 ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
545
546/* Returns true for a (non floating-point) coprocessor instruction. Reading
547 or writing the condition code is only possible on the coprocessors and
548 these insns are not marked with INSN_COP. Thus for these insns use the
a242dc0d 549 condition-code flags. */
b19e8a9b
AN
550#define COP_INSN(PINFO) \
551 (PINFO != INSN_MACRO \
a242dc0d
AN
552 && ((PINFO) & (FP_S | FP_D)) == 0 \
553 && ((PINFO) & (INSN_COP | INSN_READ_COND_CODE | INSN_WRITE_COND_CODE)))
6b76fefe 554
252b5132
RH
555/* MIPS PIC level. */
556
a161fe53 557enum mips_pic_level mips_pic;
252b5132 558
c9914766 559/* 1 if we should generate 32 bit offsets from the $gp register in
252b5132 560 SVR4_PIC mode. Currently has no meaning in other modes. */
c9914766 561static int mips_big_got = 0;
252b5132
RH
562
563/* 1 if trap instructions should used for overflow rather than break
564 instructions. */
c9914766 565static int mips_trap = 0;
252b5132 566
119d663a 567/* 1 if double width floating point constants should not be constructed
b6ff326e 568 by assembling two single width halves into two single width floating
119d663a
NC
569 point registers which just happen to alias the double width destination
570 register. On some architectures this aliasing can be disabled by a bit
d547a75e 571 in the status register, and the setting of this bit cannot be determined
119d663a
NC
572 automatically at assemble time. */
573static int mips_disable_float_construction;
574
252b5132
RH
575/* Non-zero if any .set noreorder directives were used. */
576
577static int mips_any_noreorder;
578
6b76fefe
CM
579/* Non-zero if nops should be inserted when the register referenced in
580 an mfhi/mflo instruction is read in the next two instructions. */
581static int mips_7000_hilo_fix;
582
02ffd3e4 583/* The size of objects in the small data section. */
156c2f8b 584static unsigned int g_switch_value = 8;
252b5132
RH
585/* Whether the -G option was used. */
586static int g_switch_seen = 0;
587
588#define N_RMASK 0xc4
589#define N_VFP 0xd4
590
591/* If we can determine in advance that GP optimization won't be
592 possible, we can skip the relaxation stuff that tries to produce
593 GP-relative references. This makes delay slot optimization work
594 better.
595
596 This function can only provide a guess, but it seems to work for
fba2b7f9
GK
597 gcc output. It needs to guess right for gcc, otherwise gcc
598 will put what it thinks is a GP-relative instruction in a branch
599 delay slot.
252b5132
RH
600
601 I don't know if a fix is needed for the SVR4_PIC mode. I've only
602 fixed it for the non-PIC mode. KR 95/04/07 */
17a2f251 603static int nopic_need_relax (symbolS *, int);
252b5132
RH
604
605/* handle of the OPCODE hash table */
606static struct hash_control *op_hash = NULL;
607
608/* The opcode hash table we use for the mips16. */
609static struct hash_control *mips16_op_hash = NULL;
610
611/* This array holds the chars that always start a comment. If the
612 pre-processor is disabled, these aren't very useful */
613const char comment_chars[] = "#";
614
615/* This array holds the chars that only start a comment at the beginning of
616 a line. If the line seems to have the form '# 123 filename'
617 .line and .file directives will appear in the pre-processed output */
618/* Note that input_file.c hand checks for '#' at the beginning of the
619 first line of the input file. This is because the compiler outputs
bdaaa2e1 620 #NO_APP at the beginning of its output. */
252b5132
RH
621/* Also note that C style comments are always supported. */
622const char line_comment_chars[] = "#";
623
bdaaa2e1 624/* This array holds machine specific line separator characters. */
63a0b638 625const char line_separator_chars[] = ";";
252b5132
RH
626
627/* Chars that can be used to separate mant from exp in floating point nums */
628const char EXP_CHARS[] = "eE";
629
630/* Chars that mean this number is a floating point constant */
631/* As in 0f12.456 */
632/* or 0d1.2345e12 */
633const char FLT_CHARS[] = "rRsSfFdDxXpP";
634
635/* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
636 changed in read.c . Ideally it shouldn't have to know about it at all,
637 but nothing is ideal around here.
638 */
639
640static char *insn_error;
641
642static int auto_align = 1;
643
644/* When outputting SVR4 PIC code, the assembler needs to know the
645 offset in the stack frame from which to restore the $gp register.
646 This is set by the .cprestore pseudo-op, and saved in this
647 variable. */
648static offsetT mips_cprestore_offset = -1;
649
67c1ffbe 650/* Similar for NewABI PIC code, where $gp is callee-saved. NewABI has some
6478892d 651 more optimizations, it can use a register value instead of a memory-saved
956cd1d6 652 offset and even an other register than $gp as global pointer. */
6478892d
TS
653static offsetT mips_cpreturn_offset = -1;
654static int mips_cpreturn_register = -1;
655static int mips_gp_register = GP;
def2e0dd 656static int mips_gprel_offset = 0;
6478892d 657
7a621144
DJ
658/* Whether mips_cprestore_offset has been set in the current function
659 (or whether it has already been warned about, if not). */
660static int mips_cprestore_valid = 0;
661
252b5132
RH
662/* This is the register which holds the stack frame, as set by the
663 .frame pseudo-op. This is needed to implement .cprestore. */
664static int mips_frame_reg = SP;
665
7a621144
DJ
666/* Whether mips_frame_reg has been set in the current function
667 (or whether it has already been warned about, if not). */
668static int mips_frame_reg_valid = 0;
669
252b5132
RH
670/* To output NOP instructions correctly, we need to keep information
671 about the previous two instructions. */
672
673/* Whether we are optimizing. The default value of 2 means to remove
674 unneeded NOPs and swap branch instructions when possible. A value
675 of 1 means to not swap branches. A value of 0 means to always
676 insert NOPs. */
677static int mips_optimize = 2;
678
679/* Debugging level. -g sets this to 2. -gN sets this to N. -g0 is
680 equivalent to seeing no -g option at all. */
681static int mips_debug = 0;
682
7d8e00cf
RS
683/* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata. */
684#define MAX_VR4130_NOPS 4
685
686/* The maximum number of NOPs needed to fill delay slots. */
687#define MAX_DELAY_NOPS 2
688
689/* The maximum number of NOPs needed for any purpose. */
690#define MAX_NOPS 4
71400594
RS
691
692/* A list of previous instructions, with index 0 being the most recent.
693 We need to look back MAX_NOPS instructions when filling delay slots
694 or working around processor errata. We need to look back one
695 instruction further if we're thinking about using history[0] to
696 fill a branch delay slot. */
697static struct mips_cl_insn history[1 + MAX_NOPS];
252b5132 698
1e915849
RS
699/* Nop instructions used by emit_nop. */
700static struct mips_cl_insn nop_insn, mips16_nop_insn;
701
702/* The appropriate nop for the current mode. */
703#define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn : &nop_insn)
252b5132 704
252b5132
RH
705/* If this is set, it points to a frag holding nop instructions which
706 were inserted before the start of a noreorder section. If those
707 nops turn out to be unnecessary, the size of the frag can be
708 decreased. */
709static fragS *prev_nop_frag;
710
711/* The number of nop instructions we created in prev_nop_frag. */
712static int prev_nop_frag_holds;
713
714/* The number of nop instructions that we know we need in
bdaaa2e1 715 prev_nop_frag. */
252b5132
RH
716static int prev_nop_frag_required;
717
718/* The number of instructions we've seen since prev_nop_frag. */
719static int prev_nop_frag_since;
720
721/* For ECOFF and ELF, relocations against symbols are done in two
722 parts, with a HI relocation and a LO relocation. Each relocation
723 has only 16 bits of space to store an addend. This means that in
724 order for the linker to handle carries correctly, it must be able
725 to locate both the HI and the LO relocation. This means that the
726 relocations must appear in order in the relocation table.
727
728 In order to implement this, we keep track of each unmatched HI
729 relocation. We then sort them so that they immediately precede the
bdaaa2e1 730 corresponding LO relocation. */
252b5132 731
e972090a
NC
732struct mips_hi_fixup
733{
252b5132
RH
734 /* Next HI fixup. */
735 struct mips_hi_fixup *next;
736 /* This fixup. */
737 fixS *fixp;
738 /* The section this fixup is in. */
739 segT seg;
740};
741
742/* The list of unmatched HI relocs. */
743
744static struct mips_hi_fixup *mips_hi_fixup_list;
745
64bdfcaf
RS
746/* The frag containing the last explicit relocation operator.
747 Null if explicit relocations have not been used. */
748
749static fragS *prev_reloc_op_frag;
750
252b5132
RH
751/* Map normal MIPS register numbers to mips16 register numbers. */
752
753#define X ILLEGAL_REG
e972090a
NC
754static const int mips32_to_16_reg_map[] =
755{
252b5132
RH
756 X, X, 2, 3, 4, 5, 6, 7,
757 X, X, X, X, X, X, X, X,
758 0, 1, X, X, X, X, X, X,
759 X, X, X, X, X, X, X, X
760};
761#undef X
762
763/* Map mips16 register numbers to normal MIPS register numbers. */
764
e972090a
NC
765static const unsigned int mips16_to_32_reg_map[] =
766{
252b5132
RH
767 16, 17, 2, 3, 4, 5, 6, 7
768};
60b63b72 769
71400594
RS
770/* Classifies the kind of instructions we're interested in when
771 implementing -mfix-vr4120. */
c67a084a
NC
772enum fix_vr4120_class
773{
71400594
RS
774 FIX_VR4120_MACC,
775 FIX_VR4120_DMACC,
776 FIX_VR4120_MULT,
777 FIX_VR4120_DMULT,
778 FIX_VR4120_DIV,
779 FIX_VR4120_MTHILO,
780 NUM_FIX_VR4120_CLASSES
781};
782
c67a084a
NC
783/* ...likewise -mfix-loongson2f-jump. */
784static bfd_boolean mips_fix_loongson2f_jump;
785
786/* ...likewise -mfix-loongson2f-nop. */
787static bfd_boolean mips_fix_loongson2f_nop;
788
789/* True if -mfix-loongson2f-nop or -mfix-loongson2f-jump passed. */
790static bfd_boolean mips_fix_loongson2f;
791
71400594
RS
792/* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
793 there must be at least one other instruction between an instruction
794 of type X and an instruction of type Y. */
795static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
796
797/* True if -mfix-vr4120 is in force. */
d766e8ec 798static int mips_fix_vr4120;
4a6a3df4 799
7d8e00cf
RS
800/* ...likewise -mfix-vr4130. */
801static int mips_fix_vr4130;
802
6a32d874
CM
803/* ...likewise -mfix-24k. */
804static int mips_fix_24k;
805
d954098f
DD
806/* ...likewise -mfix-cn63xxp1 */
807static bfd_boolean mips_fix_cn63xxp1;
808
4a6a3df4
AO
809/* We don't relax branches by default, since this causes us to expand
810 `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
811 fail to compute the offset before expanding the macro to the most
812 efficient expansion. */
813
814static int mips_relax_branch;
252b5132 815\f
4d7206a2
RS
816/* The expansion of many macros depends on the type of symbol that
817 they refer to. For example, when generating position-dependent code,
818 a macro that refers to a symbol may have two different expansions,
819 one which uses GP-relative addresses and one which uses absolute
820 addresses. When generating SVR4-style PIC, a macro may have
821 different expansions for local and global symbols.
822
823 We handle these situations by generating both sequences and putting
824 them in variant frags. In position-dependent code, the first sequence
825 will be the GP-relative one and the second sequence will be the
826 absolute one. In SVR4 PIC, the first sequence will be for global
827 symbols and the second will be for local symbols.
828
584892a6
RS
829 The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
830 SECOND are the lengths of the two sequences in bytes. These fields
831 can be extracted using RELAX_FIRST() and RELAX_SECOND(). In addition,
832 the subtype has the following flags:
4d7206a2 833
584892a6
RS
834 RELAX_USE_SECOND
835 Set if it has been decided that we should use the second
836 sequence instead of the first.
837
838 RELAX_SECOND_LONGER
839 Set in the first variant frag if the macro's second implementation
840 is longer than its first. This refers to the macro as a whole,
841 not an individual relaxation.
842
843 RELAX_NOMACRO
844 Set in the first variant frag if the macro appeared in a .set nomacro
845 block and if one alternative requires a warning but the other does not.
846
847 RELAX_DELAY_SLOT
848 Like RELAX_NOMACRO, but indicates that the macro appears in a branch
849 delay slot.
4d7206a2
RS
850
851 The frag's "opcode" points to the first fixup for relaxable code.
852
853 Relaxable macros are generated using a sequence such as:
854
855 relax_start (SYMBOL);
856 ... generate first expansion ...
857 relax_switch ();
858 ... generate second expansion ...
859 relax_end ();
860
861 The code and fixups for the unwanted alternative are discarded
862 by md_convert_frag. */
584892a6 863#define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
4d7206a2 864
584892a6
RS
865#define RELAX_FIRST(X) (((X) >> 8) & 0xff)
866#define RELAX_SECOND(X) ((X) & 0xff)
867#define RELAX_USE_SECOND 0x10000
868#define RELAX_SECOND_LONGER 0x20000
869#define RELAX_NOMACRO 0x40000
870#define RELAX_DELAY_SLOT 0x80000
252b5132 871
4a6a3df4
AO
872/* Branch without likely bit. If label is out of range, we turn:
873
874 beq reg1, reg2, label
875 delay slot
876
877 into
878
879 bne reg1, reg2, 0f
880 nop
881 j label
882 0: delay slot
883
884 with the following opcode replacements:
885
886 beq <-> bne
887 blez <-> bgtz
888 bltz <-> bgez
889 bc1f <-> bc1t
890
891 bltzal <-> bgezal (with jal label instead of j label)
892
893 Even though keeping the delay slot instruction in the delay slot of
894 the branch would be more efficient, it would be very tricky to do
895 correctly, because we'd have to introduce a variable frag *after*
896 the delay slot instruction, and expand that instead. Let's do it
897 the easy way for now, even if the branch-not-taken case now costs
898 one additional instruction. Out-of-range branches are not supposed
899 to be common, anyway.
900
901 Branch likely. If label is out of range, we turn:
902
903 beql reg1, reg2, label
904 delay slot (annulled if branch not taken)
905
906 into
907
908 beql reg1, reg2, 1f
909 nop
910 beql $0, $0, 2f
911 nop
912 1: j[al] label
913 delay slot (executed only if branch taken)
914 2:
915
916 It would be possible to generate a shorter sequence by losing the
917 likely bit, generating something like:
b34976b6 918
4a6a3df4
AO
919 bne reg1, reg2, 0f
920 nop
921 j[al] label
922 delay slot (executed only if branch taken)
923 0:
924
925 beql -> bne
926 bnel -> beq
927 blezl -> bgtz
928 bgtzl -> blez
929 bltzl -> bgez
930 bgezl -> bltz
931 bc1fl -> bc1t
932 bc1tl -> bc1f
933
934 bltzall -> bgezal (with jal label instead of j label)
935 bgezall -> bltzal (ditto)
936
937
938 but it's not clear that it would actually improve performance. */
66b3e8da
MR
939#define RELAX_BRANCH_ENCODE(at, uncond, likely, link, toofar) \
940 ((relax_substateT) \
941 (0xc0000000 \
942 | ((at) & 0x1f) \
943 | ((toofar) ? 0x20 : 0) \
944 | ((link) ? 0x40 : 0) \
945 | ((likely) ? 0x80 : 0) \
946 | ((uncond) ? 0x100 : 0)))
4a6a3df4 947#define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
66b3e8da
MR
948#define RELAX_BRANCH_UNCOND(i) (((i) & 0x100) != 0)
949#define RELAX_BRANCH_LIKELY(i) (((i) & 0x80) != 0)
950#define RELAX_BRANCH_LINK(i) (((i) & 0x40) != 0)
951#define RELAX_BRANCH_TOOFAR(i) (((i) & 0x20) != 0)
952#define RELAX_BRANCH_AT(i) ((i) & 0x1f)
4a6a3df4 953
252b5132
RH
954/* For mips16 code, we use an entirely different form of relaxation.
955 mips16 supports two versions of most instructions which take
956 immediate values: a small one which takes some small value, and a
957 larger one which takes a 16 bit value. Since branches also follow
958 this pattern, relaxing these values is required.
959
960 We can assemble both mips16 and normal MIPS code in a single
961 object. Therefore, we need to support this type of relaxation at
962 the same time that we support the relaxation described above. We
963 use the high bit of the subtype field to distinguish these cases.
964
965 The information we store for this type of relaxation is the
966 argument code found in the opcode file for this relocation, whether
967 the user explicitly requested a small or extended form, and whether
968 the relocation is in a jump or jal delay slot. That tells us the
969 size of the value, and how it should be stored. We also store
970 whether the fragment is considered to be extended or not. We also
971 store whether this is known to be a branch to a different section,
972 whether we have tried to relax this frag yet, and whether we have
973 ever extended a PC relative fragment because of a shift count. */
974#define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
975 (0x80000000 \
976 | ((type) & 0xff) \
977 | ((small) ? 0x100 : 0) \
978 | ((ext) ? 0x200 : 0) \
979 | ((dslot) ? 0x400 : 0) \
980 | ((jal_dslot) ? 0x800 : 0))
4a6a3df4 981#define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
252b5132
RH
982#define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
983#define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
984#define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
985#define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
986#define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
987#define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
988#define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
989#define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
990#define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
991#define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
992#define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
885add95
CD
993
994/* Is the given value a sign-extended 32-bit value? */
995#define IS_SEXT_32BIT_NUM(x) \
996 (((x) &~ (offsetT) 0x7fffffff) == 0 \
997 || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
998
999/* Is the given value a sign-extended 16-bit value? */
1000#define IS_SEXT_16BIT_NUM(x) \
1001 (((x) &~ (offsetT) 0x7fff) == 0 \
1002 || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
1003
2051e8c4
MR
1004/* Is the given value a zero-extended 32-bit value? Or a negated one? */
1005#define IS_ZEXT_32BIT_NUM(x) \
1006 (((x) &~ (offsetT) 0xffffffff) == 0 \
1007 || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
1008
bf12938e
RS
1009/* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
1010 VALUE << SHIFT. VALUE is evaluated exactly once. */
1011#define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
1012 (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
1013 | (((VALUE) & (MASK)) << (SHIFT)))
1014
1015/* Extract bits MASK << SHIFT from STRUCT and shift them right
1016 SHIFT places. */
1017#define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
1018 (((STRUCT) >> (SHIFT)) & (MASK))
1019
1020/* Change INSN's opcode so that the operand given by FIELD has value VALUE.
1021 INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
1022
1023 include/opcode/mips.h specifies operand fields using the macros
1024 OP_MASK_<FIELD> and OP_SH_<FIELD>. The MIPS16 equivalents start
1025 with "MIPS16OP" instead of "OP". */
1026#define INSERT_OPERAND(FIELD, INSN, VALUE) \
1027 INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
1028#define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
1029 INSERT_BITS ((INSN).insn_opcode, VALUE, \
1030 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
1031
1032/* Extract the operand given by FIELD from mips_cl_insn INSN. */
1033#define EXTRACT_OPERAND(FIELD, INSN) \
1034 EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD)
1035#define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
1036 EXTRACT_BITS ((INSN).insn_opcode, \
1037 MIPS16OP_MASK_##FIELD, \
1038 MIPS16OP_SH_##FIELD)
4d7206a2
RS
1039\f
1040/* Global variables used when generating relaxable macros. See the
1041 comment above RELAX_ENCODE for more details about how relaxation
1042 is used. */
1043static struct {
1044 /* 0 if we're not emitting a relaxable macro.
1045 1 if we're emitting the first of the two relaxation alternatives.
1046 2 if we're emitting the second alternative. */
1047 int sequence;
1048
1049 /* The first relaxable fixup in the current frag. (In other words,
1050 the first fixup that refers to relaxable code.) */
1051 fixS *first_fixup;
1052
1053 /* sizes[0] says how many bytes of the first alternative are stored in
1054 the current frag. Likewise sizes[1] for the second alternative. */
1055 unsigned int sizes[2];
1056
1057 /* The symbol on which the choice of sequence depends. */
1058 symbolS *symbol;
1059} mips_relax;
252b5132 1060\f
584892a6
RS
1061/* Global variables used to decide whether a macro needs a warning. */
1062static struct {
1063 /* True if the macro is in a branch delay slot. */
1064 bfd_boolean delay_slot_p;
1065
1066 /* For relaxable macros, sizes[0] is the length of the first alternative
1067 in bytes and sizes[1] is the length of the second alternative.
1068 For non-relaxable macros, both elements give the length of the
1069 macro in bytes. */
1070 unsigned int sizes[2];
1071
1072 /* The first variant frag for this macro. */
1073 fragS *first_frag;
1074} mips_macro_warning;
1075\f
252b5132
RH
1076/* Prototypes for static functions. */
1077
17a2f251 1078#define internalError() \
252b5132 1079 as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
252b5132
RH
1080
1081enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
1082
b34976b6 1083static void append_insn
c67a084a 1084 (struct mips_cl_insn *, expressionS *, bfd_reloc_code_real_type *);
7d10b47d 1085static void mips_no_prev_insn (void);
c67a084a 1086static void macro_build (expressionS *, const char *, const char *, ...);
b34976b6 1087static void mips16_macro_build
03ea81db 1088 (expressionS *, const char *, const char *, va_list *);
67c0d1eb 1089static void load_register (int, expressionS *, int);
584892a6
RS
1090static void macro_start (void);
1091static void macro_end (void);
17a2f251
TS
1092static void macro (struct mips_cl_insn * ip);
1093static void mips16_macro (struct mips_cl_insn * ip);
17a2f251
TS
1094static void mips_ip (char *str, struct mips_cl_insn * ip);
1095static void mips16_ip (char *str, struct mips_cl_insn * ip);
b34976b6 1096static void mips16_immed
17a2f251
TS
1097 (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
1098 unsigned long *, bfd_boolean *, unsigned short *);
5e0116d5 1099static size_t my_getSmallExpression
17a2f251
TS
1100 (expressionS *, bfd_reloc_code_real_type *, char *);
1101static void my_getExpression (expressionS *, char *);
1102static void s_align (int);
1103static void s_change_sec (int);
1104static void s_change_section (int);
1105static void s_cons (int);
1106static void s_float_cons (int);
1107static void s_mips_globl (int);
1108static void s_option (int);
1109static void s_mipsset (int);
1110static void s_abicalls (int);
1111static void s_cpload (int);
1112static void s_cpsetup (int);
1113static void s_cplocal (int);
1114static void s_cprestore (int);
1115static void s_cpreturn (int);
741d6ea8
JM
1116static void s_dtprelword (int);
1117static void s_dtpreldword (int);
17a2f251
TS
1118static void s_gpvalue (int);
1119static void s_gpword (int);
1120static void s_gpdword (int);
1121static void s_cpadd (int);
1122static void s_insn (int);
1123static void md_obj_begin (void);
1124static void md_obj_end (void);
1125static void s_mips_ent (int);
1126static void s_mips_end (int);
1127static void s_mips_frame (int);
1128static void s_mips_mask (int reg_type);
1129static void s_mips_stab (int);
1130static void s_mips_weakext (int);
1131static void s_mips_file (int);
1132static void s_mips_loc (int);
1133static bfd_boolean pic_need_relax (symbolS *, asection *);
4a6a3df4 1134static int relaxed_branch_length (fragS *, asection *, int);
17a2f251 1135static int validate_mips_insn (const struct mips_opcode *);
e7af610e
NC
1136
1137/* Table and functions used to map between CPU/ISA names, and
1138 ISA levels, and CPU numbers. */
1139
e972090a
NC
1140struct mips_cpu_info
1141{
e7af610e 1142 const char *name; /* CPU or ISA name. */
ad3fea08 1143 int flags; /* ASEs available, or ISA flag. */
e7af610e
NC
1144 int isa; /* ISA level. */
1145 int cpu; /* CPU number (default CPU if ISA). */
1146};
1147
ad3fea08
TS
1148#define MIPS_CPU_IS_ISA 0x0001 /* Is this an ISA? (If 0, a CPU.) */
1149#define MIPS_CPU_ASE_SMARTMIPS 0x0002 /* CPU implements SmartMIPS ASE */
1150#define MIPS_CPU_ASE_DSP 0x0004 /* CPU implements DSP ASE */
1151#define MIPS_CPU_ASE_MT 0x0008 /* CPU implements MT ASE */
1152#define MIPS_CPU_ASE_MIPS3D 0x0010 /* CPU implements MIPS-3D ASE */
1153#define MIPS_CPU_ASE_MDMX 0x0020 /* CPU implements MDMX ASE */
8b082fb1 1154#define MIPS_CPU_ASE_DSPR2 0x0040 /* CPU implements DSP R2 ASE */
ad3fea08 1155
17a2f251
TS
1156static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1157static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1158static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
252b5132
RH
1159\f
1160/* Pseudo-op table.
1161
1162 The following pseudo-ops from the Kane and Heinrich MIPS book
1163 should be defined here, but are currently unsupported: .alias,
1164 .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1165
1166 The following pseudo-ops from the Kane and Heinrich MIPS book are
1167 specific to the type of debugging information being generated, and
1168 should be defined by the object format: .aent, .begin, .bend,
1169 .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1170 .vreg.
1171
1172 The following pseudo-ops from the Kane and Heinrich MIPS book are
1173 not MIPS CPU specific, but are also not specific to the object file
1174 format. This file is probably the best place to define them, but
d84bcf09 1175 they are not currently supported: .asm0, .endr, .lab, .struct. */
252b5132 1176
e972090a
NC
1177static const pseudo_typeS mips_pseudo_table[] =
1178{
beae10d5 1179 /* MIPS specific pseudo-ops. */
252b5132
RH
1180 {"option", s_option, 0},
1181 {"set", s_mipsset, 0},
1182 {"rdata", s_change_sec, 'r'},
1183 {"sdata", s_change_sec, 's'},
1184 {"livereg", s_ignore, 0},
1185 {"abicalls", s_abicalls, 0},
1186 {"cpload", s_cpload, 0},
6478892d
TS
1187 {"cpsetup", s_cpsetup, 0},
1188 {"cplocal", s_cplocal, 0},
252b5132 1189 {"cprestore", s_cprestore, 0},
6478892d 1190 {"cpreturn", s_cpreturn, 0},
741d6ea8
JM
1191 {"dtprelword", s_dtprelword, 0},
1192 {"dtpreldword", s_dtpreldword, 0},
6478892d 1193 {"gpvalue", s_gpvalue, 0},
252b5132 1194 {"gpword", s_gpword, 0},
10181a0d 1195 {"gpdword", s_gpdword, 0},
252b5132
RH
1196 {"cpadd", s_cpadd, 0},
1197 {"insn", s_insn, 0},
1198
beae10d5 1199 /* Relatively generic pseudo-ops that happen to be used on MIPS
252b5132 1200 chips. */
38a57ae7 1201 {"asciiz", stringer, 8 + 1},
252b5132
RH
1202 {"bss", s_change_sec, 'b'},
1203 {"err", s_err, 0},
1204 {"half", s_cons, 1},
1205 {"dword", s_cons, 3},
1206 {"weakext", s_mips_weakext, 0},
7c752c2a
TS
1207 {"origin", s_org, 0},
1208 {"repeat", s_rept, 0},
252b5132 1209
998b3c36
MR
1210 /* For MIPS this is non-standard, but we define it for consistency. */
1211 {"sbss", s_change_sec, 'B'},
1212
beae10d5 1213 /* These pseudo-ops are defined in read.c, but must be overridden
252b5132
RH
1214 here for one reason or another. */
1215 {"align", s_align, 0},
1216 {"byte", s_cons, 0},
1217 {"data", s_change_sec, 'd'},
1218 {"double", s_float_cons, 'd'},
1219 {"float", s_float_cons, 'f'},
1220 {"globl", s_mips_globl, 0},
1221 {"global", s_mips_globl, 0},
1222 {"hword", s_cons, 1},
1223 {"int", s_cons, 2},
1224 {"long", s_cons, 2},
1225 {"octa", s_cons, 4},
1226 {"quad", s_cons, 3},
cca86cc8 1227 {"section", s_change_section, 0},
252b5132
RH
1228 {"short", s_cons, 1},
1229 {"single", s_float_cons, 'f'},
1230 {"stabn", s_mips_stab, 'n'},
1231 {"text", s_change_sec, 't'},
1232 {"word", s_cons, 2},
add56521 1233
add56521 1234 { "extern", ecoff_directive_extern, 0},
add56521 1235
43841e91 1236 { NULL, NULL, 0 },
252b5132
RH
1237};
1238
e972090a
NC
1239static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1240{
beae10d5
KH
1241 /* These pseudo-ops should be defined by the object file format.
1242 However, a.out doesn't support them, so we have versions here. */
252b5132
RH
1243 {"aent", s_mips_ent, 1},
1244 {"bgnb", s_ignore, 0},
1245 {"end", s_mips_end, 0},
1246 {"endb", s_ignore, 0},
1247 {"ent", s_mips_ent, 0},
c5dd6aab 1248 {"file", s_mips_file, 0},
252b5132
RH
1249 {"fmask", s_mips_mask, 'F'},
1250 {"frame", s_mips_frame, 0},
c5dd6aab 1251 {"loc", s_mips_loc, 0},
252b5132
RH
1252 {"mask", s_mips_mask, 'R'},
1253 {"verstamp", s_ignore, 0},
43841e91 1254 { NULL, NULL, 0 },
252b5132
RH
1255};
1256
3ae8dd8d
MR
1257/* Export the ABI address size for use by TC_ADDRESS_BYTES for the
1258 purpose of the `.dc.a' internal pseudo-op. */
1259
1260int
1261mips_address_bytes (void)
1262{
1263 return HAVE_64BIT_ADDRESSES ? 8 : 4;
1264}
1265
17a2f251 1266extern void pop_insert (const pseudo_typeS *);
252b5132
RH
1267
1268void
17a2f251 1269mips_pop_insert (void)
252b5132
RH
1270{
1271 pop_insert (mips_pseudo_table);
1272 if (! ECOFF_DEBUGGING)
1273 pop_insert (mips_nonecoff_pseudo_table);
1274}
1275\f
1276/* Symbols labelling the current insn. */
1277
e972090a
NC
1278struct insn_label_list
1279{
252b5132
RH
1280 struct insn_label_list *next;
1281 symbolS *label;
1282};
1283
252b5132 1284static struct insn_label_list *free_insn_labels;
742a56fe 1285#define label_list tc_segment_info_data.labels
252b5132 1286
17a2f251 1287static void mips_clear_insn_labels (void);
252b5132
RH
1288
1289static inline void
17a2f251 1290mips_clear_insn_labels (void)
252b5132
RH
1291{
1292 register struct insn_label_list **pl;
a8dbcb85 1293 segment_info_type *si;
252b5132 1294
a8dbcb85
TS
1295 if (now_seg)
1296 {
1297 for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1298 ;
1299
1300 si = seg_info (now_seg);
1301 *pl = si->label_list;
1302 si->label_list = NULL;
1303 }
252b5132 1304}
a8dbcb85 1305
252b5132
RH
1306\f
1307static char *expr_end;
1308
1309/* Expressions which appear in instructions. These are set by
1310 mips_ip. */
1311
1312static expressionS imm_expr;
5f74bc13 1313static expressionS imm2_expr;
252b5132
RH
1314static expressionS offset_expr;
1315
1316/* Relocs associated with imm_expr and offset_expr. */
1317
f6688943
TS
1318static bfd_reloc_code_real_type imm_reloc[3]
1319 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1320static bfd_reloc_code_real_type offset_reloc[3]
1321 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
252b5132 1322
252b5132
RH
1323/* These are set by mips16_ip if an explicit extension is used. */
1324
b34976b6 1325static bfd_boolean mips16_small, mips16_ext;
252b5132 1326
7ed4a06a 1327#ifdef OBJ_ELF
ecb4347a
DJ
1328/* The pdr segment for per procedure frame/regmask info. Not used for
1329 ECOFF debugging. */
252b5132
RH
1330
1331static segT pdr_seg;
7ed4a06a 1332#endif
252b5132 1333
e013f690
TS
1334/* The default target format to use. */
1335
aeffff67
RS
1336#if defined (TE_FreeBSD)
1337#define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips-freebsd"
1338#elif defined (TE_TMIPS)
1339#define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips"
1340#else
1341#define ELF_TARGET(PREFIX, ENDIAN) PREFIX ENDIAN "mips"
1342#endif
1343
e013f690 1344const char *
17a2f251 1345mips_target_format (void)
e013f690
TS
1346{
1347 switch (OUTPUT_FLAVOR)
1348 {
e013f690
TS
1349 case bfd_target_ecoff_flavour:
1350 return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1351 case bfd_target_coff_flavour:
1352 return "pe-mips";
1353 case bfd_target_elf_flavour:
0a44bf69
RS
1354#ifdef TE_VXWORKS
1355 if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1356 return (target_big_endian
1357 ? "elf32-bigmips-vxworks"
1358 : "elf32-littlemips-vxworks");
1359#endif
e013f690 1360 return (target_big_endian
cfe86eaa 1361 ? (HAVE_64BIT_OBJECTS
aeffff67 1362 ? ELF_TARGET ("elf64-", "big")
cfe86eaa 1363 : (HAVE_NEWABI
aeffff67
RS
1364 ? ELF_TARGET ("elf32-n", "big")
1365 : ELF_TARGET ("elf32-", "big")))
cfe86eaa 1366 : (HAVE_64BIT_OBJECTS
aeffff67 1367 ? ELF_TARGET ("elf64-", "little")
cfe86eaa 1368 : (HAVE_NEWABI
aeffff67
RS
1369 ? ELF_TARGET ("elf32-n", "little")
1370 : ELF_TARGET ("elf32-", "little"))));
e013f690
TS
1371 default:
1372 abort ();
1373 return NULL;
1374 }
1375}
1376
1e915849
RS
1377/* Return the length of instruction INSN. */
1378
1379static inline unsigned int
1380insn_length (const struct mips_cl_insn *insn)
1381{
1382 if (!mips_opts.mips16)
1383 return 4;
1384 return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1385}
1386
1387/* Initialise INSN from opcode entry MO. Leave its position unspecified. */
1388
1389static void
1390create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1391{
1392 size_t i;
1393
1394 insn->insn_mo = mo;
1395 insn->use_extend = FALSE;
1396 insn->extend = 0;
1397 insn->insn_opcode = mo->match;
1398 insn->frag = NULL;
1399 insn->where = 0;
1400 for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1401 insn->fixp[i] = NULL;
1402 insn->fixed_p = (mips_opts.noreorder > 0);
1403 insn->noreorder_p = (mips_opts.noreorder > 0);
1404 insn->mips16_absolute_jump_p = 0;
15be625d 1405 insn->complete_p = 0;
1e915849
RS
1406}
1407
742a56fe
RS
1408/* Record the current MIPS16 mode in now_seg. */
1409
1410static void
1411mips_record_mips16_mode (void)
1412{
1413 segment_info_type *si;
1414
1415 si = seg_info (now_seg);
1416 if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
1417 si->tc_segment_info_data.mips16 = mips_opts.mips16;
1418}
1419
1e915849
RS
1420/* Install INSN at the location specified by its "frag" and "where" fields. */
1421
1422static void
1423install_insn (const struct mips_cl_insn *insn)
1424{
1425 char *f = insn->frag->fr_literal + insn->where;
1426 if (!mips_opts.mips16)
1427 md_number_to_chars (f, insn->insn_opcode, 4);
1428 else if (insn->mips16_absolute_jump_p)
1429 {
1430 md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1431 md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1432 }
1433 else
1434 {
1435 if (insn->use_extend)
1436 {
1437 md_number_to_chars (f, 0xf000 | insn->extend, 2);
1438 f += 2;
1439 }
1440 md_number_to_chars (f, insn->insn_opcode, 2);
1441 }
742a56fe 1442 mips_record_mips16_mode ();
1e915849
RS
1443}
1444
1445/* Move INSN to offset WHERE in FRAG. Adjust the fixups accordingly
1446 and install the opcode in the new location. */
1447
1448static void
1449move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1450{
1451 size_t i;
1452
1453 insn->frag = frag;
1454 insn->where = where;
1455 for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1456 if (insn->fixp[i] != NULL)
1457 {
1458 insn->fixp[i]->fx_frag = frag;
1459 insn->fixp[i]->fx_where = where;
1460 }
1461 install_insn (insn);
1462}
1463
1464/* Add INSN to the end of the output. */
1465
1466static void
1467add_fixed_insn (struct mips_cl_insn *insn)
1468{
1469 char *f = frag_more (insn_length (insn));
1470 move_insn (insn, frag_now, f - frag_now->fr_literal);
1471}
1472
1473/* Start a variant frag and move INSN to the start of the variant part,
1474 marking it as fixed. The other arguments are as for frag_var. */
1475
1476static void
1477add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1478 relax_substateT subtype, symbolS *symbol, offsetT offset)
1479{
1480 frag_grow (max_chars);
1481 move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1482 insn->fixed_p = 1;
1483 frag_var (rs_machine_dependent, max_chars, var,
1484 subtype, symbol, offset, NULL);
1485}
1486
1487/* Insert N copies of INSN into the history buffer, starting at
1488 position FIRST. Neither FIRST nor N need to be clipped. */
1489
1490static void
1491insert_into_history (unsigned int first, unsigned int n,
1492 const struct mips_cl_insn *insn)
1493{
1494 if (mips_relax.sequence != 2)
1495 {
1496 unsigned int i;
1497
1498 for (i = ARRAY_SIZE (history); i-- > first;)
1499 if (i >= first + n)
1500 history[i] = history[i - n];
1501 else
1502 history[i] = *insn;
1503 }
1504}
1505
1506/* Emit a nop instruction, recording it in the history buffer. */
1507
1508static void
1509emit_nop (void)
1510{
1511 add_fixed_insn (NOP_INSN);
1512 insert_into_history (0, 1, NOP_INSN);
1513}
1514
71400594
RS
1515/* Initialize vr4120_conflicts. There is a bit of duplication here:
1516 the idea is to make it obvious at a glance that each errata is
1517 included. */
1518
1519static void
1520init_vr4120_conflicts (void)
1521{
1522#define CONFLICT(FIRST, SECOND) \
1523 vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1524
1525 /* Errata 21 - [D]DIV[U] after [D]MACC */
1526 CONFLICT (MACC, DIV);
1527 CONFLICT (DMACC, DIV);
1528
1529 /* Errata 23 - Continuous DMULT[U]/DMACC instructions. */
1530 CONFLICT (DMULT, DMULT);
1531 CONFLICT (DMULT, DMACC);
1532 CONFLICT (DMACC, DMULT);
1533 CONFLICT (DMACC, DMACC);
1534
1535 /* Errata 24 - MT{LO,HI} after [D]MACC */
1536 CONFLICT (MACC, MTHILO);
1537 CONFLICT (DMACC, MTHILO);
1538
1539 /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1540 instruction is executed immediately after a MACC or DMACC
1541 instruction, the result of [either instruction] is incorrect." */
1542 CONFLICT (MACC, MULT);
1543 CONFLICT (MACC, DMULT);
1544 CONFLICT (DMACC, MULT);
1545 CONFLICT (DMACC, DMULT);
1546
1547 /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1548 executed immediately after a DMULT, DMULTU, DIV, DIVU,
1549 DDIV or DDIVU instruction, the result of the MACC or
1550 DMACC instruction is incorrect.". */
1551 CONFLICT (DMULT, MACC);
1552 CONFLICT (DMULT, DMACC);
1553 CONFLICT (DIV, MACC);
1554 CONFLICT (DIV, DMACC);
1555
1556#undef CONFLICT
1557}
1558
707bfff6
TS
1559struct regname {
1560 const char *name;
1561 unsigned int num;
1562};
1563
1564#define RTYPE_MASK 0x1ff00
1565#define RTYPE_NUM 0x00100
1566#define RTYPE_FPU 0x00200
1567#define RTYPE_FCC 0x00400
1568#define RTYPE_VEC 0x00800
1569#define RTYPE_GP 0x01000
1570#define RTYPE_CP0 0x02000
1571#define RTYPE_PC 0x04000
1572#define RTYPE_ACC 0x08000
1573#define RTYPE_CCC 0x10000
1574#define RNUM_MASK 0x000ff
1575#define RWARN 0x80000
1576
1577#define GENERIC_REGISTER_NUMBERS \
1578 {"$0", RTYPE_NUM | 0}, \
1579 {"$1", RTYPE_NUM | 1}, \
1580 {"$2", RTYPE_NUM | 2}, \
1581 {"$3", RTYPE_NUM | 3}, \
1582 {"$4", RTYPE_NUM | 4}, \
1583 {"$5", RTYPE_NUM | 5}, \
1584 {"$6", RTYPE_NUM | 6}, \
1585 {"$7", RTYPE_NUM | 7}, \
1586 {"$8", RTYPE_NUM | 8}, \
1587 {"$9", RTYPE_NUM | 9}, \
1588 {"$10", RTYPE_NUM | 10}, \
1589 {"$11", RTYPE_NUM | 11}, \
1590 {"$12", RTYPE_NUM | 12}, \
1591 {"$13", RTYPE_NUM | 13}, \
1592 {"$14", RTYPE_NUM | 14}, \
1593 {"$15", RTYPE_NUM | 15}, \
1594 {"$16", RTYPE_NUM | 16}, \
1595 {"$17", RTYPE_NUM | 17}, \
1596 {"$18", RTYPE_NUM | 18}, \
1597 {"$19", RTYPE_NUM | 19}, \
1598 {"$20", RTYPE_NUM | 20}, \
1599 {"$21", RTYPE_NUM | 21}, \
1600 {"$22", RTYPE_NUM | 22}, \
1601 {"$23", RTYPE_NUM | 23}, \
1602 {"$24", RTYPE_NUM | 24}, \
1603 {"$25", RTYPE_NUM | 25}, \
1604 {"$26", RTYPE_NUM | 26}, \
1605 {"$27", RTYPE_NUM | 27}, \
1606 {"$28", RTYPE_NUM | 28}, \
1607 {"$29", RTYPE_NUM | 29}, \
1608 {"$30", RTYPE_NUM | 30}, \
1609 {"$31", RTYPE_NUM | 31}
1610
1611#define FPU_REGISTER_NAMES \
1612 {"$f0", RTYPE_FPU | 0}, \
1613 {"$f1", RTYPE_FPU | 1}, \
1614 {"$f2", RTYPE_FPU | 2}, \
1615 {"$f3", RTYPE_FPU | 3}, \
1616 {"$f4", RTYPE_FPU | 4}, \
1617 {"$f5", RTYPE_FPU | 5}, \
1618 {"$f6", RTYPE_FPU | 6}, \
1619 {"$f7", RTYPE_FPU | 7}, \
1620 {"$f8", RTYPE_FPU | 8}, \
1621 {"$f9", RTYPE_FPU | 9}, \
1622 {"$f10", RTYPE_FPU | 10}, \
1623 {"$f11", RTYPE_FPU | 11}, \
1624 {"$f12", RTYPE_FPU | 12}, \
1625 {"$f13", RTYPE_FPU | 13}, \
1626 {"$f14", RTYPE_FPU | 14}, \
1627 {"$f15", RTYPE_FPU | 15}, \
1628 {"$f16", RTYPE_FPU | 16}, \
1629 {"$f17", RTYPE_FPU | 17}, \
1630 {"$f18", RTYPE_FPU | 18}, \
1631 {"$f19", RTYPE_FPU | 19}, \
1632 {"$f20", RTYPE_FPU | 20}, \
1633 {"$f21", RTYPE_FPU | 21}, \
1634 {"$f22", RTYPE_FPU | 22}, \
1635 {"$f23", RTYPE_FPU | 23}, \
1636 {"$f24", RTYPE_FPU | 24}, \
1637 {"$f25", RTYPE_FPU | 25}, \
1638 {"$f26", RTYPE_FPU | 26}, \
1639 {"$f27", RTYPE_FPU | 27}, \
1640 {"$f28", RTYPE_FPU | 28}, \
1641 {"$f29", RTYPE_FPU | 29}, \
1642 {"$f30", RTYPE_FPU | 30}, \
1643 {"$f31", RTYPE_FPU | 31}
1644
1645#define FPU_CONDITION_CODE_NAMES \
1646 {"$fcc0", RTYPE_FCC | 0}, \
1647 {"$fcc1", RTYPE_FCC | 1}, \
1648 {"$fcc2", RTYPE_FCC | 2}, \
1649 {"$fcc3", RTYPE_FCC | 3}, \
1650 {"$fcc4", RTYPE_FCC | 4}, \
1651 {"$fcc5", RTYPE_FCC | 5}, \
1652 {"$fcc6", RTYPE_FCC | 6}, \
1653 {"$fcc7", RTYPE_FCC | 7}
1654
1655#define COPROC_CONDITION_CODE_NAMES \
1656 {"$cc0", RTYPE_FCC | RTYPE_CCC | 0}, \
1657 {"$cc1", RTYPE_FCC | RTYPE_CCC | 1}, \
1658 {"$cc2", RTYPE_FCC | RTYPE_CCC | 2}, \
1659 {"$cc3", RTYPE_FCC | RTYPE_CCC | 3}, \
1660 {"$cc4", RTYPE_FCC | RTYPE_CCC | 4}, \
1661 {"$cc5", RTYPE_FCC | RTYPE_CCC | 5}, \
1662 {"$cc6", RTYPE_FCC | RTYPE_CCC | 6}, \
1663 {"$cc7", RTYPE_FCC | RTYPE_CCC | 7}
1664
1665#define N32N64_SYMBOLIC_REGISTER_NAMES \
1666 {"$a4", RTYPE_GP | 8}, \
1667 {"$a5", RTYPE_GP | 9}, \
1668 {"$a6", RTYPE_GP | 10}, \
1669 {"$a7", RTYPE_GP | 11}, \
1670 {"$ta0", RTYPE_GP | 8}, /* alias for $a4 */ \
1671 {"$ta1", RTYPE_GP | 9}, /* alias for $a5 */ \
1672 {"$ta2", RTYPE_GP | 10}, /* alias for $a6 */ \
1673 {"$ta3", RTYPE_GP | 11}, /* alias for $a7 */ \
1674 {"$t0", RTYPE_GP | 12}, \
1675 {"$t1", RTYPE_GP | 13}, \
1676 {"$t2", RTYPE_GP | 14}, \
1677 {"$t3", RTYPE_GP | 15}
1678
1679#define O32_SYMBOLIC_REGISTER_NAMES \
1680 {"$t0", RTYPE_GP | 8}, \
1681 {"$t1", RTYPE_GP | 9}, \
1682 {"$t2", RTYPE_GP | 10}, \
1683 {"$t3", RTYPE_GP | 11}, \
1684 {"$t4", RTYPE_GP | 12}, \
1685 {"$t5", RTYPE_GP | 13}, \
1686 {"$t6", RTYPE_GP | 14}, \
1687 {"$t7", RTYPE_GP | 15}, \
1688 {"$ta0", RTYPE_GP | 12}, /* alias for $t4 */ \
1689 {"$ta1", RTYPE_GP | 13}, /* alias for $t5 */ \
1690 {"$ta2", RTYPE_GP | 14}, /* alias for $t6 */ \
1691 {"$ta3", RTYPE_GP | 15} /* alias for $t7 */
1692
1693/* Remaining symbolic register names */
1694#define SYMBOLIC_REGISTER_NAMES \
1695 {"$zero", RTYPE_GP | 0}, \
1696 {"$at", RTYPE_GP | 1}, \
1697 {"$AT", RTYPE_GP | 1}, \
1698 {"$v0", RTYPE_GP | 2}, \
1699 {"$v1", RTYPE_GP | 3}, \
1700 {"$a0", RTYPE_GP | 4}, \
1701 {"$a1", RTYPE_GP | 5}, \
1702 {"$a2", RTYPE_GP | 6}, \
1703 {"$a3", RTYPE_GP | 7}, \
1704 {"$s0", RTYPE_GP | 16}, \
1705 {"$s1", RTYPE_GP | 17}, \
1706 {"$s2", RTYPE_GP | 18}, \
1707 {"$s3", RTYPE_GP | 19}, \
1708 {"$s4", RTYPE_GP | 20}, \
1709 {"$s5", RTYPE_GP | 21}, \
1710 {"$s6", RTYPE_GP | 22}, \
1711 {"$s7", RTYPE_GP | 23}, \
1712 {"$t8", RTYPE_GP | 24}, \
1713 {"$t9", RTYPE_GP | 25}, \
1714 {"$k0", RTYPE_GP | 26}, \
1715 {"$kt0", RTYPE_GP | 26}, \
1716 {"$k1", RTYPE_GP | 27}, \
1717 {"$kt1", RTYPE_GP | 27}, \
1718 {"$gp", RTYPE_GP | 28}, \
1719 {"$sp", RTYPE_GP | 29}, \
1720 {"$s8", RTYPE_GP | 30}, \
1721 {"$fp", RTYPE_GP | 30}, \
1722 {"$ra", RTYPE_GP | 31}
1723
1724#define MIPS16_SPECIAL_REGISTER_NAMES \
1725 {"$pc", RTYPE_PC | 0}
1726
1727#define MDMX_VECTOR_REGISTER_NAMES \
1728 /* {"$v0", RTYPE_VEC | 0}, clash with REG 2 above */ \
1729 /* {"$v1", RTYPE_VEC | 1}, clash with REG 3 above */ \
1730 {"$v2", RTYPE_VEC | 2}, \
1731 {"$v3", RTYPE_VEC | 3}, \
1732 {"$v4", RTYPE_VEC | 4}, \
1733 {"$v5", RTYPE_VEC | 5}, \
1734 {"$v6", RTYPE_VEC | 6}, \
1735 {"$v7", RTYPE_VEC | 7}, \
1736 {"$v8", RTYPE_VEC | 8}, \
1737 {"$v9", RTYPE_VEC | 9}, \
1738 {"$v10", RTYPE_VEC | 10}, \
1739 {"$v11", RTYPE_VEC | 11}, \
1740 {"$v12", RTYPE_VEC | 12}, \
1741 {"$v13", RTYPE_VEC | 13}, \
1742 {"$v14", RTYPE_VEC | 14}, \
1743 {"$v15", RTYPE_VEC | 15}, \
1744 {"$v16", RTYPE_VEC | 16}, \
1745 {"$v17", RTYPE_VEC | 17}, \
1746 {"$v18", RTYPE_VEC | 18}, \
1747 {"$v19", RTYPE_VEC | 19}, \
1748 {"$v20", RTYPE_VEC | 20}, \
1749 {"$v21", RTYPE_VEC | 21}, \
1750 {"$v22", RTYPE_VEC | 22}, \
1751 {"$v23", RTYPE_VEC | 23}, \
1752 {"$v24", RTYPE_VEC | 24}, \
1753 {"$v25", RTYPE_VEC | 25}, \
1754 {"$v26", RTYPE_VEC | 26}, \
1755 {"$v27", RTYPE_VEC | 27}, \
1756 {"$v28", RTYPE_VEC | 28}, \
1757 {"$v29", RTYPE_VEC | 29}, \
1758 {"$v30", RTYPE_VEC | 30}, \
1759 {"$v31", RTYPE_VEC | 31}
1760
1761#define MIPS_DSP_ACCUMULATOR_NAMES \
1762 {"$ac0", RTYPE_ACC | 0}, \
1763 {"$ac1", RTYPE_ACC | 1}, \
1764 {"$ac2", RTYPE_ACC | 2}, \
1765 {"$ac3", RTYPE_ACC | 3}
1766
1767static const struct regname reg_names[] = {
1768 GENERIC_REGISTER_NUMBERS,
1769 FPU_REGISTER_NAMES,
1770 FPU_CONDITION_CODE_NAMES,
1771 COPROC_CONDITION_CODE_NAMES,
1772
1773 /* The $txx registers depends on the abi,
1774 these will be added later into the symbol table from
1775 one of the tables below once mips_abi is set after
1776 parsing of arguments from the command line. */
1777 SYMBOLIC_REGISTER_NAMES,
1778
1779 MIPS16_SPECIAL_REGISTER_NAMES,
1780 MDMX_VECTOR_REGISTER_NAMES,
1781 MIPS_DSP_ACCUMULATOR_NAMES,
1782 {0, 0}
1783};
1784
1785static const struct regname reg_names_o32[] = {
1786 O32_SYMBOLIC_REGISTER_NAMES,
1787 {0, 0}
1788};
1789
1790static const struct regname reg_names_n32n64[] = {
1791 N32N64_SYMBOLIC_REGISTER_NAMES,
1792 {0, 0}
1793};
1794
1795static int
1796reg_lookup (char **s, unsigned int types, unsigned int *regnop)
1797{
1798 symbolS *symbolP;
1799 char *e;
1800 char save_c;
1801 int reg = -1;
1802
1803 /* Find end of name. */
1804 e = *s;
1805 if (is_name_beginner (*e))
1806 ++e;
1807 while (is_part_of_name (*e))
1808 ++e;
1809
1810 /* Terminate name. */
1811 save_c = *e;
1812 *e = '\0';
1813
1814 /* Look for a register symbol. */
1815 if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
1816 {
1817 int r = S_GET_VALUE (symbolP);
1818 if (r & types)
1819 reg = r & RNUM_MASK;
1820 else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
1821 /* Convert GP reg $v0/1 to MDMX reg $v0/1! */
1822 reg = (r & RNUM_MASK) - 2;
1823 }
1824 /* Else see if this is a register defined in an itbl entry. */
1825 else if ((types & RTYPE_GP) && itbl_have_entries)
1826 {
1827 char *n = *s;
1828 unsigned long r;
1829
1830 if (*n == '$')
1831 ++n;
1832 if (itbl_get_reg_val (n, &r))
1833 reg = r & RNUM_MASK;
1834 }
1835
1836 /* Advance to next token if a register was recognised. */
1837 if (reg >= 0)
1838 *s = e;
1839 else if (types & RWARN)
20203fb9 1840 as_warn (_("Unrecognized register name `%s'"), *s);
707bfff6
TS
1841
1842 *e = save_c;
1843 if (regnop)
1844 *regnop = reg;
1845 return reg >= 0;
1846}
1847
037b32b9 1848/* Return TRUE if opcode MO is valid on the currently selected ISA and
f79e2745 1849 architecture. Use is_opcode_valid_16 for MIPS16 opcodes. */
037b32b9
AN
1850
1851static bfd_boolean
f79e2745 1852is_opcode_valid (const struct mips_opcode *mo)
037b32b9
AN
1853{
1854 int isa = mips_opts.isa;
1855 int fp_s, fp_d;
1856
1857 if (mips_opts.ase_mdmx)
1858 isa |= INSN_MDMX;
1859 if (mips_opts.ase_dsp)
1860 isa |= INSN_DSP;
1861 if (mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
1862 isa |= INSN_DSP64;
1863 if (mips_opts.ase_dspr2)
1864 isa |= INSN_DSPR2;
1865 if (mips_opts.ase_mt)
1866 isa |= INSN_MT;
1867 if (mips_opts.ase_mips3d)
1868 isa |= INSN_MIPS3D;
1869 if (mips_opts.ase_smartmips)
1870 isa |= INSN_SMARTMIPS;
1871
b19e8a9b
AN
1872 /* Don't accept instructions based on the ISA if the CPU does not implement
1873 all the coprocessor insns. */
1874 if (NO_ISA_COP (mips_opts.arch)
1875 && COP_INSN (mo->pinfo))
1876 isa = 0;
1877
037b32b9
AN
1878 if (!OPCODE_IS_MEMBER (mo, isa, mips_opts.arch))
1879 return FALSE;
1880
1881 /* Check whether the instruction or macro requires single-precision or
1882 double-precision floating-point support. Note that this information is
1883 stored differently in the opcode table for insns and macros. */
1884 if (mo->pinfo == INSN_MACRO)
1885 {
1886 fp_s = mo->pinfo2 & INSN2_M_FP_S;
1887 fp_d = mo->pinfo2 & INSN2_M_FP_D;
1888 }
1889 else
1890 {
1891 fp_s = mo->pinfo & FP_S;
1892 fp_d = mo->pinfo & FP_D;
1893 }
1894
1895 if (fp_d && (mips_opts.soft_float || mips_opts.single_float))
1896 return FALSE;
1897
1898 if (fp_s && mips_opts.soft_float)
1899 return FALSE;
1900
1901 return TRUE;
1902}
1903
1904/* Return TRUE if the MIPS16 opcode MO is valid on the currently
1905 selected ISA and architecture. */
1906
1907static bfd_boolean
1908is_opcode_valid_16 (const struct mips_opcode *mo)
1909{
1910 return OPCODE_IS_MEMBER (mo, mips_opts.isa, mips_opts.arch) ? TRUE : FALSE;
1911}
1912
707bfff6
TS
1913/* This function is called once, at assembler startup time. It should set up
1914 all the tables, etc. that the MD part of the assembler will need. */
156c2f8b 1915
252b5132 1916void
17a2f251 1917md_begin (void)
252b5132 1918{
3994f87e 1919 const char *retval = NULL;
156c2f8b 1920 int i = 0;
252b5132 1921 int broken = 0;
1f25f5d3 1922
0a44bf69
RS
1923 if (mips_pic != NO_PIC)
1924 {
1925 if (g_switch_seen && g_switch_value != 0)
1926 as_bad (_("-G may not be used in position-independent code"));
1927 g_switch_value = 0;
1928 }
1929
fef14a42 1930 if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
252b5132
RH
1931 as_warn (_("Could not set architecture and machine"));
1932
252b5132
RH
1933 op_hash = hash_new ();
1934
1935 for (i = 0; i < NUMOPCODES;)
1936 {
1937 const char *name = mips_opcodes[i].name;
1938
17a2f251 1939 retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
252b5132
RH
1940 if (retval != NULL)
1941 {
1942 fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1943 mips_opcodes[i].name, retval);
1944 /* Probably a memory allocation problem? Give up now. */
1945 as_fatal (_("Broken assembler. No assembly attempted."));
1946 }
1947 do
1948 {
1949 if (mips_opcodes[i].pinfo != INSN_MACRO)
1950 {
1951 if (!validate_mips_insn (&mips_opcodes[i]))
1952 broken = 1;
1e915849
RS
1953 if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1954 {
1955 create_insn (&nop_insn, mips_opcodes + i);
c67a084a
NC
1956 if (mips_fix_loongson2f_nop)
1957 nop_insn.insn_opcode = LOONGSON2F_NOP_INSN;
1e915849
RS
1958 nop_insn.fixed_p = 1;
1959 }
252b5132
RH
1960 }
1961 ++i;
1962 }
1963 while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1964 }
1965
1966 mips16_op_hash = hash_new ();
1967
1968 i = 0;
1969 while (i < bfd_mips16_num_opcodes)
1970 {
1971 const char *name = mips16_opcodes[i].name;
1972
17a2f251 1973 retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
252b5132
RH
1974 if (retval != NULL)
1975 as_fatal (_("internal: can't hash `%s': %s"),
1976 mips16_opcodes[i].name, retval);
1977 do
1978 {
1979 if (mips16_opcodes[i].pinfo != INSN_MACRO
1980 && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1981 != mips16_opcodes[i].match))
1982 {
1983 fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1984 mips16_opcodes[i].name, mips16_opcodes[i].args);
1985 broken = 1;
1986 }
1e915849
RS
1987 if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1988 {
1989 create_insn (&mips16_nop_insn, mips16_opcodes + i);
1990 mips16_nop_insn.fixed_p = 1;
1991 }
252b5132
RH
1992 ++i;
1993 }
1994 while (i < bfd_mips16_num_opcodes
1995 && strcmp (mips16_opcodes[i].name, name) == 0);
1996 }
1997
1998 if (broken)
1999 as_fatal (_("Broken assembler. No assembly attempted."));
2000
2001 /* We add all the general register names to the symbol table. This
2002 helps us detect invalid uses of them. */
707bfff6
TS
2003 for (i = 0; reg_names[i].name; i++)
2004 symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
8fc4ee9b 2005 reg_names[i].num, /* & RNUM_MASK, */
707bfff6
TS
2006 &zero_address_frag));
2007 if (HAVE_NEWABI)
2008 for (i = 0; reg_names_n32n64[i].name; i++)
2009 symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
8fc4ee9b 2010 reg_names_n32n64[i].num, /* & RNUM_MASK, */
252b5132 2011 &zero_address_frag));
707bfff6
TS
2012 else
2013 for (i = 0; reg_names_o32[i].name; i++)
2014 symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
8fc4ee9b 2015 reg_names_o32[i].num, /* & RNUM_MASK, */
6047c971 2016 &zero_address_frag));
6047c971 2017
7d10b47d 2018 mips_no_prev_insn ();
252b5132
RH
2019
2020 mips_gprmask = 0;
2021 mips_cprmask[0] = 0;
2022 mips_cprmask[1] = 0;
2023 mips_cprmask[2] = 0;
2024 mips_cprmask[3] = 0;
2025
2026 /* set the default alignment for the text section (2**2) */
2027 record_alignment (text_section, 2);
2028
4d0d148d 2029 bfd_set_gp_size (stdoutput, g_switch_value);
252b5132 2030
707bfff6 2031#ifdef OBJ_ELF
f43abd2b 2032 if (IS_ELF)
252b5132 2033 {
0a44bf69
RS
2034 /* On a native system other than VxWorks, sections must be aligned
2035 to 16 byte boundaries. When configured for an embedded ELF
2036 target, we don't bother. */
c41e87e3
CF
2037 if (strncmp (TARGET_OS, "elf", 3) != 0
2038 && strncmp (TARGET_OS, "vxworks", 7) != 0)
252b5132
RH
2039 {
2040 (void) bfd_set_section_alignment (stdoutput, text_section, 4);
2041 (void) bfd_set_section_alignment (stdoutput, data_section, 4);
2042 (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
2043 }
2044
2045 /* Create a .reginfo section for register masks and a .mdebug
2046 section for debugging information. */
2047 {
2048 segT seg;
2049 subsegT subseg;
2050 flagword flags;
2051 segT sec;
2052
2053 seg = now_seg;
2054 subseg = now_subseg;
2055
2056 /* The ABI says this section should be loaded so that the
2057 running program can access it. However, we don't load it
2058 if we are configured for an embedded target */
2059 flags = SEC_READONLY | SEC_DATA;
c41e87e3 2060 if (strncmp (TARGET_OS, "elf", 3) != 0)
252b5132
RH
2061 flags |= SEC_ALLOC | SEC_LOAD;
2062
316f5878 2063 if (mips_abi != N64_ABI)
252b5132
RH
2064 {
2065 sec = subseg_new (".reginfo", (subsegT) 0);
2066
195325d2
TS
2067 bfd_set_section_flags (stdoutput, sec, flags);
2068 bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
bdaaa2e1 2069
252b5132 2070 mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
252b5132
RH
2071 }
2072 else
2073 {
2074 /* The 64-bit ABI uses a .MIPS.options section rather than
2075 .reginfo section. */
2076 sec = subseg_new (".MIPS.options", (subsegT) 0);
195325d2
TS
2077 bfd_set_section_flags (stdoutput, sec, flags);
2078 bfd_set_section_alignment (stdoutput, sec, 3);
252b5132 2079
252b5132
RH
2080 /* Set up the option header. */
2081 {
2082 Elf_Internal_Options opthdr;
2083 char *f;
2084
2085 opthdr.kind = ODK_REGINFO;
2086 opthdr.size = (sizeof (Elf_External_Options)
2087 + sizeof (Elf64_External_RegInfo));
2088 opthdr.section = 0;
2089 opthdr.info = 0;
2090 f = frag_more (sizeof (Elf_External_Options));
2091 bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
2092 (Elf_External_Options *) f);
2093
2094 mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
2095 }
252b5132
RH
2096 }
2097
2098 if (ECOFF_DEBUGGING)
2099 {
2100 sec = subseg_new (".mdebug", (subsegT) 0);
2101 (void) bfd_set_section_flags (stdoutput, sec,
2102 SEC_HAS_CONTENTS | SEC_READONLY);
2103 (void) bfd_set_section_alignment (stdoutput, sec, 2);
2104 }
f43abd2b 2105 else if (mips_flag_pdr)
ecb4347a
DJ
2106 {
2107 pdr_seg = subseg_new (".pdr", (subsegT) 0);
2108 (void) bfd_set_section_flags (stdoutput, pdr_seg,
2109 SEC_READONLY | SEC_RELOC
2110 | SEC_DEBUGGING);
2111 (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
2112 }
252b5132
RH
2113
2114 subseg_set (seg, subseg);
2115 }
2116 }
707bfff6 2117#endif /* OBJ_ELF */
252b5132
RH
2118
2119 if (! ECOFF_DEBUGGING)
2120 md_obj_begin ();
71400594
RS
2121
2122 if (mips_fix_vr4120)
2123 init_vr4120_conflicts ();
252b5132
RH
2124}
2125
2126void
17a2f251 2127md_mips_end (void)
252b5132 2128{
02b1ab82 2129 mips_emit_delays ();
252b5132
RH
2130 if (! ECOFF_DEBUGGING)
2131 md_obj_end ();
2132}
2133
2134void
17a2f251 2135md_assemble (char *str)
252b5132
RH
2136{
2137 struct mips_cl_insn insn;
f6688943
TS
2138 bfd_reloc_code_real_type unused_reloc[3]
2139 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
252b5132
RH
2140
2141 imm_expr.X_op = O_absent;
5f74bc13 2142 imm2_expr.X_op = O_absent;
252b5132 2143 offset_expr.X_op = O_absent;
f6688943
TS
2144 imm_reloc[0] = BFD_RELOC_UNUSED;
2145 imm_reloc[1] = BFD_RELOC_UNUSED;
2146 imm_reloc[2] = BFD_RELOC_UNUSED;
2147 offset_reloc[0] = BFD_RELOC_UNUSED;
2148 offset_reloc[1] = BFD_RELOC_UNUSED;
2149 offset_reloc[2] = BFD_RELOC_UNUSED;
252b5132
RH
2150
2151 if (mips_opts.mips16)
2152 mips16_ip (str, &insn);
2153 else
2154 {
2155 mips_ip (str, &insn);
beae10d5
KH
2156 DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
2157 str, insn.insn_opcode));
252b5132
RH
2158 }
2159
2160 if (insn_error)
2161 {
2162 as_bad ("%s `%s'", insn_error, str);
2163 return;
2164 }
2165
2166 if (insn.insn_mo->pinfo == INSN_MACRO)
2167 {
584892a6 2168 macro_start ();
252b5132
RH
2169 if (mips_opts.mips16)
2170 mips16_macro (&insn);
2171 else
2172 macro (&insn);
584892a6 2173 macro_end ();
252b5132
RH
2174 }
2175 else
2176 {
2177 if (imm_expr.X_op != O_absent)
4d7206a2 2178 append_insn (&insn, &imm_expr, imm_reloc);
252b5132 2179 else if (offset_expr.X_op != O_absent)
4d7206a2 2180 append_insn (&insn, &offset_expr, offset_reloc);
252b5132 2181 else
4d7206a2 2182 append_insn (&insn, NULL, unused_reloc);
252b5132
RH
2183 }
2184}
2185
738e5348
RS
2186/* Convenience functions for abstracting away the differences between
2187 MIPS16 and non-MIPS16 relocations. */
2188
2189static inline bfd_boolean
2190mips16_reloc_p (bfd_reloc_code_real_type reloc)
2191{
2192 switch (reloc)
2193 {
2194 case BFD_RELOC_MIPS16_JMP:
2195 case BFD_RELOC_MIPS16_GPREL:
2196 case BFD_RELOC_MIPS16_GOT16:
2197 case BFD_RELOC_MIPS16_CALL16:
2198 case BFD_RELOC_MIPS16_HI16_S:
2199 case BFD_RELOC_MIPS16_HI16:
2200 case BFD_RELOC_MIPS16_LO16:
2201 return TRUE;
2202
2203 default:
2204 return FALSE;
2205 }
2206}
2207
2208static inline bfd_boolean
2209got16_reloc_p (bfd_reloc_code_real_type reloc)
2210{
2211 return reloc == BFD_RELOC_MIPS_GOT16 || reloc == BFD_RELOC_MIPS16_GOT16;
2212}
2213
2214static inline bfd_boolean
2215hi16_reloc_p (bfd_reloc_code_real_type reloc)
2216{
2217 return reloc == BFD_RELOC_HI16_S || reloc == BFD_RELOC_MIPS16_HI16_S;
2218}
2219
2220static inline bfd_boolean
2221lo16_reloc_p (bfd_reloc_code_real_type reloc)
2222{
2223 return reloc == BFD_RELOC_LO16 || reloc == BFD_RELOC_MIPS16_LO16;
2224}
2225
5919d012 2226/* Return true if the given relocation might need a matching %lo().
0a44bf69
RS
2227 This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2228 need a matching %lo() when applied to local symbols. */
5919d012
RS
2229
2230static inline bfd_boolean
17a2f251 2231reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
5919d012 2232{
3b91255e 2233 return (HAVE_IN_PLACE_ADDENDS
738e5348 2234 && (hi16_reloc_p (reloc)
0a44bf69
RS
2235 /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2236 all GOT16 relocations evaluate to "G". */
738e5348
RS
2237 || (got16_reloc_p (reloc) && mips_pic != VXWORKS_PIC)));
2238}
2239
2240/* Return the type of %lo() reloc needed by RELOC, given that
2241 reloc_needs_lo_p. */
2242
2243static inline bfd_reloc_code_real_type
2244matching_lo_reloc (bfd_reloc_code_real_type reloc)
2245{
2246 return mips16_reloc_p (reloc) ? BFD_RELOC_MIPS16_LO16 : BFD_RELOC_LO16;
5919d012
RS
2247}
2248
2249/* Return true if the given fixup is followed by a matching R_MIPS_LO16
2250 relocation. */
2251
2252static inline bfd_boolean
17a2f251 2253fixup_has_matching_lo_p (fixS *fixp)
5919d012
RS
2254{
2255 return (fixp->fx_next != NULL
738e5348 2256 && fixp->fx_next->fx_r_type == matching_lo_reloc (fixp->fx_r_type)
5919d012
RS
2257 && fixp->fx_addsy == fixp->fx_next->fx_addsy
2258 && fixp->fx_offset == fixp->fx_next->fx_offset);
2259}
2260
252b5132
RH
2261/* This function returns true if modifying a register requires a
2262 delay. */
2263
2264static int
17a2f251 2265reg_needs_delay (unsigned int reg)
252b5132
RH
2266{
2267 unsigned long prev_pinfo;
2268
47e39b9d 2269 prev_pinfo = history[0].insn_mo->pinfo;
252b5132 2270 if (! mips_opts.noreorder
81912461
ILT
2271 && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2272 && ! gpr_interlocks)
2273 || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2274 && ! cop_interlocks)))
252b5132 2275 {
81912461
ILT
2276 /* A load from a coprocessor or from memory. All load delays
2277 delay the use of general register rt for one instruction. */
bdaaa2e1 2278 /* Itbl support may require additional care here. */
252b5132 2279 know (prev_pinfo & INSN_WRITE_GPR_T);
bf12938e 2280 if (reg == EXTRACT_OPERAND (RT, history[0]))
252b5132
RH
2281 return 1;
2282 }
2283
2284 return 0;
2285}
2286
404a8071
RS
2287/* Move all labels in insn_labels to the current insertion point. */
2288
2289static void
2290mips_move_labels (void)
2291{
a8dbcb85 2292 segment_info_type *si = seg_info (now_seg);
404a8071
RS
2293 struct insn_label_list *l;
2294 valueT val;
2295
a8dbcb85 2296 for (l = si->label_list; l != NULL; l = l->next)
404a8071 2297 {
9c2799c2 2298 gas_assert (S_GET_SEGMENT (l->label) == now_seg);
404a8071
RS
2299 symbol_set_frag (l->label, frag_now);
2300 val = (valueT) frag_now_fix ();
2301 /* mips16 text labels are stored as odd. */
2302 if (mips_opts.mips16)
2303 ++val;
2304 S_SET_VALUE (l->label, val);
2305 }
2306}
2307
5f0fe04b
TS
2308static bfd_boolean
2309s_is_linkonce (symbolS *sym, segT from_seg)
2310{
2311 bfd_boolean linkonce = FALSE;
2312 segT symseg = S_GET_SEGMENT (sym);
2313
2314 if (symseg != from_seg && !S_IS_LOCAL (sym))
2315 {
2316 if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
2317 linkonce = TRUE;
2318#ifdef OBJ_ELF
2319 /* The GNU toolchain uses an extension for ELF: a section
2320 beginning with the magic string .gnu.linkonce is a
2321 linkonce section. */
2322 if (strncmp (segment_name (symseg), ".gnu.linkonce",
2323 sizeof ".gnu.linkonce" - 1) == 0)
2324 linkonce = TRUE;
2325#endif
2326 }
2327 return linkonce;
2328}
2329
252b5132
RH
2330/* Mark instruction labels in mips16 mode. This permits the linker to
2331 handle them specially, such as generating jalx instructions when
2332 needed. We also make them odd for the duration of the assembly, in
2333 order to generate the right sort of code. We will make them even
2334 in the adjust_symtab routine, while leaving them marked. This is
2335 convenient for the debugger and the disassembler. The linker knows
2336 to make them odd again. */
2337
2338static void
17a2f251 2339mips16_mark_labels (void)
252b5132 2340{
a8dbcb85
TS
2341 segment_info_type *si = seg_info (now_seg);
2342 struct insn_label_list *l;
252b5132 2343
a8dbcb85
TS
2344 if (!mips_opts.mips16)
2345 return;
2346
2347 for (l = si->label_list; l != NULL; l = l->next)
2348 {
2349 symbolS *label = l->label;
2350
2351#if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
f43abd2b 2352 if (IS_ELF)
30c09090 2353 S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label)));
252b5132 2354#endif
5f0fe04b
TS
2355 if ((S_GET_VALUE (label) & 1) == 0
2356 /* Don't adjust the address if the label is global or weak, or
2357 in a link-once section, since we'll be emitting symbol reloc
2358 references to it which will be patched up by the linker, and
2359 the final value of the symbol may or may not be MIPS16. */
2360 && ! S_IS_WEAK (label)
2361 && ! S_IS_EXTERNAL (label)
2362 && ! s_is_linkonce (label, now_seg))
a8dbcb85 2363 S_SET_VALUE (label, S_GET_VALUE (label) | 1);
252b5132
RH
2364 }
2365}
2366
4d7206a2
RS
2367/* End the current frag. Make it a variant frag and record the
2368 relaxation info. */
2369
2370static void
2371relax_close_frag (void)
2372{
584892a6 2373 mips_macro_warning.first_frag = frag_now;
4d7206a2 2374 frag_var (rs_machine_dependent, 0, 0,
584892a6 2375 RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
4d7206a2
RS
2376 mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2377
2378 memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2379 mips_relax.first_fixup = 0;
2380}
2381
2382/* Start a new relaxation sequence whose expansion depends on SYMBOL.
2383 See the comment above RELAX_ENCODE for more details. */
2384
2385static void
2386relax_start (symbolS *symbol)
2387{
9c2799c2 2388 gas_assert (mips_relax.sequence == 0);
4d7206a2
RS
2389 mips_relax.sequence = 1;
2390 mips_relax.symbol = symbol;
2391}
2392
2393/* Start generating the second version of a relaxable sequence.
2394 See the comment above RELAX_ENCODE for more details. */
252b5132
RH
2395
2396static void
4d7206a2
RS
2397relax_switch (void)
2398{
9c2799c2 2399 gas_assert (mips_relax.sequence == 1);
4d7206a2
RS
2400 mips_relax.sequence = 2;
2401}
2402
2403/* End the current relaxable sequence. */
2404
2405static void
2406relax_end (void)
2407{
9c2799c2 2408 gas_assert (mips_relax.sequence == 2);
4d7206a2
RS
2409 relax_close_frag ();
2410 mips_relax.sequence = 0;
2411}
2412
4c260379
RS
2413/* Return the mask of core registers that IP reads. */
2414
2415static unsigned int
2416gpr_read_mask (const struct mips_cl_insn *ip)
2417{
2418 unsigned long pinfo, pinfo2;
2419 unsigned int mask;
2420
2421 mask = 0;
2422 pinfo = ip->insn_mo->pinfo;
2423 pinfo2 = ip->insn_mo->pinfo2;
2424 if (mips_opts.mips16)
2425 {
2426 if (pinfo & MIPS16_INSN_READ_X)
2427 mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)];
2428 if (pinfo & MIPS16_INSN_READ_Y)
2429 mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)];
2430 if (pinfo & MIPS16_INSN_READ_T)
2431 mask |= 1 << TREG;
2432 if (pinfo & MIPS16_INSN_READ_SP)
2433 mask |= 1 << SP;
2434 if (pinfo & MIPS16_INSN_READ_31)
2435 mask |= 1 << RA;
2436 if (pinfo & MIPS16_INSN_READ_Z)
2437 mask |= 1 << (mips16_to_32_reg_map
2438 [MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]);
2439 if (pinfo & MIPS16_INSN_READ_GPR_X)
2440 mask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
2441 }
2442 else
2443 {
2444 if (pinfo2 & INSN2_READ_GPR_D)
2445 mask |= 1 << EXTRACT_OPERAND (RD, *ip);
2446 if (pinfo & INSN_READ_GPR_T)
2447 mask |= 1 << EXTRACT_OPERAND (RT, *ip);
2448 if (pinfo & INSN_READ_GPR_S)
2449 mask |= 1 << EXTRACT_OPERAND (RS, *ip);
2450 if (pinfo2 & INSN2_READ_GPR_Z)
2451 mask |= 1 << EXTRACT_OPERAND (RZ, *ip);
2452 }
fe35f09f
RS
2453 /* Don't include register 0. */
2454 return mask & ~1;
4c260379
RS
2455}
2456
2457/* Return the mask of core registers that IP writes. */
2458
2459static unsigned int
2460gpr_write_mask (const struct mips_cl_insn *ip)
2461{
2462 unsigned long pinfo, pinfo2;
2463 unsigned int mask;
2464
2465 mask = 0;
2466 pinfo = ip->insn_mo->pinfo;
2467 pinfo2 = ip->insn_mo->pinfo2;
2468 if (mips_opts.mips16)
2469 {
2470 if (pinfo & MIPS16_INSN_WRITE_X)
2471 mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)];
2472 if (pinfo & MIPS16_INSN_WRITE_Y)
2473 mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)];
2474 if (pinfo & MIPS16_INSN_WRITE_Z)
2475 mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RZ, *ip)];
2476 if (pinfo & MIPS16_INSN_WRITE_T)
2477 mask |= 1 << TREG;
2478 if (pinfo & MIPS16_INSN_WRITE_SP)
2479 mask |= 1 << SP;
2480 if (pinfo & MIPS16_INSN_WRITE_31)
2481 mask |= 1 << RA;
2482 if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
2483 mask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
2484 }
2485 else
2486 {
2487 if (pinfo & INSN_WRITE_GPR_D)
2488 mask |= 1 << EXTRACT_OPERAND (RD, *ip);
2489 if (pinfo & INSN_WRITE_GPR_T)
2490 mask |= 1 << EXTRACT_OPERAND (RT, *ip);
2491 if (pinfo & INSN_WRITE_GPR_31)
2492 mask |= 1 << RA;
2493 if (pinfo2 & INSN2_WRITE_GPR_Z)
2494 mask |= 1 << EXTRACT_OPERAND (RZ, *ip);
2495 }
fe35f09f
RS
2496 /* Don't include register 0. */
2497 return mask & ~1;
4c260379
RS
2498}
2499
2500/* Return the mask of floating-point registers that IP reads. */
2501
2502static unsigned int
2503fpr_read_mask (const struct mips_cl_insn *ip)
2504{
2505 unsigned long pinfo, pinfo2;
2506 unsigned int mask;
2507
2508 mask = 0;
2509 pinfo = ip->insn_mo->pinfo;
2510 pinfo2 = ip->insn_mo->pinfo2;
2511 if (!mips_opts.mips16)
2512 {
2513 if (pinfo & INSN_READ_FPR_S)
2514 mask |= 1 << EXTRACT_OPERAND (FS, *ip);
2515 if (pinfo & INSN_READ_FPR_T)
2516 mask |= 1 << EXTRACT_OPERAND (FT, *ip);
2517 if (pinfo & INSN_READ_FPR_R)
2518 mask |= 1 << EXTRACT_OPERAND (FR, *ip);
2519 if (pinfo2 & INSN2_READ_FPR_Z)
2520 mask |= 1 << EXTRACT_OPERAND (FZ, *ip);
2521 }
2522 /* Conservatively treat all operands to an FP_D instruction are doubles.
2523 (This is overly pessimistic for things like cvt.d.s.) */
2524 if (HAVE_32BIT_FPRS && (pinfo & FP_D))
2525 mask |= mask << 1;
2526 return mask;
2527}
2528
2529/* Return the mask of floating-point registers that IP writes. */
2530
2531static unsigned int
2532fpr_write_mask (const struct mips_cl_insn *ip)
2533{
2534 unsigned long pinfo, pinfo2;
2535 unsigned int mask;
2536
2537 mask = 0;
2538 pinfo = ip->insn_mo->pinfo;
2539 pinfo2 = ip->insn_mo->pinfo2;
2540 if (!mips_opts.mips16)
2541 {
2542 if (pinfo & INSN_WRITE_FPR_D)
2543 mask |= 1 << EXTRACT_OPERAND (FD, *ip);
2544 if (pinfo & INSN_WRITE_FPR_S)
2545 mask |= 1 << EXTRACT_OPERAND (FS, *ip);
2546 if (pinfo & INSN_WRITE_FPR_T)
2547 mask |= 1 << EXTRACT_OPERAND (FT, *ip);
2548 if (pinfo2 & INSN2_WRITE_FPR_Z)
2549 mask |= 1 << EXTRACT_OPERAND (FZ, *ip);
2550 }
2551 /* Conservatively treat all operands to an FP_D instruction are doubles.
2552 (This is overly pessimistic for things like cvt.s.d.) */
2553 if (HAVE_32BIT_FPRS && (pinfo & FP_D))
2554 mask |= mask << 1;
2555 return mask;
2556}
2557
71400594
RS
2558/* Classify an instruction according to the FIX_VR4120_* enumeration.
2559 Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
2560 by VR4120 errata. */
4d7206a2 2561
71400594
RS
2562static unsigned int
2563classify_vr4120_insn (const char *name)
252b5132 2564{
71400594
RS
2565 if (strncmp (name, "macc", 4) == 0)
2566 return FIX_VR4120_MACC;
2567 if (strncmp (name, "dmacc", 5) == 0)
2568 return FIX_VR4120_DMACC;
2569 if (strncmp (name, "mult", 4) == 0)
2570 return FIX_VR4120_MULT;
2571 if (strncmp (name, "dmult", 5) == 0)
2572 return FIX_VR4120_DMULT;
2573 if (strstr (name, "div"))
2574 return FIX_VR4120_DIV;
2575 if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
2576 return FIX_VR4120_MTHILO;
2577 return NUM_FIX_VR4120_CLASSES;
2578}
252b5132 2579
ff239038
CM
2580#define INSN_ERET 0x42000018
2581#define INSN_DERET 0x4200001f
2582
71400594
RS
2583/* Return the number of instructions that must separate INSN1 and INSN2,
2584 where INSN1 is the earlier instruction. Return the worst-case value
2585 for any INSN2 if INSN2 is null. */
252b5132 2586
71400594
RS
2587static unsigned int
2588insns_between (const struct mips_cl_insn *insn1,
2589 const struct mips_cl_insn *insn2)
2590{
2591 unsigned long pinfo1, pinfo2;
4c260379 2592 unsigned int mask;
71400594
RS
2593
2594 /* This function needs to know which pinfo flags are set for INSN2
2595 and which registers INSN2 uses. The former is stored in PINFO2 and
4c260379
RS
2596 the latter is tested via INSN2_USES_GPR. If INSN2 is null, PINFO2
2597 will have every flag set and INSN2_USES_GPR will always return true. */
71400594
RS
2598 pinfo1 = insn1->insn_mo->pinfo;
2599 pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
252b5132 2600
4c260379
RS
2601#define INSN2_USES_GPR(REG) \
2602 (insn2 == NULL || (gpr_read_mask (insn2) & (1U << (REG))) != 0)
71400594
RS
2603
2604 /* For most targets, write-after-read dependencies on the HI and LO
2605 registers must be separated by at least two instructions. */
2606 if (!hilo_interlocks)
252b5132 2607 {
71400594
RS
2608 if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
2609 return 2;
2610 if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
2611 return 2;
2612 }
2613
2614 /* If we're working around r7000 errata, there must be two instructions
2615 between an mfhi or mflo and any instruction that uses the result. */
2616 if (mips_7000_hilo_fix
2617 && MF_HILO_INSN (pinfo1)
4c260379 2618 && INSN2_USES_GPR (EXTRACT_OPERAND (RD, *insn1)))
71400594
RS
2619 return 2;
2620
ff239038
CM
2621 /* If we're working around 24K errata, one instruction is required
2622 if an ERET or DERET is followed by a branch instruction. */
2623 if (mips_fix_24k)
2624 {
2625 if (insn1->insn_opcode == INSN_ERET
2626 || insn1->insn_opcode == INSN_DERET)
2627 {
2628 if (insn2 == NULL
2629 || insn2->insn_opcode == INSN_ERET
2630 || insn2->insn_opcode == INSN_DERET
2631 || (insn2->insn_mo->pinfo
2632 & (INSN_UNCOND_BRANCH_DELAY
2633 | INSN_COND_BRANCH_DELAY
2634 | INSN_COND_BRANCH_LIKELY)) != 0)
2635 return 1;
2636 }
2637 }
2638
71400594
RS
2639 /* If working around VR4120 errata, check for combinations that need
2640 a single intervening instruction. */
2641 if (mips_fix_vr4120)
2642 {
2643 unsigned int class1, class2;
252b5132 2644
71400594
RS
2645 class1 = classify_vr4120_insn (insn1->insn_mo->name);
2646 if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
252b5132 2647 {
71400594
RS
2648 if (insn2 == NULL)
2649 return 1;
2650 class2 = classify_vr4120_insn (insn2->insn_mo->name);
2651 if (vr4120_conflicts[class1] & (1 << class2))
2652 return 1;
252b5132 2653 }
71400594
RS
2654 }
2655
2656 if (!mips_opts.mips16)
2657 {
2658 /* Check for GPR or coprocessor load delays. All such delays
2659 are on the RT register. */
2660 /* Itbl support may require additional care here. */
2661 if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
2662 || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
252b5132 2663 {
71400594 2664 know (pinfo1 & INSN_WRITE_GPR_T);
4c260379 2665 if (INSN2_USES_GPR (EXTRACT_OPERAND (RT, *insn1)))
71400594
RS
2666 return 1;
2667 }
2668
2669 /* Check for generic coprocessor hazards.
2670
2671 This case is not handled very well. There is no special
2672 knowledge of CP0 handling, and the coprocessors other than
2673 the floating point unit are not distinguished at all. */
2674 /* Itbl support may require additional care here. FIXME!
2675 Need to modify this to include knowledge about
2676 user specified delays! */
2677 else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
2678 || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
2679 {
2680 /* Handle cases where INSN1 writes to a known general coprocessor
2681 register. There must be a one instruction delay before INSN2
2682 if INSN2 reads that register, otherwise no delay is needed. */
4c260379
RS
2683 mask = fpr_write_mask (insn1);
2684 if (mask != 0)
252b5132 2685 {
4c260379 2686 if (!insn2 || (mask & fpr_read_mask (insn2)) != 0)
71400594 2687 return 1;
252b5132
RH
2688 }
2689 else
2690 {
71400594
RS
2691 /* Read-after-write dependencies on the control registers
2692 require a two-instruction gap. */
2693 if ((pinfo1 & INSN_WRITE_COND_CODE)
2694 && (pinfo2 & INSN_READ_COND_CODE))
2695 return 2;
2696
2697 /* We don't know exactly what INSN1 does. If INSN2 is
2698 also a coprocessor instruction, assume there must be
2699 a one instruction gap. */
2700 if (pinfo2 & INSN_COP)
2701 return 1;
252b5132
RH
2702 }
2703 }
6b76fefe 2704
71400594
RS
2705 /* Check for read-after-write dependencies on the coprocessor
2706 control registers in cases where INSN1 does not need a general
2707 coprocessor delay. This means that INSN1 is a floating point
2708 comparison instruction. */
2709 /* Itbl support may require additional care here. */
2710 else if (!cop_interlocks
2711 && (pinfo1 & INSN_WRITE_COND_CODE)
2712 && (pinfo2 & INSN_READ_COND_CODE))
2713 return 1;
2714 }
6b76fefe 2715
4c260379 2716#undef INSN2_USES_GPR
6b76fefe 2717
71400594
RS
2718 return 0;
2719}
6b76fefe 2720
7d8e00cf
RS
2721/* Return the number of nops that would be needed to work around the
2722 VR4130 mflo/mfhi errata if instruction INSN immediately followed
932d1a1b
RS
2723 the MAX_VR4130_NOPS instructions described by HIST. Ignore hazards
2724 that are contained within the first IGNORE instructions of HIST. */
7d8e00cf
RS
2725
2726static int
932d1a1b 2727nops_for_vr4130 (int ignore, const struct mips_cl_insn *hist,
7d8e00cf
RS
2728 const struct mips_cl_insn *insn)
2729{
4c260379
RS
2730 int i, j;
2731 unsigned int mask;
7d8e00cf
RS
2732
2733 /* Check if the instruction writes to HI or LO. MTHI and MTLO
2734 are not affected by the errata. */
2735 if (insn != 0
2736 && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
2737 || strcmp (insn->insn_mo->name, "mtlo") == 0
2738 || strcmp (insn->insn_mo->name, "mthi") == 0))
2739 return 0;
2740
2741 /* Search for the first MFLO or MFHI. */
2742 for (i = 0; i < MAX_VR4130_NOPS; i++)
91d6fa6a 2743 if (MF_HILO_INSN (hist[i].insn_mo->pinfo))
7d8e00cf
RS
2744 {
2745 /* Extract the destination register. */
4c260379 2746 mask = gpr_write_mask (&hist[i]);
7d8e00cf
RS
2747
2748 /* No nops are needed if INSN reads that register. */
4c260379 2749 if (insn != NULL && (gpr_read_mask (insn) & mask) != 0)
7d8e00cf
RS
2750 return 0;
2751
2752 /* ...or if any of the intervening instructions do. */
2753 for (j = 0; j < i; j++)
4c260379 2754 if (gpr_read_mask (&hist[j]) & mask)
7d8e00cf
RS
2755 return 0;
2756
932d1a1b
RS
2757 if (i >= ignore)
2758 return MAX_VR4130_NOPS - i;
7d8e00cf
RS
2759 }
2760 return 0;
2761}
2762
15be625d
CM
2763#define BASE_REG_EQ(INSN1, INSN2) \
2764 ((((INSN1) >> OP_SH_RS) & OP_MASK_RS) \
2765 == (((INSN2) >> OP_SH_RS) & OP_MASK_RS))
2766
2767/* Return the minimum alignment for this store instruction. */
2768
2769static int
2770fix_24k_align_to (const struct mips_opcode *mo)
2771{
2772 if (strcmp (mo->name, "sh") == 0)
2773 return 2;
2774
2775 if (strcmp (mo->name, "swc1") == 0
2776 || strcmp (mo->name, "swc2") == 0
2777 || strcmp (mo->name, "sw") == 0
2778 || strcmp (mo->name, "sc") == 0
2779 || strcmp (mo->name, "s.s") == 0)
2780 return 4;
2781
2782 if (strcmp (mo->name, "sdc1") == 0
2783 || strcmp (mo->name, "sdc2") == 0
2784 || strcmp (mo->name, "s.d") == 0)
2785 return 8;
2786
2787 /* sb, swl, swr */
2788 return 1;
2789}
2790
2791struct fix_24k_store_info
2792 {
2793 /* Immediate offset, if any, for this store instruction. */
2794 short off;
2795 /* Alignment required by this store instruction. */
2796 int align_to;
2797 /* True for register offsets. */
2798 int register_offset;
2799 };
2800
2801/* Comparison function used by qsort. */
2802
2803static int
2804fix_24k_sort (const void *a, const void *b)
2805{
2806 const struct fix_24k_store_info *pos1 = a;
2807 const struct fix_24k_store_info *pos2 = b;
2808
2809 return (pos1->off - pos2->off);
2810}
2811
2812/* INSN is a store instruction. Try to record the store information
2813 in STINFO. Return false if the information isn't known. */
2814
2815static bfd_boolean
2816fix_24k_record_store_info (struct fix_24k_store_info *stinfo,
ab9794cf 2817 const struct mips_cl_insn *insn)
15be625d
CM
2818{
2819 /* The instruction must have a known offset. */
2820 if (!insn->complete_p || !strstr (insn->insn_mo->args, "o("))
2821 return FALSE;
2822
2823 stinfo->off = (insn->insn_opcode >> OP_SH_IMMEDIATE) & OP_MASK_IMMEDIATE;
2824 stinfo->align_to = fix_24k_align_to (insn->insn_mo);
2825 return TRUE;
2826}
2827
932d1a1b
RS
2828/* Return the number of nops that would be needed to work around the 24k
2829 "lost data on stores during refill" errata if instruction INSN
2830 immediately followed the 2 instructions described by HIST.
2831 Ignore hazards that are contained within the first IGNORE
2832 instructions of HIST.
2833
2834 Problem: The FSB (fetch store buffer) acts as an intermediate buffer
2835 for the data cache refills and store data. The following describes
2836 the scenario where the store data could be lost.
2837
2838 * A data cache miss, due to either a load or a store, causing fill
2839 data to be supplied by the memory subsystem
2840 * The first three doublewords of fill data are returned and written
2841 into the cache
2842 * A sequence of four stores occurs in consecutive cycles around the
2843 final doubleword of the fill:
2844 * Store A
2845 * Store B
2846 * Store C
2847 * Zero, One or more instructions
2848 * Store D
2849
2850 The four stores A-D must be to different doublewords of the line that
2851 is being filled. The fourth instruction in the sequence above permits
2852 the fill of the final doubleword to be transferred from the FSB into
2853 the cache. In the sequence above, the stores may be either integer
2854 (sb, sh, sw, swr, swl, sc) or coprocessor (swc1/swc2, sdc1/sdc2,
2855 swxc1, sdxc1, suxc1) stores, as long as the four stores are to
2856 different doublewords on the line. If the floating point unit is
2857 running in 1:2 mode, it is not possible to create the sequence above
2858 using only floating point store instructions.
15be625d
CM
2859
2860 In this case, the cache line being filled is incorrectly marked
2861 invalid, thereby losing the data from any store to the line that
2862 occurs between the original miss and the completion of the five
2863 cycle sequence shown above.
2864
932d1a1b 2865 The workarounds are:
15be625d 2866
932d1a1b
RS
2867 * Run the data cache in write-through mode.
2868 * Insert a non-store instruction between
2869 Store A and Store B or Store B and Store C. */
15be625d
CM
2870
2871static int
932d1a1b 2872nops_for_24k (int ignore, const struct mips_cl_insn *hist,
15be625d
CM
2873 const struct mips_cl_insn *insn)
2874{
2875 struct fix_24k_store_info pos[3];
2876 int align, i, base_offset;
2877
932d1a1b
RS
2878 if (ignore >= 2)
2879 return 0;
2880
ab9794cf
RS
2881 /* If the previous instruction wasn't a store, there's nothing to
2882 worry about. */
15be625d
CM
2883 if ((hist[0].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
2884 return 0;
2885
ab9794cf
RS
2886 /* If the instructions after the previous one are unknown, we have
2887 to assume the worst. */
2888 if (!insn)
15be625d
CM
2889 return 1;
2890
ab9794cf
RS
2891 /* Check whether we are dealing with three consecutive stores. */
2892 if ((insn->insn_mo->pinfo & INSN_STORE_MEMORY) == 0
2893 || (hist[1].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
15be625d
CM
2894 return 0;
2895
2896 /* If we don't know the relationship between the store addresses,
2897 assume the worst. */
ab9794cf 2898 if (!BASE_REG_EQ (insn->insn_opcode, hist[0].insn_opcode)
15be625d
CM
2899 || !BASE_REG_EQ (insn->insn_opcode, hist[1].insn_opcode))
2900 return 1;
2901
2902 if (!fix_24k_record_store_info (&pos[0], insn)
2903 || !fix_24k_record_store_info (&pos[1], &hist[0])
2904 || !fix_24k_record_store_info (&pos[2], &hist[1]))
2905 return 1;
2906
2907 qsort (&pos, 3, sizeof (struct fix_24k_store_info), fix_24k_sort);
2908
2909 /* Pick a value of ALIGN and X such that all offsets are adjusted by
2910 X bytes and such that the base register + X is known to be aligned
2911 to align bytes. */
2912
2913 if (((insn->insn_opcode >> OP_SH_RS) & OP_MASK_RS) == SP)
2914 align = 8;
2915 else
2916 {
2917 align = pos[0].align_to;
2918 base_offset = pos[0].off;
2919 for (i = 1; i < 3; i++)
2920 if (align < pos[i].align_to)
2921 {
2922 align = pos[i].align_to;
2923 base_offset = pos[i].off;
2924 }
2925 for (i = 0; i < 3; i++)
2926 pos[i].off -= base_offset;
2927 }
2928
2929 pos[0].off &= ~align + 1;
2930 pos[1].off &= ~align + 1;
2931 pos[2].off &= ~align + 1;
2932
2933 /* If any two stores write to the same chunk, they also write to the
2934 same doubleword. The offsets are still sorted at this point. */
2935 if (pos[0].off == pos[1].off || pos[1].off == pos[2].off)
2936 return 0;
2937
2938 /* A range of at least 9 bytes is needed for the stores to be in
2939 non-overlapping doublewords. */
2940 if (pos[2].off - pos[0].off <= 8)
2941 return 0;
2942
2943 if (pos[2].off - pos[1].off >= 24
2944 || pos[1].off - pos[0].off >= 24
2945 || pos[2].off - pos[0].off >= 32)
2946 return 0;
2947
2948 return 1;
2949}
2950
71400594 2951/* Return the number of nops that would be needed if instruction INSN
91d6fa6a 2952 immediately followed the MAX_NOPS instructions given by HIST,
932d1a1b
RS
2953 where HIST[0] is the most recent instruction. Ignore hazards
2954 between INSN and the first IGNORE instructions in HIST.
2955
2956 If INSN is null, return the worse-case number of nops for any
2957 instruction. */
bdaaa2e1 2958
71400594 2959static int
932d1a1b 2960nops_for_insn (int ignore, const struct mips_cl_insn *hist,
71400594
RS
2961 const struct mips_cl_insn *insn)
2962{
2963 int i, nops, tmp_nops;
bdaaa2e1 2964
71400594 2965 nops = 0;
932d1a1b 2966 for (i = ignore; i < MAX_DELAY_NOPS; i++)
65b02341 2967 {
91d6fa6a 2968 tmp_nops = insns_between (hist + i, insn) - i;
65b02341
RS
2969 if (tmp_nops > nops)
2970 nops = tmp_nops;
2971 }
7d8e00cf
RS
2972
2973 if (mips_fix_vr4130)
2974 {
932d1a1b 2975 tmp_nops = nops_for_vr4130 (ignore, hist, insn);
7d8e00cf
RS
2976 if (tmp_nops > nops)
2977 nops = tmp_nops;
2978 }
2979
15be625d
CM
2980 if (mips_fix_24k)
2981 {
932d1a1b 2982 tmp_nops = nops_for_24k (ignore, hist, insn);
15be625d
CM
2983 if (tmp_nops > nops)
2984 nops = tmp_nops;
2985 }
2986
71400594
RS
2987 return nops;
2988}
252b5132 2989
71400594 2990/* The variable arguments provide NUM_INSNS extra instructions that
91d6fa6a 2991 might be added to HIST. Return the largest number of nops that
932d1a1b
RS
2992 would be needed after the extended sequence, ignoring hazards
2993 in the first IGNORE instructions. */
252b5132 2994
71400594 2995static int
932d1a1b
RS
2996nops_for_sequence (int num_insns, int ignore,
2997 const struct mips_cl_insn *hist, ...)
71400594
RS
2998{
2999 va_list args;
3000 struct mips_cl_insn buffer[MAX_NOPS];
3001 struct mips_cl_insn *cursor;
3002 int nops;
3003
91d6fa6a 3004 va_start (args, hist);
71400594 3005 cursor = buffer + num_insns;
91d6fa6a 3006 memcpy (cursor, hist, (MAX_NOPS - num_insns) * sizeof (*cursor));
71400594
RS
3007 while (cursor > buffer)
3008 *--cursor = *va_arg (args, const struct mips_cl_insn *);
3009
932d1a1b 3010 nops = nops_for_insn (ignore, buffer, NULL);
71400594
RS
3011 va_end (args);
3012 return nops;
3013}
252b5132 3014
71400594
RS
3015/* Like nops_for_insn, but if INSN is a branch, take into account the
3016 worst-case delay for the branch target. */
252b5132 3017
71400594 3018static int
932d1a1b 3019nops_for_insn_or_target (int ignore, const struct mips_cl_insn *hist,
71400594
RS
3020 const struct mips_cl_insn *insn)
3021{
3022 int nops, tmp_nops;
60b63b72 3023
932d1a1b 3024 nops = nops_for_insn (ignore, hist, insn);
71400594
RS
3025 if (insn->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
3026 | INSN_COND_BRANCH_DELAY
3027 | INSN_COND_BRANCH_LIKELY))
3028 {
932d1a1b
RS
3029 tmp_nops = nops_for_sequence (2, ignore ? ignore + 2 : 0,
3030 hist, insn, NOP_INSN);
71400594
RS
3031 if (tmp_nops > nops)
3032 nops = tmp_nops;
3033 }
9a2c7088
MR
3034 else if (mips_opts.mips16
3035 && (insn->insn_mo->pinfo & (MIPS16_INSN_UNCOND_BRANCH
3036 | MIPS16_INSN_COND_BRANCH)))
71400594 3037 {
932d1a1b 3038 tmp_nops = nops_for_sequence (1, ignore ? ignore + 1 : 0, hist, insn);
71400594
RS
3039 if (tmp_nops > nops)
3040 nops = tmp_nops;
3041 }
3042 return nops;
3043}
3044
c67a084a
NC
3045/* Fix NOP issue: Replace nops by "or at,at,zero". */
3046
3047static void
3048fix_loongson2f_nop (struct mips_cl_insn * ip)
3049{
3050 if (strcmp (ip->insn_mo->name, "nop") == 0)
3051 ip->insn_opcode = LOONGSON2F_NOP_INSN;
3052}
3053
3054/* Fix Jump Issue: Eliminate instruction fetch from outside 256M region
3055 jr target pc &= 'hffff_ffff_cfff_ffff. */
3056
3057static void
3058fix_loongson2f_jump (struct mips_cl_insn * ip)
3059{
3060 if (strcmp (ip->insn_mo->name, "j") == 0
3061 || strcmp (ip->insn_mo->name, "jr") == 0
3062 || strcmp (ip->insn_mo->name, "jalr") == 0)
3063 {
3064 int sreg;
3065 expressionS ep;
3066
3067 if (! mips_opts.at)
3068 return;
3069
3070 sreg = EXTRACT_OPERAND (RS, *ip);
3071 if (sreg == ZERO || sreg == KT0 || sreg == KT1 || sreg == ATREG)
3072 return;
3073
3074 ep.X_op = O_constant;
3075 ep.X_add_number = 0xcfff0000;
3076 macro_build (&ep, "lui", "t,u", ATREG, BFD_RELOC_HI16);
3077 ep.X_add_number = 0xffff;
3078 macro_build (&ep, "ori", "t,r,i", ATREG, ATREG, BFD_RELOC_LO16);
3079 macro_build (NULL, "and", "d,v,t", sreg, sreg, ATREG);
3080 }
3081}
3082
3083static void
3084fix_loongson2f (struct mips_cl_insn * ip)
3085{
3086 if (mips_fix_loongson2f_nop)
3087 fix_loongson2f_nop (ip);
3088
3089 if (mips_fix_loongson2f_jump)
3090 fix_loongson2f_jump (ip);
3091}
3092
a4e06468
RS
3093/* IP is a branch that has a delay slot, and we need to fill it
3094 automatically. Return true if we can do that by swapping IP
3095 with the previous instruction. */
3096
3097static bfd_boolean
3098can_swap_branch_p (struct mips_cl_insn *ip)
3099{
3100 unsigned long pinfo, prev_pinfo;
3101 unsigned int gpr_read, gpr_write, prev_gpr_read, prev_gpr_write;
3102
3103 /* -O2 and above is required for this optimization. */
3104 if (mips_optimize < 2)
3105 return FALSE;
3106
3107 /* If we have seen .set volatile or .set nomove, don't optimize. */
3108 if (mips_opts.nomove)
3109 return FALSE;
3110
3111 /* We can't swap if the previous instruction's position is fixed. */
3112 if (history[0].fixed_p)
3113 return FALSE;
3114
3115 /* If the previous previous insn was in a .set noreorder, we can't
3116 swap. Actually, the MIPS assembler will swap in this situation.
3117 However, gcc configured -with-gnu-as will generate code like
3118
3119 .set noreorder
3120 lw $4,XXX
3121 .set reorder
3122 INSN
3123 bne $4,$0,foo
3124
3125 in which we can not swap the bne and INSN. If gcc is not configured
3126 -with-gnu-as, it does not output the .set pseudo-ops. */
3127 if (history[1].noreorder_p)
3128 return FALSE;
3129
3130 /* If the previous instruction had a fixup in mips16 mode, we can not
3131 swap. This normally means that the previous instruction was a 4
3132 byte branch anyhow. */
3133 if (mips_opts.mips16 && history[0].fixp[0])
3134 return FALSE;
3135
3136 /* If the branch is itself the target of a branch, we can not swap.
3137 We cheat on this; all we check for is whether there is a label on
3138 this instruction. If there are any branches to anything other than
3139 a label, users must use .set noreorder. */
3140 if (seg_info (now_seg)->label_list)
3141 return FALSE;
3142
3143 /* If the previous instruction is in a variant frag other than this
3144 branch's one, we cannot do the swap. This does not apply to the
3145 mips16, which uses variant frags for different purposes. */
3146 if (!mips_opts.mips16
3147 && history[0].frag
3148 && history[0].frag->fr_type == rs_machine_dependent)
3149 return FALSE;
3150
3151 /* We do not swap with a trap instruction, since it complicates trap
3152 handlers to have the trap instruction be in a delay slot. */
3153 prev_pinfo = history[0].insn_mo->pinfo;
3154 if (prev_pinfo & INSN_TRAP)
3155 return FALSE;
3156
3157 /* If the previous instruction is a sync, sync.l, or sync.p, we can
3158 not swap. */
3159 if (prev_pinfo & INSN_SYNC)
3160 return FALSE;
3161
3162 /* If the previous instruction is an ERET or DERET, avoid the swap. */
3163 if (history[0].insn_opcode == INSN_ERET)
3164 return FALSE;
3165 if (history[0].insn_opcode == INSN_DERET)
3166 return FALSE;
3167
3168 /* Check for conflicts between the branch and the instructions
3169 before the candidate delay slot. */
3170 if (nops_for_insn (0, history + 1, ip) > 0)
3171 return FALSE;
3172
3173 /* Check for conflicts between the swapped sequence and the
3174 target of the branch. */
3175 if (nops_for_sequence (2, 0, history + 1, ip, history) > 0)
3176 return FALSE;
3177
3178 /* If the branch reads a register that the previous
3179 instruction sets, we can not swap. */
3180 gpr_read = gpr_read_mask (ip);
3181 prev_gpr_write = gpr_write_mask (&history[0]);
3182 if (gpr_read & prev_gpr_write)
3183 return FALSE;
3184
3185 /* If the branch writes a register that the previous
3186 instruction sets, we can not swap. */
3187 gpr_write = gpr_write_mask (ip);
3188 if (gpr_write & prev_gpr_write)
3189 return FALSE;
3190
3191 /* If the branch writes a register that the previous
3192 instruction reads, we can not swap. */
3193 prev_gpr_read = gpr_read_mask (&history[0]);
3194 if (gpr_write & prev_gpr_read)
3195 return FALSE;
3196
3197 /* If one instruction sets a condition code and the
3198 other one uses a condition code, we can not swap. */
3199 pinfo = ip->insn_mo->pinfo;
3200 if ((pinfo & INSN_READ_COND_CODE)
3201 && (prev_pinfo & INSN_WRITE_COND_CODE))
3202 return FALSE;
3203 if ((pinfo & INSN_WRITE_COND_CODE)
3204 && (prev_pinfo & INSN_READ_COND_CODE))
3205 return FALSE;
3206
3207 /* If the previous instruction uses the PC, we can not swap. */
3208 if (mips_opts.mips16 && (prev_pinfo & MIPS16_INSN_READ_PC))
3209 return FALSE;
3210
3211 return TRUE;
3212}
3213
3214/* Decide how we should add IP to the instruction stream. */
3215
3216static enum append_method
3217get_append_method (struct mips_cl_insn *ip)
3218{
3219 unsigned long pinfo;
3220
3221 /* The relaxed version of a macro sequence must be inherently
3222 hazard-free. */
3223 if (mips_relax.sequence == 2)
3224 return APPEND_ADD;
3225
3226 /* We must not dabble with instructions in a ".set norerorder" block. */
3227 if (mips_opts.noreorder)
3228 return APPEND_ADD;
3229
3230 /* Otherwise, it's our responsibility to fill branch delay slots. */
3231 pinfo = ip->insn_mo->pinfo;
3232 if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
3233 || (pinfo & INSN_COND_BRANCH_DELAY))
3234 {
3235 if (can_swap_branch_p (ip))
3236 return APPEND_SWAP;
3237
3238 if (mips_opts.mips16
3239 && ISA_SUPPORTS_MIPS16E
3240 && (pinfo & INSN_UNCOND_BRANCH_DELAY)
3241 && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31)))
3242 return APPEND_ADD_COMPACT;
3243
3244 return APPEND_ADD_WITH_NOP;
3245 }
3246
3247 /* We don't bother trying to track the target of branches, so there's
3248 nothing we can use to fill a branch-likely slot. */
3249 if (pinfo & INSN_COND_BRANCH_LIKELY)
3250 return APPEND_ADD_WITH_NOP;
3251
3252 return APPEND_ADD;
3253}
3254
ceb94aa5
RS
3255/* IP is a MIPS16 instruction whose opcode we have just changed.
3256 Point IP->insn_mo to the new opcode's definition. */
3257
3258static void
3259find_altered_mips16_opcode (struct mips_cl_insn *ip)
3260{
3261 const struct mips_opcode *mo, *end;
3262
3263 end = &mips16_opcodes[bfd_mips16_num_opcodes];
3264 for (mo = ip->insn_mo; mo < end; mo++)
3265 if ((ip->insn_opcode & mo->mask) == mo->match)
3266 {
3267 ip->insn_mo = mo;
3268 return;
3269 }
3270 abort ();
3271}
3272
71400594
RS
3273/* Output an instruction. IP is the instruction information.
3274 ADDRESS_EXPR is an operand of the instruction to be used with
3275 RELOC_TYPE. */
3276
3277static void
3278append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
3279 bfd_reloc_code_real_type *reloc_type)
3280{
3994f87e 3281 unsigned long prev_pinfo, pinfo;
71400594 3282 bfd_boolean relaxed_branch = FALSE;
a4e06468 3283 enum append_method method;
71400594 3284
c67a084a
NC
3285 if (mips_fix_loongson2f)
3286 fix_loongson2f (ip);
3287
71400594
RS
3288 /* Mark instruction labels in mips16 mode. */
3289 mips16_mark_labels ();
3290
738f4d98
MR
3291 file_ase_mips16 |= mips_opts.mips16;
3292
71400594
RS
3293 prev_pinfo = history[0].insn_mo->pinfo;
3294 pinfo = ip->insn_mo->pinfo;
3295
15be625d
CM
3296 if (address_expr == NULL)
3297 ip->complete_p = 1;
3298 else if (*reloc_type <= BFD_RELOC_UNUSED
3299 && address_expr->X_op == O_constant)
3300 {
3301 unsigned int tmp;
3302
3303 ip->complete_p = 1;
3304 switch (*reloc_type)
3305 {
3306 case BFD_RELOC_32:
3307 ip->insn_opcode |= address_expr->X_add_number;
3308 break;
3309
3310 case BFD_RELOC_MIPS_HIGHEST:
3311 tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
3312 ip->insn_opcode |= tmp & 0xffff;
3313 break;
3314
3315 case BFD_RELOC_MIPS_HIGHER:
3316 tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
3317 ip->insn_opcode |= tmp & 0xffff;
3318 break;
3319
3320 case BFD_RELOC_HI16_S:
3321 tmp = (address_expr->X_add_number + 0x8000) >> 16;
3322 ip->insn_opcode |= tmp & 0xffff;
3323 break;
3324
3325 case BFD_RELOC_HI16:
3326 ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
3327 break;
3328
3329 case BFD_RELOC_UNUSED:
3330 case BFD_RELOC_LO16:
3331 case BFD_RELOC_MIPS_GOT_DISP:
3332 ip->insn_opcode |= address_expr->X_add_number & 0xffff;
3333 break;
3334
3335 case BFD_RELOC_MIPS_JMP:
3336 if ((address_expr->X_add_number & 3) != 0)
3337 as_bad (_("jump to misaligned address (0x%lx)"),
3338 (unsigned long) address_expr->X_add_number);
3339 ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
3340 ip->complete_p = 0;
3341 break;
3342
3343 case BFD_RELOC_MIPS16_JMP:
3344 if ((address_expr->X_add_number & 3) != 0)
3345 as_bad (_("jump to misaligned address (0x%lx)"),
3346 (unsigned long) address_expr->X_add_number);
3347 ip->insn_opcode |=
3348 (((address_expr->X_add_number & 0x7c0000) << 3)
3349 | ((address_expr->X_add_number & 0xf800000) >> 7)
3350 | ((address_expr->X_add_number & 0x3fffc) >> 2));
3351 ip->complete_p = 0;
3352 break;
3353
3354 case BFD_RELOC_16_PCREL_S2:
3355 if ((address_expr->X_add_number & 3) != 0)
3356 as_bad (_("branch to misaligned address (0x%lx)"),
3357 (unsigned long) address_expr->X_add_number);
9fe77896
RS
3358 if (!mips_relax_branch)
3359 {
3360 if ((address_expr->X_add_number + 0x20000) & ~0x3ffff)
3361 as_bad (_("branch address range overflow (0x%lx)"),
3362 (unsigned long) address_expr->X_add_number);
3363 ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0xffff;
3364 }
15be625d
CM
3365 ip->complete_p = 0;
3366 break;
3367
3368 default:
3369 internalError ();
3370 }
3371 }
3372
71400594
RS
3373 if (mips_relax.sequence != 2 && !mips_opts.noreorder)
3374 {
3375 /* There are a lot of optimizations we could do that we don't.
3376 In particular, we do not, in general, reorder instructions.
3377 If you use gcc with optimization, it will reorder
3378 instructions and generally do much more optimization then we
3379 do here; repeating all that work in the assembler would only
3380 benefit hand written assembly code, and does not seem worth
3381 it. */
3382 int nops = (mips_optimize == 0
932d1a1b
RS
3383 ? nops_for_insn (0, history, NULL)
3384 : nops_for_insn_or_target (0, history, ip));
71400594 3385 if (nops > 0)
252b5132
RH
3386 {
3387 fragS *old_frag;
3388 unsigned long old_frag_offset;
3389 int i;
252b5132
RH
3390
3391 old_frag = frag_now;
3392 old_frag_offset = frag_now_fix ();
3393
3394 for (i = 0; i < nops; i++)
3395 emit_nop ();
3396
3397 if (listing)
3398 {
3399 listing_prev_line ();
3400 /* We may be at the start of a variant frag. In case we
3401 are, make sure there is enough space for the frag
3402 after the frags created by listing_prev_line. The
3403 argument to frag_grow here must be at least as large
3404 as the argument to all other calls to frag_grow in
3405 this file. We don't have to worry about being in the
3406 middle of a variant frag, because the variants insert
3407 all needed nop instructions themselves. */
3408 frag_grow (40);
3409 }
3410
404a8071 3411 mips_move_labels ();
252b5132
RH
3412
3413#ifndef NO_ECOFF_DEBUGGING
3414 if (ECOFF_DEBUGGING)
3415 ecoff_fix_loc (old_frag, old_frag_offset);
3416#endif
3417 }
71400594
RS
3418 }
3419 else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
3420 {
932d1a1b
RS
3421 int nops;
3422
3423 /* Work out how many nops in prev_nop_frag are needed by IP,
3424 ignoring hazards generated by the first prev_nop_frag_since
3425 instructions. */
3426 nops = nops_for_insn_or_target (prev_nop_frag_since, history, ip);
9c2799c2 3427 gas_assert (nops <= prev_nop_frag_holds);
252b5132 3428
71400594
RS
3429 /* Enforce NOPS as a minimum. */
3430 if (nops > prev_nop_frag_required)
3431 prev_nop_frag_required = nops;
252b5132 3432
71400594
RS
3433 if (prev_nop_frag_holds == prev_nop_frag_required)
3434 {
3435 /* Settle for the current number of nops. Update the history
3436 accordingly (for the benefit of any future .set reorder code). */
3437 prev_nop_frag = NULL;
3438 insert_into_history (prev_nop_frag_since,
3439 prev_nop_frag_holds, NOP_INSN);
3440 }
3441 else
3442 {
3443 /* Allow this instruction to replace one of the nops that was
3444 tentatively added to prev_nop_frag. */
3445 prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
3446 prev_nop_frag_holds--;
3447 prev_nop_frag_since++;
252b5132
RH
3448 }
3449 }
3450
a4e06468
RS
3451 method = get_append_method (ip);
3452
58e2ea4d
MR
3453#ifdef OBJ_ELF
3454 /* The value passed to dwarf2_emit_insn is the distance between
3455 the beginning of the current instruction and the address that
e3a82c8e
MR
3456 should be recorded in the debug tables. This is normally the
3457 current address.
3458
3459 For MIPS16 debug info we want to use ISA-encoded addresses,
3460 so we use -1 for an address higher by one than the current one.
3461
3462 If the instruction produced is a branch that we will swap with
3463 the preceding instruction, then we add the displacement by which
3464 the branch will be moved backwards. This is more appropriate
3465 and for MIPS16 code also prevents a debugger from placing a
3466 breakpoint in the middle of the branch (and corrupting code if
3467 software breakpoints are used). */
3468 dwarf2_emit_insn ((mips_opts.mips16 ? -1 : 0)
3469 + (method == APPEND_SWAP ? insn_length (history) : 0));
58e2ea4d
MR
3470#endif
3471
4d7206a2 3472 if (address_expr
0b25d3e6 3473 && *reloc_type == BFD_RELOC_16_PCREL_S2
4a6a3df4
AO
3474 && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
3475 || pinfo & INSN_COND_BRANCH_LIKELY)
3476 && mips_relax_branch
3477 /* Don't try branch relaxation within .set nomacro, or within
3478 .set noat if we use $at for PIC computations. If it turns
3479 out that the branch was out-of-range, we'll get an error. */
3480 && !mips_opts.warn_about_macros
741fe287 3481 && (mips_opts.at || mips_pic == NO_PIC)
d455268f
MR
3482 /* Don't relax BPOSGE32/64 as they have no complementing branches. */
3483 && !(ip->insn_mo->membership & (INSN_DSP64 | INSN_DSP))
4a6a3df4
AO
3484 && !mips_opts.mips16)
3485 {
895921c9 3486 relaxed_branch = TRUE;
1e915849
RS
3487 add_relaxed_insn (ip, (relaxed_branch_length
3488 (NULL, NULL,
3489 (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
3490 : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1
3491 : 0)), 4,
3492 RELAX_BRANCH_ENCODE
66b3e8da
MR
3493 (AT,
3494 pinfo & INSN_UNCOND_BRANCH_DELAY,
1e915849
RS
3495 pinfo & INSN_COND_BRANCH_LIKELY,
3496 pinfo & INSN_WRITE_GPR_31,
3497 0),
3498 address_expr->X_add_symbol,
3499 address_expr->X_add_number);
4a6a3df4
AO
3500 *reloc_type = BFD_RELOC_UNUSED;
3501 }
3502 else if (*reloc_type > BFD_RELOC_UNUSED)
252b5132
RH
3503 {
3504 /* We need to set up a variant frag. */
9c2799c2 3505 gas_assert (mips_opts.mips16 && address_expr != NULL);
1e915849
RS
3506 add_relaxed_insn (ip, 4, 0,
3507 RELAX_MIPS16_ENCODE
3508 (*reloc_type - BFD_RELOC_UNUSED,
3509 mips16_small, mips16_ext,
3510 prev_pinfo & INSN_UNCOND_BRANCH_DELAY,
3511 history[0].mips16_absolute_jump_p),
3512 make_expr_symbol (address_expr), 0);
252b5132 3513 }
252b5132
RH
3514 else if (mips_opts.mips16
3515 && ! ip->use_extend
f6688943 3516 && *reloc_type != BFD_RELOC_MIPS16_JMP)
9497f5ac 3517 {
b8ee1a6e
DU
3518 if ((pinfo & INSN_UNCOND_BRANCH_DELAY) == 0)
3519 /* Make sure there is enough room to swap this instruction with
3520 a following jump instruction. */
3521 frag_grow (6);
1e915849 3522 add_fixed_insn (ip);
252b5132
RH
3523 }
3524 else
3525 {
3526 if (mips_opts.mips16
3527 && mips_opts.noreorder
3528 && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
3529 as_warn (_("extended instruction in delay slot"));
3530
4d7206a2
RS
3531 if (mips_relax.sequence)
3532 {
3533 /* If we've reached the end of this frag, turn it into a variant
3534 frag and record the information for the instructions we've
3535 written so far. */
3536 if (frag_room () < 4)
3537 relax_close_frag ();
3538 mips_relax.sizes[mips_relax.sequence - 1] += 4;
3539 }
3540
584892a6
RS
3541 if (mips_relax.sequence != 2)
3542 mips_macro_warning.sizes[0] += 4;
3543 if (mips_relax.sequence != 1)
3544 mips_macro_warning.sizes[1] += 4;
3545
1e915849
RS
3546 if (mips_opts.mips16)
3547 {
3548 ip->fixed_p = 1;
3549 ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
3550 }
3551 add_fixed_insn (ip);
252b5132
RH
3552 }
3553
9fe77896 3554 if (!ip->complete_p && *reloc_type < BFD_RELOC_UNUSED)
252b5132 3555 {
9fe77896
RS
3556 reloc_howto_type *howto;
3557 int i;
34ce925e 3558
9fe77896
RS
3559 /* In a compound relocation, it is the final (outermost)
3560 operator that determines the relocated field. */
3561 for (i = 1; i < 3; i++)
3562 if (reloc_type[i] == BFD_RELOC_UNUSED)
3563 break;
34ce925e 3564
9fe77896
RS
3565 howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
3566 if (howto == NULL)
3567 {
3568 /* To reproduce this failure try assembling gas/testsuites/
3569 gas/mips/mips16-intermix.s with a mips-ecoff targeted
3570 assembler. */
3571 as_bad (_("Unsupported MIPS relocation number %d"), reloc_type[i - 1]);
3572 howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_16);
3573 }
23fce1e3 3574
9fe77896
RS
3575 ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
3576 bfd_get_reloc_size (howto),
3577 address_expr,
3578 reloc_type[0] == BFD_RELOC_16_PCREL_S2,
3579 reloc_type[0]);
3580
3581 /* Tag symbols that have a R_MIPS16_26 relocation against them. */
3582 if (reloc_type[0] == BFD_RELOC_MIPS16_JMP
3583 && ip->fixp[0]->fx_addsy)
3584 *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
3585
3586 /* These relocations can have an addend that won't fit in
3587 4 octets for 64bit assembly. */
3588 if (HAVE_64BIT_GPRS
3589 && ! howto->partial_inplace
3590 && (reloc_type[0] == BFD_RELOC_16
3591 || reloc_type[0] == BFD_RELOC_32
3592 || reloc_type[0] == BFD_RELOC_MIPS_JMP
3593 || reloc_type[0] == BFD_RELOC_GPREL16
3594 || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
3595 || reloc_type[0] == BFD_RELOC_GPREL32
3596 || reloc_type[0] == BFD_RELOC_64
3597 || reloc_type[0] == BFD_RELOC_CTOR
3598 || reloc_type[0] == BFD_RELOC_MIPS_SUB
3599 || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
3600 || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
3601 || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
3602 || reloc_type[0] == BFD_RELOC_MIPS_REL16
3603 || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
3604 || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
3605 || hi16_reloc_p (reloc_type[0])
3606 || lo16_reloc_p (reloc_type[0])))
3607 ip->fixp[0]->fx_no_overflow = 1;
3608
3609 if (mips_relax.sequence)
3610 {
3611 if (mips_relax.first_fixup == 0)
3612 mips_relax.first_fixup = ip->fixp[0];
3613 }
3614 else if (reloc_needs_lo_p (*reloc_type))
3615 {
3616 struct mips_hi_fixup *hi_fixup;
3617
3618 /* Reuse the last entry if it already has a matching %lo. */
3619 hi_fixup = mips_hi_fixup_list;
3620 if (hi_fixup == 0
3621 || !fixup_has_matching_lo_p (hi_fixup->fixp))
4d7206a2 3622 {
9fe77896
RS
3623 hi_fixup = ((struct mips_hi_fixup *)
3624 xmalloc (sizeof (struct mips_hi_fixup)));
3625 hi_fixup->next = mips_hi_fixup_list;
3626 mips_hi_fixup_list = hi_fixup;
4d7206a2 3627 }
9fe77896
RS
3628 hi_fixup->fixp = ip->fixp[0];
3629 hi_fixup->seg = now_seg;
3630 }
252b5132 3631
9fe77896
RS
3632 /* Add fixups for the second and third relocations, if given.
3633 Note that the ABI allows the second relocation to be
3634 against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC. At the
3635 moment we only use RSS_UNDEF, but we could add support
3636 for the others if it ever becomes necessary. */
3637 for (i = 1; i < 3; i++)
3638 if (reloc_type[i] != BFD_RELOC_UNUSED)
3639 {
3640 ip->fixp[i] = fix_new (ip->frag, ip->where,
3641 ip->fixp[0]->fx_size, NULL, 0,
3642 FALSE, reloc_type[i]);
f6688943 3643
9fe77896
RS
3644 /* Use fx_tcbit to mark compound relocs. */
3645 ip->fixp[0]->fx_tcbit = 1;
3646 ip->fixp[i]->fx_tcbit = 1;
3647 }
252b5132 3648 }
1e915849 3649 install_insn (ip);
252b5132
RH
3650
3651 /* Update the register mask information. */
4c260379
RS
3652 mips_gprmask |= gpr_read_mask (ip) | gpr_write_mask (ip);
3653 mips_cprmask[1] |= fpr_read_mask (ip) | fpr_write_mask (ip);
252b5132 3654
a4e06468 3655 switch (method)
252b5132 3656 {
a4e06468
RS
3657 case APPEND_ADD:
3658 insert_into_history (0, 1, ip);
3659 break;
3660
3661 case APPEND_ADD_WITH_NOP:
3662 insert_into_history (0, 1, ip);
3663 emit_nop ();
3664 if (mips_relax.sequence)
3665 mips_relax.sizes[mips_relax.sequence - 1] += 4;
3666 break;
3667
3668 case APPEND_ADD_COMPACT:
3669 /* Convert MIPS16 jr/jalr into a "compact" jump. */
3670 gas_assert (mips_opts.mips16);
3671 ip->insn_opcode |= 0x0080;
3672 find_altered_mips16_opcode (ip);
3673 install_insn (ip);
3674 insert_into_history (0, 1, ip);
3675 break;
3676
3677 case APPEND_SWAP:
3678 {
3679 struct mips_cl_insn delay = history[0];
3680 if (mips_opts.mips16)
3681 {
3682 know (delay.frag == ip->frag);
3683 move_insn (ip, delay.frag, delay.where);
3684 move_insn (&delay, ip->frag, ip->where + insn_length (ip));
3685 }
3686 else if (relaxed_branch)
3687 {
3688 /* Add the delay slot instruction to the end of the
3689 current frag and shrink the fixed part of the
3690 original frag. If the branch occupies the tail of
3691 the latter, move it backwards to cover the gap. */
3692 delay.frag->fr_fix -= 4;
3693 if (delay.frag == ip->frag)
3694 move_insn (ip, ip->frag, ip->where - 4);
3695 add_fixed_insn (&delay);
3696 }
3697 else
3698 {
3699 move_insn (&delay, ip->frag, ip->where);
3700 move_insn (ip, history[0].frag, history[0].where);
3701 }
3702 history[0] = *ip;
3703 delay.fixed_p = 1;
3704 insert_into_history (0, 1, &delay);
3705 }
3706 break;
252b5132
RH
3707 }
3708
13408f1e
RS
3709 /* If we have just completed an unconditional branch, clear the history. */
3710 if ((history[1].insn_mo->pinfo & INSN_UNCOND_BRANCH_DELAY)
3711 || (mips_opts.mips16
3712 && (history[0].insn_mo->pinfo & MIPS16_INSN_UNCOND_BRANCH)))
3713 mips_no_prev_insn ();
3714
252b5132
RH
3715 /* We just output an insn, so the next one doesn't have a label. */
3716 mips_clear_insn_labels ();
252b5132
RH
3717}
3718
7d10b47d 3719/* Forget that there was any previous instruction or label. */
252b5132
RH
3720
3721static void
7d10b47d 3722mips_no_prev_insn (void)
252b5132 3723{
7d10b47d
RS
3724 prev_nop_frag = NULL;
3725 insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
252b5132
RH
3726 mips_clear_insn_labels ();
3727}
3728
7d10b47d
RS
3729/* This function must be called before we emit something other than
3730 instructions. It is like mips_no_prev_insn except that it inserts
3731 any NOPS that might be needed by previous instructions. */
252b5132 3732
7d10b47d
RS
3733void
3734mips_emit_delays (void)
252b5132
RH
3735{
3736 if (! mips_opts.noreorder)
3737 {
932d1a1b 3738 int nops = nops_for_insn (0, history, NULL);
252b5132
RH
3739 if (nops > 0)
3740 {
7d10b47d
RS
3741 while (nops-- > 0)
3742 add_fixed_insn (NOP_INSN);
3743 mips_move_labels ();
3744 }
3745 }
3746 mips_no_prev_insn ();
3747}
3748
3749/* Start a (possibly nested) noreorder block. */
3750
3751static void
3752start_noreorder (void)
3753{
3754 if (mips_opts.noreorder == 0)
3755 {
3756 unsigned int i;
3757 int nops;
3758
3759 /* None of the instructions before the .set noreorder can be moved. */
3760 for (i = 0; i < ARRAY_SIZE (history); i++)
3761 history[i].fixed_p = 1;
3762
3763 /* Insert any nops that might be needed between the .set noreorder
3764 block and the previous instructions. We will later remove any
3765 nops that turn out not to be needed. */
932d1a1b 3766 nops = nops_for_insn (0, history, NULL);
7d10b47d
RS
3767 if (nops > 0)
3768 {
3769 if (mips_optimize != 0)
252b5132
RH
3770 {
3771 /* Record the frag which holds the nop instructions, so
3772 that we can remove them if we don't need them. */
3773 frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
3774 prev_nop_frag = frag_now;
3775 prev_nop_frag_holds = nops;
3776 prev_nop_frag_required = 0;
3777 prev_nop_frag_since = 0;
3778 }
3779
3780 for (; nops > 0; --nops)
1e915849 3781 add_fixed_insn (NOP_INSN);
252b5132 3782
7d10b47d
RS
3783 /* Move on to a new frag, so that it is safe to simply
3784 decrease the size of prev_nop_frag. */
3785 frag_wane (frag_now);
3786 frag_new (0);
404a8071 3787 mips_move_labels ();
252b5132 3788 }
7d10b47d
RS
3789 mips16_mark_labels ();
3790 mips_clear_insn_labels ();
252b5132 3791 }
7d10b47d
RS
3792 mips_opts.noreorder++;
3793 mips_any_noreorder = 1;
3794}
252b5132 3795
7d10b47d 3796/* End a nested noreorder block. */
252b5132 3797
7d10b47d
RS
3798static void
3799end_noreorder (void)
3800{
6a32d874 3801
7d10b47d
RS
3802 mips_opts.noreorder--;
3803 if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
3804 {
3805 /* Commit to inserting prev_nop_frag_required nops and go back to
3806 handling nop insertion the .set reorder way. */
3807 prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
3808 * (mips_opts.mips16 ? 2 : 4));
3809 insert_into_history (prev_nop_frag_since,
3810 prev_nop_frag_required, NOP_INSN);
3811 prev_nop_frag = NULL;
3812 }
252b5132
RH
3813}
3814
584892a6
RS
3815/* Set up global variables for the start of a new macro. */
3816
3817static void
3818macro_start (void)
3819{
3820 memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
3821 mips_macro_warning.delay_slot_p = (mips_opts.noreorder
47e39b9d 3822 && (history[0].insn_mo->pinfo
584892a6
RS
3823 & (INSN_UNCOND_BRANCH_DELAY
3824 | INSN_COND_BRANCH_DELAY
3825 | INSN_COND_BRANCH_LIKELY)) != 0);
3826}
3827
3828/* Given that a macro is longer than 4 bytes, return the appropriate warning
3829 for it. Return null if no warning is needed. SUBTYPE is a bitmask of
3830 RELAX_DELAY_SLOT and RELAX_NOMACRO. */
3831
3832static const char *
3833macro_warning (relax_substateT subtype)
3834{
3835 if (subtype & RELAX_DELAY_SLOT)
3836 return _("Macro instruction expanded into multiple instructions"
3837 " in a branch delay slot");
3838 else if (subtype & RELAX_NOMACRO)
3839 return _("Macro instruction expanded into multiple instructions");
3840 else
3841 return 0;
3842}
3843
3844/* Finish up a macro. Emit warnings as appropriate. */
3845
3846static void
3847macro_end (void)
3848{
3849 if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
3850 {
3851 relax_substateT subtype;
3852
3853 /* Set up the relaxation warning flags. */
3854 subtype = 0;
3855 if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
3856 subtype |= RELAX_SECOND_LONGER;
3857 if (mips_opts.warn_about_macros)
3858 subtype |= RELAX_NOMACRO;
3859 if (mips_macro_warning.delay_slot_p)
3860 subtype |= RELAX_DELAY_SLOT;
3861
3862 if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
3863 {
3864 /* Either the macro has a single implementation or both
3865 implementations are longer than 4 bytes. Emit the
3866 warning now. */
3867 const char *msg = macro_warning (subtype);
3868 if (msg != 0)
520725ea 3869 as_warn ("%s", msg);
584892a6
RS
3870 }
3871 else
3872 {
3873 /* One implementation might need a warning but the other
3874 definitely doesn't. */
3875 mips_macro_warning.first_frag->fr_subtype |= subtype;
3876 }
3877 }
3878}
3879
6e1304d8
RS
3880/* Read a macro's relocation codes from *ARGS and store them in *R.
3881 The first argument in *ARGS will be either the code for a single
3882 relocation or -1 followed by the three codes that make up a
3883 composite relocation. */
3884
3885static void
3886macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
3887{
3888 int i, next;
3889
3890 next = va_arg (*args, int);
3891 if (next >= 0)
3892 r[0] = (bfd_reloc_code_real_type) next;
3893 else
3894 for (i = 0; i < 3; i++)
3895 r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
3896}
3897
252b5132
RH
3898/* Build an instruction created by a macro expansion. This is passed
3899 a pointer to the count of instructions created so far, an
3900 expression, the name of the instruction to build, an operand format
3901 string, and corresponding arguments. */
3902
252b5132 3903static void
67c0d1eb 3904macro_build (expressionS *ep, const char *name, const char *fmt, ...)
252b5132 3905{
1e915849 3906 const struct mips_opcode *mo;
252b5132 3907 struct mips_cl_insn insn;
f6688943 3908 bfd_reloc_code_real_type r[3];
252b5132 3909 va_list args;
252b5132 3910
252b5132 3911 va_start (args, fmt);
252b5132 3912
252b5132
RH
3913 if (mips_opts.mips16)
3914 {
03ea81db 3915 mips16_macro_build (ep, name, fmt, &args);
252b5132
RH
3916 va_end (args);
3917 return;
3918 }
3919
f6688943
TS
3920 r[0] = BFD_RELOC_UNUSED;
3921 r[1] = BFD_RELOC_UNUSED;
3922 r[2] = BFD_RELOC_UNUSED;
1e915849 3923 mo = (struct mips_opcode *) hash_find (op_hash, name);
9c2799c2
NC
3924 gas_assert (mo);
3925 gas_assert (strcmp (name, mo->name) == 0);
1e915849 3926
8b082fb1
TS
3927 while (1)
3928 {
3929 /* Search until we get a match for NAME. It is assumed here that
3930 macros will never generate MDMX, MIPS-3D, or MT instructions. */
3931 if (strcmp (fmt, mo->args) == 0
3932 && mo->pinfo != INSN_MACRO
f79e2745 3933 && is_opcode_valid (mo))
8b082fb1
TS
3934 break;
3935
1e915849 3936 ++mo;
9c2799c2
NC
3937 gas_assert (mo->name);
3938 gas_assert (strcmp (name, mo->name) == 0);
252b5132
RH
3939 }
3940
1e915849 3941 create_insn (&insn, mo);
252b5132
RH
3942 for (;;)
3943 {
3944 switch (*fmt++)
3945 {
3946 case '\0':
3947 break;
3948
3949 case ',':
3950 case '(':
3951 case ')':
3952 continue;
3953
5f74bc13
CD
3954 case '+':
3955 switch (*fmt++)
3956 {
3957 case 'A':
3958 case 'E':
bf12938e 3959 INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
5f74bc13
CD
3960 continue;
3961
3962 case 'B':
3963 case 'F':
3964 /* Note that in the macro case, these arguments are already
3965 in MSB form. (When handling the instruction in the
3966 non-macro case, these arguments are sizes from which
3967 MSB values must be calculated.) */
bf12938e 3968 INSERT_OPERAND (INSMSB, insn, va_arg (args, int));
5f74bc13
CD
3969 continue;
3970
3971 case 'C':
3972 case 'G':
3973 case 'H':
3974 /* Note that in the macro case, these arguments are already
3975 in MSBD form. (When handling the instruction in the
3976 non-macro case, these arguments are sizes from which
3977 MSBD values must be calculated.) */
bf12938e 3978 INSERT_OPERAND (EXTMSBD, insn, va_arg (args, int));
5f74bc13
CD
3979 continue;
3980
dd3cbb7e
NC
3981 case 'Q':
3982 INSERT_OPERAND (SEQI, insn, va_arg (args, int));
3983 continue;
3984
5f74bc13
CD
3985 default:
3986 internalError ();
3987 }
3988 continue;
3989
8b082fb1
TS
3990 case '2':
3991 INSERT_OPERAND (BP, insn, va_arg (args, int));
3992 continue;
3993
252b5132
RH
3994 case 't':
3995 case 'w':
3996 case 'E':
bf12938e 3997 INSERT_OPERAND (RT, insn, va_arg (args, int));
252b5132
RH
3998 continue;
3999
4000 case 'c':
bf12938e 4001 INSERT_OPERAND (CODE, insn, va_arg (args, int));
38487616
TS
4002 continue;
4003
252b5132
RH
4004 case 'T':
4005 case 'W':
bf12938e 4006 INSERT_OPERAND (FT, insn, va_arg (args, int));
252b5132
RH
4007 continue;
4008
4009 case 'd':
4010 case 'G':
af7ee8bf 4011 case 'K':
bf12938e 4012 INSERT_OPERAND (RD, insn, va_arg (args, int));
252b5132
RH
4013 continue;
4014
4372b673
NC
4015 case 'U':
4016 {
4017 int tmp = va_arg (args, int);
4018
bf12938e
RS
4019 INSERT_OPERAND (RT, insn, tmp);
4020 INSERT_OPERAND (RD, insn, tmp);
beae10d5 4021 continue;
4372b673
NC
4022 }
4023
252b5132
RH
4024 case 'V':
4025 case 'S':
bf12938e 4026 INSERT_OPERAND (FS, insn, va_arg (args, int));
252b5132
RH
4027 continue;
4028
4029 case 'z':
4030 continue;
4031
4032 case '<':
bf12938e 4033 INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
252b5132
RH
4034 continue;
4035
4036 case 'D':
bf12938e 4037 INSERT_OPERAND (FD, insn, va_arg (args, int));
252b5132
RH
4038 continue;
4039
4040 case 'B':
bf12938e 4041 INSERT_OPERAND (CODE20, insn, va_arg (args, int));
252b5132
RH
4042 continue;
4043
4372b673 4044 case 'J':
bf12938e 4045 INSERT_OPERAND (CODE19, insn, va_arg (args, int));
4372b673
NC
4046 continue;
4047
252b5132 4048 case 'q':
bf12938e 4049 INSERT_OPERAND (CODE2, insn, va_arg (args, int));
252b5132
RH
4050 continue;
4051
4052 case 'b':
4053 case 's':
4054 case 'r':
4055 case 'v':
bf12938e 4056 INSERT_OPERAND (RS, insn, va_arg (args, int));
252b5132
RH
4057 continue;
4058
4059 case 'i':
4060 case 'j':
6e1304d8 4061 macro_read_relocs (&args, r);
9c2799c2 4062 gas_assert (*r == BFD_RELOC_GPREL16
e391c024
RS
4063 || *r == BFD_RELOC_MIPS_HIGHER
4064 || *r == BFD_RELOC_HI16_S
4065 || *r == BFD_RELOC_LO16
4066 || *r == BFD_RELOC_MIPS_GOT_OFST);
4067 continue;
4068
4069 case 'o':
4070 macro_read_relocs (&args, r);
252b5132
RH
4071 continue;
4072
4073 case 'u':
6e1304d8 4074 macro_read_relocs (&args, r);
9c2799c2 4075 gas_assert (ep != NULL
90ecf173
MR
4076 && (ep->X_op == O_constant
4077 || (ep->X_op == O_symbol
4078 && (*r == BFD_RELOC_MIPS_HIGHEST
4079 || *r == BFD_RELOC_HI16_S
4080 || *r == BFD_RELOC_HI16
4081 || *r == BFD_RELOC_GPREL16
4082 || *r == BFD_RELOC_MIPS_GOT_HI16
4083 || *r == BFD_RELOC_MIPS_CALL_HI16))));
252b5132
RH
4084 continue;
4085
4086 case 'p':
9c2799c2 4087 gas_assert (ep != NULL);
bad36eac 4088
252b5132
RH
4089 /*
4090 * This allows macro() to pass an immediate expression for
4091 * creating short branches without creating a symbol.
bad36eac
DJ
4092 *
4093 * We don't allow branch relaxation for these branches, as
4094 * they should only appear in ".set nomacro" anyway.
252b5132
RH
4095 */
4096 if (ep->X_op == O_constant)
4097 {
bad36eac
DJ
4098 if ((ep->X_add_number & 3) != 0)
4099 as_bad (_("branch to misaligned address (0x%lx)"),
4100 (unsigned long) ep->X_add_number);
4101 if ((ep->X_add_number + 0x20000) & ~0x3ffff)
4102 as_bad (_("branch address range overflow (0x%lx)"),
4103 (unsigned long) ep->X_add_number);
252b5132
RH
4104 insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
4105 ep = NULL;
4106 }
4107 else
0b25d3e6 4108 *r = BFD_RELOC_16_PCREL_S2;
252b5132
RH
4109 continue;
4110
4111 case 'a':
9c2799c2 4112 gas_assert (ep != NULL);
f6688943 4113 *r = BFD_RELOC_MIPS_JMP;
252b5132
RH
4114 continue;
4115
4116 case 'C':
a9e24354 4117 INSERT_OPERAND (COPZ, insn, va_arg (args, unsigned long));
252b5132
RH
4118 continue;
4119
d43b4baf 4120 case 'k':
a9e24354 4121 INSERT_OPERAND (CACHE, insn, va_arg (args, unsigned long));
d43b4baf
TS
4122 continue;
4123
252b5132
RH
4124 default:
4125 internalError ();
4126 }
4127 break;
4128 }
4129 va_end (args);
9c2799c2 4130 gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
252b5132 4131
4d7206a2 4132 append_insn (&insn, ep, r);
252b5132
RH
4133}
4134
4135static void
67c0d1eb 4136mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
03ea81db 4137 va_list *args)
252b5132 4138{
1e915849 4139 struct mips_opcode *mo;
252b5132 4140 struct mips_cl_insn insn;
f6688943
TS
4141 bfd_reloc_code_real_type r[3]
4142 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
252b5132 4143
1e915849 4144 mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
9c2799c2
NC
4145 gas_assert (mo);
4146 gas_assert (strcmp (name, mo->name) == 0);
252b5132 4147
1e915849 4148 while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
252b5132 4149 {
1e915849 4150 ++mo;
9c2799c2
NC
4151 gas_assert (mo->name);
4152 gas_assert (strcmp (name, mo->name) == 0);
252b5132
RH
4153 }
4154
1e915849 4155 create_insn (&insn, mo);
252b5132
RH
4156 for (;;)
4157 {
4158 int c;
4159
4160 c = *fmt++;
4161 switch (c)
4162 {
4163 case '\0':
4164 break;
4165
4166 case ',':
4167 case '(':
4168 case ')':
4169 continue;
4170
4171 case 'y':
4172 case 'w':
03ea81db 4173 MIPS16_INSERT_OPERAND (RY, insn, va_arg (*args, int));
252b5132
RH
4174 continue;
4175
4176 case 'x':
4177 case 'v':
03ea81db 4178 MIPS16_INSERT_OPERAND (RX, insn, va_arg (*args, int));
252b5132
RH
4179 continue;
4180
4181 case 'z':
03ea81db 4182 MIPS16_INSERT_OPERAND (RZ, insn, va_arg (*args, int));
252b5132
RH
4183 continue;
4184
4185 case 'Z':
03ea81db 4186 MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (*args, int));
252b5132
RH
4187 continue;
4188
4189 case '0':
4190 case 'S':
4191 case 'P':
4192 case 'R':
4193 continue;
4194
4195 case 'X':
03ea81db 4196 MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (*args, int));
252b5132
RH
4197 continue;
4198
4199 case 'Y':
4200 {
4201 int regno;
4202
03ea81db 4203 regno = va_arg (*args, int);
252b5132 4204 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
a9e24354 4205 MIPS16_INSERT_OPERAND (REG32R, insn, regno);
252b5132
RH
4206 }
4207 continue;
4208
4209 case '<':
4210 case '>':
4211 case '4':
4212 case '5':
4213 case 'H':
4214 case 'W':
4215 case 'D':
4216 case 'j':
4217 case '8':
4218 case 'V':
4219 case 'C':
4220 case 'U':
4221 case 'k':
4222 case 'K':
4223 case 'p':
4224 case 'q':
4225 {
9c2799c2 4226 gas_assert (ep != NULL);
252b5132
RH
4227
4228 if (ep->X_op != O_constant)
874e8986 4229 *r = (int) BFD_RELOC_UNUSED + c;
252b5132
RH
4230 else
4231 {
b34976b6
AM
4232 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
4233 FALSE, &insn.insn_opcode, &insn.use_extend,
c4e7957c 4234 &insn.extend);
252b5132 4235 ep = NULL;
f6688943 4236 *r = BFD_RELOC_UNUSED;
252b5132
RH
4237 }
4238 }
4239 continue;
4240
4241 case '6':
03ea81db 4242 MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (*args, int));
252b5132
RH
4243 continue;
4244 }
4245
4246 break;
4247 }
4248
9c2799c2 4249 gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
252b5132 4250
4d7206a2 4251 append_insn (&insn, ep, r);
252b5132
RH
4252}
4253
2051e8c4
MR
4254/*
4255 * Sign-extend 32-bit mode constants that have bit 31 set and all
4256 * higher bits unset.
4257 */
9f872bbe 4258static void
2051e8c4
MR
4259normalize_constant_expr (expressionS *ex)
4260{
9ee2a2d4 4261 if (ex->X_op == O_constant
2051e8c4
MR
4262 && IS_ZEXT_32BIT_NUM (ex->X_add_number))
4263 ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
4264 - 0x80000000);
4265}
4266
4267/*
4268 * Sign-extend 32-bit mode address offsets that have bit 31 set and
4269 * all higher bits unset.
4270 */
4271static void
4272normalize_address_expr (expressionS *ex)
4273{
4274 if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
4275 || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
4276 && IS_ZEXT_32BIT_NUM (ex->X_add_number))
4277 ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
4278 - 0x80000000);
4279}
4280
438c16b8
TS
4281/*
4282 * Generate a "jalr" instruction with a relocation hint to the called
4283 * function. This occurs in NewABI PIC code.
4284 */
4285static void
67c0d1eb 4286macro_build_jalr (expressionS *ep)
438c16b8 4287{
685736be 4288 char *f = NULL;
b34976b6 4289
1180b5a4 4290 if (MIPS_JALR_HINT_P (ep))
f21f8242 4291 {
cc3d92a5 4292 frag_grow (8);
f21f8242
AO
4293 f = frag_more (0);
4294 }
67c0d1eb 4295 macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
1180b5a4 4296 if (MIPS_JALR_HINT_P (ep))
f21f8242 4297 fix_new_exp (frag_now, f - frag_now->fr_literal,
a105a300 4298 4, ep, FALSE, BFD_RELOC_MIPS_JALR);
438c16b8
TS
4299}
4300
252b5132
RH
4301/*
4302 * Generate a "lui" instruction.
4303 */
4304static void
67c0d1eb 4305macro_build_lui (expressionS *ep, int regnum)
252b5132
RH
4306{
4307 expressionS high_expr;
1e915849 4308 const struct mips_opcode *mo;
252b5132 4309 struct mips_cl_insn insn;
f6688943
TS
4310 bfd_reloc_code_real_type r[3]
4311 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
5a38dc70
AM
4312 const char *name = "lui";
4313 const char *fmt = "t,u";
252b5132 4314
9c2799c2 4315 gas_assert (! mips_opts.mips16);
252b5132 4316
4d7206a2 4317 high_expr = *ep;
252b5132
RH
4318
4319 if (high_expr.X_op == O_constant)
4320 {
54f4ddb3 4321 /* We can compute the instruction now without a relocation entry. */
e7d556df
TS
4322 high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
4323 >> 16) & 0xffff;
f6688943 4324 *r = BFD_RELOC_UNUSED;
252b5132 4325 }
78e1bb40 4326 else
252b5132 4327 {
9c2799c2 4328 gas_assert (ep->X_op == O_symbol);
bbe506e8
TS
4329 /* _gp_disp is a special case, used from s_cpload.
4330 __gnu_local_gp is used if mips_no_shared. */
9c2799c2 4331 gas_assert (mips_pic == NO_PIC
78e1bb40 4332 || (! HAVE_NEWABI
aa6975fb
ILT
4333 && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
4334 || (! mips_in_shared
bbe506e8
TS
4335 && strcmp (S_GET_NAME (ep->X_add_symbol),
4336 "__gnu_local_gp") == 0));
f6688943 4337 *r = BFD_RELOC_HI16_S;
252b5132
RH
4338 }
4339
1e915849 4340 mo = hash_find (op_hash, name);
9c2799c2
NC
4341 gas_assert (strcmp (name, mo->name) == 0);
4342 gas_assert (strcmp (fmt, mo->args) == 0);
1e915849 4343 create_insn (&insn, mo);
252b5132 4344
bf12938e
RS
4345 insn.insn_opcode = insn.insn_mo->match;
4346 INSERT_OPERAND (RT, insn, regnum);
f6688943 4347 if (*r == BFD_RELOC_UNUSED)
252b5132
RH
4348 {
4349 insn.insn_opcode |= high_expr.X_add_number;
4d7206a2 4350 append_insn (&insn, NULL, r);
252b5132
RH
4351 }
4352 else
4d7206a2 4353 append_insn (&insn, &high_expr, r);
252b5132
RH
4354}
4355
885add95
CD
4356/* Generate a sequence of instructions to do a load or store from a constant
4357 offset off of a base register (breg) into/from a target register (treg),
4358 using AT if necessary. */
4359static void
67c0d1eb
RS
4360macro_build_ldst_constoffset (expressionS *ep, const char *op,
4361 int treg, int breg, int dbl)
885add95 4362{
9c2799c2 4363 gas_assert (ep->X_op == O_constant);
885add95 4364
256ab948 4365 /* Sign-extending 32-bit constants makes their handling easier. */
2051e8c4
MR
4366 if (!dbl)
4367 normalize_constant_expr (ep);
256ab948 4368
67c1ffbe 4369 /* Right now, this routine can only handle signed 32-bit constants. */
ecd13cd3 4370 if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
885add95
CD
4371 as_warn (_("operand overflow"));
4372
4373 if (IS_SEXT_16BIT_NUM(ep->X_add_number))
4374 {
4375 /* Signed 16-bit offset will fit in the op. Easy! */
67c0d1eb 4376 macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
885add95
CD
4377 }
4378 else
4379 {
4380 /* 32-bit offset, need multiple instructions and AT, like:
4381 lui $tempreg,const_hi (BFD_RELOC_HI16_S)
4382 addu $tempreg,$tempreg,$breg
4383 <op> $treg,const_lo($tempreg) (BFD_RELOC_LO16)
4384 to handle the complete offset. */
67c0d1eb
RS
4385 macro_build_lui (ep, AT);
4386 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
4387 macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
885add95 4388
741fe287 4389 if (!mips_opts.at)
8fc2e39e 4390 as_bad (_("Macro used $at after \".set noat\""));
885add95
CD
4391 }
4392}
4393
252b5132
RH
4394/* set_at()
4395 * Generates code to set the $at register to true (one)
4396 * if reg is less than the immediate expression.
4397 */
4398static void
67c0d1eb 4399set_at (int reg, int unsignedp)
252b5132
RH
4400{
4401 if (imm_expr.X_op == O_constant
4402 && imm_expr.X_add_number >= -0x8000
4403 && imm_expr.X_add_number < 0x8000)
67c0d1eb
RS
4404 macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
4405 AT, reg, BFD_RELOC_LO16);
252b5132
RH
4406 else
4407 {
67c0d1eb
RS
4408 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4409 macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
252b5132
RH
4410 }
4411}
4412
4413/* Warn if an expression is not a constant. */
4414
4415static void
17a2f251 4416check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
252b5132
RH
4417{
4418 if (ex->X_op == O_big)
4419 as_bad (_("unsupported large constant"));
4420 else if (ex->X_op != O_constant)
9ee2a2d4
MR
4421 as_bad (_("Instruction %s requires absolute expression"),
4422 ip->insn_mo->name);
13757d0c 4423
9ee2a2d4
MR
4424 if (HAVE_32BIT_GPRS)
4425 normalize_constant_expr (ex);
252b5132
RH
4426}
4427
4428/* Count the leading zeroes by performing a binary chop. This is a
4429 bulky bit of source, but performance is a LOT better for the
4430 majority of values than a simple loop to count the bits:
4431 for (lcnt = 0; (lcnt < 32); lcnt++)
4432 if ((v) & (1 << (31 - lcnt)))
4433 break;
4434 However it is not code size friendly, and the gain will drop a bit
4435 on certain cached systems.
4436*/
4437#define COUNT_TOP_ZEROES(v) \
4438 (((v) & ~0xffff) == 0 \
4439 ? ((v) & ~0xff) == 0 \
4440 ? ((v) & ~0xf) == 0 \
4441 ? ((v) & ~0x3) == 0 \
4442 ? ((v) & ~0x1) == 0 \
4443 ? !(v) \
4444 ? 32 \
4445 : 31 \
4446 : 30 \
4447 : ((v) & ~0x7) == 0 \
4448 ? 29 \
4449 : 28 \
4450 : ((v) & ~0x3f) == 0 \
4451 ? ((v) & ~0x1f) == 0 \
4452 ? 27 \
4453 : 26 \
4454 : ((v) & ~0x7f) == 0 \
4455 ? 25 \
4456 : 24 \
4457 : ((v) & ~0xfff) == 0 \
4458 ? ((v) & ~0x3ff) == 0 \
4459 ? ((v) & ~0x1ff) == 0 \
4460 ? 23 \
4461 : 22 \
4462 : ((v) & ~0x7ff) == 0 \
4463 ? 21 \
4464 : 20 \
4465 : ((v) & ~0x3fff) == 0 \
4466 ? ((v) & ~0x1fff) == 0 \
4467 ? 19 \
4468 : 18 \
4469 : ((v) & ~0x7fff) == 0 \
4470 ? 17 \
4471 : 16 \
4472 : ((v) & ~0xffffff) == 0 \
4473 ? ((v) & ~0xfffff) == 0 \
4474 ? ((v) & ~0x3ffff) == 0 \
4475 ? ((v) & ~0x1ffff) == 0 \
4476 ? 15 \
4477 : 14 \
4478 : ((v) & ~0x7ffff) == 0 \
4479 ? 13 \
4480 : 12 \
4481 : ((v) & ~0x3fffff) == 0 \
4482 ? ((v) & ~0x1fffff) == 0 \
4483 ? 11 \
4484 : 10 \
4485 : ((v) & ~0x7fffff) == 0 \
4486 ? 9 \
4487 : 8 \
4488 : ((v) & ~0xfffffff) == 0 \
4489 ? ((v) & ~0x3ffffff) == 0 \
4490 ? ((v) & ~0x1ffffff) == 0 \
4491 ? 7 \
4492 : 6 \
4493 : ((v) & ~0x7ffffff) == 0 \
4494 ? 5 \
4495 : 4 \
4496 : ((v) & ~0x3fffffff) == 0 \
4497 ? ((v) & ~0x1fffffff) == 0 \
4498 ? 3 \
4499 : 2 \
4500 : ((v) & ~0x7fffffff) == 0 \
4501 ? 1 \
4502 : 0)
4503
4504/* load_register()
67c1ffbe 4505 * This routine generates the least number of instructions necessary to load
252b5132
RH
4506 * an absolute expression value into a register.
4507 */
4508static void
67c0d1eb 4509load_register (int reg, expressionS *ep, int dbl)
252b5132
RH
4510{
4511 int freg;
4512 expressionS hi32, lo32;
4513
4514 if (ep->X_op != O_big)
4515 {
9c2799c2 4516 gas_assert (ep->X_op == O_constant);
256ab948
TS
4517
4518 /* Sign-extending 32-bit constants makes their handling easier. */
2051e8c4
MR
4519 if (!dbl)
4520 normalize_constant_expr (ep);
256ab948
TS
4521
4522 if (IS_SEXT_16BIT_NUM (ep->X_add_number))
252b5132
RH
4523 {
4524 /* We can handle 16 bit signed values with an addiu to
4525 $zero. No need to ever use daddiu here, since $zero and
4526 the result are always correct in 32 bit mode. */
67c0d1eb 4527 macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
252b5132
RH
4528 return;
4529 }
4530 else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
4531 {
4532 /* We can handle 16 bit unsigned values with an ori to
4533 $zero. */
67c0d1eb 4534 macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
252b5132
RH
4535 return;
4536 }
256ab948 4537 else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
252b5132
RH
4538 {
4539 /* 32 bit values require an lui. */
67c0d1eb 4540 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
252b5132 4541 if ((ep->X_add_number & 0xffff) != 0)
67c0d1eb 4542 macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
252b5132
RH
4543 return;
4544 }
4545 }
4546
4547 /* The value is larger than 32 bits. */
4548
2051e8c4 4549 if (!dbl || HAVE_32BIT_GPRS)
252b5132 4550 {
55e08f71
NC
4551 char value[32];
4552
4553 sprintf_vma (value, ep->X_add_number);
20e1fcfd 4554 as_bad (_("Number (0x%s) larger than 32 bits"), value);
67c0d1eb 4555 macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
252b5132
RH
4556 return;
4557 }
4558
4559 if (ep->X_op != O_big)
4560 {
4561 hi32 = *ep;
4562 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4563 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4564 hi32.X_add_number &= 0xffffffff;
4565 lo32 = *ep;
4566 lo32.X_add_number &= 0xffffffff;
4567 }
4568 else
4569 {
9c2799c2 4570 gas_assert (ep->X_add_number > 2);
252b5132
RH
4571 if (ep->X_add_number == 3)
4572 generic_bignum[3] = 0;
4573 else if (ep->X_add_number > 4)
4574 as_bad (_("Number larger than 64 bits"));
4575 lo32.X_op = O_constant;
4576 lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
4577 hi32.X_op = O_constant;
4578 hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
4579 }
4580
4581 if (hi32.X_add_number == 0)
4582 freg = 0;
4583 else
4584 {
4585 int shift, bit;
4586 unsigned long hi, lo;
4587
956cd1d6 4588 if (hi32.X_add_number == (offsetT) 0xffffffff)
beae10d5
KH
4589 {
4590 if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
4591 {
67c0d1eb 4592 macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
beae10d5
KH
4593 return;
4594 }
4595 if (lo32.X_add_number & 0x80000000)
4596 {
67c0d1eb 4597 macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
252b5132 4598 if (lo32.X_add_number & 0xffff)
67c0d1eb 4599 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
beae10d5
KH
4600 return;
4601 }
4602 }
252b5132
RH
4603
4604 /* Check for 16bit shifted constant. We know that hi32 is
4605 non-zero, so start the mask on the first bit of the hi32
4606 value. */
4607 shift = 17;
4608 do
beae10d5
KH
4609 {
4610 unsigned long himask, lomask;
4611
4612 if (shift < 32)
4613 {
4614 himask = 0xffff >> (32 - shift);
4615 lomask = (0xffff << shift) & 0xffffffff;
4616 }
4617 else
4618 {
4619 himask = 0xffff << (shift - 32);
4620 lomask = 0;
4621 }
4622 if ((hi32.X_add_number & ~(offsetT) himask) == 0
4623 && (lo32.X_add_number & ~(offsetT) lomask) == 0)
4624 {
4625 expressionS tmp;
4626
4627 tmp.X_op = O_constant;
4628 if (shift < 32)
4629 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
4630 | (lo32.X_add_number >> shift));
4631 else
4632 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
67c0d1eb
RS
4633 macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4634 macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
4635 reg, reg, (shift >= 32) ? shift - 32 : shift);
beae10d5
KH
4636 return;
4637 }
f9419b05 4638 ++shift;
beae10d5
KH
4639 }
4640 while (shift <= (64 - 16));
252b5132
RH
4641
4642 /* Find the bit number of the lowest one bit, and store the
4643 shifted value in hi/lo. */
4644 hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
4645 lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
4646 if (lo != 0)
4647 {
4648 bit = 0;
4649 while ((lo & 1) == 0)
4650 {
4651 lo >>= 1;
4652 ++bit;
4653 }
4654 lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
4655 hi >>= bit;
4656 }
4657 else
4658 {
4659 bit = 32;
4660 while ((hi & 1) == 0)
4661 {
4662 hi >>= 1;
4663 ++bit;
4664 }
4665 lo = hi;
4666 hi = 0;
4667 }
4668
4669 /* Optimize if the shifted value is a (power of 2) - 1. */
4670 if ((hi == 0 && ((lo + 1) & lo) == 0)
4671 || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
beae10d5
KH
4672 {
4673 shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
252b5132 4674 if (shift != 0)
beae10d5 4675 {
252b5132
RH
4676 expressionS tmp;
4677
4678 /* This instruction will set the register to be all
4679 ones. */
beae10d5
KH
4680 tmp.X_op = O_constant;
4681 tmp.X_add_number = (offsetT) -1;
67c0d1eb 4682 macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
beae10d5
KH
4683 if (bit != 0)
4684 {
4685 bit += shift;
67c0d1eb
RS
4686 macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
4687 reg, reg, (bit >= 32) ? bit - 32 : bit);
beae10d5 4688 }
67c0d1eb
RS
4689 macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
4690 reg, reg, (shift >= 32) ? shift - 32 : shift);
beae10d5
KH
4691 return;
4692 }
4693 }
252b5132
RH
4694
4695 /* Sign extend hi32 before calling load_register, because we can
4696 generally get better code when we load a sign extended value. */
4697 if ((hi32.X_add_number & 0x80000000) != 0)
beae10d5 4698 hi32.X_add_number |= ~(offsetT) 0xffffffff;
67c0d1eb 4699 load_register (reg, &hi32, 0);
252b5132
RH
4700 freg = reg;
4701 }
4702 if ((lo32.X_add_number & 0xffff0000) == 0)
4703 {
4704 if (freg != 0)
4705 {
67c0d1eb 4706 macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
252b5132
RH
4707 freg = reg;
4708 }
4709 }
4710 else
4711 {
4712 expressionS mid16;
4713
956cd1d6 4714 if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
beae10d5 4715 {
67c0d1eb
RS
4716 macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4717 macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
beae10d5
KH
4718 return;
4719 }
252b5132
RH
4720
4721 if (freg != 0)
4722 {
67c0d1eb 4723 macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
252b5132
RH
4724 freg = reg;
4725 }
4726 mid16 = lo32;
4727 mid16.X_add_number >>= 16;
67c0d1eb
RS
4728 macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4729 macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
252b5132
RH
4730 freg = reg;
4731 }
4732 if ((lo32.X_add_number & 0xffff) != 0)
67c0d1eb 4733 macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
252b5132
RH
4734}
4735
269137b2
TS
4736static inline void
4737load_delay_nop (void)
4738{
4739 if (!gpr_interlocks)
4740 macro_build (NULL, "nop", "");
4741}
4742
252b5132
RH
4743/* Load an address into a register. */
4744
4745static void
67c0d1eb 4746load_address (int reg, expressionS *ep, int *used_at)
252b5132 4747{
252b5132
RH
4748 if (ep->X_op != O_constant
4749 && ep->X_op != O_symbol)
4750 {
4751 as_bad (_("expression too complex"));
4752 ep->X_op = O_constant;
4753 }
4754
4755 if (ep->X_op == O_constant)
4756 {
67c0d1eb 4757 load_register (reg, ep, HAVE_64BIT_ADDRESSES);
252b5132
RH
4758 return;
4759 }
4760
4761 if (mips_pic == NO_PIC)
4762 {
4763 /* If this is a reference to a GP relative symbol, we want
cdf6fd85 4764 addiu $reg,$gp,<sym> (BFD_RELOC_GPREL16)
252b5132
RH
4765 Otherwise we want
4766 lui $reg,<sym> (BFD_RELOC_HI16_S)
4767 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
d6bc6245 4768 If we have an addend, we always use the latter form.
76b3015f 4769
d6bc6245
TS
4770 With 64bit address space and a usable $at we want
4771 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
4772 lui $at,<sym> (BFD_RELOC_HI16_S)
4773 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
4774 daddiu $at,<sym> (BFD_RELOC_LO16)
4775 dsll32 $reg,0
3a482fd5 4776 daddu $reg,$reg,$at
76b3015f 4777
c03099e6 4778 If $at is already in use, we use a path which is suboptimal
d6bc6245
TS
4779 on superscalar processors.
4780 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
4781 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
4782 dsll $reg,16
4783 daddiu $reg,<sym> (BFD_RELOC_HI16_S)
4784 dsll $reg,16
4785 daddiu $reg,<sym> (BFD_RELOC_LO16)
6caf9ef4
TS
4786
4787 For GP relative symbols in 64bit address space we can use
4788 the same sequence as in 32bit address space. */
aed1a261 4789 if (HAVE_64BIT_SYMBOLS)
d6bc6245 4790 {
6caf9ef4
TS
4791 if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4792 && !nopic_need_relax (ep->X_add_symbol, 1))
4793 {
4794 relax_start (ep->X_add_symbol);
4795 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4796 mips_gp_register, BFD_RELOC_GPREL16);
4797 relax_switch ();
4798 }
d6bc6245 4799
741fe287 4800 if (*used_at == 0 && mips_opts.at)
d6bc6245 4801 {
67c0d1eb
RS
4802 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4803 macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
4804 macro_build (ep, "daddiu", "t,r,j", reg, reg,
4805 BFD_RELOC_MIPS_HIGHER);
4806 macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
4807 macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
4808 macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
d6bc6245
TS
4809 *used_at = 1;
4810 }
4811 else
4812 {
67c0d1eb
RS
4813 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4814 macro_build (ep, "daddiu", "t,r,j", reg, reg,
4815 BFD_RELOC_MIPS_HIGHER);
4816 macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4817 macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
4818 macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4819 macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
d6bc6245 4820 }
6caf9ef4
TS
4821
4822 if (mips_relax.sequence)
4823 relax_end ();
d6bc6245 4824 }
252b5132
RH
4825 else
4826 {
d6bc6245 4827 if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
6caf9ef4 4828 && !nopic_need_relax (ep->X_add_symbol, 1))
d6bc6245 4829 {
4d7206a2 4830 relax_start (ep->X_add_symbol);
67c0d1eb 4831 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
17a2f251 4832 mips_gp_register, BFD_RELOC_GPREL16);
4d7206a2 4833 relax_switch ();
d6bc6245 4834 }
67c0d1eb
RS
4835 macro_build_lui (ep, reg);
4836 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
4837 reg, reg, BFD_RELOC_LO16);
4d7206a2
RS
4838 if (mips_relax.sequence)
4839 relax_end ();
d6bc6245 4840 }
252b5132 4841 }
0a44bf69 4842 else if (!mips_big_got)
252b5132
RH
4843 {
4844 expressionS ex;
4845
4846 /* If this is a reference to an external symbol, we want
4847 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4848 Otherwise we want
4849 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4850 nop
4851 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
f5040a92
AO
4852 If there is a constant, it must be added in after.
4853
ed6fb7bd 4854 If we have NewABI, we want
f5040a92
AO
4855 lw $reg,<sym+cst>($gp) (BFD_RELOC_MIPS_GOT_DISP)
4856 unless we're referencing a global symbol with a non-zero
4857 offset, in which case cst must be added separately. */
ed6fb7bd
SC
4858 if (HAVE_NEWABI)
4859 {
f5040a92
AO
4860 if (ep->X_add_number)
4861 {
4d7206a2 4862 ex.X_add_number = ep->X_add_number;
f5040a92 4863 ep->X_add_number = 0;
4d7206a2 4864 relax_start (ep->X_add_symbol);
67c0d1eb
RS
4865 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4866 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
f5040a92
AO
4867 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4868 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4869 ex.X_op = O_constant;
67c0d1eb 4870 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
17a2f251 4871 reg, reg, BFD_RELOC_LO16);
f5040a92 4872 ep->X_add_number = ex.X_add_number;
4d7206a2 4873 relax_switch ();
f5040a92 4874 }
67c0d1eb 4875 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
17a2f251 4876 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4d7206a2
RS
4877 if (mips_relax.sequence)
4878 relax_end ();
ed6fb7bd
SC
4879 }
4880 else
4881 {
f5040a92
AO
4882 ex.X_add_number = ep->X_add_number;
4883 ep->X_add_number = 0;
67c0d1eb
RS
4884 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4885 BFD_RELOC_MIPS_GOT16, mips_gp_register);
269137b2 4886 load_delay_nop ();
4d7206a2
RS
4887 relax_start (ep->X_add_symbol);
4888 relax_switch ();
67c0d1eb 4889 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
17a2f251 4890 BFD_RELOC_LO16);
4d7206a2 4891 relax_end ();
ed6fb7bd 4892
f5040a92
AO
4893 if (ex.X_add_number != 0)
4894 {
4895 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4896 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4897 ex.X_op = O_constant;
67c0d1eb 4898 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
17a2f251 4899 reg, reg, BFD_RELOC_LO16);
f5040a92 4900 }
252b5132
RH
4901 }
4902 }
0a44bf69 4903 else if (mips_big_got)
252b5132
RH
4904 {
4905 expressionS ex;
252b5132
RH
4906
4907 /* This is the large GOT case. If this is a reference to an
4908 external symbol, we want
4909 lui $reg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
4910 addu $reg,$reg,$gp
4911 lw $reg,<sym>($reg) (BFD_RELOC_MIPS_GOT_LO16)
f5040a92
AO
4912
4913 Otherwise, for a reference to a local symbol in old ABI, we want
252b5132
RH
4914 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4915 nop
4916 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
684022ea 4917 If there is a constant, it must be added in after.
f5040a92
AO
4918
4919 In the NewABI, for local symbols, with or without offsets, we want:
438c16b8
TS
4920 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
4921 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
f5040a92 4922 */
438c16b8
TS
4923 if (HAVE_NEWABI)
4924 {
4d7206a2 4925 ex.X_add_number = ep->X_add_number;
f5040a92 4926 ep->X_add_number = 0;
4d7206a2 4927 relax_start (ep->X_add_symbol);
67c0d1eb
RS
4928 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4929 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4930 reg, reg, mips_gp_register);
4931 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4932 reg, BFD_RELOC_MIPS_GOT_LO16, reg);
f5040a92
AO
4933 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4934 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4935 else if (ex.X_add_number)
4936 {
4937 ex.X_op = O_constant;
67c0d1eb
RS
4938 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4939 BFD_RELOC_LO16);
f5040a92
AO
4940 }
4941
4942 ep->X_add_number = ex.X_add_number;
4d7206a2 4943 relax_switch ();
67c0d1eb 4944 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
17a2f251 4945 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
67c0d1eb
RS
4946 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4947 BFD_RELOC_MIPS_GOT_OFST);
4d7206a2 4948 relax_end ();
438c16b8 4949 }
252b5132 4950 else
438c16b8 4951 {
f5040a92
AO
4952 ex.X_add_number = ep->X_add_number;
4953 ep->X_add_number = 0;
4d7206a2 4954 relax_start (ep->X_add_symbol);
67c0d1eb
RS
4955 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4956 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4957 reg, reg, mips_gp_register);
4958 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4959 reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4d7206a2
RS
4960 relax_switch ();
4961 if (reg_needs_delay (mips_gp_register))
438c16b8
TS
4962 {
4963 /* We need a nop before loading from $gp. This special
4964 check is required because the lui which starts the main
4965 instruction stream does not refer to $gp, and so will not
4966 insert the nop which may be required. */
67c0d1eb 4967 macro_build (NULL, "nop", "");
438c16b8 4968 }
67c0d1eb 4969 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
17a2f251 4970 BFD_RELOC_MIPS_GOT16, mips_gp_register);
269137b2 4971 load_delay_nop ();
67c0d1eb 4972 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
17a2f251 4973 BFD_RELOC_LO16);
4d7206a2 4974 relax_end ();
438c16b8 4975
f5040a92
AO
4976 if (ex.X_add_number != 0)
4977 {
4978 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4979 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4980 ex.X_op = O_constant;
67c0d1eb
RS
4981 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4982 BFD_RELOC_LO16);
f5040a92 4983 }
252b5132
RH
4984 }
4985 }
252b5132
RH
4986 else
4987 abort ();
8fc2e39e 4988
741fe287 4989 if (!mips_opts.at && *used_at == 1)
8fc2e39e 4990 as_bad (_("Macro used $at after \".set noat\""));
252b5132
RH
4991}
4992
ea1fb5dc
RS
4993/* Move the contents of register SOURCE into register DEST. */
4994
4995static void
67c0d1eb 4996move_register (int dest, int source)
ea1fb5dc 4997{
67c0d1eb
RS
4998 macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4999 dest, source, 0);
ea1fb5dc
RS
5000}
5001
4d7206a2 5002/* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
f6a22291
MR
5003 LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
5004 The two alternatives are:
4d7206a2
RS
5005
5006 Global symbol Local sybmol
5007 ------------- ------------
5008 lw DEST,%got(SYMBOL) lw DEST,%got(SYMBOL + OFFSET)
5009 ... ...
5010 addiu DEST,DEST,OFFSET addiu DEST,DEST,%lo(SYMBOL + OFFSET)
5011
5012 load_got_offset emits the first instruction and add_got_offset
f6a22291
MR
5013 emits the second for a 16-bit offset or add_got_offset_hilo emits
5014 a sequence to add a 32-bit offset using a scratch register. */
4d7206a2
RS
5015
5016static void
67c0d1eb 5017load_got_offset (int dest, expressionS *local)
4d7206a2
RS
5018{
5019 expressionS global;
5020
5021 global = *local;
5022 global.X_add_number = 0;
5023
5024 relax_start (local->X_add_symbol);
67c0d1eb
RS
5025 macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
5026 BFD_RELOC_MIPS_GOT16, mips_gp_register);
4d7206a2 5027 relax_switch ();
67c0d1eb
RS
5028 macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
5029 BFD_RELOC_MIPS_GOT16, mips_gp_register);
4d7206a2
RS
5030 relax_end ();
5031}
5032
5033static void
67c0d1eb 5034add_got_offset (int dest, expressionS *local)
4d7206a2
RS
5035{
5036 expressionS global;
5037
5038 global.X_op = O_constant;
5039 global.X_op_symbol = NULL;
5040 global.X_add_symbol = NULL;
5041 global.X_add_number = local->X_add_number;
5042
5043 relax_start (local->X_add_symbol);
67c0d1eb 5044 macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
4d7206a2
RS
5045 dest, dest, BFD_RELOC_LO16);
5046 relax_switch ();
67c0d1eb 5047 macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
4d7206a2
RS
5048 relax_end ();
5049}
5050
f6a22291
MR
5051static void
5052add_got_offset_hilo (int dest, expressionS *local, int tmp)
5053{
5054 expressionS global;
5055 int hold_mips_optimize;
5056
5057 global.X_op = O_constant;
5058 global.X_op_symbol = NULL;
5059 global.X_add_symbol = NULL;
5060 global.X_add_number = local->X_add_number;
5061
5062 relax_start (local->X_add_symbol);
5063 load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
5064 relax_switch ();
5065 /* Set mips_optimize around the lui instruction to avoid
5066 inserting an unnecessary nop after the lw. */
5067 hold_mips_optimize = mips_optimize;
5068 mips_optimize = 2;
5069 macro_build_lui (&global, tmp);
5070 mips_optimize = hold_mips_optimize;
5071 macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
5072 relax_end ();
5073
5074 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
5075}
5076
252b5132
RH
5077/*
5078 * Build macros
5079 * This routine implements the seemingly endless macro or synthesized
5080 * instructions and addressing modes in the mips assembly language. Many
5081 * of these macros are simple and are similar to each other. These could
67c1ffbe 5082 * probably be handled by some kind of table or grammar approach instead of
252b5132
RH
5083 * this verbose method. Others are not simple macros but are more like
5084 * optimizing code generation.
5085 * One interesting optimization is when several store macros appear
67c1ffbe 5086 * consecutively that would load AT with the upper half of the same address.
252b5132
RH
5087 * The ensuing load upper instructions are ommited. This implies some kind
5088 * of global optimization. We currently only optimize within a single macro.
5089 * For many of the load and store macros if the address is specified as a
5090 * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
5091 * first load register 'at' with zero and use it as the base register. The
5092 * mips assembler simply uses register $zero. Just one tiny optimization
5093 * we're missing.
5094 */
5095static void
17a2f251 5096macro (struct mips_cl_insn *ip)
252b5132 5097{
741fe287
MR
5098 unsigned int treg, sreg, dreg, breg;
5099 unsigned int tempreg;
252b5132 5100 int mask;
43841e91 5101 int used_at = 0;
252b5132
RH
5102 expressionS expr1;
5103 const char *s;
5104 const char *s2;
5105 const char *fmt;
5106 int likely = 0;
5107 int dbl = 0;
5108 int coproc = 0;
5109 int lr = 0;
5110 int imm = 0;
1abe91b1 5111 int call = 0;
252b5132 5112 int off;
67c0d1eb 5113 offsetT maxnum;
252b5132 5114 bfd_reloc_code_real_type r;
252b5132
RH
5115 int hold_mips_optimize;
5116
9c2799c2 5117 gas_assert (! mips_opts.mips16);
252b5132 5118
bbea7ebc
MR
5119 treg = EXTRACT_OPERAND (RT, *ip);
5120 dreg = EXTRACT_OPERAND (RD, *ip);
5121 sreg = breg = EXTRACT_OPERAND (RS, *ip);
252b5132
RH
5122 mask = ip->insn_mo->mask;
5123
5124 expr1.X_op = O_constant;
5125 expr1.X_op_symbol = NULL;
5126 expr1.X_add_symbol = NULL;
5127 expr1.X_add_number = 1;
5128
5129 switch (mask)
5130 {
5131 case M_DABS:
5132 dbl = 1;
5133 case M_ABS:
5134 /* bgez $a0,.+12
5135 move v0,$a0
5136 sub v0,$zero,$a0
5137 */
5138
7d10b47d 5139 start_noreorder ();
252b5132
RH
5140
5141 expr1.X_add_number = 8;
67c0d1eb 5142 macro_build (&expr1, "bgez", "s,p", sreg);
252b5132 5143 if (dreg == sreg)
a605d2b3 5144 macro_build (NULL, "nop", "");
252b5132 5145 else
67c0d1eb
RS
5146 move_register (dreg, sreg);
5147 macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
252b5132 5148
7d10b47d 5149 end_noreorder ();
8fc2e39e 5150 break;
252b5132
RH
5151
5152 case M_ADD_I:
5153 s = "addi";
5154 s2 = "add";
5155 goto do_addi;
5156 case M_ADDU_I:
5157 s = "addiu";
5158 s2 = "addu";
5159 goto do_addi;
5160 case M_DADD_I:
5161 dbl = 1;
5162 s = "daddi";
5163 s2 = "dadd";
5164 goto do_addi;
5165 case M_DADDU_I:
5166 dbl = 1;
5167 s = "daddiu";
5168 s2 = "daddu";
5169 do_addi:
5170 if (imm_expr.X_op == O_constant
5171 && imm_expr.X_add_number >= -0x8000
5172 && imm_expr.X_add_number < 0x8000)
5173 {
67c0d1eb 5174 macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
8fc2e39e 5175 break;
252b5132 5176 }
8fc2e39e 5177 used_at = 1;
67c0d1eb
RS
5178 load_register (AT, &imm_expr, dbl);
5179 macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
252b5132
RH
5180 break;
5181
5182 case M_AND_I:
5183 s = "andi";
5184 s2 = "and";
5185 goto do_bit;
5186 case M_OR_I:
5187 s = "ori";
5188 s2 = "or";
5189 goto do_bit;
5190 case M_NOR_I:
5191 s = "";
5192 s2 = "nor";
5193 goto do_bit;
5194 case M_XOR_I:
5195 s = "xori";
5196 s2 = "xor";
5197 do_bit:
5198 if (imm_expr.X_op == O_constant
5199 && imm_expr.X_add_number >= 0
5200 && imm_expr.X_add_number < 0x10000)
5201 {
5202 if (mask != M_NOR_I)
67c0d1eb 5203 macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
252b5132
RH
5204 else
5205 {
67c0d1eb
RS
5206 macro_build (&imm_expr, "ori", "t,r,i",
5207 treg, sreg, BFD_RELOC_LO16);
5208 macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
252b5132 5209 }
8fc2e39e 5210 break;
252b5132
RH
5211 }
5212
8fc2e39e 5213 used_at = 1;
67c0d1eb
RS
5214 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
5215 macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
252b5132
RH
5216 break;
5217
8b082fb1
TS
5218 case M_BALIGN:
5219 switch (imm_expr.X_add_number)
5220 {
5221 case 0:
5222 macro_build (NULL, "nop", "");
5223 break;
5224 case 2:
5225 macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
5226 break;
5227 default:
5228 macro_build (NULL, "balign", "t,s,2", treg, sreg,
90ecf173 5229 (int) imm_expr.X_add_number);
8b082fb1
TS
5230 break;
5231 }
5232 break;
5233
252b5132
RH
5234 case M_BEQ_I:
5235 s = "beq";
5236 goto beq_i;
5237 case M_BEQL_I:
5238 s = "beql";
5239 likely = 1;
5240 goto beq_i;
5241 case M_BNE_I:
5242 s = "bne";
5243 goto beq_i;
5244 case M_BNEL_I:
5245 s = "bnel";
5246 likely = 1;
5247 beq_i:
5248 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5249 {
c80c840e 5250 macro_build (&offset_expr, s, "s,t,p", sreg, ZERO);
8fc2e39e 5251 break;
252b5132 5252 }
8fc2e39e 5253 used_at = 1;
67c0d1eb
RS
5254 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
5255 macro_build (&offset_expr, s, "s,t,p", sreg, AT);
252b5132
RH
5256 break;
5257
5258 case M_BGEL:
5259 likely = 1;
5260 case M_BGE:
5261 if (treg == 0)
5262 {
67c0d1eb 5263 macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
8fc2e39e 5264 break;
252b5132
RH
5265 }
5266 if (sreg == 0)
5267 {
67c0d1eb 5268 macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
8fc2e39e 5269 break;
252b5132 5270 }
8fc2e39e 5271 used_at = 1;
67c0d1eb 5272 macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
c80c840e 5273 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
252b5132
RH
5274 break;
5275
5276 case M_BGTL_I:
5277 likely = 1;
5278 case M_BGT_I:
90ecf173 5279 /* Check for > max integer. */
252b5132 5280 maxnum = 0x7fffffff;
ca4e0257 5281 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
252b5132
RH
5282 {
5283 maxnum <<= 16;
5284 maxnum |= 0xffff;
5285 maxnum <<= 16;
5286 maxnum |= 0xffff;
5287 }
5288 if (imm_expr.X_op == O_constant
5289 && imm_expr.X_add_number >= maxnum
ca4e0257 5290 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
252b5132
RH
5291 {
5292 do_false:
90ecf173 5293 /* Result is always false. */
252b5132 5294 if (! likely)
a605d2b3 5295 macro_build (NULL, "nop", "");
252b5132 5296 else
c80c840e 5297 macro_build (&offset_expr, "bnel", "s,t,p", ZERO, ZERO);
8fc2e39e 5298 break;
252b5132
RH
5299 }
5300 if (imm_expr.X_op != O_constant)
5301 as_bad (_("Unsupported large constant"));
f9419b05 5302 ++imm_expr.X_add_number;
252b5132
RH
5303 /* FALLTHROUGH */
5304 case M_BGE_I:
5305 case M_BGEL_I:
5306 if (mask == M_BGEL_I)
5307 likely = 1;
5308 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5309 {
67c0d1eb 5310 macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
8fc2e39e 5311 break;
252b5132
RH
5312 }
5313 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5314 {
67c0d1eb 5315 macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
8fc2e39e 5316 break;
252b5132
RH
5317 }
5318 maxnum = 0x7fffffff;
ca4e0257 5319 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
252b5132
RH
5320 {
5321 maxnum <<= 16;
5322 maxnum |= 0xffff;
5323 maxnum <<= 16;
5324 maxnum |= 0xffff;
5325 }
5326 maxnum = - maxnum - 1;
5327 if (imm_expr.X_op == O_constant
5328 && imm_expr.X_add_number <= maxnum
ca4e0257 5329 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
252b5132
RH
5330 {
5331 do_true:
5332 /* result is always true */
5333 as_warn (_("Branch %s is always true"), ip->insn_mo->name);
67c0d1eb 5334 macro_build (&offset_expr, "b", "p");
8fc2e39e 5335 break;
252b5132 5336 }
8fc2e39e 5337 used_at = 1;
67c0d1eb 5338 set_at (sreg, 0);
c80c840e 5339 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
252b5132
RH
5340 break;
5341
5342 case M_BGEUL:
5343 likely = 1;
5344 case M_BGEU:
5345 if (treg == 0)
5346 goto do_true;
5347 if (sreg == 0)
5348 {
67c0d1eb 5349 macro_build (&offset_expr, likely ? "beql" : "beq",
c80c840e 5350 "s,t,p", ZERO, treg);
8fc2e39e 5351 break;
252b5132 5352 }
8fc2e39e 5353 used_at = 1;
67c0d1eb 5354 macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
c80c840e 5355 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
252b5132
RH
5356 break;
5357
5358 case M_BGTUL_I:
5359 likely = 1;
5360 case M_BGTU_I:
5361 if (sreg == 0
ca4e0257 5362 || (HAVE_32BIT_GPRS
252b5132 5363 && imm_expr.X_op == O_constant
f01dc953 5364 && imm_expr.X_add_number == -1))
252b5132
RH
5365 goto do_false;
5366 if (imm_expr.X_op != O_constant)
5367 as_bad (_("Unsupported large constant"));
f9419b05 5368 ++imm_expr.X_add_number;
252b5132
RH
5369 /* FALLTHROUGH */
5370 case M_BGEU_I:
5371 case M_BGEUL_I:
5372 if (mask == M_BGEUL_I)
5373 likely = 1;
5374 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5375 goto do_true;
5376 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5377 {
67c0d1eb 5378 macro_build (&offset_expr, likely ? "bnel" : "bne",
c80c840e 5379 "s,t,p", sreg, ZERO);
8fc2e39e 5380 break;
252b5132 5381 }
8fc2e39e 5382 used_at = 1;
67c0d1eb 5383 set_at (sreg, 1);
c80c840e 5384 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
252b5132
RH
5385 break;
5386
5387 case M_BGTL:
5388 likely = 1;
5389 case M_BGT:
5390 if (treg == 0)
5391 {
67c0d1eb 5392 macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
8fc2e39e 5393 break;
252b5132
RH
5394 }
5395 if (sreg == 0)
5396 {
67c0d1eb 5397 macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
8fc2e39e 5398 break;
252b5132 5399 }
8fc2e39e 5400 used_at = 1;
67c0d1eb 5401 macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
c80c840e 5402 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
252b5132
RH
5403 break;
5404
5405 case M_BGTUL:
5406 likely = 1;
5407 case M_BGTU:
5408 if (treg == 0)
5409 {
67c0d1eb 5410 macro_build (&offset_expr, likely ? "bnel" : "bne",
c80c840e 5411 "s,t,p", sreg, ZERO);
8fc2e39e 5412 break;
252b5132
RH
5413 }
5414 if (sreg == 0)
5415 goto do_false;
8fc2e39e 5416 used_at = 1;
67c0d1eb 5417 macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
c80c840e 5418 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
252b5132
RH
5419 break;
5420
5421 case M_BLEL:
5422 likely = 1;
5423 case M_BLE:
5424 if (treg == 0)
5425 {
67c0d1eb 5426 macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
8fc2e39e 5427 break;
252b5132
RH
5428 }
5429 if (sreg == 0)
5430 {
67c0d1eb 5431 macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
8fc2e39e 5432 break;
252b5132 5433 }
8fc2e39e 5434 used_at = 1;
67c0d1eb 5435 macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
c80c840e 5436 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
252b5132
RH
5437 break;
5438
5439 case M_BLEL_I:
5440 likely = 1;
5441 case M_BLE_I:
5442 maxnum = 0x7fffffff;
ca4e0257 5443 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
252b5132
RH
5444 {
5445 maxnum <<= 16;
5446 maxnum |= 0xffff;
5447 maxnum <<= 16;
5448 maxnum |= 0xffff;
5449 }
5450 if (imm_expr.X_op == O_constant
5451 && imm_expr.X_add_number >= maxnum
ca4e0257 5452 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
252b5132
RH
5453 goto do_true;
5454 if (imm_expr.X_op != O_constant)
5455 as_bad (_("Unsupported large constant"));
f9419b05 5456 ++imm_expr.X_add_number;
252b5132
RH
5457 /* FALLTHROUGH */
5458 case M_BLT_I:
5459 case M_BLTL_I:
5460 if (mask == M_BLTL_I)
5461 likely = 1;
5462 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5463 {
67c0d1eb 5464 macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
8fc2e39e 5465 break;
252b5132
RH
5466 }
5467 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5468 {
67c0d1eb 5469 macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
8fc2e39e 5470 break;
252b5132 5471 }
8fc2e39e 5472 used_at = 1;
67c0d1eb 5473 set_at (sreg, 0);
c80c840e 5474 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
252b5132
RH
5475 break;
5476
5477 case M_BLEUL:
5478 likely = 1;
5479 case M_BLEU:
5480 if (treg == 0)
5481 {
67c0d1eb 5482 macro_build (&offset_expr, likely ? "beql" : "beq",
c80c840e 5483 "s,t,p", sreg, ZERO);
8fc2e39e 5484 break;
252b5132
RH
5485 }
5486 if (sreg == 0)
5487 goto do_true;
8fc2e39e 5488 used_at = 1;
67c0d1eb 5489 macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
c80c840e 5490 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
252b5132
RH
5491 break;
5492
5493 case M_BLEUL_I:
5494 likely = 1;
5495 case M_BLEU_I:
5496 if (sreg == 0
ca4e0257 5497 || (HAVE_32BIT_GPRS
252b5132 5498 && imm_expr.X_op == O_constant
f01dc953 5499 && imm_expr.X_add_number == -1))
252b5132
RH
5500 goto do_true;
5501 if (imm_expr.X_op != O_constant)
5502 as_bad (_("Unsupported large constant"));
f9419b05 5503 ++imm_expr.X_add_number;
252b5132
RH
5504 /* FALLTHROUGH */
5505 case M_BLTU_I:
5506 case M_BLTUL_I:
5507 if (mask == M_BLTUL_I)
5508 likely = 1;
5509 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5510 goto do_false;
5511 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5512 {
67c0d1eb 5513 macro_build (&offset_expr, likely ? "beql" : "beq",
c80c840e 5514 "s,t,p", sreg, ZERO);
8fc2e39e 5515 break;
252b5132 5516 }
8fc2e39e 5517 used_at = 1;
67c0d1eb 5518 set_at (sreg, 1);
c80c840e 5519 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
252b5132
RH
5520 break;
5521
5522 case M_BLTL:
5523 likely = 1;
5524 case M_BLT:
5525 if (treg == 0)
5526 {
67c0d1eb 5527 macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
8fc2e39e 5528 break;
252b5132
RH
5529 }
5530 if (sreg == 0)
5531 {
67c0d1eb 5532 macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
8fc2e39e 5533 break;
252b5132 5534 }
8fc2e39e 5535 used_at = 1;
67c0d1eb 5536 macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
c80c840e 5537 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
252b5132
RH
5538 break;
5539
5540 case M_BLTUL:
5541 likely = 1;
5542 case M_BLTU:
5543 if (treg == 0)
5544 goto do_false;
5545 if (sreg == 0)
5546 {
67c0d1eb 5547 macro_build (&offset_expr, likely ? "bnel" : "bne",
c80c840e 5548 "s,t,p", ZERO, treg);
8fc2e39e 5549 break;
252b5132 5550 }
8fc2e39e 5551 used_at = 1;
67c0d1eb 5552 macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
c80c840e 5553 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
252b5132
RH
5554 break;
5555
5f74bc13
CD
5556 case M_DEXT:
5557 {
d5818fca
MR
5558 /* Use unsigned arithmetic. */
5559 addressT pos;
5560 addressT size;
5f74bc13 5561
90ecf173 5562 if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5f74bc13
CD
5563 {
5564 as_bad (_("Unsupported large constant"));
5565 pos = size = 1;
5566 }
5567 else
5568 {
d5818fca
MR
5569 pos = imm_expr.X_add_number;
5570 size = imm2_expr.X_add_number;
5f74bc13
CD
5571 }
5572
5573 if (pos > 63)
5574 {
d5818fca 5575 as_bad (_("Improper position (%lu)"), (unsigned long) pos);
5f74bc13
CD
5576 pos = 1;
5577 }
90ecf173 5578 if (size == 0 || size > 64 || (pos + size - 1) > 63)
5f74bc13
CD
5579 {
5580 as_bad (_("Improper extract size (%lu, position %lu)"),
d5818fca 5581 (unsigned long) size, (unsigned long) pos);
5f74bc13
CD
5582 size = 1;
5583 }
5584
5585 if (size <= 32 && pos < 32)
5586 {
5587 s = "dext";
5588 fmt = "t,r,+A,+C";
5589 }
5590 else if (size <= 32)
5591 {
5592 s = "dextu";
5593 fmt = "t,r,+E,+H";
5594 }
5595 else
5596 {
5597 s = "dextm";
5598 fmt = "t,r,+A,+G";
5599 }
d5818fca
MR
5600 macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
5601 (int) (size - 1));
5f74bc13 5602 }
8fc2e39e 5603 break;
5f74bc13
CD
5604
5605 case M_DINS:
5606 {
d5818fca
MR
5607 /* Use unsigned arithmetic. */
5608 addressT pos;
5609 addressT size;
5f74bc13 5610
90ecf173 5611 if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5f74bc13
CD
5612 {
5613 as_bad (_("Unsupported large constant"));
5614 pos = size = 1;
5615 }
5616 else
5617 {
d5818fca
MR
5618 pos = imm_expr.X_add_number;
5619 size = imm2_expr.X_add_number;
5f74bc13
CD
5620 }
5621
5622 if (pos > 63)
5623 {
d5818fca 5624 as_bad (_("Improper position (%lu)"), (unsigned long) pos);
5f74bc13
CD
5625 pos = 1;
5626 }
90ecf173 5627 if (size == 0 || size > 64 || (pos + size - 1) > 63)
5f74bc13
CD
5628 {
5629 as_bad (_("Improper insert size (%lu, position %lu)"),
d5818fca 5630 (unsigned long) size, (unsigned long) pos);
5f74bc13
CD
5631 size = 1;
5632 }
5633
5634 if (pos < 32 && (pos + size - 1) < 32)
5635 {
5636 s = "dins";
5637 fmt = "t,r,+A,+B";
5638 }
5639 else if (pos >= 32)
5640 {
5641 s = "dinsu";
5642 fmt = "t,r,+E,+F";
5643 }
5644 else
5645 {
5646 s = "dinsm";
5647 fmt = "t,r,+A,+F";
5648 }
750bdd57
AS
5649 macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
5650 (int) (pos + size - 1));
5f74bc13 5651 }
8fc2e39e 5652 break;
5f74bc13 5653
252b5132
RH
5654 case M_DDIV_3:
5655 dbl = 1;
5656 case M_DIV_3:
5657 s = "mflo";
5658 goto do_div3;
5659 case M_DREM_3:
5660 dbl = 1;
5661 case M_REM_3:
5662 s = "mfhi";
5663 do_div3:
5664 if (treg == 0)
5665 {
5666 as_warn (_("Divide by zero."));
5667 if (mips_trap)
c80c840e 5668 macro_build (NULL, "teq", "s,t,q", ZERO, ZERO, 7);
252b5132 5669 else
67c0d1eb 5670 macro_build (NULL, "break", "c", 7);
8fc2e39e 5671 break;
252b5132
RH
5672 }
5673
7d10b47d 5674 start_noreorder ();
252b5132
RH
5675 if (mips_trap)
5676 {
c80c840e 5677 macro_build (NULL, "teq", "s,t,q", treg, ZERO, 7);
67c0d1eb 5678 macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
252b5132
RH
5679 }
5680 else
5681 {
5682 expr1.X_add_number = 8;
c80c840e 5683 macro_build (&expr1, "bne", "s,t,p", treg, ZERO);
67c0d1eb
RS
5684 macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5685 macro_build (NULL, "break", "c", 7);
252b5132
RH
5686 }
5687 expr1.X_add_number = -1;
8fc2e39e 5688 used_at = 1;
f6a22291 5689 load_register (AT, &expr1, dbl);
252b5132 5690 expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
67c0d1eb 5691 macro_build (&expr1, "bne", "s,t,p", treg, AT);
252b5132
RH
5692 if (dbl)
5693 {
5694 expr1.X_add_number = 1;
f6a22291 5695 load_register (AT, &expr1, dbl);
67c0d1eb 5696 macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
252b5132
RH
5697 }
5698 else
5699 {
5700 expr1.X_add_number = 0x80000000;
67c0d1eb 5701 macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
252b5132
RH
5702 }
5703 if (mips_trap)
5704 {
67c0d1eb 5705 macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
252b5132
RH
5706 /* We want to close the noreorder block as soon as possible, so
5707 that later insns are available for delay slot filling. */
7d10b47d 5708 end_noreorder ();
252b5132
RH
5709 }
5710 else
5711 {
5712 expr1.X_add_number = 8;
67c0d1eb 5713 macro_build (&expr1, "bne", "s,t,p", sreg, AT);
a605d2b3 5714 macro_build (NULL, "nop", "");
252b5132
RH
5715
5716 /* We want to close the noreorder block as soon as possible, so
5717 that later insns are available for delay slot filling. */
7d10b47d 5718 end_noreorder ();
252b5132 5719
67c0d1eb 5720 macro_build (NULL, "break", "c", 6);
252b5132 5721 }
67c0d1eb 5722 macro_build (NULL, s, "d", dreg);
252b5132
RH
5723 break;
5724
5725 case M_DIV_3I:
5726 s = "div";
5727 s2 = "mflo";
5728 goto do_divi;
5729 case M_DIVU_3I:
5730 s = "divu";
5731 s2 = "mflo";
5732 goto do_divi;
5733 case M_REM_3I:
5734 s = "div";
5735 s2 = "mfhi";
5736 goto do_divi;
5737 case M_REMU_3I:
5738 s = "divu";
5739 s2 = "mfhi";
5740 goto do_divi;
5741 case M_DDIV_3I:
5742 dbl = 1;
5743 s = "ddiv";
5744 s2 = "mflo";
5745 goto do_divi;
5746 case M_DDIVU_3I:
5747 dbl = 1;
5748 s = "ddivu";
5749 s2 = "mflo";
5750 goto do_divi;
5751 case M_DREM_3I:
5752 dbl = 1;
5753 s = "ddiv";
5754 s2 = "mfhi";
5755 goto do_divi;
5756 case M_DREMU_3I:
5757 dbl = 1;
5758 s = "ddivu";
5759 s2 = "mfhi";
5760 do_divi:
5761 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5762 {
5763 as_warn (_("Divide by zero."));
5764 if (mips_trap)
c80c840e 5765 macro_build (NULL, "teq", "s,t,q", ZERO, ZERO, 7);
252b5132 5766 else
67c0d1eb 5767 macro_build (NULL, "break", "c", 7);
8fc2e39e 5768 break;
252b5132
RH
5769 }
5770 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5771 {
5772 if (strcmp (s2, "mflo") == 0)
67c0d1eb 5773 move_register (dreg, sreg);
252b5132 5774 else
c80c840e 5775 move_register (dreg, ZERO);
8fc2e39e 5776 break;
252b5132
RH
5777 }
5778 if (imm_expr.X_op == O_constant
5779 && imm_expr.X_add_number == -1
5780 && s[strlen (s) - 1] != 'u')
5781 {
5782 if (strcmp (s2, "mflo") == 0)
5783 {
67c0d1eb 5784 macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
252b5132
RH
5785 }
5786 else
c80c840e 5787 move_register (dreg, ZERO);
8fc2e39e 5788 break;
252b5132
RH
5789 }
5790
8fc2e39e 5791 used_at = 1;
67c0d1eb
RS
5792 load_register (AT, &imm_expr, dbl);
5793 macro_build (NULL, s, "z,s,t", sreg, AT);
5794 macro_build (NULL, s2, "d", dreg);
252b5132
RH
5795 break;
5796
5797 case M_DIVU_3:
5798 s = "divu";
5799 s2 = "mflo";
5800 goto do_divu3;
5801 case M_REMU_3:
5802 s = "divu";
5803 s2 = "mfhi";
5804 goto do_divu3;
5805 case M_DDIVU_3:
5806 s = "ddivu";
5807 s2 = "mflo";
5808 goto do_divu3;
5809 case M_DREMU_3:
5810 s = "ddivu";
5811 s2 = "mfhi";
5812 do_divu3:
7d10b47d 5813 start_noreorder ();
252b5132
RH
5814 if (mips_trap)
5815 {
c80c840e 5816 macro_build (NULL, "teq", "s,t,q", treg, ZERO, 7);
67c0d1eb 5817 macro_build (NULL, s, "z,s,t", sreg, treg);
252b5132
RH
5818 /* We want to close the noreorder block as soon as possible, so
5819 that later insns are available for delay slot filling. */
7d10b47d 5820 end_noreorder ();
252b5132
RH
5821 }
5822 else
5823 {
5824 expr1.X_add_number = 8;
c80c840e 5825 macro_build (&expr1, "bne", "s,t,p", treg, ZERO);
67c0d1eb 5826 macro_build (NULL, s, "z,s,t", sreg, treg);
252b5132
RH
5827
5828 /* We want to close the noreorder block as soon as possible, so
5829 that later insns are available for delay slot filling. */
7d10b47d 5830 end_noreorder ();
67c0d1eb 5831 macro_build (NULL, "break", "c", 7);
252b5132 5832 }
67c0d1eb 5833 macro_build (NULL, s2, "d", dreg);
8fc2e39e 5834 break;
252b5132 5835
1abe91b1
MR
5836 case M_DLCA_AB:
5837 dbl = 1;
5838 case M_LCA_AB:
5839 call = 1;
5840 goto do_la;
252b5132
RH
5841 case M_DLA_AB:
5842 dbl = 1;
5843 case M_LA_AB:
1abe91b1 5844 do_la:
252b5132
RH
5845 /* Load the address of a symbol into a register. If breg is not
5846 zero, we then add a base register to it. */
5847
3bec30a8
TS
5848 if (dbl && HAVE_32BIT_GPRS)
5849 as_warn (_("dla used to load 32-bit register"));
5850
90ecf173 5851 if (!dbl && HAVE_64BIT_OBJECTS)
3bec30a8
TS
5852 as_warn (_("la used to load 64-bit address"));
5853
0c11417f
MR
5854 if (offset_expr.X_op == O_constant
5855 && offset_expr.X_add_number >= -0x8000
5856 && offset_expr.X_add_number < 0x8000)
5857 {
aed1a261 5858 macro_build (&offset_expr, ADDRESS_ADDI_INSN,
17a2f251 5859 "t,r,j", treg, sreg, BFD_RELOC_LO16);
8fc2e39e 5860 break;
0c11417f
MR
5861 }
5862
741fe287 5863 if (mips_opts.at && (treg == breg))
afdbd6d0
CD
5864 {
5865 tempreg = AT;
5866 used_at = 1;
5867 }
5868 else
5869 {
5870 tempreg = treg;
afdbd6d0
CD
5871 }
5872
252b5132
RH
5873 if (offset_expr.X_op != O_symbol
5874 && offset_expr.X_op != O_constant)
5875 {
f71d0d44 5876 as_bad (_("Expression too complex"));
252b5132
RH
5877 offset_expr.X_op = O_constant;
5878 }
5879
252b5132 5880 if (offset_expr.X_op == O_constant)
aed1a261 5881 load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
252b5132
RH
5882 else if (mips_pic == NO_PIC)
5883 {
d6bc6245 5884 /* If this is a reference to a GP relative symbol, we want
cdf6fd85 5885 addiu $tempreg,$gp,<sym> (BFD_RELOC_GPREL16)
252b5132
RH
5886 Otherwise we want
5887 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
5888 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5889 If we have a constant, we need two instructions anyhow,
d6bc6245 5890 so we may as well always use the latter form.
76b3015f 5891
6caf9ef4
TS
5892 With 64bit address space and a usable $at we want
5893 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
5894 lui $at,<sym> (BFD_RELOC_HI16_S)
5895 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
5896 daddiu $at,<sym> (BFD_RELOC_LO16)
5897 dsll32 $tempreg,0
5898 daddu $tempreg,$tempreg,$at
5899
5900 If $at is already in use, we use a path which is suboptimal
5901 on superscalar processors.
5902 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
5903 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
5904 dsll $tempreg,16
5905 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
5906 dsll $tempreg,16
5907 daddiu $tempreg,<sym> (BFD_RELOC_LO16)
5908
5909 For GP relative symbols in 64bit address space we can use
5910 the same sequence as in 32bit address space. */
aed1a261 5911 if (HAVE_64BIT_SYMBOLS)
252b5132 5912 {
6caf9ef4
TS
5913 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5914 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5915 {
5916 relax_start (offset_expr.X_add_symbol);
5917 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5918 tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5919 relax_switch ();
5920 }
d6bc6245 5921
741fe287 5922 if (used_at == 0 && mips_opts.at)
98d3f06f 5923 {
67c0d1eb 5924 macro_build (&offset_expr, "lui", "t,u",
17a2f251 5925 tempreg, BFD_RELOC_MIPS_HIGHEST);
67c0d1eb 5926 macro_build (&offset_expr, "lui", "t,u",
17a2f251 5927 AT, BFD_RELOC_HI16_S);
67c0d1eb 5928 macro_build (&offset_expr, "daddiu", "t,r,j",
17a2f251 5929 tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
67c0d1eb 5930 macro_build (&offset_expr, "daddiu", "t,r,j",
17a2f251 5931 AT, AT, BFD_RELOC_LO16);
67c0d1eb
RS
5932 macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
5933 macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
98d3f06f
KH
5934 used_at = 1;
5935 }
5936 else
5937 {
67c0d1eb 5938 macro_build (&offset_expr, "lui", "t,u",
17a2f251 5939 tempreg, BFD_RELOC_MIPS_HIGHEST);
67c0d1eb 5940 macro_build (&offset_expr, "daddiu", "t,r,j",
17a2f251 5941 tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
67c0d1eb
RS
5942 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5943 macro_build (&offset_expr, "daddiu", "t,r,j",
17a2f251 5944 tempreg, tempreg, BFD_RELOC_HI16_S);
67c0d1eb
RS
5945 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5946 macro_build (&offset_expr, "daddiu", "t,r,j",
17a2f251 5947 tempreg, tempreg, BFD_RELOC_LO16);
98d3f06f 5948 }
6caf9ef4
TS
5949
5950 if (mips_relax.sequence)
5951 relax_end ();
98d3f06f
KH
5952 }
5953 else
5954 {
5955 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6caf9ef4 5956 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
98d3f06f 5957 {
4d7206a2 5958 relax_start (offset_expr.X_add_symbol);
67c0d1eb
RS
5959 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5960 tempreg, mips_gp_register, BFD_RELOC_GPREL16);
4d7206a2 5961 relax_switch ();
98d3f06f 5962 }
6943caf0 5963 if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
f71d0d44 5964 as_bad (_("Offset too large"));
67c0d1eb
RS
5965 macro_build_lui (&offset_expr, tempreg);
5966 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5967 tempreg, tempreg, BFD_RELOC_LO16);
4d7206a2
RS
5968 if (mips_relax.sequence)
5969 relax_end ();
98d3f06f 5970 }
252b5132 5971 }
0a44bf69 5972 else if (!mips_big_got && !HAVE_NEWABI)
252b5132 5973 {
9117d219
NC
5974 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5975
252b5132
RH
5976 /* If this is a reference to an external symbol, and there
5977 is no constant, we want
5978 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
1abe91b1 5979 or for lca or if tempreg is PIC_CALL_REG
9117d219 5980 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
252b5132
RH
5981 For a local symbol, we want
5982 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5983 nop
5984 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5985
5986 If we have a small constant, and this is a reference to
5987 an external symbol, we want
5988 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5989 nop
5990 addiu $tempreg,$tempreg,<constant>
5991 For a local symbol, we want the same instruction
5992 sequence, but we output a BFD_RELOC_LO16 reloc on the
5993 addiu instruction.
5994
5995 If we have a large constant, and this is a reference to
5996 an external symbol, we want
5997 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5998 lui $at,<hiconstant>
5999 addiu $at,$at,<loconstant>
6000 addu $tempreg,$tempreg,$at
6001 For a local symbol, we want the same instruction
6002 sequence, but we output a BFD_RELOC_LO16 reloc on the
ed6fb7bd 6003 addiu instruction.
ed6fb7bd
SC
6004 */
6005
4d7206a2 6006 if (offset_expr.X_add_number == 0)
252b5132 6007 {
0a44bf69
RS
6008 if (mips_pic == SVR4_PIC
6009 && breg == 0
6010 && (call || tempreg == PIC_CALL_REG))
4d7206a2
RS
6011 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
6012
6013 relax_start (offset_expr.X_add_symbol);
67c0d1eb
RS
6014 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6015 lw_reloc_type, mips_gp_register);
4d7206a2 6016 if (breg != 0)
252b5132
RH
6017 {
6018 /* We're going to put in an addu instruction using
6019 tempreg, so we may as well insert the nop right
6020 now. */
269137b2 6021 load_delay_nop ();
252b5132 6022 }
4d7206a2 6023 relax_switch ();
67c0d1eb
RS
6024 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6025 tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
269137b2 6026 load_delay_nop ();
67c0d1eb
RS
6027 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6028 tempreg, tempreg, BFD_RELOC_LO16);
4d7206a2 6029 relax_end ();
252b5132
RH
6030 /* FIXME: If breg == 0, and the next instruction uses
6031 $tempreg, then if this variant case is used an extra
6032 nop will be generated. */
6033 }
4d7206a2
RS
6034 else if (offset_expr.X_add_number >= -0x8000
6035 && offset_expr.X_add_number < 0x8000)
252b5132 6036 {
67c0d1eb 6037 load_got_offset (tempreg, &offset_expr);
269137b2 6038 load_delay_nop ();
67c0d1eb 6039 add_got_offset (tempreg, &offset_expr);
252b5132
RH
6040 }
6041 else
6042 {
4d7206a2
RS
6043 expr1.X_add_number = offset_expr.X_add_number;
6044 offset_expr.X_add_number =
6045 ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
67c0d1eb 6046 load_got_offset (tempreg, &offset_expr);
f6a22291 6047 offset_expr.X_add_number = expr1.X_add_number;
252b5132
RH
6048 /* If we are going to add in a base register, and the
6049 target register and the base register are the same,
6050 then we are using AT as a temporary register. Since
6051 we want to load the constant into AT, we add our
6052 current AT (from the global offset table) and the
6053 register into the register now, and pretend we were
6054 not using a base register. */
67c0d1eb 6055 if (breg == treg)
252b5132 6056 {
269137b2 6057 load_delay_nop ();
67c0d1eb 6058 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6059 treg, AT, breg);
252b5132
RH
6060 breg = 0;
6061 tempreg = treg;
252b5132 6062 }
f6a22291 6063 add_got_offset_hilo (tempreg, &offset_expr, AT);
252b5132
RH
6064 used_at = 1;
6065 }
6066 }
0a44bf69 6067 else if (!mips_big_got && HAVE_NEWABI)
f5040a92 6068 {
67c0d1eb 6069 int add_breg_early = 0;
f5040a92
AO
6070
6071 /* If this is a reference to an external, and there is no
6072 constant, or local symbol (*), with or without a
6073 constant, we want
6074 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
1abe91b1 6075 or for lca or if tempreg is PIC_CALL_REG
f5040a92
AO
6076 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
6077
6078 If we have a small constant, and this is a reference to
6079 an external symbol, we want
6080 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
6081 addiu $tempreg,$tempreg,<constant>
6082
6083 If we have a large constant, and this is a reference to
6084 an external symbol, we want
6085 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
6086 lui $at,<hiconstant>
6087 addiu $at,$at,<loconstant>
6088 addu $tempreg,$tempreg,$at
6089
6090 (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
6091 local symbols, even though it introduces an additional
6092 instruction. */
6093
f5040a92
AO
6094 if (offset_expr.X_add_number)
6095 {
4d7206a2 6096 expr1.X_add_number = offset_expr.X_add_number;
f5040a92
AO
6097 offset_expr.X_add_number = 0;
6098
4d7206a2 6099 relax_start (offset_expr.X_add_symbol);
67c0d1eb
RS
6100 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6101 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
f5040a92
AO
6102
6103 if (expr1.X_add_number >= -0x8000
6104 && expr1.X_add_number < 0x8000)
6105 {
67c0d1eb
RS
6106 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
6107 tempreg, tempreg, BFD_RELOC_LO16);
f5040a92 6108 }
ecd13cd3 6109 else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
f5040a92 6110 {
f5040a92
AO
6111 /* If we are going to add in a base register, and the
6112 target register and the base register are the same,
6113 then we are using AT as a temporary register. Since
6114 we want to load the constant into AT, we add our
6115 current AT (from the global offset table) and the
6116 register into the register now, and pretend we were
6117 not using a base register. */
6118 if (breg != treg)
6119 dreg = tempreg;
6120 else
6121 {
9c2799c2 6122 gas_assert (tempreg == AT);
67c0d1eb
RS
6123 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6124 treg, AT, breg);
f5040a92 6125 dreg = treg;
67c0d1eb 6126 add_breg_early = 1;
f5040a92
AO
6127 }
6128
f6a22291 6129 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
67c0d1eb 6130 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6131 dreg, dreg, AT);
f5040a92 6132
f5040a92
AO
6133 used_at = 1;
6134 }
6135 else
6136 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
6137
4d7206a2 6138 relax_switch ();
f5040a92
AO
6139 offset_expr.X_add_number = expr1.X_add_number;
6140
67c0d1eb
RS
6141 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6142 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
6143 if (add_breg_early)
f5040a92 6144 {
67c0d1eb 6145 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
f899b4b8 6146 treg, tempreg, breg);
f5040a92
AO
6147 breg = 0;
6148 tempreg = treg;
6149 }
4d7206a2 6150 relax_end ();
f5040a92 6151 }
4d7206a2 6152 else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
f5040a92 6153 {
4d7206a2 6154 relax_start (offset_expr.X_add_symbol);
67c0d1eb
RS
6155 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6156 BFD_RELOC_MIPS_CALL16, mips_gp_register);
4d7206a2 6157 relax_switch ();
67c0d1eb
RS
6158 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6159 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4d7206a2 6160 relax_end ();
f5040a92 6161 }
4d7206a2 6162 else
f5040a92 6163 {
67c0d1eb
RS
6164 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6165 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
f5040a92
AO
6166 }
6167 }
0a44bf69 6168 else if (mips_big_got && !HAVE_NEWABI)
252b5132 6169 {
67c0d1eb 6170 int gpdelay;
9117d219
NC
6171 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
6172 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
ed6fb7bd 6173 int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
252b5132
RH
6174
6175 /* This is the large GOT case. If this is a reference to an
6176 external symbol, and there is no constant, we want
6177 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6178 addu $tempreg,$tempreg,$gp
6179 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
1abe91b1 6180 or for lca or if tempreg is PIC_CALL_REG
9117d219
NC
6181 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
6182 addu $tempreg,$tempreg,$gp
6183 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
252b5132
RH
6184 For a local symbol, we want
6185 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6186 nop
6187 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6188
6189 If we have a small constant, and this is a reference to
6190 an external symbol, we want
6191 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6192 addu $tempreg,$tempreg,$gp
6193 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6194 nop
6195 addiu $tempreg,$tempreg,<constant>
6196 For a local symbol, we want
6197 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6198 nop
6199 addiu $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
6200
6201 If we have a large constant, and this is a reference to
6202 an external symbol, we want
6203 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6204 addu $tempreg,$tempreg,$gp
6205 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6206 lui $at,<hiconstant>
6207 addiu $at,$at,<loconstant>
6208 addu $tempreg,$tempreg,$at
6209 For a local symbol, we want
6210 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6211 lui $at,<hiconstant>
6212 addiu $at,$at,<loconstant> (BFD_RELOC_LO16)
6213 addu $tempreg,$tempreg,$at
f5040a92 6214 */
438c16b8 6215
252b5132
RH
6216 expr1.X_add_number = offset_expr.X_add_number;
6217 offset_expr.X_add_number = 0;
4d7206a2 6218 relax_start (offset_expr.X_add_symbol);
67c0d1eb 6219 gpdelay = reg_needs_delay (mips_gp_register);
1abe91b1
MR
6220 if (expr1.X_add_number == 0 && breg == 0
6221 && (call || tempreg == PIC_CALL_REG))
9117d219
NC
6222 {
6223 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
6224 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
6225 }
67c0d1eb
RS
6226 macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
6227 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6228 tempreg, tempreg, mips_gp_register);
67c0d1eb 6229 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
17a2f251 6230 tempreg, lw_reloc_type, tempreg);
252b5132
RH
6231 if (expr1.X_add_number == 0)
6232 {
67c0d1eb 6233 if (breg != 0)
252b5132
RH
6234 {
6235 /* We're going to put in an addu instruction using
6236 tempreg, so we may as well insert the nop right
6237 now. */
269137b2 6238 load_delay_nop ();
252b5132 6239 }
252b5132
RH
6240 }
6241 else if (expr1.X_add_number >= -0x8000
6242 && expr1.X_add_number < 0x8000)
6243 {
269137b2 6244 load_delay_nop ();
67c0d1eb 6245 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
17a2f251 6246 tempreg, tempreg, BFD_RELOC_LO16);
252b5132
RH
6247 }
6248 else
6249 {
252b5132
RH
6250 /* If we are going to add in a base register, and the
6251 target register and the base register are the same,
6252 then we are using AT as a temporary register. Since
6253 we want to load the constant into AT, we add our
6254 current AT (from the global offset table) and the
6255 register into the register now, and pretend we were
6256 not using a base register. */
6257 if (breg != treg)
67c0d1eb 6258 dreg = tempreg;
252b5132
RH
6259 else
6260 {
9c2799c2 6261 gas_assert (tempreg == AT);
269137b2 6262 load_delay_nop ();
67c0d1eb 6263 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6264 treg, AT, breg);
252b5132 6265 dreg = treg;
252b5132
RH
6266 }
6267
f6a22291 6268 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
67c0d1eb 6269 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
252b5132 6270
252b5132
RH
6271 used_at = 1;
6272 }
4d7206a2
RS
6273 offset_expr.X_add_number =
6274 ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
6275 relax_switch ();
252b5132 6276
67c0d1eb 6277 if (gpdelay)
252b5132
RH
6278 {
6279 /* This is needed because this instruction uses $gp, but
f5040a92 6280 the first instruction on the main stream does not. */
67c0d1eb 6281 macro_build (NULL, "nop", "");
252b5132 6282 }
ed6fb7bd 6283
67c0d1eb
RS
6284 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6285 local_reloc_type, mips_gp_register);
f5040a92 6286 if (expr1.X_add_number >= -0x8000
252b5132
RH
6287 && expr1.X_add_number < 0x8000)
6288 {
269137b2 6289 load_delay_nop ();
67c0d1eb
RS
6290 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6291 tempreg, tempreg, BFD_RELOC_LO16);
252b5132 6292 /* FIXME: If add_number is 0, and there was no base
f5040a92
AO
6293 register, the external symbol case ended with a load,
6294 so if the symbol turns out to not be external, and
6295 the next instruction uses tempreg, an unnecessary nop
6296 will be inserted. */
252b5132
RH
6297 }
6298 else
6299 {
6300 if (breg == treg)
6301 {
6302 /* We must add in the base register now, as in the
f5040a92 6303 external symbol case. */
9c2799c2 6304 gas_assert (tempreg == AT);
269137b2 6305 load_delay_nop ();
67c0d1eb 6306 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6307 treg, AT, breg);
252b5132
RH
6308 tempreg = treg;
6309 /* We set breg to 0 because we have arranged to add
f5040a92 6310 it in in both cases. */
252b5132
RH
6311 breg = 0;
6312 }
6313
67c0d1eb
RS
6314 macro_build_lui (&expr1, AT);
6315 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
17a2f251 6316 AT, AT, BFD_RELOC_LO16);
67c0d1eb 6317 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6318 tempreg, tempreg, AT);
8fc2e39e 6319 used_at = 1;
252b5132 6320 }
4d7206a2 6321 relax_end ();
252b5132 6322 }
0a44bf69 6323 else if (mips_big_got && HAVE_NEWABI)
f5040a92 6324 {
f5040a92
AO
6325 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
6326 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
67c0d1eb 6327 int add_breg_early = 0;
f5040a92
AO
6328
6329 /* This is the large GOT case. If this is a reference to an
6330 external symbol, and there is no constant, we want
6331 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6332 add $tempreg,$tempreg,$gp
6333 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
1abe91b1 6334 or for lca or if tempreg is PIC_CALL_REG
f5040a92
AO
6335 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
6336 add $tempreg,$tempreg,$gp
6337 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
6338
6339 If we have a small constant, and this is a reference to
6340 an external symbol, we want
6341 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6342 add $tempreg,$tempreg,$gp
6343 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6344 addi $tempreg,$tempreg,<constant>
6345
6346 If we have a large constant, and this is a reference to
6347 an external symbol, we want
6348 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6349 addu $tempreg,$tempreg,$gp
6350 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6351 lui $at,<hiconstant>
6352 addi $at,$at,<loconstant>
6353 add $tempreg,$tempreg,$at
6354
6355 If we have NewABI, and we know it's a local symbol, we want
6356 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
6357 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
6358 otherwise we have to resort to GOT_HI16/GOT_LO16. */
6359
4d7206a2 6360 relax_start (offset_expr.X_add_symbol);
f5040a92 6361
4d7206a2 6362 expr1.X_add_number = offset_expr.X_add_number;
f5040a92
AO
6363 offset_expr.X_add_number = 0;
6364
1abe91b1
MR
6365 if (expr1.X_add_number == 0 && breg == 0
6366 && (call || tempreg == PIC_CALL_REG))
f5040a92
AO
6367 {
6368 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
6369 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
6370 }
67c0d1eb
RS
6371 macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
6372 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6373 tempreg, tempreg, mips_gp_register);
67c0d1eb
RS
6374 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6375 tempreg, lw_reloc_type, tempreg);
f5040a92
AO
6376
6377 if (expr1.X_add_number == 0)
4d7206a2 6378 ;
f5040a92
AO
6379 else if (expr1.X_add_number >= -0x8000
6380 && expr1.X_add_number < 0x8000)
6381 {
67c0d1eb 6382 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
17a2f251 6383 tempreg, tempreg, BFD_RELOC_LO16);
f5040a92 6384 }
ecd13cd3 6385 else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
f5040a92 6386 {
f5040a92
AO
6387 /* If we are going to add in a base register, and the
6388 target register and the base register are the same,
6389 then we are using AT as a temporary register. Since
6390 we want to load the constant into AT, we add our
6391 current AT (from the global offset table) and the
6392 register into the register now, and pretend we were
6393 not using a base register. */
6394 if (breg != treg)
6395 dreg = tempreg;
6396 else
6397 {
9c2799c2 6398 gas_assert (tempreg == AT);
67c0d1eb 6399 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6400 treg, AT, breg);
f5040a92 6401 dreg = treg;
67c0d1eb 6402 add_breg_early = 1;
f5040a92
AO
6403 }
6404
f6a22291 6405 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
67c0d1eb 6406 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
f5040a92 6407
f5040a92
AO
6408 used_at = 1;
6409 }
6410 else
6411 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
6412
4d7206a2 6413 relax_switch ();
f5040a92 6414 offset_expr.X_add_number = expr1.X_add_number;
67c0d1eb
RS
6415 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6416 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6417 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6418 tempreg, BFD_RELOC_MIPS_GOT_OFST);
6419 if (add_breg_early)
f5040a92 6420 {
67c0d1eb 6421 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6422 treg, tempreg, breg);
f5040a92
AO
6423 breg = 0;
6424 tempreg = treg;
6425 }
4d7206a2 6426 relax_end ();
f5040a92 6427 }
252b5132
RH
6428 else
6429 abort ();
6430
6431 if (breg != 0)
aed1a261 6432 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
252b5132
RH
6433 break;
6434
52b6b6b9
JM
6435 case M_MSGSND:
6436 {
6437 unsigned long temp = (treg << 16) | (0x01);
6438 macro_build (NULL, "c2", "C", temp);
6439 }
c7af4273 6440 break;
52b6b6b9
JM
6441
6442 case M_MSGLD:
6443 {
6444 unsigned long temp = (0x02);
6445 macro_build (NULL, "c2", "C", temp);
6446 }
c7af4273 6447 break;
52b6b6b9
JM
6448
6449 case M_MSGLD_T:
6450 {
6451 unsigned long temp = (treg << 16) | (0x02);
6452 macro_build (NULL, "c2", "C", temp);
6453 }
c7af4273 6454 break;
52b6b6b9
JM
6455
6456 case M_MSGWAIT:
6457 macro_build (NULL, "c2", "C", 3);
c7af4273 6458 break;
52b6b6b9
JM
6459
6460 case M_MSGWAIT_T:
6461 {
6462 unsigned long temp = (treg << 16) | 0x03;
6463 macro_build (NULL, "c2", "C", temp);
6464 }
c7af4273 6465 break;
52b6b6b9 6466
252b5132
RH
6467 case M_J_A:
6468 /* The j instruction may not be used in PIC code, since it
6469 requires an absolute address. We convert it to a b
6470 instruction. */
6471 if (mips_pic == NO_PIC)
67c0d1eb 6472 macro_build (&offset_expr, "j", "a");
252b5132 6473 else
67c0d1eb 6474 macro_build (&offset_expr, "b", "p");
8fc2e39e 6475 break;
252b5132
RH
6476
6477 /* The jal instructions must be handled as macros because when
6478 generating PIC code they expand to multi-instruction
6479 sequences. Normally they are simple instructions. */
6480 case M_JAL_1:
6481 dreg = RA;
6482 /* Fall through. */
6483 case M_JAL_2:
3e722fb5 6484 if (mips_pic == NO_PIC)
67c0d1eb 6485 macro_build (NULL, "jalr", "d,s", dreg, sreg);
0a44bf69 6486 else
252b5132
RH
6487 {
6488 if (sreg != PIC_CALL_REG)
6489 as_warn (_("MIPS PIC call to register other than $25"));
bdaaa2e1 6490
67c0d1eb 6491 macro_build (NULL, "jalr", "d,s", dreg, sreg);
0a44bf69 6492 if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
252b5132 6493 {
6478892d
TS
6494 if (mips_cprestore_offset < 0)
6495 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6496 else
6497 {
90ecf173 6498 if (!mips_frame_reg_valid)
7a621144
DJ
6499 {
6500 as_warn (_("No .frame pseudo-op used in PIC code"));
6501 /* Quiet this warning. */
6502 mips_frame_reg_valid = 1;
6503 }
90ecf173 6504 if (!mips_cprestore_valid)
7a621144
DJ
6505 {
6506 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6507 /* Quiet this warning. */
6508 mips_cprestore_valid = 1;
6509 }
d3fca0b5
MR
6510 if (mips_opts.noreorder)
6511 macro_build (NULL, "nop", "");
6478892d 6512 expr1.X_add_number = mips_cprestore_offset;
67c0d1eb 6513 macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
f899b4b8 6514 mips_gp_register,
256ab948
TS
6515 mips_frame_reg,
6516 HAVE_64BIT_ADDRESSES);
6478892d 6517 }
252b5132
RH
6518 }
6519 }
252b5132 6520
8fc2e39e 6521 break;
252b5132
RH
6522
6523 case M_JAL_A:
6524 if (mips_pic == NO_PIC)
67c0d1eb 6525 macro_build (&offset_expr, "jal", "a");
252b5132
RH
6526 else if (mips_pic == SVR4_PIC)
6527 {
6528 /* If this is a reference to an external symbol, and we are
6529 using a small GOT, we want
6530 lw $25,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
6531 nop
f9419b05 6532 jalr $ra,$25
252b5132
RH
6533 nop
6534 lw $gp,cprestore($sp)
6535 The cprestore value is set using the .cprestore
6536 pseudo-op. If we are using a big GOT, we want
6537 lui $25,<sym> (BFD_RELOC_MIPS_CALL_HI16)
6538 addu $25,$25,$gp
6539 lw $25,<sym>($25) (BFD_RELOC_MIPS_CALL_LO16)
6540 nop
f9419b05 6541 jalr $ra,$25
252b5132
RH
6542 nop
6543 lw $gp,cprestore($sp)
6544 If the symbol is not external, we want
6545 lw $25,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6546 nop
6547 addiu $25,$25,<sym> (BFD_RELOC_LO16)
f9419b05 6548 jalr $ra,$25
252b5132 6549 nop
438c16b8 6550 lw $gp,cprestore($sp)
f5040a92
AO
6551
6552 For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
6553 sequences above, minus nops, unless the symbol is local,
6554 which enables us to use GOT_PAGE/GOT_OFST (big got) or
6555 GOT_DISP. */
438c16b8 6556 if (HAVE_NEWABI)
252b5132 6557 {
90ecf173 6558 if (!mips_big_got)
f5040a92 6559 {
4d7206a2 6560 relax_start (offset_expr.X_add_symbol);
67c0d1eb
RS
6561 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6562 PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
f5040a92 6563 mips_gp_register);
4d7206a2 6564 relax_switch ();
67c0d1eb
RS
6565 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6566 PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
4d7206a2
RS
6567 mips_gp_register);
6568 relax_end ();
f5040a92
AO
6569 }
6570 else
6571 {
4d7206a2 6572 relax_start (offset_expr.X_add_symbol);
67c0d1eb
RS
6573 macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6574 BFD_RELOC_MIPS_CALL_HI16);
6575 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6576 PIC_CALL_REG, mips_gp_register);
6577 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6578 PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6579 PIC_CALL_REG);
4d7206a2 6580 relax_switch ();
67c0d1eb
RS
6581 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6582 PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
6583 mips_gp_register);
6584 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6585 PIC_CALL_REG, PIC_CALL_REG,
17a2f251 6586 BFD_RELOC_MIPS_GOT_OFST);
4d7206a2 6587 relax_end ();
f5040a92 6588 }
684022ea 6589
67c0d1eb 6590 macro_build_jalr (&offset_expr);
252b5132
RH
6591 }
6592 else
6593 {
4d7206a2 6594 relax_start (offset_expr.X_add_symbol);
90ecf173 6595 if (!mips_big_got)
438c16b8 6596 {
67c0d1eb
RS
6597 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6598 PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
17a2f251 6599 mips_gp_register);
269137b2 6600 load_delay_nop ();
4d7206a2 6601 relax_switch ();
438c16b8 6602 }
252b5132 6603 else
252b5132 6604 {
67c0d1eb
RS
6605 int gpdelay;
6606
6607 gpdelay = reg_needs_delay (mips_gp_register);
6608 macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6609 BFD_RELOC_MIPS_CALL_HI16);
6610 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6611 PIC_CALL_REG, mips_gp_register);
6612 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6613 PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6614 PIC_CALL_REG);
269137b2 6615 load_delay_nop ();
4d7206a2 6616 relax_switch ();
67c0d1eb
RS
6617 if (gpdelay)
6618 macro_build (NULL, "nop", "");
252b5132 6619 }
67c0d1eb
RS
6620 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6621 PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
4d7206a2 6622 mips_gp_register);
269137b2 6623 load_delay_nop ();
67c0d1eb
RS
6624 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6625 PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
4d7206a2 6626 relax_end ();
67c0d1eb 6627 macro_build_jalr (&offset_expr);
438c16b8 6628
6478892d
TS
6629 if (mips_cprestore_offset < 0)
6630 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6631 else
6632 {
90ecf173 6633 if (!mips_frame_reg_valid)
7a621144
DJ
6634 {
6635 as_warn (_("No .frame pseudo-op used in PIC code"));
6636 /* Quiet this warning. */
6637 mips_frame_reg_valid = 1;
6638 }
90ecf173 6639 if (!mips_cprestore_valid)
7a621144
DJ
6640 {
6641 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6642 /* Quiet this warning. */
6643 mips_cprestore_valid = 1;
6644 }
6478892d 6645 if (mips_opts.noreorder)
67c0d1eb 6646 macro_build (NULL, "nop", "");
6478892d 6647 expr1.X_add_number = mips_cprestore_offset;
67c0d1eb 6648 macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
f899b4b8 6649 mips_gp_register,
256ab948
TS
6650 mips_frame_reg,
6651 HAVE_64BIT_ADDRESSES);
6478892d 6652 }
252b5132
RH
6653 }
6654 }
0a44bf69
RS
6655 else if (mips_pic == VXWORKS_PIC)
6656 as_bad (_("Non-PIC jump used in PIC library"));
252b5132
RH
6657 else
6658 abort ();
6659
8fc2e39e 6660 break;
252b5132
RH
6661
6662 case M_LB_AB:
6663 s = "lb";
6664 goto ld;
6665 case M_LBU_AB:
6666 s = "lbu";
6667 goto ld;
6668 case M_LH_AB:
6669 s = "lh";
6670 goto ld;
6671 case M_LHU_AB:
6672 s = "lhu";
6673 goto ld;
6674 case M_LW_AB:
6675 s = "lw";
6676 goto ld;
6677 case M_LWC0_AB:
6678 s = "lwc0";
bdaaa2e1 6679 /* Itbl support may require additional care here. */
252b5132
RH
6680 coproc = 1;
6681 goto ld;
6682 case M_LWC1_AB:
6683 s = "lwc1";
bdaaa2e1 6684 /* Itbl support may require additional care here. */
252b5132
RH
6685 coproc = 1;
6686 goto ld;
6687 case M_LWC2_AB:
6688 s = "lwc2";
bdaaa2e1 6689 /* Itbl support may require additional care here. */
252b5132
RH
6690 coproc = 1;
6691 goto ld;
6692 case M_LWC3_AB:
6693 s = "lwc3";
bdaaa2e1 6694 /* Itbl support may require additional care here. */
252b5132
RH
6695 coproc = 1;
6696 goto ld;
6697 case M_LWL_AB:
6698 s = "lwl";
6699 lr = 1;
6700 goto ld;
6701 case M_LWR_AB:
6702 s = "lwr";
6703 lr = 1;
6704 goto ld;
6705 case M_LDC1_AB:
252b5132 6706 s = "ldc1";
bdaaa2e1 6707 /* Itbl support may require additional care here. */
252b5132
RH
6708 coproc = 1;
6709 goto ld;
6710 case M_LDC2_AB:
6711 s = "ldc2";
bdaaa2e1 6712 /* Itbl support may require additional care here. */
252b5132
RH
6713 coproc = 1;
6714 goto ld;
6715 case M_LDC3_AB:
6716 s = "ldc3";
bdaaa2e1 6717 /* Itbl support may require additional care here. */
252b5132
RH
6718 coproc = 1;
6719 goto ld;
6720 case M_LDL_AB:
6721 s = "ldl";
6722 lr = 1;
6723 goto ld;
6724 case M_LDR_AB:
6725 s = "ldr";
6726 lr = 1;
6727 goto ld;
6728 case M_LL_AB:
6729 s = "ll";
6730 goto ld;
6731 case M_LLD_AB:
6732 s = "lld";
6733 goto ld;
6734 case M_LWU_AB:
6735 s = "lwu";
6736 ld:
8fc2e39e 6737 if (breg == treg || coproc || lr)
252b5132
RH
6738 {
6739 tempreg = AT;
6740 used_at = 1;
6741 }
6742 else
6743 {
6744 tempreg = treg;
252b5132
RH
6745 }
6746 goto ld_st;
6747 case M_SB_AB:
6748 s = "sb";
6749 goto st;
6750 case M_SH_AB:
6751 s = "sh";
6752 goto st;
6753 case M_SW_AB:
6754 s = "sw";
6755 goto st;
6756 case M_SWC0_AB:
6757 s = "swc0";
bdaaa2e1 6758 /* Itbl support may require additional care here. */
252b5132
RH
6759 coproc = 1;
6760 goto st;
6761 case M_SWC1_AB:
6762 s = "swc1";
bdaaa2e1 6763 /* Itbl support may require additional care here. */
252b5132
RH
6764 coproc = 1;
6765 goto st;
6766 case M_SWC2_AB:
6767 s = "swc2";
bdaaa2e1 6768 /* Itbl support may require additional care here. */
252b5132
RH
6769 coproc = 1;
6770 goto st;
6771 case M_SWC3_AB:
6772 s = "swc3";
bdaaa2e1 6773 /* Itbl support may require additional care here. */
252b5132
RH
6774 coproc = 1;
6775 goto st;
6776 case M_SWL_AB:
6777 s = "swl";
6778 goto st;
6779 case M_SWR_AB:
6780 s = "swr";
6781 goto st;
6782 case M_SC_AB:
6783 s = "sc";
6784 goto st;
6785 case M_SCD_AB:
6786 s = "scd";
6787 goto st;
d43b4baf
TS
6788 case M_CACHE_AB:
6789 s = "cache";
6790 goto st;
3eebd5eb
MR
6791 case M_PREF_AB:
6792 s = "pref";
6793 goto st;
252b5132 6794 case M_SDC1_AB:
252b5132
RH
6795 s = "sdc1";
6796 coproc = 1;
bdaaa2e1 6797 /* Itbl support may require additional care here. */
252b5132
RH
6798 goto st;
6799 case M_SDC2_AB:
6800 s = "sdc2";
bdaaa2e1 6801 /* Itbl support may require additional care here. */
252b5132
RH
6802 coproc = 1;
6803 goto st;
6804 case M_SDC3_AB:
6805 s = "sdc3";
bdaaa2e1 6806 /* Itbl support may require additional care here. */
252b5132
RH
6807 coproc = 1;
6808 goto st;
6809 case M_SDL_AB:
6810 s = "sdl";
6811 goto st;
6812 case M_SDR_AB:
6813 s = "sdr";
6814 st:
8fc2e39e
TS
6815 tempreg = AT;
6816 used_at = 1;
252b5132 6817 ld_st:
b19e8a9b
AN
6818 if (coproc
6819 && NO_ISA_COP (mips_opts.arch)
6820 && (ip->insn_mo->pinfo2 & (INSN2_M_FP_S | INSN2_M_FP_D)) == 0)
6821 {
f71d0d44 6822 as_bad (_("Opcode not supported on this processor: %s"),
b19e8a9b
AN
6823 mips_cpu_info_from_arch (mips_opts.arch)->name);
6824 break;
6825 }
6826
bdaaa2e1 6827 /* Itbl support may require additional care here. */
252b5132
RH
6828 if (mask == M_LWC1_AB
6829 || mask == M_SWC1_AB
6830 || mask == M_LDC1_AB
6831 || mask == M_SDC1_AB
6832 || mask == M_L_DAB
6833 || mask == M_S_DAB)
6834 fmt = "T,o(b)";
3eebd5eb 6835 else if (mask == M_CACHE_AB || mask == M_PREF_AB)
d43b4baf 6836 fmt = "k,o(b)";
252b5132
RH
6837 else if (coproc)
6838 fmt = "E,o(b)";
6839 else
6840 fmt = "t,o(b)";
6841
6842 if (offset_expr.X_op != O_constant
6843 && offset_expr.X_op != O_symbol)
6844 {
f71d0d44 6845 as_bad (_("Expression too complex"));
252b5132
RH
6846 offset_expr.X_op = O_constant;
6847 }
6848
2051e8c4
MR
6849 if (HAVE_32BIT_ADDRESSES
6850 && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
55e08f71
NC
6851 {
6852 char value [32];
6853
6854 sprintf_vma (value, offset_expr.X_add_number);
20e1fcfd 6855 as_bad (_("Number (0x%s) larger than 32 bits"), value);
55e08f71 6856 }
2051e8c4 6857
252b5132
RH
6858 /* A constant expression in PIC code can be handled just as it
6859 is in non PIC code. */
aed1a261
RS
6860 if (offset_expr.X_op == O_constant)
6861 {
842f8b2a 6862 expr1.X_add_number = offset_expr.X_add_number;
2051e8c4 6863 normalize_address_expr (&expr1);
842f8b2a
MR
6864 if (!IS_SEXT_16BIT_NUM (expr1.X_add_number))
6865 {
6866 expr1.X_add_number = ((expr1.X_add_number + 0x8000)
6867 & ~(bfd_vma) 0xffff);
6868 load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
6869 if (breg != 0)
6870 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6871 tempreg, tempreg, breg);
6872 breg = tempreg;
6873 }
6874 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, breg);
aed1a261
RS
6875 }
6876 else if (mips_pic == NO_PIC)
252b5132
RH
6877 {
6878 /* If this is a reference to a GP relative symbol, and there
6879 is no base register, we want
cdf6fd85 6880 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
252b5132
RH
6881 Otherwise, if there is no base register, we want
6882 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
6883 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6884 If we have a constant, we need two instructions anyhow,
6885 so we always use the latter form.
6886
6887 If we have a base register, and this is a reference to a
6888 GP relative symbol, we want
6889 addu $tempreg,$breg,$gp
cdf6fd85 6890 <op> $treg,<sym>($tempreg) (BFD_RELOC_GPREL16)
252b5132
RH
6891 Otherwise we want
6892 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
6893 addu $tempreg,$tempreg,$breg
6894 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
d6bc6245 6895 With a constant we always use the latter case.
76b3015f 6896
d6bc6245
TS
6897 With 64bit address space and no base register and $at usable,
6898 we want
6899 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6900 lui $at,<sym> (BFD_RELOC_HI16_S)
6901 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6902 dsll32 $tempreg,0
6903 daddu $tempreg,$at
6904 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6905 If we have a base register, we want
6906 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6907 lui $at,<sym> (BFD_RELOC_HI16_S)
6908 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6909 daddu $at,$breg
6910 dsll32 $tempreg,0
6911 daddu $tempreg,$at
6912 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6913
6914 Without $at we can't generate the optimal path for superscalar
6915 processors here since this would require two temporary registers.
6916 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6917 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6918 dsll $tempreg,16
6919 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
6920 dsll $tempreg,16
6921 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6922 If we have a base register, we want
6923 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6924 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6925 dsll $tempreg,16
6926 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
6927 dsll $tempreg,16
6928 daddu $tempreg,$tempreg,$breg
6929 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6373ee54 6930
6caf9ef4 6931 For GP relative symbols in 64bit address space we can use
aed1a261
RS
6932 the same sequence as in 32bit address space. */
6933 if (HAVE_64BIT_SYMBOLS)
d6bc6245 6934 {
aed1a261 6935 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6caf9ef4
TS
6936 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6937 {
6938 relax_start (offset_expr.X_add_symbol);
6939 if (breg == 0)
6940 {
6941 macro_build (&offset_expr, s, fmt, treg,
6942 BFD_RELOC_GPREL16, mips_gp_register);
6943 }
6944 else
6945 {
6946 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6947 tempreg, breg, mips_gp_register);
6948 macro_build (&offset_expr, s, fmt, treg,
6949 BFD_RELOC_GPREL16, tempreg);
6950 }
6951 relax_switch ();
6952 }
d6bc6245 6953
741fe287 6954 if (used_at == 0 && mips_opts.at)
d6bc6245 6955 {
67c0d1eb
RS
6956 macro_build (&offset_expr, "lui", "t,u", tempreg,
6957 BFD_RELOC_MIPS_HIGHEST);
6958 macro_build (&offset_expr, "lui", "t,u", AT,
6959 BFD_RELOC_HI16_S);
6960 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6961 tempreg, BFD_RELOC_MIPS_HIGHER);
d6bc6245 6962 if (breg != 0)
67c0d1eb
RS
6963 macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
6964 macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
6965 macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
6966 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
6967 tempreg);
d6bc6245
TS
6968 used_at = 1;
6969 }
6970 else
6971 {
67c0d1eb
RS
6972 macro_build (&offset_expr, "lui", "t,u", tempreg,
6973 BFD_RELOC_MIPS_HIGHEST);
6974 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6975 tempreg, BFD_RELOC_MIPS_HIGHER);
6976 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6977 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6978 tempreg, BFD_RELOC_HI16_S);
6979 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
d6bc6245 6980 if (breg != 0)
67c0d1eb 6981 macro_build (NULL, "daddu", "d,v,t",
17a2f251 6982 tempreg, tempreg, breg);
67c0d1eb 6983 macro_build (&offset_expr, s, fmt, treg,
17a2f251 6984 BFD_RELOC_LO16, tempreg);
d6bc6245 6985 }
6caf9ef4
TS
6986
6987 if (mips_relax.sequence)
6988 relax_end ();
8fc2e39e 6989 break;
d6bc6245 6990 }
256ab948 6991
252b5132
RH
6992 if (breg == 0)
6993 {
67c0d1eb 6994 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6caf9ef4 6995 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
252b5132 6996 {
4d7206a2 6997 relax_start (offset_expr.X_add_symbol);
67c0d1eb
RS
6998 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6999 mips_gp_register);
4d7206a2 7000 relax_switch ();
252b5132 7001 }
67c0d1eb
RS
7002 macro_build_lui (&offset_expr, tempreg);
7003 macro_build (&offset_expr, s, fmt, treg,
17a2f251 7004 BFD_RELOC_LO16, tempreg);
4d7206a2
RS
7005 if (mips_relax.sequence)
7006 relax_end ();
252b5132
RH
7007 }
7008 else
7009 {
67c0d1eb 7010 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6caf9ef4 7011 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
252b5132 7012 {
4d7206a2 7013 relax_start (offset_expr.X_add_symbol);
67c0d1eb 7014 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 7015 tempreg, breg, mips_gp_register);
67c0d1eb 7016 macro_build (&offset_expr, s, fmt, treg,
17a2f251 7017 BFD_RELOC_GPREL16, tempreg);
4d7206a2 7018 relax_switch ();
252b5132 7019 }
67c0d1eb
RS
7020 macro_build_lui (&offset_expr, tempreg);
7021 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 7022 tempreg, tempreg, breg);
67c0d1eb 7023 macro_build (&offset_expr, s, fmt, treg,
17a2f251 7024 BFD_RELOC_LO16, tempreg);
4d7206a2
RS
7025 if (mips_relax.sequence)
7026 relax_end ();
252b5132
RH
7027 }
7028 }
0a44bf69 7029 else if (!mips_big_got)
252b5132 7030 {
ed6fb7bd 7031 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
f9419b05 7032
252b5132
RH
7033 /* If this is a reference to an external symbol, we want
7034 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7035 nop
7036 <op> $treg,0($tempreg)
7037 Otherwise we want
7038 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7039 nop
7040 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7041 <op> $treg,0($tempreg)
f5040a92
AO
7042
7043 For NewABI, we want
7044 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
7045 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST)
7046
252b5132
RH
7047 If there is a base register, we add it to $tempreg before
7048 the <op>. If there is a constant, we stick it in the
7049 <op> instruction. We don't handle constants larger than
7050 16 bits, because we have no way to load the upper 16 bits
7051 (actually, we could handle them for the subset of cases
7052 in which we are not using $at). */
9c2799c2 7053 gas_assert (offset_expr.X_op == O_symbol);
f5040a92
AO
7054 if (HAVE_NEWABI)
7055 {
67c0d1eb
RS
7056 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7057 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
f5040a92 7058 if (breg != 0)
67c0d1eb 7059 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 7060 tempreg, tempreg, breg);
67c0d1eb 7061 macro_build (&offset_expr, s, fmt, treg,
17a2f251 7062 BFD_RELOC_MIPS_GOT_OFST, tempreg);
f5040a92
AO
7063 break;
7064 }
252b5132
RH
7065 expr1.X_add_number = offset_expr.X_add_number;
7066 offset_expr.X_add_number = 0;
7067 if (expr1.X_add_number < -0x8000
7068 || expr1.X_add_number >= 0x8000)
7069 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
67c0d1eb
RS
7070 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7071 lw_reloc_type, mips_gp_register);
269137b2 7072 load_delay_nop ();
4d7206a2
RS
7073 relax_start (offset_expr.X_add_symbol);
7074 relax_switch ();
67c0d1eb
RS
7075 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
7076 tempreg, BFD_RELOC_LO16);
4d7206a2 7077 relax_end ();
252b5132 7078 if (breg != 0)
67c0d1eb 7079 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 7080 tempreg, tempreg, breg);
67c0d1eb 7081 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
252b5132 7082 }
0a44bf69 7083 else if (mips_big_got && !HAVE_NEWABI)
252b5132 7084 {
67c0d1eb 7085 int gpdelay;
252b5132
RH
7086
7087 /* If this is a reference to an external symbol, we want
7088 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
7089 addu $tempreg,$tempreg,$gp
7090 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7091 <op> $treg,0($tempreg)
7092 Otherwise we want
7093 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7094 nop
7095 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7096 <op> $treg,0($tempreg)
7097 If there is a base register, we add it to $tempreg before
7098 the <op>. If there is a constant, we stick it in the
7099 <op> instruction. We don't handle constants larger than
7100 16 bits, because we have no way to load the upper 16 bits
7101 (actually, we could handle them for the subset of cases
f5040a92 7102 in which we are not using $at). */
9c2799c2 7103 gas_assert (offset_expr.X_op == O_symbol);
252b5132
RH
7104 expr1.X_add_number = offset_expr.X_add_number;
7105 offset_expr.X_add_number = 0;
7106 if (expr1.X_add_number < -0x8000
7107 || expr1.X_add_number >= 0x8000)
7108 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
67c0d1eb 7109 gpdelay = reg_needs_delay (mips_gp_register);
4d7206a2 7110 relax_start (offset_expr.X_add_symbol);
67c0d1eb 7111 macro_build (&offset_expr, "lui", "t,u", tempreg,
17a2f251 7112 BFD_RELOC_MIPS_GOT_HI16);
67c0d1eb
RS
7113 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
7114 mips_gp_register);
7115 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7116 BFD_RELOC_MIPS_GOT_LO16, tempreg);
4d7206a2 7117 relax_switch ();
67c0d1eb
RS
7118 if (gpdelay)
7119 macro_build (NULL, "nop", "");
7120 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7121 BFD_RELOC_MIPS_GOT16, mips_gp_register);
269137b2 7122 load_delay_nop ();
67c0d1eb
RS
7123 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
7124 tempreg, BFD_RELOC_LO16);
4d7206a2
RS
7125 relax_end ();
7126
252b5132 7127 if (breg != 0)
67c0d1eb 7128 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 7129 tempreg, tempreg, breg);
67c0d1eb 7130 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
252b5132 7131 }
0a44bf69 7132 else if (mips_big_got && HAVE_NEWABI)
f5040a92 7133 {
f5040a92
AO
7134 /* If this is a reference to an external symbol, we want
7135 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
7136 add $tempreg,$tempreg,$gp
7137 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7138 <op> $treg,<ofst>($tempreg)
7139 Otherwise, for local symbols, we want:
7140 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
7141 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST) */
9c2799c2 7142 gas_assert (offset_expr.X_op == O_symbol);
4d7206a2 7143 expr1.X_add_number = offset_expr.X_add_number;
f5040a92
AO
7144 offset_expr.X_add_number = 0;
7145 if (expr1.X_add_number < -0x8000
7146 || expr1.X_add_number >= 0x8000)
7147 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4d7206a2 7148 relax_start (offset_expr.X_add_symbol);
67c0d1eb 7149 macro_build (&offset_expr, "lui", "t,u", tempreg,
17a2f251 7150 BFD_RELOC_MIPS_GOT_HI16);
67c0d1eb
RS
7151 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
7152 mips_gp_register);
7153 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7154 BFD_RELOC_MIPS_GOT_LO16, tempreg);
f5040a92 7155 if (breg != 0)
67c0d1eb 7156 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 7157 tempreg, tempreg, breg);
67c0d1eb 7158 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
684022ea 7159
4d7206a2 7160 relax_switch ();
f5040a92 7161 offset_expr.X_add_number = expr1.X_add_number;
67c0d1eb
RS
7162 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7163 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
f5040a92 7164 if (breg != 0)
67c0d1eb 7165 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 7166 tempreg, tempreg, breg);
67c0d1eb 7167 macro_build (&offset_expr, s, fmt, treg,
17a2f251 7168 BFD_RELOC_MIPS_GOT_OFST, tempreg);
4d7206a2 7169 relax_end ();
f5040a92 7170 }
252b5132
RH
7171 else
7172 abort ();
7173
252b5132
RH
7174 break;
7175
7176 case M_LI:
7177 case M_LI_S:
67c0d1eb 7178 load_register (treg, &imm_expr, 0);
8fc2e39e 7179 break;
252b5132
RH
7180
7181 case M_DLI:
67c0d1eb 7182 load_register (treg, &imm_expr, 1);
8fc2e39e 7183 break;
252b5132
RH
7184
7185 case M_LI_SS:
7186 if (imm_expr.X_op == O_constant)
7187 {
8fc2e39e 7188 used_at = 1;
67c0d1eb
RS
7189 load_register (AT, &imm_expr, 0);
7190 macro_build (NULL, "mtc1", "t,G", AT, treg);
252b5132
RH
7191 break;
7192 }
7193 else
7194 {
9c2799c2 7195 gas_assert (offset_expr.X_op == O_symbol
90ecf173
MR
7196 && strcmp (segment_name (S_GET_SEGMENT
7197 (offset_expr.X_add_symbol)),
7198 ".lit4") == 0
7199 && offset_expr.X_add_number == 0);
67c0d1eb 7200 macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
17a2f251 7201 BFD_RELOC_MIPS_LITERAL, mips_gp_register);
8fc2e39e 7202 break;
252b5132
RH
7203 }
7204
7205 case M_LI_D:
ca4e0257
RS
7206 /* Check if we have a constant in IMM_EXPR. If the GPRs are 64 bits
7207 wide, IMM_EXPR is the entire value. Otherwise IMM_EXPR is the high
7208 order 32 bits of the value and the low order 32 bits are either
7209 zero or in OFFSET_EXPR. */
252b5132
RH
7210 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
7211 {
ca4e0257 7212 if (HAVE_64BIT_GPRS)
67c0d1eb 7213 load_register (treg, &imm_expr, 1);
252b5132
RH
7214 else
7215 {
7216 int hreg, lreg;
7217
7218 if (target_big_endian)
7219 {
7220 hreg = treg;
7221 lreg = treg + 1;
7222 }
7223 else
7224 {
7225 hreg = treg + 1;
7226 lreg = treg;
7227 }
7228
7229 if (hreg <= 31)
67c0d1eb 7230 load_register (hreg, &imm_expr, 0);
252b5132
RH
7231 if (lreg <= 31)
7232 {
7233 if (offset_expr.X_op == O_absent)
67c0d1eb 7234 move_register (lreg, 0);
252b5132
RH
7235 else
7236 {
9c2799c2 7237 gas_assert (offset_expr.X_op == O_constant);
67c0d1eb 7238 load_register (lreg, &offset_expr, 0);
252b5132
RH
7239 }
7240 }
7241 }
8fc2e39e 7242 break;
252b5132
RH
7243 }
7244
7245 /* We know that sym is in the .rdata section. First we get the
7246 upper 16 bits of the address. */
7247 if (mips_pic == NO_PIC)
7248 {
67c0d1eb 7249 macro_build_lui (&offset_expr, AT);
8fc2e39e 7250 used_at = 1;
252b5132 7251 }
0a44bf69 7252 else
252b5132 7253 {
67c0d1eb
RS
7254 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7255 BFD_RELOC_MIPS_GOT16, mips_gp_register);
8fc2e39e 7256 used_at = 1;
252b5132 7257 }
bdaaa2e1 7258
252b5132 7259 /* Now we load the register(s). */
ca4e0257 7260 if (HAVE_64BIT_GPRS)
8fc2e39e
TS
7261 {
7262 used_at = 1;
7263 macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7264 }
252b5132
RH
7265 else
7266 {
8fc2e39e 7267 used_at = 1;
67c0d1eb 7268 macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
f9419b05 7269 if (treg != RA)
252b5132
RH
7270 {
7271 /* FIXME: How in the world do we deal with the possible
7272 overflow here? */
7273 offset_expr.X_add_number += 4;
67c0d1eb 7274 macro_build (&offset_expr, "lw", "t,o(b)",
17a2f251 7275 treg + 1, BFD_RELOC_LO16, AT);
252b5132
RH
7276 }
7277 }
252b5132
RH
7278 break;
7279
7280 case M_LI_DD:
ca4e0257
RS
7281 /* Check if we have a constant in IMM_EXPR. If the FPRs are 64 bits
7282 wide, IMM_EXPR is the entire value and the GPRs are known to be 64
7283 bits wide as well. Otherwise IMM_EXPR is the high order 32 bits of
7284 the value and the low order 32 bits are either zero or in
7285 OFFSET_EXPR. */
252b5132
RH
7286 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
7287 {
8fc2e39e 7288 used_at = 1;
67c0d1eb 7289 load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
ca4e0257
RS
7290 if (HAVE_64BIT_FPRS)
7291 {
9c2799c2 7292 gas_assert (HAVE_64BIT_GPRS);
67c0d1eb 7293 macro_build (NULL, "dmtc1", "t,S", AT, treg);
ca4e0257 7294 }
252b5132
RH
7295 else
7296 {
67c0d1eb 7297 macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
252b5132 7298 if (offset_expr.X_op == O_absent)
67c0d1eb 7299 macro_build (NULL, "mtc1", "t,G", 0, treg);
252b5132
RH
7300 else
7301 {
9c2799c2 7302 gas_assert (offset_expr.X_op == O_constant);
67c0d1eb
RS
7303 load_register (AT, &offset_expr, 0);
7304 macro_build (NULL, "mtc1", "t,G", AT, treg);
252b5132
RH
7305 }
7306 }
7307 break;
7308 }
7309
9c2799c2 7310 gas_assert (offset_expr.X_op == O_symbol
90ecf173 7311 && offset_expr.X_add_number == 0);
252b5132
RH
7312 s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
7313 if (strcmp (s, ".lit8") == 0)
7314 {
e7af610e 7315 if (mips_opts.isa != ISA_MIPS1)
252b5132 7316 {
67c0d1eb 7317 macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
17a2f251 7318 BFD_RELOC_MIPS_LITERAL, mips_gp_register);
8fc2e39e 7319 break;
252b5132 7320 }
c9914766 7321 breg = mips_gp_register;
252b5132
RH
7322 r = BFD_RELOC_MIPS_LITERAL;
7323 goto dob;
7324 }
7325 else
7326 {
9c2799c2 7327 gas_assert (strcmp (s, RDATA_SECTION_NAME) == 0);
8fc2e39e 7328 used_at = 1;
0a44bf69 7329 if (mips_pic != NO_PIC)
67c0d1eb
RS
7330 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7331 BFD_RELOC_MIPS_GOT16, mips_gp_register);
252b5132
RH
7332 else
7333 {
7334 /* FIXME: This won't work for a 64 bit address. */
67c0d1eb 7335 macro_build_lui (&offset_expr, AT);
252b5132 7336 }
bdaaa2e1 7337
e7af610e 7338 if (mips_opts.isa != ISA_MIPS1)
252b5132 7339 {
67c0d1eb
RS
7340 macro_build (&offset_expr, "ldc1", "T,o(b)",
7341 treg, BFD_RELOC_LO16, AT);
252b5132
RH
7342 break;
7343 }
7344 breg = AT;
7345 r = BFD_RELOC_LO16;
7346 goto dob;
7347 }
7348
7349 case M_L_DOB:
252b5132
RH
7350 /* Even on a big endian machine $fn comes before $fn+1. We have
7351 to adjust when loading from memory. */
7352 r = BFD_RELOC_LO16;
7353 dob:
9c2799c2 7354 gas_assert (mips_opts.isa == ISA_MIPS1);
67c0d1eb 7355 macro_build (&offset_expr, "lwc1", "T,o(b)",
17a2f251 7356 target_big_endian ? treg + 1 : treg, r, breg);
252b5132
RH
7357 /* FIXME: A possible overflow which I don't know how to deal
7358 with. */
7359 offset_expr.X_add_number += 4;
67c0d1eb 7360 macro_build (&offset_expr, "lwc1", "T,o(b)",
17a2f251 7361 target_big_endian ? treg : treg + 1, r, breg);
252b5132
RH
7362 break;
7363
c4a68bea
MR
7364 case M_S_DOB:
7365 gas_assert (mips_opts.isa == ISA_MIPS1);
7366 /* Even on a big endian machine $fn comes before $fn+1. We have
7367 to adjust when storing to memory. */
7368 macro_build (&offset_expr, "swc1", "T,o(b)",
7369 target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7370 offset_expr.X_add_number += 4;
7371 macro_build (&offset_expr, "swc1", "T,o(b)",
7372 target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7373 break;
7374
252b5132
RH
7375 case M_L_DAB:
7376 /*
7377 * The MIPS assembler seems to check for X_add_number not
7378 * being double aligned and generating:
7379 * lui at,%hi(foo+1)
7380 * addu at,at,v1
7381 * addiu at,at,%lo(foo+1)
7382 * lwc1 f2,0(at)
7383 * lwc1 f3,4(at)
7384 * But, the resulting address is the same after relocation so why
7385 * generate the extra instruction?
7386 */
bdaaa2e1 7387 /* Itbl support may require additional care here. */
252b5132 7388 coproc = 1;
e7af610e 7389 if (mips_opts.isa != ISA_MIPS1)
252b5132
RH
7390 {
7391 s = "ldc1";
7392 goto ld;
7393 }
7394
7395 s = "lwc1";
7396 fmt = "T,o(b)";
7397 goto ldd_std;
7398
7399 case M_S_DAB:
e7af610e 7400 if (mips_opts.isa != ISA_MIPS1)
252b5132
RH
7401 {
7402 s = "sdc1";
7403 goto st;
7404 }
7405
7406 s = "swc1";
7407 fmt = "T,o(b)";
bdaaa2e1 7408 /* Itbl support may require additional care here. */
252b5132
RH
7409 coproc = 1;
7410 goto ldd_std;
7411
7412 case M_LD_AB:
ca4e0257 7413 if (HAVE_64BIT_GPRS)
252b5132
RH
7414 {
7415 s = "ld";
7416 goto ld;
7417 }
7418
7419 s = "lw";
7420 fmt = "t,o(b)";
7421 goto ldd_std;
7422
7423 case M_SD_AB:
ca4e0257 7424 if (HAVE_64BIT_GPRS)
252b5132
RH
7425 {
7426 s = "sd";
7427 goto st;
7428 }
7429
7430 s = "sw";
7431 fmt = "t,o(b)";
7432
7433 ldd_std:
7434 if (offset_expr.X_op != O_symbol
7435 && offset_expr.X_op != O_constant)
7436 {
f71d0d44 7437 as_bad (_("Expression too complex"));
252b5132
RH
7438 offset_expr.X_op = O_constant;
7439 }
7440
2051e8c4
MR
7441 if (HAVE_32BIT_ADDRESSES
7442 && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
55e08f71
NC
7443 {
7444 char value [32];
7445
7446 sprintf_vma (value, offset_expr.X_add_number);
20e1fcfd 7447 as_bad (_("Number (0x%s) larger than 32 bits"), value);
55e08f71 7448 }
2051e8c4 7449
252b5132
RH
7450 /* Even on a big endian machine $fn comes before $fn+1. We have
7451 to adjust when loading from memory. We set coproc if we must
7452 load $fn+1 first. */
bdaaa2e1 7453 /* Itbl support may require additional care here. */
90ecf173 7454 if (!target_big_endian)
252b5132
RH
7455 coproc = 0;
7456
90ecf173 7457 if (mips_pic == NO_PIC || offset_expr.X_op == O_constant)
252b5132
RH
7458 {
7459 /* If this is a reference to a GP relative symbol, we want
cdf6fd85
TS
7460 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
7461 <op> $treg+1,<sym>+4($gp) (BFD_RELOC_GPREL16)
252b5132
RH
7462 If we have a base register, we use this
7463 addu $at,$breg,$gp
cdf6fd85
TS
7464 <op> $treg,<sym>($at) (BFD_RELOC_GPREL16)
7465 <op> $treg+1,<sym>+4($at) (BFD_RELOC_GPREL16)
252b5132
RH
7466 If this is not a GP relative symbol, we want
7467 lui $at,<sym> (BFD_RELOC_HI16_S)
7468 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
7469 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
7470 If there is a base register, we add it to $at after the
7471 lui instruction. If there is a constant, we always use
7472 the last case. */
39a59cf8
MR
7473 if (offset_expr.X_op == O_symbol
7474 && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6caf9ef4 7475 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
252b5132 7476 {
4d7206a2 7477 relax_start (offset_expr.X_add_symbol);
252b5132
RH
7478 if (breg == 0)
7479 {
c9914766 7480 tempreg = mips_gp_register;
252b5132
RH
7481 }
7482 else
7483 {
67c0d1eb 7484 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 7485 AT, breg, mips_gp_register);
252b5132 7486 tempreg = AT;
252b5132
RH
7487 used_at = 1;
7488 }
7489
beae10d5 7490 /* Itbl support may require additional care here. */
67c0d1eb 7491 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
17a2f251 7492 BFD_RELOC_GPREL16, tempreg);
252b5132
RH
7493 offset_expr.X_add_number += 4;
7494
7495 /* Set mips_optimize to 2 to avoid inserting an
7496 undesired nop. */
7497 hold_mips_optimize = mips_optimize;
7498 mips_optimize = 2;
beae10d5 7499 /* Itbl support may require additional care here. */
67c0d1eb 7500 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
17a2f251 7501 BFD_RELOC_GPREL16, tempreg);
252b5132
RH
7502 mips_optimize = hold_mips_optimize;
7503
4d7206a2 7504 relax_switch ();
252b5132 7505
0970e49e 7506 offset_expr.X_add_number -= 4;
252b5132 7507 }
8fc2e39e 7508 used_at = 1;
67c0d1eb 7509 macro_build_lui (&offset_expr, AT);
252b5132 7510 if (breg != 0)
67c0d1eb 7511 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
beae10d5 7512 /* Itbl support may require additional care here. */
67c0d1eb 7513 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
17a2f251 7514 BFD_RELOC_LO16, AT);
252b5132
RH
7515 /* FIXME: How do we handle overflow here? */
7516 offset_expr.X_add_number += 4;
beae10d5 7517 /* Itbl support may require additional care here. */
67c0d1eb 7518 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
17a2f251 7519 BFD_RELOC_LO16, AT);
4d7206a2
RS
7520 if (mips_relax.sequence)
7521 relax_end ();
bdaaa2e1 7522 }
0a44bf69 7523 else if (!mips_big_got)
252b5132 7524 {
252b5132
RH
7525 /* If this is a reference to an external symbol, we want
7526 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7527 nop
7528 <op> $treg,0($at)
7529 <op> $treg+1,4($at)
7530 Otherwise we want
7531 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7532 nop
7533 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
7534 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
7535 If there is a base register we add it to $at before the
7536 lwc1 instructions. If there is a constant we include it
7537 in the lwc1 instructions. */
7538 used_at = 1;
7539 expr1.X_add_number = offset_expr.X_add_number;
252b5132
RH
7540 if (expr1.X_add_number < -0x8000
7541 || expr1.X_add_number >= 0x8000 - 4)
7542 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
67c0d1eb 7543 load_got_offset (AT, &offset_expr);
269137b2 7544 load_delay_nop ();
252b5132 7545 if (breg != 0)
67c0d1eb 7546 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
252b5132
RH
7547
7548 /* Set mips_optimize to 2 to avoid inserting an undesired
7549 nop. */
7550 hold_mips_optimize = mips_optimize;
7551 mips_optimize = 2;
4d7206a2 7552
beae10d5 7553 /* Itbl support may require additional care here. */
4d7206a2 7554 relax_start (offset_expr.X_add_symbol);
67c0d1eb
RS
7555 macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7556 BFD_RELOC_LO16, AT);
4d7206a2 7557 expr1.X_add_number += 4;
67c0d1eb
RS
7558 macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7559 BFD_RELOC_LO16, AT);
4d7206a2 7560 relax_switch ();
67c0d1eb
RS
7561 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7562 BFD_RELOC_LO16, AT);
4d7206a2 7563 offset_expr.X_add_number += 4;
67c0d1eb
RS
7564 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7565 BFD_RELOC_LO16, AT);
4d7206a2 7566 relax_end ();
252b5132 7567
4d7206a2 7568 mips_optimize = hold_mips_optimize;
252b5132 7569 }
0a44bf69 7570 else if (mips_big_got)
252b5132 7571 {
67c0d1eb 7572 int gpdelay;
252b5132
RH
7573
7574 /* If this is a reference to an external symbol, we want
7575 lui $at,<sym> (BFD_RELOC_MIPS_GOT_HI16)
7576 addu $at,$at,$gp
7577 lw $at,<sym>($at) (BFD_RELOC_MIPS_GOT_LO16)
7578 nop
7579 <op> $treg,0($at)
7580 <op> $treg+1,4($at)
7581 Otherwise we want
7582 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7583 nop
7584 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
7585 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
7586 If there is a base register we add it to $at before the
7587 lwc1 instructions. If there is a constant we include it
7588 in the lwc1 instructions. */
7589 used_at = 1;
7590 expr1.X_add_number = offset_expr.X_add_number;
7591 offset_expr.X_add_number = 0;
7592 if (expr1.X_add_number < -0x8000
7593 || expr1.X_add_number >= 0x8000 - 4)
7594 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
67c0d1eb 7595 gpdelay = reg_needs_delay (mips_gp_register);
4d7206a2 7596 relax_start (offset_expr.X_add_symbol);
67c0d1eb
RS
7597 macro_build (&offset_expr, "lui", "t,u",
7598 AT, BFD_RELOC_MIPS_GOT_HI16);
7599 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 7600 AT, AT, mips_gp_register);
67c0d1eb 7601 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
17a2f251 7602 AT, BFD_RELOC_MIPS_GOT_LO16, AT);
269137b2 7603 load_delay_nop ();
252b5132 7604 if (breg != 0)
67c0d1eb 7605 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
beae10d5 7606 /* Itbl support may require additional care here. */
67c0d1eb 7607 macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
17a2f251 7608 BFD_RELOC_LO16, AT);
252b5132
RH
7609 expr1.X_add_number += 4;
7610
7611 /* Set mips_optimize to 2 to avoid inserting an undesired
7612 nop. */
7613 hold_mips_optimize = mips_optimize;
7614 mips_optimize = 2;
beae10d5 7615 /* Itbl support may require additional care here. */
67c0d1eb 7616 macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
17a2f251 7617 BFD_RELOC_LO16, AT);
252b5132
RH
7618 mips_optimize = hold_mips_optimize;
7619 expr1.X_add_number -= 4;
7620
4d7206a2
RS
7621 relax_switch ();
7622 offset_expr.X_add_number = expr1.X_add_number;
67c0d1eb
RS
7623 if (gpdelay)
7624 macro_build (NULL, "nop", "");
7625 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7626 BFD_RELOC_MIPS_GOT16, mips_gp_register);
269137b2 7627 load_delay_nop ();
252b5132 7628 if (breg != 0)
67c0d1eb 7629 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
beae10d5 7630 /* Itbl support may require additional care here. */
67c0d1eb
RS
7631 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7632 BFD_RELOC_LO16, AT);
4d7206a2 7633 offset_expr.X_add_number += 4;
252b5132
RH
7634
7635 /* Set mips_optimize to 2 to avoid inserting an undesired
7636 nop. */
7637 hold_mips_optimize = mips_optimize;
7638 mips_optimize = 2;
beae10d5 7639 /* Itbl support may require additional care here. */
67c0d1eb
RS
7640 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7641 BFD_RELOC_LO16, AT);
252b5132 7642 mips_optimize = hold_mips_optimize;
4d7206a2 7643 relax_end ();
252b5132 7644 }
252b5132
RH
7645 else
7646 abort ();
7647
252b5132
RH
7648 break;
7649
7650 case M_LD_OB:
704897fb 7651 s = HAVE_64BIT_GPRS ? "ld" : "lw";
252b5132
RH
7652 goto sd_ob;
7653 case M_SD_OB:
704897fb 7654 s = HAVE_64BIT_GPRS ? "sd" : "sw";
252b5132 7655 sd_ob:
4614d845
MR
7656 macro_build (&offset_expr, s, "t,o(b)", treg,
7657 -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
7658 breg);
704897fb
MR
7659 if (!HAVE_64BIT_GPRS)
7660 {
7661 offset_expr.X_add_number += 4;
7662 macro_build (&offset_expr, s, "t,o(b)", treg + 1,
4614d845
MR
7663 -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
7664 breg);
704897fb 7665 }
8fc2e39e 7666 break;
252b5132
RH
7667
7668 /* New code added to support COPZ instructions.
7669 This code builds table entries out of the macros in mip_opcodes.
7670 R4000 uses interlocks to handle coproc delays.
7671 Other chips (like the R3000) require nops to be inserted for delays.
7672
f72c8c98 7673 FIXME: Currently, we require that the user handle delays.
252b5132
RH
7674 In order to fill delay slots for non-interlocked chips,
7675 we must have a way to specify delays based on the coprocessor.
7676 Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
7677 What are the side-effects of the cop instruction?
7678 What cache support might we have and what are its effects?
7679 Both coprocessor & memory require delays. how long???
bdaaa2e1 7680 What registers are read/set/modified?
252b5132
RH
7681
7682 If an itbl is provided to interpret cop instructions,
bdaaa2e1 7683 this knowledge can be encoded in the itbl spec. */
252b5132
RH
7684
7685 case M_COP0:
7686 s = "c0";
7687 goto copz;
7688 case M_COP1:
7689 s = "c1";
7690 goto copz;
7691 case M_COP2:
7692 s = "c2";
7693 goto copz;
7694 case M_COP3:
7695 s = "c3";
7696 copz:
b19e8a9b
AN
7697 if (NO_ISA_COP (mips_opts.arch)
7698 && (ip->insn_mo->pinfo2 & INSN2_M_FP_S) == 0)
7699 {
7700 as_bad (_("opcode not supported on this processor: %s"),
7701 mips_cpu_info_from_arch (mips_opts.arch)->name);
7702 break;
7703 }
7704
252b5132
RH
7705 /* For now we just do C (same as Cz). The parameter will be
7706 stored in insn_opcode by mips_ip. */
67c0d1eb 7707 macro_build (NULL, s, "C", ip->insn_opcode);
8fc2e39e 7708 break;
252b5132 7709
ea1fb5dc 7710 case M_MOVE:
67c0d1eb 7711 move_register (dreg, sreg);
8fc2e39e 7712 break;
ea1fb5dc 7713
252b5132
RH
7714 case M_DMUL:
7715 dbl = 1;
7716 case M_MUL:
67c0d1eb
RS
7717 macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7718 macro_build (NULL, "mflo", "d", dreg);
8fc2e39e 7719 break;
252b5132
RH
7720
7721 case M_DMUL_I:
7722 dbl = 1;
7723 case M_MUL_I:
7724 /* The MIPS assembler some times generates shifts and adds. I'm
7725 not trying to be that fancy. GCC should do this for us
7726 anyway. */
8fc2e39e 7727 used_at = 1;
67c0d1eb
RS
7728 load_register (AT, &imm_expr, dbl);
7729 macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
7730 macro_build (NULL, "mflo", "d", dreg);
252b5132
RH
7731 break;
7732
7733 case M_DMULO_I:
7734 dbl = 1;
7735 case M_MULO_I:
7736 imm = 1;
7737 goto do_mulo;
7738
7739 case M_DMULO:
7740 dbl = 1;
7741 case M_MULO:
7742 do_mulo:
7d10b47d 7743 start_noreorder ();
8fc2e39e 7744 used_at = 1;
252b5132 7745 if (imm)
67c0d1eb
RS
7746 load_register (AT, &imm_expr, dbl);
7747 macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
7748 macro_build (NULL, "mflo", "d", dreg);
7749 macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
7750 macro_build (NULL, "mfhi", "d", AT);
252b5132 7751 if (mips_trap)
67c0d1eb 7752 macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
252b5132
RH
7753 else
7754 {
7755 expr1.X_add_number = 8;
67c0d1eb 7756 macro_build (&expr1, "beq", "s,t,p", dreg, AT);
a605d2b3 7757 macro_build (NULL, "nop", "");
67c0d1eb 7758 macro_build (NULL, "break", "c", 6);
252b5132 7759 }
7d10b47d 7760 end_noreorder ();
67c0d1eb 7761 macro_build (NULL, "mflo", "d", dreg);
252b5132
RH
7762 break;
7763
7764 case M_DMULOU_I:
7765 dbl = 1;
7766 case M_MULOU_I:
7767 imm = 1;
7768 goto do_mulou;
7769
7770 case M_DMULOU:
7771 dbl = 1;
7772 case M_MULOU:
7773 do_mulou:
7d10b47d 7774 start_noreorder ();
8fc2e39e 7775 used_at = 1;
252b5132 7776 if (imm)
67c0d1eb
RS
7777 load_register (AT, &imm_expr, dbl);
7778 macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
17a2f251 7779 sreg, imm ? AT : treg);
67c0d1eb
RS
7780 macro_build (NULL, "mfhi", "d", AT);
7781 macro_build (NULL, "mflo", "d", dreg);
252b5132 7782 if (mips_trap)
c80c840e 7783 macro_build (NULL, "tne", "s,t,q", AT, ZERO, 6);
252b5132
RH
7784 else
7785 {
7786 expr1.X_add_number = 8;
c80c840e 7787 macro_build (&expr1, "beq", "s,t,p", AT, ZERO);
a605d2b3 7788 macro_build (NULL, "nop", "");
67c0d1eb 7789 macro_build (NULL, "break", "c", 6);
252b5132 7790 }
7d10b47d 7791 end_noreorder ();
252b5132
RH
7792 break;
7793
771c7ce4 7794 case M_DROL:
fef14a42 7795 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
82dd0097
CD
7796 {
7797 if (dreg == sreg)
7798 {
7799 tempreg = AT;
7800 used_at = 1;
7801 }
7802 else
7803 {
7804 tempreg = dreg;
82dd0097 7805 }
67c0d1eb
RS
7806 macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7807 macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
8fc2e39e 7808 break;
82dd0097 7809 }
8fc2e39e 7810 used_at = 1;
c80c840e 7811 macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
67c0d1eb
RS
7812 macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
7813 macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
7814 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
771c7ce4
TS
7815 break;
7816
252b5132 7817 case M_ROL:
fef14a42 7818 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
82dd0097
CD
7819 {
7820 if (dreg == sreg)
7821 {
7822 tempreg = AT;
7823 used_at = 1;
7824 }
7825 else
7826 {
7827 tempreg = dreg;
82dd0097 7828 }
67c0d1eb
RS
7829 macro_build (NULL, "negu", "d,w", tempreg, treg);
7830 macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
8fc2e39e 7831 break;
82dd0097 7832 }
8fc2e39e 7833 used_at = 1;
c80c840e 7834 macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
67c0d1eb
RS
7835 macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
7836 macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
7837 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
252b5132
RH
7838 break;
7839
771c7ce4
TS
7840 case M_DROL_I:
7841 {
7842 unsigned int rot;
91d6fa6a
NC
7843 char *l;
7844 char *rr;
771c7ce4
TS
7845
7846 if (imm_expr.X_op != O_constant)
82dd0097 7847 as_bad (_("Improper rotate count"));
771c7ce4 7848 rot = imm_expr.X_add_number & 0x3f;
fef14a42 7849 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
60b63b72
RS
7850 {
7851 rot = (64 - rot) & 0x3f;
7852 if (rot >= 32)
67c0d1eb 7853 macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
60b63b72 7854 else
67c0d1eb 7855 macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
8fc2e39e 7856 break;
60b63b72 7857 }
483fc7cd 7858 if (rot == 0)
483fc7cd 7859 {
67c0d1eb 7860 macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
8fc2e39e 7861 break;
483fc7cd 7862 }
82dd0097 7863 l = (rot < 0x20) ? "dsll" : "dsll32";
91d6fa6a 7864 rr = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
82dd0097 7865 rot &= 0x1f;
8fc2e39e 7866 used_at = 1;
67c0d1eb 7867 macro_build (NULL, l, "d,w,<", AT, sreg, rot);
91d6fa6a 7868 macro_build (NULL, rr, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
67c0d1eb 7869 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
771c7ce4
TS
7870 }
7871 break;
7872
252b5132 7873 case M_ROL_I:
771c7ce4
TS
7874 {
7875 unsigned int rot;
7876
7877 if (imm_expr.X_op != O_constant)
82dd0097 7878 as_bad (_("Improper rotate count"));
771c7ce4 7879 rot = imm_expr.X_add_number & 0x1f;
fef14a42 7880 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
60b63b72 7881 {
67c0d1eb 7882 macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
8fc2e39e 7883 break;
60b63b72 7884 }
483fc7cd 7885 if (rot == 0)
483fc7cd 7886 {
67c0d1eb 7887 macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
8fc2e39e 7888 break;
483fc7cd 7889 }
8fc2e39e 7890 used_at = 1;
67c0d1eb
RS
7891 macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
7892 macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7893 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
771c7ce4
TS
7894 }
7895 break;
7896
7897 case M_DROR:
fef14a42 7898 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
82dd0097 7899 {
67c0d1eb 7900 macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
8fc2e39e 7901 break;
82dd0097 7902 }
8fc2e39e 7903 used_at = 1;
c80c840e 7904 macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
67c0d1eb
RS
7905 macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
7906 macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
7907 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
252b5132
RH
7908 break;
7909
7910 case M_ROR:
fef14a42 7911 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
82dd0097 7912 {
67c0d1eb 7913 macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
8fc2e39e 7914 break;
82dd0097 7915 }
8fc2e39e 7916 used_at = 1;
c80c840e 7917 macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
67c0d1eb
RS
7918 macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7919 macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7920 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
252b5132
RH
7921 break;
7922
771c7ce4
TS
7923 case M_DROR_I:
7924 {
7925 unsigned int rot;
91d6fa6a
NC
7926 char *l;
7927 char *rr;
771c7ce4
TS
7928
7929 if (imm_expr.X_op != O_constant)
82dd0097 7930 as_bad (_("Improper rotate count"));
771c7ce4 7931 rot = imm_expr.X_add_number & 0x3f;
fef14a42 7932 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
82dd0097
CD
7933 {
7934 if (rot >= 32)
67c0d1eb 7935 macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
82dd0097 7936 else
67c0d1eb 7937 macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
8fc2e39e 7938 break;
82dd0097 7939 }
483fc7cd 7940 if (rot == 0)
483fc7cd 7941 {
67c0d1eb 7942 macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
8fc2e39e 7943 break;
483fc7cd 7944 }
91d6fa6a 7945 rr = (rot < 0x20) ? "dsrl" : "dsrl32";
82dd0097
CD
7946 l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7947 rot &= 0x1f;
8fc2e39e 7948 used_at = 1;
91d6fa6a 7949 macro_build (NULL, rr, "d,w,<", AT, sreg, rot);
67c0d1eb
RS
7950 macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7951 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
771c7ce4
TS
7952 }
7953 break;
7954
252b5132 7955 case M_ROR_I:
771c7ce4
TS
7956 {
7957 unsigned int rot;
7958
7959 if (imm_expr.X_op != O_constant)
82dd0097 7960 as_bad (_("Improper rotate count"));
771c7ce4 7961 rot = imm_expr.X_add_number & 0x1f;
fef14a42 7962 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
82dd0097 7963 {
67c0d1eb 7964 macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
8fc2e39e 7965 break;
82dd0097 7966 }
483fc7cd 7967 if (rot == 0)
483fc7cd 7968 {
67c0d1eb 7969 macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
8fc2e39e 7970 break;
483fc7cd 7971 }
8fc2e39e 7972 used_at = 1;
67c0d1eb
RS
7973 macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7974 macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7975 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
771c7ce4 7976 }
252b5132
RH
7977 break;
7978
252b5132
RH
7979 case M_SEQ:
7980 if (sreg == 0)
67c0d1eb 7981 macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
252b5132 7982 else if (treg == 0)
67c0d1eb 7983 macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
252b5132
RH
7984 else
7985 {
67c0d1eb
RS
7986 macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7987 macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
252b5132 7988 }
8fc2e39e 7989 break;
252b5132
RH
7990
7991 case M_SEQ_I:
7992 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7993 {
67c0d1eb 7994 macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
8fc2e39e 7995 break;
252b5132
RH
7996 }
7997 if (sreg == 0)
7998 {
7999 as_warn (_("Instruction %s: result is always false"),
8000 ip->insn_mo->name);
67c0d1eb 8001 move_register (dreg, 0);
8fc2e39e 8002 break;
252b5132 8003 }
dd3cbb7e
NC
8004 if (CPU_HAS_SEQ (mips_opts.arch)
8005 && -512 <= imm_expr.X_add_number
8006 && imm_expr.X_add_number < 512)
8007 {
8008 macro_build (NULL, "seqi", "t,r,+Q", dreg, sreg,
750bdd57 8009 (int) imm_expr.X_add_number);
dd3cbb7e
NC
8010 break;
8011 }
252b5132
RH
8012 if (imm_expr.X_op == O_constant
8013 && imm_expr.X_add_number >= 0
8014 && imm_expr.X_add_number < 0x10000)
8015 {
67c0d1eb 8016 macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
252b5132
RH
8017 }
8018 else if (imm_expr.X_op == O_constant
8019 && imm_expr.X_add_number > -0x8000
8020 && imm_expr.X_add_number < 0)
8021 {
8022 imm_expr.X_add_number = -imm_expr.X_add_number;
67c0d1eb 8023 macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
17a2f251 8024 "t,r,j", dreg, sreg, BFD_RELOC_LO16);
252b5132 8025 }
dd3cbb7e
NC
8026 else if (CPU_HAS_SEQ (mips_opts.arch))
8027 {
8028 used_at = 1;
8029 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8030 macro_build (NULL, "seq", "d,v,t", dreg, sreg, AT);
8031 break;
8032 }
252b5132
RH
8033 else
8034 {
67c0d1eb
RS
8035 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8036 macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
252b5132
RH
8037 used_at = 1;
8038 }
67c0d1eb 8039 macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
8fc2e39e 8040 break;
252b5132
RH
8041
8042 case M_SGE: /* sreg >= treg <==> not (sreg < treg) */
8043 s = "slt";
8044 goto sge;
8045 case M_SGEU:
8046 s = "sltu";
8047 sge:
67c0d1eb
RS
8048 macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
8049 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
8fc2e39e 8050 break;
252b5132
RH
8051
8052 case M_SGE_I: /* sreg >= I <==> not (sreg < I) */
8053 case M_SGEU_I:
8054 if (imm_expr.X_op == O_constant
8055 && imm_expr.X_add_number >= -0x8000
8056 && imm_expr.X_add_number < 0x8000)
8057 {
67c0d1eb
RS
8058 macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
8059 dreg, sreg, BFD_RELOC_LO16);
252b5132
RH
8060 }
8061 else
8062 {
67c0d1eb
RS
8063 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8064 macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
8065 dreg, sreg, AT);
252b5132
RH
8066 used_at = 1;
8067 }
67c0d1eb 8068 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
8fc2e39e 8069 break;
252b5132
RH
8070
8071 case M_SGT: /* sreg > treg <==> treg < sreg */
8072 s = "slt";
8073 goto sgt;
8074 case M_SGTU:
8075 s = "sltu";
8076 sgt:
67c0d1eb 8077 macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
8fc2e39e 8078 break;
252b5132
RH
8079
8080 case M_SGT_I: /* sreg > I <==> I < sreg */
8081 s = "slt";
8082 goto sgti;
8083 case M_SGTU_I:
8084 s = "sltu";
8085 sgti:
8fc2e39e 8086 used_at = 1;
67c0d1eb
RS
8087 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8088 macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
252b5132
RH
8089 break;
8090
2396cfb9 8091 case M_SLE: /* sreg <= treg <==> treg >= sreg <==> not (treg < sreg) */
252b5132
RH
8092 s = "slt";
8093 goto sle;
8094 case M_SLEU:
8095 s = "sltu";
8096 sle:
67c0d1eb
RS
8097 macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
8098 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
8fc2e39e 8099 break;
252b5132 8100
2396cfb9 8101 case M_SLE_I: /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
252b5132
RH
8102 s = "slt";
8103 goto slei;
8104 case M_SLEU_I:
8105 s = "sltu";
8106 slei:
8fc2e39e 8107 used_at = 1;
67c0d1eb
RS
8108 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8109 macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
8110 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
252b5132
RH
8111 break;
8112
8113 case M_SLT_I:
8114 if (imm_expr.X_op == O_constant
8115 && imm_expr.X_add_number >= -0x8000
8116 && imm_expr.X_add_number < 0x8000)
8117 {
67c0d1eb 8118 macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
8fc2e39e 8119 break;
252b5132 8120 }
8fc2e39e 8121 used_at = 1;
67c0d1eb
RS
8122 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8123 macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
252b5132
RH
8124 break;
8125
8126 case M_SLTU_I:
8127 if (imm_expr.X_op == O_constant
8128 && imm_expr.X_add_number >= -0x8000
8129 && imm_expr.X_add_number < 0x8000)
8130 {
67c0d1eb 8131 macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
17a2f251 8132 BFD_RELOC_LO16);
8fc2e39e 8133 break;
252b5132 8134 }
8fc2e39e 8135 used_at = 1;
67c0d1eb
RS
8136 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8137 macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
252b5132
RH
8138 break;
8139
8140 case M_SNE:
8141 if (sreg == 0)
67c0d1eb 8142 macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
252b5132 8143 else if (treg == 0)
67c0d1eb 8144 macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
252b5132
RH
8145 else
8146 {
67c0d1eb
RS
8147 macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
8148 macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
252b5132 8149 }
8fc2e39e 8150 break;
252b5132
RH
8151
8152 case M_SNE_I:
8153 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
8154 {
67c0d1eb 8155 macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
8fc2e39e 8156 break;
252b5132
RH
8157 }
8158 if (sreg == 0)
8159 {
8160 as_warn (_("Instruction %s: result is always true"),
8161 ip->insn_mo->name);
67c0d1eb
RS
8162 macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
8163 dreg, 0, BFD_RELOC_LO16);
8fc2e39e 8164 break;
252b5132 8165 }
dd3cbb7e
NC
8166 if (CPU_HAS_SEQ (mips_opts.arch)
8167 && -512 <= imm_expr.X_add_number
8168 && imm_expr.X_add_number < 512)
8169 {
8170 macro_build (NULL, "snei", "t,r,+Q", dreg, sreg,
750bdd57 8171 (int) imm_expr.X_add_number);
dd3cbb7e
NC
8172 break;
8173 }
252b5132
RH
8174 if (imm_expr.X_op == O_constant
8175 && imm_expr.X_add_number >= 0
8176 && imm_expr.X_add_number < 0x10000)
8177 {
67c0d1eb 8178 macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
252b5132
RH
8179 }
8180 else if (imm_expr.X_op == O_constant
8181 && imm_expr.X_add_number > -0x8000
8182 && imm_expr.X_add_number < 0)
8183 {
8184 imm_expr.X_add_number = -imm_expr.X_add_number;
67c0d1eb 8185 macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
17a2f251 8186 "t,r,j", dreg, sreg, BFD_RELOC_LO16);
252b5132 8187 }
dd3cbb7e
NC
8188 else if (CPU_HAS_SEQ (mips_opts.arch))
8189 {
8190 used_at = 1;
8191 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8192 macro_build (NULL, "sne", "d,v,t", dreg, sreg, AT);
8193 break;
8194 }
252b5132
RH
8195 else
8196 {
67c0d1eb
RS
8197 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8198 macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
252b5132
RH
8199 used_at = 1;
8200 }
67c0d1eb 8201 macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
8fc2e39e 8202 break;
252b5132
RH
8203
8204 case M_DSUB_I:
8205 dbl = 1;
8206 case M_SUB_I:
8207 if (imm_expr.X_op == O_constant
8208 && imm_expr.X_add_number > -0x8000
8209 && imm_expr.X_add_number <= 0x8000)
8210 {
8211 imm_expr.X_add_number = -imm_expr.X_add_number;
67c0d1eb
RS
8212 macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
8213 dreg, sreg, BFD_RELOC_LO16);
8fc2e39e 8214 break;
252b5132 8215 }
8fc2e39e 8216 used_at = 1;
67c0d1eb
RS
8217 load_register (AT, &imm_expr, dbl);
8218 macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
252b5132
RH
8219 break;
8220
8221 case M_DSUBU_I:
8222 dbl = 1;
8223 case M_SUBU_I:
8224 if (imm_expr.X_op == O_constant
8225 && imm_expr.X_add_number > -0x8000
8226 && imm_expr.X_add_number <= 0x8000)
8227 {
8228 imm_expr.X_add_number = -imm_expr.X_add_number;
67c0d1eb
RS
8229 macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
8230 dreg, sreg, BFD_RELOC_LO16);
8fc2e39e 8231 break;
252b5132 8232 }
8fc2e39e 8233 used_at = 1;
67c0d1eb
RS
8234 load_register (AT, &imm_expr, dbl);
8235 macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
252b5132
RH
8236 break;
8237
8238 case M_TEQ_I:
8239 s = "teq";
8240 goto trap;
8241 case M_TGE_I:
8242 s = "tge";
8243 goto trap;
8244 case M_TGEU_I:
8245 s = "tgeu";
8246 goto trap;
8247 case M_TLT_I:
8248 s = "tlt";
8249 goto trap;
8250 case M_TLTU_I:
8251 s = "tltu";
8252 goto trap;
8253 case M_TNE_I:
8254 s = "tne";
8255 trap:
8fc2e39e 8256 used_at = 1;
67c0d1eb
RS
8257 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8258 macro_build (NULL, s, "s,t", sreg, AT);
252b5132
RH
8259 break;
8260
252b5132 8261 case M_TRUNCWS:
43841e91 8262 case M_TRUNCWD:
9c2799c2 8263 gas_assert (mips_opts.isa == ISA_MIPS1);
8fc2e39e 8264 used_at = 1;
252b5132
RH
8265 sreg = (ip->insn_opcode >> 11) & 0x1f; /* floating reg */
8266 dreg = (ip->insn_opcode >> 06) & 0x1f; /* floating reg */
8267
8268 /*
8269 * Is the double cfc1 instruction a bug in the mips assembler;
8270 * or is there a reason for it?
8271 */
7d10b47d 8272 start_noreorder ();
67c0d1eb
RS
8273 macro_build (NULL, "cfc1", "t,G", treg, RA);
8274 macro_build (NULL, "cfc1", "t,G", treg, RA);
8275 macro_build (NULL, "nop", "");
252b5132 8276 expr1.X_add_number = 3;
67c0d1eb 8277 macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
252b5132 8278 expr1.X_add_number = 2;
67c0d1eb
RS
8279 macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
8280 macro_build (NULL, "ctc1", "t,G", AT, RA);
8281 macro_build (NULL, "nop", "");
8282 macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
8283 dreg, sreg);
8284 macro_build (NULL, "ctc1", "t,G", treg, RA);
8285 macro_build (NULL, "nop", "");
7d10b47d 8286 end_noreorder ();
252b5132
RH
8287 break;
8288
8289 case M_ULH:
8290 s = "lb";
8291 goto ulh;
8292 case M_ULHU:
8293 s = "lbu";
8294 ulh:
8fc2e39e 8295 used_at = 1;
252b5132 8296 if (offset_expr.X_add_number >= 0x7fff)
f71d0d44 8297 as_bad (_("Operand overflow"));
90ecf173 8298 if (!target_big_endian)
f9419b05 8299 ++offset_expr.X_add_number;
67c0d1eb 8300 macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
90ecf173 8301 if (!target_big_endian)
f9419b05 8302 --offset_expr.X_add_number;
252b5132 8303 else
f9419b05 8304 ++offset_expr.X_add_number;
67c0d1eb
RS
8305 macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8306 macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
8307 macro_build (NULL, "or", "d,v,t", treg, treg, AT);
252b5132
RH
8308 break;
8309
8310 case M_ULD:
8311 s = "ldl";
8312 s2 = "ldr";
8313 off = 7;
8314 goto ulw;
8315 case M_ULW:
8316 s = "lwl";
8317 s2 = "lwr";
8318 off = 3;
8319 ulw:
8320 if (offset_expr.X_add_number >= 0x8000 - off)
f71d0d44 8321 as_bad (_("Operand overflow"));
af22f5b2
CD
8322 if (treg != breg)
8323 tempreg = treg;
8324 else
8fc2e39e
TS
8325 {
8326 used_at = 1;
8327 tempreg = AT;
8328 }
90ecf173 8329 if (!target_big_endian)
252b5132 8330 offset_expr.X_add_number += off;
67c0d1eb 8331 macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
90ecf173 8332 if (!target_big_endian)
252b5132
RH
8333 offset_expr.X_add_number -= off;
8334 else
8335 offset_expr.X_add_number += off;
67c0d1eb 8336 macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
af22f5b2 8337
90ecf173 8338 /* If necessary, move the result in tempreg to the final destination. */
af22f5b2 8339 if (treg == tempreg)
8fc2e39e 8340 break;
af22f5b2 8341 /* Protect second load's delay slot. */
017315e4 8342 load_delay_nop ();
67c0d1eb 8343 move_register (treg, tempreg);
af22f5b2 8344 break;
252b5132
RH
8345
8346 case M_ULD_A:
8347 s = "ldl";
8348 s2 = "ldr";
8349 off = 7;
8350 goto ulwa;
8351 case M_ULW_A:
8352 s = "lwl";
8353 s2 = "lwr";
8354 off = 3;
8355 ulwa:
d6bc6245 8356 used_at = 1;
67c0d1eb 8357 load_address (AT, &offset_expr, &used_at);
252b5132 8358 if (breg != 0)
67c0d1eb 8359 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
90ecf173 8360 if (!target_big_endian)
252b5132
RH
8361 expr1.X_add_number = off;
8362 else
8363 expr1.X_add_number = 0;
67c0d1eb 8364 macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
90ecf173 8365 if (!target_big_endian)
252b5132
RH
8366 expr1.X_add_number = 0;
8367 else
8368 expr1.X_add_number = off;
67c0d1eb 8369 macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
252b5132
RH
8370 break;
8371
8372 case M_ULH_A:
8373 case M_ULHU_A:
d6bc6245 8374 used_at = 1;
67c0d1eb 8375 load_address (AT, &offset_expr, &used_at);
252b5132 8376 if (breg != 0)
67c0d1eb 8377 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
252b5132
RH
8378 if (target_big_endian)
8379 expr1.X_add_number = 0;
67c0d1eb 8380 macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
17a2f251 8381 treg, BFD_RELOC_LO16, AT);
252b5132
RH
8382 if (target_big_endian)
8383 expr1.X_add_number = 1;
8384 else
8385 expr1.X_add_number = 0;
67c0d1eb
RS
8386 macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8387 macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8388 macro_build (NULL, "or", "d,v,t", treg, treg, AT);
252b5132
RH
8389 break;
8390
8391 case M_USH:
8fc2e39e 8392 used_at = 1;
252b5132 8393 if (offset_expr.X_add_number >= 0x7fff)
f71d0d44 8394 as_bad (_("Operand overflow"));
252b5132 8395 if (target_big_endian)
f9419b05 8396 ++offset_expr.X_add_number;
67c0d1eb
RS
8397 macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8398 macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
252b5132 8399 if (target_big_endian)
f9419b05 8400 --offset_expr.X_add_number;
252b5132 8401 else
f9419b05 8402 ++offset_expr.X_add_number;
67c0d1eb 8403 macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
252b5132
RH
8404 break;
8405
8406 case M_USD:
8407 s = "sdl";
8408 s2 = "sdr";
8409 off = 7;
8410 goto usw;
8411 case M_USW:
8412 s = "swl";
8413 s2 = "swr";
8414 off = 3;
8415 usw:
8416 if (offset_expr.X_add_number >= 0x8000 - off)
f71d0d44 8417 as_bad (_("Operand overflow"));
90ecf173 8418 if (!target_big_endian)
252b5132 8419 offset_expr.X_add_number += off;
67c0d1eb 8420 macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
90ecf173 8421 if (!target_big_endian)
252b5132
RH
8422 offset_expr.X_add_number -= off;
8423 else
8424 offset_expr.X_add_number += off;
67c0d1eb 8425 macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8fc2e39e 8426 break;
252b5132
RH
8427
8428 case M_USD_A:
8429 s = "sdl";
8430 s2 = "sdr";
8431 off = 7;
8432 goto uswa;
8433 case M_USW_A:
8434 s = "swl";
8435 s2 = "swr";
8436 off = 3;
8437 uswa:
d6bc6245 8438 used_at = 1;
67c0d1eb 8439 load_address (AT, &offset_expr, &used_at);
252b5132 8440 if (breg != 0)
67c0d1eb 8441 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
90ecf173 8442 if (!target_big_endian)
252b5132
RH
8443 expr1.X_add_number = off;
8444 else
8445 expr1.X_add_number = 0;
67c0d1eb 8446 macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
90ecf173 8447 if (!target_big_endian)
252b5132
RH
8448 expr1.X_add_number = 0;
8449 else
8450 expr1.X_add_number = off;
67c0d1eb 8451 macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
252b5132
RH
8452 break;
8453
8454 case M_USH_A:
d6bc6245 8455 used_at = 1;
67c0d1eb 8456 load_address (AT, &offset_expr, &used_at);
252b5132 8457 if (breg != 0)
67c0d1eb 8458 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
90ecf173 8459 if (!target_big_endian)
252b5132 8460 expr1.X_add_number = 0;
67c0d1eb
RS
8461 macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8462 macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
90ecf173 8463 if (!target_big_endian)
252b5132
RH
8464 expr1.X_add_number = 1;
8465 else
8466 expr1.X_add_number = 0;
67c0d1eb 8467 macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
90ecf173 8468 if (!target_big_endian)
252b5132
RH
8469 expr1.X_add_number = 0;
8470 else
8471 expr1.X_add_number = 1;
67c0d1eb
RS
8472 macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8473 macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8474 macro_build (NULL, "or", "d,v,t", treg, treg, AT);
252b5132
RH
8475 break;
8476
8477 default:
8478 /* FIXME: Check if this is one of the itbl macros, since they
bdaaa2e1 8479 are added dynamically. */
252b5132
RH
8480 as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
8481 break;
8482 }
741fe287 8483 if (!mips_opts.at && used_at)
8fc2e39e 8484 as_bad (_("Macro used $at after \".set noat\""));
252b5132
RH
8485}
8486
8487/* Implement macros in mips16 mode. */
8488
8489static void
17a2f251 8490mips16_macro (struct mips_cl_insn *ip)
252b5132
RH
8491{
8492 int mask;
8493 int xreg, yreg, zreg, tmp;
252b5132
RH
8494 expressionS expr1;
8495 int dbl;
8496 const char *s, *s2, *s3;
8497
8498 mask = ip->insn_mo->mask;
8499
bf12938e
RS
8500 xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
8501 yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
8502 zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
252b5132 8503
252b5132
RH
8504 expr1.X_op = O_constant;
8505 expr1.X_op_symbol = NULL;
8506 expr1.X_add_symbol = NULL;
8507 expr1.X_add_number = 1;
8508
8509 dbl = 0;
8510
8511 switch (mask)
8512 {
8513 default:
8514 internalError ();
8515
8516 case M_DDIV_3:
8517 dbl = 1;
8518 case M_DIV_3:
8519 s = "mflo";
8520 goto do_div3;
8521 case M_DREM_3:
8522 dbl = 1;
8523 case M_REM_3:
8524 s = "mfhi";
8525 do_div3:
7d10b47d 8526 start_noreorder ();
67c0d1eb 8527 macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
252b5132 8528 expr1.X_add_number = 2;
67c0d1eb
RS
8529 macro_build (&expr1, "bnez", "x,p", yreg);
8530 macro_build (NULL, "break", "6", 7);
bdaaa2e1 8531
252b5132
RH
8532 /* FIXME: The normal code checks for of -1 / -0x80000000 here,
8533 since that causes an overflow. We should do that as well,
8534 but I don't see how to do the comparisons without a temporary
8535 register. */
7d10b47d 8536 end_noreorder ();
67c0d1eb 8537 macro_build (NULL, s, "x", zreg);
252b5132
RH
8538 break;
8539
8540 case M_DIVU_3:
8541 s = "divu";
8542 s2 = "mflo";
8543 goto do_divu3;
8544 case M_REMU_3:
8545 s = "divu";
8546 s2 = "mfhi";
8547 goto do_divu3;
8548 case M_DDIVU_3:
8549 s = "ddivu";
8550 s2 = "mflo";
8551 goto do_divu3;
8552 case M_DREMU_3:
8553 s = "ddivu";
8554 s2 = "mfhi";
8555 do_divu3:
7d10b47d 8556 start_noreorder ();
67c0d1eb 8557 macro_build (NULL, s, "0,x,y", xreg, yreg);
252b5132 8558 expr1.X_add_number = 2;
67c0d1eb
RS
8559 macro_build (&expr1, "bnez", "x,p", yreg);
8560 macro_build (NULL, "break", "6", 7);
7d10b47d 8561 end_noreorder ();
67c0d1eb 8562 macro_build (NULL, s2, "x", zreg);
252b5132
RH
8563 break;
8564
8565 case M_DMUL:
8566 dbl = 1;
8567 case M_MUL:
67c0d1eb
RS
8568 macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
8569 macro_build (NULL, "mflo", "x", zreg);
8fc2e39e 8570 break;
252b5132
RH
8571
8572 case M_DSUBU_I:
8573 dbl = 1;
8574 goto do_subu;
8575 case M_SUBU_I:
8576 do_subu:
8577 if (imm_expr.X_op != O_constant)
8578 as_bad (_("Unsupported large constant"));
8579 imm_expr.X_add_number = -imm_expr.X_add_number;
67c0d1eb 8580 macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
252b5132
RH
8581 break;
8582
8583 case M_SUBU_I_2:
8584 if (imm_expr.X_op != O_constant)
8585 as_bad (_("Unsupported large constant"));
8586 imm_expr.X_add_number = -imm_expr.X_add_number;
67c0d1eb 8587 macro_build (&imm_expr, "addiu", "x,k", xreg);
252b5132
RH
8588 break;
8589
8590 case M_DSUBU_I_2:
8591 if (imm_expr.X_op != O_constant)
8592 as_bad (_("Unsupported large constant"));
8593 imm_expr.X_add_number = -imm_expr.X_add_number;
67c0d1eb 8594 macro_build (&imm_expr, "daddiu", "y,j", yreg);
252b5132
RH
8595 break;
8596
8597 case M_BEQ:
8598 s = "cmp";
8599 s2 = "bteqz";
8600 goto do_branch;
8601 case M_BNE:
8602 s = "cmp";
8603 s2 = "btnez";
8604 goto do_branch;
8605 case M_BLT:
8606 s = "slt";
8607 s2 = "btnez";
8608 goto do_branch;
8609 case M_BLTU:
8610 s = "sltu";
8611 s2 = "btnez";
8612 goto do_branch;
8613 case M_BLE:
8614 s = "slt";
8615 s2 = "bteqz";
8616 goto do_reverse_branch;
8617 case M_BLEU:
8618 s = "sltu";
8619 s2 = "bteqz";
8620 goto do_reverse_branch;
8621 case M_BGE:
8622 s = "slt";
8623 s2 = "bteqz";
8624 goto do_branch;
8625 case M_BGEU:
8626 s = "sltu";
8627 s2 = "bteqz";
8628 goto do_branch;
8629 case M_BGT:
8630 s = "slt";
8631 s2 = "btnez";
8632 goto do_reverse_branch;
8633 case M_BGTU:
8634 s = "sltu";
8635 s2 = "btnez";
8636
8637 do_reverse_branch:
8638 tmp = xreg;
8639 xreg = yreg;
8640 yreg = tmp;
8641
8642 do_branch:
67c0d1eb
RS
8643 macro_build (NULL, s, "x,y", xreg, yreg);
8644 macro_build (&offset_expr, s2, "p");
252b5132
RH
8645 break;
8646
8647 case M_BEQ_I:
8648 s = "cmpi";
8649 s2 = "bteqz";
8650 s3 = "x,U";
8651 goto do_branch_i;
8652 case M_BNE_I:
8653 s = "cmpi";
8654 s2 = "btnez";
8655 s3 = "x,U";
8656 goto do_branch_i;
8657 case M_BLT_I:
8658 s = "slti";
8659 s2 = "btnez";
8660 s3 = "x,8";
8661 goto do_branch_i;
8662 case M_BLTU_I:
8663 s = "sltiu";
8664 s2 = "btnez";
8665 s3 = "x,8";
8666 goto do_branch_i;
8667 case M_BLE_I:
8668 s = "slti";
8669 s2 = "btnez";
8670 s3 = "x,8";
8671 goto do_addone_branch_i;
8672 case M_BLEU_I:
8673 s = "sltiu";
8674 s2 = "btnez";
8675 s3 = "x,8";
8676 goto do_addone_branch_i;
8677 case M_BGE_I:
8678 s = "slti";
8679 s2 = "bteqz";
8680 s3 = "x,8";
8681 goto do_branch_i;
8682 case M_BGEU_I:
8683 s = "sltiu";
8684 s2 = "bteqz";
8685 s3 = "x,8";
8686 goto do_branch_i;
8687 case M_BGT_I:
8688 s = "slti";
8689 s2 = "bteqz";
8690 s3 = "x,8";
8691 goto do_addone_branch_i;
8692 case M_BGTU_I:
8693 s = "sltiu";
8694 s2 = "bteqz";
8695 s3 = "x,8";
8696
8697 do_addone_branch_i:
8698 if (imm_expr.X_op != O_constant)
8699 as_bad (_("Unsupported large constant"));
8700 ++imm_expr.X_add_number;
8701
8702 do_branch_i:
67c0d1eb
RS
8703 macro_build (&imm_expr, s, s3, xreg);
8704 macro_build (&offset_expr, s2, "p");
252b5132
RH
8705 break;
8706
8707 case M_ABS:
8708 expr1.X_add_number = 0;
67c0d1eb 8709 macro_build (&expr1, "slti", "x,8", yreg);
252b5132 8710 if (xreg != yreg)
67c0d1eb 8711 move_register (xreg, yreg);
252b5132 8712 expr1.X_add_number = 2;
67c0d1eb
RS
8713 macro_build (&expr1, "bteqz", "p");
8714 macro_build (NULL, "neg", "x,w", xreg, xreg);
252b5132
RH
8715 }
8716}
8717
8718/* For consistency checking, verify that all bits are specified either
8719 by the match/mask part of the instruction definition, or by the
8720 operand list. */
8721static int
17a2f251 8722validate_mips_insn (const struct mips_opcode *opc)
252b5132
RH
8723{
8724 const char *p = opc->args;
8725 char c;
8726 unsigned long used_bits = opc->mask;
8727
8728 if ((used_bits & opc->match) != opc->match)
8729 {
8730 as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8731 opc->name, opc->args);
8732 return 0;
8733 }
8734#define USE_BITS(mask,shift) (used_bits |= ((mask) << (shift)))
8735 while (*p)
8736 switch (c = *p++)
8737 {
8738 case ',': break;
8739 case '(': break;
8740 case ')': break;
af7ee8bf
CD
8741 case '+':
8742 switch (c = *p++)
8743 {
9bcd4f99
TS
8744 case '1': USE_BITS (OP_MASK_UDI1, OP_SH_UDI1); break;
8745 case '2': USE_BITS (OP_MASK_UDI2, OP_SH_UDI2); break;
8746 case '3': USE_BITS (OP_MASK_UDI3, OP_SH_UDI3); break;
8747 case '4': USE_BITS (OP_MASK_UDI4, OP_SH_UDI4); break;
af7ee8bf
CD
8748 case 'A': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8749 case 'B': USE_BITS (OP_MASK_INSMSB, OP_SH_INSMSB); break;
8750 case 'C': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
bbcc0807
CD
8751 case 'D': USE_BITS (OP_MASK_RD, OP_SH_RD);
8752 USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
5f74bc13
CD
8753 case 'E': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8754 case 'F': USE_BITS (OP_MASK_INSMSB, OP_SH_INSMSB); break;
8755 case 'G': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
8756 case 'H': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
8757 case 'I': break;
ef2e4d86
CF
8758 case 't': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8759 case 'T': USE_BITS (OP_MASK_RT, OP_SH_RT);
8760 USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
bb35fb24
NC
8761 case 'x': USE_BITS (OP_MASK_BBITIND, OP_SH_BBITIND); break;
8762 case 'X': USE_BITS (OP_MASK_BBITIND, OP_SH_BBITIND); break;
8763 case 'p': USE_BITS (OP_MASK_CINSPOS, OP_SH_CINSPOS); break;
8764 case 'P': USE_BITS (OP_MASK_CINSPOS, OP_SH_CINSPOS); break;
dd3cbb7e 8765 case 'Q': USE_BITS (OP_MASK_SEQI, OP_SH_SEQI); break;
bb35fb24
NC
8766 case 's': USE_BITS (OP_MASK_CINSLM1, OP_SH_CINSLM1); break;
8767 case 'S': USE_BITS (OP_MASK_CINSLM1, OP_SH_CINSLM1); break;
98675402
RS
8768 case 'z': USE_BITS (OP_MASK_RZ, OP_SH_RZ); break;
8769 case 'Z': USE_BITS (OP_MASK_FZ, OP_SH_FZ); break;
8770 case 'a': USE_BITS (OP_MASK_OFFSET_A, OP_SH_OFFSET_A); break;
8771 case 'b': USE_BITS (OP_MASK_OFFSET_B, OP_SH_OFFSET_B); break;
8772 case 'c': USE_BITS (OP_MASK_OFFSET_C, OP_SH_OFFSET_C); break;
bb35fb24 8773
af7ee8bf
CD
8774 default:
8775 as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8776 c, opc->name, opc->args);
8777 return 0;
8778 }
8779 break;
252b5132
RH
8780 case '<': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8781 case '>': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8782 case 'A': break;
4372b673 8783 case 'B': USE_BITS (OP_MASK_CODE20, OP_SH_CODE20); break;
252b5132
RH
8784 case 'C': USE_BITS (OP_MASK_COPZ, OP_SH_COPZ); break;
8785 case 'D': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
8786 case 'E': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8787 case 'F': break;
8788 case 'G': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
156c2f8b 8789 case 'H': USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
252b5132 8790 case 'I': break;
e972090a 8791 case 'J': USE_BITS (OP_MASK_CODE19, OP_SH_CODE19); break;
af7ee8bf 8792 case 'K': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
252b5132
RH
8793 case 'L': break;
8794 case 'M': USE_BITS (OP_MASK_CCC, OP_SH_CCC); break;
8795 case 'N': USE_BITS (OP_MASK_BCC, OP_SH_BCC); break;
deec1734
CD
8796 case 'O': USE_BITS (OP_MASK_ALN, OP_SH_ALN); break;
8797 case 'Q': USE_BITS (OP_MASK_VSEL, OP_SH_VSEL);
8798 USE_BITS (OP_MASK_FT, OP_SH_FT); break;
252b5132
RH
8799 case 'R': USE_BITS (OP_MASK_FR, OP_SH_FR); break;
8800 case 'S': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8801 case 'T': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8802 case 'V': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8803 case 'W': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
deec1734
CD
8804 case 'X': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
8805 case 'Y': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8806 case 'Z': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
252b5132
RH
8807 case 'a': USE_BITS (OP_MASK_TARGET, OP_SH_TARGET); break;
8808 case 'b': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8809 case 'c': USE_BITS (OP_MASK_CODE, OP_SH_CODE); break;
8810 case 'd': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8811 case 'f': break;
8812 case 'h': USE_BITS (OP_MASK_PREFX, OP_SH_PREFX); break;
8813 case 'i': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
8814 case 'j': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8815 case 'k': USE_BITS (OP_MASK_CACHE, OP_SH_CACHE); break;
8816 case 'l': break;
8817 case 'o': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8818 case 'p': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8819 case 'q': USE_BITS (OP_MASK_CODE2, OP_SH_CODE2); break;
8820 case 'r': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8821 case 's': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8822 case 't': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8823 case 'u': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
8824 case 'v': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8825 case 'w': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8826 case 'x': break;
8827 case 'z': break;
8828 case 'P': USE_BITS (OP_MASK_PERFREG, OP_SH_PERFREG); break;
4372b673
NC
8829 case 'U': USE_BITS (OP_MASK_RD, OP_SH_RD);
8830 USE_BITS (OP_MASK_RT, OP_SH_RT); break;
60b63b72
RS
8831 case 'e': USE_BITS (OP_MASK_VECBYTE, OP_SH_VECBYTE); break;
8832 case '%': USE_BITS (OP_MASK_VECALIGN, OP_SH_VECALIGN); break;
8833 case '[': break;
8834 case ']': break;
620edafd 8835 case '1': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8b082fb1 8836 case '2': USE_BITS (OP_MASK_BP, OP_SH_BP); break;
74cd071d
CF
8837 case '3': USE_BITS (OP_MASK_SA3, OP_SH_SA3); break;
8838 case '4': USE_BITS (OP_MASK_SA4, OP_SH_SA4); break;
8839 case '5': USE_BITS (OP_MASK_IMM8, OP_SH_IMM8); break;
8840 case '6': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8841 case '7': USE_BITS (OP_MASK_DSPACC, OP_SH_DSPACC); break;
8842 case '8': USE_BITS (OP_MASK_WRDSP, OP_SH_WRDSP); break;
8843 case '9': USE_BITS (OP_MASK_DSPACC_S, OP_SH_DSPACC_S);break;
8844 case '0': USE_BITS (OP_MASK_DSPSFT, OP_SH_DSPSFT); break;
8845 case '\'': USE_BITS (OP_MASK_RDDSP, OP_SH_RDDSP); break;
8846 case ':': USE_BITS (OP_MASK_DSPSFT_7, OP_SH_DSPSFT_7);break;
8847 case '@': USE_BITS (OP_MASK_IMM10, OP_SH_IMM10); break;
ef2e4d86
CF
8848 case '!': USE_BITS (OP_MASK_MT_U, OP_SH_MT_U); break;
8849 case '$': USE_BITS (OP_MASK_MT_H, OP_SH_MT_H); break;
8850 case '*': USE_BITS (OP_MASK_MTACC_T, OP_SH_MTACC_T); break;
8851 case '&': USE_BITS (OP_MASK_MTACC_D, OP_SH_MTACC_D); break;
8852 case 'g': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
252b5132
RH
8853 default:
8854 as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8855 c, opc->name, opc->args);
8856 return 0;
8857 }
8858#undef USE_BITS
8859 if (used_bits != 0xffffffff)
8860 {
8861 as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8862 ~used_bits & 0xffffffff, opc->name, opc->args);
8863 return 0;
8864 }
8865 return 1;
8866}
8867
9bcd4f99
TS
8868/* UDI immediates. */
8869struct mips_immed {
8870 char type;
8871 unsigned int shift;
8872 unsigned long mask;
8873 const char * desc;
8874};
8875
8876static const struct mips_immed mips_immed[] = {
8877 { '1', OP_SH_UDI1, OP_MASK_UDI1, 0},
8878 { '2', OP_SH_UDI2, OP_MASK_UDI2, 0},
8879 { '3', OP_SH_UDI3, OP_MASK_UDI3, 0},
8880 { '4', OP_SH_UDI4, OP_MASK_UDI4, 0},
8881 { 0,0,0,0 }
8882};
8883
7455baf8
TS
8884/* Check whether an odd floating-point register is allowed. */
8885static int
8886mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
8887{
8888 const char *s = insn->name;
8889
8890 if (insn->pinfo == INSN_MACRO)
8891 /* Let a macro pass, we'll catch it later when it is expanded. */
8892 return 1;
8893
8894 if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
8895 {
8896 /* Allow odd registers for single-precision ops. */
8897 switch (insn->pinfo & (FP_S | FP_D))
8898 {
8899 case FP_S:
8900 case 0:
8901 return 1; /* both single precision - ok */
8902 case FP_D:
8903 return 0; /* both double precision - fail */
8904 default:
8905 break;
8906 }
8907
8908 /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand. */
8909 s = strchr (insn->name, '.');
8910 if (argnum == 2)
8911 s = s != NULL ? strchr (s + 1, '.') : NULL;
8912 return (s != NULL && (s[1] == 'w' || s[1] == 's'));
8913 }
8914
8915 /* Single-precision coprocessor loads and moves are OK too. */
8916 if ((insn->pinfo & FP_S)
8917 && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
8918 | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
8919 return 1;
8920
8921 return 0;
8922}
8923
252b5132
RH
8924/* This routine assembles an instruction into its binary format. As a
8925 side effect, it sets one of the global variables imm_reloc or
8926 offset_reloc to the type of relocation to do if one of the operands
8927 is an address expression. */
8928
8929static void
17a2f251 8930mips_ip (char *str, struct mips_cl_insn *ip)
252b5132
RH
8931{
8932 char *s;
8933 const char *args;
43841e91 8934 char c = 0;
252b5132
RH
8935 struct mips_opcode *insn;
8936 char *argsStart;
8937 unsigned int regno;
34224acf 8938 unsigned int lastregno;
af7ee8bf 8939 unsigned int lastpos = 0;
071742cf 8940 unsigned int limlo, limhi;
252b5132
RH
8941 char *s_reset;
8942 char save_c = 0;
74cd071d 8943 offsetT min_range, max_range;
707bfff6
TS
8944 int argnum;
8945 unsigned int rtype;
252b5132
RH
8946
8947 insn_error = NULL;
8948
8949 /* If the instruction contains a '.', we first try to match an instruction
8950 including the '.'. Then we try again without the '.'. */
8951 insn = NULL;
3882b010 8952 for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
252b5132
RH
8953 continue;
8954
8955 /* If we stopped on whitespace, then replace the whitespace with null for
8956 the call to hash_find. Save the character we replaced just in case we
8957 have to re-parse the instruction. */
3882b010 8958 if (ISSPACE (*s))
252b5132
RH
8959 {
8960 save_c = *s;
8961 *s++ = '\0';
8962 }
bdaaa2e1 8963
252b5132
RH
8964 insn = (struct mips_opcode *) hash_find (op_hash, str);
8965
8966 /* If we didn't find the instruction in the opcode table, try again, but
8967 this time with just the instruction up to, but not including the
8968 first '.'. */
8969 if (insn == NULL)
8970 {
bdaaa2e1 8971 /* Restore the character we overwrite above (if any). */
252b5132
RH
8972 if (save_c)
8973 *(--s) = save_c;
8974
8975 /* Scan up to the first '.' or whitespace. */
3882b010
L
8976 for (s = str;
8977 *s != '\0' && *s != '.' && !ISSPACE (*s);
8978 ++s)
252b5132
RH
8979 continue;
8980
8981 /* If we did not find a '.', then we can quit now. */
8982 if (*s != '.')
8983 {
f71d0d44 8984 insn_error = _("Unrecognized opcode");
252b5132
RH
8985 return;
8986 }
8987
8988 /* Lookup the instruction in the hash table. */
8989 *s++ = '\0';
8990 if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8991 {
f71d0d44 8992 insn_error = _("Unrecognized opcode");
252b5132
RH
8993 return;
8994 }
252b5132
RH
8995 }
8996
8997 argsStart = s;
8998 for (;;)
8999 {
b34976b6 9000 bfd_boolean ok;
252b5132 9001
9c2799c2 9002 gas_assert (strcmp (insn->name, str) == 0);
252b5132 9003
f79e2745 9004 ok = is_opcode_valid (insn);
252b5132
RH
9005 if (! ok)
9006 {
9007 if (insn + 1 < &mips_opcodes[NUMOPCODES]
9008 && strcmp (insn->name, insn[1].name) == 0)
9009 {
9010 ++insn;
9011 continue;
9012 }
252b5132 9013 else
beae10d5 9014 {
268f6bed
L
9015 if (!insn_error)
9016 {
9017 static char buf[100];
fef14a42
TS
9018 sprintf (buf,
9019 _("opcode not supported on this processor: %s (%s)"),
9020 mips_cpu_info_from_arch (mips_opts.arch)->name,
9021 mips_cpu_info_from_isa (mips_opts.isa)->name);
268f6bed
L
9022 insn_error = buf;
9023 }
9024 if (save_c)
9025 *(--s) = save_c;
2bd7f1f3 9026 return;
252b5132 9027 }
252b5132
RH
9028 }
9029
1e915849 9030 create_insn (ip, insn);
268f6bed 9031 insn_error = NULL;
707bfff6 9032 argnum = 1;
24864476 9033 lastregno = 0xffffffff;
252b5132
RH
9034 for (args = insn->args;; ++args)
9035 {
deec1734
CD
9036 int is_mdmx;
9037
ad8d3bb3 9038 s += strspn (s, " \t");
deec1734 9039 is_mdmx = 0;
252b5132
RH
9040 switch (*args)
9041 {
9042 case '\0': /* end of args */
9043 if (*s == '\0')
9044 return;
9045 break;
9046
90ecf173 9047 case '2': /* DSP 2-bit unsigned immediate in bit 11. */
8b082fb1
TS
9048 my_getExpression (&imm_expr, s);
9049 check_absolute_expr (ip, &imm_expr);
9050 if ((unsigned long) imm_expr.X_add_number != 1
9051 && (unsigned long) imm_expr.X_add_number != 3)
9052 {
9053 as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
9054 (unsigned long) imm_expr.X_add_number);
9055 }
9056 INSERT_OPERAND (BP, *ip, imm_expr.X_add_number);
9057 imm_expr.X_op = O_absent;
9058 s = expr_end;
9059 continue;
9060
90ecf173 9061 case '3': /* DSP 3-bit unsigned immediate in bit 21. */
74cd071d
CF
9062 my_getExpression (&imm_expr, s);
9063 check_absolute_expr (ip, &imm_expr);
9064 if (imm_expr.X_add_number & ~OP_MASK_SA3)
9065 {
a9e24354
TS
9066 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9067 OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
74cd071d 9068 }
a9e24354 9069 INSERT_OPERAND (SA3, *ip, imm_expr.X_add_number);
74cd071d
CF
9070 imm_expr.X_op = O_absent;
9071 s = expr_end;
9072 continue;
9073
90ecf173 9074 case '4': /* DSP 4-bit unsigned immediate in bit 21. */
74cd071d
CF
9075 my_getExpression (&imm_expr, s);
9076 check_absolute_expr (ip, &imm_expr);
9077 if (imm_expr.X_add_number & ~OP_MASK_SA4)
9078 {
a9e24354
TS
9079 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9080 OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
74cd071d 9081 }
a9e24354 9082 INSERT_OPERAND (SA4, *ip, imm_expr.X_add_number);
74cd071d
CF
9083 imm_expr.X_op = O_absent;
9084 s = expr_end;
9085 continue;
9086
90ecf173 9087 case '5': /* DSP 8-bit unsigned immediate in bit 16. */
74cd071d
CF
9088 my_getExpression (&imm_expr, s);
9089 check_absolute_expr (ip, &imm_expr);
9090 if (imm_expr.X_add_number & ~OP_MASK_IMM8)
9091 {
a9e24354
TS
9092 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9093 OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
74cd071d 9094 }
a9e24354 9095 INSERT_OPERAND (IMM8, *ip, imm_expr.X_add_number);
74cd071d
CF
9096 imm_expr.X_op = O_absent;
9097 s = expr_end;
9098 continue;
9099
90ecf173 9100 case '6': /* DSP 5-bit unsigned immediate in bit 21. */
74cd071d
CF
9101 my_getExpression (&imm_expr, s);
9102 check_absolute_expr (ip, &imm_expr);
9103 if (imm_expr.X_add_number & ~OP_MASK_RS)
9104 {
a9e24354
TS
9105 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9106 OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
74cd071d 9107 }
a9e24354 9108 INSERT_OPERAND (RS, *ip, imm_expr.X_add_number);
74cd071d
CF
9109 imm_expr.X_op = O_absent;
9110 s = expr_end;
9111 continue;
9112
90ecf173 9113 case '7': /* Four DSP accumulators in bits 11,12. */
74cd071d
CF
9114 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
9115 s[3] >= '0' && s[3] <= '3')
9116 {
9117 regno = s[3] - '0';
9118 s += 4;
a9e24354 9119 INSERT_OPERAND (DSPACC, *ip, regno);
74cd071d
CF
9120 continue;
9121 }
9122 else
9123 as_bad (_("Invalid dsp acc register"));
9124 break;
9125
90ecf173 9126 case '8': /* DSP 6-bit unsigned immediate in bit 11. */
74cd071d
CF
9127 my_getExpression (&imm_expr, s);
9128 check_absolute_expr (ip, &imm_expr);
9129 if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
9130 {
a9e24354
TS
9131 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9132 OP_MASK_WRDSP,
9133 (unsigned long) imm_expr.X_add_number);
74cd071d 9134 }
a9e24354 9135 INSERT_OPERAND (WRDSP, *ip, imm_expr.X_add_number);
74cd071d
CF
9136 imm_expr.X_op = O_absent;
9137 s = expr_end;
9138 continue;
9139
90ecf173 9140 case '9': /* Four DSP accumulators in bits 21,22. */
74cd071d
CF
9141 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
9142 s[3] >= '0' && s[3] <= '3')
9143 {
9144 regno = s[3] - '0';
9145 s += 4;
a9e24354 9146 INSERT_OPERAND (DSPACC_S, *ip, regno);
74cd071d
CF
9147 continue;
9148 }
9149 else
9150 as_bad (_("Invalid dsp acc register"));
9151 break;
9152
90ecf173 9153 case '0': /* DSP 6-bit signed immediate in bit 20. */
74cd071d
CF
9154 my_getExpression (&imm_expr, s);
9155 check_absolute_expr (ip, &imm_expr);
9156 min_range = -((OP_MASK_DSPSFT + 1) >> 1);
9157 max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
9158 if (imm_expr.X_add_number < min_range ||
9159 imm_expr.X_add_number > max_range)
9160 {
a9e24354
TS
9161 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
9162 (long) min_range, (long) max_range,
9163 (long) imm_expr.X_add_number);
74cd071d 9164 }
a9e24354 9165 INSERT_OPERAND (DSPSFT, *ip, imm_expr.X_add_number);
74cd071d
CF
9166 imm_expr.X_op = O_absent;
9167 s = expr_end;
9168 continue;
9169
90ecf173 9170 case '\'': /* DSP 6-bit unsigned immediate in bit 16. */
74cd071d
CF
9171 my_getExpression (&imm_expr, s);
9172 check_absolute_expr (ip, &imm_expr);
9173 if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
9174 {
a9e24354
TS
9175 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9176 OP_MASK_RDDSP,
9177 (unsigned long) imm_expr.X_add_number);
74cd071d 9178 }
a9e24354 9179 INSERT_OPERAND (RDDSP, *ip, imm_expr.X_add_number);
74cd071d
CF
9180 imm_expr.X_op = O_absent;
9181 s = expr_end;
9182 continue;
9183
90ecf173 9184 case ':': /* DSP 7-bit signed immediate in bit 19. */
74cd071d
CF
9185 my_getExpression (&imm_expr, s);
9186 check_absolute_expr (ip, &imm_expr);
9187 min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
9188 max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
9189 if (imm_expr.X_add_number < min_range ||
9190 imm_expr.X_add_number > max_range)
9191 {
a9e24354
TS
9192 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
9193 (long) min_range, (long) max_range,
9194 (long) imm_expr.X_add_number);
74cd071d 9195 }
a9e24354 9196 INSERT_OPERAND (DSPSFT_7, *ip, imm_expr.X_add_number);
74cd071d
CF
9197 imm_expr.X_op = O_absent;
9198 s = expr_end;
9199 continue;
9200
90ecf173 9201 case '@': /* DSP 10-bit signed immediate in bit 16. */
74cd071d
CF
9202 my_getExpression (&imm_expr, s);
9203 check_absolute_expr (ip, &imm_expr);
9204 min_range = -((OP_MASK_IMM10 + 1) >> 1);
9205 max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
9206 if (imm_expr.X_add_number < min_range ||
9207 imm_expr.X_add_number > max_range)
9208 {
a9e24354
TS
9209 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
9210 (long) min_range, (long) max_range,
9211 (long) imm_expr.X_add_number);
74cd071d 9212 }
a9e24354 9213 INSERT_OPERAND (IMM10, *ip, imm_expr.X_add_number);
74cd071d
CF
9214 imm_expr.X_op = O_absent;
9215 s = expr_end;
9216 continue;
9217
a9e24354 9218 case '!': /* MT usermode flag bit. */
ef2e4d86
CF
9219 my_getExpression (&imm_expr, s);
9220 check_absolute_expr (ip, &imm_expr);
9221 if (imm_expr.X_add_number & ~OP_MASK_MT_U)
a9e24354
TS
9222 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
9223 (unsigned long) imm_expr.X_add_number);
9224 INSERT_OPERAND (MT_U, *ip, imm_expr.X_add_number);
ef2e4d86
CF
9225 imm_expr.X_op = O_absent;
9226 s = expr_end;
9227 continue;
9228
a9e24354 9229 case '$': /* MT load high flag bit. */
ef2e4d86
CF
9230 my_getExpression (&imm_expr, s);
9231 check_absolute_expr (ip, &imm_expr);
9232 if (imm_expr.X_add_number & ~OP_MASK_MT_H)
a9e24354
TS
9233 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
9234 (unsigned long) imm_expr.X_add_number);
9235 INSERT_OPERAND (MT_H, *ip, imm_expr.X_add_number);
ef2e4d86
CF
9236 imm_expr.X_op = O_absent;
9237 s = expr_end;
9238 continue;
9239
90ecf173 9240 case '*': /* Four DSP accumulators in bits 18,19. */
ef2e4d86
CF
9241 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
9242 s[3] >= '0' && s[3] <= '3')
9243 {
9244 regno = s[3] - '0';
9245 s += 4;
a9e24354 9246 INSERT_OPERAND (MTACC_T, *ip, regno);
ef2e4d86
CF
9247 continue;
9248 }
9249 else
9250 as_bad (_("Invalid dsp/smartmips acc register"));
9251 break;
9252
90ecf173 9253 case '&': /* Four DSP accumulators in bits 13,14. */
ef2e4d86
CF
9254 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
9255 s[3] >= '0' && s[3] <= '3')
9256 {
9257 regno = s[3] - '0';
9258 s += 4;
a9e24354 9259 INSERT_OPERAND (MTACC_D, *ip, regno);
ef2e4d86
CF
9260 continue;
9261 }
9262 else
9263 as_bad (_("Invalid dsp/smartmips acc register"));
9264 break;
9265
252b5132 9266 case ',':
a339155f 9267 ++argnum;
252b5132
RH
9268 if (*s++ == *args)
9269 continue;
9270 s--;
9271 switch (*++args)
9272 {
9273 case 'r':
9274 case 'v':
bf12938e 9275 INSERT_OPERAND (RS, *ip, lastregno);
252b5132
RH
9276 continue;
9277
9278 case 'w':
bf12938e 9279 INSERT_OPERAND (RT, *ip, lastregno);
38487616
TS
9280 continue;
9281
252b5132 9282 case 'W':
bf12938e 9283 INSERT_OPERAND (FT, *ip, lastregno);
252b5132
RH
9284 continue;
9285
9286 case 'V':
bf12938e 9287 INSERT_OPERAND (FS, *ip, lastregno);
252b5132
RH
9288 continue;
9289 }
9290 break;
9291
9292 case '(':
9293 /* Handle optional base register.
9294 Either the base register is omitted or
bdaaa2e1 9295 we must have a left paren. */
252b5132
RH
9296 /* This is dependent on the next operand specifier
9297 is a base register specification. */
f9bbfb18 9298 gas_assert (args[1] == 'b');
252b5132
RH
9299 if (*s == '\0')
9300 return;
9301
90ecf173 9302 case ')': /* These must match exactly. */
60b63b72
RS
9303 case '[':
9304 case ']':
252b5132
RH
9305 if (*s++ == *args)
9306 continue;
9307 break;
9308
af7ee8bf
CD
9309 case '+': /* Opcode extension character. */
9310 switch (*++args)
9311 {
9bcd4f99
TS
9312 case '1': /* UDI immediates. */
9313 case '2':
9314 case '3':
9315 case '4':
9316 {
9317 const struct mips_immed *imm = mips_immed;
9318
9319 while (imm->type && imm->type != *args)
9320 ++imm;
9321 if (! imm->type)
9322 internalError ();
9323 my_getExpression (&imm_expr, s);
9324 check_absolute_expr (ip, &imm_expr);
9325 if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
9326 {
9327 as_warn (_("Illegal %s number (%lu, 0x%lx)"),
9328 imm->desc ? imm->desc : ip->insn_mo->name,
9329 (unsigned long) imm_expr.X_add_number,
9330 (unsigned long) imm_expr.X_add_number);
90ecf173 9331 imm_expr.X_add_number &= imm->mask;
9bcd4f99
TS
9332 }
9333 ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
9334 << imm->shift);
9335 imm_expr.X_op = O_absent;
9336 s = expr_end;
9337 }
9338 continue;
90ecf173 9339
071742cf
CD
9340 case 'A': /* ins/ext position, becomes LSB. */
9341 limlo = 0;
9342 limhi = 31;
5f74bc13
CD
9343 goto do_lsb;
9344 case 'E':
9345 limlo = 32;
9346 limhi = 63;
9347 goto do_lsb;
90ecf173 9348 do_lsb:
071742cf
CD
9349 my_getExpression (&imm_expr, s);
9350 check_absolute_expr (ip, &imm_expr);
9351 if ((unsigned long) imm_expr.X_add_number < limlo
9352 || (unsigned long) imm_expr.X_add_number > limhi)
9353 {
9354 as_bad (_("Improper position (%lu)"),
9355 (unsigned long) imm_expr.X_add_number);
9356 imm_expr.X_add_number = limlo;
9357 }
9358 lastpos = imm_expr.X_add_number;
bf12938e 9359 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
071742cf
CD
9360 imm_expr.X_op = O_absent;
9361 s = expr_end;
9362 continue;
9363
9364 case 'B': /* ins size, becomes MSB. */
9365 limlo = 1;
9366 limhi = 32;
5f74bc13
CD
9367 goto do_msb;
9368 case 'F':
9369 limlo = 33;
9370 limhi = 64;
9371 goto do_msb;
90ecf173 9372 do_msb:
071742cf
CD
9373 my_getExpression (&imm_expr, s);
9374 check_absolute_expr (ip, &imm_expr);
9375 /* Check for negative input so that small negative numbers
9376 will not succeed incorrectly. The checks against
9377 (pos+size) transitively check "size" itself,
9378 assuming that "pos" is reasonable. */
9379 if ((long) imm_expr.X_add_number < 0
9380 || ((unsigned long) imm_expr.X_add_number
9381 + lastpos) < limlo
9382 || ((unsigned long) imm_expr.X_add_number
9383 + lastpos) > limhi)
9384 {
9385 as_bad (_("Improper insert size (%lu, position %lu)"),
9386 (unsigned long) imm_expr.X_add_number,
9387 (unsigned long) lastpos);
9388 imm_expr.X_add_number = limlo - lastpos;
9389 }
bf12938e
RS
9390 INSERT_OPERAND (INSMSB, *ip,
9391 lastpos + imm_expr.X_add_number - 1);
071742cf
CD
9392 imm_expr.X_op = O_absent;
9393 s = expr_end;
9394 continue;
9395
9396 case 'C': /* ext size, becomes MSBD. */
9397 limlo = 1;
9398 limhi = 32;
5f74bc13
CD
9399 goto do_msbd;
9400 case 'G':
9401 limlo = 33;
9402 limhi = 64;
9403 goto do_msbd;
9404 case 'H':
9405 limlo = 33;
9406 limhi = 64;
9407 goto do_msbd;
90ecf173 9408 do_msbd:
071742cf
CD
9409 my_getExpression (&imm_expr, s);
9410 check_absolute_expr (ip, &imm_expr);
9411 /* Check for negative input so that small negative numbers
9412 will not succeed incorrectly. The checks against
9413 (pos+size) transitively check "size" itself,
9414 assuming that "pos" is reasonable. */
9415 if ((long) imm_expr.X_add_number < 0
9416 || ((unsigned long) imm_expr.X_add_number
9417 + lastpos) < limlo
9418 || ((unsigned long) imm_expr.X_add_number
9419 + lastpos) > limhi)
9420 {
9421 as_bad (_("Improper extract size (%lu, position %lu)"),
9422 (unsigned long) imm_expr.X_add_number,
9423 (unsigned long) lastpos);
9424 imm_expr.X_add_number = limlo - lastpos;
9425 }
bf12938e 9426 INSERT_OPERAND (EXTMSBD, *ip, imm_expr.X_add_number - 1);
071742cf
CD
9427 imm_expr.X_op = O_absent;
9428 s = expr_end;
9429 continue;
af7ee8bf 9430
bbcc0807
CD
9431 case 'D':
9432 /* +D is for disassembly only; never match. */
9433 break;
9434
5f74bc13
CD
9435 case 'I':
9436 /* "+I" is like "I", except that imm2_expr is used. */
9437 my_getExpression (&imm2_expr, s);
9438 if (imm2_expr.X_op != O_big
9439 && imm2_expr.X_op != O_constant)
9440 insn_error = _("absolute expression required");
9ee2a2d4
MR
9441 if (HAVE_32BIT_GPRS)
9442 normalize_constant_expr (&imm2_expr);
5f74bc13
CD
9443 s = expr_end;
9444 continue;
9445
707bfff6 9446 case 'T': /* Coprocessor register. */
ef2e4d86
CF
9447 /* +T is for disassembly only; never match. */
9448 break;
9449
707bfff6 9450 case 't': /* Coprocessor register number. */
ef2e4d86
CF
9451 if (s[0] == '$' && ISDIGIT (s[1]))
9452 {
9453 ++s;
9454 regno = 0;
9455 do
9456 {
9457 regno *= 10;
9458 regno += *s - '0';
9459 ++s;
9460 }
9461 while (ISDIGIT (*s));
9462 if (regno > 31)
9463 as_bad (_("Invalid register number (%d)"), regno);
9464 else
9465 {
a9e24354 9466 INSERT_OPERAND (RT, *ip, regno);
ef2e4d86
CF
9467 continue;
9468 }
9469 }
9470 else
9471 as_bad (_("Invalid coprocessor 0 register number"));
9472 break;
9473
bb35fb24
NC
9474 case 'x':
9475 /* bbit[01] and bbit[01]32 bit index. Give error if index
9476 is not in the valid range. */
9477 my_getExpression (&imm_expr, s);
9478 check_absolute_expr (ip, &imm_expr);
9479 if ((unsigned) imm_expr.X_add_number > 31)
9480 {
9481 as_bad (_("Improper bit index (%lu)"),
9482 (unsigned long) imm_expr.X_add_number);
9483 imm_expr.X_add_number = 0;
9484 }
9485 INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number);
9486 imm_expr.X_op = O_absent;
9487 s = expr_end;
9488 continue;
9489
9490 case 'X':
9491 /* bbit[01] bit index when bbit is used but we generate
9492 bbit[01]32 because the index is over 32. Move to the
9493 next candidate if index is not in the valid range. */
9494 my_getExpression (&imm_expr, s);
9495 check_absolute_expr (ip, &imm_expr);
9496 if ((unsigned) imm_expr.X_add_number < 32
9497 || (unsigned) imm_expr.X_add_number > 63)
9498 break;
9499 INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number - 32);
9500 imm_expr.X_op = O_absent;
9501 s = expr_end;
9502 continue;
9503
9504 case 'p':
9505 /* cins, cins32, exts and exts32 position field. Give error
9506 if it's not in the valid range. */
9507 my_getExpression (&imm_expr, s);
9508 check_absolute_expr (ip, &imm_expr);
9509 if ((unsigned) imm_expr.X_add_number > 31)
9510 {
9511 as_bad (_("Improper position (%lu)"),
9512 (unsigned long) imm_expr.X_add_number);
9513 imm_expr.X_add_number = 0;
9514 }
9515 /* Make the pos explicit to simplify +S. */
9516 lastpos = imm_expr.X_add_number + 32;
9517 INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number);
9518 imm_expr.X_op = O_absent;
9519 s = expr_end;
9520 continue;
9521
9522 case 'P':
9523 /* cins, cins32, exts and exts32 position field. Move to
9524 the next candidate if it's not in the valid range. */
9525 my_getExpression (&imm_expr, s);
9526 check_absolute_expr (ip, &imm_expr);
9527 if ((unsigned) imm_expr.X_add_number < 32
9528 || (unsigned) imm_expr.X_add_number > 63)
9529 break;
9530 lastpos = imm_expr.X_add_number;
9531 INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number - 32);
9532 imm_expr.X_op = O_absent;
9533 s = expr_end;
9534 continue;
9535
9536 case 's':
9537 /* cins and exts length-minus-one field. */
9538 my_getExpression (&imm_expr, s);
9539 check_absolute_expr (ip, &imm_expr);
9540 if ((unsigned long) imm_expr.X_add_number > 31)
9541 {
9542 as_bad (_("Improper size (%lu)"),
9543 (unsigned long) imm_expr.X_add_number);
9544 imm_expr.X_add_number = 0;
9545 }
9546 INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9547 imm_expr.X_op = O_absent;
9548 s = expr_end;
9549 continue;
9550
9551 case 'S':
9552 /* cins32/exts32 and cins/exts aliasing cint32/exts32
9553 length-minus-one field. */
9554 my_getExpression (&imm_expr, s);
9555 check_absolute_expr (ip, &imm_expr);
9556 if ((long) imm_expr.X_add_number < 0
9557 || (unsigned long) imm_expr.X_add_number + lastpos > 63)
9558 {
9559 as_bad (_("Improper size (%lu)"),
9560 (unsigned long) imm_expr.X_add_number);
9561 imm_expr.X_add_number = 0;
9562 }
9563 INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9564 imm_expr.X_op = O_absent;
9565 s = expr_end;
9566 continue;
9567
dd3cbb7e
NC
9568 case 'Q':
9569 /* seqi/snei immediate field. */
9570 my_getExpression (&imm_expr, s);
9571 check_absolute_expr (ip, &imm_expr);
9572 if ((long) imm_expr.X_add_number < -512
9573 || (long) imm_expr.X_add_number >= 512)
9574 {
9575 as_bad (_("Improper immediate (%ld)"),
9576 (long) imm_expr.X_add_number);
9577 imm_expr.X_add_number = 0;
9578 }
9579 INSERT_OPERAND (SEQI, *ip, imm_expr.X_add_number);
9580 imm_expr.X_op = O_absent;
9581 s = expr_end;
9582 continue;
9583
98675402
RS
9584 case 'a': /* 8-bit signed offset in bit 6 */
9585 my_getExpression (&imm_expr, s);
9586 check_absolute_expr (ip, &imm_expr);
9587 min_range = -((OP_MASK_OFFSET_A + 1) >> 1);
9588 max_range = ((OP_MASK_OFFSET_A + 1) >> 1) - 1;
9589 if (imm_expr.X_add_number < min_range
9590 || imm_expr.X_add_number > max_range)
9591 {
c95354ed 9592 as_bad (_("Offset not in range %ld..%ld (%ld)"),
98675402
RS
9593 (long) min_range, (long) max_range,
9594 (long) imm_expr.X_add_number);
9595 }
9596 INSERT_OPERAND (OFFSET_A, *ip, imm_expr.X_add_number);
9597 imm_expr.X_op = O_absent;
9598 s = expr_end;
9599 continue;
9600
9601 case 'b': /* 8-bit signed offset in bit 3 */
9602 my_getExpression (&imm_expr, s);
9603 check_absolute_expr (ip, &imm_expr);
9604 min_range = -((OP_MASK_OFFSET_B + 1) >> 1);
9605 max_range = ((OP_MASK_OFFSET_B + 1) >> 1) - 1;
9606 if (imm_expr.X_add_number < min_range
9607 || imm_expr.X_add_number > max_range)
9608 {
c95354ed 9609 as_bad (_("Offset not in range %ld..%ld (%ld)"),
98675402
RS
9610 (long) min_range, (long) max_range,
9611 (long) imm_expr.X_add_number);
9612 }
9613 INSERT_OPERAND (OFFSET_B, *ip, imm_expr.X_add_number);
9614 imm_expr.X_op = O_absent;
9615 s = expr_end;
9616 continue;
9617
9618 case 'c': /* 9-bit signed offset in bit 6 */
9619 my_getExpression (&imm_expr, s);
9620 check_absolute_expr (ip, &imm_expr);
9621 min_range = -((OP_MASK_OFFSET_C + 1) >> 1);
9622 max_range = ((OP_MASK_OFFSET_C + 1) >> 1) - 1;
c95354ed
MX
9623 /* We check the offset range before adjusted. */
9624 min_range <<= 4;
9625 max_range <<= 4;
98675402
RS
9626 if (imm_expr.X_add_number < min_range
9627 || imm_expr.X_add_number > max_range)
9628 {
c95354ed 9629 as_bad (_("Offset not in range %ld..%ld (%ld)"),
98675402
RS
9630 (long) min_range, (long) max_range,
9631 (long) imm_expr.X_add_number);
9632 }
c95354ed
MX
9633 if (imm_expr.X_add_number & 0xf)
9634 {
9635 as_bad (_("Offset not 16 bytes alignment (%ld)"),
9636 (long) imm_expr.X_add_number);
9637 }
9638 /* Right shift 4 bits to adjust the offset operand. */
9639 INSERT_OPERAND (OFFSET_C, *ip, imm_expr.X_add_number >> 4);
98675402
RS
9640 imm_expr.X_op = O_absent;
9641 s = expr_end;
9642 continue;
9643
9644 case 'z':
9645 if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
9646 break;
9647 if (regno == AT && mips_opts.at)
9648 {
9649 if (mips_opts.at == ATREG)
9650 as_warn (_("used $at without \".set noat\""));
9651 else
9652 as_warn (_("used $%u with \".set at=$%u\""),
9653 regno, mips_opts.at);
9654 }
9655 INSERT_OPERAND (RZ, *ip, regno);
9656 continue;
9657
9658 case 'Z':
9659 if (!reg_lookup (&s, RTYPE_FPU, &regno))
9660 break;
9661 INSERT_OPERAND (FZ, *ip, regno);
9662 continue;
9663
af7ee8bf 9664 default:
f71d0d44 9665 as_bad (_("Internal error: bad mips opcode "
90ecf173
MR
9666 "(unknown extension operand type `+%c'): %s %s"),
9667 *args, insn->name, insn->args);
af7ee8bf
CD
9668 /* Further processing is fruitless. */
9669 return;
9670 }
9671 break;
9672
252b5132
RH
9673 case '<': /* must be at least one digit */
9674 /*
9675 * According to the manual, if the shift amount is greater
b6ff326e
KH
9676 * than 31 or less than 0, then the shift amount should be
9677 * mod 32. In reality the mips assembler issues an error.
252b5132
RH
9678 * We issue a warning and mask out all but the low 5 bits.
9679 */
9680 my_getExpression (&imm_expr, s);
9681 check_absolute_expr (ip, &imm_expr);
9682 if ((unsigned long) imm_expr.X_add_number > 31)
bf12938e
RS
9683 as_warn (_("Improper shift amount (%lu)"),
9684 (unsigned long) imm_expr.X_add_number);
9685 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
252b5132
RH
9686 imm_expr.X_op = O_absent;
9687 s = expr_end;
9688 continue;
9689
9690 case '>': /* shift amount minus 32 */
9691 my_getExpression (&imm_expr, s);
9692 check_absolute_expr (ip, &imm_expr);
9693 if ((unsigned long) imm_expr.X_add_number < 32
9694 || (unsigned long) imm_expr.X_add_number > 63)
9695 break;
bf12938e 9696 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number - 32);
252b5132
RH
9697 imm_expr.X_op = O_absent;
9698 s = expr_end;
9699 continue;
9700
90ecf173
MR
9701 case 'k': /* CACHE code. */
9702 case 'h': /* PREFX code. */
9703 case '1': /* SYNC type. */
252b5132
RH
9704 my_getExpression (&imm_expr, s);
9705 check_absolute_expr (ip, &imm_expr);
9706 if ((unsigned long) imm_expr.X_add_number > 31)
bf12938e
RS
9707 as_warn (_("Invalid value for `%s' (%lu)"),
9708 ip->insn_mo->name,
9709 (unsigned long) imm_expr.X_add_number);
252b5132 9710 if (*args == 'k')
d954098f
DD
9711 {
9712 if (mips_fix_cn63xxp1 && strcmp ("pref", insn->name) == 0)
9713 switch (imm_expr.X_add_number)
9714 {
9715 case 5:
9716 case 25:
9717 case 26:
9718 case 27:
9719 case 28:
9720 case 29:
9721 case 30:
9722 case 31: /* These are ok. */
9723 break;
9724
9725 default: /* The rest must be changed to 28. */
9726 imm_expr.X_add_number = 28;
9727 break;
9728 }
9729 INSERT_OPERAND (CACHE, *ip, imm_expr.X_add_number);
9730 }
620edafd 9731 else if (*args == 'h')
bf12938e 9732 INSERT_OPERAND (PREFX, *ip, imm_expr.X_add_number);
620edafd
CF
9733 else
9734 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
252b5132
RH
9735 imm_expr.X_op = O_absent;
9736 s = expr_end;
9737 continue;
9738
90ecf173 9739 case 'c': /* BREAK code. */
252b5132
RH
9740 my_getExpression (&imm_expr, s);
9741 check_absolute_expr (ip, &imm_expr);
a9e24354
TS
9742 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE)
9743 as_warn (_("Code for %s not in range 0..1023 (%lu)"),
9744 ip->insn_mo->name,
bf12938e
RS
9745 (unsigned long) imm_expr.X_add_number);
9746 INSERT_OPERAND (CODE, *ip, imm_expr.X_add_number);
252b5132
RH
9747 imm_expr.X_op = O_absent;
9748 s = expr_end;
9749 continue;
9750
90ecf173 9751 case 'q': /* Lower BREAK code. */
252b5132
RH
9752 my_getExpression (&imm_expr, s);
9753 check_absolute_expr (ip, &imm_expr);
a9e24354
TS
9754 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE2)
9755 as_warn (_("Lower code for %s not in range 0..1023 (%lu)"),
9756 ip->insn_mo->name,
bf12938e
RS
9757 (unsigned long) imm_expr.X_add_number);
9758 INSERT_OPERAND (CODE2, *ip, imm_expr.X_add_number);
252b5132
RH
9759 imm_expr.X_op = O_absent;
9760 s = expr_end;
9761 continue;
9762
90ecf173 9763 case 'B': /* 20-bit SYSCALL/BREAK code. */
156c2f8b 9764 my_getExpression (&imm_expr, s);
156c2f8b 9765 check_absolute_expr (ip, &imm_expr);
793b27f4 9766 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
a9e24354
TS
9767 as_warn (_("Code for %s not in range 0..1048575 (%lu)"),
9768 ip->insn_mo->name,
793b27f4 9769 (unsigned long) imm_expr.X_add_number);
bf12938e 9770 INSERT_OPERAND (CODE20, *ip, imm_expr.X_add_number);
252b5132
RH
9771 imm_expr.X_op = O_absent;
9772 s = expr_end;
9773 continue;
9774
90ecf173 9775 case 'C': /* Coprocessor code. */
beae10d5 9776 my_getExpression (&imm_expr, s);
252b5132 9777 check_absolute_expr (ip, &imm_expr);
a9e24354 9778 if ((unsigned long) imm_expr.X_add_number > OP_MASK_COPZ)
252b5132 9779 {
793b27f4
TS
9780 as_warn (_("Coproccesor code > 25 bits (%lu)"),
9781 (unsigned long) imm_expr.X_add_number);
a9e24354 9782 imm_expr.X_add_number &= OP_MASK_COPZ;
252b5132 9783 }
a9e24354 9784 INSERT_OPERAND (COPZ, *ip, imm_expr.X_add_number);
beae10d5
KH
9785 imm_expr.X_op = O_absent;
9786 s = expr_end;
9787 continue;
252b5132 9788
90ecf173 9789 case 'J': /* 19-bit WAIT code. */
4372b673
NC
9790 my_getExpression (&imm_expr, s);
9791 check_absolute_expr (ip, &imm_expr);
793b27f4 9792 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
a9e24354
TS
9793 {
9794 as_warn (_("Illegal 19-bit code (%lu)"),
9795 (unsigned long) imm_expr.X_add_number);
9796 imm_expr.X_add_number &= OP_MASK_CODE19;
9797 }
bf12938e 9798 INSERT_OPERAND (CODE19, *ip, imm_expr.X_add_number);
4372b673
NC
9799 imm_expr.X_op = O_absent;
9800 s = expr_end;
9801 continue;
9802
707bfff6 9803 case 'P': /* Performance register. */
beae10d5 9804 my_getExpression (&imm_expr, s);
252b5132 9805 check_absolute_expr (ip, &imm_expr);
beae10d5 9806 if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
bf12938e
RS
9807 as_warn (_("Invalid performance register (%lu)"),
9808 (unsigned long) imm_expr.X_add_number);
9809 INSERT_OPERAND (PERFREG, *ip, imm_expr.X_add_number);
beae10d5
KH
9810 imm_expr.X_op = O_absent;
9811 s = expr_end;
9812 continue;
252b5132 9813
707bfff6
TS
9814 case 'G': /* Coprocessor destination register. */
9815 if (((ip->insn_opcode >> OP_SH_OP) & OP_MASK_OP) == OP_OP_COP0)
9816 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_CP0, &regno);
9817 else
9818 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
a9e24354 9819 INSERT_OPERAND (RD, *ip, regno);
707bfff6
TS
9820 if (ok)
9821 {
9822 lastregno = regno;
9823 continue;
9824 }
9825 else
9826 break;
9827
90ecf173
MR
9828 case 'b': /* Base register. */
9829 case 'd': /* Destination register. */
9830 case 's': /* Source register. */
9831 case 't': /* Target register. */
9832 case 'r': /* Both target and source. */
9833 case 'v': /* Both dest and source. */
9834 case 'w': /* Both dest and target. */
9835 case 'E': /* Coprocessor target register. */
9836 case 'K': /* RDHWR destination register. */
9837 case 'x': /* Ignore register name. */
9838 case 'z': /* Must be zero register. */
9839 case 'U': /* Destination register (CLO/CLZ). */
9840 case 'g': /* Coprocessor destination register. */
9841 s_reset = s;
707bfff6
TS
9842 if (*args == 'E' || *args == 'K')
9843 ok = reg_lookup (&s, RTYPE_NUM, &regno);
9844 else
9845 {
9846 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
741fe287
MR
9847 if (regno == AT && mips_opts.at)
9848 {
9849 if (mips_opts.at == ATREG)
f71d0d44 9850 as_warn (_("Used $at without \".set noat\""));
741fe287 9851 else
f71d0d44 9852 as_warn (_("Used $%u with \".set at=$%u\""),
741fe287
MR
9853 regno, mips_opts.at);
9854 }
707bfff6
TS
9855 }
9856 if (ok)
252b5132 9857 {
252b5132
RH
9858 c = *args;
9859 if (*s == ' ')
f9419b05 9860 ++s;
252b5132
RH
9861 if (args[1] != *s)
9862 {
9863 if (c == 'r' || c == 'v' || c == 'w')
9864 {
9865 regno = lastregno;
9866 s = s_reset;
f9419b05 9867 ++args;
252b5132
RH
9868 }
9869 }
9870 /* 'z' only matches $0. */
9871 if (c == 'z' && regno != 0)
9872 break;
9873
24864476 9874 if (c == 's' && !strncmp (ip->insn_mo->name, "jalr", 4))
e7c604dd
CM
9875 {
9876 if (regno == lastregno)
90ecf173
MR
9877 {
9878 insn_error
f71d0d44 9879 = _("Source and destination must be different");
e7c604dd 9880 continue;
90ecf173 9881 }
24864476 9882 if (regno == 31 && lastregno == 0xffffffff)
90ecf173
MR
9883 {
9884 insn_error
f71d0d44 9885 = _("A destination register must be supplied");
e7c604dd 9886 continue;
90ecf173 9887 }
e7c604dd 9888 }
90ecf173
MR
9889 /* Now that we have assembled one operand, we use the args
9890 string to figure out where it goes in the instruction. */
252b5132
RH
9891 switch (c)
9892 {
9893 case 'r':
9894 case 's':
9895 case 'v':
9896 case 'b':
bf12938e 9897 INSERT_OPERAND (RS, *ip, regno);
252b5132
RH
9898 break;
9899 case 'd':
af7ee8bf 9900 case 'K':
ef2e4d86 9901 case 'g':
bf12938e 9902 INSERT_OPERAND (RD, *ip, regno);
252b5132 9903 break;
4372b673 9904 case 'U':
bf12938e
RS
9905 INSERT_OPERAND (RD, *ip, regno);
9906 INSERT_OPERAND (RT, *ip, regno);
4372b673 9907 break;
252b5132
RH
9908 case 'w':
9909 case 't':
9910 case 'E':
bf12938e 9911 INSERT_OPERAND (RT, *ip, regno);
252b5132
RH
9912 break;
9913 case 'x':
9914 /* This case exists because on the r3000 trunc
9915 expands into a macro which requires a gp
9916 register. On the r6000 or r4000 it is
9917 assembled into a single instruction which
9918 ignores the register. Thus the insn version
9919 is MIPS_ISA2 and uses 'x', and the macro
9920 version is MIPS_ISA1 and uses 't'. */
9921 break;
9922 case 'z':
9923 /* This case is for the div instruction, which
9924 acts differently if the destination argument
9925 is $0. This only matches $0, and is checked
9926 outside the switch. */
9927 break;
252b5132
RH
9928 }
9929 lastregno = regno;
9930 continue;
9931 }
252b5132
RH
9932 switch (*args++)
9933 {
9934 case 'r':
9935 case 'v':
bf12938e 9936 INSERT_OPERAND (RS, *ip, lastregno);
252b5132
RH
9937 continue;
9938 case 'w':
bf12938e 9939 INSERT_OPERAND (RT, *ip, lastregno);
252b5132
RH
9940 continue;
9941 }
9942 break;
9943
deec1734
CD
9944 case 'O': /* MDMX alignment immediate constant. */
9945 my_getExpression (&imm_expr, s);
9946 check_absolute_expr (ip, &imm_expr);
9947 if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
20203fb9 9948 as_warn (_("Improper align amount (%ld), using low bits"),
bf12938e
RS
9949 (long) imm_expr.X_add_number);
9950 INSERT_OPERAND (ALN, *ip, imm_expr.X_add_number);
deec1734
CD
9951 imm_expr.X_op = O_absent;
9952 s = expr_end;
9953 continue;
9954
9955 case 'Q': /* MDMX vector, element sel, or const. */
9956 if (s[0] != '$')
9957 {
9958 /* MDMX Immediate. */
9959 my_getExpression (&imm_expr, s);
9960 check_absolute_expr (ip, &imm_expr);
9961 if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
bf12938e
RS
9962 as_warn (_("Invalid MDMX Immediate (%ld)"),
9963 (long) imm_expr.X_add_number);
9964 INSERT_OPERAND (FT, *ip, imm_expr.X_add_number);
deec1734
CD
9965 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9966 ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
9967 else
9968 ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
deec1734
CD
9969 imm_expr.X_op = O_absent;
9970 s = expr_end;
9971 continue;
9972 }
9973 /* Not MDMX Immediate. Fall through. */
9974 case 'X': /* MDMX destination register. */
9975 case 'Y': /* MDMX source register. */
9976 case 'Z': /* MDMX target register. */
9977 is_mdmx = 1;
90ecf173
MR
9978 case 'D': /* Floating point destination register. */
9979 case 'S': /* Floating point source register. */
9980 case 'T': /* Floating point target register. */
9981 case 'R': /* Floating point source register. */
252b5132
RH
9982 case 'V':
9983 case 'W':
707bfff6
TS
9984 rtype = RTYPE_FPU;
9985 if (is_mdmx
9986 || (mips_opts.ase_mdmx
9987 && (ip->insn_mo->pinfo & FP_D)
9988 && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
9989 | INSN_COPROC_MEMORY_DELAY
9990 | INSN_LOAD_COPROC_DELAY
9991 | INSN_LOAD_MEMORY_DELAY
9992 | INSN_STORE_MEMORY))))
9993 rtype |= RTYPE_VEC;
252b5132 9994 s_reset = s;
707bfff6 9995 if (reg_lookup (&s, rtype, &regno))
252b5132 9996 {
252b5132 9997 if ((regno & 1) != 0
ca4e0257 9998 && HAVE_32BIT_FPRS
90ecf173 9999 && !mips_oddfpreg_ok (ip->insn_mo, argnum))
252b5132
RH
10000 as_warn (_("Float register should be even, was %d"),
10001 regno);
10002
10003 c = *args;
10004 if (*s == ' ')
f9419b05 10005 ++s;
252b5132
RH
10006 if (args[1] != *s)
10007 {
10008 if (c == 'V' || c == 'W')
10009 {
10010 regno = lastregno;
10011 s = s_reset;
f9419b05 10012 ++args;
252b5132
RH
10013 }
10014 }
10015 switch (c)
10016 {
10017 case 'D':
deec1734 10018 case 'X':
bf12938e 10019 INSERT_OPERAND (FD, *ip, regno);
252b5132
RH
10020 break;
10021 case 'V':
10022 case 'S':
deec1734 10023 case 'Y':
bf12938e 10024 INSERT_OPERAND (FS, *ip, regno);
252b5132 10025 break;
deec1734
CD
10026 case 'Q':
10027 /* This is like 'Z', but also needs to fix the MDMX
10028 vector/scalar select bits. Note that the
10029 scalar immediate case is handled above. */
10030 if (*s == '[')
10031 {
10032 int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
10033 int max_el = (is_qh ? 3 : 7);
10034 s++;
10035 my_getExpression(&imm_expr, s);
10036 check_absolute_expr (ip, &imm_expr);
10037 s = expr_end;
10038 if (imm_expr.X_add_number > max_el)
20203fb9
NC
10039 as_bad (_("Bad element selector %ld"),
10040 (long) imm_expr.X_add_number);
deec1734
CD
10041 imm_expr.X_add_number &= max_el;
10042 ip->insn_opcode |= (imm_expr.X_add_number
10043 << (OP_SH_VSEL +
10044 (is_qh ? 2 : 1)));
01a3f561 10045 imm_expr.X_op = O_absent;
deec1734 10046 if (*s != ']')
20203fb9 10047 as_warn (_("Expecting ']' found '%s'"), s);
deec1734
CD
10048 else
10049 s++;
10050 }
10051 else
10052 {
10053 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
10054 ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
10055 << OP_SH_VSEL);
10056 else
10057 ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
10058 OP_SH_VSEL);
10059 }
90ecf173 10060 /* Fall through. */
252b5132
RH
10061 case 'W':
10062 case 'T':
deec1734 10063 case 'Z':
bf12938e 10064 INSERT_OPERAND (FT, *ip, regno);
252b5132
RH
10065 break;
10066 case 'R':
bf12938e 10067 INSERT_OPERAND (FR, *ip, regno);
252b5132
RH
10068 break;
10069 }
10070 lastregno = regno;
10071 continue;
10072 }
10073
252b5132
RH
10074 switch (*args++)
10075 {
10076 case 'V':
bf12938e 10077 INSERT_OPERAND (FS, *ip, lastregno);
252b5132
RH
10078 continue;
10079 case 'W':
bf12938e 10080 INSERT_OPERAND (FT, *ip, lastregno);
252b5132
RH
10081 continue;
10082 }
10083 break;
10084
10085 case 'I':
10086 my_getExpression (&imm_expr, s);
10087 if (imm_expr.X_op != O_big
10088 && imm_expr.X_op != O_constant)
10089 insn_error = _("absolute expression required");
9ee2a2d4
MR
10090 if (HAVE_32BIT_GPRS)
10091 normalize_constant_expr (&imm_expr);
252b5132
RH
10092 s = expr_end;
10093 continue;
10094
10095 case 'A':
10096 my_getExpression (&offset_expr, s);
2051e8c4 10097 normalize_address_expr (&offset_expr);
f6688943 10098 *imm_reloc = BFD_RELOC_32;
252b5132
RH
10099 s = expr_end;
10100 continue;
10101
10102 case 'F':
10103 case 'L':
10104 case 'f':
10105 case 'l':
10106 {
10107 int f64;
ca4e0257 10108 int using_gprs;
252b5132
RH
10109 char *save_in;
10110 char *err;
10111 unsigned char temp[8];
10112 int len;
10113 unsigned int length;
10114 segT seg;
10115 subsegT subseg;
10116 char *p;
10117
10118 /* These only appear as the last operand in an
10119 instruction, and every instruction that accepts
10120 them in any variant accepts them in all variants.
10121 This means we don't have to worry about backing out
10122 any changes if the instruction does not match.
10123
10124 The difference between them is the size of the
10125 floating point constant and where it goes. For 'F'
10126 and 'L' the constant is 64 bits; for 'f' and 'l' it
10127 is 32 bits. Where the constant is placed is based
10128 on how the MIPS assembler does things:
10129 F -- .rdata
10130 L -- .lit8
10131 f -- immediate value
10132 l -- .lit4
10133
10134 The .lit4 and .lit8 sections are only used if
10135 permitted by the -G argument.
10136
ca4e0257
RS
10137 The code below needs to know whether the target register
10138 is 32 or 64 bits wide. It relies on the fact 'f' and
10139 'F' are used with GPR-based instructions and 'l' and
10140 'L' are used with FPR-based instructions. */
252b5132
RH
10141
10142 f64 = *args == 'F' || *args == 'L';
ca4e0257 10143 using_gprs = *args == 'F' || *args == 'f';
252b5132
RH
10144
10145 save_in = input_line_pointer;
10146 input_line_pointer = s;
10147 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
10148 length = len;
10149 s = input_line_pointer;
10150 input_line_pointer = save_in;
10151 if (err != NULL && *err != '\0')
10152 {
10153 as_bad (_("Bad floating point constant: %s"), err);
10154 memset (temp, '\0', sizeof temp);
10155 length = f64 ? 8 : 4;
10156 }
10157
9c2799c2 10158 gas_assert (length == (unsigned) (f64 ? 8 : 4));
252b5132
RH
10159
10160 if (*args == 'f'
10161 || (*args == 'l'
3e722fb5 10162 && (g_switch_value < 4
252b5132
RH
10163 || (temp[0] == 0 && temp[1] == 0)
10164 || (temp[2] == 0 && temp[3] == 0))))
10165 {
10166 imm_expr.X_op = O_constant;
90ecf173 10167 if (!target_big_endian)
252b5132
RH
10168 imm_expr.X_add_number = bfd_getl32 (temp);
10169 else
10170 imm_expr.X_add_number = bfd_getb32 (temp);
10171 }
10172 else if (length > 4
90ecf173 10173 && !mips_disable_float_construction
ca4e0257
RS
10174 /* Constants can only be constructed in GPRs and
10175 copied to FPRs if the GPRs are at least as wide
10176 as the FPRs. Force the constant into memory if
10177 we are using 64-bit FPRs but the GPRs are only
10178 32 bits wide. */
10179 && (using_gprs
90ecf173 10180 || !(HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
252b5132
RH
10181 && ((temp[0] == 0 && temp[1] == 0)
10182 || (temp[2] == 0 && temp[3] == 0))
10183 && ((temp[4] == 0 && temp[5] == 0)
10184 || (temp[6] == 0 && temp[7] == 0)))
10185 {
ca4e0257 10186 /* The value is simple enough to load with a couple of
90ecf173
MR
10187 instructions. If using 32-bit registers, set
10188 imm_expr to the high order 32 bits and offset_expr to
10189 the low order 32 bits. Otherwise, set imm_expr to
10190 the entire 64 bit constant. */
ca4e0257 10191 if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
252b5132
RH
10192 {
10193 imm_expr.X_op = O_constant;
10194 offset_expr.X_op = O_constant;
90ecf173 10195 if (!target_big_endian)
252b5132
RH
10196 {
10197 imm_expr.X_add_number = bfd_getl32 (temp + 4);
10198 offset_expr.X_add_number = bfd_getl32 (temp);
10199 }
10200 else
10201 {
10202 imm_expr.X_add_number = bfd_getb32 (temp);
10203 offset_expr.X_add_number = bfd_getb32 (temp + 4);
10204 }
10205 if (offset_expr.X_add_number == 0)
10206 offset_expr.X_op = O_absent;
10207 }
10208 else if (sizeof (imm_expr.X_add_number) > 4)
10209 {
10210 imm_expr.X_op = O_constant;
90ecf173 10211 if (!target_big_endian)
252b5132
RH
10212 imm_expr.X_add_number = bfd_getl64 (temp);
10213 else
10214 imm_expr.X_add_number = bfd_getb64 (temp);
10215 }
10216 else
10217 {
10218 imm_expr.X_op = O_big;
10219 imm_expr.X_add_number = 4;
90ecf173 10220 if (!target_big_endian)
252b5132
RH
10221 {
10222 generic_bignum[0] = bfd_getl16 (temp);
10223 generic_bignum[1] = bfd_getl16 (temp + 2);
10224 generic_bignum[2] = bfd_getl16 (temp + 4);
10225 generic_bignum[3] = bfd_getl16 (temp + 6);
10226 }
10227 else
10228 {
10229 generic_bignum[0] = bfd_getb16 (temp + 6);
10230 generic_bignum[1] = bfd_getb16 (temp + 4);
10231 generic_bignum[2] = bfd_getb16 (temp + 2);
10232 generic_bignum[3] = bfd_getb16 (temp);
10233 }
10234 }
10235 }
10236 else
10237 {
10238 const char *newname;
10239 segT new_seg;
10240
10241 /* Switch to the right section. */
10242 seg = now_seg;
10243 subseg = now_subseg;
10244 switch (*args)
10245 {
10246 default: /* unused default case avoids warnings. */
10247 case 'L':
10248 newname = RDATA_SECTION_NAME;
3e722fb5 10249 if (g_switch_value >= 8)
252b5132
RH
10250 newname = ".lit8";
10251 break;
10252 case 'F':
3e722fb5 10253 newname = RDATA_SECTION_NAME;
252b5132
RH
10254 break;
10255 case 'l':
9c2799c2 10256 gas_assert (g_switch_value >= 4);
252b5132
RH
10257 newname = ".lit4";
10258 break;
10259 }
10260 new_seg = subseg_new (newname, (subsegT) 0);
f43abd2b 10261 if (IS_ELF)
252b5132
RH
10262 bfd_set_section_flags (stdoutput, new_seg,
10263 (SEC_ALLOC
10264 | SEC_LOAD
10265 | SEC_READONLY
10266 | SEC_DATA));
10267 frag_align (*args == 'l' ? 2 : 3, 0, 0);
c41e87e3 10268 if (IS_ELF && strncmp (TARGET_OS, "elf", 3) != 0)
252b5132
RH
10269 record_alignment (new_seg, 4);
10270 else
10271 record_alignment (new_seg, *args == 'l' ? 2 : 3);
10272 if (seg == now_seg)
10273 as_bad (_("Can't use floating point insn in this section"));
10274
10275 /* Set the argument to the current address in the
10276 section. */
10277 offset_expr.X_op = O_symbol;
8680f6e1 10278 offset_expr.X_add_symbol = symbol_temp_new_now ();
252b5132
RH
10279 offset_expr.X_add_number = 0;
10280
10281 /* Put the floating point number into the section. */
10282 p = frag_more ((int) length);
10283 memcpy (p, temp, length);
10284
10285 /* Switch back to the original section. */
10286 subseg_set (seg, subseg);
10287 }
10288 }
10289 continue;
10290
90ecf173
MR
10291 case 'i': /* 16-bit unsigned immediate. */
10292 case 'j': /* 16-bit signed immediate. */
f6688943 10293 *imm_reloc = BFD_RELOC_LO16;
5e0116d5 10294 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
252b5132
RH
10295 {
10296 int more;
5e0116d5
RS
10297 offsetT minval, maxval;
10298
10299 more = (insn + 1 < &mips_opcodes[NUMOPCODES]
10300 && strcmp (insn->name, insn[1].name) == 0);
10301
10302 /* If the expression was written as an unsigned number,
10303 only treat it as signed if there are no more
10304 alternatives. */
10305 if (more
10306 && *args == 'j'
10307 && sizeof (imm_expr.X_add_number) <= 4
10308 && imm_expr.X_op == O_constant
10309 && imm_expr.X_add_number < 0
10310 && imm_expr.X_unsigned
10311 && HAVE_64BIT_GPRS)
10312 break;
10313
10314 /* For compatibility with older assemblers, we accept
10315 0x8000-0xffff as signed 16-bit numbers when only
10316 signed numbers are allowed. */
10317 if (*args == 'i')
10318 minval = 0, maxval = 0xffff;
10319 else if (more)
10320 minval = -0x8000, maxval = 0x7fff;
252b5132 10321 else
5e0116d5
RS
10322 minval = -0x8000, maxval = 0xffff;
10323
10324 if (imm_expr.X_op != O_constant
10325 || imm_expr.X_add_number < minval
10326 || imm_expr.X_add_number > maxval)
252b5132
RH
10327 {
10328 if (more)
10329 break;
2ae7e77b
AH
10330 if (imm_expr.X_op == O_constant
10331 || imm_expr.X_op == O_big)
f71d0d44 10332 as_bad (_("Expression out of range"));
252b5132
RH
10333 }
10334 }
10335 s = expr_end;
10336 continue;
10337
90ecf173 10338 case 'o': /* 16-bit offset. */
4614d845
MR
10339 offset_reloc[0] = BFD_RELOC_LO16;
10340 offset_reloc[1] = BFD_RELOC_UNUSED;
10341 offset_reloc[2] = BFD_RELOC_UNUSED;
10342
5e0116d5
RS
10343 /* Check whether there is only a single bracketed expression
10344 left. If so, it must be the base register and the
10345 constant must be zero. */
10346 if (*s == '(' && strchr (s + 1, '(') == 0)
10347 {
10348 offset_expr.X_op = O_constant;
10349 offset_expr.X_add_number = 0;
10350 continue;
10351 }
252b5132
RH
10352
10353 /* If this value won't fit into a 16 bit offset, then go
10354 find a macro that will generate the 32 bit offset
afdbd6d0 10355 code pattern. */
5e0116d5 10356 if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
252b5132
RH
10357 && (offset_expr.X_op != O_constant
10358 || offset_expr.X_add_number >= 0x8000
afdbd6d0 10359 || offset_expr.X_add_number < -0x8000))
252b5132
RH
10360 break;
10361
252b5132
RH
10362 s = expr_end;
10363 continue;
10364
90ecf173 10365 case 'p': /* PC-relative offset. */
0b25d3e6 10366 *offset_reloc = BFD_RELOC_16_PCREL_S2;
252b5132
RH
10367 my_getExpression (&offset_expr, s);
10368 s = expr_end;
10369 continue;
10370
90ecf173 10371 case 'u': /* Upper 16 bits. */
5e0116d5
RS
10372 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
10373 && imm_expr.X_op == O_constant
10374 && (imm_expr.X_add_number < 0
10375 || imm_expr.X_add_number >= 0x10000))
88320db2
MR
10376 as_bad (_("lui expression (%lu) not in range 0..65535"),
10377 (unsigned long) imm_expr.X_add_number);
252b5132
RH
10378 s = expr_end;
10379 continue;
10380
90ecf173 10381 case 'a': /* 26-bit address. */
252b5132
RH
10382 my_getExpression (&offset_expr, s);
10383 s = expr_end;
f6688943 10384 *offset_reloc = BFD_RELOC_MIPS_JMP;
252b5132
RH
10385 continue;
10386
90ecf173
MR
10387 case 'N': /* 3-bit branch condition code. */
10388 case 'M': /* 3-bit compare condition code. */
707bfff6 10389 rtype = RTYPE_CCC;
90ecf173 10390 if (ip->insn_mo->pinfo & (FP_D | FP_S))
707bfff6
TS
10391 rtype |= RTYPE_FCC;
10392 if (!reg_lookup (&s, rtype, &regno))
252b5132 10393 break;
90ecf173
MR
10394 if ((strcmp (str + strlen (str) - 3, ".ps") == 0
10395 || strcmp (str + strlen (str) - 5, "any2f") == 0
10396 || strcmp (str + strlen (str) - 5, "any2t") == 0)
30c378fd 10397 && (regno & 1) != 0)
90ecf173
MR
10398 as_warn (_("Condition code register should be even for %s, "
10399 "was %d"),
20203fb9 10400 str, regno);
90ecf173
MR
10401 if ((strcmp (str + strlen (str) - 5, "any4f") == 0
10402 || strcmp (str + strlen (str) - 5, "any4t") == 0)
30c378fd 10403 && (regno & 3) != 0)
90ecf173
MR
10404 as_warn (_("Condition code register should be 0 or 4 for %s, "
10405 "was %d"),
20203fb9 10406 str, regno);
252b5132 10407 if (*args == 'N')
bf12938e 10408 INSERT_OPERAND (BCC, *ip, regno);
252b5132 10409 else
bf12938e 10410 INSERT_OPERAND (CCC, *ip, regno);
beae10d5 10411 continue;
252b5132 10412
156c2f8b
NC
10413 case 'H':
10414 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
10415 s += 2;
3882b010 10416 if (ISDIGIT (*s))
156c2f8b
NC
10417 {
10418 c = 0;
10419 do
10420 {
10421 c *= 10;
10422 c += *s - '0';
10423 ++s;
10424 }
3882b010 10425 while (ISDIGIT (*s));
156c2f8b
NC
10426 }
10427 else
10428 c = 8; /* Invalid sel value. */
10429
10430 if (c > 7)
f71d0d44 10431 as_bad (_("Invalid coprocessor sub-selection value (0-7)"));
156c2f8b
NC
10432 ip->insn_opcode |= c;
10433 continue;
10434
60b63b72
RS
10435 case 'e':
10436 /* Must be at least one digit. */
10437 my_getExpression (&imm_expr, s);
10438 check_absolute_expr (ip, &imm_expr);
10439
10440 if ((unsigned long) imm_expr.X_add_number
10441 > (unsigned long) OP_MASK_VECBYTE)
10442 {
10443 as_bad (_("bad byte vector index (%ld)"),
10444 (long) imm_expr.X_add_number);
10445 imm_expr.X_add_number = 0;
10446 }
10447
bf12938e 10448 INSERT_OPERAND (VECBYTE, *ip, imm_expr.X_add_number);
60b63b72
RS
10449 imm_expr.X_op = O_absent;
10450 s = expr_end;
10451 continue;
10452
10453 case '%':
10454 my_getExpression (&imm_expr, s);
10455 check_absolute_expr (ip, &imm_expr);
10456
10457 if ((unsigned long) imm_expr.X_add_number
10458 > (unsigned long) OP_MASK_VECALIGN)
10459 {
10460 as_bad (_("bad byte vector index (%ld)"),
10461 (long) imm_expr.X_add_number);
10462 imm_expr.X_add_number = 0;
10463 }
10464
bf12938e 10465 INSERT_OPERAND (VECALIGN, *ip, imm_expr.X_add_number);
60b63b72
RS
10466 imm_expr.X_op = O_absent;
10467 s = expr_end;
10468 continue;
10469
252b5132 10470 default:
f71d0d44 10471 as_bad (_("Bad char = '%c'\n"), *args);
252b5132
RH
10472 internalError ();
10473 }
10474 break;
10475 }
10476 /* Args don't match. */
10477 if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
10478 !strcmp (insn->name, insn[1].name))
10479 {
10480 ++insn;
10481 s = argsStart;
f71d0d44 10482 insn_error = _("Illegal operands");
252b5132
RH
10483 continue;
10484 }
268f6bed 10485 if (save_c)
570de991 10486 *(--argsStart) = save_c;
f71d0d44 10487 insn_error = _("Illegal operands");
252b5132
RH
10488 return;
10489 }
10490}
10491
0499d65b
TS
10492#define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
10493
252b5132
RH
10494/* This routine assembles an instruction into its binary format when
10495 assembling for the mips16. As a side effect, it sets one of the
10496 global variables imm_reloc or offset_reloc to the type of
10497 relocation to do if one of the operands is an address expression.
10498 It also sets mips16_small and mips16_ext if the user explicitly
10499 requested a small or extended instruction. */
10500
10501static void
17a2f251 10502mips16_ip (char *str, struct mips_cl_insn *ip)
252b5132
RH
10503{
10504 char *s;
10505 const char *args;
10506 struct mips_opcode *insn;
10507 char *argsstart;
10508 unsigned int regno;
10509 unsigned int lastregno = 0;
10510 char *s_reset;
d6f16593 10511 size_t i;
252b5132
RH
10512
10513 insn_error = NULL;
10514
b34976b6
AM
10515 mips16_small = FALSE;
10516 mips16_ext = FALSE;
252b5132 10517
3882b010 10518 for (s = str; ISLOWER (*s); ++s)
252b5132
RH
10519 ;
10520 switch (*s)
10521 {
10522 case '\0':
10523 break;
10524
10525 case ' ':
10526 *s++ = '\0';
10527 break;
10528
10529 case '.':
10530 if (s[1] == 't' && s[2] == ' ')
10531 {
10532 *s = '\0';
b34976b6 10533 mips16_small = TRUE;
252b5132
RH
10534 s += 3;
10535 break;
10536 }
10537 else if (s[1] == 'e' && s[2] == ' ')
10538 {
10539 *s = '\0';
b34976b6 10540 mips16_ext = TRUE;
252b5132
RH
10541 s += 3;
10542 break;
10543 }
10544 /* Fall through. */
10545 default:
10546 insn_error = _("unknown opcode");
10547 return;
10548 }
10549
10550 if (mips_opts.noautoextend && ! mips16_ext)
b34976b6 10551 mips16_small = TRUE;
252b5132
RH
10552
10553 if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
10554 {
10555 insn_error = _("unrecognized opcode");
10556 return;
10557 }
10558
10559 argsstart = s;
10560 for (;;)
10561 {
9b3f89ee
TS
10562 bfd_boolean ok;
10563
9c2799c2 10564 gas_assert (strcmp (insn->name, str) == 0);
252b5132 10565
037b32b9 10566 ok = is_opcode_valid_16 (insn);
9b3f89ee
TS
10567 if (! ok)
10568 {
10569 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
10570 && strcmp (insn->name, insn[1].name) == 0)
10571 {
10572 ++insn;
10573 continue;
10574 }
10575 else
10576 {
10577 if (!insn_error)
10578 {
10579 static char buf[100];
10580 sprintf (buf,
10581 _("opcode not supported on this processor: %s (%s)"),
10582 mips_cpu_info_from_arch (mips_opts.arch)->name,
10583 mips_cpu_info_from_isa (mips_opts.isa)->name);
10584 insn_error = buf;
10585 }
10586 return;
10587 }
10588 }
10589
1e915849 10590 create_insn (ip, insn);
252b5132 10591 imm_expr.X_op = O_absent;
f6688943
TS
10592 imm_reloc[0] = BFD_RELOC_UNUSED;
10593 imm_reloc[1] = BFD_RELOC_UNUSED;
10594 imm_reloc[2] = BFD_RELOC_UNUSED;
5f74bc13 10595 imm2_expr.X_op = O_absent;
252b5132 10596 offset_expr.X_op = O_absent;
f6688943
TS
10597 offset_reloc[0] = BFD_RELOC_UNUSED;
10598 offset_reloc[1] = BFD_RELOC_UNUSED;
10599 offset_reloc[2] = BFD_RELOC_UNUSED;
252b5132
RH
10600 for (args = insn->args; 1; ++args)
10601 {
10602 int c;
10603
10604 if (*s == ' ')
10605 ++s;
10606
10607 /* In this switch statement we call break if we did not find
10608 a match, continue if we did find a match, or return if we
10609 are done. */
10610
10611 c = *args;
10612 switch (c)
10613 {
10614 case '\0':
10615 if (*s == '\0')
10616 {
10617 /* Stuff the immediate value in now, if we can. */
10618 if (imm_expr.X_op == O_constant
f6688943 10619 && *imm_reloc > BFD_RELOC_UNUSED
738e5348
RS
10620 && *imm_reloc != BFD_RELOC_MIPS16_GOT16
10621 && *imm_reloc != BFD_RELOC_MIPS16_CALL16
252b5132
RH
10622 && insn->pinfo != INSN_MACRO)
10623 {
d6f16593
MR
10624 valueT tmp;
10625
10626 switch (*offset_reloc)
10627 {
10628 case BFD_RELOC_MIPS16_HI16_S:
10629 tmp = (imm_expr.X_add_number + 0x8000) >> 16;
10630 break;
10631
10632 case BFD_RELOC_MIPS16_HI16:
10633 tmp = imm_expr.X_add_number >> 16;
10634 break;
10635
10636 case BFD_RELOC_MIPS16_LO16:
10637 tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
10638 - 0x8000;
10639 break;
10640
10641 case BFD_RELOC_UNUSED:
10642 tmp = imm_expr.X_add_number;
10643 break;
10644
10645 default:
10646 internalError ();
10647 }
10648 *offset_reloc = BFD_RELOC_UNUSED;
10649
c4e7957c 10650 mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
d6f16593 10651 tmp, TRUE, mips16_small,
252b5132
RH
10652 mips16_ext, &ip->insn_opcode,
10653 &ip->use_extend, &ip->extend);
10654 imm_expr.X_op = O_absent;
f6688943 10655 *imm_reloc = BFD_RELOC_UNUSED;
252b5132
RH
10656 }
10657
10658 return;
10659 }
10660 break;
10661
10662 case ',':
10663 if (*s++ == c)
10664 continue;
10665 s--;
10666 switch (*++args)
10667 {
10668 case 'v':
bf12938e 10669 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
252b5132
RH
10670 continue;
10671 case 'w':
bf12938e 10672 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
252b5132
RH
10673 continue;
10674 }
10675 break;
10676
10677 case '(':
10678 case ')':
10679 if (*s++ == c)
10680 continue;
10681 break;
10682
10683 case 'v':
10684 case 'w':
10685 if (s[0] != '$')
10686 {
10687 if (c == 'v')
bf12938e 10688 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
252b5132 10689 else
bf12938e 10690 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
252b5132
RH
10691 ++args;
10692 continue;
10693 }
10694 /* Fall through. */
10695 case 'x':
10696 case 'y':
10697 case 'z':
10698 case 'Z':
10699 case '0':
10700 case 'S':
10701 case 'R':
10702 case 'X':
10703 case 'Y':
707bfff6
TS
10704 s_reset = s;
10705 if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
252b5132 10706 {
707bfff6 10707 if (c == 'v' || c == 'w')
85b51719 10708 {
707bfff6 10709 if (c == 'v')
a9e24354 10710 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
707bfff6 10711 else
a9e24354 10712 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
707bfff6
TS
10713 ++args;
10714 continue;
85b51719 10715 }
707bfff6 10716 break;
252b5132
RH
10717 }
10718
10719 if (*s == ' ')
10720 ++s;
10721 if (args[1] != *s)
10722 {
10723 if (c == 'v' || c == 'w')
10724 {
10725 regno = mips16_to_32_reg_map[lastregno];
10726 s = s_reset;
f9419b05 10727 ++args;
252b5132
RH
10728 }
10729 }
10730
10731 switch (c)
10732 {
10733 case 'x':
10734 case 'y':
10735 case 'z':
10736 case 'v':
10737 case 'w':
10738 case 'Z':
10739 regno = mips32_to_16_reg_map[regno];
10740 break;
10741
10742 case '0':
10743 if (regno != 0)
10744 regno = ILLEGAL_REG;
10745 break;
10746
10747 case 'S':
10748 if (regno != SP)
10749 regno = ILLEGAL_REG;
10750 break;
10751
10752 case 'R':
10753 if (regno != RA)
10754 regno = ILLEGAL_REG;
10755 break;
10756
10757 case 'X':
10758 case 'Y':
741fe287
MR
10759 if (regno == AT && mips_opts.at)
10760 {
10761 if (mips_opts.at == ATREG)
10762 as_warn (_("used $at without \".set noat\""));
10763 else
10764 as_warn (_("used $%u with \".set at=$%u\""),
10765 regno, mips_opts.at);
10766 }
252b5132
RH
10767 break;
10768
10769 default:
10770 internalError ();
10771 }
10772
10773 if (regno == ILLEGAL_REG)
10774 break;
10775
10776 switch (c)
10777 {
10778 case 'x':
10779 case 'v':
bf12938e 10780 MIPS16_INSERT_OPERAND (RX, *ip, regno);
252b5132
RH
10781 break;
10782 case 'y':
10783 case 'w':
bf12938e 10784 MIPS16_INSERT_OPERAND (RY, *ip, regno);
252b5132
RH
10785 break;
10786 case 'z':
bf12938e 10787 MIPS16_INSERT_OPERAND (RZ, *ip, regno);
252b5132
RH
10788 break;
10789 case 'Z':
bf12938e 10790 MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
252b5132
RH
10791 case '0':
10792 case 'S':
10793 case 'R':
10794 break;
10795 case 'X':
bf12938e 10796 MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
252b5132
RH
10797 break;
10798 case 'Y':
10799 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
bf12938e 10800 MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
252b5132
RH
10801 break;
10802 default:
10803 internalError ();
10804 }
10805
10806 lastregno = regno;
10807 continue;
10808
10809 case 'P':
10810 if (strncmp (s, "$pc", 3) == 0)
10811 {
10812 s += 3;
10813 continue;
10814 }
10815 break;
10816
252b5132
RH
10817 case '5':
10818 case 'H':
10819 case 'W':
10820 case 'D':
10821 case 'j':
252b5132
RH
10822 case 'V':
10823 case 'C':
10824 case 'U':
10825 case 'k':
10826 case 'K':
d6f16593
MR
10827 i = my_getSmallExpression (&imm_expr, imm_reloc, s);
10828 if (i > 0)
252b5132 10829 {
d6f16593 10830 if (imm_expr.X_op != O_constant)
252b5132 10831 {
b34976b6 10832 mips16_ext = TRUE;
b34976b6 10833 ip->use_extend = TRUE;
252b5132 10834 ip->extend = 0;
252b5132 10835 }
d6f16593
MR
10836 else
10837 {
10838 /* We need to relax this instruction. */
10839 *offset_reloc = *imm_reloc;
10840 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10841 }
10842 s = expr_end;
10843 continue;
252b5132 10844 }
d6f16593
MR
10845 *imm_reloc = BFD_RELOC_UNUSED;
10846 /* Fall through. */
10847 case '<':
10848 case '>':
10849 case '[':
10850 case ']':
10851 case '4':
10852 case '8':
10853 my_getExpression (&imm_expr, s);
252b5132
RH
10854 if (imm_expr.X_op == O_register)
10855 {
10856 /* What we thought was an expression turned out to
10857 be a register. */
10858
10859 if (s[0] == '(' && args[1] == '(')
10860 {
10861 /* It looks like the expression was omitted
10862 before a register indirection, which means
10863 that the expression is implicitly zero. We
10864 still set up imm_expr, so that we handle
10865 explicit extensions correctly. */
10866 imm_expr.X_op = O_constant;
10867 imm_expr.X_add_number = 0;
f6688943 10868 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
252b5132
RH
10869 continue;
10870 }
10871
10872 break;
10873 }
10874
10875 /* We need to relax this instruction. */
f6688943 10876 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
252b5132
RH
10877 s = expr_end;
10878 continue;
10879
10880 case 'p':
10881 case 'q':
10882 case 'A':
10883 case 'B':
10884 case 'E':
10885 /* We use offset_reloc rather than imm_reloc for the PC
10886 relative operands. This lets macros with both
10887 immediate and address operands work correctly. */
10888 my_getExpression (&offset_expr, s);
10889
10890 if (offset_expr.X_op == O_register)
10891 break;
10892
10893 /* We need to relax this instruction. */
f6688943 10894 *offset_reloc = (int) BFD_RELOC_UNUSED + c;
252b5132
RH
10895 s = expr_end;
10896 continue;
10897
10898 case '6': /* break code */
10899 my_getExpression (&imm_expr, s);
10900 check_absolute_expr (ip, &imm_expr);
10901 if ((unsigned long) imm_expr.X_add_number > 63)
bf12938e
RS
10902 as_warn (_("Invalid value for `%s' (%lu)"),
10903 ip->insn_mo->name,
10904 (unsigned long) imm_expr.X_add_number);
10905 MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
252b5132
RH
10906 imm_expr.X_op = O_absent;
10907 s = expr_end;
10908 continue;
10909
10910 case 'a': /* 26 bit address */
10911 my_getExpression (&offset_expr, s);
10912 s = expr_end;
f6688943 10913 *offset_reloc = BFD_RELOC_MIPS16_JMP;
252b5132
RH
10914 ip->insn_opcode <<= 16;
10915 continue;
10916
10917 case 'l': /* register list for entry macro */
10918 case 'L': /* register list for exit macro */
10919 {
10920 int mask;
10921
10922 if (c == 'l')
10923 mask = 0;
10924 else
10925 mask = 7 << 3;
10926 while (*s != '\0')
10927 {
707bfff6 10928 unsigned int freg, reg1, reg2;
252b5132
RH
10929
10930 while (*s == ' ' || *s == ',')
10931 ++s;
707bfff6 10932 if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
252b5132 10933 freg = 0;
707bfff6
TS
10934 else if (reg_lookup (&s, RTYPE_FPU, &reg1))
10935 freg = 1;
252b5132
RH
10936 else
10937 {
707bfff6
TS
10938 as_bad (_("can't parse register list"));
10939 break;
252b5132
RH
10940 }
10941 if (*s == ' ')
10942 ++s;
10943 if (*s != '-')
10944 reg2 = reg1;
10945 else
10946 {
10947 ++s;
707bfff6
TS
10948 if (!reg_lookup (&s, freg ? RTYPE_FPU
10949 : (RTYPE_GP | RTYPE_NUM), &reg2))
252b5132 10950 {
707bfff6
TS
10951 as_bad (_("invalid register list"));
10952 break;
252b5132
RH
10953 }
10954 }
10955 if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10956 {
10957 mask &= ~ (7 << 3);
10958 mask |= 5 << 3;
10959 }
10960 else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10961 {
10962 mask &= ~ (7 << 3);
10963 mask |= 6 << 3;
10964 }
10965 else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
10966 mask |= (reg2 - 3) << 3;
10967 else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
10968 mask |= (reg2 - 15) << 1;
f9419b05 10969 else if (reg1 == RA && reg2 == RA)
252b5132
RH
10970 mask |= 1;
10971 else
10972 {
10973 as_bad (_("invalid register list"));
10974 break;
10975 }
10976 }
10977 /* The mask is filled in in the opcode table for the
10978 benefit of the disassembler. We remove it before
10979 applying the actual mask. */
10980 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
10981 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
10982 }
10983 continue;
10984
0499d65b
TS
10985 case 'm': /* Register list for save insn. */
10986 case 'M': /* Register list for restore insn. */
10987 {
10988 int opcode = 0;
10989 int framesz = 0, seen_framesz = 0;
91d6fa6a 10990 int nargs = 0, statics = 0, sregs = 0;
0499d65b
TS
10991
10992 while (*s != '\0')
10993 {
10994 unsigned int reg1, reg2;
10995
10996 SKIP_SPACE_TABS (s);
10997 while (*s == ',')
10998 ++s;
10999 SKIP_SPACE_TABS (s);
11000
11001 my_getExpression (&imm_expr, s);
11002 if (imm_expr.X_op == O_constant)
11003 {
11004 /* Handle the frame size. */
11005 if (seen_framesz)
11006 {
11007 as_bad (_("more than one frame size in list"));
11008 break;
11009 }
11010 seen_framesz = 1;
11011 framesz = imm_expr.X_add_number;
11012 imm_expr.X_op = O_absent;
11013 s = expr_end;
11014 continue;
11015 }
11016
707bfff6 11017 if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
0499d65b
TS
11018 {
11019 as_bad (_("can't parse register list"));
11020 break;
11021 }
0499d65b 11022
707bfff6
TS
11023 while (*s == ' ')
11024 ++s;
11025
0499d65b
TS
11026 if (*s != '-')
11027 reg2 = reg1;
11028 else
11029 {
11030 ++s;
707bfff6
TS
11031 if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
11032 || reg2 < reg1)
0499d65b
TS
11033 {
11034 as_bad (_("can't parse register list"));
11035 break;
11036 }
0499d65b
TS
11037 }
11038
11039 while (reg1 <= reg2)
11040 {
11041 if (reg1 >= 4 && reg1 <= 7)
11042 {
3a93f742 11043 if (!seen_framesz)
0499d65b 11044 /* args $a0-$a3 */
91d6fa6a 11045 nargs |= 1 << (reg1 - 4);
0499d65b
TS
11046 else
11047 /* statics $a0-$a3 */
11048 statics |= 1 << (reg1 - 4);
11049 }
11050 else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
11051 {
11052 /* $s0-$s8 */
11053 sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
11054 }
11055 else if (reg1 == 31)
11056 {
11057 /* Add $ra to insn. */
11058 opcode |= 0x40;
11059 }
11060 else
11061 {
11062 as_bad (_("unexpected register in list"));
11063 break;
11064 }
11065 if (++reg1 == 24)
11066 reg1 = 30;
11067 }
11068 }
11069
11070 /* Encode args/statics combination. */
91d6fa6a 11071 if (nargs & statics)
0499d65b 11072 as_bad (_("arg/static registers overlap"));
91d6fa6a 11073 else if (nargs == 0xf)
0499d65b
TS
11074 /* All $a0-$a3 are args. */
11075 opcode |= MIPS16_ALL_ARGS << 16;
11076 else if (statics == 0xf)
11077 /* All $a0-$a3 are statics. */
11078 opcode |= MIPS16_ALL_STATICS << 16;
11079 else
11080 {
11081 int narg = 0, nstat = 0;
11082
11083 /* Count arg registers. */
91d6fa6a 11084 while (nargs & 0x1)
0499d65b 11085 {
91d6fa6a 11086 nargs >>= 1;
0499d65b
TS
11087 narg++;
11088 }
91d6fa6a 11089 if (nargs != 0)
0499d65b
TS
11090 as_bad (_("invalid arg register list"));
11091
11092 /* Count static registers. */
11093 while (statics & 0x8)
11094 {
11095 statics = (statics << 1) & 0xf;
11096 nstat++;
11097 }
11098 if (statics != 0)
11099 as_bad (_("invalid static register list"));
11100
11101 /* Encode args/statics. */
11102 opcode |= ((narg << 2) | nstat) << 16;
11103 }
11104
11105 /* Encode $s0/$s1. */
11106 if (sregs & (1 << 0)) /* $s0 */
11107 opcode |= 0x20;
11108 if (sregs & (1 << 1)) /* $s1 */
11109 opcode |= 0x10;
11110 sregs >>= 2;
11111
11112 if (sregs != 0)
11113 {
11114 /* Count regs $s2-$s8. */
11115 int nsreg = 0;
11116 while (sregs & 1)
11117 {
11118 sregs >>= 1;
11119 nsreg++;
11120 }
11121 if (sregs != 0)
11122 as_bad (_("invalid static register list"));
11123 /* Encode $s2-$s8. */
11124 opcode |= nsreg << 24;
11125 }
11126
11127 /* Encode frame size. */
11128 if (!seen_framesz)
11129 as_bad (_("missing frame size"));
11130 else if ((framesz & 7) != 0 || framesz < 0
11131 || framesz > 0xff * 8)
11132 as_bad (_("invalid frame size"));
11133 else if (framesz != 128 || (opcode >> 16) != 0)
11134 {
11135 framesz /= 8;
11136 opcode |= (((framesz & 0xf0) << 16)
11137 | (framesz & 0x0f));
11138 }
11139
11140 /* Finally build the instruction. */
11141 if ((opcode >> 16) != 0 || framesz == 0)
11142 {
11143 ip->use_extend = TRUE;
11144 ip->extend = opcode >> 16;
11145 }
11146 ip->insn_opcode |= opcode & 0x7f;
11147 }
11148 continue;
11149
252b5132
RH
11150 case 'e': /* extend code */
11151 my_getExpression (&imm_expr, s);
11152 check_absolute_expr (ip, &imm_expr);
11153 if ((unsigned long) imm_expr.X_add_number > 0x7ff)
11154 {
11155 as_warn (_("Invalid value for `%s' (%lu)"),
11156 ip->insn_mo->name,
11157 (unsigned long) imm_expr.X_add_number);
11158 imm_expr.X_add_number &= 0x7ff;
11159 }
11160 ip->insn_opcode |= imm_expr.X_add_number;
11161 imm_expr.X_op = O_absent;
11162 s = expr_end;
11163 continue;
11164
11165 default:
11166 internalError ();
11167 }
11168 break;
11169 }
11170
11171 /* Args don't match. */
11172 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
11173 strcmp (insn->name, insn[1].name) == 0)
11174 {
11175 ++insn;
11176 s = argsstart;
11177 continue;
11178 }
11179
11180 insn_error = _("illegal operands");
11181
11182 return;
11183 }
11184}
11185
11186/* This structure holds information we know about a mips16 immediate
11187 argument type. */
11188
e972090a
NC
11189struct mips16_immed_operand
11190{
252b5132
RH
11191 /* The type code used in the argument string in the opcode table. */
11192 int type;
11193 /* The number of bits in the short form of the opcode. */
11194 int nbits;
11195 /* The number of bits in the extended form of the opcode. */
11196 int extbits;
11197 /* The amount by which the short form is shifted when it is used;
11198 for example, the sw instruction has a shift count of 2. */
11199 int shift;
11200 /* The amount by which the short form is shifted when it is stored
11201 into the instruction code. */
11202 int op_shift;
11203 /* Non-zero if the short form is unsigned. */
11204 int unsp;
11205 /* Non-zero if the extended form is unsigned. */
11206 int extu;
11207 /* Non-zero if the value is PC relative. */
11208 int pcrel;
11209};
11210
11211/* The mips16 immediate operand types. */
11212
11213static const struct mips16_immed_operand mips16_immed_operands[] =
11214{
11215 { '<', 3, 5, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
11216 { '>', 3, 5, 0, MIPS16OP_SH_RX, 1, 1, 0 },
11217 { '[', 3, 6, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
11218 { ']', 3, 6, 0, MIPS16OP_SH_RX, 1, 1, 0 },
11219 { '4', 4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
11220 { '5', 5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
11221 { 'H', 5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
11222 { 'W', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
11223 { 'D', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
11224 { 'j', 5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
11225 { '8', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
11226 { 'V', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
11227 { 'C', 8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
11228 { 'U', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
11229 { 'k', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
11230 { 'K', 8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
11231 { 'p', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
11232 { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
11233 { 'A', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
11234 { 'B', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
11235 { 'E', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
11236};
11237
11238#define MIPS16_NUM_IMMED \
11239 (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
11240
11241/* Handle a mips16 instruction with an immediate value. This or's the
11242 small immediate value into *INSN. It sets *USE_EXTEND to indicate
11243 whether an extended value is needed; if one is needed, it sets
11244 *EXTEND to the value. The argument type is TYPE. The value is VAL.
11245 If SMALL is true, an unextended opcode was explicitly requested.
11246 If EXT is true, an extended opcode was explicitly requested. If
11247 WARN is true, warn if EXT does not match reality. */
11248
11249static void
17a2f251
TS
11250mips16_immed (char *file, unsigned int line, int type, offsetT val,
11251 bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
11252 unsigned long *insn, bfd_boolean *use_extend,
11253 unsigned short *extend)
252b5132 11254{
3994f87e 11255 const struct mips16_immed_operand *op;
252b5132 11256 int mintiny, maxtiny;
b34976b6 11257 bfd_boolean needext;
252b5132
RH
11258
11259 op = mips16_immed_operands;
11260 while (op->type != type)
11261 {
11262 ++op;
9c2799c2 11263 gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
252b5132
RH
11264 }
11265
11266 if (op->unsp)
11267 {
11268 if (type == '<' || type == '>' || type == '[' || type == ']')
11269 {
11270 mintiny = 1;
11271 maxtiny = 1 << op->nbits;
11272 }
11273 else
11274 {
11275 mintiny = 0;
11276 maxtiny = (1 << op->nbits) - 1;
11277 }
11278 }
11279 else
11280 {
11281 mintiny = - (1 << (op->nbits - 1));
11282 maxtiny = (1 << (op->nbits - 1)) - 1;
11283 }
11284
11285 /* Branch offsets have an implicit 0 in the lowest bit. */
11286 if (type == 'p' || type == 'q')
11287 val /= 2;
11288
11289 if ((val & ((1 << op->shift) - 1)) != 0
11290 || val < (mintiny << op->shift)
11291 || val > (maxtiny << op->shift))
b34976b6 11292 needext = TRUE;
252b5132 11293 else
b34976b6 11294 needext = FALSE;
252b5132
RH
11295
11296 if (warn && ext && ! needext)
beae10d5
KH
11297 as_warn_where (file, line,
11298 _("extended operand requested but not required"));
252b5132
RH
11299 if (small && needext)
11300 as_bad_where (file, line, _("invalid unextended operand value"));
11301
11302 if (small || (! ext && ! needext))
11303 {
11304 int insnval;
11305
b34976b6 11306 *use_extend = FALSE;
252b5132
RH
11307 insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
11308 insnval <<= op->op_shift;
11309 *insn |= insnval;
11310 }
11311 else
11312 {
11313 long minext, maxext;
11314 int extval;
11315
11316 if (op->extu)
11317 {
11318 minext = 0;
11319 maxext = (1 << op->extbits) - 1;
11320 }
11321 else
11322 {
11323 minext = - (1 << (op->extbits - 1));
11324 maxext = (1 << (op->extbits - 1)) - 1;
11325 }
11326 if (val < minext || val > maxext)
11327 as_bad_where (file, line,
11328 _("operand value out of range for instruction"));
11329
b34976b6 11330 *use_extend = TRUE;
252b5132
RH
11331 if (op->extbits == 16)
11332 {
11333 extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
11334 val &= 0x1f;
11335 }
11336 else if (op->extbits == 15)
11337 {
11338 extval = ((val >> 11) & 0xf) | (val & 0x7f0);
11339 val &= 0xf;
11340 }
11341 else
11342 {
11343 extval = ((val & 0x1f) << 6) | (val & 0x20);
11344 val = 0;
11345 }
11346
11347 *extend = (unsigned short) extval;
11348 *insn |= val;
11349 }
11350}
11351\f
d6f16593 11352struct percent_op_match
ad8d3bb3 11353{
5e0116d5
RS
11354 const char *str;
11355 bfd_reloc_code_real_type reloc;
d6f16593
MR
11356};
11357
11358static const struct percent_op_match mips_percent_op[] =
ad8d3bb3 11359{
5e0116d5 11360 {"%lo", BFD_RELOC_LO16},
ad8d3bb3 11361#ifdef OBJ_ELF
5e0116d5
RS
11362 {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
11363 {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
11364 {"%call16", BFD_RELOC_MIPS_CALL16},
11365 {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
11366 {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
11367 {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
11368 {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
11369 {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
11370 {"%got", BFD_RELOC_MIPS_GOT16},
11371 {"%gp_rel", BFD_RELOC_GPREL16},
11372 {"%half", BFD_RELOC_16},
11373 {"%highest", BFD_RELOC_MIPS_HIGHEST},
11374 {"%higher", BFD_RELOC_MIPS_HIGHER},
11375 {"%neg", BFD_RELOC_MIPS_SUB},
3f98094e
DJ
11376 {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
11377 {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
11378 {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
11379 {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
11380 {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
11381 {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
11382 {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
ad8d3bb3 11383#endif
5e0116d5 11384 {"%hi", BFD_RELOC_HI16_S}
ad8d3bb3
TS
11385};
11386
d6f16593
MR
11387static const struct percent_op_match mips16_percent_op[] =
11388{
11389 {"%lo", BFD_RELOC_MIPS16_LO16},
11390 {"%gprel", BFD_RELOC_MIPS16_GPREL},
738e5348
RS
11391 {"%got", BFD_RELOC_MIPS16_GOT16},
11392 {"%call16", BFD_RELOC_MIPS16_CALL16},
d6f16593
MR
11393 {"%hi", BFD_RELOC_MIPS16_HI16_S}
11394};
11395
252b5132 11396
5e0116d5
RS
11397/* Return true if *STR points to a relocation operator. When returning true,
11398 move *STR over the operator and store its relocation code in *RELOC.
11399 Leave both *STR and *RELOC alone when returning false. */
11400
11401static bfd_boolean
17a2f251 11402parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
252b5132 11403{
d6f16593
MR
11404 const struct percent_op_match *percent_op;
11405 size_t limit, i;
11406
11407 if (mips_opts.mips16)
11408 {
11409 percent_op = mips16_percent_op;
11410 limit = ARRAY_SIZE (mips16_percent_op);
11411 }
11412 else
11413 {
11414 percent_op = mips_percent_op;
11415 limit = ARRAY_SIZE (mips_percent_op);
11416 }
76b3015f 11417
d6f16593 11418 for (i = 0; i < limit; i++)
5e0116d5 11419 if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
394f9b3a 11420 {
3f98094e
DJ
11421 int len = strlen (percent_op[i].str);
11422
11423 if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
11424 continue;
11425
5e0116d5
RS
11426 *str += strlen (percent_op[i].str);
11427 *reloc = percent_op[i].reloc;
394f9b3a 11428
5e0116d5
RS
11429 /* Check whether the output BFD supports this relocation.
11430 If not, issue an error and fall back on something safe. */
11431 if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
394f9b3a 11432 {
20203fb9 11433 as_bad (_("relocation %s isn't supported by the current ABI"),
5e0116d5 11434 percent_op[i].str);
01a3f561 11435 *reloc = BFD_RELOC_UNUSED;
394f9b3a 11436 }
5e0116d5 11437 return TRUE;
394f9b3a 11438 }
5e0116d5 11439 return FALSE;
394f9b3a 11440}
ad8d3bb3 11441
ad8d3bb3 11442
5e0116d5
RS
11443/* Parse string STR as a 16-bit relocatable operand. Store the
11444 expression in *EP and the relocations in the array starting
11445 at RELOC. Return the number of relocation operators used.
ad8d3bb3 11446
01a3f561 11447 On exit, EXPR_END points to the first character after the expression. */
ad8d3bb3 11448
5e0116d5 11449static size_t
17a2f251
TS
11450my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
11451 char *str)
ad8d3bb3 11452{
5e0116d5
RS
11453 bfd_reloc_code_real_type reversed_reloc[3];
11454 size_t reloc_index, i;
09b8f35a
RS
11455 int crux_depth, str_depth;
11456 char *crux;
5e0116d5
RS
11457
11458 /* Search for the start of the main expression, recoding relocations
09b8f35a
RS
11459 in REVERSED_RELOC. End the loop with CRUX pointing to the start
11460 of the main expression and with CRUX_DEPTH containing the number
11461 of open brackets at that point. */
11462 reloc_index = -1;
11463 str_depth = 0;
11464 do
fb1b3232 11465 {
09b8f35a
RS
11466 reloc_index++;
11467 crux = str;
11468 crux_depth = str_depth;
11469
11470 /* Skip over whitespace and brackets, keeping count of the number
11471 of brackets. */
11472 while (*str == ' ' || *str == '\t' || *str == '(')
11473 if (*str++ == '(')
11474 str_depth++;
5e0116d5 11475 }
09b8f35a
RS
11476 while (*str == '%'
11477 && reloc_index < (HAVE_NEWABI ? 3 : 1)
11478 && parse_relocation (&str, &reversed_reloc[reloc_index]));
ad8d3bb3 11479
09b8f35a 11480 my_getExpression (ep, crux);
5e0116d5 11481 str = expr_end;
394f9b3a 11482
5e0116d5 11483 /* Match every open bracket. */
09b8f35a 11484 while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
5e0116d5 11485 if (*str++ == ')')
09b8f35a 11486 crux_depth--;
394f9b3a 11487
09b8f35a 11488 if (crux_depth > 0)
20203fb9 11489 as_bad (_("unclosed '('"));
394f9b3a 11490
5e0116d5 11491 expr_end = str;
252b5132 11492
01a3f561 11493 if (reloc_index != 0)
64bdfcaf
RS
11494 {
11495 prev_reloc_op_frag = frag_now;
11496 for (i = 0; i < reloc_index; i++)
11497 reloc[i] = reversed_reloc[reloc_index - 1 - i];
11498 }
fb1b3232 11499
5e0116d5 11500 return reloc_index;
252b5132
RH
11501}
11502
11503static void
17a2f251 11504my_getExpression (expressionS *ep, char *str)
252b5132
RH
11505{
11506 char *save_in;
11507
11508 save_in = input_line_pointer;
11509 input_line_pointer = str;
11510 expression (ep);
11511 expr_end = input_line_pointer;
11512 input_line_pointer = save_in;
252b5132
RH
11513}
11514
252b5132 11515char *
17a2f251 11516md_atof (int type, char *litP, int *sizeP)
252b5132 11517{
499ac353 11518 return ieee_md_atof (type, litP, sizeP, target_big_endian);
252b5132
RH
11519}
11520
11521void
17a2f251 11522md_number_to_chars (char *buf, valueT val, int n)
252b5132
RH
11523{
11524 if (target_big_endian)
11525 number_to_chars_bigendian (buf, val, n);
11526 else
11527 number_to_chars_littleendian (buf, val, n);
11528}
11529\f
ae948b86 11530#ifdef OBJ_ELF
e013f690
TS
11531static int support_64bit_objects(void)
11532{
11533 const char **list, **l;
aa3d8fdf 11534 int yes;
e013f690
TS
11535
11536 list = bfd_target_list ();
11537 for (l = list; *l != NULL; l++)
aeffff67
RS
11538 if (strcmp (*l, ELF_TARGET ("elf64-", "big")) == 0
11539 || strcmp (*l, ELF_TARGET ("elf64-", "little")) == 0)
e013f690 11540 break;
aa3d8fdf 11541 yes = (*l != NULL);
e013f690 11542 free (list);
aa3d8fdf 11543 return yes;
e013f690 11544}
ae948b86 11545#endif /* OBJ_ELF */
e013f690 11546
78849248 11547const char *md_shortopts = "O::g::G:";
252b5132 11548
23fce1e3
NC
11549enum options
11550 {
11551 OPTION_MARCH = OPTION_MD_BASE,
11552 OPTION_MTUNE,
11553 OPTION_MIPS1,
11554 OPTION_MIPS2,
11555 OPTION_MIPS3,
11556 OPTION_MIPS4,
11557 OPTION_MIPS5,
11558 OPTION_MIPS32,
11559 OPTION_MIPS64,
11560 OPTION_MIPS32R2,
11561 OPTION_MIPS64R2,
11562 OPTION_MIPS16,
11563 OPTION_NO_MIPS16,
11564 OPTION_MIPS3D,
11565 OPTION_NO_MIPS3D,
11566 OPTION_MDMX,
11567 OPTION_NO_MDMX,
11568 OPTION_DSP,
11569 OPTION_NO_DSP,
11570 OPTION_MT,
11571 OPTION_NO_MT,
11572 OPTION_SMARTMIPS,
11573 OPTION_NO_SMARTMIPS,
11574 OPTION_DSPR2,
11575 OPTION_NO_DSPR2,
11576 OPTION_COMPAT_ARCH_BASE,
11577 OPTION_M4650,
11578 OPTION_NO_M4650,
11579 OPTION_M4010,
11580 OPTION_NO_M4010,
11581 OPTION_M4100,
11582 OPTION_NO_M4100,
11583 OPTION_M3900,
11584 OPTION_NO_M3900,
11585 OPTION_M7000_HILO_FIX,
6a32d874
CM
11586 OPTION_MNO_7000_HILO_FIX,
11587 OPTION_FIX_24K,
11588 OPTION_NO_FIX_24K,
c67a084a
NC
11589 OPTION_FIX_LOONGSON2F_JUMP,
11590 OPTION_NO_FIX_LOONGSON2F_JUMP,
11591 OPTION_FIX_LOONGSON2F_NOP,
11592 OPTION_NO_FIX_LOONGSON2F_NOP,
23fce1e3
NC
11593 OPTION_FIX_VR4120,
11594 OPTION_NO_FIX_VR4120,
11595 OPTION_FIX_VR4130,
11596 OPTION_NO_FIX_VR4130,
d954098f
DD
11597 OPTION_FIX_CN63XXP1,
11598 OPTION_NO_FIX_CN63XXP1,
23fce1e3
NC
11599 OPTION_TRAP,
11600 OPTION_BREAK,
11601 OPTION_EB,
11602 OPTION_EL,
11603 OPTION_FP32,
11604 OPTION_GP32,
11605 OPTION_CONSTRUCT_FLOATS,
11606 OPTION_NO_CONSTRUCT_FLOATS,
11607 OPTION_FP64,
11608 OPTION_GP64,
11609 OPTION_RELAX_BRANCH,
11610 OPTION_NO_RELAX_BRANCH,
11611 OPTION_MSHARED,
11612 OPTION_MNO_SHARED,
11613 OPTION_MSYM32,
11614 OPTION_MNO_SYM32,
11615 OPTION_SOFT_FLOAT,
11616 OPTION_HARD_FLOAT,
11617 OPTION_SINGLE_FLOAT,
11618 OPTION_DOUBLE_FLOAT,
11619 OPTION_32,
11620#ifdef OBJ_ELF
11621 OPTION_CALL_SHARED,
11622 OPTION_CALL_NONPIC,
11623 OPTION_NON_SHARED,
11624 OPTION_XGOT,
11625 OPTION_MABI,
11626 OPTION_N32,
11627 OPTION_64,
11628 OPTION_MDEBUG,
11629 OPTION_NO_MDEBUG,
11630 OPTION_PDR,
11631 OPTION_NO_PDR,
11632 OPTION_MVXWORKS_PIC,
11633#endif /* OBJ_ELF */
11634 OPTION_END_OF_ENUM
11635 };
11636
e972090a
NC
11637struct option md_longopts[] =
11638{
f9b4148d 11639 /* Options which specify architecture. */
f9b4148d 11640 {"march", required_argument, NULL, OPTION_MARCH},
f9b4148d 11641 {"mtune", required_argument, NULL, OPTION_MTUNE},
252b5132
RH
11642 {"mips0", no_argument, NULL, OPTION_MIPS1},
11643 {"mips1", no_argument, NULL, OPTION_MIPS1},
252b5132 11644 {"mips2", no_argument, NULL, OPTION_MIPS2},
252b5132 11645 {"mips3", no_argument, NULL, OPTION_MIPS3},
252b5132 11646 {"mips4", no_argument, NULL, OPTION_MIPS4},
ae948b86 11647 {"mips5", no_argument, NULL, OPTION_MIPS5},
ae948b86 11648 {"mips32", no_argument, NULL, OPTION_MIPS32},
ae948b86 11649 {"mips64", no_argument, NULL, OPTION_MIPS64},
f9b4148d 11650 {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
5f74bc13 11651 {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
f9b4148d
CD
11652
11653 /* Options which specify Application Specific Extensions (ASEs). */
f9b4148d 11654 {"mips16", no_argument, NULL, OPTION_MIPS16},
f9b4148d 11655 {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
f9b4148d 11656 {"mips3d", no_argument, NULL, OPTION_MIPS3D},
f9b4148d 11657 {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
f9b4148d 11658 {"mdmx", no_argument, NULL, OPTION_MDMX},
f9b4148d 11659 {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
74cd071d 11660 {"mdsp", no_argument, NULL, OPTION_DSP},
74cd071d 11661 {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
ef2e4d86 11662 {"mmt", no_argument, NULL, OPTION_MT},
ef2e4d86 11663 {"mno-mt", no_argument, NULL, OPTION_NO_MT},
e16bfa71 11664 {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
e16bfa71 11665 {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
8b082fb1 11666 {"mdspr2", no_argument, NULL, OPTION_DSPR2},
8b082fb1 11667 {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
f9b4148d
CD
11668
11669 /* Old-style architecture options. Don't add more of these. */
f9b4148d 11670 {"m4650", no_argument, NULL, OPTION_M4650},
f9b4148d 11671 {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
f9b4148d 11672 {"m4010", no_argument, NULL, OPTION_M4010},
f9b4148d 11673 {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
f9b4148d 11674 {"m4100", no_argument, NULL, OPTION_M4100},
f9b4148d 11675 {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
f9b4148d 11676 {"m3900", no_argument, NULL, OPTION_M3900},
f9b4148d
CD
11677 {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
11678
11679 /* Options which enable bug fixes. */
f9b4148d 11680 {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
f9b4148d
CD
11681 {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11682 {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
c67a084a
NC
11683 {"mfix-loongson2f-jump", no_argument, NULL, OPTION_FIX_LOONGSON2F_JUMP},
11684 {"mno-fix-loongson2f-jump", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_JUMP},
11685 {"mfix-loongson2f-nop", no_argument, NULL, OPTION_FIX_LOONGSON2F_NOP},
11686 {"mno-fix-loongson2f-nop", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_NOP},
d766e8ec
RS
11687 {"mfix-vr4120", no_argument, NULL, OPTION_FIX_VR4120},
11688 {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
7d8e00cf
RS
11689 {"mfix-vr4130", no_argument, NULL, OPTION_FIX_VR4130},
11690 {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
6a32d874
CM
11691 {"mfix-24k", no_argument, NULL, OPTION_FIX_24K},
11692 {"mno-fix-24k", no_argument, NULL, OPTION_NO_FIX_24K},
d954098f
DD
11693 {"mfix-cn63xxp1", no_argument, NULL, OPTION_FIX_CN63XXP1},
11694 {"mno-fix-cn63xxp1", no_argument, NULL, OPTION_NO_FIX_CN63XXP1},
f9b4148d
CD
11695
11696 /* Miscellaneous options. */
252b5132
RH
11697 {"trap", no_argument, NULL, OPTION_TRAP},
11698 {"no-break", no_argument, NULL, OPTION_TRAP},
252b5132
RH
11699 {"break", no_argument, NULL, OPTION_BREAK},
11700 {"no-trap", no_argument, NULL, OPTION_BREAK},
252b5132 11701 {"EB", no_argument, NULL, OPTION_EB},
252b5132 11702 {"EL", no_argument, NULL, OPTION_EL},
ae948b86 11703 {"mfp32", no_argument, NULL, OPTION_FP32},
c97ef257 11704 {"mgp32", no_argument, NULL, OPTION_GP32},
119d663a 11705 {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
119d663a 11706 {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
316f5878 11707 {"mfp64", no_argument, NULL, OPTION_FP64},
ae948b86 11708 {"mgp64", no_argument, NULL, OPTION_GP64},
4a6a3df4
AO
11709 {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
11710 {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
aa6975fb
ILT
11711 {"mshared", no_argument, NULL, OPTION_MSHARED},
11712 {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
aed1a261
RS
11713 {"msym32", no_argument, NULL, OPTION_MSYM32},
11714 {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
037b32b9
AN
11715 {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
11716 {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
037b32b9
AN
11717 {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
11718 {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
23fce1e3
NC
11719
11720 /* Strictly speaking this next option is ELF specific,
11721 but we allow it for other ports as well in order to
11722 make testing easier. */
11723 {"32", no_argument, NULL, OPTION_32},
037b32b9 11724
f9b4148d 11725 /* ELF-specific options. */
156c2f8b 11726#ifdef OBJ_ELF
156c2f8b
NC
11727 {"KPIC", no_argument, NULL, OPTION_CALL_SHARED},
11728 {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
861fb55a 11729 {"call_nonpic", no_argument, NULL, OPTION_CALL_NONPIC},
156c2f8b
NC
11730 {"non_shared", no_argument, NULL, OPTION_NON_SHARED},
11731 {"xgot", no_argument, NULL, OPTION_XGOT},
ae948b86 11732 {"mabi", required_argument, NULL, OPTION_MABI},
e013f690 11733 {"n32", no_argument, NULL, OPTION_N32},
156c2f8b 11734 {"64", no_argument, NULL, OPTION_64},
ecb4347a 11735 {"mdebug", no_argument, NULL, OPTION_MDEBUG},
ecb4347a 11736 {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
dcd410fe 11737 {"mpdr", no_argument, NULL, OPTION_PDR},
dcd410fe 11738 {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
0a44bf69 11739 {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
ae948b86 11740#endif /* OBJ_ELF */
f9b4148d 11741
252b5132
RH
11742 {NULL, no_argument, NULL, 0}
11743};
156c2f8b 11744size_t md_longopts_size = sizeof (md_longopts);
252b5132 11745
316f5878
RS
11746/* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
11747 NEW_VALUE. Warn if another value was already specified. Note:
11748 we have to defer parsing the -march and -mtune arguments in order
11749 to handle 'from-abi' correctly, since the ABI might be specified
11750 in a later argument. */
11751
11752static void
17a2f251 11753mips_set_option_string (const char **string_ptr, const char *new_value)
316f5878
RS
11754{
11755 if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
11756 as_warn (_("A different %s was already specified, is now %s"),
11757 string_ptr == &mips_arch_string ? "-march" : "-mtune",
11758 new_value);
11759
11760 *string_ptr = new_value;
11761}
11762
252b5132 11763int
17a2f251 11764md_parse_option (int c, char *arg)
252b5132
RH
11765{
11766 switch (c)
11767 {
119d663a
NC
11768 case OPTION_CONSTRUCT_FLOATS:
11769 mips_disable_float_construction = 0;
11770 break;
bdaaa2e1 11771
119d663a
NC
11772 case OPTION_NO_CONSTRUCT_FLOATS:
11773 mips_disable_float_construction = 1;
11774 break;
bdaaa2e1 11775
252b5132
RH
11776 case OPTION_TRAP:
11777 mips_trap = 1;
11778 break;
11779
11780 case OPTION_BREAK:
11781 mips_trap = 0;
11782 break;
11783
11784 case OPTION_EB:
11785 target_big_endian = 1;
11786 break;
11787
11788 case OPTION_EL:
11789 target_big_endian = 0;
11790 break;
11791
11792 case 'O':
4ffff32f
TS
11793 if (arg == NULL)
11794 mips_optimize = 1;
11795 else if (arg[0] == '0')
11796 mips_optimize = 0;
11797 else if (arg[0] == '1')
252b5132
RH
11798 mips_optimize = 1;
11799 else
11800 mips_optimize = 2;
11801 break;
11802
11803 case 'g':
11804 if (arg == NULL)
11805 mips_debug = 2;
11806 else
11807 mips_debug = atoi (arg);
252b5132
RH
11808 break;
11809
11810 case OPTION_MIPS1:
316f5878 11811 file_mips_isa = ISA_MIPS1;
252b5132
RH
11812 break;
11813
11814 case OPTION_MIPS2:
316f5878 11815 file_mips_isa = ISA_MIPS2;
252b5132
RH
11816 break;
11817
11818 case OPTION_MIPS3:
316f5878 11819 file_mips_isa = ISA_MIPS3;
252b5132
RH
11820 break;
11821
11822 case OPTION_MIPS4:
316f5878 11823 file_mips_isa = ISA_MIPS4;
e7af610e
NC
11824 break;
11825
84ea6cf2 11826 case OPTION_MIPS5:
316f5878 11827 file_mips_isa = ISA_MIPS5;
84ea6cf2
NC
11828 break;
11829
e7af610e 11830 case OPTION_MIPS32:
316f5878 11831 file_mips_isa = ISA_MIPS32;
252b5132
RH
11832 break;
11833
af7ee8bf
CD
11834 case OPTION_MIPS32R2:
11835 file_mips_isa = ISA_MIPS32R2;
11836 break;
11837
5f74bc13
CD
11838 case OPTION_MIPS64R2:
11839 file_mips_isa = ISA_MIPS64R2;
11840 break;
11841
84ea6cf2 11842 case OPTION_MIPS64:
316f5878 11843 file_mips_isa = ISA_MIPS64;
84ea6cf2
NC
11844 break;
11845
ec68c924 11846 case OPTION_MTUNE:
316f5878
RS
11847 mips_set_option_string (&mips_tune_string, arg);
11848 break;
ec68c924 11849
316f5878
RS
11850 case OPTION_MARCH:
11851 mips_set_option_string (&mips_arch_string, arg);
252b5132
RH
11852 break;
11853
11854 case OPTION_M4650:
316f5878
RS
11855 mips_set_option_string (&mips_arch_string, "4650");
11856 mips_set_option_string (&mips_tune_string, "4650");
252b5132
RH
11857 break;
11858
11859 case OPTION_NO_M4650:
11860 break;
11861
11862 case OPTION_M4010:
316f5878
RS
11863 mips_set_option_string (&mips_arch_string, "4010");
11864 mips_set_option_string (&mips_tune_string, "4010");
252b5132
RH
11865 break;
11866
11867 case OPTION_NO_M4010:
11868 break;
11869
11870 case OPTION_M4100:
316f5878
RS
11871 mips_set_option_string (&mips_arch_string, "4100");
11872 mips_set_option_string (&mips_tune_string, "4100");
252b5132
RH
11873 break;
11874
11875 case OPTION_NO_M4100:
11876 break;
11877
252b5132 11878 case OPTION_M3900:
316f5878
RS
11879 mips_set_option_string (&mips_arch_string, "3900");
11880 mips_set_option_string (&mips_tune_string, "3900");
252b5132 11881 break;
bdaaa2e1 11882
252b5132
RH
11883 case OPTION_NO_M3900:
11884 break;
11885
deec1734
CD
11886 case OPTION_MDMX:
11887 mips_opts.ase_mdmx = 1;
11888 break;
11889
11890 case OPTION_NO_MDMX:
11891 mips_opts.ase_mdmx = 0;
11892 break;
11893
74cd071d
CF
11894 case OPTION_DSP:
11895 mips_opts.ase_dsp = 1;
8b082fb1 11896 mips_opts.ase_dspr2 = 0;
74cd071d
CF
11897 break;
11898
11899 case OPTION_NO_DSP:
8b082fb1
TS
11900 mips_opts.ase_dsp = 0;
11901 mips_opts.ase_dspr2 = 0;
11902 break;
11903
11904 case OPTION_DSPR2:
11905 mips_opts.ase_dspr2 = 1;
11906 mips_opts.ase_dsp = 1;
11907 break;
11908
11909 case OPTION_NO_DSPR2:
11910 mips_opts.ase_dspr2 = 0;
74cd071d
CF
11911 mips_opts.ase_dsp = 0;
11912 break;
11913
ef2e4d86
CF
11914 case OPTION_MT:
11915 mips_opts.ase_mt = 1;
11916 break;
11917
11918 case OPTION_NO_MT:
11919 mips_opts.ase_mt = 0;
11920 break;
11921
252b5132
RH
11922 case OPTION_MIPS16:
11923 mips_opts.mips16 = 1;
7d10b47d 11924 mips_no_prev_insn ();
252b5132
RH
11925 break;
11926
11927 case OPTION_NO_MIPS16:
11928 mips_opts.mips16 = 0;
7d10b47d 11929 mips_no_prev_insn ();
252b5132
RH
11930 break;
11931
1f25f5d3
CD
11932 case OPTION_MIPS3D:
11933 mips_opts.ase_mips3d = 1;
11934 break;
11935
11936 case OPTION_NO_MIPS3D:
11937 mips_opts.ase_mips3d = 0;
11938 break;
11939
e16bfa71
TS
11940 case OPTION_SMARTMIPS:
11941 mips_opts.ase_smartmips = 1;
11942 break;
11943
11944 case OPTION_NO_SMARTMIPS:
11945 mips_opts.ase_smartmips = 0;
11946 break;
11947
6a32d874
CM
11948 case OPTION_FIX_24K:
11949 mips_fix_24k = 1;
11950 break;
11951
11952 case OPTION_NO_FIX_24K:
11953 mips_fix_24k = 0;
11954 break;
11955
c67a084a
NC
11956 case OPTION_FIX_LOONGSON2F_JUMP:
11957 mips_fix_loongson2f_jump = TRUE;
11958 break;
11959
11960 case OPTION_NO_FIX_LOONGSON2F_JUMP:
11961 mips_fix_loongson2f_jump = FALSE;
11962 break;
11963
11964 case OPTION_FIX_LOONGSON2F_NOP:
11965 mips_fix_loongson2f_nop = TRUE;
11966 break;
11967
11968 case OPTION_NO_FIX_LOONGSON2F_NOP:
11969 mips_fix_loongson2f_nop = FALSE;
11970 break;
11971
d766e8ec
RS
11972 case OPTION_FIX_VR4120:
11973 mips_fix_vr4120 = 1;
60b63b72
RS
11974 break;
11975
d766e8ec
RS
11976 case OPTION_NO_FIX_VR4120:
11977 mips_fix_vr4120 = 0;
60b63b72
RS
11978 break;
11979
7d8e00cf
RS
11980 case OPTION_FIX_VR4130:
11981 mips_fix_vr4130 = 1;
11982 break;
11983
11984 case OPTION_NO_FIX_VR4130:
11985 mips_fix_vr4130 = 0;
11986 break;
11987
d954098f
DD
11988 case OPTION_FIX_CN63XXP1:
11989 mips_fix_cn63xxp1 = TRUE;
11990 break;
11991
11992 case OPTION_NO_FIX_CN63XXP1:
11993 mips_fix_cn63xxp1 = FALSE;
11994 break;
11995
4a6a3df4
AO
11996 case OPTION_RELAX_BRANCH:
11997 mips_relax_branch = 1;
11998 break;
11999
12000 case OPTION_NO_RELAX_BRANCH:
12001 mips_relax_branch = 0;
12002 break;
12003
aa6975fb
ILT
12004 case OPTION_MSHARED:
12005 mips_in_shared = TRUE;
12006 break;
12007
12008 case OPTION_MNO_SHARED:
12009 mips_in_shared = FALSE;
12010 break;
12011
aed1a261
RS
12012 case OPTION_MSYM32:
12013 mips_opts.sym32 = TRUE;
12014 break;
12015
12016 case OPTION_MNO_SYM32:
12017 mips_opts.sym32 = FALSE;
12018 break;
12019
0f074f60 12020#ifdef OBJ_ELF
252b5132
RH
12021 /* When generating ELF code, we permit -KPIC and -call_shared to
12022 select SVR4_PIC, and -non_shared to select no PIC. This is
12023 intended to be compatible with Irix 5. */
12024 case OPTION_CALL_SHARED:
f43abd2b 12025 if (!IS_ELF)
252b5132
RH
12026 {
12027 as_bad (_("-call_shared is supported only for ELF format"));
12028 return 0;
12029 }
12030 mips_pic = SVR4_PIC;
143d77c5 12031 mips_abicalls = TRUE;
252b5132
RH
12032 break;
12033
861fb55a
DJ
12034 case OPTION_CALL_NONPIC:
12035 if (!IS_ELF)
12036 {
12037 as_bad (_("-call_nonpic is supported only for ELF format"));
12038 return 0;
12039 }
12040 mips_pic = NO_PIC;
12041 mips_abicalls = TRUE;
12042 break;
12043
252b5132 12044 case OPTION_NON_SHARED:
f43abd2b 12045 if (!IS_ELF)
252b5132
RH
12046 {
12047 as_bad (_("-non_shared is supported only for ELF format"));
12048 return 0;
12049 }
12050 mips_pic = NO_PIC;
143d77c5 12051 mips_abicalls = FALSE;
252b5132
RH
12052 break;
12053
44075ae2
TS
12054 /* The -xgot option tells the assembler to use 32 bit offsets
12055 when accessing the got in SVR4_PIC mode. It is for Irix
252b5132
RH
12056 compatibility. */
12057 case OPTION_XGOT:
12058 mips_big_got = 1;
12059 break;
0f074f60 12060#endif /* OBJ_ELF */
252b5132
RH
12061
12062 case 'G':
6caf9ef4
TS
12063 g_switch_value = atoi (arg);
12064 g_switch_seen = 1;
252b5132
RH
12065 break;
12066
34ba82a8
TS
12067 /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
12068 and -mabi=64. */
252b5132 12069 case OPTION_32:
23fce1e3
NC
12070 if (IS_ELF)
12071 mips_abi = O32_ABI;
12072 /* We silently ignore -32 for non-ELF targets. This greatly
12073 simplifies the construction of the MIPS GAS test cases. */
252b5132
RH
12074 break;
12075
23fce1e3 12076#ifdef OBJ_ELF
e013f690 12077 case OPTION_N32:
f43abd2b 12078 if (!IS_ELF)
34ba82a8
TS
12079 {
12080 as_bad (_("-n32 is supported for ELF format only"));
12081 return 0;
12082 }
316f5878 12083 mips_abi = N32_ABI;
e013f690 12084 break;
252b5132 12085
e013f690 12086 case OPTION_64:
f43abd2b 12087 if (!IS_ELF)
34ba82a8
TS
12088 {
12089 as_bad (_("-64 is supported for ELF format only"));
12090 return 0;
12091 }
316f5878 12092 mips_abi = N64_ABI;
f43abd2b 12093 if (!support_64bit_objects())
e013f690 12094 as_fatal (_("No compiled in support for 64 bit object file format"));
252b5132 12095 break;
ae948b86 12096#endif /* OBJ_ELF */
252b5132 12097
c97ef257 12098 case OPTION_GP32:
a325df1d 12099 file_mips_gp32 = 1;
c97ef257
AH
12100 break;
12101
12102 case OPTION_GP64:
a325df1d 12103 file_mips_gp32 = 0;
c97ef257 12104 break;
252b5132 12105
ca4e0257 12106 case OPTION_FP32:
a325df1d 12107 file_mips_fp32 = 1;
316f5878
RS
12108 break;
12109
12110 case OPTION_FP64:
12111 file_mips_fp32 = 0;
ca4e0257
RS
12112 break;
12113
037b32b9
AN
12114 case OPTION_SINGLE_FLOAT:
12115 file_mips_single_float = 1;
12116 break;
12117
12118 case OPTION_DOUBLE_FLOAT:
12119 file_mips_single_float = 0;
12120 break;
12121
12122 case OPTION_SOFT_FLOAT:
12123 file_mips_soft_float = 1;
12124 break;
12125
12126 case OPTION_HARD_FLOAT:
12127 file_mips_soft_float = 0;
12128 break;
12129
ae948b86 12130#ifdef OBJ_ELF
252b5132 12131 case OPTION_MABI:
f43abd2b 12132 if (!IS_ELF)
34ba82a8
TS
12133 {
12134 as_bad (_("-mabi is supported for ELF format only"));
12135 return 0;
12136 }
e013f690 12137 if (strcmp (arg, "32") == 0)
316f5878 12138 mips_abi = O32_ABI;
e013f690 12139 else if (strcmp (arg, "o64") == 0)
316f5878 12140 mips_abi = O64_ABI;
e013f690 12141 else if (strcmp (arg, "n32") == 0)
316f5878 12142 mips_abi = N32_ABI;
e013f690
TS
12143 else if (strcmp (arg, "64") == 0)
12144 {
316f5878 12145 mips_abi = N64_ABI;
e013f690
TS
12146 if (! support_64bit_objects())
12147 as_fatal (_("No compiled in support for 64 bit object file "
12148 "format"));
12149 }
12150 else if (strcmp (arg, "eabi") == 0)
316f5878 12151 mips_abi = EABI_ABI;
e013f690 12152 else
da0e507f
TS
12153 {
12154 as_fatal (_("invalid abi -mabi=%s"), arg);
12155 return 0;
12156 }
252b5132 12157 break;
e013f690 12158#endif /* OBJ_ELF */
252b5132 12159
6b76fefe 12160 case OPTION_M7000_HILO_FIX:
b34976b6 12161 mips_7000_hilo_fix = TRUE;
6b76fefe
CM
12162 break;
12163
9ee72ff1 12164 case OPTION_MNO_7000_HILO_FIX:
b34976b6 12165 mips_7000_hilo_fix = FALSE;
6b76fefe
CM
12166 break;
12167
ecb4347a
DJ
12168#ifdef OBJ_ELF
12169 case OPTION_MDEBUG:
b34976b6 12170 mips_flag_mdebug = TRUE;
ecb4347a
DJ
12171 break;
12172
12173 case OPTION_NO_MDEBUG:
b34976b6 12174 mips_flag_mdebug = FALSE;
ecb4347a 12175 break;
dcd410fe
RO
12176
12177 case OPTION_PDR:
12178 mips_flag_pdr = TRUE;
12179 break;
12180
12181 case OPTION_NO_PDR:
12182 mips_flag_pdr = FALSE;
12183 break;
0a44bf69
RS
12184
12185 case OPTION_MVXWORKS_PIC:
12186 mips_pic = VXWORKS_PIC;
12187 break;
ecb4347a
DJ
12188#endif /* OBJ_ELF */
12189
252b5132
RH
12190 default:
12191 return 0;
12192 }
12193
c67a084a
NC
12194 mips_fix_loongson2f = mips_fix_loongson2f_nop || mips_fix_loongson2f_jump;
12195
252b5132
RH
12196 return 1;
12197}
316f5878
RS
12198\f
12199/* Set up globals to generate code for the ISA or processor
12200 described by INFO. */
252b5132 12201
252b5132 12202static void
17a2f251 12203mips_set_architecture (const struct mips_cpu_info *info)
252b5132 12204{
316f5878 12205 if (info != 0)
252b5132 12206 {
fef14a42
TS
12207 file_mips_arch = info->cpu;
12208 mips_opts.arch = info->cpu;
316f5878 12209 mips_opts.isa = info->isa;
252b5132 12210 }
252b5132
RH
12211}
12212
252b5132 12213
316f5878 12214/* Likewise for tuning. */
252b5132 12215
316f5878 12216static void
17a2f251 12217mips_set_tune (const struct mips_cpu_info *info)
316f5878
RS
12218{
12219 if (info != 0)
fef14a42 12220 mips_tune = info->cpu;
316f5878 12221}
80cc45a5 12222
34ba82a8 12223
252b5132 12224void
17a2f251 12225mips_after_parse_args (void)
e9670677 12226{
fef14a42
TS
12227 const struct mips_cpu_info *arch_info = 0;
12228 const struct mips_cpu_info *tune_info = 0;
12229
e9670677 12230 /* GP relative stuff not working for PE */
6caf9ef4 12231 if (strncmp (TARGET_OS, "pe", 2) == 0)
e9670677 12232 {
6caf9ef4 12233 if (g_switch_seen && g_switch_value != 0)
e9670677
MR
12234 as_bad (_("-G not supported in this configuration."));
12235 g_switch_value = 0;
12236 }
12237
cac012d6
AO
12238 if (mips_abi == NO_ABI)
12239 mips_abi = MIPS_DEFAULT_ABI;
12240
22923709
RS
12241 /* The following code determines the architecture and register size.
12242 Similar code was added to GCC 3.3 (see override_options() in
12243 config/mips/mips.c). The GAS and GCC code should be kept in sync
12244 as much as possible. */
e9670677 12245
316f5878 12246 if (mips_arch_string != 0)
fef14a42 12247 arch_info = mips_parse_cpu ("-march", mips_arch_string);
e9670677 12248
316f5878 12249 if (file_mips_isa != ISA_UNKNOWN)
e9670677 12250 {
316f5878 12251 /* Handle -mipsN. At this point, file_mips_isa contains the
fef14a42 12252 ISA level specified by -mipsN, while arch_info->isa contains
316f5878 12253 the -march selection (if any). */
fef14a42 12254 if (arch_info != 0)
e9670677 12255 {
316f5878
RS
12256 /* -march takes precedence over -mipsN, since it is more descriptive.
12257 There's no harm in specifying both as long as the ISA levels
12258 are the same. */
fef14a42 12259 if (file_mips_isa != arch_info->isa)
316f5878
RS
12260 as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
12261 mips_cpu_info_from_isa (file_mips_isa)->name,
fef14a42 12262 mips_cpu_info_from_isa (arch_info->isa)->name);
e9670677 12263 }
316f5878 12264 else
fef14a42 12265 arch_info = mips_cpu_info_from_isa (file_mips_isa);
e9670677
MR
12266 }
12267
fef14a42
TS
12268 if (arch_info == 0)
12269 arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
e9670677 12270
fef14a42 12271 if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
20203fb9 12272 as_bad (_("-march=%s is not compatible with the selected ABI"),
fef14a42
TS
12273 arch_info->name);
12274
12275 mips_set_architecture (arch_info);
12276
12277 /* Optimize for file_mips_arch, unless -mtune selects a different processor. */
12278 if (mips_tune_string != 0)
12279 tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
e9670677 12280
fef14a42
TS
12281 if (tune_info == 0)
12282 mips_set_tune (arch_info);
12283 else
12284 mips_set_tune (tune_info);
e9670677 12285
316f5878 12286 if (file_mips_gp32 >= 0)
e9670677 12287 {
316f5878
RS
12288 /* The user specified the size of the integer registers. Make sure
12289 it agrees with the ABI and ISA. */
12290 if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
12291 as_bad (_("-mgp64 used with a 32-bit processor"));
12292 else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
12293 as_bad (_("-mgp32 used with a 64-bit ABI"));
12294 else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
12295 as_bad (_("-mgp64 used with a 32-bit ABI"));
e9670677
MR
12296 }
12297 else
12298 {
316f5878
RS
12299 /* Infer the integer register size from the ABI and processor.
12300 Restrict ourselves to 32-bit registers if that's all the
12301 processor has, or if the ABI cannot handle 64-bit registers. */
12302 file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
12303 || !ISA_HAS_64BIT_REGS (mips_opts.isa));
e9670677
MR
12304 }
12305
ad3fea08
TS
12306 switch (file_mips_fp32)
12307 {
12308 default:
12309 case -1:
12310 /* No user specified float register size.
12311 ??? GAS treats single-float processors as though they had 64-bit
12312 float registers (although it complains when double-precision
12313 instructions are used). As things stand, saying they have 32-bit
12314 registers would lead to spurious "register must be even" messages.
12315 So here we assume float registers are never smaller than the
12316 integer ones. */
12317 if (file_mips_gp32 == 0)
12318 /* 64-bit integer registers implies 64-bit float registers. */
12319 file_mips_fp32 = 0;
12320 else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
12321 && ISA_HAS_64BIT_FPRS (mips_opts.isa))
12322 /* -mips3d and -mdmx imply 64-bit float registers, if possible. */
12323 file_mips_fp32 = 0;
12324 else
12325 /* 32-bit float registers. */
12326 file_mips_fp32 = 1;
12327 break;
12328
12329 /* The user specified the size of the float registers. Check if it
12330 agrees with the ABI and ISA. */
12331 case 0:
12332 if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
12333 as_bad (_("-mfp64 used with a 32-bit fpu"));
12334 else if (ABI_NEEDS_32BIT_REGS (mips_abi)
12335 && !ISA_HAS_MXHC1 (mips_opts.isa))
12336 as_warn (_("-mfp64 used with a 32-bit ABI"));
12337 break;
12338 case 1:
12339 if (ABI_NEEDS_64BIT_REGS (mips_abi))
12340 as_warn (_("-mfp32 used with a 64-bit ABI"));
12341 break;
12342 }
e9670677 12343
316f5878 12344 /* End of GCC-shared inference code. */
e9670677 12345
17a2f251
TS
12346 /* This flag is set when we have a 64-bit capable CPU but use only
12347 32-bit wide registers. Note that EABI does not use it. */
12348 if (ISA_HAS_64BIT_REGS (mips_opts.isa)
12349 && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
12350 || mips_abi == O32_ABI))
316f5878 12351 mips_32bitmode = 1;
e9670677
MR
12352
12353 if (mips_opts.isa == ISA_MIPS1 && mips_trap)
12354 as_bad (_("trap exception not supported at ISA 1"));
12355
e9670677
MR
12356 /* If the selected architecture includes support for ASEs, enable
12357 generation of code for them. */
a4672219 12358 if (mips_opts.mips16 == -1)
fef14a42 12359 mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
ffdefa66 12360 if (mips_opts.ase_mips3d == -1)
65263ce3 12361 mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
ad3fea08
TS
12362 && file_mips_fp32 == 0) ? 1 : 0;
12363 if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
12364 as_bad (_("-mfp32 used with -mips3d"));
12365
ffdefa66 12366 if (mips_opts.ase_mdmx == -1)
65263ce3 12367 mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
ad3fea08
TS
12368 && file_mips_fp32 == 0) ? 1 : 0;
12369 if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
12370 as_bad (_("-mfp32 used with -mdmx"));
12371
12372 if (mips_opts.ase_smartmips == -1)
12373 mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
12374 if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
20203fb9
NC
12375 as_warn (_("%s ISA does not support SmartMIPS"),
12376 mips_cpu_info_from_isa (mips_opts.isa)->name);
ad3fea08 12377
74cd071d 12378 if (mips_opts.ase_dsp == -1)
ad3fea08
TS
12379 mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
12380 if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
20203fb9
NC
12381 as_warn (_("%s ISA does not support DSP ASE"),
12382 mips_cpu_info_from_isa (mips_opts.isa)->name);
ad3fea08 12383
8b082fb1
TS
12384 if (mips_opts.ase_dspr2 == -1)
12385 {
12386 mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
12387 mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
12388 }
12389 if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
20203fb9
NC
12390 as_warn (_("%s ISA does not support DSP R2 ASE"),
12391 mips_cpu_info_from_isa (mips_opts.isa)->name);
8b082fb1 12392
ef2e4d86 12393 if (mips_opts.ase_mt == -1)
ad3fea08
TS
12394 mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
12395 if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
20203fb9
NC
12396 as_warn (_("%s ISA does not support MT ASE"),
12397 mips_cpu_info_from_isa (mips_opts.isa)->name);
e9670677 12398
e9670677 12399 file_mips_isa = mips_opts.isa;
e9670677
MR
12400 file_ase_mips3d = mips_opts.ase_mips3d;
12401 file_ase_mdmx = mips_opts.ase_mdmx;
e16bfa71 12402 file_ase_smartmips = mips_opts.ase_smartmips;
74cd071d 12403 file_ase_dsp = mips_opts.ase_dsp;
8b082fb1 12404 file_ase_dspr2 = mips_opts.ase_dspr2;
ef2e4d86 12405 file_ase_mt = mips_opts.ase_mt;
e9670677
MR
12406 mips_opts.gp32 = file_mips_gp32;
12407 mips_opts.fp32 = file_mips_fp32;
037b32b9
AN
12408 mips_opts.soft_float = file_mips_soft_float;
12409 mips_opts.single_float = file_mips_single_float;
e9670677 12410
ecb4347a
DJ
12411 if (mips_flag_mdebug < 0)
12412 {
12413#ifdef OBJ_MAYBE_ECOFF
12414 if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
12415 mips_flag_mdebug = 1;
12416 else
12417#endif /* OBJ_MAYBE_ECOFF */
12418 mips_flag_mdebug = 0;
12419 }
e9670677
MR
12420}
12421\f
12422void
17a2f251 12423mips_init_after_args (void)
252b5132
RH
12424{
12425 /* initialize opcodes */
12426 bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
beae10d5 12427 mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
252b5132
RH
12428}
12429
12430long
17a2f251 12431md_pcrel_from (fixS *fixP)
252b5132 12432{
a7ebbfdf
TS
12433 valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
12434 switch (fixP->fx_r_type)
12435 {
12436 case BFD_RELOC_16_PCREL_S2:
12437 case BFD_RELOC_MIPS_JMP:
12438 /* Return the address of the delay slot. */
12439 return addr + 4;
12440 default:
58ea3d6a 12441 /* We have no relocation type for PC relative MIPS16 instructions. */
64817874
TS
12442 if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
12443 as_bad_where (fixP->fx_file, fixP->fx_line,
12444 _("PC relative MIPS16 instruction references a different section"));
a7ebbfdf
TS
12445 return addr;
12446 }
252b5132
RH
12447}
12448
252b5132
RH
12449/* This is called before the symbol table is processed. In order to
12450 work with gcc when using mips-tfile, we must keep all local labels.
12451 However, in other cases, we want to discard them. If we were
12452 called with -g, but we didn't see any debugging information, it may
12453 mean that gcc is smuggling debugging information through to
12454 mips-tfile, in which case we must generate all local labels. */
12455
12456void
17a2f251 12457mips_frob_file_before_adjust (void)
252b5132
RH
12458{
12459#ifndef NO_ECOFF_DEBUGGING
12460 if (ECOFF_DEBUGGING
12461 && mips_debug != 0
12462 && ! ecoff_debugging_seen)
12463 flag_keep_locals = 1;
12464#endif
12465}
12466
3b91255e 12467/* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
55cf6793 12468 the corresponding LO16 reloc. This is called before md_apply_fix and
3b91255e
RS
12469 tc_gen_reloc. Unmatched relocs can only be generated by use of explicit
12470 relocation operators.
12471
12472 For our purposes, a %lo() expression matches a %got() or %hi()
12473 expression if:
12474
12475 (a) it refers to the same symbol; and
12476 (b) the offset applied in the %lo() expression is no lower than
12477 the offset applied in the %got() or %hi().
12478
12479 (b) allows us to cope with code like:
12480
12481 lui $4,%hi(foo)
12482 lh $4,%lo(foo+2)($4)
12483
12484 ...which is legal on RELA targets, and has a well-defined behaviour
12485 if the user knows that adding 2 to "foo" will not induce a carry to
12486 the high 16 bits.
12487
12488 When several %lo()s match a particular %got() or %hi(), we use the
12489 following rules to distinguish them:
12490
12491 (1) %lo()s with smaller offsets are a better match than %lo()s with
12492 higher offsets.
12493
12494 (2) %lo()s with no matching %got() or %hi() are better than those
12495 that already have a matching %got() or %hi().
12496
12497 (3) later %lo()s are better than earlier %lo()s.
12498
12499 These rules are applied in order.
12500
12501 (1) means, among other things, that %lo()s with identical offsets are
12502 chosen if they exist.
12503
12504 (2) means that we won't associate several high-part relocations with
12505 the same low-part relocation unless there's no alternative. Having
12506 several high parts for the same low part is a GNU extension; this rule
12507 allows careful users to avoid it.
12508
12509 (3) is purely cosmetic. mips_hi_fixup_list is is in reverse order,
12510 with the last high-part relocation being at the front of the list.
12511 It therefore makes sense to choose the last matching low-part
12512 relocation, all other things being equal. It's also easier
12513 to code that way. */
252b5132
RH
12514
12515void
17a2f251 12516mips_frob_file (void)
252b5132
RH
12517{
12518 struct mips_hi_fixup *l;
35903be0 12519 bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
252b5132
RH
12520
12521 for (l = mips_hi_fixup_list; l != NULL; l = l->next)
12522 {
12523 segment_info_type *seginfo;
3b91255e
RS
12524 bfd_boolean matched_lo_p;
12525 fixS **hi_pos, **lo_pos, **pos;
252b5132 12526
9c2799c2 12527 gas_assert (reloc_needs_lo_p (l->fixp->fx_r_type));
252b5132 12528
5919d012
RS
12529 /* If a GOT16 relocation turns out to be against a global symbol,
12530 there isn't supposed to be a matching LO. */
738e5348 12531 if (got16_reloc_p (l->fixp->fx_r_type)
5919d012
RS
12532 && !pic_need_relax (l->fixp->fx_addsy, l->seg))
12533 continue;
12534
12535 /* Check quickly whether the next fixup happens to be a matching %lo. */
12536 if (fixup_has_matching_lo_p (l->fixp))
252b5132
RH
12537 continue;
12538
252b5132 12539 seginfo = seg_info (l->seg);
252b5132 12540
3b91255e
RS
12541 /* Set HI_POS to the position of this relocation in the chain.
12542 Set LO_POS to the position of the chosen low-part relocation.
12543 MATCHED_LO_P is true on entry to the loop if *POS is a low-part
12544 relocation that matches an immediately-preceding high-part
12545 relocation. */
12546 hi_pos = NULL;
12547 lo_pos = NULL;
12548 matched_lo_p = FALSE;
738e5348 12549 looking_for_rtype = matching_lo_reloc (l->fixp->fx_r_type);
35903be0 12550
3b91255e
RS
12551 for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
12552 {
12553 if (*pos == l->fixp)
12554 hi_pos = pos;
12555
35903be0 12556 if ((*pos)->fx_r_type == looking_for_rtype
30cfc97a 12557 && symbol_same_p ((*pos)->fx_addsy, l->fixp->fx_addsy)
3b91255e
RS
12558 && (*pos)->fx_offset >= l->fixp->fx_offset
12559 && (lo_pos == NULL
12560 || (*pos)->fx_offset < (*lo_pos)->fx_offset
12561 || (!matched_lo_p
12562 && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
12563 lo_pos = pos;
12564
12565 matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
12566 && fixup_has_matching_lo_p (*pos));
12567 }
12568
12569 /* If we found a match, remove the high-part relocation from its
12570 current position and insert it before the low-part relocation.
12571 Make the offsets match so that fixup_has_matching_lo_p()
12572 will return true.
12573
12574 We don't warn about unmatched high-part relocations since some
12575 versions of gcc have been known to emit dead "lui ...%hi(...)"
12576 instructions. */
12577 if (lo_pos != NULL)
12578 {
12579 l->fixp->fx_offset = (*lo_pos)->fx_offset;
12580 if (l->fixp->fx_next != *lo_pos)
252b5132 12581 {
3b91255e
RS
12582 *hi_pos = l->fixp->fx_next;
12583 l->fixp->fx_next = *lo_pos;
12584 *lo_pos = l->fixp;
252b5132 12585 }
252b5132
RH
12586 }
12587 }
12588}
12589
3e722fb5 12590/* We may have combined relocations without symbols in the N32/N64 ABI.
f6688943 12591 We have to prevent gas from dropping them. */
252b5132 12592
252b5132 12593int
17a2f251 12594mips_force_relocation (fixS *fixp)
252b5132 12595{
ae6063d4 12596 if (generic_force_reloc (fixp))
252b5132
RH
12597 return 1;
12598
f6688943
TS
12599 if (HAVE_NEWABI
12600 && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
12601 && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
738e5348
RS
12602 || hi16_reloc_p (fixp->fx_r_type)
12603 || lo16_reloc_p (fixp->fx_r_type)))
f6688943
TS
12604 return 1;
12605
3e722fb5 12606 return 0;
252b5132
RH
12607}
12608
12609/* Apply a fixup to the object file. */
12610
94f592af 12611void
55cf6793 12612md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
252b5132 12613{
874e8986 12614 bfd_byte *buf;
98aa84af 12615 long insn;
a7ebbfdf 12616 reloc_howto_type *howto;
252b5132 12617
a7ebbfdf
TS
12618 /* We ignore generic BFD relocations we don't know about. */
12619 howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
12620 if (! howto)
12621 return;
65551fa4 12622
9c2799c2 12623 gas_assert (fixP->fx_size == 4
90ecf173
MR
12624 || fixP->fx_r_type == BFD_RELOC_16
12625 || fixP->fx_r_type == BFD_RELOC_64
12626 || fixP->fx_r_type == BFD_RELOC_CTOR
12627 || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
12628 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
12629 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
12630 || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
252b5132 12631
a7ebbfdf 12632 buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
252b5132 12633
9c2799c2 12634 gas_assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2);
b1dca8ee
RS
12635
12636 /* Don't treat parts of a composite relocation as done. There are two
12637 reasons for this:
12638
12639 (1) The second and third parts will be against 0 (RSS_UNDEF) but
12640 should nevertheless be emitted if the first part is.
12641
12642 (2) In normal usage, composite relocations are never assembly-time
12643 constants. The easiest way of dealing with the pathological
12644 exceptions is to generate a relocation against STN_UNDEF and
12645 leave everything up to the linker. */
3994f87e 12646 if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
252b5132
RH
12647 fixP->fx_done = 1;
12648
12649 switch (fixP->fx_r_type)
12650 {
3f98094e
DJ
12651 case BFD_RELOC_MIPS_TLS_GD:
12652 case BFD_RELOC_MIPS_TLS_LDM:
741d6ea8
JM
12653 case BFD_RELOC_MIPS_TLS_DTPREL32:
12654 case BFD_RELOC_MIPS_TLS_DTPREL64:
3f98094e
DJ
12655 case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
12656 case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
12657 case BFD_RELOC_MIPS_TLS_GOTTPREL:
12658 case BFD_RELOC_MIPS_TLS_TPREL_HI16:
12659 case BFD_RELOC_MIPS_TLS_TPREL_LO16:
12660 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12661 /* fall through */
12662
252b5132 12663 case BFD_RELOC_MIPS_JMP:
e369bcce
TS
12664 case BFD_RELOC_MIPS_SHIFT5:
12665 case BFD_RELOC_MIPS_SHIFT6:
12666 case BFD_RELOC_MIPS_GOT_DISP:
12667 case BFD_RELOC_MIPS_GOT_PAGE:
12668 case BFD_RELOC_MIPS_GOT_OFST:
12669 case BFD_RELOC_MIPS_SUB:
12670 case BFD_RELOC_MIPS_INSERT_A:
12671 case BFD_RELOC_MIPS_INSERT_B:
12672 case BFD_RELOC_MIPS_DELETE:
12673 case BFD_RELOC_MIPS_HIGHEST:
12674 case BFD_RELOC_MIPS_HIGHER:
12675 case BFD_RELOC_MIPS_SCN_DISP:
12676 case BFD_RELOC_MIPS_REL16:
12677 case BFD_RELOC_MIPS_RELGOT:
12678 case BFD_RELOC_MIPS_JALR:
252b5132
RH
12679 case BFD_RELOC_HI16:
12680 case BFD_RELOC_HI16_S:
cdf6fd85 12681 case BFD_RELOC_GPREL16:
252b5132
RH
12682 case BFD_RELOC_MIPS_LITERAL:
12683 case BFD_RELOC_MIPS_CALL16:
12684 case BFD_RELOC_MIPS_GOT16:
cdf6fd85 12685 case BFD_RELOC_GPREL32:
252b5132
RH
12686 case BFD_RELOC_MIPS_GOT_HI16:
12687 case BFD_RELOC_MIPS_GOT_LO16:
12688 case BFD_RELOC_MIPS_CALL_HI16:
12689 case BFD_RELOC_MIPS_CALL_LO16:
12690 case BFD_RELOC_MIPS16_GPREL:
738e5348
RS
12691 case BFD_RELOC_MIPS16_GOT16:
12692 case BFD_RELOC_MIPS16_CALL16:
d6f16593
MR
12693 case BFD_RELOC_MIPS16_HI16:
12694 case BFD_RELOC_MIPS16_HI16_S:
252b5132 12695 case BFD_RELOC_MIPS16_JMP:
54f4ddb3 12696 /* Nothing needed to do. The value comes from the reloc entry. */
252b5132
RH
12697 break;
12698
252b5132
RH
12699 case BFD_RELOC_64:
12700 /* This is handled like BFD_RELOC_32, but we output a sign
12701 extended value if we are only 32 bits. */
3e722fb5 12702 if (fixP->fx_done)
252b5132
RH
12703 {
12704 if (8 <= sizeof (valueT))
2132e3a3 12705 md_number_to_chars ((char *) buf, *valP, 8);
252b5132
RH
12706 else
12707 {
a7ebbfdf 12708 valueT hiv;
252b5132 12709
a7ebbfdf 12710 if ((*valP & 0x80000000) != 0)
252b5132
RH
12711 hiv = 0xffffffff;
12712 else
12713 hiv = 0;
b215186b 12714 md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
a7ebbfdf 12715 *valP, 4);
b215186b 12716 md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
a7ebbfdf 12717 hiv, 4);
252b5132
RH
12718 }
12719 }
12720 break;
12721
056350c6 12722 case BFD_RELOC_RVA:
252b5132 12723 case BFD_RELOC_32:
252b5132
RH
12724 case BFD_RELOC_16:
12725 /* If we are deleting this reloc entry, we must fill in the
54f4ddb3
TS
12726 value now. This can happen if we have a .word which is not
12727 resolved when it appears but is later defined. */
252b5132 12728 if (fixP->fx_done)
54f4ddb3 12729 md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
252b5132
RH
12730 break;
12731
12732 case BFD_RELOC_LO16:
d6f16593 12733 case BFD_RELOC_MIPS16_LO16:
3e722fb5
CD
12734 /* FIXME: Now that embedded-PIC is gone, some of this code/comment
12735 may be safe to remove, but if so it's not obvious. */
252b5132
RH
12736 /* When handling an embedded PIC switch statement, we can wind
12737 up deleting a LO16 reloc. See the 'o' case in mips_ip. */
12738 if (fixP->fx_done)
12739 {
a7ebbfdf 12740 if (*valP + 0x8000 > 0xffff)
252b5132
RH
12741 as_bad_where (fixP->fx_file, fixP->fx_line,
12742 _("relocation overflow"));
252b5132
RH
12743 if (target_big_endian)
12744 buf += 2;
2132e3a3 12745 md_number_to_chars ((char *) buf, *valP, 2);
252b5132
RH
12746 }
12747 break;
12748
12749 case BFD_RELOC_16_PCREL_S2:
a7ebbfdf 12750 if ((*valP & 0x3) != 0)
cb56d3d3 12751 as_bad_where (fixP->fx_file, fixP->fx_line,
bad36eac 12752 _("Branch to misaligned address (%lx)"), (long) *valP);
cb56d3d3 12753
54f4ddb3
TS
12754 /* We need to save the bits in the instruction since fixup_segment()
12755 might be deleting the relocation entry (i.e., a branch within
12756 the current segment). */
a7ebbfdf 12757 if (! fixP->fx_done)
bb2d6cd7 12758 break;
252b5132 12759
54f4ddb3 12760 /* Update old instruction data. */
252b5132
RH
12761 if (target_big_endian)
12762 insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
12763 else
12764 insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
12765
a7ebbfdf
TS
12766 if (*valP + 0x20000 <= 0x3ffff)
12767 {
12768 insn |= (*valP >> 2) & 0xffff;
2132e3a3 12769 md_number_to_chars ((char *) buf, insn, 4);
a7ebbfdf
TS
12770 }
12771 else if (mips_pic == NO_PIC
12772 && fixP->fx_done
12773 && fixP->fx_frag->fr_address >= text_section->vma
12774 && (fixP->fx_frag->fr_address
587aac4e 12775 < text_section->vma + bfd_get_section_size (text_section))
a7ebbfdf
TS
12776 && ((insn & 0xffff0000) == 0x10000000 /* beq $0,$0 */
12777 || (insn & 0xffff0000) == 0x04010000 /* bgez $0 */
12778 || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
252b5132
RH
12779 {
12780 /* The branch offset is too large. If this is an
12781 unconditional branch, and we are not generating PIC code,
12782 we can convert it to an absolute jump instruction. */
a7ebbfdf
TS
12783 if ((insn & 0xffff0000) == 0x04110000) /* bgezal $0 */
12784 insn = 0x0c000000; /* jal */
252b5132 12785 else
a7ebbfdf
TS
12786 insn = 0x08000000; /* j */
12787 fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
12788 fixP->fx_done = 0;
12789 fixP->fx_addsy = section_symbol (text_section);
12790 *valP += md_pcrel_from (fixP);
2132e3a3 12791 md_number_to_chars ((char *) buf, insn, 4);
a7ebbfdf
TS
12792 }
12793 else
12794 {
12795 /* If we got here, we have branch-relaxation disabled,
12796 and there's nothing we can do to fix this instruction
12797 without turning it into a longer sequence. */
12798 as_bad_where (fixP->fx_file, fixP->fx_line,
12799 _("Branch out of range"));
252b5132 12800 }
252b5132
RH
12801 break;
12802
12803 case BFD_RELOC_VTABLE_INHERIT:
12804 fixP->fx_done = 0;
12805 if (fixP->fx_addsy
12806 && !S_IS_DEFINED (fixP->fx_addsy)
12807 && !S_IS_WEAK (fixP->fx_addsy))
12808 S_SET_WEAK (fixP->fx_addsy);
12809 break;
12810
12811 case BFD_RELOC_VTABLE_ENTRY:
12812 fixP->fx_done = 0;
12813 break;
12814
12815 default:
12816 internalError ();
12817 }
a7ebbfdf
TS
12818
12819 /* Remember value for tc_gen_reloc. */
12820 fixP->fx_addnumber = *valP;
252b5132
RH
12821}
12822
252b5132 12823static symbolS *
17a2f251 12824get_symbol (void)
252b5132
RH
12825{
12826 int c;
12827 char *name;
12828 symbolS *p;
12829
12830 name = input_line_pointer;
12831 c = get_symbol_end ();
12832 p = (symbolS *) symbol_find_or_make (name);
12833 *input_line_pointer = c;
12834 return p;
12835}
12836
742a56fe
RS
12837/* Align the current frag to a given power of two. If a particular
12838 fill byte should be used, FILL points to an integer that contains
12839 that byte, otherwise FILL is null.
12840
12841 The MIPS assembler also automatically adjusts any preceding
12842 label. */
252b5132
RH
12843
12844static void
742a56fe 12845mips_align (int to, int *fill, symbolS *label)
252b5132 12846{
7d10b47d 12847 mips_emit_delays ();
742a56fe
RS
12848 mips_record_mips16_mode ();
12849 if (fill == NULL && subseg_text_p (now_seg))
12850 frag_align_code (to, 0);
12851 else
12852 frag_align (to, fill ? *fill : 0, 0);
252b5132
RH
12853 record_alignment (now_seg, to);
12854 if (label != NULL)
12855 {
9c2799c2 12856 gas_assert (S_GET_SEGMENT (label) == now_seg);
49309057 12857 symbol_set_frag (label, frag_now);
252b5132
RH
12858 S_SET_VALUE (label, (valueT) frag_now_fix ());
12859 }
12860}
12861
12862/* Align to a given power of two. .align 0 turns off the automatic
12863 alignment used by the data creating pseudo-ops. */
12864
12865static void
17a2f251 12866s_align (int x ATTRIBUTE_UNUSED)
252b5132 12867{
742a56fe 12868 int temp, fill_value, *fill_ptr;
49954fb4 12869 long max_alignment = 28;
252b5132 12870
54f4ddb3 12871 /* o Note that the assembler pulls down any immediately preceding label
252b5132 12872 to the aligned address.
54f4ddb3 12873 o It's not documented but auto alignment is reinstated by
252b5132 12874 a .align pseudo instruction.
54f4ddb3 12875 o Note also that after auto alignment is turned off the mips assembler
252b5132 12876 issues an error on attempt to assemble an improperly aligned data item.
54f4ddb3 12877 We don't. */
252b5132
RH
12878
12879 temp = get_absolute_expression ();
12880 if (temp > max_alignment)
12881 as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
12882 else if (temp < 0)
12883 {
12884 as_warn (_("Alignment negative: 0 assumed."));
12885 temp = 0;
12886 }
12887 if (*input_line_pointer == ',')
12888 {
f9419b05 12889 ++input_line_pointer;
742a56fe
RS
12890 fill_value = get_absolute_expression ();
12891 fill_ptr = &fill_value;
252b5132
RH
12892 }
12893 else
742a56fe 12894 fill_ptr = 0;
252b5132
RH
12895 if (temp)
12896 {
a8dbcb85
TS
12897 segment_info_type *si = seg_info (now_seg);
12898 struct insn_label_list *l = si->label_list;
54f4ddb3 12899 /* Auto alignment should be switched on by next section change. */
252b5132 12900 auto_align = 1;
742a56fe 12901 mips_align (temp, fill_ptr, l != NULL ? l->label : NULL);
252b5132
RH
12902 }
12903 else
12904 {
12905 auto_align = 0;
12906 }
12907
12908 demand_empty_rest_of_line ();
12909}
12910
252b5132 12911static void
17a2f251 12912s_change_sec (int sec)
252b5132
RH
12913{
12914 segT seg;
12915
252b5132
RH
12916#ifdef OBJ_ELF
12917 /* The ELF backend needs to know that we are changing sections, so
12918 that .previous works correctly. We could do something like check
b6ff326e 12919 for an obj_section_change_hook macro, but that might be confusing
252b5132
RH
12920 as it would not be appropriate to use it in the section changing
12921 functions in read.c, since obj-elf.c intercepts those. FIXME:
12922 This should be cleaner, somehow. */
f43abd2b
TS
12923 if (IS_ELF)
12924 obj_elf_section_change_hook ();
252b5132
RH
12925#endif
12926
7d10b47d 12927 mips_emit_delays ();
6a32d874 12928
252b5132
RH
12929 switch (sec)
12930 {
12931 case 't':
12932 s_text (0);
12933 break;
12934 case 'd':
12935 s_data (0);
12936 break;
12937 case 'b':
12938 subseg_set (bss_section, (subsegT) get_absolute_expression ());
12939 demand_empty_rest_of_line ();
12940 break;
12941
12942 case 'r':
4d0d148d
TS
12943 seg = subseg_new (RDATA_SECTION_NAME,
12944 (subsegT) get_absolute_expression ());
f43abd2b 12945 if (IS_ELF)
252b5132 12946 {
4d0d148d
TS
12947 bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
12948 | SEC_READONLY | SEC_RELOC
12949 | SEC_DATA));
c41e87e3 12950 if (strncmp (TARGET_OS, "elf", 3) != 0)
4d0d148d 12951 record_alignment (seg, 4);
252b5132 12952 }
4d0d148d 12953 demand_empty_rest_of_line ();
252b5132
RH
12954 break;
12955
12956 case 's':
4d0d148d 12957 seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
f43abd2b 12958 if (IS_ELF)
252b5132 12959 {
4d0d148d
TS
12960 bfd_set_section_flags (stdoutput, seg,
12961 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
c41e87e3 12962 if (strncmp (TARGET_OS, "elf", 3) != 0)
4d0d148d 12963 record_alignment (seg, 4);
252b5132 12964 }
4d0d148d
TS
12965 demand_empty_rest_of_line ();
12966 break;
998b3c36
MR
12967
12968 case 'B':
12969 seg = subseg_new (".sbss", (subsegT) get_absolute_expression ());
12970 if (IS_ELF)
12971 {
12972 bfd_set_section_flags (stdoutput, seg, SEC_ALLOC);
12973 if (strncmp (TARGET_OS, "elf", 3) != 0)
12974 record_alignment (seg, 4);
12975 }
12976 demand_empty_rest_of_line ();
12977 break;
252b5132
RH
12978 }
12979
12980 auto_align = 1;
12981}
b34976b6 12982
cca86cc8 12983void
17a2f251 12984s_change_section (int ignore ATTRIBUTE_UNUSED)
cca86cc8 12985{
7ed4a06a 12986#ifdef OBJ_ELF
cca86cc8
SC
12987 char *section_name;
12988 char c;
684022ea 12989 char next_c = 0;
cca86cc8
SC
12990 int section_type;
12991 int section_flag;
12992 int section_entry_size;
12993 int section_alignment;
b34976b6 12994
f43abd2b 12995 if (!IS_ELF)
7ed4a06a
TS
12996 return;
12997
cca86cc8
SC
12998 section_name = input_line_pointer;
12999 c = get_symbol_end ();
a816d1ed
AO
13000 if (c)
13001 next_c = *(input_line_pointer + 1);
cca86cc8 13002
4cf0dd0d
TS
13003 /* Do we have .section Name<,"flags">? */
13004 if (c != ',' || (c == ',' && next_c == '"'))
cca86cc8 13005 {
4cf0dd0d
TS
13006 /* just after name is now '\0'. */
13007 *input_line_pointer = c;
cca86cc8
SC
13008 input_line_pointer = section_name;
13009 obj_elf_section (ignore);
13010 return;
13011 }
13012 input_line_pointer++;
13013
13014 /* Do we have .section Name<,type><,flag><,entry_size><,alignment> */
13015 if (c == ',')
13016 section_type = get_absolute_expression ();
13017 else
13018 section_type = 0;
13019 if (*input_line_pointer++ == ',')
13020 section_flag = get_absolute_expression ();
13021 else
13022 section_flag = 0;
13023 if (*input_line_pointer++ == ',')
13024 section_entry_size = get_absolute_expression ();
13025 else
13026 section_entry_size = 0;
13027 if (*input_line_pointer++ == ',')
13028 section_alignment = get_absolute_expression ();
13029 else
13030 section_alignment = 0;
87975d2a
AM
13031 /* FIXME: really ignore? */
13032 (void) section_alignment;
cca86cc8 13033
a816d1ed
AO
13034 section_name = xstrdup (section_name);
13035
8ab8a5c8
RS
13036 /* When using the generic form of .section (as implemented by obj-elf.c),
13037 there's no way to set the section type to SHT_MIPS_DWARF. Users have
13038 traditionally had to fall back on the more common @progbits instead.
13039
13040 There's nothing really harmful in this, since bfd will correct
13041 SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file. But it
708587a4 13042 means that, for backwards compatibility, the special_section entries
8ab8a5c8
RS
13043 for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
13044
13045 Even so, we shouldn't force users of the MIPS .section syntax to
13046 incorrectly label the sections as SHT_PROGBITS. The best compromise
13047 seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
13048 generic type-checking code. */
13049 if (section_type == SHT_MIPS_DWARF)
13050 section_type = SHT_PROGBITS;
13051
cca86cc8
SC
13052 obj_elf_change_section (section_name, section_type, section_flag,
13053 section_entry_size, 0, 0, 0);
a816d1ed
AO
13054
13055 if (now_seg->name != section_name)
13056 free (section_name);
7ed4a06a 13057#endif /* OBJ_ELF */
cca86cc8 13058}
252b5132
RH
13059
13060void
17a2f251 13061mips_enable_auto_align (void)
252b5132
RH
13062{
13063 auto_align = 1;
13064}
13065
13066static void
17a2f251 13067s_cons (int log_size)
252b5132 13068{
a8dbcb85
TS
13069 segment_info_type *si = seg_info (now_seg);
13070 struct insn_label_list *l = si->label_list;
252b5132
RH
13071 symbolS *label;
13072
a8dbcb85 13073 label = l != NULL ? l->label : NULL;
7d10b47d 13074 mips_emit_delays ();
252b5132
RH
13075 if (log_size > 0 && auto_align)
13076 mips_align (log_size, 0, label);
252b5132 13077 cons (1 << log_size);
a1facbec 13078 mips_clear_insn_labels ();
252b5132
RH
13079}
13080
13081static void
17a2f251 13082s_float_cons (int type)
252b5132 13083{
a8dbcb85
TS
13084 segment_info_type *si = seg_info (now_seg);
13085 struct insn_label_list *l = si->label_list;
252b5132
RH
13086 symbolS *label;
13087
a8dbcb85 13088 label = l != NULL ? l->label : NULL;
252b5132 13089
7d10b47d 13090 mips_emit_delays ();
252b5132
RH
13091
13092 if (auto_align)
49309057
ILT
13093 {
13094 if (type == 'd')
13095 mips_align (3, 0, label);
13096 else
13097 mips_align (2, 0, label);
13098 }
252b5132 13099
252b5132 13100 float_cons (type);
a1facbec 13101 mips_clear_insn_labels ();
252b5132
RH
13102}
13103
13104/* Handle .globl. We need to override it because on Irix 5 you are
13105 permitted to say
13106 .globl foo .text
13107 where foo is an undefined symbol, to mean that foo should be
13108 considered to be the address of a function. */
13109
13110static void
17a2f251 13111s_mips_globl (int x ATTRIBUTE_UNUSED)
252b5132
RH
13112{
13113 char *name;
13114 int c;
13115 symbolS *symbolP;
13116 flagword flag;
13117
8a06b769 13118 do
252b5132 13119 {
8a06b769 13120 name = input_line_pointer;
252b5132 13121 c = get_symbol_end ();
8a06b769
TS
13122 symbolP = symbol_find_or_make (name);
13123 S_SET_EXTERNAL (symbolP);
13124
252b5132 13125 *input_line_pointer = c;
8a06b769 13126 SKIP_WHITESPACE ();
252b5132 13127
8a06b769
TS
13128 /* On Irix 5, every global symbol that is not explicitly labelled as
13129 being a function is apparently labelled as being an object. */
13130 flag = BSF_OBJECT;
252b5132 13131
8a06b769
TS
13132 if (!is_end_of_line[(unsigned char) *input_line_pointer]
13133 && (*input_line_pointer != ','))
13134 {
13135 char *secname;
13136 asection *sec;
13137
13138 secname = input_line_pointer;
13139 c = get_symbol_end ();
13140 sec = bfd_get_section_by_name (stdoutput, secname);
13141 if (sec == NULL)
13142 as_bad (_("%s: no such section"), secname);
13143 *input_line_pointer = c;
13144
13145 if (sec != NULL && (sec->flags & SEC_CODE) != 0)
13146 flag = BSF_FUNCTION;
13147 }
13148
13149 symbol_get_bfdsym (symbolP)->flags |= flag;
13150
13151 c = *input_line_pointer;
13152 if (c == ',')
13153 {
13154 input_line_pointer++;
13155 SKIP_WHITESPACE ();
13156 if (is_end_of_line[(unsigned char) *input_line_pointer])
13157 c = '\n';
13158 }
13159 }
13160 while (c == ',');
252b5132 13161
252b5132
RH
13162 demand_empty_rest_of_line ();
13163}
13164
13165static void
17a2f251 13166s_option (int x ATTRIBUTE_UNUSED)
252b5132
RH
13167{
13168 char *opt;
13169 char c;
13170
13171 opt = input_line_pointer;
13172 c = get_symbol_end ();
13173
13174 if (*opt == 'O')
13175 {
13176 /* FIXME: What does this mean? */
13177 }
13178 else if (strncmp (opt, "pic", 3) == 0)
13179 {
13180 int i;
13181
13182 i = atoi (opt + 3);
13183 if (i == 0)
13184 mips_pic = NO_PIC;
13185 else if (i == 2)
143d77c5 13186 {
252b5132 13187 mips_pic = SVR4_PIC;
143d77c5
EC
13188 mips_abicalls = TRUE;
13189 }
252b5132
RH
13190 else
13191 as_bad (_(".option pic%d not supported"), i);
13192
4d0d148d 13193 if (mips_pic == SVR4_PIC)
252b5132
RH
13194 {
13195 if (g_switch_seen && g_switch_value != 0)
13196 as_warn (_("-G may not be used with SVR4 PIC code"));
13197 g_switch_value = 0;
13198 bfd_set_gp_size (stdoutput, 0);
13199 }
13200 }
13201 else
13202 as_warn (_("Unrecognized option \"%s\""), opt);
13203
13204 *input_line_pointer = c;
13205 demand_empty_rest_of_line ();
13206}
13207
13208/* This structure is used to hold a stack of .set values. */
13209
e972090a
NC
13210struct mips_option_stack
13211{
252b5132
RH
13212 struct mips_option_stack *next;
13213 struct mips_set_options options;
13214};
13215
13216static struct mips_option_stack *mips_opts_stack;
13217
13218/* Handle the .set pseudo-op. */
13219
13220static void
17a2f251 13221s_mipsset (int x ATTRIBUTE_UNUSED)
252b5132
RH
13222{
13223 char *name = input_line_pointer, ch;
13224
13225 while (!is_end_of_line[(unsigned char) *input_line_pointer])
f9419b05 13226 ++input_line_pointer;
252b5132
RH
13227 ch = *input_line_pointer;
13228 *input_line_pointer = '\0';
13229
13230 if (strcmp (name, "reorder") == 0)
13231 {
7d10b47d
RS
13232 if (mips_opts.noreorder)
13233 end_noreorder ();
252b5132
RH
13234 }
13235 else if (strcmp (name, "noreorder") == 0)
13236 {
7d10b47d
RS
13237 if (!mips_opts.noreorder)
13238 start_noreorder ();
252b5132 13239 }
741fe287
MR
13240 else if (strncmp (name, "at=", 3) == 0)
13241 {
13242 char *s = name + 3;
13243
13244 if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
13245 as_bad (_("Unrecognized register name `%s'"), s);
13246 }
252b5132
RH
13247 else if (strcmp (name, "at") == 0)
13248 {
741fe287 13249 mips_opts.at = ATREG;
252b5132
RH
13250 }
13251 else if (strcmp (name, "noat") == 0)
13252 {
741fe287 13253 mips_opts.at = ZERO;
252b5132
RH
13254 }
13255 else if (strcmp (name, "macro") == 0)
13256 {
13257 mips_opts.warn_about_macros = 0;
13258 }
13259 else if (strcmp (name, "nomacro") == 0)
13260 {
13261 if (mips_opts.noreorder == 0)
13262 as_bad (_("`noreorder' must be set before `nomacro'"));
13263 mips_opts.warn_about_macros = 1;
13264 }
13265 else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
13266 {
13267 mips_opts.nomove = 0;
13268 }
13269 else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
13270 {
13271 mips_opts.nomove = 1;
13272 }
13273 else if (strcmp (name, "bopt") == 0)
13274 {
13275 mips_opts.nobopt = 0;
13276 }
13277 else if (strcmp (name, "nobopt") == 0)
13278 {
13279 mips_opts.nobopt = 1;
13280 }
ad3fea08
TS
13281 else if (strcmp (name, "gp=default") == 0)
13282 mips_opts.gp32 = file_mips_gp32;
13283 else if (strcmp (name, "gp=32") == 0)
13284 mips_opts.gp32 = 1;
13285 else if (strcmp (name, "gp=64") == 0)
13286 {
13287 if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
20203fb9 13288 as_warn (_("%s isa does not support 64-bit registers"),
ad3fea08
TS
13289 mips_cpu_info_from_isa (mips_opts.isa)->name);
13290 mips_opts.gp32 = 0;
13291 }
13292 else if (strcmp (name, "fp=default") == 0)
13293 mips_opts.fp32 = file_mips_fp32;
13294 else if (strcmp (name, "fp=32") == 0)
13295 mips_opts.fp32 = 1;
13296 else if (strcmp (name, "fp=64") == 0)
13297 {
13298 if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
20203fb9 13299 as_warn (_("%s isa does not support 64-bit floating point registers"),
ad3fea08
TS
13300 mips_cpu_info_from_isa (mips_opts.isa)->name);
13301 mips_opts.fp32 = 0;
13302 }
037b32b9
AN
13303 else if (strcmp (name, "softfloat") == 0)
13304 mips_opts.soft_float = 1;
13305 else if (strcmp (name, "hardfloat") == 0)
13306 mips_opts.soft_float = 0;
13307 else if (strcmp (name, "singlefloat") == 0)
13308 mips_opts.single_float = 1;
13309 else if (strcmp (name, "doublefloat") == 0)
13310 mips_opts.single_float = 0;
252b5132
RH
13311 else if (strcmp (name, "mips16") == 0
13312 || strcmp (name, "MIPS-16") == 0)
13313 mips_opts.mips16 = 1;
13314 else if (strcmp (name, "nomips16") == 0
13315 || strcmp (name, "noMIPS-16") == 0)
13316 mips_opts.mips16 = 0;
e16bfa71
TS
13317 else if (strcmp (name, "smartmips") == 0)
13318 {
ad3fea08 13319 if (!ISA_SUPPORTS_SMARTMIPS)
20203fb9 13320 as_warn (_("%s ISA does not support SmartMIPS ASE"),
e16bfa71
TS
13321 mips_cpu_info_from_isa (mips_opts.isa)->name);
13322 mips_opts.ase_smartmips = 1;
13323 }
13324 else if (strcmp (name, "nosmartmips") == 0)
13325 mips_opts.ase_smartmips = 0;
1f25f5d3
CD
13326 else if (strcmp (name, "mips3d") == 0)
13327 mips_opts.ase_mips3d = 1;
13328 else if (strcmp (name, "nomips3d") == 0)
13329 mips_opts.ase_mips3d = 0;
a4672219
TS
13330 else if (strcmp (name, "mdmx") == 0)
13331 mips_opts.ase_mdmx = 1;
13332 else if (strcmp (name, "nomdmx") == 0)
13333 mips_opts.ase_mdmx = 0;
74cd071d 13334 else if (strcmp (name, "dsp") == 0)
ad3fea08
TS
13335 {
13336 if (!ISA_SUPPORTS_DSP_ASE)
20203fb9 13337 as_warn (_("%s ISA does not support DSP ASE"),
ad3fea08
TS
13338 mips_cpu_info_from_isa (mips_opts.isa)->name);
13339 mips_opts.ase_dsp = 1;
8b082fb1 13340 mips_opts.ase_dspr2 = 0;
ad3fea08 13341 }
74cd071d 13342 else if (strcmp (name, "nodsp") == 0)
8b082fb1
TS
13343 {
13344 mips_opts.ase_dsp = 0;
13345 mips_opts.ase_dspr2 = 0;
13346 }
13347 else if (strcmp (name, "dspr2") == 0)
13348 {
13349 if (!ISA_SUPPORTS_DSPR2_ASE)
20203fb9 13350 as_warn (_("%s ISA does not support DSP R2 ASE"),
8b082fb1
TS
13351 mips_cpu_info_from_isa (mips_opts.isa)->name);
13352 mips_opts.ase_dspr2 = 1;
13353 mips_opts.ase_dsp = 1;
13354 }
13355 else if (strcmp (name, "nodspr2") == 0)
13356 {
13357 mips_opts.ase_dspr2 = 0;
13358 mips_opts.ase_dsp = 0;
13359 }
ef2e4d86 13360 else if (strcmp (name, "mt") == 0)
ad3fea08
TS
13361 {
13362 if (!ISA_SUPPORTS_MT_ASE)
20203fb9 13363 as_warn (_("%s ISA does not support MT ASE"),
ad3fea08
TS
13364 mips_cpu_info_from_isa (mips_opts.isa)->name);
13365 mips_opts.ase_mt = 1;
13366 }
ef2e4d86
CF
13367 else if (strcmp (name, "nomt") == 0)
13368 mips_opts.ase_mt = 0;
1a2c1fad 13369 else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
252b5132 13370 {
af7ee8bf 13371 int reset = 0;
252b5132 13372
1a2c1fad
CD
13373 /* Permit the user to change the ISA and architecture on the fly.
13374 Needless to say, misuse can cause serious problems. */
81a21e38 13375 if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
af7ee8bf
CD
13376 {
13377 reset = 1;
13378 mips_opts.isa = file_mips_isa;
1a2c1fad 13379 mips_opts.arch = file_mips_arch;
1a2c1fad
CD
13380 }
13381 else if (strncmp (name, "arch=", 5) == 0)
13382 {
13383 const struct mips_cpu_info *p;
13384
13385 p = mips_parse_cpu("internal use", name + 5);
13386 if (!p)
13387 as_bad (_("unknown architecture %s"), name + 5);
13388 else
13389 {
13390 mips_opts.arch = p->cpu;
13391 mips_opts.isa = p->isa;
13392 }
13393 }
81a21e38
TS
13394 else if (strncmp (name, "mips", 4) == 0)
13395 {
13396 const struct mips_cpu_info *p;
13397
13398 p = mips_parse_cpu("internal use", name);
13399 if (!p)
13400 as_bad (_("unknown ISA level %s"), name + 4);
13401 else
13402 {
13403 mips_opts.arch = p->cpu;
13404 mips_opts.isa = p->isa;
13405 }
13406 }
af7ee8bf 13407 else
81a21e38 13408 as_bad (_("unknown ISA or architecture %s"), name);
af7ee8bf
CD
13409
13410 switch (mips_opts.isa)
98d3f06f
KH
13411 {
13412 case 0:
98d3f06f 13413 break;
af7ee8bf
CD
13414 case ISA_MIPS1:
13415 case ISA_MIPS2:
13416 case ISA_MIPS32:
13417 case ISA_MIPS32R2:
98d3f06f
KH
13418 mips_opts.gp32 = 1;
13419 mips_opts.fp32 = 1;
13420 break;
af7ee8bf
CD
13421 case ISA_MIPS3:
13422 case ISA_MIPS4:
13423 case ISA_MIPS5:
13424 case ISA_MIPS64:
5f74bc13 13425 case ISA_MIPS64R2:
98d3f06f
KH
13426 mips_opts.gp32 = 0;
13427 mips_opts.fp32 = 0;
13428 break;
13429 default:
13430 as_bad (_("unknown ISA level %s"), name + 4);
13431 break;
13432 }
af7ee8bf 13433 if (reset)
98d3f06f 13434 {
af7ee8bf
CD
13435 mips_opts.gp32 = file_mips_gp32;
13436 mips_opts.fp32 = file_mips_fp32;
98d3f06f 13437 }
252b5132
RH
13438 }
13439 else if (strcmp (name, "autoextend") == 0)
13440 mips_opts.noautoextend = 0;
13441 else if (strcmp (name, "noautoextend") == 0)
13442 mips_opts.noautoextend = 1;
13443 else if (strcmp (name, "push") == 0)
13444 {
13445 struct mips_option_stack *s;
13446
13447 s = (struct mips_option_stack *) xmalloc (sizeof *s);
13448 s->next = mips_opts_stack;
13449 s->options = mips_opts;
13450 mips_opts_stack = s;
13451 }
13452 else if (strcmp (name, "pop") == 0)
13453 {
13454 struct mips_option_stack *s;
13455
13456 s = mips_opts_stack;
13457 if (s == NULL)
13458 as_bad (_(".set pop with no .set push"));
13459 else
13460 {
13461 /* If we're changing the reorder mode we need to handle
13462 delay slots correctly. */
13463 if (s->options.noreorder && ! mips_opts.noreorder)
7d10b47d 13464 start_noreorder ();
252b5132 13465 else if (! s->options.noreorder && mips_opts.noreorder)
7d10b47d 13466 end_noreorder ();
252b5132
RH
13467
13468 mips_opts = s->options;
13469 mips_opts_stack = s->next;
13470 free (s);
13471 }
13472 }
aed1a261
RS
13473 else if (strcmp (name, "sym32") == 0)
13474 mips_opts.sym32 = TRUE;
13475 else if (strcmp (name, "nosym32") == 0)
13476 mips_opts.sym32 = FALSE;
e6559e01
JM
13477 else if (strchr (name, ','))
13478 {
13479 /* Generic ".set" directive; use the generic handler. */
13480 *input_line_pointer = ch;
13481 input_line_pointer = name;
13482 s_set (0);
13483 return;
13484 }
252b5132
RH
13485 else
13486 {
13487 as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
13488 }
13489 *input_line_pointer = ch;
13490 demand_empty_rest_of_line ();
13491}
13492
13493/* Handle the .abicalls pseudo-op. I believe this is equivalent to
13494 .option pic2. It means to generate SVR4 PIC calls. */
13495
13496static void
17a2f251 13497s_abicalls (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
13498{
13499 mips_pic = SVR4_PIC;
143d77c5 13500 mips_abicalls = TRUE;
4d0d148d
TS
13501
13502 if (g_switch_seen && g_switch_value != 0)
13503 as_warn (_("-G may not be used with SVR4 PIC code"));
13504 g_switch_value = 0;
13505
252b5132
RH
13506 bfd_set_gp_size (stdoutput, 0);
13507 demand_empty_rest_of_line ();
13508}
13509
13510/* Handle the .cpload pseudo-op. This is used when generating SVR4
13511 PIC code. It sets the $gp register for the function based on the
13512 function address, which is in the register named in the argument.
13513 This uses a relocation against _gp_disp, which is handled specially
13514 by the linker. The result is:
13515 lui $gp,%hi(_gp_disp)
13516 addiu $gp,$gp,%lo(_gp_disp)
13517 addu $gp,$gp,.cpload argument
aa6975fb
ILT
13518 The .cpload argument is normally $25 == $t9.
13519
13520 The -mno-shared option changes this to:
bbe506e8
TS
13521 lui $gp,%hi(__gnu_local_gp)
13522 addiu $gp,$gp,%lo(__gnu_local_gp)
aa6975fb
ILT
13523 and the argument is ignored. This saves an instruction, but the
13524 resulting code is not position independent; it uses an absolute
bbe506e8
TS
13525 address for __gnu_local_gp. Thus code assembled with -mno-shared
13526 can go into an ordinary executable, but not into a shared library. */
252b5132
RH
13527
13528static void
17a2f251 13529s_cpload (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
13530{
13531 expressionS ex;
aa6975fb
ILT
13532 int reg;
13533 int in_shared;
252b5132 13534
6478892d
TS
13535 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13536 .cpload is ignored. */
13537 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
252b5132
RH
13538 {
13539 s_ignore (0);
13540 return;
13541 }
13542
d3ecfc59 13543 /* .cpload should be in a .set noreorder section. */
252b5132
RH
13544 if (mips_opts.noreorder == 0)
13545 as_warn (_(".cpload not in noreorder section"));
13546
aa6975fb
ILT
13547 reg = tc_get_register (0);
13548
13549 /* If we need to produce a 64-bit address, we are better off using
13550 the default instruction sequence. */
aed1a261 13551 in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
aa6975fb 13552
252b5132 13553 ex.X_op = O_symbol;
bbe506e8
TS
13554 ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
13555 "__gnu_local_gp");
252b5132
RH
13556 ex.X_op_symbol = NULL;
13557 ex.X_add_number = 0;
13558
13559 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
49309057 13560 symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
252b5132 13561
584892a6 13562 macro_start ();
67c0d1eb
RS
13563 macro_build_lui (&ex, mips_gp_register);
13564 macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
17a2f251 13565 mips_gp_register, BFD_RELOC_LO16);
aa6975fb
ILT
13566 if (in_shared)
13567 macro_build (NULL, "addu", "d,v,t", mips_gp_register,
13568 mips_gp_register, reg);
584892a6 13569 macro_end ();
252b5132
RH
13570
13571 demand_empty_rest_of_line ();
13572}
13573
6478892d
TS
13574/* Handle the .cpsetup pseudo-op defined for NewABI PIC code. The syntax is:
13575 .cpsetup $reg1, offset|$reg2, label
13576
13577 If offset is given, this results in:
13578 sd $gp, offset($sp)
956cd1d6 13579 lui $gp, %hi(%neg(%gp_rel(label)))
698b7d9d
TS
13580 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
13581 daddu $gp, $gp, $reg1
6478892d
TS
13582
13583 If $reg2 is given, this results in:
13584 daddu $reg2, $gp, $0
956cd1d6 13585 lui $gp, %hi(%neg(%gp_rel(label)))
698b7d9d
TS
13586 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
13587 daddu $gp, $gp, $reg1
aa6975fb
ILT
13588 $reg1 is normally $25 == $t9.
13589
13590 The -mno-shared option replaces the last three instructions with
13591 lui $gp,%hi(_gp)
54f4ddb3 13592 addiu $gp,$gp,%lo(_gp) */
aa6975fb 13593
6478892d 13594static void
17a2f251 13595s_cpsetup (int ignore ATTRIBUTE_UNUSED)
6478892d
TS
13596{
13597 expressionS ex_off;
13598 expressionS ex_sym;
13599 int reg1;
6478892d 13600
8586fc66 13601 /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
6478892d
TS
13602 We also need NewABI support. */
13603 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13604 {
13605 s_ignore (0);
13606 return;
13607 }
13608
13609 reg1 = tc_get_register (0);
13610 SKIP_WHITESPACE ();
13611 if (*input_line_pointer != ',')
13612 {
13613 as_bad (_("missing argument separator ',' for .cpsetup"));
13614 return;
13615 }
13616 else
80245285 13617 ++input_line_pointer;
6478892d
TS
13618 SKIP_WHITESPACE ();
13619 if (*input_line_pointer == '$')
80245285
TS
13620 {
13621 mips_cpreturn_register = tc_get_register (0);
13622 mips_cpreturn_offset = -1;
13623 }
6478892d 13624 else
80245285
TS
13625 {
13626 mips_cpreturn_offset = get_absolute_expression ();
13627 mips_cpreturn_register = -1;
13628 }
6478892d
TS
13629 SKIP_WHITESPACE ();
13630 if (*input_line_pointer != ',')
13631 {
13632 as_bad (_("missing argument separator ',' for .cpsetup"));
13633 return;
13634 }
13635 else
f9419b05 13636 ++input_line_pointer;
6478892d 13637 SKIP_WHITESPACE ();
f21f8242 13638 expression (&ex_sym);
6478892d 13639
584892a6 13640 macro_start ();
6478892d
TS
13641 if (mips_cpreturn_register == -1)
13642 {
13643 ex_off.X_op = O_constant;
13644 ex_off.X_add_symbol = NULL;
13645 ex_off.X_op_symbol = NULL;
13646 ex_off.X_add_number = mips_cpreturn_offset;
13647
67c0d1eb 13648 macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
17a2f251 13649 BFD_RELOC_LO16, SP);
6478892d
TS
13650 }
13651 else
67c0d1eb 13652 macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
17a2f251 13653 mips_gp_register, 0);
6478892d 13654
aed1a261 13655 if (mips_in_shared || HAVE_64BIT_SYMBOLS)
aa6975fb
ILT
13656 {
13657 macro_build (&ex_sym, "lui", "t,u", mips_gp_register,
13658 -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
13659 BFD_RELOC_HI16_S);
13660
13661 macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
13662 mips_gp_register, -1, BFD_RELOC_GPREL16,
13663 BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
13664
13665 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
13666 mips_gp_register, reg1);
13667 }
13668 else
13669 {
13670 expressionS ex;
13671
13672 ex.X_op = O_symbol;
4184909a 13673 ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
aa6975fb
ILT
13674 ex.X_op_symbol = NULL;
13675 ex.X_add_number = 0;
6e1304d8 13676
aa6975fb
ILT
13677 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
13678 symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13679
13680 macro_build_lui (&ex, mips_gp_register);
13681 macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13682 mips_gp_register, BFD_RELOC_LO16);
13683 }
f21f8242 13684
584892a6 13685 macro_end ();
6478892d
TS
13686
13687 demand_empty_rest_of_line ();
13688}
13689
13690static void
17a2f251 13691s_cplocal (int ignore ATTRIBUTE_UNUSED)
6478892d
TS
13692{
13693 /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
54f4ddb3 13694 .cplocal is ignored. */
6478892d
TS
13695 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13696 {
13697 s_ignore (0);
13698 return;
13699 }
13700
13701 mips_gp_register = tc_get_register (0);
85b51719 13702 demand_empty_rest_of_line ();
6478892d
TS
13703}
13704
252b5132
RH
13705/* Handle the .cprestore pseudo-op. This stores $gp into a given
13706 offset from $sp. The offset is remembered, and after making a PIC
13707 call $gp is restored from that location. */
13708
13709static void
17a2f251 13710s_cprestore (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
13711{
13712 expressionS ex;
252b5132 13713
6478892d 13714 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
c9914766 13715 .cprestore is ignored. */
6478892d 13716 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
252b5132
RH
13717 {
13718 s_ignore (0);
13719 return;
13720 }
13721
13722 mips_cprestore_offset = get_absolute_expression ();
7a621144 13723 mips_cprestore_valid = 1;
252b5132
RH
13724
13725 ex.X_op = O_constant;
13726 ex.X_add_symbol = NULL;
13727 ex.X_op_symbol = NULL;
13728 ex.X_add_number = mips_cprestore_offset;
13729
584892a6 13730 macro_start ();
67c0d1eb
RS
13731 macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
13732 SP, HAVE_64BIT_ADDRESSES);
584892a6 13733 macro_end ();
252b5132
RH
13734
13735 demand_empty_rest_of_line ();
13736}
13737
6478892d 13738/* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
67c1ffbe 13739 was given in the preceding .cpsetup, it results in:
6478892d 13740 ld $gp, offset($sp)
76b3015f 13741
6478892d 13742 If a register $reg2 was given there, it results in:
54f4ddb3
TS
13743 daddu $gp, $reg2, $0 */
13744
6478892d 13745static void
17a2f251 13746s_cpreturn (int ignore ATTRIBUTE_UNUSED)
6478892d
TS
13747{
13748 expressionS ex;
6478892d
TS
13749
13750 /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
13751 We also need NewABI support. */
13752 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13753 {
13754 s_ignore (0);
13755 return;
13756 }
13757
584892a6 13758 macro_start ();
6478892d
TS
13759 if (mips_cpreturn_register == -1)
13760 {
13761 ex.X_op = O_constant;
13762 ex.X_add_symbol = NULL;
13763 ex.X_op_symbol = NULL;
13764 ex.X_add_number = mips_cpreturn_offset;
13765
67c0d1eb 13766 macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
6478892d
TS
13767 }
13768 else
67c0d1eb 13769 macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
17a2f251 13770 mips_cpreturn_register, 0);
584892a6 13771 macro_end ();
6478892d
TS
13772
13773 demand_empty_rest_of_line ();
13774}
13775
741d6ea8
JM
13776/* Handle the .dtprelword and .dtpreldword pseudo-ops. They generate
13777 a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
13778 use in DWARF debug information. */
13779
13780static void
13781s_dtprel_internal (size_t bytes)
13782{
13783 expressionS ex;
13784 char *p;
13785
13786 expression (&ex);
13787
13788 if (ex.X_op != O_symbol)
13789 {
13790 as_bad (_("Unsupported use of %s"), (bytes == 8
13791 ? ".dtpreldword"
13792 : ".dtprelword"));
13793 ignore_rest_of_line ();
13794 }
13795
13796 p = frag_more (bytes);
13797 md_number_to_chars (p, 0, bytes);
13798 fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
13799 (bytes == 8
13800 ? BFD_RELOC_MIPS_TLS_DTPREL64
13801 : BFD_RELOC_MIPS_TLS_DTPREL32));
13802
13803 demand_empty_rest_of_line ();
13804}
13805
13806/* Handle .dtprelword. */
13807
13808static void
13809s_dtprelword (int ignore ATTRIBUTE_UNUSED)
13810{
13811 s_dtprel_internal (4);
13812}
13813
13814/* Handle .dtpreldword. */
13815
13816static void
13817s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
13818{
13819 s_dtprel_internal (8);
13820}
13821
6478892d
TS
13822/* Handle the .gpvalue pseudo-op. This is used when generating NewABI PIC
13823 code. It sets the offset to use in gp_rel relocations. */
13824
13825static void
17a2f251 13826s_gpvalue (int ignore ATTRIBUTE_UNUSED)
6478892d
TS
13827{
13828 /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
13829 We also need NewABI support. */
13830 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13831 {
13832 s_ignore (0);
13833 return;
13834 }
13835
def2e0dd 13836 mips_gprel_offset = get_absolute_expression ();
6478892d
TS
13837
13838 demand_empty_rest_of_line ();
13839}
13840
252b5132
RH
13841/* Handle the .gpword pseudo-op. This is used when generating PIC
13842 code. It generates a 32 bit GP relative reloc. */
13843
13844static void
17a2f251 13845s_gpword (int ignore ATTRIBUTE_UNUSED)
252b5132 13846{
a8dbcb85
TS
13847 segment_info_type *si;
13848 struct insn_label_list *l;
252b5132
RH
13849 symbolS *label;
13850 expressionS ex;
13851 char *p;
13852
13853 /* When not generating PIC code, this is treated as .word. */
13854 if (mips_pic != SVR4_PIC)
13855 {
13856 s_cons (2);
13857 return;
13858 }
13859
a8dbcb85
TS
13860 si = seg_info (now_seg);
13861 l = si->label_list;
13862 label = l != NULL ? l->label : NULL;
7d10b47d 13863 mips_emit_delays ();
252b5132
RH
13864 if (auto_align)
13865 mips_align (2, 0, label);
252b5132
RH
13866
13867 expression (&ex);
a1facbec 13868 mips_clear_insn_labels ();
252b5132
RH
13869
13870 if (ex.X_op != O_symbol || ex.X_add_number != 0)
13871 {
13872 as_bad (_("Unsupported use of .gpword"));
13873 ignore_rest_of_line ();
13874 }
13875
13876 p = frag_more (4);
17a2f251 13877 md_number_to_chars (p, 0, 4);
b34976b6 13878 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
cdf6fd85 13879 BFD_RELOC_GPREL32);
252b5132
RH
13880
13881 demand_empty_rest_of_line ();
13882}
13883
10181a0d 13884static void
17a2f251 13885s_gpdword (int ignore ATTRIBUTE_UNUSED)
10181a0d 13886{
a8dbcb85
TS
13887 segment_info_type *si;
13888 struct insn_label_list *l;
10181a0d
AO
13889 symbolS *label;
13890 expressionS ex;
13891 char *p;
13892
13893 /* When not generating PIC code, this is treated as .dword. */
13894 if (mips_pic != SVR4_PIC)
13895 {
13896 s_cons (3);
13897 return;
13898 }
13899
a8dbcb85
TS
13900 si = seg_info (now_seg);
13901 l = si->label_list;
13902 label = l != NULL ? l->label : NULL;
7d10b47d 13903 mips_emit_delays ();
10181a0d
AO
13904 if (auto_align)
13905 mips_align (3, 0, label);
10181a0d
AO
13906
13907 expression (&ex);
a1facbec 13908 mips_clear_insn_labels ();
10181a0d
AO
13909
13910 if (ex.X_op != O_symbol || ex.X_add_number != 0)
13911 {
13912 as_bad (_("Unsupported use of .gpdword"));
13913 ignore_rest_of_line ();
13914 }
13915
13916 p = frag_more (8);
17a2f251 13917 md_number_to_chars (p, 0, 8);
a105a300 13918 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
6e1304d8 13919 BFD_RELOC_GPREL32)->fx_tcbit = 1;
10181a0d
AO
13920
13921 /* GPREL32 composed with 64 gives a 64-bit GP offset. */
6e1304d8
RS
13922 fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
13923 FALSE, BFD_RELOC_64)->fx_tcbit = 1;
10181a0d
AO
13924
13925 demand_empty_rest_of_line ();
13926}
13927
252b5132
RH
13928/* Handle the .cpadd pseudo-op. This is used when dealing with switch
13929 tables in SVR4 PIC code. */
13930
13931static void
17a2f251 13932s_cpadd (int ignore ATTRIBUTE_UNUSED)
252b5132 13933{
252b5132
RH
13934 int reg;
13935
10181a0d
AO
13936 /* This is ignored when not generating SVR4 PIC code. */
13937 if (mips_pic != SVR4_PIC)
252b5132
RH
13938 {
13939 s_ignore (0);
13940 return;
13941 }
13942
13943 /* Add $gp to the register named as an argument. */
584892a6 13944 macro_start ();
252b5132 13945 reg = tc_get_register (0);
67c0d1eb 13946 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
584892a6 13947 macro_end ();
252b5132 13948
bdaaa2e1 13949 demand_empty_rest_of_line ();
252b5132
RH
13950}
13951
13952/* Handle the .insn pseudo-op. This marks instruction labels in
13953 mips16 mode. This permits the linker to handle them specially,
13954 such as generating jalx instructions when needed. We also make
13955 them odd for the duration of the assembly, in order to generate the
13956 right sort of code. We will make them even in the adjust_symtab
13957 routine, while leaving them marked. This is convenient for the
13958 debugger and the disassembler. The linker knows to make them odd
13959 again. */
13960
13961static void
17a2f251 13962s_insn (int ignore ATTRIBUTE_UNUSED)
252b5132 13963{
f9419b05 13964 mips16_mark_labels ();
252b5132
RH
13965
13966 demand_empty_rest_of_line ();
13967}
13968
13969/* Handle a .stabn directive. We need these in order to mark a label
13970 as being a mips16 text label correctly. Sometimes the compiler
13971 will emit a label, followed by a .stabn, and then switch sections.
13972 If the label and .stabn are in mips16 mode, then the label is
13973 really a mips16 text label. */
13974
13975static void
17a2f251 13976s_mips_stab (int type)
252b5132 13977{
f9419b05 13978 if (type == 'n')
252b5132
RH
13979 mips16_mark_labels ();
13980
13981 s_stab (type);
13982}
13983
54f4ddb3 13984/* Handle the .weakext pseudo-op as defined in Kane and Heinrich. */
252b5132
RH
13985
13986static void
17a2f251 13987s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
13988{
13989 char *name;
13990 int c;
13991 symbolS *symbolP;
13992 expressionS exp;
13993
13994 name = input_line_pointer;
13995 c = get_symbol_end ();
13996 symbolP = symbol_find_or_make (name);
13997 S_SET_WEAK (symbolP);
13998 *input_line_pointer = c;
13999
14000 SKIP_WHITESPACE ();
14001
14002 if (! is_end_of_line[(unsigned char) *input_line_pointer])
14003 {
14004 if (S_IS_DEFINED (symbolP))
14005 {
20203fb9 14006 as_bad (_("ignoring attempt to redefine symbol %s"),
252b5132
RH
14007 S_GET_NAME (symbolP));
14008 ignore_rest_of_line ();
14009 return;
14010 }
bdaaa2e1 14011
252b5132
RH
14012 if (*input_line_pointer == ',')
14013 {
14014 ++input_line_pointer;
14015 SKIP_WHITESPACE ();
14016 }
bdaaa2e1 14017
252b5132
RH
14018 expression (&exp);
14019 if (exp.X_op != O_symbol)
14020 {
20203fb9 14021 as_bad (_("bad .weakext directive"));
98d3f06f 14022 ignore_rest_of_line ();
252b5132
RH
14023 return;
14024 }
49309057 14025 symbol_set_value_expression (symbolP, &exp);
252b5132
RH
14026 }
14027
14028 demand_empty_rest_of_line ();
14029}
14030
14031/* Parse a register string into a number. Called from the ECOFF code
14032 to parse .frame. The argument is non-zero if this is the frame
14033 register, so that we can record it in mips_frame_reg. */
14034
14035int
17a2f251 14036tc_get_register (int frame)
252b5132 14037{
707bfff6 14038 unsigned int reg;
252b5132
RH
14039
14040 SKIP_WHITESPACE ();
707bfff6
TS
14041 if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
14042 reg = 0;
252b5132 14043 if (frame)
7a621144
DJ
14044 {
14045 mips_frame_reg = reg != 0 ? reg : SP;
14046 mips_frame_reg_valid = 1;
14047 mips_cprestore_valid = 0;
14048 }
252b5132
RH
14049 return reg;
14050}
14051
14052valueT
17a2f251 14053md_section_align (asection *seg, valueT addr)
252b5132
RH
14054{
14055 int align = bfd_get_section_alignment (stdoutput, seg);
14056
b4c71f56
TS
14057 if (IS_ELF)
14058 {
14059 /* We don't need to align ELF sections to the full alignment.
14060 However, Irix 5 may prefer that we align them at least to a 16
14061 byte boundary. We don't bother to align the sections if we
14062 are targeted for an embedded system. */
c41e87e3 14063 if (strncmp (TARGET_OS, "elf", 3) == 0)
b4c71f56
TS
14064 return addr;
14065 if (align > 4)
14066 align = 4;
14067 }
252b5132
RH
14068
14069 return ((addr + (1 << align) - 1) & (-1 << align));
14070}
14071
14072/* Utility routine, called from above as well. If called while the
14073 input file is still being read, it's only an approximation. (For
14074 example, a symbol may later become defined which appeared to be
14075 undefined earlier.) */
14076
14077static int
17a2f251 14078nopic_need_relax (symbolS *sym, int before_relaxing)
252b5132
RH
14079{
14080 if (sym == 0)
14081 return 0;
14082
4d0d148d 14083 if (g_switch_value > 0)
252b5132
RH
14084 {
14085 const char *symname;
14086 int change;
14087
c9914766 14088 /* Find out whether this symbol can be referenced off the $gp
252b5132
RH
14089 register. It can be if it is smaller than the -G size or if
14090 it is in the .sdata or .sbss section. Certain symbols can
c9914766 14091 not be referenced off the $gp, although it appears as though
252b5132
RH
14092 they can. */
14093 symname = S_GET_NAME (sym);
14094 if (symname != (const char *) NULL
14095 && (strcmp (symname, "eprol") == 0
14096 || strcmp (symname, "etext") == 0
14097 || strcmp (symname, "_gp") == 0
14098 || strcmp (symname, "edata") == 0
14099 || strcmp (symname, "_fbss") == 0
14100 || strcmp (symname, "_fdata") == 0
14101 || strcmp (symname, "_ftext") == 0
14102 || strcmp (symname, "end") == 0
14103 || strcmp (symname, "_gp_disp") == 0))
14104 change = 1;
14105 else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
14106 && (0
14107#ifndef NO_ECOFF_DEBUGGING
49309057
ILT
14108 || (symbol_get_obj (sym)->ecoff_extern_size != 0
14109 && (symbol_get_obj (sym)->ecoff_extern_size
14110 <= g_switch_value))
252b5132
RH
14111#endif
14112 /* We must defer this decision until after the whole
14113 file has been read, since there might be a .extern
14114 after the first use of this symbol. */
14115 || (before_relaxing
14116#ifndef NO_ECOFF_DEBUGGING
49309057 14117 && symbol_get_obj (sym)->ecoff_extern_size == 0
252b5132
RH
14118#endif
14119 && S_GET_VALUE (sym) == 0)
14120 || (S_GET_VALUE (sym) != 0
14121 && S_GET_VALUE (sym) <= g_switch_value)))
14122 change = 0;
14123 else
14124 {
14125 const char *segname;
14126
14127 segname = segment_name (S_GET_SEGMENT (sym));
9c2799c2 14128 gas_assert (strcmp (segname, ".lit8") != 0
252b5132
RH
14129 && strcmp (segname, ".lit4") != 0);
14130 change = (strcmp (segname, ".sdata") != 0
fba2b7f9
GK
14131 && strcmp (segname, ".sbss") != 0
14132 && strncmp (segname, ".sdata.", 7) != 0
d4dc2f22
TS
14133 && strncmp (segname, ".sbss.", 6) != 0
14134 && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
fba2b7f9 14135 && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
252b5132
RH
14136 }
14137 return change;
14138 }
14139 else
c9914766 14140 /* We are not optimizing for the $gp register. */
252b5132
RH
14141 return 1;
14142}
14143
5919d012
RS
14144
14145/* Return true if the given symbol should be considered local for SVR4 PIC. */
14146
14147static bfd_boolean
17a2f251 14148pic_need_relax (symbolS *sym, asection *segtype)
5919d012
RS
14149{
14150 asection *symsec;
5919d012
RS
14151
14152 /* Handle the case of a symbol equated to another symbol. */
14153 while (symbol_equated_reloc_p (sym))
14154 {
14155 symbolS *n;
14156
5f0fe04b 14157 /* It's possible to get a loop here in a badly written program. */
5919d012
RS
14158 n = symbol_get_value_expression (sym)->X_add_symbol;
14159 if (n == sym)
14160 break;
14161 sym = n;
14162 }
14163
df1f3cda
DD
14164 if (symbol_section_p (sym))
14165 return TRUE;
14166
5919d012
RS
14167 symsec = S_GET_SEGMENT (sym);
14168
5919d012
RS
14169 /* This must duplicate the test in adjust_reloc_syms. */
14170 return (symsec != &bfd_und_section
14171 && symsec != &bfd_abs_section
5f0fe04b
TS
14172 && !bfd_is_com_section (symsec)
14173 && !s_is_linkonce (sym, segtype)
5919d012
RS
14174#ifdef OBJ_ELF
14175 /* A global or weak symbol is treated as external. */
f43abd2b 14176 && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
5919d012
RS
14177#endif
14178 );
14179}
14180
14181
252b5132
RH
14182/* Given a mips16 variant frag FRAGP, return non-zero if it needs an
14183 extended opcode. SEC is the section the frag is in. */
14184
14185static int
17a2f251 14186mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
252b5132
RH
14187{
14188 int type;
3994f87e 14189 const struct mips16_immed_operand *op;
252b5132
RH
14190 offsetT val;
14191 int mintiny, maxtiny;
14192 segT symsec;
98aa84af 14193 fragS *sym_frag;
252b5132
RH
14194
14195 if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
14196 return 0;
14197 if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
14198 return 1;
14199
14200 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14201 op = mips16_immed_operands;
14202 while (op->type != type)
14203 {
14204 ++op;
9c2799c2 14205 gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
252b5132
RH
14206 }
14207
14208 if (op->unsp)
14209 {
14210 if (type == '<' || type == '>' || type == '[' || type == ']')
14211 {
14212 mintiny = 1;
14213 maxtiny = 1 << op->nbits;
14214 }
14215 else
14216 {
14217 mintiny = 0;
14218 maxtiny = (1 << op->nbits) - 1;
14219 }
14220 }
14221 else
14222 {
14223 mintiny = - (1 << (op->nbits - 1));
14224 maxtiny = (1 << (op->nbits - 1)) - 1;
14225 }
14226
98aa84af 14227 sym_frag = symbol_get_frag (fragp->fr_symbol);
ac62c346 14228 val = S_GET_VALUE (fragp->fr_symbol);
98aa84af 14229 symsec = S_GET_SEGMENT (fragp->fr_symbol);
252b5132
RH
14230
14231 if (op->pcrel)
14232 {
14233 addressT addr;
14234
14235 /* We won't have the section when we are called from
14236 mips_relax_frag. However, we will always have been called
14237 from md_estimate_size_before_relax first. If this is a
14238 branch to a different section, we mark it as such. If SEC is
14239 NULL, and the frag is not marked, then it must be a branch to
14240 the same section. */
14241 if (sec == NULL)
14242 {
14243 if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
14244 return 1;
14245 }
14246 else
14247 {
98aa84af 14248 /* Must have been called from md_estimate_size_before_relax. */
252b5132
RH
14249 if (symsec != sec)
14250 {
14251 fragp->fr_subtype =
14252 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
14253
14254 /* FIXME: We should support this, and let the linker
14255 catch branches and loads that are out of range. */
14256 as_bad_where (fragp->fr_file, fragp->fr_line,
14257 _("unsupported PC relative reference to different section"));
14258
14259 return 1;
14260 }
98aa84af
AM
14261 if (fragp != sym_frag && sym_frag->fr_address == 0)
14262 /* Assume non-extended on the first relaxation pass.
14263 The address we have calculated will be bogus if this is
14264 a forward branch to another frag, as the forward frag
14265 will have fr_address == 0. */
14266 return 0;
252b5132
RH
14267 }
14268
14269 /* In this case, we know for sure that the symbol fragment is in
98aa84af
AM
14270 the same section. If the relax_marker of the symbol fragment
14271 differs from the relax_marker of this fragment, we have not
14272 yet adjusted the symbol fragment fr_address. We want to add
252b5132
RH
14273 in STRETCH in order to get a better estimate of the address.
14274 This particularly matters because of the shift bits. */
14275 if (stretch != 0
98aa84af 14276 && sym_frag->relax_marker != fragp->relax_marker)
252b5132
RH
14277 {
14278 fragS *f;
14279
14280 /* Adjust stretch for any alignment frag. Note that if have
14281 been expanding the earlier code, the symbol may be
14282 defined in what appears to be an earlier frag. FIXME:
14283 This doesn't handle the fr_subtype field, which specifies
14284 a maximum number of bytes to skip when doing an
14285 alignment. */
98aa84af 14286 for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
252b5132
RH
14287 {
14288 if (f->fr_type == rs_align || f->fr_type == rs_align_code)
14289 {
14290 if (stretch < 0)
14291 stretch = - ((- stretch)
14292 & ~ ((1 << (int) f->fr_offset) - 1));
14293 else
14294 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
14295 if (stretch == 0)
14296 break;
14297 }
14298 }
14299 if (f != NULL)
14300 val += stretch;
14301 }
14302
14303 addr = fragp->fr_address + fragp->fr_fix;
14304
14305 /* The base address rules are complicated. The base address of
14306 a branch is the following instruction. The base address of a
14307 PC relative load or add is the instruction itself, but if it
14308 is in a delay slot (in which case it can not be extended) use
14309 the address of the instruction whose delay slot it is in. */
14310 if (type == 'p' || type == 'q')
14311 {
14312 addr += 2;
14313
14314 /* If we are currently assuming that this frag should be
14315 extended, then, the current address is two bytes
bdaaa2e1 14316 higher. */
252b5132
RH
14317 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14318 addr += 2;
14319
14320 /* Ignore the low bit in the target, since it will be set
14321 for a text label. */
14322 if ((val & 1) != 0)
14323 --val;
14324 }
14325 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14326 addr -= 4;
14327 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14328 addr -= 2;
14329
14330 val -= addr & ~ ((1 << op->shift) - 1);
14331
14332 /* Branch offsets have an implicit 0 in the lowest bit. */
14333 if (type == 'p' || type == 'q')
14334 val /= 2;
14335
14336 /* If any of the shifted bits are set, we must use an extended
14337 opcode. If the address depends on the size of this
14338 instruction, this can lead to a loop, so we arrange to always
14339 use an extended opcode. We only check this when we are in
14340 the main relaxation loop, when SEC is NULL. */
14341 if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
14342 {
14343 fragp->fr_subtype =
14344 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
14345 return 1;
14346 }
14347
14348 /* If we are about to mark a frag as extended because the value
14349 is precisely maxtiny + 1, then there is a chance of an
14350 infinite loop as in the following code:
14351 la $4,foo
14352 .skip 1020
14353 .align 2
14354 foo:
14355 In this case when the la is extended, foo is 0x3fc bytes
14356 away, so the la can be shrunk, but then foo is 0x400 away, so
14357 the la must be extended. To avoid this loop, we mark the
14358 frag as extended if it was small, and is about to become
14359 extended with a value of maxtiny + 1. */
14360 if (val == ((maxtiny + 1) << op->shift)
14361 && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
14362 && sec == NULL)
14363 {
14364 fragp->fr_subtype =
14365 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
14366 return 1;
14367 }
14368 }
14369 else if (symsec != absolute_section && sec != NULL)
14370 as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
14371
14372 if ((val & ((1 << op->shift) - 1)) != 0
14373 || val < (mintiny << op->shift)
14374 || val > (maxtiny << op->shift))
14375 return 1;
14376 else
14377 return 0;
14378}
14379
4a6a3df4
AO
14380/* Compute the length of a branch sequence, and adjust the
14381 RELAX_BRANCH_TOOFAR bit accordingly. If FRAGP is NULL, the
14382 worst-case length is computed, with UPDATE being used to indicate
14383 whether an unconditional (-1), branch-likely (+1) or regular (0)
14384 branch is to be computed. */
14385static int
17a2f251 14386relaxed_branch_length (fragS *fragp, asection *sec, int update)
4a6a3df4 14387{
b34976b6 14388 bfd_boolean toofar;
4a6a3df4
AO
14389 int length;
14390
14391 if (fragp
14392 && S_IS_DEFINED (fragp->fr_symbol)
14393 && sec == S_GET_SEGMENT (fragp->fr_symbol))
14394 {
14395 addressT addr;
14396 offsetT val;
14397
14398 val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
14399
14400 addr = fragp->fr_address + fragp->fr_fix + 4;
14401
14402 val -= addr;
14403
14404 toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
14405 }
14406 else if (fragp)
14407 /* If the symbol is not defined or it's in a different segment,
14408 assume the user knows what's going on and emit a short
14409 branch. */
b34976b6 14410 toofar = FALSE;
4a6a3df4 14411 else
b34976b6 14412 toofar = TRUE;
4a6a3df4
AO
14413
14414 if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14415 fragp->fr_subtype
66b3e8da
MR
14416 = RELAX_BRANCH_ENCODE (RELAX_BRANCH_AT (fragp->fr_subtype),
14417 RELAX_BRANCH_UNCOND (fragp->fr_subtype),
4a6a3df4
AO
14418 RELAX_BRANCH_LIKELY (fragp->fr_subtype),
14419 RELAX_BRANCH_LINK (fragp->fr_subtype),
14420 toofar);
14421
14422 length = 4;
14423 if (toofar)
14424 {
14425 if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
14426 length += 8;
14427
14428 if (mips_pic != NO_PIC)
14429 {
14430 /* Additional space for PIC loading of target address. */
14431 length += 8;
14432 if (mips_opts.isa == ISA_MIPS1)
14433 /* Additional space for $at-stabilizing nop. */
14434 length += 4;
14435 }
14436
14437 /* If branch is conditional. */
14438 if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
14439 length += 8;
14440 }
b34976b6 14441
4a6a3df4
AO
14442 return length;
14443}
14444
252b5132
RH
14445/* Estimate the size of a frag before relaxing. Unless this is the
14446 mips16, we are not really relaxing here, and the final size is
14447 encoded in the subtype information. For the mips16, we have to
14448 decide whether we are using an extended opcode or not. */
14449
252b5132 14450int
17a2f251 14451md_estimate_size_before_relax (fragS *fragp, asection *segtype)
252b5132 14452{
5919d012 14453 int change;
252b5132 14454
4a6a3df4
AO
14455 if (RELAX_BRANCH_P (fragp->fr_subtype))
14456 {
14457
b34976b6
AM
14458 fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
14459
4a6a3df4
AO
14460 return fragp->fr_var;
14461 }
14462
252b5132 14463 if (RELAX_MIPS16_P (fragp->fr_subtype))
177b4a6a
AO
14464 /* We don't want to modify the EXTENDED bit here; it might get us
14465 into infinite loops. We change it only in mips_relax_frag(). */
14466 return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
252b5132
RH
14467
14468 if (mips_pic == NO_PIC)
5919d012 14469 change = nopic_need_relax (fragp->fr_symbol, 0);
252b5132 14470 else if (mips_pic == SVR4_PIC)
5919d012 14471 change = pic_need_relax (fragp->fr_symbol, segtype);
0a44bf69
RS
14472 else if (mips_pic == VXWORKS_PIC)
14473 /* For vxworks, GOT16 relocations never have a corresponding LO16. */
14474 change = 0;
252b5132
RH
14475 else
14476 abort ();
14477
14478 if (change)
14479 {
4d7206a2 14480 fragp->fr_subtype |= RELAX_USE_SECOND;
4d7206a2 14481 return -RELAX_FIRST (fragp->fr_subtype);
252b5132 14482 }
4d7206a2
RS
14483 else
14484 return -RELAX_SECOND (fragp->fr_subtype);
252b5132
RH
14485}
14486
14487/* This is called to see whether a reloc against a defined symbol
de7e6852 14488 should be converted into a reloc against a section. */
252b5132
RH
14489
14490int
17a2f251 14491mips_fix_adjustable (fixS *fixp)
252b5132 14492{
252b5132
RH
14493 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
14494 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14495 return 0;
a161fe53 14496
252b5132
RH
14497 if (fixp->fx_addsy == NULL)
14498 return 1;
a161fe53 14499
de7e6852
RS
14500 /* If symbol SYM is in a mergeable section, relocations of the form
14501 SYM + 0 can usually be made section-relative. The mergeable data
14502 is then identified by the section offset rather than by the symbol.
14503
14504 However, if we're generating REL LO16 relocations, the offset is split
14505 between the LO16 and parterning high part relocation. The linker will
14506 need to recalculate the complete offset in order to correctly identify
14507 the merge data.
14508
14509 The linker has traditionally not looked for the parterning high part
14510 relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
14511 placed anywhere. Rather than break backwards compatibility by changing
14512 this, it seems better not to force the issue, and instead keep the
14513 original symbol. This will work with either linker behavior. */
738e5348 14514 if ((lo16_reloc_p (fixp->fx_r_type)
704803a9 14515 || reloc_needs_lo_p (fixp->fx_r_type))
de7e6852
RS
14516 && HAVE_IN_PLACE_ADDENDS
14517 && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
14518 return 0;
14519
ce70d90a
MR
14520 /* There is no place to store an in-place offset for JALR relocations.
14521 Likewise an in-range offset of PC-relative relocations may overflow
14522 the in-place relocatable field if recalculated against the start
14523 address of the symbol's containing section. */
14524 if (HAVE_IN_PLACE_ADDENDS
14525 && (fixp->fx_pcrel || fixp->fx_r_type == BFD_RELOC_MIPS_JALR))
1180b5a4
RS
14526 return 0;
14527
252b5132 14528#ifdef OBJ_ELF
b314ec0e
RS
14529 /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
14530 to a floating-point stub. The same is true for non-R_MIPS16_26
14531 relocations against MIPS16 functions; in this case, the stub becomes
14532 the function's canonical address.
14533
14534 Floating-point stubs are stored in unique .mips16.call.* or
14535 .mips16.fn.* sections. If a stub T for function F is in section S,
14536 the first relocation in section S must be against F; this is how the
14537 linker determines the target function. All relocations that might
14538 resolve to T must also be against F. We therefore have the following
14539 restrictions, which are given in an intentionally-redundant way:
14540
14541 1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
14542 symbols.
14543
14544 2. We cannot reduce a stub's relocations against non-MIPS16 symbols
14545 if that stub might be used.
14546
14547 3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
14548 symbols.
14549
14550 4. We cannot reduce a stub's relocations against MIPS16 symbols if
14551 that stub might be used.
14552
14553 There is a further restriction:
14554
14555 5. We cannot reduce R_MIPS16_26 relocations against MIPS16 symbols
14556 on targets with in-place addends; the relocation field cannot
14557 encode the low bit.
14558
14559 For simplicity, we deal with (3)-(5) by not reducing _any_ relocation
14560 against a MIPS16 symbol.
14561
14562 We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
14563 relocation against some symbol R, no relocation against R may be
14564 reduced. (Note that this deals with (2) as well as (1) because
14565 relocations against global symbols will never be reduced on ELF
14566 targets.) This approach is a little simpler than trying to detect
14567 stub sections, and gives the "all or nothing" per-symbol consistency
14568 that we have for MIPS16 symbols. */
f43abd2b 14569 if (IS_ELF
b314ec0e 14570 && fixp->fx_subsy == NULL
30c09090 14571 && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
b314ec0e 14572 || *symbol_get_tc (fixp->fx_addsy)))
252b5132
RH
14573 return 0;
14574#endif
a161fe53 14575
252b5132
RH
14576 return 1;
14577}
14578
14579/* Translate internal representation of relocation info to BFD target
14580 format. */
14581
14582arelent **
17a2f251 14583tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
252b5132
RH
14584{
14585 static arelent *retval[4];
14586 arelent *reloc;
14587 bfd_reloc_code_real_type code;
14588
4b0cff4e
TS
14589 memset (retval, 0, sizeof(retval));
14590 reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
49309057
ILT
14591 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
14592 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
14593 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
14594
bad36eac
DJ
14595 if (fixp->fx_pcrel)
14596 {
9c2799c2 14597 gas_assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2);
bad36eac
DJ
14598
14599 /* At this point, fx_addnumber is "symbol offset - pcrel address".
14600 Relocations want only the symbol offset. */
14601 reloc->addend = fixp->fx_addnumber + reloc->address;
f43abd2b 14602 if (!IS_ELF)
bad36eac
DJ
14603 {
14604 /* A gruesome hack which is a result of the gruesome gas
14605 reloc handling. What's worse, for COFF (as opposed to
14606 ECOFF), we might need yet another copy of reloc->address.
14607 See bfd_install_relocation. */
14608 reloc->addend += reloc->address;
14609 }
14610 }
14611 else
14612 reloc->addend = fixp->fx_addnumber;
252b5132 14613
438c16b8
TS
14614 /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
14615 entry to be used in the relocation's section offset. */
14616 if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
252b5132
RH
14617 {
14618 reloc->address = reloc->addend;
14619 reloc->addend = 0;
14620 }
14621
252b5132 14622 code = fixp->fx_r_type;
252b5132 14623
bad36eac 14624 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
252b5132
RH
14625 if (reloc->howto == NULL)
14626 {
14627 as_bad_where (fixp->fx_file, fixp->fx_line,
14628 _("Can not represent %s relocation in this object file format"),
14629 bfd_get_reloc_code_name (code));
14630 retval[0] = NULL;
14631 }
14632
14633 return retval;
14634}
14635
14636/* Relax a machine dependent frag. This returns the amount by which
14637 the current size of the frag should change. */
14638
14639int
17a2f251 14640mips_relax_frag (asection *sec, fragS *fragp, long stretch)
252b5132 14641{
4a6a3df4
AO
14642 if (RELAX_BRANCH_P (fragp->fr_subtype))
14643 {
14644 offsetT old_var = fragp->fr_var;
b34976b6
AM
14645
14646 fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
4a6a3df4
AO
14647
14648 return fragp->fr_var - old_var;
14649 }
14650
252b5132
RH
14651 if (! RELAX_MIPS16_P (fragp->fr_subtype))
14652 return 0;
14653
c4e7957c 14654 if (mips16_extended_frag (fragp, NULL, stretch))
252b5132
RH
14655 {
14656 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14657 return 0;
14658 fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
14659 return 2;
14660 }
14661 else
14662 {
14663 if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14664 return 0;
14665 fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
14666 return -2;
14667 }
14668
14669 return 0;
14670}
14671
14672/* Convert a machine dependent frag. */
14673
14674void
17a2f251 14675md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
252b5132 14676{
4a6a3df4
AO
14677 if (RELAX_BRANCH_P (fragp->fr_subtype))
14678 {
14679 bfd_byte *buf;
14680 unsigned long insn;
14681 expressionS exp;
14682 fixS *fixp;
b34976b6 14683
4a6a3df4
AO
14684 buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
14685
14686 if (target_big_endian)
14687 insn = bfd_getb32 (buf);
14688 else
14689 insn = bfd_getl32 (buf);
b34976b6 14690
4a6a3df4
AO
14691 if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14692 {
14693 /* We generate a fixup instead of applying it right now
14694 because, if there are linker relaxations, we're going to
14695 need the relocations. */
14696 exp.X_op = O_symbol;
14697 exp.X_add_symbol = fragp->fr_symbol;
14698 exp.X_add_number = fragp->fr_offset;
14699
14700 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
3994f87e 14701 4, &exp, TRUE, BFD_RELOC_16_PCREL_S2);
4a6a3df4
AO
14702 fixp->fx_file = fragp->fr_file;
14703 fixp->fx_line = fragp->fr_line;
b34976b6 14704
2132e3a3 14705 md_number_to_chars ((char *) buf, insn, 4);
4a6a3df4
AO
14706 buf += 4;
14707 }
14708 else
14709 {
14710 int i;
14711
14712 as_warn_where (fragp->fr_file, fragp->fr_line,
5c4f07ba 14713 _("Relaxed out-of-range branch into a jump"));
4a6a3df4
AO
14714
14715 if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
14716 goto uncond;
14717
14718 if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14719 {
14720 /* Reverse the branch. */
14721 switch ((insn >> 28) & 0xf)
14722 {
14723 case 4:
14724 /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
14725 have the condition reversed by tweaking a single
14726 bit, and their opcodes all have 0x4???????. */
9c2799c2 14727 gas_assert ((insn & 0xf1000000) == 0x41000000);
4a6a3df4
AO
14728 insn ^= 0x00010000;
14729 break;
14730
14731 case 0:
14732 /* bltz 0x04000000 bgez 0x04010000
54f4ddb3 14733 bltzal 0x04100000 bgezal 0x04110000 */
9c2799c2 14734 gas_assert ((insn & 0xfc0e0000) == 0x04000000);
4a6a3df4
AO
14735 insn ^= 0x00010000;
14736 break;
b34976b6 14737
4a6a3df4
AO
14738 case 1:
14739 /* beq 0x10000000 bne 0x14000000
54f4ddb3 14740 blez 0x18000000 bgtz 0x1c000000 */
4a6a3df4
AO
14741 insn ^= 0x04000000;
14742 break;
14743
14744 default:
14745 abort ();
14746 }
14747 }
14748
14749 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14750 {
14751 /* Clear the and-link bit. */
9c2799c2 14752 gas_assert ((insn & 0xfc1c0000) == 0x04100000);
4a6a3df4 14753
54f4ddb3
TS
14754 /* bltzal 0x04100000 bgezal 0x04110000
14755 bltzall 0x04120000 bgezall 0x04130000 */
4a6a3df4
AO
14756 insn &= ~0x00100000;
14757 }
14758
14759 /* Branch over the branch (if the branch was likely) or the
14760 full jump (not likely case). Compute the offset from the
14761 current instruction to branch to. */
14762 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14763 i = 16;
14764 else
14765 {
14766 /* How many bytes in instructions we've already emitted? */
14767 i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14768 /* How many bytes in instructions from here to the end? */
14769 i = fragp->fr_var - i;
14770 }
14771 /* Convert to instruction count. */
14772 i >>= 2;
14773 /* Branch counts from the next instruction. */
b34976b6 14774 i--;
4a6a3df4
AO
14775 insn |= i;
14776 /* Branch over the jump. */
2132e3a3 14777 md_number_to_chars ((char *) buf, insn, 4);
4a6a3df4
AO
14778 buf += 4;
14779
54f4ddb3 14780 /* nop */
2132e3a3 14781 md_number_to_chars ((char *) buf, 0, 4);
4a6a3df4
AO
14782 buf += 4;
14783
14784 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14785 {
14786 /* beql $0, $0, 2f */
14787 insn = 0x50000000;
14788 /* Compute the PC offset from the current instruction to
14789 the end of the variable frag. */
14790 /* How many bytes in instructions we've already emitted? */
14791 i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14792 /* How many bytes in instructions from here to the end? */
14793 i = fragp->fr_var - i;
14794 /* Convert to instruction count. */
14795 i >>= 2;
14796 /* Don't decrement i, because we want to branch over the
14797 delay slot. */
14798
14799 insn |= i;
2132e3a3 14800 md_number_to_chars ((char *) buf, insn, 4);
4a6a3df4
AO
14801 buf += 4;
14802
2132e3a3 14803 md_number_to_chars ((char *) buf, 0, 4);
4a6a3df4
AO
14804 buf += 4;
14805 }
14806
14807 uncond:
14808 if (mips_pic == NO_PIC)
14809 {
14810 /* j or jal. */
14811 insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
14812 ? 0x0c000000 : 0x08000000);
14813 exp.X_op = O_symbol;
14814 exp.X_add_symbol = fragp->fr_symbol;
14815 exp.X_add_number = fragp->fr_offset;
14816
14817 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
3994f87e 14818 4, &exp, FALSE, BFD_RELOC_MIPS_JMP);
4a6a3df4
AO
14819 fixp->fx_file = fragp->fr_file;
14820 fixp->fx_line = fragp->fr_line;
14821
2132e3a3 14822 md_number_to_chars ((char *) buf, insn, 4);
4a6a3df4
AO
14823 buf += 4;
14824 }
14825 else
14826 {
66b3e8da
MR
14827 unsigned long at = RELAX_BRANCH_AT (fragp->fr_subtype);
14828
4a6a3df4 14829 /* lw/ld $at, <sym>($gp) R_MIPS_GOT16 */
66b3e8da
MR
14830 insn = HAVE_64BIT_ADDRESSES ? 0xdf800000 : 0x8f800000;
14831 insn |= at << OP_SH_RT;
4a6a3df4
AO
14832 exp.X_op = O_symbol;
14833 exp.X_add_symbol = fragp->fr_symbol;
14834 exp.X_add_number = fragp->fr_offset;
14835
14836 if (fragp->fr_offset)
14837 {
14838 exp.X_add_symbol = make_expr_symbol (&exp);
14839 exp.X_add_number = 0;
14840 }
14841
14842 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
3994f87e 14843 4, &exp, FALSE, BFD_RELOC_MIPS_GOT16);
4a6a3df4
AO
14844 fixp->fx_file = fragp->fr_file;
14845 fixp->fx_line = fragp->fr_line;
14846
2132e3a3 14847 md_number_to_chars ((char *) buf, insn, 4);
4a6a3df4 14848 buf += 4;
b34976b6 14849
4a6a3df4
AO
14850 if (mips_opts.isa == ISA_MIPS1)
14851 {
14852 /* nop */
2132e3a3 14853 md_number_to_chars ((char *) buf, 0, 4);
4a6a3df4
AO
14854 buf += 4;
14855 }
14856
14857 /* d/addiu $at, $at, <sym> R_MIPS_LO16 */
66b3e8da
MR
14858 insn = HAVE_64BIT_ADDRESSES ? 0x64000000 : 0x24000000;
14859 insn |= at << OP_SH_RS | at << OP_SH_RT;
4a6a3df4
AO
14860
14861 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
3994f87e 14862 4, &exp, FALSE, BFD_RELOC_LO16);
4a6a3df4
AO
14863 fixp->fx_file = fragp->fr_file;
14864 fixp->fx_line = fragp->fr_line;
b34976b6 14865
2132e3a3 14866 md_number_to_chars ((char *) buf, insn, 4);
4a6a3df4
AO
14867 buf += 4;
14868
14869 /* j(al)r $at. */
14870 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
66b3e8da 14871 insn = 0x0000f809;
4a6a3df4 14872 else
66b3e8da
MR
14873 insn = 0x00000008;
14874 insn |= at << OP_SH_RS;
4a6a3df4 14875
2132e3a3 14876 md_number_to_chars ((char *) buf, insn, 4);
4a6a3df4
AO
14877 buf += 4;
14878 }
14879 }
14880
9c2799c2 14881 gas_assert (buf == (bfd_byte *)fragp->fr_literal
4a6a3df4
AO
14882 + fragp->fr_fix + fragp->fr_var);
14883
14884 fragp->fr_fix += fragp->fr_var;
14885
14886 return;
14887 }
14888
252b5132
RH
14889 if (RELAX_MIPS16_P (fragp->fr_subtype))
14890 {
14891 int type;
3994f87e 14892 const struct mips16_immed_operand *op;
b34976b6 14893 bfd_boolean small, ext;
252b5132
RH
14894 offsetT val;
14895 bfd_byte *buf;
14896 unsigned long insn;
b34976b6 14897 bfd_boolean use_extend;
252b5132
RH
14898 unsigned short extend;
14899
14900 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14901 op = mips16_immed_operands;
14902 while (op->type != type)
14903 ++op;
14904
14905 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14906 {
b34976b6
AM
14907 small = FALSE;
14908 ext = TRUE;
252b5132
RH
14909 }
14910 else
14911 {
b34976b6
AM
14912 small = TRUE;
14913 ext = FALSE;
252b5132
RH
14914 }
14915
5f5f22c0 14916 val = resolve_symbol_value (fragp->fr_symbol);
252b5132
RH
14917 if (op->pcrel)
14918 {
14919 addressT addr;
14920
14921 addr = fragp->fr_address + fragp->fr_fix;
14922
14923 /* The rules for the base address of a PC relative reloc are
14924 complicated; see mips16_extended_frag. */
14925 if (type == 'p' || type == 'q')
14926 {
14927 addr += 2;
14928 if (ext)
14929 addr += 2;
14930 /* Ignore the low bit in the target, since it will be
14931 set for a text label. */
14932 if ((val & 1) != 0)
14933 --val;
14934 }
14935 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14936 addr -= 4;
14937 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14938 addr -= 2;
14939
14940 addr &= ~ (addressT) ((1 << op->shift) - 1);
14941 val -= addr;
14942
14943 /* Make sure the section winds up with the alignment we have
14944 assumed. */
14945 if (op->shift > 0)
14946 record_alignment (asec, op->shift);
14947 }
14948
14949 if (ext
14950 && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
14951 || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
14952 as_warn_where (fragp->fr_file, fragp->fr_line,
14953 _("extended instruction in delay slot"));
14954
14955 buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
14956
14957 if (target_big_endian)
14958 insn = bfd_getb16 (buf);
14959 else
14960 insn = bfd_getl16 (buf);
14961
14962 mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
14963 RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
14964 small, ext, &insn, &use_extend, &extend);
14965
14966 if (use_extend)
14967 {
2132e3a3 14968 md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
252b5132
RH
14969 fragp->fr_fix += 2;
14970 buf += 2;
14971 }
14972
2132e3a3 14973 md_number_to_chars ((char *) buf, insn, 2);
252b5132
RH
14974 fragp->fr_fix += 2;
14975 buf += 2;
14976 }
14977 else
14978 {
4d7206a2
RS
14979 int first, second;
14980 fixS *fixp;
252b5132 14981
4d7206a2
RS
14982 first = RELAX_FIRST (fragp->fr_subtype);
14983 second = RELAX_SECOND (fragp->fr_subtype);
14984 fixp = (fixS *) fragp->fr_opcode;
252b5132 14985
584892a6
RS
14986 /* Possibly emit a warning if we've chosen the longer option. */
14987 if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
14988 == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
14989 {
14990 const char *msg = macro_warning (fragp->fr_subtype);
14991 if (msg != 0)
520725ea 14992 as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
584892a6
RS
14993 }
14994
4d7206a2
RS
14995 /* Go through all the fixups for the first sequence. Disable them
14996 (by marking them as done) if we're going to use the second
14997 sequence instead. */
14998 while (fixp
14999 && fixp->fx_frag == fragp
15000 && fixp->fx_where < fragp->fr_fix - second)
15001 {
15002 if (fragp->fr_subtype & RELAX_USE_SECOND)
15003 fixp->fx_done = 1;
15004 fixp = fixp->fx_next;
15005 }
252b5132 15006
4d7206a2
RS
15007 /* Go through the fixups for the second sequence. Disable them if
15008 we're going to use the first sequence, otherwise adjust their
15009 addresses to account for the relaxation. */
15010 while (fixp && fixp->fx_frag == fragp)
15011 {
15012 if (fragp->fr_subtype & RELAX_USE_SECOND)
15013 fixp->fx_where -= first;
15014 else
15015 fixp->fx_done = 1;
15016 fixp = fixp->fx_next;
15017 }
15018
15019 /* Now modify the frag contents. */
15020 if (fragp->fr_subtype & RELAX_USE_SECOND)
15021 {
15022 char *start;
15023
15024 start = fragp->fr_literal + fragp->fr_fix - first - second;
15025 memmove (start, start + first, second);
15026 fragp->fr_fix -= first;
15027 }
15028 else
15029 fragp->fr_fix -= second;
252b5132
RH
15030 }
15031}
15032
15033#ifdef OBJ_ELF
15034
15035/* This function is called after the relocs have been generated.
15036 We've been storing mips16 text labels as odd. Here we convert them
15037 back to even for the convenience of the debugger. */
15038
15039void
17a2f251 15040mips_frob_file_after_relocs (void)
252b5132
RH
15041{
15042 asymbol **syms;
15043 unsigned int count, i;
15044
f43abd2b 15045 if (!IS_ELF)
252b5132
RH
15046 return;
15047
15048 syms = bfd_get_outsymbols (stdoutput);
15049 count = bfd_get_symcount (stdoutput);
15050 for (i = 0; i < count; i++, syms++)
15051 {
30c09090 15052 if (ELF_ST_IS_MIPS16 (elf_symbol (*syms)->internal_elf_sym.st_other)
252b5132
RH
15053 && ((*syms)->value & 1) != 0)
15054 {
15055 (*syms)->value &= ~1;
15056 /* If the symbol has an odd size, it was probably computed
15057 incorrectly, so adjust that as well. */
15058 if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
15059 ++elf_symbol (*syms)->internal_elf_sym.st_size;
15060 }
15061 }
15062}
15063
15064#endif
15065
a1facbec
MR
15066/* This function is called whenever a label is defined, including fake
15067 labels instantiated off the dot special symbol. It is used when
15068 handling branch delays; if a branch has a label, we assume we cannot
15069 move it. This also bumps the value of the symbol by 1 in compressed
15070 code. */
252b5132
RH
15071
15072void
a1facbec 15073mips_record_label (symbolS *sym)
252b5132 15074{
a8dbcb85 15075 segment_info_type *si = seg_info (now_seg);
252b5132
RH
15076 struct insn_label_list *l;
15077
15078 if (free_insn_labels == NULL)
15079 l = (struct insn_label_list *) xmalloc (sizeof *l);
15080 else
15081 {
15082 l = free_insn_labels;
15083 free_insn_labels = l->next;
15084 }
15085
15086 l->label = sym;
a8dbcb85
TS
15087 l->next = si->label_list;
15088 si->label_list = l;
a1facbec 15089}
07a53e5c 15090
a1facbec
MR
15091/* This function is called as tc_frob_label() whenever a label is defined
15092 and adds a DWARF-2 record we only want for true labels. */
15093
15094void
15095mips_define_label (symbolS *sym)
15096{
15097 mips_record_label (sym);
07a53e5c
RH
15098#ifdef OBJ_ELF
15099 dwarf2_emit_label (sym);
15100#endif
252b5132
RH
15101}
15102\f
15103#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
15104
15105/* Some special processing for a MIPS ELF file. */
15106
15107void
17a2f251 15108mips_elf_final_processing (void)
252b5132
RH
15109{
15110 /* Write out the register information. */
316f5878 15111 if (mips_abi != N64_ABI)
252b5132
RH
15112 {
15113 Elf32_RegInfo s;
15114
15115 s.ri_gprmask = mips_gprmask;
15116 s.ri_cprmask[0] = mips_cprmask[0];
15117 s.ri_cprmask[1] = mips_cprmask[1];
15118 s.ri_cprmask[2] = mips_cprmask[2];
15119 s.ri_cprmask[3] = mips_cprmask[3];
15120 /* The gp_value field is set by the MIPS ELF backend. */
15121
15122 bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
15123 ((Elf32_External_RegInfo *)
15124 mips_regmask_frag));
15125 }
15126 else
15127 {
15128 Elf64_Internal_RegInfo s;
15129
15130 s.ri_gprmask = mips_gprmask;
15131 s.ri_pad = 0;
15132 s.ri_cprmask[0] = mips_cprmask[0];
15133 s.ri_cprmask[1] = mips_cprmask[1];
15134 s.ri_cprmask[2] = mips_cprmask[2];
15135 s.ri_cprmask[3] = mips_cprmask[3];
15136 /* The gp_value field is set by the MIPS ELF backend. */
15137
15138 bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
15139 ((Elf64_External_RegInfo *)
15140 mips_regmask_frag));
15141 }
15142
15143 /* Set the MIPS ELF flag bits. FIXME: There should probably be some
15144 sort of BFD interface for this. */
15145 if (mips_any_noreorder)
15146 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
15147 if (mips_pic != NO_PIC)
143d77c5 15148 {
252b5132 15149 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
143d77c5
EC
15150 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
15151 }
15152 if (mips_abicalls)
15153 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
252b5132 15154
98d3f06f 15155 /* Set MIPS ELF flags for ASEs. */
74cd071d
CF
15156 /* We may need to define a new flag for DSP ASE, and set this flag when
15157 file_ase_dsp is true. */
8b082fb1 15158 /* Same for DSP R2. */
ef2e4d86
CF
15159 /* We may need to define a new flag for MT ASE, and set this flag when
15160 file_ase_mt is true. */
a4672219
TS
15161 if (file_ase_mips16)
15162 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
1f25f5d3
CD
15163#if 0 /* XXX FIXME */
15164 if (file_ase_mips3d)
15165 elf_elfheader (stdoutput)->e_flags |= ???;
15166#endif
deec1734
CD
15167 if (file_ase_mdmx)
15168 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
1f25f5d3 15169
bdaaa2e1 15170 /* Set the MIPS ELF ABI flags. */
316f5878 15171 if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
252b5132 15172 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
316f5878 15173 else if (mips_abi == O64_ABI)
252b5132 15174 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
316f5878 15175 else if (mips_abi == EABI_ABI)
252b5132 15176 {
316f5878 15177 if (!file_mips_gp32)
252b5132
RH
15178 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
15179 else
15180 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
15181 }
316f5878 15182 else if (mips_abi == N32_ABI)
be00bddd
TS
15183 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
15184
c9914766 15185 /* Nothing to do for N64_ABI. */
252b5132
RH
15186
15187 if (mips_32bitmode)
15188 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
ad3fea08
TS
15189
15190#if 0 /* XXX FIXME */
15191 /* 32 bit code with 64 bit FP registers. */
15192 if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
15193 elf_elfheader (stdoutput)->e_flags |= ???;
15194#endif
252b5132
RH
15195}
15196
15197#endif /* OBJ_ELF || OBJ_MAYBE_ELF */
15198\f
beae10d5 15199typedef struct proc {
9b2f1d35
EC
15200 symbolS *func_sym;
15201 symbolS *func_end_sym;
beae10d5
KH
15202 unsigned long reg_mask;
15203 unsigned long reg_offset;
15204 unsigned long fpreg_mask;
15205 unsigned long fpreg_offset;
15206 unsigned long frame_offset;
15207 unsigned long frame_reg;
15208 unsigned long pc_reg;
15209} procS;
252b5132
RH
15210
15211static procS cur_proc;
15212static procS *cur_proc_ptr;
15213static int numprocs;
15214
742a56fe
RS
15215/* Implement NOP_OPCODE. We encode a MIPS16 nop as "1" and a normal
15216 nop as "0". */
15217
15218char
15219mips_nop_opcode (void)
15220{
15221 return seg_info (now_seg)->tc_segment_info_data.mips16;
15222}
15223
15224/* Fill in an rs_align_code fragment. This only needs to do something
15225 for MIPS16 code, where 0 is not a nop. */
a19d8eb0 15226
0a9ef439 15227void
17a2f251 15228mips_handle_align (fragS *fragp)
a19d8eb0 15229{
742a56fe 15230 char *p;
c67a084a
NC
15231 int bytes, size, excess;
15232 valueT opcode;
742a56fe 15233
0a9ef439
RH
15234 if (fragp->fr_type != rs_align_code)
15235 return;
15236
742a56fe
RS
15237 p = fragp->fr_literal + fragp->fr_fix;
15238 if (*p)
a19d8eb0 15239 {
c67a084a
NC
15240 opcode = mips16_nop_insn.insn_opcode;
15241 size = 2;
15242 }
15243 else
15244 {
15245 opcode = nop_insn.insn_opcode;
15246 size = 4;
15247 }
a19d8eb0 15248
c67a084a
NC
15249 bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
15250 excess = bytes % size;
15251 if (excess != 0)
15252 {
15253 /* If we're not inserting a whole number of instructions,
15254 pad the end of the fixed part of the frag with zeros. */
15255 memset (p, 0, excess);
15256 p += excess;
15257 fragp->fr_fix += excess;
a19d8eb0 15258 }
c67a084a
NC
15259
15260 md_number_to_chars (p, opcode, size);
15261 fragp->fr_var = size;
a19d8eb0
CP
15262}
15263
252b5132 15264static void
17a2f251 15265md_obj_begin (void)
252b5132
RH
15266{
15267}
15268
15269static void
17a2f251 15270md_obj_end (void)
252b5132 15271{
54f4ddb3 15272 /* Check for premature end, nesting errors, etc. */
252b5132 15273 if (cur_proc_ptr)
9a41af64 15274 as_warn (_("missing .end at end of assembly"));
252b5132
RH
15275}
15276
15277static long
17a2f251 15278get_number (void)
252b5132
RH
15279{
15280 int negative = 0;
15281 long val = 0;
15282
15283 if (*input_line_pointer == '-')
15284 {
15285 ++input_line_pointer;
15286 negative = 1;
15287 }
3882b010 15288 if (!ISDIGIT (*input_line_pointer))
956cd1d6 15289 as_bad (_("expected simple number"));
252b5132
RH
15290 if (input_line_pointer[0] == '0')
15291 {
15292 if (input_line_pointer[1] == 'x')
15293 {
15294 input_line_pointer += 2;
3882b010 15295 while (ISXDIGIT (*input_line_pointer))
252b5132
RH
15296 {
15297 val <<= 4;
15298 val |= hex_value (*input_line_pointer++);
15299 }
15300 return negative ? -val : val;
15301 }
15302 else
15303 {
15304 ++input_line_pointer;
3882b010 15305 while (ISDIGIT (*input_line_pointer))
252b5132
RH
15306 {
15307 val <<= 3;
15308 val |= *input_line_pointer++ - '0';
15309 }
15310 return negative ? -val : val;
15311 }
15312 }
3882b010 15313 if (!ISDIGIT (*input_line_pointer))
252b5132
RH
15314 {
15315 printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
15316 *input_line_pointer, *input_line_pointer);
956cd1d6 15317 as_warn (_("invalid number"));
252b5132
RH
15318 return -1;
15319 }
3882b010 15320 while (ISDIGIT (*input_line_pointer))
252b5132
RH
15321 {
15322 val *= 10;
15323 val += *input_line_pointer++ - '0';
15324 }
15325 return negative ? -val : val;
15326}
15327
15328/* The .file directive; just like the usual .file directive, but there
c5dd6aab
DJ
15329 is an initial number which is the ECOFF file index. In the non-ECOFF
15330 case .file implies DWARF-2. */
15331
15332static void
17a2f251 15333s_mips_file (int x ATTRIBUTE_UNUSED)
c5dd6aab 15334{
ecb4347a
DJ
15335 static int first_file_directive = 0;
15336
c5dd6aab
DJ
15337 if (ECOFF_DEBUGGING)
15338 {
15339 get_number ();
15340 s_app_file (0);
15341 }
15342 else
ecb4347a
DJ
15343 {
15344 char *filename;
15345
15346 filename = dwarf2_directive_file (0);
15347
15348 /* Versions of GCC up to 3.1 start files with a ".file"
15349 directive even for stabs output. Make sure that this
15350 ".file" is handled. Note that you need a version of GCC
15351 after 3.1 in order to support DWARF-2 on MIPS. */
15352 if (filename != NULL && ! first_file_directive)
15353 {
15354 (void) new_logical_line (filename, -1);
c04f5787 15355 s_app_file_string (filename, 0);
ecb4347a
DJ
15356 }
15357 first_file_directive = 1;
15358 }
c5dd6aab
DJ
15359}
15360
15361/* The .loc directive, implying DWARF-2. */
252b5132
RH
15362
15363static void
17a2f251 15364s_mips_loc (int x ATTRIBUTE_UNUSED)
252b5132 15365{
c5dd6aab
DJ
15366 if (!ECOFF_DEBUGGING)
15367 dwarf2_directive_loc (0);
252b5132
RH
15368}
15369
252b5132
RH
15370/* The .end directive. */
15371
15372static void
17a2f251 15373s_mips_end (int x ATTRIBUTE_UNUSED)
252b5132
RH
15374{
15375 symbolS *p;
252b5132 15376
7a621144
DJ
15377 /* Following functions need their own .frame and .cprestore directives. */
15378 mips_frame_reg_valid = 0;
15379 mips_cprestore_valid = 0;
15380
252b5132
RH
15381 if (!is_end_of_line[(unsigned char) *input_line_pointer])
15382 {
15383 p = get_symbol ();
15384 demand_empty_rest_of_line ();
15385 }
15386 else
15387 p = NULL;
15388
14949570 15389 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
252b5132
RH
15390 as_warn (_(".end not in text section"));
15391
15392 if (!cur_proc_ptr)
15393 {
15394 as_warn (_(".end directive without a preceding .ent directive."));
15395 demand_empty_rest_of_line ();
15396 return;
15397 }
15398
15399 if (p != NULL)
15400 {
9c2799c2 15401 gas_assert (S_GET_NAME (p));
9b2f1d35 15402 if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
252b5132 15403 as_warn (_(".end symbol does not match .ent symbol."));
ecb4347a
DJ
15404
15405 if (debug_type == DEBUG_STABS)
15406 stabs_generate_asm_endfunc (S_GET_NAME (p),
15407 S_GET_NAME (p));
252b5132
RH
15408 }
15409 else
15410 as_warn (_(".end directive missing or unknown symbol"));
15411
2132e3a3 15412#ifdef OBJ_ELF
9b2f1d35
EC
15413 /* Create an expression to calculate the size of the function. */
15414 if (p && cur_proc_ptr)
15415 {
15416 OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
15417 expressionS *exp = xmalloc (sizeof (expressionS));
15418
15419 obj->size = exp;
15420 exp->X_op = O_subtract;
15421 exp->X_add_symbol = symbol_temp_new_now ();
15422 exp->X_op_symbol = p;
15423 exp->X_add_number = 0;
15424
15425 cur_proc_ptr->func_end_sym = exp->X_add_symbol;
15426 }
15427
ecb4347a 15428 /* Generate a .pdr section. */
f43abd2b 15429 if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
ecb4347a
DJ
15430 {
15431 segT saved_seg = now_seg;
15432 subsegT saved_subseg = now_subseg;
ecb4347a
DJ
15433 expressionS exp;
15434 char *fragp;
252b5132 15435
252b5132 15436#ifdef md_flush_pending_output
ecb4347a 15437 md_flush_pending_output ();
252b5132
RH
15438#endif
15439
9c2799c2 15440 gas_assert (pdr_seg);
ecb4347a 15441 subseg_set (pdr_seg, 0);
252b5132 15442
ecb4347a
DJ
15443 /* Write the symbol. */
15444 exp.X_op = O_symbol;
15445 exp.X_add_symbol = p;
15446 exp.X_add_number = 0;
15447 emit_expr (&exp, 4);
252b5132 15448
ecb4347a 15449 fragp = frag_more (7 * 4);
252b5132 15450
17a2f251
TS
15451 md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
15452 md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
15453 md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
15454 md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
15455 md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
15456 md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
15457 md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
252b5132 15458
ecb4347a
DJ
15459 subseg_set (saved_seg, saved_subseg);
15460 }
15461#endif /* OBJ_ELF */
252b5132
RH
15462
15463 cur_proc_ptr = NULL;
15464}
15465
15466/* The .aent and .ent directives. */
15467
15468static void
17a2f251 15469s_mips_ent (int aent)
252b5132 15470{
252b5132 15471 symbolS *symbolP;
252b5132
RH
15472
15473 symbolP = get_symbol ();
15474 if (*input_line_pointer == ',')
f9419b05 15475 ++input_line_pointer;
252b5132 15476 SKIP_WHITESPACE ();
3882b010 15477 if (ISDIGIT (*input_line_pointer)
d9a62219 15478 || *input_line_pointer == '-')
874e8986 15479 get_number ();
252b5132 15480
14949570 15481 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
252b5132
RH
15482 as_warn (_(".ent or .aent not in text section."));
15483
15484 if (!aent && cur_proc_ptr)
9a41af64 15485 as_warn (_("missing .end"));
252b5132
RH
15486
15487 if (!aent)
15488 {
7a621144
DJ
15489 /* This function needs its own .frame and .cprestore directives. */
15490 mips_frame_reg_valid = 0;
15491 mips_cprestore_valid = 0;
15492
252b5132
RH
15493 cur_proc_ptr = &cur_proc;
15494 memset (cur_proc_ptr, '\0', sizeof (procS));
15495
9b2f1d35 15496 cur_proc_ptr->func_sym = symbolP;
252b5132 15497
f9419b05 15498 ++numprocs;
ecb4347a
DJ
15499
15500 if (debug_type == DEBUG_STABS)
15501 stabs_generate_asm_func (S_GET_NAME (symbolP),
15502 S_GET_NAME (symbolP));
252b5132
RH
15503 }
15504
7c0fc524
MR
15505 symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
15506
252b5132
RH
15507 demand_empty_rest_of_line ();
15508}
15509
15510/* The .frame directive. If the mdebug section is present (IRIX 5 native)
bdaaa2e1 15511 then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
252b5132 15512 s_mips_frame is used so that we can set the PDR information correctly.
bdaaa2e1 15513 We can't use the ecoff routines because they make reference to the ecoff
252b5132
RH
15514 symbol table (in the mdebug section). */
15515
15516static void
17a2f251 15517s_mips_frame (int ignore ATTRIBUTE_UNUSED)
252b5132 15518{
ecb4347a 15519#ifdef OBJ_ELF
f43abd2b 15520 if (IS_ELF && !ECOFF_DEBUGGING)
ecb4347a
DJ
15521 {
15522 long val;
252b5132 15523
ecb4347a
DJ
15524 if (cur_proc_ptr == (procS *) NULL)
15525 {
15526 as_warn (_(".frame outside of .ent"));
15527 demand_empty_rest_of_line ();
15528 return;
15529 }
252b5132 15530
ecb4347a
DJ
15531 cur_proc_ptr->frame_reg = tc_get_register (1);
15532
15533 SKIP_WHITESPACE ();
15534 if (*input_line_pointer++ != ','
15535 || get_absolute_expression_and_terminator (&val) != ',')
15536 {
15537 as_warn (_("Bad .frame directive"));
15538 --input_line_pointer;
15539 demand_empty_rest_of_line ();
15540 return;
15541 }
252b5132 15542
ecb4347a
DJ
15543 cur_proc_ptr->frame_offset = val;
15544 cur_proc_ptr->pc_reg = tc_get_register (0);
252b5132 15545
252b5132 15546 demand_empty_rest_of_line ();
252b5132 15547 }
ecb4347a
DJ
15548 else
15549#endif /* OBJ_ELF */
15550 s_ignore (ignore);
252b5132
RH
15551}
15552
bdaaa2e1
KH
15553/* The .fmask and .mask directives. If the mdebug section is present
15554 (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
252b5132 15555 embedded targets, s_mips_mask is used so that we can set the PDR
bdaaa2e1 15556 information correctly. We can't use the ecoff routines because they
252b5132
RH
15557 make reference to the ecoff symbol table (in the mdebug section). */
15558
15559static void
17a2f251 15560s_mips_mask (int reg_type)
252b5132 15561{
ecb4347a 15562#ifdef OBJ_ELF
f43abd2b 15563 if (IS_ELF && !ECOFF_DEBUGGING)
252b5132 15564 {
ecb4347a 15565 long mask, off;
252b5132 15566
ecb4347a
DJ
15567 if (cur_proc_ptr == (procS *) NULL)
15568 {
15569 as_warn (_(".mask/.fmask outside of .ent"));
15570 demand_empty_rest_of_line ();
15571 return;
15572 }
252b5132 15573
ecb4347a
DJ
15574 if (get_absolute_expression_and_terminator (&mask) != ',')
15575 {
15576 as_warn (_("Bad .mask/.fmask directive"));
15577 --input_line_pointer;
15578 demand_empty_rest_of_line ();
15579 return;
15580 }
252b5132 15581
ecb4347a
DJ
15582 off = get_absolute_expression ();
15583
15584 if (reg_type == 'F')
15585 {
15586 cur_proc_ptr->fpreg_mask = mask;
15587 cur_proc_ptr->fpreg_offset = off;
15588 }
15589 else
15590 {
15591 cur_proc_ptr->reg_mask = mask;
15592 cur_proc_ptr->reg_offset = off;
15593 }
15594
15595 demand_empty_rest_of_line ();
252b5132
RH
15596 }
15597 else
ecb4347a
DJ
15598#endif /* OBJ_ELF */
15599 s_ignore (reg_type);
252b5132
RH
15600}
15601
316f5878
RS
15602/* A table describing all the processors gas knows about. Names are
15603 matched in the order listed.
e7af610e 15604
316f5878
RS
15605 To ease comparison, please keep this table in the same order as
15606 gcc's mips_cpu_info_table[]. */
e972090a
NC
15607static const struct mips_cpu_info mips_cpu_info_table[] =
15608{
316f5878 15609 /* Entries for generic ISAs */
ad3fea08
TS
15610 { "mips1", MIPS_CPU_IS_ISA, ISA_MIPS1, CPU_R3000 },
15611 { "mips2", MIPS_CPU_IS_ISA, ISA_MIPS2, CPU_R6000 },
15612 { "mips3", MIPS_CPU_IS_ISA, ISA_MIPS3, CPU_R4000 },
15613 { "mips4", MIPS_CPU_IS_ISA, ISA_MIPS4, CPU_R8000 },
15614 { "mips5", MIPS_CPU_IS_ISA, ISA_MIPS5, CPU_MIPS5 },
15615 { "mips32", MIPS_CPU_IS_ISA, ISA_MIPS32, CPU_MIPS32 },
15616 { "mips32r2", MIPS_CPU_IS_ISA, ISA_MIPS32R2, CPU_MIPS32R2 },
15617 { "mips64", MIPS_CPU_IS_ISA, ISA_MIPS64, CPU_MIPS64 },
15618 { "mips64r2", MIPS_CPU_IS_ISA, ISA_MIPS64R2, CPU_MIPS64R2 },
316f5878
RS
15619
15620 /* MIPS I */
ad3fea08
TS
15621 { "r3000", 0, ISA_MIPS1, CPU_R3000 },
15622 { "r2000", 0, ISA_MIPS1, CPU_R3000 },
15623 { "r3900", 0, ISA_MIPS1, CPU_R3900 },
316f5878
RS
15624
15625 /* MIPS II */
ad3fea08 15626 { "r6000", 0, ISA_MIPS2, CPU_R6000 },
316f5878
RS
15627
15628 /* MIPS III */
ad3fea08
TS
15629 { "r4000", 0, ISA_MIPS3, CPU_R4000 },
15630 { "r4010", 0, ISA_MIPS2, CPU_R4010 },
15631 { "vr4100", 0, ISA_MIPS3, CPU_VR4100 },
15632 { "vr4111", 0, ISA_MIPS3, CPU_R4111 },
15633 { "vr4120", 0, ISA_MIPS3, CPU_VR4120 },
15634 { "vr4130", 0, ISA_MIPS3, CPU_VR4120 },
15635 { "vr4181", 0, ISA_MIPS3, CPU_R4111 },
15636 { "vr4300", 0, ISA_MIPS3, CPU_R4300 },
15637 { "r4400", 0, ISA_MIPS3, CPU_R4400 },
15638 { "r4600", 0, ISA_MIPS3, CPU_R4600 },
15639 { "orion", 0, ISA_MIPS3, CPU_R4600 },
15640 { "r4650", 0, ISA_MIPS3, CPU_R4650 },
b15591bb
AN
15641 /* ST Microelectronics Loongson 2E and 2F cores */
15642 { "loongson2e", 0, ISA_MIPS3, CPU_LOONGSON_2E },
15643 { "loongson2f", 0, ISA_MIPS3, CPU_LOONGSON_2F },
316f5878
RS
15644
15645 /* MIPS IV */
ad3fea08
TS
15646 { "r8000", 0, ISA_MIPS4, CPU_R8000 },
15647 { "r10000", 0, ISA_MIPS4, CPU_R10000 },
15648 { "r12000", 0, ISA_MIPS4, CPU_R12000 },
3aa3176b
TS
15649 { "r14000", 0, ISA_MIPS4, CPU_R14000 },
15650 { "r16000", 0, ISA_MIPS4, CPU_R16000 },
ad3fea08
TS
15651 { "vr5000", 0, ISA_MIPS4, CPU_R5000 },
15652 { "vr5400", 0, ISA_MIPS4, CPU_VR5400 },
15653 { "vr5500", 0, ISA_MIPS4, CPU_VR5500 },
15654 { "rm5200", 0, ISA_MIPS4, CPU_R5000 },
15655 { "rm5230", 0, ISA_MIPS4, CPU_R5000 },
15656 { "rm5231", 0, ISA_MIPS4, CPU_R5000 },
15657 { "rm5261", 0, ISA_MIPS4, CPU_R5000 },
15658 { "rm5721", 0, ISA_MIPS4, CPU_R5000 },
15659 { "rm7000", 0, ISA_MIPS4, CPU_RM7000 },
15660 { "rm9000", 0, ISA_MIPS4, CPU_RM9000 },
316f5878
RS
15661
15662 /* MIPS 32 */
ad3fea08
TS
15663 { "4kc", 0, ISA_MIPS32, CPU_MIPS32 },
15664 { "4km", 0, ISA_MIPS32, CPU_MIPS32 },
15665 { "4kp", 0, ISA_MIPS32, CPU_MIPS32 },
15666 { "4ksc", MIPS_CPU_ASE_SMARTMIPS, ISA_MIPS32, CPU_MIPS32 },
15667
15668 /* MIPS 32 Release 2 */
15669 { "4kec", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15670 { "4kem", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15671 { "4kep", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15672 { "4ksd", MIPS_CPU_ASE_SMARTMIPS, ISA_MIPS32R2, CPU_MIPS32R2 },
15673 { "m4k", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15674 { "m4kp", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
ad3fea08 15675 { "24kc", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
0fdf1951 15676 { "24kf2_1", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
ad3fea08 15677 { "24kf", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
0fdf1951
RS
15678 { "24kf1_1", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15679 /* Deprecated forms of the above. */
15680 { "24kfx", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
ad3fea08 15681 { "24kx", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
01fd108f 15682 /* 24KE is a 24K with DSP ASE, other ASEs are optional. */
ad3fea08 15683 { "24kec", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
0fdf1951 15684 { "24kef2_1", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
ad3fea08 15685 { "24kef", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
0fdf1951
RS
15686 { "24kef1_1", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
15687 /* Deprecated forms of the above. */
15688 { "24kefx", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
65263ce3 15689 { "24kex", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
01fd108f 15690 /* 34K is a 24K with DSP and MT ASE, other ASEs are optional. */
a360e743
TS
15691 { "34kc", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15692 ISA_MIPS32R2, CPU_MIPS32R2 },
0fdf1951
RS
15693 { "34kf2_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15694 ISA_MIPS32R2, CPU_MIPS32R2 },
a360e743
TS
15695 { "34kf", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15696 ISA_MIPS32R2, CPU_MIPS32R2 },
0fdf1951
RS
15697 { "34kf1_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15698 ISA_MIPS32R2, CPU_MIPS32R2 },
15699 /* Deprecated forms of the above. */
15700 { "34kfx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15701 ISA_MIPS32R2, CPU_MIPS32R2 },
a360e743
TS
15702 { "34kx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15703 ISA_MIPS32R2, CPU_MIPS32R2 },
01fd108f
TS
15704 /* 74K with DSP and DSPR2 ASE, other ASEs are optional. */
15705 { "74kc", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15706 ISA_MIPS32R2, CPU_MIPS32R2 },
0fdf1951
RS
15707 { "74kf2_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15708 ISA_MIPS32R2, CPU_MIPS32R2 },
01fd108f
TS
15709 { "74kf", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15710 ISA_MIPS32R2, CPU_MIPS32R2 },
0fdf1951
RS
15711 { "74kf1_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15712 ISA_MIPS32R2, CPU_MIPS32R2 },
15713 { "74kf3_2", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15714 ISA_MIPS32R2, CPU_MIPS32R2 },
15715 /* Deprecated forms of the above. */
15716 { "74kfx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15717 ISA_MIPS32R2, CPU_MIPS32R2 },
01fd108f
TS
15718 { "74kx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15719 ISA_MIPS32R2, CPU_MIPS32R2 },
30f8113a
SL
15720 /* 1004K cores are multiprocessor versions of the 34K. */
15721 { "1004kc", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15722 ISA_MIPS32R2, CPU_MIPS32R2 },
15723 { "1004kf2_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15724 ISA_MIPS32R2, CPU_MIPS32R2 },
15725 { "1004kf", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15726 ISA_MIPS32R2, CPU_MIPS32R2 },
15727 { "1004kf1_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15728 ISA_MIPS32R2, CPU_MIPS32R2 },
32b26a03 15729
316f5878 15730 /* MIPS 64 */
ad3fea08
TS
15731 { "5kc", 0, ISA_MIPS64, CPU_MIPS64 },
15732 { "5kf", 0, ISA_MIPS64, CPU_MIPS64 },
15733 { "20kc", MIPS_CPU_ASE_MIPS3D, ISA_MIPS64, CPU_MIPS64 },
7764b395 15734 { "25kf", MIPS_CPU_ASE_MIPS3D, ISA_MIPS64, CPU_MIPS64 },
ad3fea08 15735
c7a23324 15736 /* Broadcom SB-1 CPU core */
65263ce3
TS
15737 { "sb1", MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15738 ISA_MIPS64, CPU_SB1 },
1e85aad8
JW
15739 /* Broadcom SB-1A CPU core */
15740 { "sb1a", MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15741 ISA_MIPS64, CPU_SB1 },
d051516a
NC
15742
15743 { "loongson3a", 0, ISA_MIPS64, CPU_LOONGSON_3A },
e7af610e 15744
ed163775
MR
15745 /* MIPS 64 Release 2 */
15746
967344c6
AN
15747 /* Cavium Networks Octeon CPU core */
15748 { "octeon", 0, ISA_MIPS64R2, CPU_OCTEON },
15749
52b6b6b9
JM
15750 /* RMI Xlr */
15751 { "xlr", 0, ISA_MIPS64, CPU_XLR },
15752
316f5878
RS
15753 /* End marker */
15754 { NULL, 0, 0, 0 }
15755};
e7af610e 15756
84ea6cf2 15757
316f5878
RS
15758/* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
15759 with a final "000" replaced by "k". Ignore case.
e7af610e 15760
316f5878 15761 Note: this function is shared between GCC and GAS. */
c6c98b38 15762
b34976b6 15763static bfd_boolean
17a2f251 15764mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
316f5878
RS
15765{
15766 while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
15767 given++, canonical++;
15768
15769 return ((*given == 0 && *canonical == 0)
15770 || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
15771}
15772
15773
15774/* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
15775 CPU name. We've traditionally allowed a lot of variation here.
15776
15777 Note: this function is shared between GCC and GAS. */
15778
b34976b6 15779static bfd_boolean
17a2f251 15780mips_matching_cpu_name_p (const char *canonical, const char *given)
316f5878
RS
15781{
15782 /* First see if the name matches exactly, or with a final "000"
15783 turned into "k". */
15784 if (mips_strict_matching_cpu_name_p (canonical, given))
b34976b6 15785 return TRUE;
316f5878
RS
15786
15787 /* If not, try comparing based on numerical designation alone.
15788 See if GIVEN is an unadorned number, or 'r' followed by a number. */
15789 if (TOLOWER (*given) == 'r')
15790 given++;
15791 if (!ISDIGIT (*given))
b34976b6 15792 return FALSE;
316f5878
RS
15793
15794 /* Skip over some well-known prefixes in the canonical name,
15795 hoping to find a number there too. */
15796 if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
15797 canonical += 2;
15798 else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
15799 canonical += 2;
15800 else if (TOLOWER (canonical[0]) == 'r')
15801 canonical += 1;
15802
15803 return mips_strict_matching_cpu_name_p (canonical, given);
15804}
15805
15806
15807/* Parse an option that takes the name of a processor as its argument.
15808 OPTION is the name of the option and CPU_STRING is the argument.
15809 Return the corresponding processor enumeration if the CPU_STRING is
15810 recognized, otherwise report an error and return null.
15811
15812 A similar function exists in GCC. */
e7af610e
NC
15813
15814static const struct mips_cpu_info *
17a2f251 15815mips_parse_cpu (const char *option, const char *cpu_string)
e7af610e 15816{
316f5878 15817 const struct mips_cpu_info *p;
e7af610e 15818
316f5878
RS
15819 /* 'from-abi' selects the most compatible architecture for the given
15820 ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs. For the
15821 EABIs, we have to decide whether we're using the 32-bit or 64-bit
15822 version. Look first at the -mgp options, if given, otherwise base
15823 the choice on MIPS_DEFAULT_64BIT.
e7af610e 15824
316f5878
RS
15825 Treat NO_ABI like the EABIs. One reason to do this is that the
15826 plain 'mips' and 'mips64' configs have 'from-abi' as their default
15827 architecture. This code picks MIPS I for 'mips' and MIPS III for
15828 'mips64', just as we did in the days before 'from-abi'. */
15829 if (strcasecmp (cpu_string, "from-abi") == 0)
15830 {
15831 if (ABI_NEEDS_32BIT_REGS (mips_abi))
15832 return mips_cpu_info_from_isa (ISA_MIPS1);
15833
15834 if (ABI_NEEDS_64BIT_REGS (mips_abi))
15835 return mips_cpu_info_from_isa (ISA_MIPS3);
15836
15837 if (file_mips_gp32 >= 0)
15838 return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
15839
15840 return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
15841 ? ISA_MIPS3
15842 : ISA_MIPS1);
15843 }
15844
15845 /* 'default' has traditionally been a no-op. Probably not very useful. */
15846 if (strcasecmp (cpu_string, "default") == 0)
15847 return 0;
15848
15849 for (p = mips_cpu_info_table; p->name != 0; p++)
15850 if (mips_matching_cpu_name_p (p->name, cpu_string))
15851 return p;
15852
20203fb9 15853 as_bad (_("Bad value (%s) for %s"), cpu_string, option);
316f5878 15854 return 0;
e7af610e
NC
15855}
15856
316f5878
RS
15857/* Return the canonical processor information for ISA (a member of the
15858 ISA_MIPS* enumeration). */
15859
e7af610e 15860static const struct mips_cpu_info *
17a2f251 15861mips_cpu_info_from_isa (int isa)
e7af610e
NC
15862{
15863 int i;
15864
15865 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
ad3fea08 15866 if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
316f5878 15867 && isa == mips_cpu_info_table[i].isa)
e7af610e
NC
15868 return (&mips_cpu_info_table[i]);
15869
e972090a 15870 return NULL;
e7af610e 15871}
fef14a42
TS
15872
15873static const struct mips_cpu_info *
17a2f251 15874mips_cpu_info_from_arch (int arch)
fef14a42
TS
15875{
15876 int i;
15877
15878 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15879 if (arch == mips_cpu_info_table[i].cpu)
15880 return (&mips_cpu_info_table[i]);
15881
15882 return NULL;
15883}
316f5878
RS
15884\f
15885static void
17a2f251 15886show (FILE *stream, const char *string, int *col_p, int *first_p)
316f5878
RS
15887{
15888 if (*first_p)
15889 {
15890 fprintf (stream, "%24s", "");
15891 *col_p = 24;
15892 }
15893 else
15894 {
15895 fprintf (stream, ", ");
15896 *col_p += 2;
15897 }
e7af610e 15898
316f5878
RS
15899 if (*col_p + strlen (string) > 72)
15900 {
15901 fprintf (stream, "\n%24s", "");
15902 *col_p = 24;
15903 }
15904
15905 fprintf (stream, "%s", string);
15906 *col_p += strlen (string);
15907
15908 *first_p = 0;
15909}
15910
15911void
17a2f251 15912md_show_usage (FILE *stream)
e7af610e 15913{
316f5878
RS
15914 int column, first;
15915 size_t i;
15916
15917 fprintf (stream, _("\
15918MIPS options:\n\
316f5878
RS
15919-EB generate big endian output\n\
15920-EL generate little endian output\n\
15921-g, -g2 do not remove unneeded NOPs or swap branches\n\
15922-G NUM allow referencing objects up to NUM bytes\n\
15923 implicitly with the gp register [default 8]\n"));
15924 fprintf (stream, _("\
15925-mips1 generate MIPS ISA I instructions\n\
15926-mips2 generate MIPS ISA II instructions\n\
15927-mips3 generate MIPS ISA III instructions\n\
15928-mips4 generate MIPS ISA IV instructions\n\
15929-mips5 generate MIPS ISA V instructions\n\
15930-mips32 generate MIPS32 ISA instructions\n\
af7ee8bf 15931-mips32r2 generate MIPS32 release 2 ISA instructions\n\
316f5878 15932-mips64 generate MIPS64 ISA instructions\n\
5f74bc13 15933-mips64r2 generate MIPS64 release 2 ISA instructions\n\
316f5878
RS
15934-march=CPU/-mtune=CPU generate code/schedule for CPU, where CPU is one of:\n"));
15935
15936 first = 1;
e7af610e
NC
15937
15938 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
316f5878
RS
15939 show (stream, mips_cpu_info_table[i].name, &column, &first);
15940 show (stream, "from-abi", &column, &first);
15941 fputc ('\n', stream);
e7af610e 15942
316f5878
RS
15943 fprintf (stream, _("\
15944-mCPU equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
15945-no-mCPU don't generate code specific to CPU.\n\
15946 For -mCPU and -no-mCPU, CPU must be one of:\n"));
15947
15948 first = 1;
15949
15950 show (stream, "3900", &column, &first);
15951 show (stream, "4010", &column, &first);
15952 show (stream, "4100", &column, &first);
15953 show (stream, "4650", &column, &first);
15954 fputc ('\n', stream);
15955
15956 fprintf (stream, _("\
15957-mips16 generate mips16 instructions\n\
15958-no-mips16 do not generate mips16 instructions\n"));
15959 fprintf (stream, _("\
e16bfa71
TS
15960-msmartmips generate smartmips instructions\n\
15961-mno-smartmips do not generate smartmips instructions\n"));
15962 fprintf (stream, _("\
74cd071d
CF
15963-mdsp generate DSP instructions\n\
15964-mno-dsp do not generate DSP instructions\n"));
15965 fprintf (stream, _("\
8b082fb1
TS
15966-mdspr2 generate DSP R2 instructions\n\
15967-mno-dspr2 do not generate DSP R2 instructions\n"));
15968 fprintf (stream, _("\
ef2e4d86
CF
15969-mmt generate MT instructions\n\
15970-mno-mt do not generate MT instructions\n"));
15971 fprintf (stream, _("\
c67a084a
NC
15972-mfix-loongson2f-jump work around Loongson2F JUMP instructions\n\
15973-mfix-loongson2f-nop work around Loongson2F NOP errata\n\
d766e8ec 15974-mfix-vr4120 work around certain VR4120 errata\n\
7d8e00cf 15975-mfix-vr4130 work around VR4130 mflo/mfhi errata\n\
6a32d874 15976-mfix-24k insert a nop after ERET and DERET instructions\n\
d954098f 15977-mfix-cn63xxp1 work around CN63XXP1 PREF errata\n\
316f5878
RS
15978-mgp32 use 32-bit GPRs, regardless of the chosen ISA\n\
15979-mfp32 use 32-bit FPRs, regardless of the chosen ISA\n\
aed1a261 15980-msym32 assume all symbols have 32-bit values\n\
316f5878
RS
15981-O0 remove unneeded NOPs, do not swap branches\n\
15982-O remove unneeded NOPs and swap branches\n\
316f5878
RS
15983--trap, --no-break trap exception on div by 0 and mult overflow\n\
15984--break, --no-trap break exception on div by 0 and mult overflow\n"));
037b32b9
AN
15985 fprintf (stream, _("\
15986-mhard-float allow floating-point instructions\n\
15987-msoft-float do not allow floating-point instructions\n\
15988-msingle-float only allow 32-bit floating-point operations\n\
15989-mdouble-float allow 32-bit and 64-bit floating-point operations\n\
15990--[no-]construct-floats [dis]allow floating point values to be constructed\n"
15991 ));
316f5878
RS
15992#ifdef OBJ_ELF
15993 fprintf (stream, _("\
15994-KPIC, -call_shared generate SVR4 position independent code\n\
861fb55a 15995-call_nonpic generate non-PIC code that can operate with DSOs\n\
0c000745 15996-mvxworks-pic generate VxWorks position independent code\n\
861fb55a 15997-non_shared do not generate code that can operate with DSOs\n\
316f5878 15998-xgot assume a 32 bit GOT\n\
dcd410fe 15999-mpdr, -mno-pdr enable/disable creation of .pdr sections\n\
bbe506e8 16000-mshared, -mno-shared disable/enable .cpload optimization for\n\
d821e36b 16001 position dependent (non shared) code\n\
316f5878
RS
16002-mabi=ABI create ABI conformant object file for:\n"));
16003
16004 first = 1;
16005
16006 show (stream, "32", &column, &first);
16007 show (stream, "o64", &column, &first);
16008 show (stream, "n32", &column, &first);
16009 show (stream, "64", &column, &first);
16010 show (stream, "eabi", &column, &first);
16011
16012 fputc ('\n', stream);
16013
16014 fprintf (stream, _("\
16015-32 create o32 ABI object file (default)\n\
16016-n32 create n32 ABI object file\n\
16017-64 create 64 ABI object file\n"));
16018#endif
e7af610e 16019}
14e777e0 16020
1575952e 16021#ifdef TE_IRIX
14e777e0 16022enum dwarf2_format
413a266c 16023mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
14e777e0 16024{
369943fe 16025 if (HAVE_64BIT_SYMBOLS)
1575952e 16026 return dwarf2_format_64bit_irix;
14e777e0
KB
16027 else
16028 return dwarf2_format_32bit;
16029}
1575952e 16030#endif
73369e65
EC
16031
16032int
16033mips_dwarf2_addr_size (void)
16034{
6b6b3450 16035 if (HAVE_64BIT_OBJECTS)
73369e65 16036 return 8;
73369e65
EC
16037 else
16038 return 4;
16039}
5862107c
EC
16040
16041/* Standard calling conventions leave the CFA at SP on entry. */
16042void
16043mips_cfi_frame_initial_instructions (void)
16044{
16045 cfi_add_CFA_def_cfa_register (SP);
16046}
16047
707bfff6
TS
16048int
16049tc_mips_regname_to_dw2regnum (char *regname)
16050{
16051 unsigned int regnum = -1;
16052 unsigned int reg;
16053
16054 if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
16055 regnum = reg;
16056
16057 return regnum;
16058}
This page took 4.617601 seconds and 4 git commands to generate.