*** empty log message ***
[deliverable/binutils-gdb.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,
e7c604dd 3 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
252b5132
RH
4 Contributed by the OSF and Ralph Campbell.
5 Written by Keith Knowles and Ralph Campbell, working independently.
6 Modified for ECOFF and R4000 support by Ian Lance Taylor of Cygnus
7 Support.
8
9 This file is part of GAS.
10
11 GAS is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
ec2655a6 13 the Free Software Foundation; either version 3, or (at your option)
252b5132
RH
14 any later version.
15
16 GAS is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with GAS; see the file COPYING. If not, write to the Free
4b4da160
NC
23 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
24 02110-1301, USA. */
252b5132
RH
25
26#include "as.h"
27#include "config.h"
28#include "subsegs.h"
3882b010 29#include "safe-ctype.h"
252b5132 30
252b5132
RH
31#include "opcode/mips.h"
32#include "itbl-ops.h"
c5dd6aab 33#include "dwarf2dbg.h"
5862107c 34#include "dw2gencfi.h"
252b5132
RH
35
36#ifdef DEBUG
37#define DBG(x) printf x
38#else
39#define DBG(x)
40#endif
41
42#ifdef OBJ_MAYBE_ELF
43/* Clean up namespace so we can include obj-elf.h too. */
17a2f251
TS
44static int mips_output_flavor (void);
45static int mips_output_flavor (void) { return OUTPUT_FLAVOR; }
252b5132
RH
46#undef OBJ_PROCESS_STAB
47#undef OUTPUT_FLAVOR
48#undef S_GET_ALIGN
49#undef S_GET_SIZE
50#undef S_SET_ALIGN
51#undef S_SET_SIZE
252b5132
RH
52#undef obj_frob_file
53#undef obj_frob_file_after_relocs
54#undef obj_frob_symbol
55#undef obj_pop_insert
56#undef obj_sec_sym_ok_for_reloc
57#undef OBJ_COPY_SYMBOL_ATTRIBUTES
58
59#include "obj-elf.h"
60/* Fix any of them that we actually care about. */
61#undef OUTPUT_FLAVOR
62#define OUTPUT_FLAVOR mips_output_flavor()
63#endif
64
65#if defined (OBJ_ELF)
66#include "elf/mips.h"
67#endif
68
69#ifndef ECOFF_DEBUGGING
70#define NO_ECOFF_DEBUGGING
71#define ECOFF_DEBUGGING 0
72#endif
73
ecb4347a
DJ
74int mips_flag_mdebug = -1;
75
dcd410fe
RO
76/* Control generation of .pdr sections. Off by default on IRIX: the native
77 linker doesn't know about and discards them, but relocations against them
78 remain, leading to rld crashes. */
79#ifdef TE_IRIX
80int mips_flag_pdr = FALSE;
81#else
82int mips_flag_pdr = TRUE;
83#endif
84
252b5132
RH
85#include "ecoff.h"
86
87#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
88static char *mips_regmask_frag;
89#endif
90
85b51719 91#define ZERO 0
741fe287 92#define ATREG 1
252b5132
RH
93#define TREG 24
94#define PIC_CALL_REG 25
95#define KT0 26
96#define KT1 27
97#define GP 28
98#define SP 29
99#define FP 30
100#define RA 31
101
102#define ILLEGAL_REG (32)
103
741fe287
MR
104#define AT mips_opts.at
105
252b5132
RH
106/* Allow override of standard little-endian ECOFF format. */
107
108#ifndef ECOFF_LITTLE_FORMAT
109#define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
110#endif
111
112extern int target_big_endian;
113
252b5132 114/* The name of the readonly data section. */
4d0d148d 115#define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
252b5132 116 ? ".rdata" \
056350c6
NC
117 : OUTPUT_FLAVOR == bfd_target_coff_flavour \
118 ? ".rdata" \
252b5132
RH
119 : OUTPUT_FLAVOR == bfd_target_elf_flavour \
120 ? ".rodata" \
121 : (abort (), ""))
122
47e39b9d
RS
123/* Information about an instruction, including its format, operands
124 and fixups. */
125struct mips_cl_insn
126{
127 /* The opcode's entry in mips_opcodes or mips16_opcodes. */
128 const struct mips_opcode *insn_mo;
129
130 /* True if this is a mips16 instruction and if we want the extended
131 form of INSN_MO. */
132 bfd_boolean use_extend;
133
134 /* The 16-bit extension instruction to use when USE_EXTEND is true. */
135 unsigned short extend;
136
137 /* The 16-bit or 32-bit bitstring of the instruction itself. This is
138 a copy of INSN_MO->match with the operands filled in. */
139 unsigned long insn_opcode;
140
141 /* The frag that contains the instruction. */
142 struct frag *frag;
143
144 /* The offset into FRAG of the first instruction byte. */
145 long where;
146
147 /* The relocs associated with the instruction, if any. */
148 fixS *fixp[3];
149
a38419a5
RS
150 /* True if this entry cannot be moved from its current position. */
151 unsigned int fixed_p : 1;
47e39b9d 152
708587a4 153 /* True if this instruction occurred in a .set noreorder block. */
47e39b9d
RS
154 unsigned int noreorder_p : 1;
155
2fa15973
RS
156 /* True for mips16 instructions that jump to an absolute address. */
157 unsigned int mips16_absolute_jump_p : 1;
47e39b9d
RS
158};
159
a325df1d
TS
160/* The ABI to use. */
161enum mips_abi_level
162{
163 NO_ABI = 0,
164 O32_ABI,
165 O64_ABI,
166 N32_ABI,
167 N64_ABI,
168 EABI_ABI
169};
170
171/* MIPS ABI we are using for this output file. */
316f5878 172static enum mips_abi_level mips_abi = NO_ABI;
a325df1d 173
143d77c5
EC
174/* Whether or not we have code that can call pic code. */
175int mips_abicalls = FALSE;
176
aa6975fb
ILT
177/* Whether or not we have code which can be put into a shared
178 library. */
179static bfd_boolean mips_in_shared = TRUE;
180
252b5132
RH
181/* This is the set of options which may be modified by the .set
182 pseudo-op. We use a struct so that .set push and .set pop are more
183 reliable. */
184
e972090a
NC
185struct mips_set_options
186{
252b5132
RH
187 /* MIPS ISA (Instruction Set Architecture) level. This is set to -1
188 if it has not been initialized. Changed by `.set mipsN', and the
189 -mipsN command line option, and the default CPU. */
190 int isa;
1f25f5d3
CD
191 /* Enabled Application Specific Extensions (ASEs). These are set to -1
192 if they have not been initialized. Changed by `.set <asename>', by
193 command line options, and based on the default architecture. */
194 int ase_mips3d;
deec1734 195 int ase_mdmx;
e16bfa71 196 int ase_smartmips;
74cd071d 197 int ase_dsp;
8b082fb1 198 int ase_dspr2;
ef2e4d86 199 int ase_mt;
252b5132
RH
200 /* Whether we are assembling for the mips16 processor. 0 if we are
201 not, 1 if we are, and -1 if the value has not been initialized.
202 Changed by `.set mips16' and `.set nomips16', and the -mips16 and
203 -nomips16 command line options, and the default CPU. */
204 int mips16;
205 /* Non-zero if we should not reorder instructions. Changed by `.set
206 reorder' and `.set noreorder'. */
207 int noreorder;
741fe287
MR
208 /* Non-zero if we should not permit the register designated "assembler
209 temporary" to be used in instructions. The value is the register
210 number, normally $at ($1). Changed by `.set at=REG', `.set noat'
211 (same as `.set at=$0') and `.set at' (same as `.set at=$1'). */
212 unsigned int at;
252b5132
RH
213 /* Non-zero if we should warn when a macro instruction expands into
214 more than one machine instruction. Changed by `.set nomacro' and
215 `.set macro'. */
216 int warn_about_macros;
217 /* Non-zero if we should not move instructions. Changed by `.set
218 move', `.set volatile', `.set nomove', and `.set novolatile'. */
219 int nomove;
220 /* Non-zero if we should not optimize branches by moving the target
221 of the branch into the delay slot. Actually, we don't perform
222 this optimization anyhow. Changed by `.set bopt' and `.set
223 nobopt'. */
224 int nobopt;
225 /* Non-zero if we should not autoextend mips16 instructions.
226 Changed by `.set autoextend' and `.set noautoextend'. */
227 int noautoextend;
a325df1d
TS
228 /* Restrict general purpose registers and floating point registers
229 to 32 bit. This is initially determined when -mgp32 or -mfp32
230 is passed but can changed if the assembler code uses .set mipsN. */
231 int gp32;
232 int fp32;
fef14a42
TS
233 /* MIPS architecture (CPU) type. Changed by .set arch=FOO, the -march
234 command line option, and the default CPU. */
235 int arch;
aed1a261
RS
236 /* True if ".set sym32" is in effect. */
237 bfd_boolean sym32;
037b32b9
AN
238 /* True if floating-point operations are not allowed. Changed by .set
239 softfloat or .set hardfloat, by command line options -msoft-float or
240 -mhard-float. The default is false. */
241 bfd_boolean soft_float;
242
243 /* True if only single-precision floating-point operations are allowed.
244 Changed by .set singlefloat or .set doublefloat, command-line options
245 -msingle-float or -mdouble-float. The default is false. */
246 bfd_boolean single_float;
252b5132
RH
247};
248
037b32b9
AN
249/* This is the struct we use to hold the current set of options. Note
250 that we must set the isa field to ISA_UNKNOWN and the ASE fields to
251 -1 to indicate that they have not been initialized. */
252
a325df1d 253/* True if -mgp32 was passed. */
a8e8e863 254static int file_mips_gp32 = -1;
a325df1d
TS
255
256/* True if -mfp32 was passed. */
a8e8e863 257static int file_mips_fp32 = -1;
a325df1d 258
037b32b9
AN
259/* 1 if -msoft-float, 0 if -mhard-float. The default is 0. */
260static int file_mips_soft_float = 0;
261
262/* 1 if -msingle-float, 0 if -mdouble-float. The default is 0. */
263static int file_mips_single_float = 0;
252b5132 264
e972090a
NC
265static struct mips_set_options mips_opts =
266{
037b32b9
AN
267 /* isa */ ISA_UNKNOWN, /* ase_mips3d */ -1, /* ase_mdmx */ -1,
268 /* ase_smartmips */ 0, /* ase_dsp */ -1, /* ase_dspr2 */ -1, /* ase_mt */ -1,
269 /* mips16 */ -1, /* noreorder */ 0, /* at */ ATREG,
270 /* warn_about_macros */ 0, /* nomove */ 0, /* nobopt */ 0,
271 /* noautoextend */ 0, /* gp32 */ 0, /* fp32 */ 0, /* arch */ CPU_UNKNOWN,
272 /* sym32 */ FALSE, /* soft_float */ FALSE, /* single_float */ FALSE
e7af610e 273};
252b5132
RH
274
275/* These variables are filled in with the masks of registers used.
276 The object format code reads them and puts them in the appropriate
277 place. */
278unsigned long mips_gprmask;
279unsigned long mips_cprmask[4];
280
281/* MIPS ISA we are using for this output file. */
e7af610e 282static int file_mips_isa = ISA_UNKNOWN;
252b5132 283
a4672219
TS
284/* True if -mips16 was passed or implied by arguments passed on the
285 command line (e.g., by -march). */
286static int file_ase_mips16;
287
3994f87e
TS
288#define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32 \
289 || mips_opts.isa == ISA_MIPS32R2 \
290 || mips_opts.isa == ISA_MIPS64 \
291 || mips_opts.isa == ISA_MIPS64R2)
292
1f25f5d3
CD
293/* True if -mips3d was passed or implied by arguments passed on the
294 command line (e.g., by -march). */
295static int file_ase_mips3d;
296
deec1734
CD
297/* True if -mdmx was passed or implied by arguments passed on the
298 command line (e.g., by -march). */
299static int file_ase_mdmx;
300
e16bfa71
TS
301/* True if -msmartmips was passed or implied by arguments passed on the
302 command line (e.g., by -march). */
303static int file_ase_smartmips;
304
ad3fea08
TS
305#define ISA_SUPPORTS_SMARTMIPS (mips_opts.isa == ISA_MIPS32 \
306 || mips_opts.isa == ISA_MIPS32R2)
e16bfa71 307
74cd071d
CF
308/* True if -mdsp was passed or implied by arguments passed on the
309 command line (e.g., by -march). */
310static int file_ase_dsp;
311
ad3fea08
TS
312#define ISA_SUPPORTS_DSP_ASE (mips_opts.isa == ISA_MIPS32R2 \
313 || mips_opts.isa == ISA_MIPS64R2)
314
65263ce3
TS
315#define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
316
8b082fb1
TS
317/* True if -mdspr2 was passed or implied by arguments passed on the
318 command line (e.g., by -march). */
319static int file_ase_dspr2;
320
321#define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2 \
322 || mips_opts.isa == ISA_MIPS64R2)
323
ef2e4d86
CF
324/* True if -mmt was passed or implied by arguments passed on the
325 command line (e.g., by -march). */
326static int file_ase_mt;
327
ad3fea08
TS
328#define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2 \
329 || mips_opts.isa == ISA_MIPS64R2)
330
ec68c924 331/* The argument of the -march= flag. The architecture we are assembling. */
fef14a42 332static int file_mips_arch = CPU_UNKNOWN;
316f5878 333static const char *mips_arch_string;
ec68c924
EC
334
335/* The argument of the -mtune= flag. The architecture for which we
336 are optimizing. */
337static int mips_tune = CPU_UNKNOWN;
316f5878 338static const char *mips_tune_string;
ec68c924 339
316f5878 340/* True when generating 32-bit code for a 64-bit processor. */
252b5132
RH
341static int mips_32bitmode = 0;
342
316f5878
RS
343/* True if the given ABI requires 32-bit registers. */
344#define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
345
346/* Likewise 64-bit registers. */
707bfff6
TS
347#define ABI_NEEDS_64BIT_REGS(ABI) \
348 ((ABI) == N32_ABI \
349 || (ABI) == N64_ABI \
316f5878
RS
350 || (ABI) == O64_ABI)
351
ad3fea08 352/* Return true if ISA supports 64 bit wide gp registers. */
707bfff6
TS
353#define ISA_HAS_64BIT_REGS(ISA) \
354 ((ISA) == ISA_MIPS3 \
355 || (ISA) == ISA_MIPS4 \
356 || (ISA) == ISA_MIPS5 \
357 || (ISA) == ISA_MIPS64 \
358 || (ISA) == ISA_MIPS64R2)
9ce8a5dd 359
ad3fea08
TS
360/* Return true if ISA supports 64 bit wide float registers. */
361#define ISA_HAS_64BIT_FPRS(ISA) \
362 ((ISA) == ISA_MIPS3 \
363 || (ISA) == ISA_MIPS4 \
364 || (ISA) == ISA_MIPS5 \
365 || (ISA) == ISA_MIPS32R2 \
366 || (ISA) == ISA_MIPS64 \
367 || (ISA) == ISA_MIPS64R2)
368
af7ee8bf
CD
369/* Return true if ISA supports 64-bit right rotate (dror et al.)
370 instructions. */
707bfff6
TS
371#define ISA_HAS_DROR(ISA) \
372 ((ISA) == ISA_MIPS64R2)
af7ee8bf
CD
373
374/* Return true if ISA supports 32-bit right rotate (ror et al.)
375 instructions. */
707bfff6
TS
376#define ISA_HAS_ROR(ISA) \
377 ((ISA) == ISA_MIPS32R2 \
378 || (ISA) == ISA_MIPS64R2 \
379 || mips_opts.ase_smartmips)
380
7455baf8
TS
381/* Return true if ISA supports single-precision floats in odd registers. */
382#define ISA_HAS_ODD_SINGLE_FPR(ISA) \
383 ((ISA) == ISA_MIPS32 \
384 || (ISA) == ISA_MIPS32R2 \
385 || (ISA) == ISA_MIPS64 \
386 || (ISA) == ISA_MIPS64R2)
af7ee8bf 387
ad3fea08
TS
388/* Return true if ISA supports move to/from high part of a 64-bit
389 floating-point register. */
390#define ISA_HAS_MXHC1(ISA) \
391 ((ISA) == ISA_MIPS32R2 \
392 || (ISA) == ISA_MIPS64R2)
393
e013f690 394#define HAVE_32BIT_GPRS \
ad3fea08 395 (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
ca4e0257 396
e013f690 397#define HAVE_32BIT_FPRS \
ad3fea08 398 (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
ca4e0257 399
ad3fea08
TS
400#define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
401#define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
ca4e0257 402
316f5878 403#define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
e013f690 404
316f5878 405#define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
e013f690 406
3b91255e
RS
407/* True if relocations are stored in-place. */
408#define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
409
aed1a261
RS
410/* The ABI-derived address size. */
411#define HAVE_64BIT_ADDRESSES \
412 (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
413#define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
e013f690 414
aed1a261
RS
415/* The size of symbolic constants (i.e., expressions of the form
416 "SYMBOL" or "SYMBOL + OFFSET"). */
417#define HAVE_32BIT_SYMBOLS \
418 (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
419#define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
ca4e0257 420
b7c7d6c1
TS
421/* Addresses are loaded in different ways, depending on the address size
422 in use. The n32 ABI Documentation also mandates the use of additions
423 with overflow checking, but existing implementations don't follow it. */
f899b4b8 424#define ADDRESS_ADD_INSN \
b7c7d6c1 425 (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
f899b4b8
TS
426
427#define ADDRESS_ADDI_INSN \
b7c7d6c1 428 (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
f899b4b8
TS
429
430#define ADDRESS_LOAD_INSN \
431 (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
432
433#define ADDRESS_STORE_INSN \
434 (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
435
a4672219 436/* Return true if the given CPU supports the MIPS16 ASE. */
3396de36
TS
437#define CPU_HAS_MIPS16(cpu) \
438 (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0 \
439 || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
a4672219 440
60b63b72
RS
441/* True if CPU has a dror instruction. */
442#define CPU_HAS_DROR(CPU) ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
443
444/* True if CPU has a ror instruction. */
445#define CPU_HAS_ROR(CPU) CPU_HAS_DROR (CPU)
446
dd3cbb7e
NC
447/* True if CPU has seq/sne and seqi/snei instructions. */
448#define CPU_HAS_SEQ(CPU) ((CPU) == CPU_OCTEON)
449
b19e8a9b
AN
450/* True if CPU does not implement the all the coprocessor insns. For these
451 CPUs only those COP insns are accepted that are explicitly marked to be
452 available on the CPU. ISA membership for COP insns is ignored. */
453#define NO_ISA_COP(CPU) ((CPU) == CPU_OCTEON)
454
c8978940
CD
455/* True if mflo and mfhi can be immediately followed by instructions
456 which write to the HI and LO registers.
457
458 According to MIPS specifications, MIPS ISAs I, II, and III need
459 (at least) two instructions between the reads of HI/LO and
460 instructions which write them, and later ISAs do not. Contradicting
461 the MIPS specifications, some MIPS IV processor user manuals (e.g.
462 the UM for the NEC Vr5000) document needing the instructions between
463 HI/LO reads and writes, as well. Therefore, we declare only MIPS32,
464 MIPS64 and later ISAs to have the interlocks, plus any specific
465 earlier-ISA CPUs for which CPU documentation declares that the
466 instructions are really interlocked. */
467#define hilo_interlocks \
468 (mips_opts.isa == ISA_MIPS32 \
469 || mips_opts.isa == ISA_MIPS32R2 \
470 || mips_opts.isa == ISA_MIPS64 \
471 || mips_opts.isa == ISA_MIPS64R2 \
472 || mips_opts.arch == CPU_R4010 \
473 || mips_opts.arch == CPU_R10000 \
474 || mips_opts.arch == CPU_R12000 \
475 || mips_opts.arch == CPU_RM7000 \
c8978940
CD
476 || mips_opts.arch == CPU_VR5500 \
477 )
252b5132
RH
478
479/* Whether the processor uses hardware interlocks to protect reads
81912461
ILT
480 from the GPRs after they are loaded from memory, and thus does not
481 require nops to be inserted. This applies to instructions marked
482 INSN_LOAD_MEMORY_DELAY. These nops are only required at MIPS ISA
483 level I. */
252b5132 484#define gpr_interlocks \
e7af610e 485 (mips_opts.isa != ISA_MIPS1 \
fef14a42 486 || mips_opts.arch == CPU_R3900)
252b5132 487
81912461
ILT
488/* Whether the processor uses hardware interlocks to avoid delays
489 required by coprocessor instructions, and thus does not require
490 nops to be inserted. This applies to instructions marked
491 INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
492 between instructions marked INSN_WRITE_COND_CODE and ones marked
493 INSN_READ_COND_CODE. These nops are only required at MIPS ISA
494 levels I, II, and III. */
bdaaa2e1 495/* Itbl support may require additional care here. */
81912461
ILT
496#define cop_interlocks \
497 ((mips_opts.isa != ISA_MIPS1 \
498 && mips_opts.isa != ISA_MIPS2 \
499 && mips_opts.isa != ISA_MIPS3) \
500 || mips_opts.arch == CPU_R4300 \
81912461
ILT
501 )
502
503/* Whether the processor uses hardware interlocks to protect reads
504 from coprocessor registers after they are loaded from memory, and
505 thus does not require nops to be inserted. This applies to
506 instructions marked INSN_COPROC_MEMORY_DELAY. These nops are only
507 requires at MIPS ISA level I. */
508#define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
252b5132 509
6b76fefe
CM
510/* Is this a mfhi or mflo instruction? */
511#define MF_HILO_INSN(PINFO) \
b19e8a9b
AN
512 ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
513
514/* Returns true for a (non floating-point) coprocessor instruction. Reading
515 or writing the condition code is only possible on the coprocessors and
516 these insns are not marked with INSN_COP. Thus for these insns use the
a242dc0d 517 condition-code flags. */
b19e8a9b
AN
518#define COP_INSN(PINFO) \
519 (PINFO != INSN_MACRO \
a242dc0d
AN
520 && ((PINFO) & (FP_S | FP_D)) == 0 \
521 && ((PINFO) & (INSN_COP | INSN_READ_COND_CODE | INSN_WRITE_COND_CODE)))
6b76fefe 522
252b5132
RH
523/* MIPS PIC level. */
524
a161fe53 525enum mips_pic_level mips_pic;
252b5132 526
c9914766 527/* 1 if we should generate 32 bit offsets from the $gp register in
252b5132 528 SVR4_PIC mode. Currently has no meaning in other modes. */
c9914766 529static int mips_big_got = 0;
252b5132
RH
530
531/* 1 if trap instructions should used for overflow rather than break
532 instructions. */
c9914766 533static int mips_trap = 0;
252b5132 534
119d663a 535/* 1 if double width floating point constants should not be constructed
b6ff326e 536 by assembling two single width halves into two single width floating
119d663a
NC
537 point registers which just happen to alias the double width destination
538 register. On some architectures this aliasing can be disabled by a bit
d547a75e 539 in the status register, and the setting of this bit cannot be determined
119d663a
NC
540 automatically at assemble time. */
541static int mips_disable_float_construction;
542
252b5132
RH
543/* Non-zero if any .set noreorder directives were used. */
544
545static int mips_any_noreorder;
546
6b76fefe
CM
547/* Non-zero if nops should be inserted when the register referenced in
548 an mfhi/mflo instruction is read in the next two instructions. */
549static int mips_7000_hilo_fix;
550
02ffd3e4 551/* The size of objects in the small data section. */
156c2f8b 552static unsigned int g_switch_value = 8;
252b5132
RH
553/* Whether the -G option was used. */
554static int g_switch_seen = 0;
555
556#define N_RMASK 0xc4
557#define N_VFP 0xd4
558
559/* If we can determine in advance that GP optimization won't be
560 possible, we can skip the relaxation stuff that tries to produce
561 GP-relative references. This makes delay slot optimization work
562 better.
563
564 This function can only provide a guess, but it seems to work for
fba2b7f9
GK
565 gcc output. It needs to guess right for gcc, otherwise gcc
566 will put what it thinks is a GP-relative instruction in a branch
567 delay slot.
252b5132
RH
568
569 I don't know if a fix is needed for the SVR4_PIC mode. I've only
570 fixed it for the non-PIC mode. KR 95/04/07 */
17a2f251 571static int nopic_need_relax (symbolS *, int);
252b5132
RH
572
573/* handle of the OPCODE hash table */
574static struct hash_control *op_hash = NULL;
575
576/* The opcode hash table we use for the mips16. */
577static struct hash_control *mips16_op_hash = NULL;
578
579/* This array holds the chars that always start a comment. If the
580 pre-processor is disabled, these aren't very useful */
581const char comment_chars[] = "#";
582
583/* This array holds the chars that only start a comment at the beginning of
584 a line. If the line seems to have the form '# 123 filename'
585 .line and .file directives will appear in the pre-processed output */
586/* Note that input_file.c hand checks for '#' at the beginning of the
587 first line of the input file. This is because the compiler outputs
bdaaa2e1 588 #NO_APP at the beginning of its output. */
252b5132
RH
589/* Also note that C style comments are always supported. */
590const char line_comment_chars[] = "#";
591
bdaaa2e1 592/* This array holds machine specific line separator characters. */
63a0b638 593const char line_separator_chars[] = ";";
252b5132
RH
594
595/* Chars that can be used to separate mant from exp in floating point nums */
596const char EXP_CHARS[] = "eE";
597
598/* Chars that mean this number is a floating point constant */
599/* As in 0f12.456 */
600/* or 0d1.2345e12 */
601const char FLT_CHARS[] = "rRsSfFdDxXpP";
602
603/* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
604 changed in read.c . Ideally it shouldn't have to know about it at all,
605 but nothing is ideal around here.
606 */
607
608static char *insn_error;
609
610static int auto_align = 1;
611
612/* When outputting SVR4 PIC code, the assembler needs to know the
613 offset in the stack frame from which to restore the $gp register.
614 This is set by the .cprestore pseudo-op, and saved in this
615 variable. */
616static offsetT mips_cprestore_offset = -1;
617
67c1ffbe 618/* Similar for NewABI PIC code, where $gp is callee-saved. NewABI has some
6478892d 619 more optimizations, it can use a register value instead of a memory-saved
956cd1d6 620 offset and even an other register than $gp as global pointer. */
6478892d
TS
621static offsetT mips_cpreturn_offset = -1;
622static int mips_cpreturn_register = -1;
623static int mips_gp_register = GP;
def2e0dd 624static int mips_gprel_offset = 0;
6478892d 625
7a621144
DJ
626/* Whether mips_cprestore_offset has been set in the current function
627 (or whether it has already been warned about, if not). */
628static int mips_cprestore_valid = 0;
629
252b5132
RH
630/* This is the register which holds the stack frame, as set by the
631 .frame pseudo-op. This is needed to implement .cprestore. */
632static int mips_frame_reg = SP;
633
7a621144
DJ
634/* Whether mips_frame_reg has been set in the current function
635 (or whether it has already been warned about, if not). */
636static int mips_frame_reg_valid = 0;
637
252b5132
RH
638/* To output NOP instructions correctly, we need to keep information
639 about the previous two instructions. */
640
641/* Whether we are optimizing. The default value of 2 means to remove
642 unneeded NOPs and swap branch instructions when possible. A value
643 of 1 means to not swap branches. A value of 0 means to always
644 insert NOPs. */
645static int mips_optimize = 2;
646
647/* Debugging level. -g sets this to 2. -gN sets this to N. -g0 is
648 equivalent to seeing no -g option at all. */
649static int mips_debug = 0;
650
7d8e00cf
RS
651/* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata. */
652#define MAX_VR4130_NOPS 4
653
654/* The maximum number of NOPs needed to fill delay slots. */
655#define MAX_DELAY_NOPS 2
656
657/* The maximum number of NOPs needed for any purpose. */
658#define MAX_NOPS 4
71400594
RS
659
660/* A list of previous instructions, with index 0 being the most recent.
661 We need to look back MAX_NOPS instructions when filling delay slots
662 or working around processor errata. We need to look back one
663 instruction further if we're thinking about using history[0] to
664 fill a branch delay slot. */
665static struct mips_cl_insn history[1 + MAX_NOPS];
252b5132 666
1e915849
RS
667/* Nop instructions used by emit_nop. */
668static struct mips_cl_insn nop_insn, mips16_nop_insn;
669
670/* The appropriate nop for the current mode. */
671#define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn : &nop_insn)
252b5132 672
252b5132
RH
673/* If this is set, it points to a frag holding nop instructions which
674 were inserted before the start of a noreorder section. If those
675 nops turn out to be unnecessary, the size of the frag can be
676 decreased. */
677static fragS *prev_nop_frag;
678
679/* The number of nop instructions we created in prev_nop_frag. */
680static int prev_nop_frag_holds;
681
682/* The number of nop instructions that we know we need in
bdaaa2e1 683 prev_nop_frag. */
252b5132
RH
684static int prev_nop_frag_required;
685
686/* The number of instructions we've seen since prev_nop_frag. */
687static int prev_nop_frag_since;
688
689/* For ECOFF and ELF, relocations against symbols are done in two
690 parts, with a HI relocation and a LO relocation. Each relocation
691 has only 16 bits of space to store an addend. This means that in
692 order for the linker to handle carries correctly, it must be able
693 to locate both the HI and the LO relocation. This means that the
694 relocations must appear in order in the relocation table.
695
696 In order to implement this, we keep track of each unmatched HI
697 relocation. We then sort them so that they immediately precede the
bdaaa2e1 698 corresponding LO relocation. */
252b5132 699
e972090a
NC
700struct mips_hi_fixup
701{
252b5132
RH
702 /* Next HI fixup. */
703 struct mips_hi_fixup *next;
704 /* This fixup. */
705 fixS *fixp;
706 /* The section this fixup is in. */
707 segT seg;
708};
709
710/* The list of unmatched HI relocs. */
711
712static struct mips_hi_fixup *mips_hi_fixup_list;
713
64bdfcaf
RS
714/* The frag containing the last explicit relocation operator.
715 Null if explicit relocations have not been used. */
716
717static fragS *prev_reloc_op_frag;
718
252b5132
RH
719/* Map normal MIPS register numbers to mips16 register numbers. */
720
721#define X ILLEGAL_REG
e972090a
NC
722static const int mips32_to_16_reg_map[] =
723{
252b5132
RH
724 X, X, 2, 3, 4, 5, 6, 7,
725 X, X, X, X, X, X, X, X,
726 0, 1, X, X, X, X, X, X,
727 X, X, X, X, X, X, X, X
728};
729#undef X
730
731/* Map mips16 register numbers to normal MIPS register numbers. */
732
e972090a
NC
733static const unsigned int mips16_to_32_reg_map[] =
734{
252b5132
RH
735 16, 17, 2, 3, 4, 5, 6, 7
736};
60b63b72 737
71400594
RS
738/* Classifies the kind of instructions we're interested in when
739 implementing -mfix-vr4120. */
740enum fix_vr4120_class {
741 FIX_VR4120_MACC,
742 FIX_VR4120_DMACC,
743 FIX_VR4120_MULT,
744 FIX_VR4120_DMULT,
745 FIX_VR4120_DIV,
746 FIX_VR4120_MTHILO,
747 NUM_FIX_VR4120_CLASSES
748};
749
750/* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
751 there must be at least one other instruction between an instruction
752 of type X and an instruction of type Y. */
753static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
754
755/* True if -mfix-vr4120 is in force. */
d766e8ec 756static int mips_fix_vr4120;
4a6a3df4 757
7d8e00cf
RS
758/* ...likewise -mfix-vr4130. */
759static int mips_fix_vr4130;
760
4a6a3df4
AO
761/* We don't relax branches by default, since this causes us to expand
762 `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
763 fail to compute the offset before expanding the macro to the most
764 efficient expansion. */
765
766static int mips_relax_branch;
252b5132 767\f
4d7206a2
RS
768/* The expansion of many macros depends on the type of symbol that
769 they refer to. For example, when generating position-dependent code,
770 a macro that refers to a symbol may have two different expansions,
771 one which uses GP-relative addresses and one which uses absolute
772 addresses. When generating SVR4-style PIC, a macro may have
773 different expansions for local and global symbols.
774
775 We handle these situations by generating both sequences and putting
776 them in variant frags. In position-dependent code, the first sequence
777 will be the GP-relative one and the second sequence will be the
778 absolute one. In SVR4 PIC, the first sequence will be for global
779 symbols and the second will be for local symbols.
780
584892a6
RS
781 The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
782 SECOND are the lengths of the two sequences in bytes. These fields
783 can be extracted using RELAX_FIRST() and RELAX_SECOND(). In addition,
784 the subtype has the following flags:
4d7206a2 785
584892a6
RS
786 RELAX_USE_SECOND
787 Set if it has been decided that we should use the second
788 sequence instead of the first.
789
790 RELAX_SECOND_LONGER
791 Set in the first variant frag if the macro's second implementation
792 is longer than its first. This refers to the macro as a whole,
793 not an individual relaxation.
794
795 RELAX_NOMACRO
796 Set in the first variant frag if the macro appeared in a .set nomacro
797 block and if one alternative requires a warning but the other does not.
798
799 RELAX_DELAY_SLOT
800 Like RELAX_NOMACRO, but indicates that the macro appears in a branch
801 delay slot.
4d7206a2
RS
802
803 The frag's "opcode" points to the first fixup for relaxable code.
804
805 Relaxable macros are generated using a sequence such as:
806
807 relax_start (SYMBOL);
808 ... generate first expansion ...
809 relax_switch ();
810 ... generate second expansion ...
811 relax_end ();
812
813 The code and fixups for the unwanted alternative are discarded
814 by md_convert_frag. */
584892a6 815#define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
4d7206a2 816
584892a6
RS
817#define RELAX_FIRST(X) (((X) >> 8) & 0xff)
818#define RELAX_SECOND(X) ((X) & 0xff)
819#define RELAX_USE_SECOND 0x10000
820#define RELAX_SECOND_LONGER 0x20000
821#define RELAX_NOMACRO 0x40000
822#define RELAX_DELAY_SLOT 0x80000
252b5132 823
4a6a3df4
AO
824/* Branch without likely bit. If label is out of range, we turn:
825
826 beq reg1, reg2, label
827 delay slot
828
829 into
830
831 bne reg1, reg2, 0f
832 nop
833 j label
834 0: delay slot
835
836 with the following opcode replacements:
837
838 beq <-> bne
839 blez <-> bgtz
840 bltz <-> bgez
841 bc1f <-> bc1t
842
843 bltzal <-> bgezal (with jal label instead of j label)
844
845 Even though keeping the delay slot instruction in the delay slot of
846 the branch would be more efficient, it would be very tricky to do
847 correctly, because we'd have to introduce a variable frag *after*
848 the delay slot instruction, and expand that instead. Let's do it
849 the easy way for now, even if the branch-not-taken case now costs
850 one additional instruction. Out-of-range branches are not supposed
851 to be common, anyway.
852
853 Branch likely. If label is out of range, we turn:
854
855 beql reg1, reg2, label
856 delay slot (annulled if branch not taken)
857
858 into
859
860 beql reg1, reg2, 1f
861 nop
862 beql $0, $0, 2f
863 nop
864 1: j[al] label
865 delay slot (executed only if branch taken)
866 2:
867
868 It would be possible to generate a shorter sequence by losing the
869 likely bit, generating something like:
b34976b6 870
4a6a3df4
AO
871 bne reg1, reg2, 0f
872 nop
873 j[al] label
874 delay slot (executed only if branch taken)
875 0:
876
877 beql -> bne
878 bnel -> beq
879 blezl -> bgtz
880 bgtzl -> blez
881 bltzl -> bgez
882 bgezl -> bltz
883 bc1fl -> bc1t
884 bc1tl -> bc1f
885
886 bltzall -> bgezal (with jal label instead of j label)
887 bgezall -> bltzal (ditto)
888
889
890 but it's not clear that it would actually improve performance. */
af6ae2ad 891#define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
4a6a3df4
AO
892 ((relax_substateT) \
893 (0xc0000000 \
894 | ((toofar) ? 1 : 0) \
895 | ((link) ? 2 : 0) \
896 | ((likely) ? 4 : 0) \
af6ae2ad 897 | ((uncond) ? 8 : 0)))
4a6a3df4 898#define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
4a6a3df4
AO
899#define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
900#define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
901#define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
ae6063d4 902#define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
4a6a3df4 903
252b5132
RH
904/* For mips16 code, we use an entirely different form of relaxation.
905 mips16 supports two versions of most instructions which take
906 immediate values: a small one which takes some small value, and a
907 larger one which takes a 16 bit value. Since branches also follow
908 this pattern, relaxing these values is required.
909
910 We can assemble both mips16 and normal MIPS code in a single
911 object. Therefore, we need to support this type of relaxation at
912 the same time that we support the relaxation described above. We
913 use the high bit of the subtype field to distinguish these cases.
914
915 The information we store for this type of relaxation is the
916 argument code found in the opcode file for this relocation, whether
917 the user explicitly requested a small or extended form, and whether
918 the relocation is in a jump or jal delay slot. That tells us the
919 size of the value, and how it should be stored. We also store
920 whether the fragment is considered to be extended or not. We also
921 store whether this is known to be a branch to a different section,
922 whether we have tried to relax this frag yet, and whether we have
923 ever extended a PC relative fragment because of a shift count. */
924#define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
925 (0x80000000 \
926 | ((type) & 0xff) \
927 | ((small) ? 0x100 : 0) \
928 | ((ext) ? 0x200 : 0) \
929 | ((dslot) ? 0x400 : 0) \
930 | ((jal_dslot) ? 0x800 : 0))
4a6a3df4 931#define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
252b5132
RH
932#define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
933#define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
934#define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
935#define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
936#define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
937#define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
938#define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
939#define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
940#define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
941#define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
942#define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
885add95
CD
943
944/* Is the given value a sign-extended 32-bit value? */
945#define IS_SEXT_32BIT_NUM(x) \
946 (((x) &~ (offsetT) 0x7fffffff) == 0 \
947 || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
948
949/* Is the given value a sign-extended 16-bit value? */
950#define IS_SEXT_16BIT_NUM(x) \
951 (((x) &~ (offsetT) 0x7fff) == 0 \
952 || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
953
2051e8c4
MR
954/* Is the given value a zero-extended 32-bit value? Or a negated one? */
955#define IS_ZEXT_32BIT_NUM(x) \
956 (((x) &~ (offsetT) 0xffffffff) == 0 \
957 || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
958
bf12938e
RS
959/* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
960 VALUE << SHIFT. VALUE is evaluated exactly once. */
961#define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
962 (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
963 | (((VALUE) & (MASK)) << (SHIFT)))
964
965/* Extract bits MASK << SHIFT from STRUCT and shift them right
966 SHIFT places. */
967#define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
968 (((STRUCT) >> (SHIFT)) & (MASK))
969
970/* Change INSN's opcode so that the operand given by FIELD has value VALUE.
971 INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
972
973 include/opcode/mips.h specifies operand fields using the macros
974 OP_MASK_<FIELD> and OP_SH_<FIELD>. The MIPS16 equivalents start
975 with "MIPS16OP" instead of "OP". */
976#define INSERT_OPERAND(FIELD, INSN, VALUE) \
977 INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
978#define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
979 INSERT_BITS ((INSN).insn_opcode, VALUE, \
980 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
981
982/* Extract the operand given by FIELD from mips_cl_insn INSN. */
983#define EXTRACT_OPERAND(FIELD, INSN) \
984 EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD)
985#define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
986 EXTRACT_BITS ((INSN).insn_opcode, \
987 MIPS16OP_MASK_##FIELD, \
988 MIPS16OP_SH_##FIELD)
4d7206a2
RS
989\f
990/* Global variables used when generating relaxable macros. See the
991 comment above RELAX_ENCODE for more details about how relaxation
992 is used. */
993static struct {
994 /* 0 if we're not emitting a relaxable macro.
995 1 if we're emitting the first of the two relaxation alternatives.
996 2 if we're emitting the second alternative. */
997 int sequence;
998
999 /* The first relaxable fixup in the current frag. (In other words,
1000 the first fixup that refers to relaxable code.) */
1001 fixS *first_fixup;
1002
1003 /* sizes[0] says how many bytes of the first alternative are stored in
1004 the current frag. Likewise sizes[1] for the second alternative. */
1005 unsigned int sizes[2];
1006
1007 /* The symbol on which the choice of sequence depends. */
1008 symbolS *symbol;
1009} mips_relax;
252b5132 1010\f
584892a6
RS
1011/* Global variables used to decide whether a macro needs a warning. */
1012static struct {
1013 /* True if the macro is in a branch delay slot. */
1014 bfd_boolean delay_slot_p;
1015
1016 /* For relaxable macros, sizes[0] is the length of the first alternative
1017 in bytes and sizes[1] is the length of the second alternative.
1018 For non-relaxable macros, both elements give the length of the
1019 macro in bytes. */
1020 unsigned int sizes[2];
1021
1022 /* The first variant frag for this macro. */
1023 fragS *first_frag;
1024} mips_macro_warning;
1025\f
252b5132
RH
1026/* Prototypes for static functions. */
1027
17a2f251 1028#define internalError() \
252b5132 1029 as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
252b5132
RH
1030
1031enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
1032
b34976b6 1033static void append_insn
4d7206a2 1034 (struct mips_cl_insn *ip, expressionS *p, bfd_reloc_code_real_type *r);
7d10b47d 1035static void mips_no_prev_insn (void);
b34976b6 1036static void mips16_macro_build
67c0d1eb
RS
1037 (expressionS *, const char *, const char *, va_list);
1038static void load_register (int, expressionS *, int);
584892a6
RS
1039static void macro_start (void);
1040static void macro_end (void);
17a2f251
TS
1041static void macro (struct mips_cl_insn * ip);
1042static void mips16_macro (struct mips_cl_insn * ip);
252b5132 1043#ifdef LOSING_COMPILER
17a2f251 1044static void macro2 (struct mips_cl_insn * ip);
252b5132 1045#endif
17a2f251
TS
1046static void mips_ip (char *str, struct mips_cl_insn * ip);
1047static void mips16_ip (char *str, struct mips_cl_insn * ip);
b34976b6 1048static void mips16_immed
17a2f251
TS
1049 (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
1050 unsigned long *, bfd_boolean *, unsigned short *);
5e0116d5 1051static size_t my_getSmallExpression
17a2f251
TS
1052 (expressionS *, bfd_reloc_code_real_type *, char *);
1053static void my_getExpression (expressionS *, char *);
1054static void s_align (int);
1055static void s_change_sec (int);
1056static void s_change_section (int);
1057static void s_cons (int);
1058static void s_float_cons (int);
1059static void s_mips_globl (int);
1060static void s_option (int);
1061static void s_mipsset (int);
1062static void s_abicalls (int);
1063static void s_cpload (int);
1064static void s_cpsetup (int);
1065static void s_cplocal (int);
1066static void s_cprestore (int);
1067static void s_cpreturn (int);
741d6ea8
JM
1068static void s_dtprelword (int);
1069static void s_dtpreldword (int);
17a2f251
TS
1070static void s_gpvalue (int);
1071static void s_gpword (int);
1072static void s_gpdword (int);
1073static void s_cpadd (int);
1074static void s_insn (int);
1075static void md_obj_begin (void);
1076static void md_obj_end (void);
1077static void s_mips_ent (int);
1078static void s_mips_end (int);
1079static void s_mips_frame (int);
1080static void s_mips_mask (int reg_type);
1081static void s_mips_stab (int);
1082static void s_mips_weakext (int);
1083static void s_mips_file (int);
1084static void s_mips_loc (int);
1085static bfd_boolean pic_need_relax (symbolS *, asection *);
4a6a3df4 1086static int relaxed_branch_length (fragS *, asection *, int);
17a2f251 1087static int validate_mips_insn (const struct mips_opcode *);
e7af610e
NC
1088
1089/* Table and functions used to map between CPU/ISA names, and
1090 ISA levels, and CPU numbers. */
1091
e972090a
NC
1092struct mips_cpu_info
1093{
e7af610e 1094 const char *name; /* CPU or ISA name. */
ad3fea08 1095 int flags; /* ASEs available, or ISA flag. */
e7af610e
NC
1096 int isa; /* ISA level. */
1097 int cpu; /* CPU number (default CPU if ISA). */
1098};
1099
ad3fea08
TS
1100#define MIPS_CPU_IS_ISA 0x0001 /* Is this an ISA? (If 0, a CPU.) */
1101#define MIPS_CPU_ASE_SMARTMIPS 0x0002 /* CPU implements SmartMIPS ASE */
1102#define MIPS_CPU_ASE_DSP 0x0004 /* CPU implements DSP ASE */
1103#define MIPS_CPU_ASE_MT 0x0008 /* CPU implements MT ASE */
1104#define MIPS_CPU_ASE_MIPS3D 0x0010 /* CPU implements MIPS-3D ASE */
1105#define MIPS_CPU_ASE_MDMX 0x0020 /* CPU implements MDMX ASE */
8b082fb1 1106#define MIPS_CPU_ASE_DSPR2 0x0040 /* CPU implements DSP R2 ASE */
ad3fea08 1107
17a2f251
TS
1108static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1109static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1110static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
252b5132
RH
1111\f
1112/* Pseudo-op table.
1113
1114 The following pseudo-ops from the Kane and Heinrich MIPS book
1115 should be defined here, but are currently unsupported: .alias,
1116 .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1117
1118 The following pseudo-ops from the Kane and Heinrich MIPS book are
1119 specific to the type of debugging information being generated, and
1120 should be defined by the object format: .aent, .begin, .bend,
1121 .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1122 .vreg.
1123
1124 The following pseudo-ops from the Kane and Heinrich MIPS book are
1125 not MIPS CPU specific, but are also not specific to the object file
1126 format. This file is probably the best place to define them, but
d84bcf09 1127 they are not currently supported: .asm0, .endr, .lab, .struct. */
252b5132 1128
e972090a
NC
1129static const pseudo_typeS mips_pseudo_table[] =
1130{
beae10d5 1131 /* MIPS specific pseudo-ops. */
252b5132
RH
1132 {"option", s_option, 0},
1133 {"set", s_mipsset, 0},
1134 {"rdata", s_change_sec, 'r'},
1135 {"sdata", s_change_sec, 's'},
1136 {"livereg", s_ignore, 0},
1137 {"abicalls", s_abicalls, 0},
1138 {"cpload", s_cpload, 0},
6478892d
TS
1139 {"cpsetup", s_cpsetup, 0},
1140 {"cplocal", s_cplocal, 0},
252b5132 1141 {"cprestore", s_cprestore, 0},
6478892d 1142 {"cpreturn", s_cpreturn, 0},
741d6ea8
JM
1143 {"dtprelword", s_dtprelword, 0},
1144 {"dtpreldword", s_dtpreldword, 0},
6478892d 1145 {"gpvalue", s_gpvalue, 0},
252b5132 1146 {"gpword", s_gpword, 0},
10181a0d 1147 {"gpdword", s_gpdword, 0},
252b5132
RH
1148 {"cpadd", s_cpadd, 0},
1149 {"insn", s_insn, 0},
1150
beae10d5 1151 /* Relatively generic pseudo-ops that happen to be used on MIPS
252b5132 1152 chips. */
38a57ae7 1153 {"asciiz", stringer, 8 + 1},
252b5132
RH
1154 {"bss", s_change_sec, 'b'},
1155 {"err", s_err, 0},
1156 {"half", s_cons, 1},
1157 {"dword", s_cons, 3},
1158 {"weakext", s_mips_weakext, 0},
7c752c2a
TS
1159 {"origin", s_org, 0},
1160 {"repeat", s_rept, 0},
252b5132 1161
beae10d5 1162 /* These pseudo-ops are defined in read.c, but must be overridden
252b5132
RH
1163 here for one reason or another. */
1164 {"align", s_align, 0},
1165 {"byte", s_cons, 0},
1166 {"data", s_change_sec, 'd'},
1167 {"double", s_float_cons, 'd'},
1168 {"float", s_float_cons, 'f'},
1169 {"globl", s_mips_globl, 0},
1170 {"global", s_mips_globl, 0},
1171 {"hword", s_cons, 1},
1172 {"int", s_cons, 2},
1173 {"long", s_cons, 2},
1174 {"octa", s_cons, 4},
1175 {"quad", s_cons, 3},
cca86cc8 1176 {"section", s_change_section, 0},
252b5132
RH
1177 {"short", s_cons, 1},
1178 {"single", s_float_cons, 'f'},
1179 {"stabn", s_mips_stab, 'n'},
1180 {"text", s_change_sec, 't'},
1181 {"word", s_cons, 2},
add56521 1182
add56521 1183 { "extern", ecoff_directive_extern, 0},
add56521 1184
43841e91 1185 { NULL, NULL, 0 },
252b5132
RH
1186};
1187
e972090a
NC
1188static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1189{
beae10d5
KH
1190 /* These pseudo-ops should be defined by the object file format.
1191 However, a.out doesn't support them, so we have versions here. */
252b5132
RH
1192 {"aent", s_mips_ent, 1},
1193 {"bgnb", s_ignore, 0},
1194 {"end", s_mips_end, 0},
1195 {"endb", s_ignore, 0},
1196 {"ent", s_mips_ent, 0},
c5dd6aab 1197 {"file", s_mips_file, 0},
252b5132
RH
1198 {"fmask", s_mips_mask, 'F'},
1199 {"frame", s_mips_frame, 0},
c5dd6aab 1200 {"loc", s_mips_loc, 0},
252b5132
RH
1201 {"mask", s_mips_mask, 'R'},
1202 {"verstamp", s_ignore, 0},
43841e91 1203 { NULL, NULL, 0 },
252b5132
RH
1204};
1205
17a2f251 1206extern void pop_insert (const pseudo_typeS *);
252b5132
RH
1207
1208void
17a2f251 1209mips_pop_insert (void)
252b5132
RH
1210{
1211 pop_insert (mips_pseudo_table);
1212 if (! ECOFF_DEBUGGING)
1213 pop_insert (mips_nonecoff_pseudo_table);
1214}
1215\f
1216/* Symbols labelling the current insn. */
1217
e972090a
NC
1218struct insn_label_list
1219{
252b5132
RH
1220 struct insn_label_list *next;
1221 symbolS *label;
1222};
1223
252b5132 1224static struct insn_label_list *free_insn_labels;
742a56fe 1225#define label_list tc_segment_info_data.labels
252b5132 1226
17a2f251 1227static void mips_clear_insn_labels (void);
252b5132
RH
1228
1229static inline void
17a2f251 1230mips_clear_insn_labels (void)
252b5132
RH
1231{
1232 register struct insn_label_list **pl;
a8dbcb85 1233 segment_info_type *si;
252b5132 1234
a8dbcb85
TS
1235 if (now_seg)
1236 {
1237 for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1238 ;
1239
1240 si = seg_info (now_seg);
1241 *pl = si->label_list;
1242 si->label_list = NULL;
1243 }
252b5132 1244}
a8dbcb85 1245
252b5132
RH
1246\f
1247static char *expr_end;
1248
1249/* Expressions which appear in instructions. These are set by
1250 mips_ip. */
1251
1252static expressionS imm_expr;
5f74bc13 1253static expressionS imm2_expr;
252b5132
RH
1254static expressionS offset_expr;
1255
1256/* Relocs associated with imm_expr and offset_expr. */
1257
f6688943
TS
1258static bfd_reloc_code_real_type imm_reloc[3]
1259 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1260static bfd_reloc_code_real_type offset_reloc[3]
1261 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
252b5132 1262
252b5132
RH
1263/* These are set by mips16_ip if an explicit extension is used. */
1264
b34976b6 1265static bfd_boolean mips16_small, mips16_ext;
252b5132 1266
7ed4a06a 1267#ifdef OBJ_ELF
ecb4347a
DJ
1268/* The pdr segment for per procedure frame/regmask info. Not used for
1269 ECOFF debugging. */
252b5132
RH
1270
1271static segT pdr_seg;
7ed4a06a 1272#endif
252b5132 1273
e013f690
TS
1274/* The default target format to use. */
1275
1276const char *
17a2f251 1277mips_target_format (void)
e013f690
TS
1278{
1279 switch (OUTPUT_FLAVOR)
1280 {
e013f690
TS
1281 case bfd_target_ecoff_flavour:
1282 return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1283 case bfd_target_coff_flavour:
1284 return "pe-mips";
1285 case bfd_target_elf_flavour:
0a44bf69
RS
1286#ifdef TE_VXWORKS
1287 if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1288 return (target_big_endian
1289 ? "elf32-bigmips-vxworks"
1290 : "elf32-littlemips-vxworks");
1291#endif
e013f690 1292#ifdef TE_TMIPS
cfe86eaa 1293 /* This is traditional mips. */
e013f690 1294 return (target_big_endian
cfe86eaa
TS
1295 ? (HAVE_64BIT_OBJECTS
1296 ? "elf64-tradbigmips"
1297 : (HAVE_NEWABI
1298 ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1299 : (HAVE_64BIT_OBJECTS
1300 ? "elf64-tradlittlemips"
1301 : (HAVE_NEWABI
1302 ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
e013f690
TS
1303#else
1304 return (target_big_endian
cfe86eaa
TS
1305 ? (HAVE_64BIT_OBJECTS
1306 ? "elf64-bigmips"
1307 : (HAVE_NEWABI
1308 ? "elf32-nbigmips" : "elf32-bigmips"))
1309 : (HAVE_64BIT_OBJECTS
1310 ? "elf64-littlemips"
1311 : (HAVE_NEWABI
1312 ? "elf32-nlittlemips" : "elf32-littlemips")));
e013f690
TS
1313#endif
1314 default:
1315 abort ();
1316 return NULL;
1317 }
1318}
1319
1e915849
RS
1320/* Return the length of instruction INSN. */
1321
1322static inline unsigned int
1323insn_length (const struct mips_cl_insn *insn)
1324{
1325 if (!mips_opts.mips16)
1326 return 4;
1327 return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1328}
1329
1330/* Initialise INSN from opcode entry MO. Leave its position unspecified. */
1331
1332static void
1333create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1334{
1335 size_t i;
1336
1337 insn->insn_mo = mo;
1338 insn->use_extend = FALSE;
1339 insn->extend = 0;
1340 insn->insn_opcode = mo->match;
1341 insn->frag = NULL;
1342 insn->where = 0;
1343 for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1344 insn->fixp[i] = NULL;
1345 insn->fixed_p = (mips_opts.noreorder > 0);
1346 insn->noreorder_p = (mips_opts.noreorder > 0);
1347 insn->mips16_absolute_jump_p = 0;
1348}
1349
742a56fe
RS
1350/* Record the current MIPS16 mode in now_seg. */
1351
1352static void
1353mips_record_mips16_mode (void)
1354{
1355 segment_info_type *si;
1356
1357 si = seg_info (now_seg);
1358 if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
1359 si->tc_segment_info_data.mips16 = mips_opts.mips16;
1360}
1361
1e915849
RS
1362/* Install INSN at the location specified by its "frag" and "where" fields. */
1363
1364static void
1365install_insn (const struct mips_cl_insn *insn)
1366{
1367 char *f = insn->frag->fr_literal + insn->where;
1368 if (!mips_opts.mips16)
1369 md_number_to_chars (f, insn->insn_opcode, 4);
1370 else if (insn->mips16_absolute_jump_p)
1371 {
1372 md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1373 md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1374 }
1375 else
1376 {
1377 if (insn->use_extend)
1378 {
1379 md_number_to_chars (f, 0xf000 | insn->extend, 2);
1380 f += 2;
1381 }
1382 md_number_to_chars (f, insn->insn_opcode, 2);
1383 }
742a56fe 1384 mips_record_mips16_mode ();
1e915849
RS
1385}
1386
1387/* Move INSN to offset WHERE in FRAG. Adjust the fixups accordingly
1388 and install the opcode in the new location. */
1389
1390static void
1391move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1392{
1393 size_t i;
1394
1395 insn->frag = frag;
1396 insn->where = where;
1397 for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1398 if (insn->fixp[i] != NULL)
1399 {
1400 insn->fixp[i]->fx_frag = frag;
1401 insn->fixp[i]->fx_where = where;
1402 }
1403 install_insn (insn);
1404}
1405
1406/* Add INSN to the end of the output. */
1407
1408static void
1409add_fixed_insn (struct mips_cl_insn *insn)
1410{
1411 char *f = frag_more (insn_length (insn));
1412 move_insn (insn, frag_now, f - frag_now->fr_literal);
1413}
1414
1415/* Start a variant frag and move INSN to the start of the variant part,
1416 marking it as fixed. The other arguments are as for frag_var. */
1417
1418static void
1419add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1420 relax_substateT subtype, symbolS *symbol, offsetT offset)
1421{
1422 frag_grow (max_chars);
1423 move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1424 insn->fixed_p = 1;
1425 frag_var (rs_machine_dependent, max_chars, var,
1426 subtype, symbol, offset, NULL);
1427}
1428
1429/* Insert N copies of INSN into the history buffer, starting at
1430 position FIRST. Neither FIRST nor N need to be clipped. */
1431
1432static void
1433insert_into_history (unsigned int first, unsigned int n,
1434 const struct mips_cl_insn *insn)
1435{
1436 if (mips_relax.sequence != 2)
1437 {
1438 unsigned int i;
1439
1440 for (i = ARRAY_SIZE (history); i-- > first;)
1441 if (i >= first + n)
1442 history[i] = history[i - n];
1443 else
1444 history[i] = *insn;
1445 }
1446}
1447
1448/* Emit a nop instruction, recording it in the history buffer. */
1449
1450static void
1451emit_nop (void)
1452{
1453 add_fixed_insn (NOP_INSN);
1454 insert_into_history (0, 1, NOP_INSN);
1455}
1456
71400594
RS
1457/* Initialize vr4120_conflicts. There is a bit of duplication here:
1458 the idea is to make it obvious at a glance that each errata is
1459 included. */
1460
1461static void
1462init_vr4120_conflicts (void)
1463{
1464#define CONFLICT(FIRST, SECOND) \
1465 vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1466
1467 /* Errata 21 - [D]DIV[U] after [D]MACC */
1468 CONFLICT (MACC, DIV);
1469 CONFLICT (DMACC, DIV);
1470
1471 /* Errata 23 - Continuous DMULT[U]/DMACC instructions. */
1472 CONFLICT (DMULT, DMULT);
1473 CONFLICT (DMULT, DMACC);
1474 CONFLICT (DMACC, DMULT);
1475 CONFLICT (DMACC, DMACC);
1476
1477 /* Errata 24 - MT{LO,HI} after [D]MACC */
1478 CONFLICT (MACC, MTHILO);
1479 CONFLICT (DMACC, MTHILO);
1480
1481 /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1482 instruction is executed immediately after a MACC or DMACC
1483 instruction, the result of [either instruction] is incorrect." */
1484 CONFLICT (MACC, MULT);
1485 CONFLICT (MACC, DMULT);
1486 CONFLICT (DMACC, MULT);
1487 CONFLICT (DMACC, DMULT);
1488
1489 /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1490 executed immediately after a DMULT, DMULTU, DIV, DIVU,
1491 DDIV or DDIVU instruction, the result of the MACC or
1492 DMACC instruction is incorrect.". */
1493 CONFLICT (DMULT, MACC);
1494 CONFLICT (DMULT, DMACC);
1495 CONFLICT (DIV, MACC);
1496 CONFLICT (DIV, DMACC);
1497
1498#undef CONFLICT
1499}
1500
707bfff6
TS
1501struct regname {
1502 const char *name;
1503 unsigned int num;
1504};
1505
1506#define RTYPE_MASK 0x1ff00
1507#define RTYPE_NUM 0x00100
1508#define RTYPE_FPU 0x00200
1509#define RTYPE_FCC 0x00400
1510#define RTYPE_VEC 0x00800
1511#define RTYPE_GP 0x01000
1512#define RTYPE_CP0 0x02000
1513#define RTYPE_PC 0x04000
1514#define RTYPE_ACC 0x08000
1515#define RTYPE_CCC 0x10000
1516#define RNUM_MASK 0x000ff
1517#define RWARN 0x80000
1518
1519#define GENERIC_REGISTER_NUMBERS \
1520 {"$0", RTYPE_NUM | 0}, \
1521 {"$1", RTYPE_NUM | 1}, \
1522 {"$2", RTYPE_NUM | 2}, \
1523 {"$3", RTYPE_NUM | 3}, \
1524 {"$4", RTYPE_NUM | 4}, \
1525 {"$5", RTYPE_NUM | 5}, \
1526 {"$6", RTYPE_NUM | 6}, \
1527 {"$7", RTYPE_NUM | 7}, \
1528 {"$8", RTYPE_NUM | 8}, \
1529 {"$9", RTYPE_NUM | 9}, \
1530 {"$10", RTYPE_NUM | 10}, \
1531 {"$11", RTYPE_NUM | 11}, \
1532 {"$12", RTYPE_NUM | 12}, \
1533 {"$13", RTYPE_NUM | 13}, \
1534 {"$14", RTYPE_NUM | 14}, \
1535 {"$15", RTYPE_NUM | 15}, \
1536 {"$16", RTYPE_NUM | 16}, \
1537 {"$17", RTYPE_NUM | 17}, \
1538 {"$18", RTYPE_NUM | 18}, \
1539 {"$19", RTYPE_NUM | 19}, \
1540 {"$20", RTYPE_NUM | 20}, \
1541 {"$21", RTYPE_NUM | 21}, \
1542 {"$22", RTYPE_NUM | 22}, \
1543 {"$23", RTYPE_NUM | 23}, \
1544 {"$24", RTYPE_NUM | 24}, \
1545 {"$25", RTYPE_NUM | 25}, \
1546 {"$26", RTYPE_NUM | 26}, \
1547 {"$27", RTYPE_NUM | 27}, \
1548 {"$28", RTYPE_NUM | 28}, \
1549 {"$29", RTYPE_NUM | 29}, \
1550 {"$30", RTYPE_NUM | 30}, \
1551 {"$31", RTYPE_NUM | 31}
1552
1553#define FPU_REGISTER_NAMES \
1554 {"$f0", RTYPE_FPU | 0}, \
1555 {"$f1", RTYPE_FPU | 1}, \
1556 {"$f2", RTYPE_FPU | 2}, \
1557 {"$f3", RTYPE_FPU | 3}, \
1558 {"$f4", RTYPE_FPU | 4}, \
1559 {"$f5", RTYPE_FPU | 5}, \
1560 {"$f6", RTYPE_FPU | 6}, \
1561 {"$f7", RTYPE_FPU | 7}, \
1562 {"$f8", RTYPE_FPU | 8}, \
1563 {"$f9", RTYPE_FPU | 9}, \
1564 {"$f10", RTYPE_FPU | 10}, \
1565 {"$f11", RTYPE_FPU | 11}, \
1566 {"$f12", RTYPE_FPU | 12}, \
1567 {"$f13", RTYPE_FPU | 13}, \
1568 {"$f14", RTYPE_FPU | 14}, \
1569 {"$f15", RTYPE_FPU | 15}, \
1570 {"$f16", RTYPE_FPU | 16}, \
1571 {"$f17", RTYPE_FPU | 17}, \
1572 {"$f18", RTYPE_FPU | 18}, \
1573 {"$f19", RTYPE_FPU | 19}, \
1574 {"$f20", RTYPE_FPU | 20}, \
1575 {"$f21", RTYPE_FPU | 21}, \
1576 {"$f22", RTYPE_FPU | 22}, \
1577 {"$f23", RTYPE_FPU | 23}, \
1578 {"$f24", RTYPE_FPU | 24}, \
1579 {"$f25", RTYPE_FPU | 25}, \
1580 {"$f26", RTYPE_FPU | 26}, \
1581 {"$f27", RTYPE_FPU | 27}, \
1582 {"$f28", RTYPE_FPU | 28}, \
1583 {"$f29", RTYPE_FPU | 29}, \
1584 {"$f30", RTYPE_FPU | 30}, \
1585 {"$f31", RTYPE_FPU | 31}
1586
1587#define FPU_CONDITION_CODE_NAMES \
1588 {"$fcc0", RTYPE_FCC | 0}, \
1589 {"$fcc1", RTYPE_FCC | 1}, \
1590 {"$fcc2", RTYPE_FCC | 2}, \
1591 {"$fcc3", RTYPE_FCC | 3}, \
1592 {"$fcc4", RTYPE_FCC | 4}, \
1593 {"$fcc5", RTYPE_FCC | 5}, \
1594 {"$fcc6", RTYPE_FCC | 6}, \
1595 {"$fcc7", RTYPE_FCC | 7}
1596
1597#define COPROC_CONDITION_CODE_NAMES \
1598 {"$cc0", RTYPE_FCC | RTYPE_CCC | 0}, \
1599 {"$cc1", RTYPE_FCC | RTYPE_CCC | 1}, \
1600 {"$cc2", RTYPE_FCC | RTYPE_CCC | 2}, \
1601 {"$cc3", RTYPE_FCC | RTYPE_CCC | 3}, \
1602 {"$cc4", RTYPE_FCC | RTYPE_CCC | 4}, \
1603 {"$cc5", RTYPE_FCC | RTYPE_CCC | 5}, \
1604 {"$cc6", RTYPE_FCC | RTYPE_CCC | 6}, \
1605 {"$cc7", RTYPE_FCC | RTYPE_CCC | 7}
1606
1607#define N32N64_SYMBOLIC_REGISTER_NAMES \
1608 {"$a4", RTYPE_GP | 8}, \
1609 {"$a5", RTYPE_GP | 9}, \
1610 {"$a6", RTYPE_GP | 10}, \
1611 {"$a7", RTYPE_GP | 11}, \
1612 {"$ta0", RTYPE_GP | 8}, /* alias for $a4 */ \
1613 {"$ta1", RTYPE_GP | 9}, /* alias for $a5 */ \
1614 {"$ta2", RTYPE_GP | 10}, /* alias for $a6 */ \
1615 {"$ta3", RTYPE_GP | 11}, /* alias for $a7 */ \
1616 {"$t0", RTYPE_GP | 12}, \
1617 {"$t1", RTYPE_GP | 13}, \
1618 {"$t2", RTYPE_GP | 14}, \
1619 {"$t3", RTYPE_GP | 15}
1620
1621#define O32_SYMBOLIC_REGISTER_NAMES \
1622 {"$t0", RTYPE_GP | 8}, \
1623 {"$t1", RTYPE_GP | 9}, \
1624 {"$t2", RTYPE_GP | 10}, \
1625 {"$t3", RTYPE_GP | 11}, \
1626 {"$t4", RTYPE_GP | 12}, \
1627 {"$t5", RTYPE_GP | 13}, \
1628 {"$t6", RTYPE_GP | 14}, \
1629 {"$t7", RTYPE_GP | 15}, \
1630 {"$ta0", RTYPE_GP | 12}, /* alias for $t4 */ \
1631 {"$ta1", RTYPE_GP | 13}, /* alias for $t5 */ \
1632 {"$ta2", RTYPE_GP | 14}, /* alias for $t6 */ \
1633 {"$ta3", RTYPE_GP | 15} /* alias for $t7 */
1634
1635/* Remaining symbolic register names */
1636#define SYMBOLIC_REGISTER_NAMES \
1637 {"$zero", RTYPE_GP | 0}, \
1638 {"$at", RTYPE_GP | 1}, \
1639 {"$AT", RTYPE_GP | 1}, \
1640 {"$v0", RTYPE_GP | 2}, \
1641 {"$v1", RTYPE_GP | 3}, \
1642 {"$a0", RTYPE_GP | 4}, \
1643 {"$a1", RTYPE_GP | 5}, \
1644 {"$a2", RTYPE_GP | 6}, \
1645 {"$a3", RTYPE_GP | 7}, \
1646 {"$s0", RTYPE_GP | 16}, \
1647 {"$s1", RTYPE_GP | 17}, \
1648 {"$s2", RTYPE_GP | 18}, \
1649 {"$s3", RTYPE_GP | 19}, \
1650 {"$s4", RTYPE_GP | 20}, \
1651 {"$s5", RTYPE_GP | 21}, \
1652 {"$s6", RTYPE_GP | 22}, \
1653 {"$s7", RTYPE_GP | 23}, \
1654 {"$t8", RTYPE_GP | 24}, \
1655 {"$t9", RTYPE_GP | 25}, \
1656 {"$k0", RTYPE_GP | 26}, \
1657 {"$kt0", RTYPE_GP | 26}, \
1658 {"$k1", RTYPE_GP | 27}, \
1659 {"$kt1", RTYPE_GP | 27}, \
1660 {"$gp", RTYPE_GP | 28}, \
1661 {"$sp", RTYPE_GP | 29}, \
1662 {"$s8", RTYPE_GP | 30}, \
1663 {"$fp", RTYPE_GP | 30}, \
1664 {"$ra", RTYPE_GP | 31}
1665
1666#define MIPS16_SPECIAL_REGISTER_NAMES \
1667 {"$pc", RTYPE_PC | 0}
1668
1669#define MDMX_VECTOR_REGISTER_NAMES \
1670 /* {"$v0", RTYPE_VEC | 0}, clash with REG 2 above */ \
1671 /* {"$v1", RTYPE_VEC | 1}, clash with REG 3 above */ \
1672 {"$v2", RTYPE_VEC | 2}, \
1673 {"$v3", RTYPE_VEC | 3}, \
1674 {"$v4", RTYPE_VEC | 4}, \
1675 {"$v5", RTYPE_VEC | 5}, \
1676 {"$v6", RTYPE_VEC | 6}, \
1677 {"$v7", RTYPE_VEC | 7}, \
1678 {"$v8", RTYPE_VEC | 8}, \
1679 {"$v9", RTYPE_VEC | 9}, \
1680 {"$v10", RTYPE_VEC | 10}, \
1681 {"$v11", RTYPE_VEC | 11}, \
1682 {"$v12", RTYPE_VEC | 12}, \
1683 {"$v13", RTYPE_VEC | 13}, \
1684 {"$v14", RTYPE_VEC | 14}, \
1685 {"$v15", RTYPE_VEC | 15}, \
1686 {"$v16", RTYPE_VEC | 16}, \
1687 {"$v17", RTYPE_VEC | 17}, \
1688 {"$v18", RTYPE_VEC | 18}, \
1689 {"$v19", RTYPE_VEC | 19}, \
1690 {"$v20", RTYPE_VEC | 20}, \
1691 {"$v21", RTYPE_VEC | 21}, \
1692 {"$v22", RTYPE_VEC | 22}, \
1693 {"$v23", RTYPE_VEC | 23}, \
1694 {"$v24", RTYPE_VEC | 24}, \
1695 {"$v25", RTYPE_VEC | 25}, \
1696 {"$v26", RTYPE_VEC | 26}, \
1697 {"$v27", RTYPE_VEC | 27}, \
1698 {"$v28", RTYPE_VEC | 28}, \
1699 {"$v29", RTYPE_VEC | 29}, \
1700 {"$v30", RTYPE_VEC | 30}, \
1701 {"$v31", RTYPE_VEC | 31}
1702
1703#define MIPS_DSP_ACCUMULATOR_NAMES \
1704 {"$ac0", RTYPE_ACC | 0}, \
1705 {"$ac1", RTYPE_ACC | 1}, \
1706 {"$ac2", RTYPE_ACC | 2}, \
1707 {"$ac3", RTYPE_ACC | 3}
1708
1709static const struct regname reg_names[] = {
1710 GENERIC_REGISTER_NUMBERS,
1711 FPU_REGISTER_NAMES,
1712 FPU_CONDITION_CODE_NAMES,
1713 COPROC_CONDITION_CODE_NAMES,
1714
1715 /* The $txx registers depends on the abi,
1716 these will be added later into the symbol table from
1717 one of the tables below once mips_abi is set after
1718 parsing of arguments from the command line. */
1719 SYMBOLIC_REGISTER_NAMES,
1720
1721 MIPS16_SPECIAL_REGISTER_NAMES,
1722 MDMX_VECTOR_REGISTER_NAMES,
1723 MIPS_DSP_ACCUMULATOR_NAMES,
1724 {0, 0}
1725};
1726
1727static const struct regname reg_names_o32[] = {
1728 O32_SYMBOLIC_REGISTER_NAMES,
1729 {0, 0}
1730};
1731
1732static const struct regname reg_names_n32n64[] = {
1733 N32N64_SYMBOLIC_REGISTER_NAMES,
1734 {0, 0}
1735};
1736
1737static int
1738reg_lookup (char **s, unsigned int types, unsigned int *regnop)
1739{
1740 symbolS *symbolP;
1741 char *e;
1742 char save_c;
1743 int reg = -1;
1744
1745 /* Find end of name. */
1746 e = *s;
1747 if (is_name_beginner (*e))
1748 ++e;
1749 while (is_part_of_name (*e))
1750 ++e;
1751
1752 /* Terminate name. */
1753 save_c = *e;
1754 *e = '\0';
1755
1756 /* Look for a register symbol. */
1757 if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
1758 {
1759 int r = S_GET_VALUE (symbolP);
1760 if (r & types)
1761 reg = r & RNUM_MASK;
1762 else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
1763 /* Convert GP reg $v0/1 to MDMX reg $v0/1! */
1764 reg = (r & RNUM_MASK) - 2;
1765 }
1766 /* Else see if this is a register defined in an itbl entry. */
1767 else if ((types & RTYPE_GP) && itbl_have_entries)
1768 {
1769 char *n = *s;
1770 unsigned long r;
1771
1772 if (*n == '$')
1773 ++n;
1774 if (itbl_get_reg_val (n, &r))
1775 reg = r & RNUM_MASK;
1776 }
1777
1778 /* Advance to next token if a register was recognised. */
1779 if (reg >= 0)
1780 *s = e;
1781 else if (types & RWARN)
1782 as_warn ("Unrecognized register name `%s'", *s);
1783
1784 *e = save_c;
1785 if (regnop)
1786 *regnop = reg;
1787 return reg >= 0;
1788}
1789
037b32b9
AN
1790/* Return TRUE if opcode MO is valid on the currently selected ISA and
1791 architecture. If EXPANSIONP is TRUE then this check is done while
1792 expanding a macro. Use is_opcode_valid_16 for MIPS16 opcodes. */
1793
1794static bfd_boolean
1795is_opcode_valid (const struct mips_opcode *mo, bfd_boolean expansionp)
1796{
1797 int isa = mips_opts.isa;
1798 int fp_s, fp_d;
1799
1800 if (mips_opts.ase_mdmx)
1801 isa |= INSN_MDMX;
1802 if (mips_opts.ase_dsp)
1803 isa |= INSN_DSP;
1804 if (mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
1805 isa |= INSN_DSP64;
1806 if (mips_opts.ase_dspr2)
1807 isa |= INSN_DSPR2;
1808 if (mips_opts.ase_mt)
1809 isa |= INSN_MT;
1810 if (mips_opts.ase_mips3d)
1811 isa |= INSN_MIPS3D;
1812 if (mips_opts.ase_smartmips)
1813 isa |= INSN_SMARTMIPS;
1814
1815 /* For user code we don't check for mips_opts.mips16 since we want
1816 to allow jalx if -mips16 was specified on the command line. */
1817 if (expansionp ? mips_opts.mips16 : file_ase_mips16)
1818 isa |= INSN_MIPS16;
1819
b19e8a9b
AN
1820 /* Don't accept instructions based on the ISA if the CPU does not implement
1821 all the coprocessor insns. */
1822 if (NO_ISA_COP (mips_opts.arch)
1823 && COP_INSN (mo->pinfo))
1824 isa = 0;
1825
037b32b9
AN
1826 if (!OPCODE_IS_MEMBER (mo, isa, mips_opts.arch))
1827 return FALSE;
1828
1829 /* Check whether the instruction or macro requires single-precision or
1830 double-precision floating-point support. Note that this information is
1831 stored differently in the opcode table for insns and macros. */
1832 if (mo->pinfo == INSN_MACRO)
1833 {
1834 fp_s = mo->pinfo2 & INSN2_M_FP_S;
1835 fp_d = mo->pinfo2 & INSN2_M_FP_D;
1836 }
1837 else
1838 {
1839 fp_s = mo->pinfo & FP_S;
1840 fp_d = mo->pinfo & FP_D;
1841 }
1842
1843 if (fp_d && (mips_opts.soft_float || mips_opts.single_float))
1844 return FALSE;
1845
1846 if (fp_s && mips_opts.soft_float)
1847 return FALSE;
1848
1849 return TRUE;
1850}
1851
1852/* Return TRUE if the MIPS16 opcode MO is valid on the currently
1853 selected ISA and architecture. */
1854
1855static bfd_boolean
1856is_opcode_valid_16 (const struct mips_opcode *mo)
1857{
1858 return OPCODE_IS_MEMBER (mo, mips_opts.isa, mips_opts.arch) ? TRUE : FALSE;
1859}
1860
707bfff6
TS
1861/* This function is called once, at assembler startup time. It should set up
1862 all the tables, etc. that the MD part of the assembler will need. */
156c2f8b 1863
252b5132 1864void
17a2f251 1865md_begin (void)
252b5132 1866{
3994f87e 1867 const char *retval = NULL;
156c2f8b 1868 int i = 0;
252b5132 1869 int broken = 0;
1f25f5d3 1870
0a44bf69
RS
1871 if (mips_pic != NO_PIC)
1872 {
1873 if (g_switch_seen && g_switch_value != 0)
1874 as_bad (_("-G may not be used in position-independent code"));
1875 g_switch_value = 0;
1876 }
1877
fef14a42 1878 if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
252b5132
RH
1879 as_warn (_("Could not set architecture and machine"));
1880
252b5132
RH
1881 op_hash = hash_new ();
1882
1883 for (i = 0; i < NUMOPCODES;)
1884 {
1885 const char *name = mips_opcodes[i].name;
1886
17a2f251 1887 retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
252b5132
RH
1888 if (retval != NULL)
1889 {
1890 fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1891 mips_opcodes[i].name, retval);
1892 /* Probably a memory allocation problem? Give up now. */
1893 as_fatal (_("Broken assembler. No assembly attempted."));
1894 }
1895 do
1896 {
1897 if (mips_opcodes[i].pinfo != INSN_MACRO)
1898 {
1899 if (!validate_mips_insn (&mips_opcodes[i]))
1900 broken = 1;
1e915849
RS
1901 if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1902 {
1903 create_insn (&nop_insn, mips_opcodes + i);
1904 nop_insn.fixed_p = 1;
1905 }
252b5132
RH
1906 }
1907 ++i;
1908 }
1909 while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1910 }
1911
1912 mips16_op_hash = hash_new ();
1913
1914 i = 0;
1915 while (i < bfd_mips16_num_opcodes)
1916 {
1917 const char *name = mips16_opcodes[i].name;
1918
17a2f251 1919 retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
252b5132
RH
1920 if (retval != NULL)
1921 as_fatal (_("internal: can't hash `%s': %s"),
1922 mips16_opcodes[i].name, retval);
1923 do
1924 {
1925 if (mips16_opcodes[i].pinfo != INSN_MACRO
1926 && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1927 != mips16_opcodes[i].match))
1928 {
1929 fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1930 mips16_opcodes[i].name, mips16_opcodes[i].args);
1931 broken = 1;
1932 }
1e915849
RS
1933 if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1934 {
1935 create_insn (&mips16_nop_insn, mips16_opcodes + i);
1936 mips16_nop_insn.fixed_p = 1;
1937 }
252b5132
RH
1938 ++i;
1939 }
1940 while (i < bfd_mips16_num_opcodes
1941 && strcmp (mips16_opcodes[i].name, name) == 0);
1942 }
1943
1944 if (broken)
1945 as_fatal (_("Broken assembler. No assembly attempted."));
1946
1947 /* We add all the general register names to the symbol table. This
1948 helps us detect invalid uses of them. */
707bfff6
TS
1949 for (i = 0; reg_names[i].name; i++)
1950 symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
8fc4ee9b 1951 reg_names[i].num, /* & RNUM_MASK, */
707bfff6
TS
1952 &zero_address_frag));
1953 if (HAVE_NEWABI)
1954 for (i = 0; reg_names_n32n64[i].name; i++)
1955 symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
8fc4ee9b 1956 reg_names_n32n64[i].num, /* & RNUM_MASK, */
252b5132 1957 &zero_address_frag));
707bfff6
TS
1958 else
1959 for (i = 0; reg_names_o32[i].name; i++)
1960 symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
8fc4ee9b 1961 reg_names_o32[i].num, /* & RNUM_MASK, */
6047c971 1962 &zero_address_frag));
6047c971 1963
7d10b47d 1964 mips_no_prev_insn ();
252b5132
RH
1965
1966 mips_gprmask = 0;
1967 mips_cprmask[0] = 0;
1968 mips_cprmask[1] = 0;
1969 mips_cprmask[2] = 0;
1970 mips_cprmask[3] = 0;
1971
1972 /* set the default alignment for the text section (2**2) */
1973 record_alignment (text_section, 2);
1974
4d0d148d 1975 bfd_set_gp_size (stdoutput, g_switch_value);
252b5132 1976
707bfff6 1977#ifdef OBJ_ELF
f43abd2b 1978 if (IS_ELF)
252b5132 1979 {
0a44bf69
RS
1980 /* On a native system other than VxWorks, sections must be aligned
1981 to 16 byte boundaries. When configured for an embedded ELF
1982 target, we don't bother. */
c41e87e3
CF
1983 if (strncmp (TARGET_OS, "elf", 3) != 0
1984 && strncmp (TARGET_OS, "vxworks", 7) != 0)
252b5132
RH
1985 {
1986 (void) bfd_set_section_alignment (stdoutput, text_section, 4);
1987 (void) bfd_set_section_alignment (stdoutput, data_section, 4);
1988 (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
1989 }
1990
1991 /* Create a .reginfo section for register masks and a .mdebug
1992 section for debugging information. */
1993 {
1994 segT seg;
1995 subsegT subseg;
1996 flagword flags;
1997 segT sec;
1998
1999 seg = now_seg;
2000 subseg = now_subseg;
2001
2002 /* The ABI says this section should be loaded so that the
2003 running program can access it. However, we don't load it
2004 if we are configured for an embedded target */
2005 flags = SEC_READONLY | SEC_DATA;
c41e87e3 2006 if (strncmp (TARGET_OS, "elf", 3) != 0)
252b5132
RH
2007 flags |= SEC_ALLOC | SEC_LOAD;
2008
316f5878 2009 if (mips_abi != N64_ABI)
252b5132
RH
2010 {
2011 sec = subseg_new (".reginfo", (subsegT) 0);
2012
195325d2
TS
2013 bfd_set_section_flags (stdoutput, sec, flags);
2014 bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
bdaaa2e1 2015
252b5132 2016 mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
252b5132
RH
2017 }
2018 else
2019 {
2020 /* The 64-bit ABI uses a .MIPS.options section rather than
2021 .reginfo section. */
2022 sec = subseg_new (".MIPS.options", (subsegT) 0);
195325d2
TS
2023 bfd_set_section_flags (stdoutput, sec, flags);
2024 bfd_set_section_alignment (stdoutput, sec, 3);
252b5132 2025
252b5132
RH
2026 /* Set up the option header. */
2027 {
2028 Elf_Internal_Options opthdr;
2029 char *f;
2030
2031 opthdr.kind = ODK_REGINFO;
2032 opthdr.size = (sizeof (Elf_External_Options)
2033 + sizeof (Elf64_External_RegInfo));
2034 opthdr.section = 0;
2035 opthdr.info = 0;
2036 f = frag_more (sizeof (Elf_External_Options));
2037 bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
2038 (Elf_External_Options *) f);
2039
2040 mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
2041 }
252b5132
RH
2042 }
2043
2044 if (ECOFF_DEBUGGING)
2045 {
2046 sec = subseg_new (".mdebug", (subsegT) 0);
2047 (void) bfd_set_section_flags (stdoutput, sec,
2048 SEC_HAS_CONTENTS | SEC_READONLY);
2049 (void) bfd_set_section_alignment (stdoutput, sec, 2);
2050 }
f43abd2b 2051 else if (mips_flag_pdr)
ecb4347a
DJ
2052 {
2053 pdr_seg = subseg_new (".pdr", (subsegT) 0);
2054 (void) bfd_set_section_flags (stdoutput, pdr_seg,
2055 SEC_READONLY | SEC_RELOC
2056 | SEC_DEBUGGING);
2057 (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
2058 }
252b5132
RH
2059
2060 subseg_set (seg, subseg);
2061 }
2062 }
707bfff6 2063#endif /* OBJ_ELF */
252b5132
RH
2064
2065 if (! ECOFF_DEBUGGING)
2066 md_obj_begin ();
71400594
RS
2067
2068 if (mips_fix_vr4120)
2069 init_vr4120_conflicts ();
252b5132
RH
2070}
2071
2072void
17a2f251 2073md_mips_end (void)
252b5132
RH
2074{
2075 if (! ECOFF_DEBUGGING)
2076 md_obj_end ();
2077}
2078
2079void
17a2f251 2080md_assemble (char *str)
252b5132
RH
2081{
2082 struct mips_cl_insn insn;
f6688943
TS
2083 bfd_reloc_code_real_type unused_reloc[3]
2084 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
252b5132
RH
2085
2086 imm_expr.X_op = O_absent;
5f74bc13 2087 imm2_expr.X_op = O_absent;
252b5132 2088 offset_expr.X_op = O_absent;
f6688943
TS
2089 imm_reloc[0] = BFD_RELOC_UNUSED;
2090 imm_reloc[1] = BFD_RELOC_UNUSED;
2091 imm_reloc[2] = BFD_RELOC_UNUSED;
2092 offset_reloc[0] = BFD_RELOC_UNUSED;
2093 offset_reloc[1] = BFD_RELOC_UNUSED;
2094 offset_reloc[2] = BFD_RELOC_UNUSED;
252b5132
RH
2095
2096 if (mips_opts.mips16)
2097 mips16_ip (str, &insn);
2098 else
2099 {
2100 mips_ip (str, &insn);
beae10d5
KH
2101 DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
2102 str, insn.insn_opcode));
252b5132
RH
2103 }
2104
2105 if (insn_error)
2106 {
2107 as_bad ("%s `%s'", insn_error, str);
2108 return;
2109 }
2110
2111 if (insn.insn_mo->pinfo == INSN_MACRO)
2112 {
584892a6 2113 macro_start ();
252b5132
RH
2114 if (mips_opts.mips16)
2115 mips16_macro (&insn);
2116 else
2117 macro (&insn);
584892a6 2118 macro_end ();
252b5132
RH
2119 }
2120 else
2121 {
2122 if (imm_expr.X_op != O_absent)
4d7206a2 2123 append_insn (&insn, &imm_expr, imm_reloc);
252b5132 2124 else if (offset_expr.X_op != O_absent)
4d7206a2 2125 append_insn (&insn, &offset_expr, offset_reloc);
252b5132 2126 else
4d7206a2 2127 append_insn (&insn, NULL, unused_reloc);
252b5132
RH
2128 }
2129}
2130
738e5348
RS
2131/* Convenience functions for abstracting away the differences between
2132 MIPS16 and non-MIPS16 relocations. */
2133
2134static inline bfd_boolean
2135mips16_reloc_p (bfd_reloc_code_real_type reloc)
2136{
2137 switch (reloc)
2138 {
2139 case BFD_RELOC_MIPS16_JMP:
2140 case BFD_RELOC_MIPS16_GPREL:
2141 case BFD_RELOC_MIPS16_GOT16:
2142 case BFD_RELOC_MIPS16_CALL16:
2143 case BFD_RELOC_MIPS16_HI16_S:
2144 case BFD_RELOC_MIPS16_HI16:
2145 case BFD_RELOC_MIPS16_LO16:
2146 return TRUE;
2147
2148 default:
2149 return FALSE;
2150 }
2151}
2152
2153static inline bfd_boolean
2154got16_reloc_p (bfd_reloc_code_real_type reloc)
2155{
2156 return reloc == BFD_RELOC_MIPS_GOT16 || reloc == BFD_RELOC_MIPS16_GOT16;
2157}
2158
2159static inline bfd_boolean
2160hi16_reloc_p (bfd_reloc_code_real_type reloc)
2161{
2162 return reloc == BFD_RELOC_HI16_S || reloc == BFD_RELOC_MIPS16_HI16_S;
2163}
2164
2165static inline bfd_boolean
2166lo16_reloc_p (bfd_reloc_code_real_type reloc)
2167{
2168 return reloc == BFD_RELOC_LO16 || reloc == BFD_RELOC_MIPS16_LO16;
2169}
2170
5919d012 2171/* Return true if the given relocation might need a matching %lo().
0a44bf69
RS
2172 This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2173 need a matching %lo() when applied to local symbols. */
5919d012
RS
2174
2175static inline bfd_boolean
17a2f251 2176reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
5919d012 2177{
3b91255e 2178 return (HAVE_IN_PLACE_ADDENDS
738e5348 2179 && (hi16_reloc_p (reloc)
0a44bf69
RS
2180 /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2181 all GOT16 relocations evaluate to "G". */
738e5348
RS
2182 || (got16_reloc_p (reloc) && mips_pic != VXWORKS_PIC)));
2183}
2184
2185/* Return the type of %lo() reloc needed by RELOC, given that
2186 reloc_needs_lo_p. */
2187
2188static inline bfd_reloc_code_real_type
2189matching_lo_reloc (bfd_reloc_code_real_type reloc)
2190{
2191 return mips16_reloc_p (reloc) ? BFD_RELOC_MIPS16_LO16 : BFD_RELOC_LO16;
5919d012
RS
2192}
2193
2194/* Return true if the given fixup is followed by a matching R_MIPS_LO16
2195 relocation. */
2196
2197static inline bfd_boolean
17a2f251 2198fixup_has_matching_lo_p (fixS *fixp)
5919d012
RS
2199{
2200 return (fixp->fx_next != NULL
738e5348 2201 && fixp->fx_next->fx_r_type == matching_lo_reloc (fixp->fx_r_type)
5919d012
RS
2202 && fixp->fx_addsy == fixp->fx_next->fx_addsy
2203 && fixp->fx_offset == fixp->fx_next->fx_offset);
2204}
2205
252b5132
RH
2206/* See whether instruction IP reads register REG. CLASS is the type
2207 of register. */
2208
2209static int
71400594 2210insn_uses_reg (const struct mips_cl_insn *ip, unsigned int reg,
17a2f251 2211 enum mips_regclass class)
252b5132
RH
2212{
2213 if (class == MIPS16_REG)
2214 {
2215 assert (mips_opts.mips16);
2216 reg = mips16_to_32_reg_map[reg];
2217 class = MIPS_GR_REG;
2218 }
2219
85b51719
TS
2220 /* Don't report on general register ZERO, since it never changes. */
2221 if (class == MIPS_GR_REG && reg == ZERO)
252b5132
RH
2222 return 0;
2223
2224 if (class == MIPS_FP_REG)
2225 {
2226 assert (! mips_opts.mips16);
2227 /* If we are called with either $f0 or $f1, we must check $f0.
2228 This is not optimal, because it will introduce an unnecessary
2229 NOP between "lwc1 $f0" and "swc1 $f1". To fix this we would
2230 need to distinguish reading both $f0 and $f1 or just one of
2231 them. Note that we don't have to check the other way,
2232 because there is no instruction that sets both $f0 and $f1
2233 and requires a delay. */
2234 if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
bf12938e 2235 && ((EXTRACT_OPERAND (FS, *ip) & ~(unsigned) 1)
252b5132
RH
2236 == (reg &~ (unsigned) 1)))
2237 return 1;
2238 if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
bf12938e 2239 && ((EXTRACT_OPERAND (FT, *ip) & ~(unsigned) 1)
252b5132
RH
2240 == (reg &~ (unsigned) 1)))
2241 return 1;
2242 }
2243 else if (! mips_opts.mips16)
2244 {
2245 if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
bf12938e 2246 && EXTRACT_OPERAND (RS, *ip) == reg)
252b5132
RH
2247 return 1;
2248 if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
bf12938e 2249 && EXTRACT_OPERAND (RT, *ip) == reg)
252b5132
RH
2250 return 1;
2251 }
2252 else
2253 {
2254 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
bf12938e 2255 && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)] == reg)
252b5132
RH
2256 return 1;
2257 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
bf12938e 2258 && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)] == reg)
252b5132
RH
2259 return 1;
2260 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
bf12938e 2261 && (mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]
252b5132
RH
2262 == reg))
2263 return 1;
2264 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
2265 return 1;
2266 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
2267 return 1;
2268 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
2269 return 1;
2270 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
bf12938e 2271 && MIPS16_EXTRACT_OPERAND (REGR32, *ip) == reg)
252b5132
RH
2272 return 1;
2273 }
2274
2275 return 0;
2276}
2277
2278/* This function returns true if modifying a register requires a
2279 delay. */
2280
2281static int
17a2f251 2282reg_needs_delay (unsigned int reg)
252b5132
RH
2283{
2284 unsigned long prev_pinfo;
2285
47e39b9d 2286 prev_pinfo = history[0].insn_mo->pinfo;
252b5132 2287 if (! mips_opts.noreorder
81912461
ILT
2288 && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2289 && ! gpr_interlocks)
2290 || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2291 && ! cop_interlocks)))
252b5132 2292 {
81912461
ILT
2293 /* A load from a coprocessor or from memory. All load delays
2294 delay the use of general register rt for one instruction. */
bdaaa2e1 2295 /* Itbl support may require additional care here. */
252b5132 2296 know (prev_pinfo & INSN_WRITE_GPR_T);
bf12938e 2297 if (reg == EXTRACT_OPERAND (RT, history[0]))
252b5132
RH
2298 return 1;
2299 }
2300
2301 return 0;
2302}
2303
404a8071
RS
2304/* Move all labels in insn_labels to the current insertion point. */
2305
2306static void
2307mips_move_labels (void)
2308{
a8dbcb85 2309 segment_info_type *si = seg_info (now_seg);
404a8071
RS
2310 struct insn_label_list *l;
2311 valueT val;
2312
a8dbcb85 2313 for (l = si->label_list; l != NULL; l = l->next)
404a8071
RS
2314 {
2315 assert (S_GET_SEGMENT (l->label) == now_seg);
2316 symbol_set_frag (l->label, frag_now);
2317 val = (valueT) frag_now_fix ();
2318 /* mips16 text labels are stored as odd. */
2319 if (mips_opts.mips16)
2320 ++val;
2321 S_SET_VALUE (l->label, val);
2322 }
2323}
2324
5f0fe04b
TS
2325static bfd_boolean
2326s_is_linkonce (symbolS *sym, segT from_seg)
2327{
2328 bfd_boolean linkonce = FALSE;
2329 segT symseg = S_GET_SEGMENT (sym);
2330
2331 if (symseg != from_seg && !S_IS_LOCAL (sym))
2332 {
2333 if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
2334 linkonce = TRUE;
2335#ifdef OBJ_ELF
2336 /* The GNU toolchain uses an extension for ELF: a section
2337 beginning with the magic string .gnu.linkonce is a
2338 linkonce section. */
2339 if (strncmp (segment_name (symseg), ".gnu.linkonce",
2340 sizeof ".gnu.linkonce" - 1) == 0)
2341 linkonce = TRUE;
2342#endif
2343 }
2344 return linkonce;
2345}
2346
252b5132
RH
2347/* Mark instruction labels in mips16 mode. This permits the linker to
2348 handle them specially, such as generating jalx instructions when
2349 needed. We also make them odd for the duration of the assembly, in
2350 order to generate the right sort of code. We will make them even
2351 in the adjust_symtab routine, while leaving them marked. This is
2352 convenient for the debugger and the disassembler. The linker knows
2353 to make them odd again. */
2354
2355static void
17a2f251 2356mips16_mark_labels (void)
252b5132 2357{
a8dbcb85
TS
2358 segment_info_type *si = seg_info (now_seg);
2359 struct insn_label_list *l;
252b5132 2360
a8dbcb85
TS
2361 if (!mips_opts.mips16)
2362 return;
2363
2364 for (l = si->label_list; l != NULL; l = l->next)
2365 {
2366 symbolS *label = l->label;
2367
2368#if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
f43abd2b 2369 if (IS_ELF)
30c09090 2370 S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label)));
252b5132 2371#endif
5f0fe04b
TS
2372 if ((S_GET_VALUE (label) & 1) == 0
2373 /* Don't adjust the address if the label is global or weak, or
2374 in a link-once section, since we'll be emitting symbol reloc
2375 references to it which will be patched up by the linker, and
2376 the final value of the symbol may or may not be MIPS16. */
2377 && ! S_IS_WEAK (label)
2378 && ! S_IS_EXTERNAL (label)
2379 && ! s_is_linkonce (label, now_seg))
a8dbcb85 2380 S_SET_VALUE (label, S_GET_VALUE (label) | 1);
252b5132
RH
2381 }
2382}
2383
4d7206a2
RS
2384/* End the current frag. Make it a variant frag and record the
2385 relaxation info. */
2386
2387static void
2388relax_close_frag (void)
2389{
584892a6 2390 mips_macro_warning.first_frag = frag_now;
4d7206a2 2391 frag_var (rs_machine_dependent, 0, 0,
584892a6 2392 RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
4d7206a2
RS
2393 mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2394
2395 memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2396 mips_relax.first_fixup = 0;
2397}
2398
2399/* Start a new relaxation sequence whose expansion depends on SYMBOL.
2400 See the comment above RELAX_ENCODE for more details. */
2401
2402static void
2403relax_start (symbolS *symbol)
2404{
2405 assert (mips_relax.sequence == 0);
2406 mips_relax.sequence = 1;
2407 mips_relax.symbol = symbol;
2408}
2409
2410/* Start generating the second version of a relaxable sequence.
2411 See the comment above RELAX_ENCODE for more details. */
252b5132
RH
2412
2413static void
4d7206a2
RS
2414relax_switch (void)
2415{
2416 assert (mips_relax.sequence == 1);
2417 mips_relax.sequence = 2;
2418}
2419
2420/* End the current relaxable sequence. */
2421
2422static void
2423relax_end (void)
2424{
2425 assert (mips_relax.sequence == 2);
2426 relax_close_frag ();
2427 mips_relax.sequence = 0;
2428}
2429
71400594
RS
2430/* Classify an instruction according to the FIX_VR4120_* enumeration.
2431 Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
2432 by VR4120 errata. */
4d7206a2 2433
71400594
RS
2434static unsigned int
2435classify_vr4120_insn (const char *name)
252b5132 2436{
71400594
RS
2437 if (strncmp (name, "macc", 4) == 0)
2438 return FIX_VR4120_MACC;
2439 if (strncmp (name, "dmacc", 5) == 0)
2440 return FIX_VR4120_DMACC;
2441 if (strncmp (name, "mult", 4) == 0)
2442 return FIX_VR4120_MULT;
2443 if (strncmp (name, "dmult", 5) == 0)
2444 return FIX_VR4120_DMULT;
2445 if (strstr (name, "div"))
2446 return FIX_VR4120_DIV;
2447 if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
2448 return FIX_VR4120_MTHILO;
2449 return NUM_FIX_VR4120_CLASSES;
2450}
252b5132 2451
71400594
RS
2452/* Return the number of instructions that must separate INSN1 and INSN2,
2453 where INSN1 is the earlier instruction. Return the worst-case value
2454 for any INSN2 if INSN2 is null. */
252b5132 2455
71400594
RS
2456static unsigned int
2457insns_between (const struct mips_cl_insn *insn1,
2458 const struct mips_cl_insn *insn2)
2459{
2460 unsigned long pinfo1, pinfo2;
2461
2462 /* This function needs to know which pinfo flags are set for INSN2
2463 and which registers INSN2 uses. The former is stored in PINFO2 and
2464 the latter is tested via INSN2_USES_REG. If INSN2 is null, PINFO2
2465 will have every flag set and INSN2_USES_REG will always return true. */
2466 pinfo1 = insn1->insn_mo->pinfo;
2467 pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
252b5132 2468
71400594
RS
2469#define INSN2_USES_REG(REG, CLASS) \
2470 (insn2 == NULL || insn_uses_reg (insn2, REG, CLASS))
2471
2472 /* For most targets, write-after-read dependencies on the HI and LO
2473 registers must be separated by at least two instructions. */
2474 if (!hilo_interlocks)
252b5132 2475 {
71400594
RS
2476 if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
2477 return 2;
2478 if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
2479 return 2;
2480 }
2481
2482 /* If we're working around r7000 errata, there must be two instructions
2483 between an mfhi or mflo and any instruction that uses the result. */
2484 if (mips_7000_hilo_fix
2485 && MF_HILO_INSN (pinfo1)
2486 && INSN2_USES_REG (EXTRACT_OPERAND (RD, *insn1), MIPS_GR_REG))
2487 return 2;
2488
2489 /* If working around VR4120 errata, check for combinations that need
2490 a single intervening instruction. */
2491 if (mips_fix_vr4120)
2492 {
2493 unsigned int class1, class2;
252b5132 2494
71400594
RS
2495 class1 = classify_vr4120_insn (insn1->insn_mo->name);
2496 if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
252b5132 2497 {
71400594
RS
2498 if (insn2 == NULL)
2499 return 1;
2500 class2 = classify_vr4120_insn (insn2->insn_mo->name);
2501 if (vr4120_conflicts[class1] & (1 << class2))
2502 return 1;
252b5132 2503 }
71400594
RS
2504 }
2505
2506 if (!mips_opts.mips16)
2507 {
2508 /* Check for GPR or coprocessor load delays. All such delays
2509 are on the RT register. */
2510 /* Itbl support may require additional care here. */
2511 if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
2512 || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
252b5132 2513 {
71400594
RS
2514 know (pinfo1 & INSN_WRITE_GPR_T);
2515 if (INSN2_USES_REG (EXTRACT_OPERAND (RT, *insn1), MIPS_GR_REG))
2516 return 1;
2517 }
2518
2519 /* Check for generic coprocessor hazards.
2520
2521 This case is not handled very well. There is no special
2522 knowledge of CP0 handling, and the coprocessors other than
2523 the floating point unit are not distinguished at all. */
2524 /* Itbl support may require additional care here. FIXME!
2525 Need to modify this to include knowledge about
2526 user specified delays! */
2527 else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
2528 || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
2529 {
2530 /* Handle cases where INSN1 writes to a known general coprocessor
2531 register. There must be a one instruction delay before INSN2
2532 if INSN2 reads that register, otherwise no delay is needed. */
2533 if (pinfo1 & INSN_WRITE_FPR_T)
252b5132 2534 {
71400594
RS
2535 if (INSN2_USES_REG (EXTRACT_OPERAND (FT, *insn1), MIPS_FP_REG))
2536 return 1;
252b5132 2537 }
71400594 2538 else if (pinfo1 & INSN_WRITE_FPR_S)
252b5132 2539 {
71400594
RS
2540 if (INSN2_USES_REG (EXTRACT_OPERAND (FS, *insn1), MIPS_FP_REG))
2541 return 1;
252b5132
RH
2542 }
2543 else
2544 {
71400594
RS
2545 /* Read-after-write dependencies on the control registers
2546 require a two-instruction gap. */
2547 if ((pinfo1 & INSN_WRITE_COND_CODE)
2548 && (pinfo2 & INSN_READ_COND_CODE))
2549 return 2;
2550
2551 /* We don't know exactly what INSN1 does. If INSN2 is
2552 also a coprocessor instruction, assume there must be
2553 a one instruction gap. */
2554 if (pinfo2 & INSN_COP)
2555 return 1;
252b5132
RH
2556 }
2557 }
6b76fefe 2558
71400594
RS
2559 /* Check for read-after-write dependencies on the coprocessor
2560 control registers in cases where INSN1 does not need a general
2561 coprocessor delay. This means that INSN1 is a floating point
2562 comparison instruction. */
2563 /* Itbl support may require additional care here. */
2564 else if (!cop_interlocks
2565 && (pinfo1 & INSN_WRITE_COND_CODE)
2566 && (pinfo2 & INSN_READ_COND_CODE))
2567 return 1;
2568 }
6b76fefe 2569
71400594 2570#undef INSN2_USES_REG
6b76fefe 2571
71400594
RS
2572 return 0;
2573}
6b76fefe 2574
7d8e00cf
RS
2575/* Return the number of nops that would be needed to work around the
2576 VR4130 mflo/mfhi errata if instruction INSN immediately followed
2577 the MAX_VR4130_NOPS instructions described by HISTORY. */
2578
2579static int
2580nops_for_vr4130 (const struct mips_cl_insn *history,
2581 const struct mips_cl_insn *insn)
2582{
2583 int i, j, reg;
2584
2585 /* Check if the instruction writes to HI or LO. MTHI and MTLO
2586 are not affected by the errata. */
2587 if (insn != 0
2588 && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
2589 || strcmp (insn->insn_mo->name, "mtlo") == 0
2590 || strcmp (insn->insn_mo->name, "mthi") == 0))
2591 return 0;
2592
2593 /* Search for the first MFLO or MFHI. */
2594 for (i = 0; i < MAX_VR4130_NOPS; i++)
2595 if (!history[i].noreorder_p && MF_HILO_INSN (history[i].insn_mo->pinfo))
2596 {
2597 /* Extract the destination register. */
2598 if (mips_opts.mips16)
2599 reg = mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, history[i])];
2600 else
2601 reg = EXTRACT_OPERAND (RD, history[i]);
2602
2603 /* No nops are needed if INSN reads that register. */
2604 if (insn != NULL && insn_uses_reg (insn, reg, MIPS_GR_REG))
2605 return 0;
2606
2607 /* ...or if any of the intervening instructions do. */
2608 for (j = 0; j < i; j++)
2609 if (insn_uses_reg (&history[j], reg, MIPS_GR_REG))
2610 return 0;
2611
2612 return MAX_VR4130_NOPS - i;
2613 }
2614 return 0;
2615}
2616
71400594
RS
2617/* Return the number of nops that would be needed if instruction INSN
2618 immediately followed the MAX_NOPS instructions given by HISTORY,
2619 where HISTORY[0] is the most recent instruction. If INSN is null,
2620 return the worse-case number of nops for any instruction. */
bdaaa2e1 2621
71400594
RS
2622static int
2623nops_for_insn (const struct mips_cl_insn *history,
2624 const struct mips_cl_insn *insn)
2625{
2626 int i, nops, tmp_nops;
bdaaa2e1 2627
71400594 2628 nops = 0;
7d8e00cf 2629 for (i = 0; i < MAX_DELAY_NOPS; i++)
71400594
RS
2630 if (!history[i].noreorder_p)
2631 {
2632 tmp_nops = insns_between (history + i, insn) - i;
2633 if (tmp_nops > nops)
2634 nops = tmp_nops;
2635 }
7d8e00cf
RS
2636
2637 if (mips_fix_vr4130)
2638 {
2639 tmp_nops = nops_for_vr4130 (history, insn);
2640 if (tmp_nops > nops)
2641 nops = tmp_nops;
2642 }
2643
71400594
RS
2644 return nops;
2645}
252b5132 2646
71400594
RS
2647/* The variable arguments provide NUM_INSNS extra instructions that
2648 might be added to HISTORY. Return the largest number of nops that
2649 would be needed after the extended sequence. */
252b5132 2650
71400594
RS
2651static int
2652nops_for_sequence (int num_insns, const struct mips_cl_insn *history, ...)
2653{
2654 va_list args;
2655 struct mips_cl_insn buffer[MAX_NOPS];
2656 struct mips_cl_insn *cursor;
2657 int nops;
2658
2659 va_start (args, history);
2660 cursor = buffer + num_insns;
2661 memcpy (cursor, history, (MAX_NOPS - num_insns) * sizeof (*cursor));
2662 while (cursor > buffer)
2663 *--cursor = *va_arg (args, const struct mips_cl_insn *);
2664
2665 nops = nops_for_insn (buffer, NULL);
2666 va_end (args);
2667 return nops;
2668}
252b5132 2669
71400594
RS
2670/* Like nops_for_insn, but if INSN is a branch, take into account the
2671 worst-case delay for the branch target. */
252b5132 2672
71400594
RS
2673static int
2674nops_for_insn_or_target (const struct mips_cl_insn *history,
2675 const struct mips_cl_insn *insn)
2676{
2677 int nops, tmp_nops;
60b63b72 2678
71400594
RS
2679 nops = nops_for_insn (history, insn);
2680 if (insn->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2681 | INSN_COND_BRANCH_DELAY
2682 | INSN_COND_BRANCH_LIKELY))
2683 {
2684 tmp_nops = nops_for_sequence (2, history, insn, NOP_INSN);
2685 if (tmp_nops > nops)
2686 nops = tmp_nops;
2687 }
2688 else if (mips_opts.mips16 && (insn->insn_mo->pinfo & MIPS16_INSN_BRANCH))
2689 {
2690 tmp_nops = nops_for_sequence (1, history, insn);
2691 if (tmp_nops > nops)
2692 nops = tmp_nops;
2693 }
2694 return nops;
2695}
2696
2697/* Output an instruction. IP is the instruction information.
2698 ADDRESS_EXPR is an operand of the instruction to be used with
2699 RELOC_TYPE. */
2700
2701static void
2702append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
2703 bfd_reloc_code_real_type *reloc_type)
2704{
3994f87e 2705 unsigned long prev_pinfo, pinfo;
71400594
RS
2706 relax_stateT prev_insn_frag_type = 0;
2707 bfd_boolean relaxed_branch = FALSE;
a8dbcb85 2708 segment_info_type *si = seg_info (now_seg);
71400594
RS
2709
2710 /* Mark instruction labels in mips16 mode. */
2711 mips16_mark_labels ();
2712
2713 prev_pinfo = history[0].insn_mo->pinfo;
2714 pinfo = ip->insn_mo->pinfo;
2715
2716 if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2717 {
2718 /* There are a lot of optimizations we could do that we don't.
2719 In particular, we do not, in general, reorder instructions.
2720 If you use gcc with optimization, it will reorder
2721 instructions and generally do much more optimization then we
2722 do here; repeating all that work in the assembler would only
2723 benefit hand written assembly code, and does not seem worth
2724 it. */
2725 int nops = (mips_optimize == 0
2726 ? nops_for_insn (history, NULL)
2727 : nops_for_insn_or_target (history, ip));
2728 if (nops > 0)
252b5132
RH
2729 {
2730 fragS *old_frag;
2731 unsigned long old_frag_offset;
2732 int i;
252b5132
RH
2733
2734 old_frag = frag_now;
2735 old_frag_offset = frag_now_fix ();
2736
2737 for (i = 0; i < nops; i++)
2738 emit_nop ();
2739
2740 if (listing)
2741 {
2742 listing_prev_line ();
2743 /* We may be at the start of a variant frag. In case we
2744 are, make sure there is enough space for the frag
2745 after the frags created by listing_prev_line. The
2746 argument to frag_grow here must be at least as large
2747 as the argument to all other calls to frag_grow in
2748 this file. We don't have to worry about being in the
2749 middle of a variant frag, because the variants insert
2750 all needed nop instructions themselves. */
2751 frag_grow (40);
2752 }
2753
404a8071 2754 mips_move_labels ();
252b5132
RH
2755
2756#ifndef NO_ECOFF_DEBUGGING
2757 if (ECOFF_DEBUGGING)
2758 ecoff_fix_loc (old_frag, old_frag_offset);
2759#endif
2760 }
71400594
RS
2761 }
2762 else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
2763 {
2764 /* Work out how many nops in prev_nop_frag are needed by IP. */
2765 int nops = nops_for_insn_or_target (history, ip);
2766 assert (nops <= prev_nop_frag_holds);
252b5132 2767
71400594
RS
2768 /* Enforce NOPS as a minimum. */
2769 if (nops > prev_nop_frag_required)
2770 prev_nop_frag_required = nops;
252b5132 2771
71400594
RS
2772 if (prev_nop_frag_holds == prev_nop_frag_required)
2773 {
2774 /* Settle for the current number of nops. Update the history
2775 accordingly (for the benefit of any future .set reorder code). */
2776 prev_nop_frag = NULL;
2777 insert_into_history (prev_nop_frag_since,
2778 prev_nop_frag_holds, NOP_INSN);
2779 }
2780 else
2781 {
2782 /* Allow this instruction to replace one of the nops that was
2783 tentatively added to prev_nop_frag. */
2784 prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
2785 prev_nop_frag_holds--;
2786 prev_nop_frag_since++;
252b5132
RH
2787 }
2788 }
2789
58e2ea4d
MR
2790#ifdef OBJ_ELF
2791 /* The value passed to dwarf2_emit_insn is the distance between
2792 the beginning of the current instruction and the address that
2793 should be recorded in the debug tables. For MIPS16 debug info
2794 we want to use ISA-encoded addresses, so we pass -1 for an
2795 address higher by one than the current. */
2796 dwarf2_emit_insn (mips_opts.mips16 ? -1 : 0);
2797#endif
2798
895921c9 2799 /* Record the frag type before frag_var. */
47e39b9d
RS
2800 if (history[0].frag)
2801 prev_insn_frag_type = history[0].frag->fr_type;
895921c9 2802
4d7206a2 2803 if (address_expr
0b25d3e6 2804 && *reloc_type == BFD_RELOC_16_PCREL_S2
4a6a3df4
AO
2805 && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
2806 || pinfo & INSN_COND_BRANCH_LIKELY)
2807 && mips_relax_branch
2808 /* Don't try branch relaxation within .set nomacro, or within
2809 .set noat if we use $at for PIC computations. If it turns
2810 out that the branch was out-of-range, we'll get an error. */
2811 && !mips_opts.warn_about_macros
741fe287 2812 && (mips_opts.at || mips_pic == NO_PIC)
4a6a3df4
AO
2813 && !mips_opts.mips16)
2814 {
895921c9 2815 relaxed_branch = TRUE;
1e915849
RS
2816 add_relaxed_insn (ip, (relaxed_branch_length
2817 (NULL, NULL,
2818 (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2819 : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1
2820 : 0)), 4,
2821 RELAX_BRANCH_ENCODE
2822 (pinfo & INSN_UNCOND_BRANCH_DELAY,
2823 pinfo & INSN_COND_BRANCH_LIKELY,
2824 pinfo & INSN_WRITE_GPR_31,
2825 0),
2826 address_expr->X_add_symbol,
2827 address_expr->X_add_number);
4a6a3df4
AO
2828 *reloc_type = BFD_RELOC_UNUSED;
2829 }
2830 else if (*reloc_type > BFD_RELOC_UNUSED)
252b5132
RH
2831 {
2832 /* We need to set up a variant frag. */
2833 assert (mips_opts.mips16 && address_expr != NULL);
1e915849
RS
2834 add_relaxed_insn (ip, 4, 0,
2835 RELAX_MIPS16_ENCODE
2836 (*reloc_type - BFD_RELOC_UNUSED,
2837 mips16_small, mips16_ext,
2838 prev_pinfo & INSN_UNCOND_BRANCH_DELAY,
2839 history[0].mips16_absolute_jump_p),
2840 make_expr_symbol (address_expr), 0);
252b5132 2841 }
252b5132
RH
2842 else if (mips_opts.mips16
2843 && ! ip->use_extend
f6688943 2844 && *reloc_type != BFD_RELOC_MIPS16_JMP)
9497f5ac 2845 {
b8ee1a6e
DU
2846 if ((pinfo & INSN_UNCOND_BRANCH_DELAY) == 0)
2847 /* Make sure there is enough room to swap this instruction with
2848 a following jump instruction. */
2849 frag_grow (6);
1e915849 2850 add_fixed_insn (ip);
252b5132
RH
2851 }
2852 else
2853 {
2854 if (mips_opts.mips16
2855 && mips_opts.noreorder
2856 && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2857 as_warn (_("extended instruction in delay slot"));
2858
4d7206a2
RS
2859 if (mips_relax.sequence)
2860 {
2861 /* If we've reached the end of this frag, turn it into a variant
2862 frag and record the information for the instructions we've
2863 written so far. */
2864 if (frag_room () < 4)
2865 relax_close_frag ();
2866 mips_relax.sizes[mips_relax.sequence - 1] += 4;
2867 }
2868
584892a6
RS
2869 if (mips_relax.sequence != 2)
2870 mips_macro_warning.sizes[0] += 4;
2871 if (mips_relax.sequence != 1)
2872 mips_macro_warning.sizes[1] += 4;
2873
1e915849
RS
2874 if (mips_opts.mips16)
2875 {
2876 ip->fixed_p = 1;
2877 ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
2878 }
2879 add_fixed_insn (ip);
252b5132
RH
2880 }
2881
01a3f561 2882 if (address_expr != NULL && *reloc_type <= BFD_RELOC_UNUSED)
252b5132
RH
2883 {
2884 if (address_expr->X_op == O_constant)
2885 {
f17c130b 2886 unsigned int tmp;
f6688943
TS
2887
2888 switch (*reloc_type)
252b5132
RH
2889 {
2890 case BFD_RELOC_32:
2891 ip->insn_opcode |= address_expr->X_add_number;
2892 break;
2893
f6688943 2894 case BFD_RELOC_MIPS_HIGHEST:
f17c130b
AM
2895 tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
2896 ip->insn_opcode |= tmp & 0xffff;
f6688943
TS
2897 break;
2898
2899 case BFD_RELOC_MIPS_HIGHER:
f17c130b
AM
2900 tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
2901 ip->insn_opcode |= tmp & 0xffff;
f6688943
TS
2902 break;
2903
2904 case BFD_RELOC_HI16_S:
f17c130b
AM
2905 tmp = (address_expr->X_add_number + 0x8000) >> 16;
2906 ip->insn_opcode |= tmp & 0xffff;
f6688943
TS
2907 break;
2908
2909 case BFD_RELOC_HI16:
2910 ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
2911 break;
2912
01a3f561 2913 case BFD_RELOC_UNUSED:
252b5132 2914 case BFD_RELOC_LO16:
ed6fb7bd 2915 case BFD_RELOC_MIPS_GOT_DISP:
252b5132
RH
2916 ip->insn_opcode |= address_expr->X_add_number & 0xffff;
2917 break;
2918
2919 case BFD_RELOC_MIPS_JMP:
2920 if ((address_expr->X_add_number & 3) != 0)
2921 as_bad (_("jump to misaligned address (0x%lx)"),
2922 (unsigned long) address_expr->X_add_number);
2923 ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
2924 break;
2925
2926 case BFD_RELOC_MIPS16_JMP:
2927 if ((address_expr->X_add_number & 3) != 0)
2928 as_bad (_("jump to misaligned address (0x%lx)"),
2929 (unsigned long) address_expr->X_add_number);
2930 ip->insn_opcode |=
2931 (((address_expr->X_add_number & 0x7c0000) << 3)
2932 | ((address_expr->X_add_number & 0xf800000) >> 7)
2933 | ((address_expr->X_add_number & 0x3fffc) >> 2));
2934 break;
2935
252b5132 2936 case BFD_RELOC_16_PCREL_S2:
bad36eac
DJ
2937 if ((address_expr->X_add_number & 3) != 0)
2938 as_bad (_("branch to misaligned address (0x%lx)"),
2939 (unsigned long) address_expr->X_add_number);
2940 if (mips_relax_branch)
2941 goto need_reloc;
2942 if ((address_expr->X_add_number + 0x20000) & ~0x3ffff)
2943 as_bad (_("branch address range overflow (0x%lx)"),
2944 (unsigned long) address_expr->X_add_number);
2945 ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0xffff;
2946 break;
252b5132
RH
2947
2948 default:
2949 internalError ();
2950 }
2951 }
01a3f561 2952 else if (*reloc_type < BFD_RELOC_UNUSED)
252b5132 2953 need_reloc:
4d7206a2
RS
2954 {
2955 reloc_howto_type *howto;
2956 int i;
34ce925e 2957
4d7206a2
RS
2958 /* In a compound relocation, it is the final (outermost)
2959 operator that determines the relocated field. */
2960 for (i = 1; i < 3; i++)
2961 if (reloc_type[i] == BFD_RELOC_UNUSED)
2962 break;
34ce925e 2963
4d7206a2 2964 howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
1e915849
RS
2965 ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
2966 bfd_get_reloc_size (howto),
2967 address_expr,
2968 reloc_type[0] == BFD_RELOC_16_PCREL_S2,
2969 reloc_type[0]);
4d7206a2 2970
b314ec0e
RS
2971 /* Tag symbols that have a R_MIPS16_26 relocation against them. */
2972 if (reloc_type[0] == BFD_RELOC_MIPS16_JMP
2973 && ip->fixp[0]->fx_addsy)
2974 *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
2975
4d7206a2
RS
2976 /* These relocations can have an addend that won't fit in
2977 4 octets for 64bit assembly. */
2978 if (HAVE_64BIT_GPRS
2979 && ! howto->partial_inplace
2980 && (reloc_type[0] == BFD_RELOC_16
2981 || reloc_type[0] == BFD_RELOC_32
2982 || reloc_type[0] == BFD_RELOC_MIPS_JMP
4d7206a2
RS
2983 || reloc_type[0] == BFD_RELOC_GPREL16
2984 || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
2985 || reloc_type[0] == BFD_RELOC_GPREL32
2986 || reloc_type[0] == BFD_RELOC_64
2987 || reloc_type[0] == BFD_RELOC_CTOR
2988 || reloc_type[0] == BFD_RELOC_MIPS_SUB
2989 || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
2990 || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
2991 || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
2992 || reloc_type[0] == BFD_RELOC_MIPS_REL16
d6f16593
MR
2993 || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
2994 || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
738e5348
RS
2995 || hi16_reloc_p (reloc_type[0])
2996 || lo16_reloc_p (reloc_type[0])))
1e915849 2997 ip->fixp[0]->fx_no_overflow = 1;
4d7206a2
RS
2998
2999 if (mips_relax.sequence)
3000 {
3001 if (mips_relax.first_fixup == 0)
1e915849 3002 mips_relax.first_fixup = ip->fixp[0];
4d7206a2
RS
3003 }
3004 else if (reloc_needs_lo_p (*reloc_type))
3005 {
3006 struct mips_hi_fixup *hi_fixup;
252b5132 3007
4d7206a2
RS
3008 /* Reuse the last entry if it already has a matching %lo. */
3009 hi_fixup = mips_hi_fixup_list;
3010 if (hi_fixup == 0
3011 || !fixup_has_matching_lo_p (hi_fixup->fixp))
3012 {
3013 hi_fixup = ((struct mips_hi_fixup *)
3014 xmalloc (sizeof (struct mips_hi_fixup)));
3015 hi_fixup->next = mips_hi_fixup_list;
3016 mips_hi_fixup_list = hi_fixup;
252b5132 3017 }
1e915849 3018 hi_fixup->fixp = ip->fixp[0];
4d7206a2
RS
3019 hi_fixup->seg = now_seg;
3020 }
f6688943 3021
4d7206a2
RS
3022 /* Add fixups for the second and third relocations, if given.
3023 Note that the ABI allows the second relocation to be
3024 against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC. At the
3025 moment we only use RSS_UNDEF, but we could add support
3026 for the others if it ever becomes necessary. */
3027 for (i = 1; i < 3; i++)
3028 if (reloc_type[i] != BFD_RELOC_UNUSED)
3029 {
1e915849
RS
3030 ip->fixp[i] = fix_new (ip->frag, ip->where,
3031 ip->fixp[0]->fx_size, NULL, 0,
3032 FALSE, reloc_type[i]);
b1dca8ee
RS
3033
3034 /* Use fx_tcbit to mark compound relocs. */
1e915849
RS
3035 ip->fixp[0]->fx_tcbit = 1;
3036 ip->fixp[i]->fx_tcbit = 1;
4d7206a2 3037 }
252b5132
RH
3038 }
3039 }
1e915849 3040 install_insn (ip);
252b5132
RH
3041
3042 /* Update the register mask information. */
3043 if (! mips_opts.mips16)
3044 {
3045 if (pinfo & INSN_WRITE_GPR_D)
bf12938e 3046 mips_gprmask |= 1 << EXTRACT_OPERAND (RD, *ip);
252b5132 3047 if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
bf12938e 3048 mips_gprmask |= 1 << EXTRACT_OPERAND (RT, *ip);
252b5132 3049 if (pinfo & INSN_READ_GPR_S)
bf12938e 3050 mips_gprmask |= 1 << EXTRACT_OPERAND (RS, *ip);
252b5132 3051 if (pinfo & INSN_WRITE_GPR_31)
f9419b05 3052 mips_gprmask |= 1 << RA;
252b5132 3053 if (pinfo & INSN_WRITE_FPR_D)
bf12938e 3054 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FD, *ip);
252b5132 3055 if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
bf12938e 3056 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FS, *ip);
252b5132 3057 if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
bf12938e 3058 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FT, *ip);
252b5132 3059 if ((pinfo & INSN_READ_FPR_R) != 0)
bf12938e 3060 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FR, *ip);
252b5132
RH
3061 if (pinfo & INSN_COP)
3062 {
bdaaa2e1
KH
3063 /* We don't keep enough information to sort these cases out.
3064 The itbl support does keep this information however, although
3065 we currently don't support itbl fprmats as part of the cop
3066 instruction. May want to add this support in the future. */
252b5132
RH
3067 }
3068 /* Never set the bit for $0, which is always zero. */
beae10d5 3069 mips_gprmask &= ~1 << 0;
252b5132
RH
3070 }
3071 else
3072 {
3073 if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
bf12938e 3074 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RX, *ip);
252b5132 3075 if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
bf12938e 3076 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RY, *ip);
252b5132 3077 if (pinfo & MIPS16_INSN_WRITE_Z)
bf12938e 3078 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RZ, *ip);
252b5132
RH
3079 if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
3080 mips_gprmask |= 1 << TREG;
3081 if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
3082 mips_gprmask |= 1 << SP;
3083 if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
3084 mips_gprmask |= 1 << RA;
3085 if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
3086 mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
3087 if (pinfo & MIPS16_INSN_READ_Z)
bf12938e 3088 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip);
252b5132 3089 if (pinfo & MIPS16_INSN_READ_GPR_X)
bf12938e 3090 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
252b5132
RH
3091 }
3092
4d7206a2 3093 if (mips_relax.sequence != 2 && !mips_opts.noreorder)
252b5132
RH
3094 {
3095 /* Filling the branch delay slot is more complex. We try to
3096 switch the branch with the previous instruction, which we can
3097 do if the previous instruction does not set up a condition
3098 that the branch tests and if the branch is not itself the
3099 target of any branch. */
3100 if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
3101 || (pinfo & INSN_COND_BRANCH_DELAY))
3102 {
3103 if (mips_optimize < 2
3104 /* If we have seen .set volatile or .set nomove, don't
3105 optimize. */
3106 || mips_opts.nomove != 0
a38419a5
RS
3107 /* We can't swap if the previous instruction's position
3108 is fixed. */
3109 || history[0].fixed_p
252b5132
RH
3110 /* If the previous previous insn was in a .set
3111 noreorder, we can't swap. Actually, the MIPS
3112 assembler will swap in this situation. However, gcc
3113 configured -with-gnu-as will generate code like
3114 .set noreorder
3115 lw $4,XXX
3116 .set reorder
3117 INSN
3118 bne $4,$0,foo
3119 in which we can not swap the bne and INSN. If gcc is
3120 not configured -with-gnu-as, it does not output the
a38419a5 3121 .set pseudo-ops. */
47e39b9d 3122 || history[1].noreorder_p
252b5132
RH
3123 /* If the branch is itself the target of a branch, we
3124 can not swap. We cheat on this; all we check for is
3125 whether there is a label on this instruction. If
3126 there are any branches to anything other than a
3127 label, users must use .set noreorder. */
a8dbcb85 3128 || si->label_list != NULL
895921c9
MR
3129 /* If the previous instruction is in a variant frag
3130 other than this branch's one, we cannot do the swap.
3131 This does not apply to the mips16, which uses variant
3132 frags for different purposes. */
252b5132 3133 || (! mips_opts.mips16
895921c9 3134 && prev_insn_frag_type == rs_machine_dependent)
71400594
RS
3135 /* Check for conflicts between the branch and the instructions
3136 before the candidate delay slot. */
3137 || nops_for_insn (history + 1, ip) > 0
3138 /* Check for conflicts between the swapped sequence and the
3139 target of the branch. */
3140 || nops_for_sequence (2, history + 1, ip, history) > 0
252b5132
RH
3141 /* We do not swap with a trap instruction, since it
3142 complicates trap handlers to have the trap
3143 instruction be in a delay slot. */
3144 || (prev_pinfo & INSN_TRAP)
3145 /* If the branch reads a register that the previous
3146 instruction sets, we can not swap. */
3147 || (! mips_opts.mips16
3148 && (prev_pinfo & INSN_WRITE_GPR_T)
bf12938e 3149 && insn_uses_reg (ip, EXTRACT_OPERAND (RT, history[0]),
252b5132
RH
3150 MIPS_GR_REG))
3151 || (! mips_opts.mips16
3152 && (prev_pinfo & INSN_WRITE_GPR_D)
bf12938e 3153 && insn_uses_reg (ip, EXTRACT_OPERAND (RD, history[0]),
252b5132
RH
3154 MIPS_GR_REG))
3155 || (mips_opts.mips16
3156 && (((prev_pinfo & MIPS16_INSN_WRITE_X)
bf12938e
RS
3157 && (insn_uses_reg
3158 (ip, MIPS16_EXTRACT_OPERAND (RX, history[0]),
3159 MIPS16_REG)))
252b5132 3160 || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
bf12938e
RS
3161 && (insn_uses_reg
3162 (ip, MIPS16_EXTRACT_OPERAND (RY, history[0]),
3163 MIPS16_REG)))
252b5132 3164 || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
bf12938e
RS
3165 && (insn_uses_reg
3166 (ip, MIPS16_EXTRACT_OPERAND (RZ, history[0]),
3167 MIPS16_REG)))
252b5132
RH
3168 || ((prev_pinfo & MIPS16_INSN_WRITE_T)
3169 && insn_uses_reg (ip, TREG, MIPS_GR_REG))
3170 || ((prev_pinfo & MIPS16_INSN_WRITE_31)
3171 && insn_uses_reg (ip, RA, MIPS_GR_REG))
3172 || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3173 && insn_uses_reg (ip,
47e39b9d
RS
3174 MIPS16OP_EXTRACT_REG32R
3175 (history[0].insn_opcode),
252b5132
RH
3176 MIPS_GR_REG))))
3177 /* If the branch writes a register that the previous
3178 instruction sets, we can not swap (we know that
3179 branches write only to RD or to $31). */
3180 || (! mips_opts.mips16
3181 && (prev_pinfo & INSN_WRITE_GPR_T)
3182 && (((pinfo & INSN_WRITE_GPR_D)
bf12938e
RS
3183 && (EXTRACT_OPERAND (RT, history[0])
3184 == EXTRACT_OPERAND (RD, *ip)))
252b5132 3185 || ((pinfo & INSN_WRITE_GPR_31)
bf12938e 3186 && EXTRACT_OPERAND (RT, history[0]) == RA)))
252b5132
RH
3187 || (! mips_opts.mips16
3188 && (prev_pinfo & INSN_WRITE_GPR_D)
3189 && (((pinfo & INSN_WRITE_GPR_D)
bf12938e
RS
3190 && (EXTRACT_OPERAND (RD, history[0])
3191 == EXTRACT_OPERAND (RD, *ip)))
252b5132 3192 || ((pinfo & INSN_WRITE_GPR_31)
bf12938e 3193 && EXTRACT_OPERAND (RD, history[0]) == RA)))
252b5132
RH
3194 || (mips_opts.mips16
3195 && (pinfo & MIPS16_INSN_WRITE_31)
3196 && ((prev_pinfo & MIPS16_INSN_WRITE_31)
3197 || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
47e39b9d 3198 && (MIPS16OP_EXTRACT_REG32R (history[0].insn_opcode)
252b5132
RH
3199 == RA))))
3200 /* If the branch writes a register that the previous
3201 instruction reads, we can not swap (we know that
3202 branches only write to RD or to $31). */
3203 || (! mips_opts.mips16
3204 && (pinfo & INSN_WRITE_GPR_D)
47e39b9d 3205 && insn_uses_reg (&history[0],
bf12938e 3206 EXTRACT_OPERAND (RD, *ip),
252b5132
RH
3207 MIPS_GR_REG))
3208 || (! mips_opts.mips16
3209 && (pinfo & INSN_WRITE_GPR_31)
47e39b9d 3210 && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
252b5132
RH
3211 || (mips_opts.mips16
3212 && (pinfo & MIPS16_INSN_WRITE_31)
47e39b9d 3213 && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
252b5132
RH
3214 /* If one instruction sets a condition code and the
3215 other one uses a condition code, we can not swap. */
3216 || ((pinfo & INSN_READ_COND_CODE)
3217 && (prev_pinfo & INSN_WRITE_COND_CODE))
3218 || ((pinfo & INSN_WRITE_COND_CODE)
3219 && (prev_pinfo & INSN_READ_COND_CODE))
3220 /* If the previous instruction uses the PC, we can not
3221 swap. */
3222 || (mips_opts.mips16
3223 && (prev_pinfo & MIPS16_INSN_READ_PC))
252b5132
RH
3224 /* If the previous instruction had a fixup in mips16
3225 mode, we can not swap. This normally means that the
3226 previous instruction was a 4 byte branch anyhow. */
47e39b9d 3227 || (mips_opts.mips16 && history[0].fixp[0])
bdaaa2e1
KH
3228 /* If the previous instruction is a sync, sync.l, or
3229 sync.p, we can not swap. */
f173e82e 3230 || (prev_pinfo & INSN_SYNC))
252b5132 3231 {
29024861
DU
3232 if (mips_opts.mips16
3233 && (pinfo & INSN_UNCOND_BRANCH_DELAY)
3234 && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31))
3994f87e 3235 && ISA_SUPPORTS_MIPS16E)
29024861
DU
3236 {
3237 /* Convert MIPS16 jr/jalr into a "compact" jump. */
3238 ip->insn_opcode |= 0x0080;
3239 install_insn (ip);
3240 insert_into_history (0, 1, ip);
3241 }
3242 else
3243 {
3244 /* We could do even better for unconditional branches to
3245 portions of this object file; we could pick up the
3246 instruction at the destination, put it in the delay
3247 slot, and bump the destination address. */
3248 insert_into_history (0, 1, ip);
3249 emit_nop ();
3250 }
3251
dd22970f
ILT
3252 if (mips_relax.sequence)
3253 mips_relax.sizes[mips_relax.sequence - 1] += 4;
252b5132
RH
3254 }
3255 else
3256 {
3257 /* It looks like we can actually do the swap. */
1e915849
RS
3258 struct mips_cl_insn delay = history[0];
3259 if (mips_opts.mips16)
252b5132 3260 {
b8ee1a6e
DU
3261 know (delay.frag == ip->frag);
3262 move_insn (ip, delay.frag, delay.where);
3263 move_insn (&delay, ip->frag, ip->where + insn_length (ip));
1e915849
RS
3264 }
3265 else if (relaxed_branch)
3266 {
3267 /* Add the delay slot instruction to the end of the
3268 current frag and shrink the fixed part of the
3269 original frag. If the branch occupies the tail of
3270 the latter, move it backwards to cover the gap. */
3271 delay.frag->fr_fix -= 4;
3272 if (delay.frag == ip->frag)
3273 move_insn (ip, ip->frag, ip->where - 4);
3274 add_fixed_insn (&delay);
252b5132
RH
3275 }
3276 else
3277 {
1e915849
RS
3278 move_insn (&delay, ip->frag, ip->where);
3279 move_insn (ip, history[0].frag, history[0].where);
252b5132 3280 }
1e915849
RS
3281 history[0] = *ip;
3282 delay.fixed_p = 1;
3283 insert_into_history (0, 1, &delay);
252b5132 3284 }
252b5132
RH
3285
3286 /* If that was an unconditional branch, forget the previous
3287 insn information. */
3288 if (pinfo & INSN_UNCOND_BRANCH_DELAY)
7d10b47d 3289 mips_no_prev_insn ();
252b5132
RH
3290 }
3291 else if (pinfo & INSN_COND_BRANCH_LIKELY)
3292 {
3293 /* We don't yet optimize a branch likely. What we should do
3294 is look at the target, copy the instruction found there
3295 into the delay slot, and increment the branch to jump to
3296 the next instruction. */
1e915849 3297 insert_into_history (0, 1, ip);
252b5132 3298 emit_nop ();
252b5132
RH
3299 }
3300 else
1e915849 3301 insert_into_history (0, 1, ip);
252b5132 3302 }
1e915849
RS
3303 else
3304 insert_into_history (0, 1, ip);
252b5132
RH
3305
3306 /* We just output an insn, so the next one doesn't have a label. */
3307 mips_clear_insn_labels ();
252b5132
RH
3308}
3309
7d10b47d 3310/* Forget that there was any previous instruction or label. */
252b5132
RH
3311
3312static void
7d10b47d 3313mips_no_prev_insn (void)
252b5132 3314{
7d10b47d
RS
3315 prev_nop_frag = NULL;
3316 insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
252b5132
RH
3317 mips_clear_insn_labels ();
3318}
3319
7d10b47d
RS
3320/* This function must be called before we emit something other than
3321 instructions. It is like mips_no_prev_insn except that it inserts
3322 any NOPS that might be needed by previous instructions. */
252b5132 3323
7d10b47d
RS
3324void
3325mips_emit_delays (void)
252b5132
RH
3326{
3327 if (! mips_opts.noreorder)
3328 {
71400594 3329 int nops = nops_for_insn (history, NULL);
252b5132
RH
3330 if (nops > 0)
3331 {
7d10b47d
RS
3332 while (nops-- > 0)
3333 add_fixed_insn (NOP_INSN);
3334 mips_move_labels ();
3335 }
3336 }
3337 mips_no_prev_insn ();
3338}
3339
3340/* Start a (possibly nested) noreorder block. */
3341
3342static void
3343start_noreorder (void)
3344{
3345 if (mips_opts.noreorder == 0)
3346 {
3347 unsigned int i;
3348 int nops;
3349
3350 /* None of the instructions before the .set noreorder can be moved. */
3351 for (i = 0; i < ARRAY_SIZE (history); i++)
3352 history[i].fixed_p = 1;
3353
3354 /* Insert any nops that might be needed between the .set noreorder
3355 block and the previous instructions. We will later remove any
3356 nops that turn out not to be needed. */
3357 nops = nops_for_insn (history, NULL);
3358 if (nops > 0)
3359 {
3360 if (mips_optimize != 0)
252b5132
RH
3361 {
3362 /* Record the frag which holds the nop instructions, so
3363 that we can remove them if we don't need them. */
3364 frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
3365 prev_nop_frag = frag_now;
3366 prev_nop_frag_holds = nops;
3367 prev_nop_frag_required = 0;
3368 prev_nop_frag_since = 0;
3369 }
3370
3371 for (; nops > 0; --nops)
1e915849 3372 add_fixed_insn (NOP_INSN);
252b5132 3373
7d10b47d
RS
3374 /* Move on to a new frag, so that it is safe to simply
3375 decrease the size of prev_nop_frag. */
3376 frag_wane (frag_now);
3377 frag_new (0);
404a8071 3378 mips_move_labels ();
252b5132 3379 }
7d10b47d
RS
3380 mips16_mark_labels ();
3381 mips_clear_insn_labels ();
252b5132 3382 }
7d10b47d
RS
3383 mips_opts.noreorder++;
3384 mips_any_noreorder = 1;
3385}
252b5132 3386
7d10b47d 3387/* End a nested noreorder block. */
252b5132 3388
7d10b47d
RS
3389static void
3390end_noreorder (void)
3391{
3392 mips_opts.noreorder--;
3393 if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
3394 {
3395 /* Commit to inserting prev_nop_frag_required nops and go back to
3396 handling nop insertion the .set reorder way. */
3397 prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
3398 * (mips_opts.mips16 ? 2 : 4));
3399 insert_into_history (prev_nop_frag_since,
3400 prev_nop_frag_required, NOP_INSN);
3401 prev_nop_frag = NULL;
3402 }
252b5132
RH
3403}
3404
584892a6
RS
3405/* Set up global variables for the start of a new macro. */
3406
3407static void
3408macro_start (void)
3409{
3410 memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
3411 mips_macro_warning.delay_slot_p = (mips_opts.noreorder
47e39b9d 3412 && (history[0].insn_mo->pinfo
584892a6
RS
3413 & (INSN_UNCOND_BRANCH_DELAY
3414 | INSN_COND_BRANCH_DELAY
3415 | INSN_COND_BRANCH_LIKELY)) != 0);
3416}
3417
3418/* Given that a macro is longer than 4 bytes, return the appropriate warning
3419 for it. Return null if no warning is needed. SUBTYPE is a bitmask of
3420 RELAX_DELAY_SLOT and RELAX_NOMACRO. */
3421
3422static const char *
3423macro_warning (relax_substateT subtype)
3424{
3425 if (subtype & RELAX_DELAY_SLOT)
3426 return _("Macro instruction expanded into multiple instructions"
3427 " in a branch delay slot");
3428 else if (subtype & RELAX_NOMACRO)
3429 return _("Macro instruction expanded into multiple instructions");
3430 else
3431 return 0;
3432}
3433
3434/* Finish up a macro. Emit warnings as appropriate. */
3435
3436static void
3437macro_end (void)
3438{
3439 if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
3440 {
3441 relax_substateT subtype;
3442
3443 /* Set up the relaxation warning flags. */
3444 subtype = 0;
3445 if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
3446 subtype |= RELAX_SECOND_LONGER;
3447 if (mips_opts.warn_about_macros)
3448 subtype |= RELAX_NOMACRO;
3449 if (mips_macro_warning.delay_slot_p)
3450 subtype |= RELAX_DELAY_SLOT;
3451
3452 if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
3453 {
3454 /* Either the macro has a single implementation or both
3455 implementations are longer than 4 bytes. Emit the
3456 warning now. */
3457 const char *msg = macro_warning (subtype);
3458 if (msg != 0)
3459 as_warn (msg);
3460 }
3461 else
3462 {
3463 /* One implementation might need a warning but the other
3464 definitely doesn't. */
3465 mips_macro_warning.first_frag->fr_subtype |= subtype;
3466 }
3467 }
3468}
3469
6e1304d8
RS
3470/* Read a macro's relocation codes from *ARGS and store them in *R.
3471 The first argument in *ARGS will be either the code for a single
3472 relocation or -1 followed by the three codes that make up a
3473 composite relocation. */
3474
3475static void
3476macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
3477{
3478 int i, next;
3479
3480 next = va_arg (*args, int);
3481 if (next >= 0)
3482 r[0] = (bfd_reloc_code_real_type) next;
3483 else
3484 for (i = 0; i < 3; i++)
3485 r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
3486}
3487
252b5132
RH
3488/* Build an instruction created by a macro expansion. This is passed
3489 a pointer to the count of instructions created so far, an
3490 expression, the name of the instruction to build, an operand format
3491 string, and corresponding arguments. */
3492
252b5132 3493static void
67c0d1eb 3494macro_build (expressionS *ep, const char *name, const char *fmt, ...)
252b5132 3495{
1e915849 3496 const struct mips_opcode *mo;
252b5132 3497 struct mips_cl_insn insn;
f6688943 3498 bfd_reloc_code_real_type r[3];
252b5132 3499 va_list args;
252b5132 3500
252b5132 3501 va_start (args, fmt);
252b5132 3502
252b5132
RH
3503 if (mips_opts.mips16)
3504 {
67c0d1eb 3505 mips16_macro_build (ep, name, fmt, args);
252b5132
RH
3506 va_end (args);
3507 return;
3508 }
3509
f6688943
TS
3510 r[0] = BFD_RELOC_UNUSED;
3511 r[1] = BFD_RELOC_UNUSED;
3512 r[2] = BFD_RELOC_UNUSED;
1e915849
RS
3513 mo = (struct mips_opcode *) hash_find (op_hash, name);
3514 assert (mo);
3515 assert (strcmp (name, mo->name) == 0);
3516
8b082fb1
TS
3517 while (1)
3518 {
3519 /* Search until we get a match for NAME. It is assumed here that
3520 macros will never generate MDMX, MIPS-3D, or MT instructions. */
3521 if (strcmp (fmt, mo->args) == 0
3522 && mo->pinfo != INSN_MACRO
037b32b9 3523 && is_opcode_valid (mo, TRUE))
8b082fb1
TS
3524 break;
3525
1e915849
RS
3526 ++mo;
3527 assert (mo->name);
3528 assert (strcmp (name, mo->name) == 0);
252b5132
RH
3529 }
3530
1e915849 3531 create_insn (&insn, mo);
252b5132
RH
3532 for (;;)
3533 {
3534 switch (*fmt++)
3535 {
3536 case '\0':
3537 break;
3538
3539 case ',':
3540 case '(':
3541 case ')':
3542 continue;
3543
5f74bc13
CD
3544 case '+':
3545 switch (*fmt++)
3546 {
3547 case 'A':
3548 case 'E':
bf12938e 3549 INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
5f74bc13
CD
3550 continue;
3551
3552 case 'B':
3553 case 'F':
3554 /* Note that in the macro case, these arguments are already
3555 in MSB form. (When handling the instruction in the
3556 non-macro case, these arguments are sizes from which
3557 MSB values must be calculated.) */
bf12938e 3558 INSERT_OPERAND (INSMSB, insn, va_arg (args, int));
5f74bc13
CD
3559 continue;
3560
3561 case 'C':
3562 case 'G':
3563 case 'H':
3564 /* Note that in the macro case, these arguments are already
3565 in MSBD form. (When handling the instruction in the
3566 non-macro case, these arguments are sizes from which
3567 MSBD values must be calculated.) */
bf12938e 3568 INSERT_OPERAND (EXTMSBD, insn, va_arg (args, int));
5f74bc13
CD
3569 continue;
3570
dd3cbb7e
NC
3571 case 'Q':
3572 INSERT_OPERAND (SEQI, insn, va_arg (args, int));
3573 continue;
3574
5f74bc13
CD
3575 default:
3576 internalError ();
3577 }
3578 continue;
3579
8b082fb1
TS
3580 case '2':
3581 INSERT_OPERAND (BP, insn, va_arg (args, int));
3582 continue;
3583
252b5132
RH
3584 case 't':
3585 case 'w':
3586 case 'E':
bf12938e 3587 INSERT_OPERAND (RT, insn, va_arg (args, int));
252b5132
RH
3588 continue;
3589
3590 case 'c':
bf12938e 3591 INSERT_OPERAND (CODE, insn, va_arg (args, int));
38487616
TS
3592 continue;
3593
252b5132
RH
3594 case 'T':
3595 case 'W':
bf12938e 3596 INSERT_OPERAND (FT, insn, va_arg (args, int));
252b5132
RH
3597 continue;
3598
3599 case 'd':
3600 case 'G':
af7ee8bf 3601 case 'K':
bf12938e 3602 INSERT_OPERAND (RD, insn, va_arg (args, int));
252b5132
RH
3603 continue;
3604
4372b673
NC
3605 case 'U':
3606 {
3607 int tmp = va_arg (args, int);
3608
bf12938e
RS
3609 INSERT_OPERAND (RT, insn, tmp);
3610 INSERT_OPERAND (RD, insn, tmp);
beae10d5 3611 continue;
4372b673
NC
3612 }
3613
252b5132
RH
3614 case 'V':
3615 case 'S':
bf12938e 3616 INSERT_OPERAND (FS, insn, va_arg (args, int));
252b5132
RH
3617 continue;
3618
3619 case 'z':
3620 continue;
3621
3622 case '<':
bf12938e 3623 INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
252b5132
RH
3624 continue;
3625
3626 case 'D':
bf12938e 3627 INSERT_OPERAND (FD, insn, va_arg (args, int));
252b5132
RH
3628 continue;
3629
3630 case 'B':
bf12938e 3631 INSERT_OPERAND (CODE20, insn, va_arg (args, int));
252b5132
RH
3632 continue;
3633
4372b673 3634 case 'J':
bf12938e 3635 INSERT_OPERAND (CODE19, insn, va_arg (args, int));
4372b673
NC
3636 continue;
3637
252b5132 3638 case 'q':
bf12938e 3639 INSERT_OPERAND (CODE2, insn, va_arg (args, int));
252b5132
RH
3640 continue;
3641
3642 case 'b':
3643 case 's':
3644 case 'r':
3645 case 'v':
bf12938e 3646 INSERT_OPERAND (RS, insn, va_arg (args, int));
252b5132
RH
3647 continue;
3648
3649 case 'i':
3650 case 'j':
3651 case 'o':
6e1304d8 3652 macro_read_relocs (&args, r);
cdf6fd85 3653 assert (*r == BFD_RELOC_GPREL16
f6688943
TS
3654 || *r == BFD_RELOC_MIPS_LITERAL
3655 || *r == BFD_RELOC_MIPS_HIGHER
3656 || *r == BFD_RELOC_HI16_S
3657 || *r == BFD_RELOC_LO16
3658 || *r == BFD_RELOC_MIPS_GOT16
3659 || *r == BFD_RELOC_MIPS_CALL16
438c16b8
TS
3660 || *r == BFD_RELOC_MIPS_GOT_DISP
3661 || *r == BFD_RELOC_MIPS_GOT_PAGE
3662 || *r == BFD_RELOC_MIPS_GOT_OFST
f6688943 3663 || *r == BFD_RELOC_MIPS_GOT_LO16
3e722fb5 3664 || *r == BFD_RELOC_MIPS_CALL_LO16);
252b5132
RH
3665 continue;
3666
3667 case 'u':
6e1304d8 3668 macro_read_relocs (&args, r);
252b5132
RH
3669 assert (ep != NULL
3670 && (ep->X_op == O_constant
3671 || (ep->X_op == O_symbol
f6688943
TS
3672 && (*r == BFD_RELOC_MIPS_HIGHEST
3673 || *r == BFD_RELOC_HI16_S
3674 || *r == BFD_RELOC_HI16
3675 || *r == BFD_RELOC_GPREL16
3676 || *r == BFD_RELOC_MIPS_GOT_HI16
3e722fb5 3677 || *r == BFD_RELOC_MIPS_CALL_HI16))));
252b5132
RH
3678 continue;
3679
3680 case 'p':
3681 assert (ep != NULL);
bad36eac 3682
252b5132
RH
3683 /*
3684 * This allows macro() to pass an immediate expression for
3685 * creating short branches without creating a symbol.
bad36eac
DJ
3686 *
3687 * We don't allow branch relaxation for these branches, as
3688 * they should only appear in ".set nomacro" anyway.
252b5132
RH
3689 */
3690 if (ep->X_op == O_constant)
3691 {
bad36eac
DJ
3692 if ((ep->X_add_number & 3) != 0)
3693 as_bad (_("branch to misaligned address (0x%lx)"),
3694 (unsigned long) ep->X_add_number);
3695 if ((ep->X_add_number + 0x20000) & ~0x3ffff)
3696 as_bad (_("branch address range overflow (0x%lx)"),
3697 (unsigned long) ep->X_add_number);
252b5132
RH
3698 insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3699 ep = NULL;
3700 }
3701 else
0b25d3e6 3702 *r = BFD_RELOC_16_PCREL_S2;
252b5132
RH
3703 continue;
3704
3705 case 'a':
3706 assert (ep != NULL);
f6688943 3707 *r = BFD_RELOC_MIPS_JMP;
252b5132
RH
3708 continue;
3709
3710 case 'C':
a9e24354 3711 INSERT_OPERAND (COPZ, insn, va_arg (args, unsigned long));
252b5132
RH
3712 continue;
3713
d43b4baf 3714 case 'k':
a9e24354 3715 INSERT_OPERAND (CACHE, insn, va_arg (args, unsigned long));
d43b4baf
TS
3716 continue;
3717
252b5132
RH
3718 default:
3719 internalError ();
3720 }
3721 break;
3722 }
3723 va_end (args);
f6688943 3724 assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
252b5132 3725
4d7206a2 3726 append_insn (&insn, ep, r);
252b5132
RH
3727}
3728
3729static void
67c0d1eb 3730mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
17a2f251 3731 va_list args)
252b5132 3732{
1e915849 3733 struct mips_opcode *mo;
252b5132 3734 struct mips_cl_insn insn;
f6688943
TS
3735 bfd_reloc_code_real_type r[3]
3736 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
252b5132 3737
1e915849
RS
3738 mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
3739 assert (mo);
3740 assert (strcmp (name, mo->name) == 0);
252b5132 3741
1e915849 3742 while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
252b5132 3743 {
1e915849
RS
3744 ++mo;
3745 assert (mo->name);
3746 assert (strcmp (name, mo->name) == 0);
252b5132
RH
3747 }
3748
1e915849 3749 create_insn (&insn, mo);
252b5132
RH
3750 for (;;)
3751 {
3752 int c;
3753
3754 c = *fmt++;
3755 switch (c)
3756 {
3757 case '\0':
3758 break;
3759
3760 case ',':
3761 case '(':
3762 case ')':
3763 continue;
3764
3765 case 'y':
3766 case 'w':
bf12938e 3767 MIPS16_INSERT_OPERAND (RY, insn, va_arg (args, int));
252b5132
RH
3768 continue;
3769
3770 case 'x':
3771 case 'v':
bf12938e 3772 MIPS16_INSERT_OPERAND (RX, insn, va_arg (args, int));
252b5132
RH
3773 continue;
3774
3775 case 'z':
bf12938e 3776 MIPS16_INSERT_OPERAND (RZ, insn, va_arg (args, int));
252b5132
RH
3777 continue;
3778
3779 case 'Z':
bf12938e 3780 MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (args, int));
252b5132
RH
3781 continue;
3782
3783 case '0':
3784 case 'S':
3785 case 'P':
3786 case 'R':
3787 continue;
3788
3789 case 'X':
bf12938e 3790 MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (args, int));
252b5132
RH
3791 continue;
3792
3793 case 'Y':
3794 {
3795 int regno;
3796
3797 regno = va_arg (args, int);
3798 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
a9e24354 3799 MIPS16_INSERT_OPERAND (REG32R, insn, regno);
252b5132
RH
3800 }
3801 continue;
3802
3803 case '<':
3804 case '>':
3805 case '4':
3806 case '5':
3807 case 'H':
3808 case 'W':
3809 case 'D':
3810 case 'j':
3811 case '8':
3812 case 'V':
3813 case 'C':
3814 case 'U':
3815 case 'k':
3816 case 'K':
3817 case 'p':
3818 case 'q':
3819 {
3820 assert (ep != NULL);
3821
3822 if (ep->X_op != O_constant)
874e8986 3823 *r = (int) BFD_RELOC_UNUSED + c;
252b5132
RH
3824 else
3825 {
b34976b6
AM
3826 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3827 FALSE, &insn.insn_opcode, &insn.use_extend,
c4e7957c 3828 &insn.extend);
252b5132 3829 ep = NULL;
f6688943 3830 *r = BFD_RELOC_UNUSED;
252b5132
RH
3831 }
3832 }
3833 continue;
3834
3835 case '6':
bf12938e 3836 MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (args, int));
252b5132
RH
3837 continue;
3838 }
3839
3840 break;
3841 }
3842
f6688943 3843 assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
252b5132 3844
4d7206a2 3845 append_insn (&insn, ep, r);
252b5132
RH
3846}
3847
2051e8c4
MR
3848/*
3849 * Sign-extend 32-bit mode constants that have bit 31 set and all
3850 * higher bits unset.
3851 */
9f872bbe 3852static void
2051e8c4
MR
3853normalize_constant_expr (expressionS *ex)
3854{
9ee2a2d4 3855 if (ex->X_op == O_constant
2051e8c4
MR
3856 && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3857 ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3858 - 0x80000000);
3859}
3860
3861/*
3862 * Sign-extend 32-bit mode address offsets that have bit 31 set and
3863 * all higher bits unset.
3864 */
3865static void
3866normalize_address_expr (expressionS *ex)
3867{
3868 if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
3869 || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
3870 && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3871 ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3872 - 0x80000000);
3873}
3874
438c16b8
TS
3875/*
3876 * Generate a "jalr" instruction with a relocation hint to the called
3877 * function. This occurs in NewABI PIC code.
3878 */
3879static void
67c0d1eb 3880macro_build_jalr (expressionS *ep)
438c16b8 3881{
685736be 3882 char *f = NULL;
b34976b6 3883
438c16b8 3884 if (HAVE_NEWABI)
f21f8242 3885 {
cc3d92a5 3886 frag_grow (8);
f21f8242
AO
3887 f = frag_more (0);
3888 }
67c0d1eb 3889 macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
438c16b8 3890 if (HAVE_NEWABI)
f21f8242 3891 fix_new_exp (frag_now, f - frag_now->fr_literal,
a105a300 3892 4, ep, FALSE, BFD_RELOC_MIPS_JALR);
438c16b8
TS
3893}
3894
252b5132
RH
3895/*
3896 * Generate a "lui" instruction.
3897 */
3898static void
67c0d1eb 3899macro_build_lui (expressionS *ep, int regnum)
252b5132
RH
3900{
3901 expressionS high_expr;
1e915849 3902 const struct mips_opcode *mo;
252b5132 3903 struct mips_cl_insn insn;
f6688943
TS
3904 bfd_reloc_code_real_type r[3]
3905 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
5a38dc70
AM
3906 const char *name = "lui";
3907 const char *fmt = "t,u";
252b5132
RH
3908
3909 assert (! mips_opts.mips16);
3910
4d7206a2 3911 high_expr = *ep;
252b5132
RH
3912
3913 if (high_expr.X_op == O_constant)
3914 {
54f4ddb3 3915 /* We can compute the instruction now without a relocation entry. */
e7d556df
TS
3916 high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
3917 >> 16) & 0xffff;
f6688943 3918 *r = BFD_RELOC_UNUSED;
252b5132 3919 }
78e1bb40 3920 else
252b5132
RH
3921 {
3922 assert (ep->X_op == O_symbol);
bbe506e8
TS
3923 /* _gp_disp is a special case, used from s_cpload.
3924 __gnu_local_gp is used if mips_no_shared. */
252b5132 3925 assert (mips_pic == NO_PIC
78e1bb40 3926 || (! HAVE_NEWABI
aa6975fb
ILT
3927 && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
3928 || (! mips_in_shared
bbe506e8
TS
3929 && strcmp (S_GET_NAME (ep->X_add_symbol),
3930 "__gnu_local_gp") == 0));
f6688943 3931 *r = BFD_RELOC_HI16_S;
252b5132
RH
3932 }
3933
1e915849
RS
3934 mo = hash_find (op_hash, name);
3935 assert (strcmp (name, mo->name) == 0);
3936 assert (strcmp (fmt, mo->args) == 0);
3937 create_insn (&insn, mo);
252b5132 3938
bf12938e
RS
3939 insn.insn_opcode = insn.insn_mo->match;
3940 INSERT_OPERAND (RT, insn, regnum);
f6688943 3941 if (*r == BFD_RELOC_UNUSED)
252b5132
RH
3942 {
3943 insn.insn_opcode |= high_expr.X_add_number;
4d7206a2 3944 append_insn (&insn, NULL, r);
252b5132
RH
3945 }
3946 else
4d7206a2 3947 append_insn (&insn, &high_expr, r);
252b5132
RH
3948}
3949
885add95
CD
3950/* Generate a sequence of instructions to do a load or store from a constant
3951 offset off of a base register (breg) into/from a target register (treg),
3952 using AT if necessary. */
3953static void
67c0d1eb
RS
3954macro_build_ldst_constoffset (expressionS *ep, const char *op,
3955 int treg, int breg, int dbl)
885add95
CD
3956{
3957 assert (ep->X_op == O_constant);
3958
256ab948 3959 /* Sign-extending 32-bit constants makes their handling easier. */
2051e8c4
MR
3960 if (!dbl)
3961 normalize_constant_expr (ep);
256ab948 3962
67c1ffbe 3963 /* Right now, this routine can only handle signed 32-bit constants. */
ecd13cd3 3964 if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
885add95
CD
3965 as_warn (_("operand overflow"));
3966
3967 if (IS_SEXT_16BIT_NUM(ep->X_add_number))
3968 {
3969 /* Signed 16-bit offset will fit in the op. Easy! */
67c0d1eb 3970 macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
885add95
CD
3971 }
3972 else
3973 {
3974 /* 32-bit offset, need multiple instructions and AT, like:
3975 lui $tempreg,const_hi (BFD_RELOC_HI16_S)
3976 addu $tempreg,$tempreg,$breg
3977 <op> $treg,const_lo($tempreg) (BFD_RELOC_LO16)
3978 to handle the complete offset. */
67c0d1eb
RS
3979 macro_build_lui (ep, AT);
3980 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
3981 macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
885add95 3982
741fe287 3983 if (!mips_opts.at)
8fc2e39e 3984 as_bad (_("Macro used $at after \".set noat\""));
885add95
CD
3985 }
3986}
3987
252b5132
RH
3988/* set_at()
3989 * Generates code to set the $at register to true (one)
3990 * if reg is less than the immediate expression.
3991 */
3992static void
67c0d1eb 3993set_at (int reg, int unsignedp)
252b5132
RH
3994{
3995 if (imm_expr.X_op == O_constant
3996 && imm_expr.X_add_number >= -0x8000
3997 && imm_expr.X_add_number < 0x8000)
67c0d1eb
RS
3998 macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
3999 AT, reg, BFD_RELOC_LO16);
252b5132
RH
4000 else
4001 {
67c0d1eb
RS
4002 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4003 macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
252b5132
RH
4004 }
4005}
4006
4007/* Warn if an expression is not a constant. */
4008
4009static void
17a2f251 4010check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
252b5132
RH
4011{
4012 if (ex->X_op == O_big)
4013 as_bad (_("unsupported large constant"));
4014 else if (ex->X_op != O_constant)
9ee2a2d4
MR
4015 as_bad (_("Instruction %s requires absolute expression"),
4016 ip->insn_mo->name);
13757d0c 4017
9ee2a2d4
MR
4018 if (HAVE_32BIT_GPRS)
4019 normalize_constant_expr (ex);
252b5132
RH
4020}
4021
4022/* Count the leading zeroes by performing a binary chop. This is a
4023 bulky bit of source, but performance is a LOT better for the
4024 majority of values than a simple loop to count the bits:
4025 for (lcnt = 0; (lcnt < 32); lcnt++)
4026 if ((v) & (1 << (31 - lcnt)))
4027 break;
4028 However it is not code size friendly, and the gain will drop a bit
4029 on certain cached systems.
4030*/
4031#define COUNT_TOP_ZEROES(v) \
4032 (((v) & ~0xffff) == 0 \
4033 ? ((v) & ~0xff) == 0 \
4034 ? ((v) & ~0xf) == 0 \
4035 ? ((v) & ~0x3) == 0 \
4036 ? ((v) & ~0x1) == 0 \
4037 ? !(v) \
4038 ? 32 \
4039 : 31 \
4040 : 30 \
4041 : ((v) & ~0x7) == 0 \
4042 ? 29 \
4043 : 28 \
4044 : ((v) & ~0x3f) == 0 \
4045 ? ((v) & ~0x1f) == 0 \
4046 ? 27 \
4047 : 26 \
4048 : ((v) & ~0x7f) == 0 \
4049 ? 25 \
4050 : 24 \
4051 : ((v) & ~0xfff) == 0 \
4052 ? ((v) & ~0x3ff) == 0 \
4053 ? ((v) & ~0x1ff) == 0 \
4054 ? 23 \
4055 : 22 \
4056 : ((v) & ~0x7ff) == 0 \
4057 ? 21 \
4058 : 20 \
4059 : ((v) & ~0x3fff) == 0 \
4060 ? ((v) & ~0x1fff) == 0 \
4061 ? 19 \
4062 : 18 \
4063 : ((v) & ~0x7fff) == 0 \
4064 ? 17 \
4065 : 16 \
4066 : ((v) & ~0xffffff) == 0 \
4067 ? ((v) & ~0xfffff) == 0 \
4068 ? ((v) & ~0x3ffff) == 0 \
4069 ? ((v) & ~0x1ffff) == 0 \
4070 ? 15 \
4071 : 14 \
4072 : ((v) & ~0x7ffff) == 0 \
4073 ? 13 \
4074 : 12 \
4075 : ((v) & ~0x3fffff) == 0 \
4076 ? ((v) & ~0x1fffff) == 0 \
4077 ? 11 \
4078 : 10 \
4079 : ((v) & ~0x7fffff) == 0 \
4080 ? 9 \
4081 : 8 \
4082 : ((v) & ~0xfffffff) == 0 \
4083 ? ((v) & ~0x3ffffff) == 0 \
4084 ? ((v) & ~0x1ffffff) == 0 \
4085 ? 7 \
4086 : 6 \
4087 : ((v) & ~0x7ffffff) == 0 \
4088 ? 5 \
4089 : 4 \
4090 : ((v) & ~0x3fffffff) == 0 \
4091 ? ((v) & ~0x1fffffff) == 0 \
4092 ? 3 \
4093 : 2 \
4094 : ((v) & ~0x7fffffff) == 0 \
4095 ? 1 \
4096 : 0)
4097
4098/* load_register()
67c1ffbe 4099 * This routine generates the least number of instructions necessary to load
252b5132
RH
4100 * an absolute expression value into a register.
4101 */
4102static void
67c0d1eb 4103load_register (int reg, expressionS *ep, int dbl)
252b5132
RH
4104{
4105 int freg;
4106 expressionS hi32, lo32;
4107
4108 if (ep->X_op != O_big)
4109 {
4110 assert (ep->X_op == O_constant);
256ab948
TS
4111
4112 /* Sign-extending 32-bit constants makes their handling easier. */
2051e8c4
MR
4113 if (!dbl)
4114 normalize_constant_expr (ep);
256ab948
TS
4115
4116 if (IS_SEXT_16BIT_NUM (ep->X_add_number))
252b5132
RH
4117 {
4118 /* We can handle 16 bit signed values with an addiu to
4119 $zero. No need to ever use daddiu here, since $zero and
4120 the result are always correct in 32 bit mode. */
67c0d1eb 4121 macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
252b5132
RH
4122 return;
4123 }
4124 else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
4125 {
4126 /* We can handle 16 bit unsigned values with an ori to
4127 $zero. */
67c0d1eb 4128 macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
252b5132
RH
4129 return;
4130 }
256ab948 4131 else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
252b5132
RH
4132 {
4133 /* 32 bit values require an lui. */
67c0d1eb 4134 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
252b5132 4135 if ((ep->X_add_number & 0xffff) != 0)
67c0d1eb 4136 macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
252b5132
RH
4137 return;
4138 }
4139 }
4140
4141 /* The value is larger than 32 bits. */
4142
2051e8c4 4143 if (!dbl || HAVE_32BIT_GPRS)
252b5132 4144 {
55e08f71
NC
4145 char value[32];
4146
4147 sprintf_vma (value, ep->X_add_number);
20e1fcfd 4148 as_bad (_("Number (0x%s) larger than 32 bits"), value);
67c0d1eb 4149 macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
252b5132
RH
4150 return;
4151 }
4152
4153 if (ep->X_op != O_big)
4154 {
4155 hi32 = *ep;
4156 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4157 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4158 hi32.X_add_number &= 0xffffffff;
4159 lo32 = *ep;
4160 lo32.X_add_number &= 0xffffffff;
4161 }
4162 else
4163 {
4164 assert (ep->X_add_number > 2);
4165 if (ep->X_add_number == 3)
4166 generic_bignum[3] = 0;
4167 else if (ep->X_add_number > 4)
4168 as_bad (_("Number larger than 64 bits"));
4169 lo32.X_op = O_constant;
4170 lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
4171 hi32.X_op = O_constant;
4172 hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
4173 }
4174
4175 if (hi32.X_add_number == 0)
4176 freg = 0;
4177 else
4178 {
4179 int shift, bit;
4180 unsigned long hi, lo;
4181
956cd1d6 4182 if (hi32.X_add_number == (offsetT) 0xffffffff)
beae10d5
KH
4183 {
4184 if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
4185 {
67c0d1eb 4186 macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
beae10d5
KH
4187 return;
4188 }
4189 if (lo32.X_add_number & 0x80000000)
4190 {
67c0d1eb 4191 macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
252b5132 4192 if (lo32.X_add_number & 0xffff)
67c0d1eb 4193 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
beae10d5
KH
4194 return;
4195 }
4196 }
252b5132
RH
4197
4198 /* Check for 16bit shifted constant. We know that hi32 is
4199 non-zero, so start the mask on the first bit of the hi32
4200 value. */
4201 shift = 17;
4202 do
beae10d5
KH
4203 {
4204 unsigned long himask, lomask;
4205
4206 if (shift < 32)
4207 {
4208 himask = 0xffff >> (32 - shift);
4209 lomask = (0xffff << shift) & 0xffffffff;
4210 }
4211 else
4212 {
4213 himask = 0xffff << (shift - 32);
4214 lomask = 0;
4215 }
4216 if ((hi32.X_add_number & ~(offsetT) himask) == 0
4217 && (lo32.X_add_number & ~(offsetT) lomask) == 0)
4218 {
4219 expressionS tmp;
4220
4221 tmp.X_op = O_constant;
4222 if (shift < 32)
4223 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
4224 | (lo32.X_add_number >> shift));
4225 else
4226 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
67c0d1eb
RS
4227 macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4228 macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
4229 reg, reg, (shift >= 32) ? shift - 32 : shift);
beae10d5
KH
4230 return;
4231 }
f9419b05 4232 ++shift;
beae10d5
KH
4233 }
4234 while (shift <= (64 - 16));
252b5132
RH
4235
4236 /* Find the bit number of the lowest one bit, and store the
4237 shifted value in hi/lo. */
4238 hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
4239 lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
4240 if (lo != 0)
4241 {
4242 bit = 0;
4243 while ((lo & 1) == 0)
4244 {
4245 lo >>= 1;
4246 ++bit;
4247 }
4248 lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
4249 hi >>= bit;
4250 }
4251 else
4252 {
4253 bit = 32;
4254 while ((hi & 1) == 0)
4255 {
4256 hi >>= 1;
4257 ++bit;
4258 }
4259 lo = hi;
4260 hi = 0;
4261 }
4262
4263 /* Optimize if the shifted value is a (power of 2) - 1. */
4264 if ((hi == 0 && ((lo + 1) & lo) == 0)
4265 || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
beae10d5
KH
4266 {
4267 shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
252b5132 4268 if (shift != 0)
beae10d5 4269 {
252b5132
RH
4270 expressionS tmp;
4271
4272 /* This instruction will set the register to be all
4273 ones. */
beae10d5
KH
4274 tmp.X_op = O_constant;
4275 tmp.X_add_number = (offsetT) -1;
67c0d1eb 4276 macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
beae10d5
KH
4277 if (bit != 0)
4278 {
4279 bit += shift;
67c0d1eb
RS
4280 macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
4281 reg, reg, (bit >= 32) ? bit - 32 : bit);
beae10d5 4282 }
67c0d1eb
RS
4283 macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
4284 reg, reg, (shift >= 32) ? shift - 32 : shift);
beae10d5
KH
4285 return;
4286 }
4287 }
252b5132
RH
4288
4289 /* Sign extend hi32 before calling load_register, because we can
4290 generally get better code when we load a sign extended value. */
4291 if ((hi32.X_add_number & 0x80000000) != 0)
beae10d5 4292 hi32.X_add_number |= ~(offsetT) 0xffffffff;
67c0d1eb 4293 load_register (reg, &hi32, 0);
252b5132
RH
4294 freg = reg;
4295 }
4296 if ((lo32.X_add_number & 0xffff0000) == 0)
4297 {
4298 if (freg != 0)
4299 {
67c0d1eb 4300 macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
252b5132
RH
4301 freg = reg;
4302 }
4303 }
4304 else
4305 {
4306 expressionS mid16;
4307
956cd1d6 4308 if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
beae10d5 4309 {
67c0d1eb
RS
4310 macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4311 macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
beae10d5
KH
4312 return;
4313 }
252b5132
RH
4314
4315 if (freg != 0)
4316 {
67c0d1eb 4317 macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
252b5132
RH
4318 freg = reg;
4319 }
4320 mid16 = lo32;
4321 mid16.X_add_number >>= 16;
67c0d1eb
RS
4322 macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4323 macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
252b5132
RH
4324 freg = reg;
4325 }
4326 if ((lo32.X_add_number & 0xffff) != 0)
67c0d1eb 4327 macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
252b5132
RH
4328}
4329
269137b2
TS
4330static inline void
4331load_delay_nop (void)
4332{
4333 if (!gpr_interlocks)
4334 macro_build (NULL, "nop", "");
4335}
4336
252b5132
RH
4337/* Load an address into a register. */
4338
4339static void
67c0d1eb 4340load_address (int reg, expressionS *ep, int *used_at)
252b5132 4341{
252b5132
RH
4342 if (ep->X_op != O_constant
4343 && ep->X_op != O_symbol)
4344 {
4345 as_bad (_("expression too complex"));
4346 ep->X_op = O_constant;
4347 }
4348
4349 if (ep->X_op == O_constant)
4350 {
67c0d1eb 4351 load_register (reg, ep, HAVE_64BIT_ADDRESSES);
252b5132
RH
4352 return;
4353 }
4354
4355 if (mips_pic == NO_PIC)
4356 {
4357 /* If this is a reference to a GP relative symbol, we want
cdf6fd85 4358 addiu $reg,$gp,<sym> (BFD_RELOC_GPREL16)
252b5132
RH
4359 Otherwise we want
4360 lui $reg,<sym> (BFD_RELOC_HI16_S)
4361 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
d6bc6245 4362 If we have an addend, we always use the latter form.
76b3015f 4363
d6bc6245
TS
4364 With 64bit address space and a usable $at we want
4365 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
4366 lui $at,<sym> (BFD_RELOC_HI16_S)
4367 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
4368 daddiu $at,<sym> (BFD_RELOC_LO16)
4369 dsll32 $reg,0
3a482fd5 4370 daddu $reg,$reg,$at
76b3015f 4371
c03099e6 4372 If $at is already in use, we use a path which is suboptimal
d6bc6245
TS
4373 on superscalar processors.
4374 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
4375 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
4376 dsll $reg,16
4377 daddiu $reg,<sym> (BFD_RELOC_HI16_S)
4378 dsll $reg,16
4379 daddiu $reg,<sym> (BFD_RELOC_LO16)
6caf9ef4
TS
4380
4381 For GP relative symbols in 64bit address space we can use
4382 the same sequence as in 32bit address space. */
aed1a261 4383 if (HAVE_64BIT_SYMBOLS)
d6bc6245 4384 {
6caf9ef4
TS
4385 if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4386 && !nopic_need_relax (ep->X_add_symbol, 1))
4387 {
4388 relax_start (ep->X_add_symbol);
4389 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4390 mips_gp_register, BFD_RELOC_GPREL16);
4391 relax_switch ();
4392 }
d6bc6245 4393
741fe287 4394 if (*used_at == 0 && mips_opts.at)
d6bc6245 4395 {
67c0d1eb
RS
4396 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4397 macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
4398 macro_build (ep, "daddiu", "t,r,j", reg, reg,
4399 BFD_RELOC_MIPS_HIGHER);
4400 macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
4401 macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
4402 macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
d6bc6245
TS
4403 *used_at = 1;
4404 }
4405 else
4406 {
67c0d1eb
RS
4407 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4408 macro_build (ep, "daddiu", "t,r,j", reg, reg,
4409 BFD_RELOC_MIPS_HIGHER);
4410 macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4411 macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
4412 macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4413 macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
d6bc6245 4414 }
6caf9ef4
TS
4415
4416 if (mips_relax.sequence)
4417 relax_end ();
d6bc6245 4418 }
252b5132
RH
4419 else
4420 {
d6bc6245 4421 if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
6caf9ef4 4422 && !nopic_need_relax (ep->X_add_symbol, 1))
d6bc6245 4423 {
4d7206a2 4424 relax_start (ep->X_add_symbol);
67c0d1eb 4425 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
17a2f251 4426 mips_gp_register, BFD_RELOC_GPREL16);
4d7206a2 4427 relax_switch ();
d6bc6245 4428 }
67c0d1eb
RS
4429 macro_build_lui (ep, reg);
4430 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
4431 reg, reg, BFD_RELOC_LO16);
4d7206a2
RS
4432 if (mips_relax.sequence)
4433 relax_end ();
d6bc6245 4434 }
252b5132 4435 }
0a44bf69 4436 else if (!mips_big_got)
252b5132
RH
4437 {
4438 expressionS ex;
4439
4440 /* If this is a reference to an external symbol, we want
4441 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4442 Otherwise we want
4443 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4444 nop
4445 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
f5040a92
AO
4446 If there is a constant, it must be added in after.
4447
ed6fb7bd 4448 If we have NewABI, we want
f5040a92
AO
4449 lw $reg,<sym+cst>($gp) (BFD_RELOC_MIPS_GOT_DISP)
4450 unless we're referencing a global symbol with a non-zero
4451 offset, in which case cst must be added separately. */
ed6fb7bd
SC
4452 if (HAVE_NEWABI)
4453 {
f5040a92
AO
4454 if (ep->X_add_number)
4455 {
4d7206a2 4456 ex.X_add_number = ep->X_add_number;
f5040a92 4457 ep->X_add_number = 0;
4d7206a2 4458 relax_start (ep->X_add_symbol);
67c0d1eb
RS
4459 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4460 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
f5040a92
AO
4461 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4462 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4463 ex.X_op = O_constant;
67c0d1eb 4464 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
17a2f251 4465 reg, reg, BFD_RELOC_LO16);
f5040a92 4466 ep->X_add_number = ex.X_add_number;
4d7206a2 4467 relax_switch ();
f5040a92 4468 }
67c0d1eb 4469 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
17a2f251 4470 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4d7206a2
RS
4471 if (mips_relax.sequence)
4472 relax_end ();
ed6fb7bd
SC
4473 }
4474 else
4475 {
f5040a92
AO
4476 ex.X_add_number = ep->X_add_number;
4477 ep->X_add_number = 0;
67c0d1eb
RS
4478 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4479 BFD_RELOC_MIPS_GOT16, mips_gp_register);
269137b2 4480 load_delay_nop ();
4d7206a2
RS
4481 relax_start (ep->X_add_symbol);
4482 relax_switch ();
67c0d1eb 4483 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
17a2f251 4484 BFD_RELOC_LO16);
4d7206a2 4485 relax_end ();
ed6fb7bd 4486
f5040a92
AO
4487 if (ex.X_add_number != 0)
4488 {
4489 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4490 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4491 ex.X_op = O_constant;
67c0d1eb 4492 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
17a2f251 4493 reg, reg, BFD_RELOC_LO16);
f5040a92 4494 }
252b5132
RH
4495 }
4496 }
0a44bf69 4497 else if (mips_big_got)
252b5132
RH
4498 {
4499 expressionS ex;
252b5132
RH
4500
4501 /* This is the large GOT case. If this is a reference to an
4502 external symbol, we want
4503 lui $reg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
4504 addu $reg,$reg,$gp
4505 lw $reg,<sym>($reg) (BFD_RELOC_MIPS_GOT_LO16)
f5040a92
AO
4506
4507 Otherwise, for a reference to a local symbol in old ABI, we want
252b5132
RH
4508 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4509 nop
4510 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
684022ea 4511 If there is a constant, it must be added in after.
f5040a92
AO
4512
4513 In the NewABI, for local symbols, with or without offsets, we want:
438c16b8
TS
4514 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
4515 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
f5040a92 4516 */
438c16b8
TS
4517 if (HAVE_NEWABI)
4518 {
4d7206a2 4519 ex.X_add_number = ep->X_add_number;
f5040a92 4520 ep->X_add_number = 0;
4d7206a2 4521 relax_start (ep->X_add_symbol);
67c0d1eb
RS
4522 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4523 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4524 reg, reg, mips_gp_register);
4525 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4526 reg, BFD_RELOC_MIPS_GOT_LO16, reg);
f5040a92
AO
4527 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4528 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4529 else if (ex.X_add_number)
4530 {
4531 ex.X_op = O_constant;
67c0d1eb
RS
4532 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4533 BFD_RELOC_LO16);
f5040a92
AO
4534 }
4535
4536 ep->X_add_number = ex.X_add_number;
4d7206a2 4537 relax_switch ();
67c0d1eb 4538 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
17a2f251 4539 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
67c0d1eb
RS
4540 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4541 BFD_RELOC_MIPS_GOT_OFST);
4d7206a2 4542 relax_end ();
438c16b8 4543 }
252b5132 4544 else
438c16b8 4545 {
f5040a92
AO
4546 ex.X_add_number = ep->X_add_number;
4547 ep->X_add_number = 0;
4d7206a2 4548 relax_start (ep->X_add_symbol);
67c0d1eb
RS
4549 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4550 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4551 reg, reg, mips_gp_register);
4552 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4553 reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4d7206a2
RS
4554 relax_switch ();
4555 if (reg_needs_delay (mips_gp_register))
438c16b8
TS
4556 {
4557 /* We need a nop before loading from $gp. This special
4558 check is required because the lui which starts the main
4559 instruction stream does not refer to $gp, and so will not
4560 insert the nop which may be required. */
67c0d1eb 4561 macro_build (NULL, "nop", "");
438c16b8 4562 }
67c0d1eb 4563 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
17a2f251 4564 BFD_RELOC_MIPS_GOT16, mips_gp_register);
269137b2 4565 load_delay_nop ();
67c0d1eb 4566 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
17a2f251 4567 BFD_RELOC_LO16);
4d7206a2 4568 relax_end ();
438c16b8 4569
f5040a92
AO
4570 if (ex.X_add_number != 0)
4571 {
4572 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4573 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4574 ex.X_op = O_constant;
67c0d1eb
RS
4575 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4576 BFD_RELOC_LO16);
f5040a92 4577 }
252b5132
RH
4578 }
4579 }
252b5132
RH
4580 else
4581 abort ();
8fc2e39e 4582
741fe287 4583 if (!mips_opts.at && *used_at == 1)
8fc2e39e 4584 as_bad (_("Macro used $at after \".set noat\""));
252b5132
RH
4585}
4586
ea1fb5dc
RS
4587/* Move the contents of register SOURCE into register DEST. */
4588
4589static void
67c0d1eb 4590move_register (int dest, int source)
ea1fb5dc 4591{
67c0d1eb
RS
4592 macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4593 dest, source, 0);
ea1fb5dc
RS
4594}
4595
4d7206a2 4596/* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
f6a22291
MR
4597 LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
4598 The two alternatives are:
4d7206a2
RS
4599
4600 Global symbol Local sybmol
4601 ------------- ------------
4602 lw DEST,%got(SYMBOL) lw DEST,%got(SYMBOL + OFFSET)
4603 ... ...
4604 addiu DEST,DEST,OFFSET addiu DEST,DEST,%lo(SYMBOL + OFFSET)
4605
4606 load_got_offset emits the first instruction and add_got_offset
f6a22291
MR
4607 emits the second for a 16-bit offset or add_got_offset_hilo emits
4608 a sequence to add a 32-bit offset using a scratch register. */
4d7206a2
RS
4609
4610static void
67c0d1eb 4611load_got_offset (int dest, expressionS *local)
4d7206a2
RS
4612{
4613 expressionS global;
4614
4615 global = *local;
4616 global.X_add_number = 0;
4617
4618 relax_start (local->X_add_symbol);
67c0d1eb
RS
4619 macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4620 BFD_RELOC_MIPS_GOT16, mips_gp_register);
4d7206a2 4621 relax_switch ();
67c0d1eb
RS
4622 macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4623 BFD_RELOC_MIPS_GOT16, mips_gp_register);
4d7206a2
RS
4624 relax_end ();
4625}
4626
4627static void
67c0d1eb 4628add_got_offset (int dest, expressionS *local)
4d7206a2
RS
4629{
4630 expressionS global;
4631
4632 global.X_op = O_constant;
4633 global.X_op_symbol = NULL;
4634 global.X_add_symbol = NULL;
4635 global.X_add_number = local->X_add_number;
4636
4637 relax_start (local->X_add_symbol);
67c0d1eb 4638 macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
4d7206a2
RS
4639 dest, dest, BFD_RELOC_LO16);
4640 relax_switch ();
67c0d1eb 4641 macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
4d7206a2
RS
4642 relax_end ();
4643}
4644
f6a22291
MR
4645static void
4646add_got_offset_hilo (int dest, expressionS *local, int tmp)
4647{
4648 expressionS global;
4649 int hold_mips_optimize;
4650
4651 global.X_op = O_constant;
4652 global.X_op_symbol = NULL;
4653 global.X_add_symbol = NULL;
4654 global.X_add_number = local->X_add_number;
4655
4656 relax_start (local->X_add_symbol);
4657 load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
4658 relax_switch ();
4659 /* Set mips_optimize around the lui instruction to avoid
4660 inserting an unnecessary nop after the lw. */
4661 hold_mips_optimize = mips_optimize;
4662 mips_optimize = 2;
4663 macro_build_lui (&global, tmp);
4664 mips_optimize = hold_mips_optimize;
4665 macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
4666 relax_end ();
4667
4668 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
4669}
4670
252b5132
RH
4671/*
4672 * Build macros
4673 * This routine implements the seemingly endless macro or synthesized
4674 * instructions and addressing modes in the mips assembly language. Many
4675 * of these macros are simple and are similar to each other. These could
67c1ffbe 4676 * probably be handled by some kind of table or grammar approach instead of
252b5132
RH
4677 * this verbose method. Others are not simple macros but are more like
4678 * optimizing code generation.
4679 * One interesting optimization is when several store macros appear
67c1ffbe 4680 * consecutively that would load AT with the upper half of the same address.
252b5132
RH
4681 * The ensuing load upper instructions are ommited. This implies some kind
4682 * of global optimization. We currently only optimize within a single macro.
4683 * For many of the load and store macros if the address is specified as a
4684 * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4685 * first load register 'at' with zero and use it as the base register. The
4686 * mips assembler simply uses register $zero. Just one tiny optimization
4687 * we're missing.
4688 */
4689static void
17a2f251 4690macro (struct mips_cl_insn *ip)
252b5132 4691{
741fe287
MR
4692 unsigned int treg, sreg, dreg, breg;
4693 unsigned int tempreg;
252b5132 4694 int mask;
43841e91 4695 int used_at = 0;
252b5132
RH
4696 expressionS expr1;
4697 const char *s;
4698 const char *s2;
4699 const char *fmt;
4700 int likely = 0;
4701 int dbl = 0;
4702 int coproc = 0;
4703 int lr = 0;
4704 int imm = 0;
1abe91b1 4705 int call = 0;
252b5132 4706 int off;
67c0d1eb 4707 offsetT maxnum;
252b5132 4708 bfd_reloc_code_real_type r;
252b5132
RH
4709 int hold_mips_optimize;
4710
4711 assert (! mips_opts.mips16);
4712
4713 treg = (ip->insn_opcode >> 16) & 0x1f;
4714 dreg = (ip->insn_opcode >> 11) & 0x1f;
4715 sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
4716 mask = ip->insn_mo->mask;
4717
4718 expr1.X_op = O_constant;
4719 expr1.X_op_symbol = NULL;
4720 expr1.X_add_symbol = NULL;
4721 expr1.X_add_number = 1;
4722
4723 switch (mask)
4724 {
4725 case M_DABS:
4726 dbl = 1;
4727 case M_ABS:
4728 /* bgez $a0,.+12
4729 move v0,$a0
4730 sub v0,$zero,$a0
4731 */
4732
7d10b47d 4733 start_noreorder ();
252b5132
RH
4734
4735 expr1.X_add_number = 8;
67c0d1eb 4736 macro_build (&expr1, "bgez", "s,p", sreg);
252b5132 4737 if (dreg == sreg)
67c0d1eb 4738 macro_build (NULL, "nop", "", 0);
252b5132 4739 else
67c0d1eb
RS
4740 move_register (dreg, sreg);
4741 macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
252b5132 4742
7d10b47d 4743 end_noreorder ();
8fc2e39e 4744 break;
252b5132
RH
4745
4746 case M_ADD_I:
4747 s = "addi";
4748 s2 = "add";
4749 goto do_addi;
4750 case M_ADDU_I:
4751 s = "addiu";
4752 s2 = "addu";
4753 goto do_addi;
4754 case M_DADD_I:
4755 dbl = 1;
4756 s = "daddi";
4757 s2 = "dadd";
4758 goto do_addi;
4759 case M_DADDU_I:
4760 dbl = 1;
4761 s = "daddiu";
4762 s2 = "daddu";
4763 do_addi:
4764 if (imm_expr.X_op == O_constant
4765 && imm_expr.X_add_number >= -0x8000
4766 && imm_expr.X_add_number < 0x8000)
4767 {
67c0d1eb 4768 macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
8fc2e39e 4769 break;
252b5132 4770 }
8fc2e39e 4771 used_at = 1;
67c0d1eb
RS
4772 load_register (AT, &imm_expr, dbl);
4773 macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
252b5132
RH
4774 break;
4775
4776 case M_AND_I:
4777 s = "andi";
4778 s2 = "and";
4779 goto do_bit;
4780 case M_OR_I:
4781 s = "ori";
4782 s2 = "or";
4783 goto do_bit;
4784 case M_NOR_I:
4785 s = "";
4786 s2 = "nor";
4787 goto do_bit;
4788 case M_XOR_I:
4789 s = "xori";
4790 s2 = "xor";
4791 do_bit:
4792 if (imm_expr.X_op == O_constant
4793 && imm_expr.X_add_number >= 0
4794 && imm_expr.X_add_number < 0x10000)
4795 {
4796 if (mask != M_NOR_I)
67c0d1eb 4797 macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
252b5132
RH
4798 else
4799 {
67c0d1eb
RS
4800 macro_build (&imm_expr, "ori", "t,r,i",
4801 treg, sreg, BFD_RELOC_LO16);
4802 macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
252b5132 4803 }
8fc2e39e 4804 break;
252b5132
RH
4805 }
4806
8fc2e39e 4807 used_at = 1;
67c0d1eb
RS
4808 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4809 macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
252b5132
RH
4810 break;
4811
8b082fb1
TS
4812 case M_BALIGN:
4813 switch (imm_expr.X_add_number)
4814 {
4815 case 0:
4816 macro_build (NULL, "nop", "");
4817 break;
4818 case 2:
4819 macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
4820 break;
4821 default:
4822 macro_build (NULL, "balign", "t,s,2", treg, sreg,
4823 (int)imm_expr.X_add_number);
4824 break;
4825 }
4826 break;
4827
252b5132
RH
4828 case M_BEQ_I:
4829 s = "beq";
4830 goto beq_i;
4831 case M_BEQL_I:
4832 s = "beql";
4833 likely = 1;
4834 goto beq_i;
4835 case M_BNE_I:
4836 s = "bne";
4837 goto beq_i;
4838 case M_BNEL_I:
4839 s = "bnel";
4840 likely = 1;
4841 beq_i:
4842 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4843 {
67c0d1eb 4844 macro_build (&offset_expr, s, "s,t,p", sreg, 0);
8fc2e39e 4845 break;
252b5132 4846 }
8fc2e39e 4847 used_at = 1;
67c0d1eb
RS
4848 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4849 macro_build (&offset_expr, s, "s,t,p", sreg, AT);
252b5132
RH
4850 break;
4851
4852 case M_BGEL:
4853 likely = 1;
4854 case M_BGE:
4855 if (treg == 0)
4856 {
67c0d1eb 4857 macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
8fc2e39e 4858 break;
252b5132
RH
4859 }
4860 if (sreg == 0)
4861 {
67c0d1eb 4862 macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
8fc2e39e 4863 break;
252b5132 4864 }
8fc2e39e 4865 used_at = 1;
67c0d1eb
RS
4866 macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4867 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
252b5132
RH
4868 break;
4869
4870 case M_BGTL_I:
4871 likely = 1;
4872 case M_BGT_I:
4873 /* check for > max integer */
4874 maxnum = 0x7fffffff;
ca4e0257 4875 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
252b5132
RH
4876 {
4877 maxnum <<= 16;
4878 maxnum |= 0xffff;
4879 maxnum <<= 16;
4880 maxnum |= 0xffff;
4881 }
4882 if (imm_expr.X_op == O_constant
4883 && imm_expr.X_add_number >= maxnum
ca4e0257 4884 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
252b5132
RH
4885 {
4886 do_false:
4887 /* result is always false */
4888 if (! likely)
67c0d1eb 4889 macro_build (NULL, "nop", "", 0);
252b5132 4890 else
67c0d1eb 4891 macro_build (&offset_expr, "bnel", "s,t,p", 0, 0);
8fc2e39e 4892 break;
252b5132
RH
4893 }
4894 if (imm_expr.X_op != O_constant)
4895 as_bad (_("Unsupported large constant"));
f9419b05 4896 ++imm_expr.X_add_number;
252b5132
RH
4897 /* FALLTHROUGH */
4898 case M_BGE_I:
4899 case M_BGEL_I:
4900 if (mask == M_BGEL_I)
4901 likely = 1;
4902 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4903 {
67c0d1eb 4904 macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
8fc2e39e 4905 break;
252b5132
RH
4906 }
4907 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4908 {
67c0d1eb 4909 macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
8fc2e39e 4910 break;
252b5132
RH
4911 }
4912 maxnum = 0x7fffffff;
ca4e0257 4913 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
252b5132
RH
4914 {
4915 maxnum <<= 16;
4916 maxnum |= 0xffff;
4917 maxnum <<= 16;
4918 maxnum |= 0xffff;
4919 }
4920 maxnum = - maxnum - 1;
4921 if (imm_expr.X_op == O_constant
4922 && imm_expr.X_add_number <= maxnum
ca4e0257 4923 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
252b5132
RH
4924 {
4925 do_true:
4926 /* result is always true */
4927 as_warn (_("Branch %s is always true"), ip->insn_mo->name);
67c0d1eb 4928 macro_build (&offset_expr, "b", "p");
8fc2e39e 4929 break;
252b5132 4930 }
8fc2e39e 4931 used_at = 1;
67c0d1eb
RS
4932 set_at (sreg, 0);
4933 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
252b5132
RH
4934 break;
4935
4936 case M_BGEUL:
4937 likely = 1;
4938 case M_BGEU:
4939 if (treg == 0)
4940 goto do_true;
4941 if (sreg == 0)
4942 {
67c0d1eb 4943 macro_build (&offset_expr, likely ? "beql" : "beq",
17a2f251 4944 "s,t,p", 0, treg);
8fc2e39e 4945 break;
252b5132 4946 }
8fc2e39e 4947 used_at = 1;
67c0d1eb
RS
4948 macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4949 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
252b5132
RH
4950 break;
4951
4952 case M_BGTUL_I:
4953 likely = 1;
4954 case M_BGTU_I:
4955 if (sreg == 0
ca4e0257 4956 || (HAVE_32BIT_GPRS
252b5132 4957 && imm_expr.X_op == O_constant
956cd1d6 4958 && imm_expr.X_add_number == (offsetT) 0xffffffff))
252b5132
RH
4959 goto do_false;
4960 if (imm_expr.X_op != O_constant)
4961 as_bad (_("Unsupported large constant"));
f9419b05 4962 ++imm_expr.X_add_number;
252b5132
RH
4963 /* FALLTHROUGH */
4964 case M_BGEU_I:
4965 case M_BGEUL_I:
4966 if (mask == M_BGEUL_I)
4967 likely = 1;
4968 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4969 goto do_true;
4970 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4971 {
67c0d1eb 4972 macro_build (&offset_expr, likely ? "bnel" : "bne",
17a2f251 4973 "s,t,p", sreg, 0);
8fc2e39e 4974 break;
252b5132 4975 }
8fc2e39e 4976 used_at = 1;
67c0d1eb
RS
4977 set_at (sreg, 1);
4978 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
252b5132
RH
4979 break;
4980
4981 case M_BGTL:
4982 likely = 1;
4983 case M_BGT:
4984 if (treg == 0)
4985 {
67c0d1eb 4986 macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
8fc2e39e 4987 break;
252b5132
RH
4988 }
4989 if (sreg == 0)
4990 {
67c0d1eb 4991 macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
8fc2e39e 4992 break;
252b5132 4993 }
8fc2e39e 4994 used_at = 1;
67c0d1eb
RS
4995 macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4996 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
252b5132
RH
4997 break;
4998
4999 case M_BGTUL:
5000 likely = 1;
5001 case M_BGTU:
5002 if (treg == 0)
5003 {
67c0d1eb 5004 macro_build (&offset_expr, likely ? "bnel" : "bne",
17a2f251 5005 "s,t,p", sreg, 0);
8fc2e39e 5006 break;
252b5132
RH
5007 }
5008 if (sreg == 0)
5009 goto do_false;
8fc2e39e 5010 used_at = 1;
67c0d1eb
RS
5011 macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
5012 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
252b5132
RH
5013 break;
5014
5015 case M_BLEL:
5016 likely = 1;
5017 case M_BLE:
5018 if (treg == 0)
5019 {
67c0d1eb 5020 macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
8fc2e39e 5021 break;
252b5132
RH
5022 }
5023 if (sreg == 0)
5024 {
67c0d1eb 5025 macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
8fc2e39e 5026 break;
252b5132 5027 }
8fc2e39e 5028 used_at = 1;
67c0d1eb
RS
5029 macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
5030 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
252b5132
RH
5031 break;
5032
5033 case M_BLEL_I:
5034 likely = 1;
5035 case M_BLE_I:
5036 maxnum = 0x7fffffff;
ca4e0257 5037 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
252b5132
RH
5038 {
5039 maxnum <<= 16;
5040 maxnum |= 0xffff;
5041 maxnum <<= 16;
5042 maxnum |= 0xffff;
5043 }
5044 if (imm_expr.X_op == O_constant
5045 && imm_expr.X_add_number >= maxnum
ca4e0257 5046 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
252b5132
RH
5047 goto do_true;
5048 if (imm_expr.X_op != O_constant)
5049 as_bad (_("Unsupported large constant"));
f9419b05 5050 ++imm_expr.X_add_number;
252b5132
RH
5051 /* FALLTHROUGH */
5052 case M_BLT_I:
5053 case M_BLTL_I:
5054 if (mask == M_BLTL_I)
5055 likely = 1;
5056 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5057 {
67c0d1eb 5058 macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
8fc2e39e 5059 break;
252b5132
RH
5060 }
5061 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5062 {
67c0d1eb 5063 macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
8fc2e39e 5064 break;
252b5132 5065 }
8fc2e39e 5066 used_at = 1;
67c0d1eb
RS
5067 set_at (sreg, 0);
5068 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
252b5132
RH
5069 break;
5070
5071 case M_BLEUL:
5072 likely = 1;
5073 case M_BLEU:
5074 if (treg == 0)
5075 {
67c0d1eb 5076 macro_build (&offset_expr, likely ? "beql" : "beq",
17a2f251 5077 "s,t,p", sreg, 0);
8fc2e39e 5078 break;
252b5132
RH
5079 }
5080 if (sreg == 0)
5081 goto do_true;
8fc2e39e 5082 used_at = 1;
67c0d1eb
RS
5083 macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
5084 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
252b5132
RH
5085 break;
5086
5087 case M_BLEUL_I:
5088 likely = 1;
5089 case M_BLEU_I:
5090 if (sreg == 0
ca4e0257 5091 || (HAVE_32BIT_GPRS
252b5132 5092 && imm_expr.X_op == O_constant
956cd1d6 5093 && imm_expr.X_add_number == (offsetT) 0xffffffff))
252b5132
RH
5094 goto do_true;
5095 if (imm_expr.X_op != O_constant)
5096 as_bad (_("Unsupported large constant"));
f9419b05 5097 ++imm_expr.X_add_number;
252b5132
RH
5098 /* FALLTHROUGH */
5099 case M_BLTU_I:
5100 case M_BLTUL_I:
5101 if (mask == M_BLTUL_I)
5102 likely = 1;
5103 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5104 goto do_false;
5105 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5106 {
67c0d1eb 5107 macro_build (&offset_expr, likely ? "beql" : "beq",
252b5132 5108 "s,t,p", sreg, 0);
8fc2e39e 5109 break;
252b5132 5110 }
8fc2e39e 5111 used_at = 1;
67c0d1eb
RS
5112 set_at (sreg, 1);
5113 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
252b5132
RH
5114 break;
5115
5116 case M_BLTL:
5117 likely = 1;
5118 case M_BLT:
5119 if (treg == 0)
5120 {
67c0d1eb 5121 macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
8fc2e39e 5122 break;
252b5132
RH
5123 }
5124 if (sreg == 0)
5125 {
67c0d1eb 5126 macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
8fc2e39e 5127 break;
252b5132 5128 }
8fc2e39e 5129 used_at = 1;
67c0d1eb
RS
5130 macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
5131 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
252b5132
RH
5132 break;
5133
5134 case M_BLTUL:
5135 likely = 1;
5136 case M_BLTU:
5137 if (treg == 0)
5138 goto do_false;
5139 if (sreg == 0)
5140 {
67c0d1eb 5141 macro_build (&offset_expr, likely ? "bnel" : "bne",
17a2f251 5142 "s,t,p", 0, treg);
8fc2e39e 5143 break;
252b5132 5144 }
8fc2e39e 5145 used_at = 1;
67c0d1eb
RS
5146 macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
5147 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
252b5132
RH
5148 break;
5149
5f74bc13
CD
5150 case M_DEXT:
5151 {
5152 unsigned long pos;
5153 unsigned long size;
5154
5155 if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5156 {
5157 as_bad (_("Unsupported large constant"));
5158 pos = size = 1;
5159 }
5160 else
5161 {
5162 pos = (unsigned long) imm_expr.X_add_number;
5163 size = (unsigned long) imm2_expr.X_add_number;
5164 }
5165
5166 if (pos > 63)
5167 {
5168 as_bad (_("Improper position (%lu)"), pos);
5169 pos = 1;
5170 }
5171 if (size == 0 || size > 64
5172 || (pos + size - 1) > 63)
5173 {
5174 as_bad (_("Improper extract size (%lu, position %lu)"),
5175 size, pos);
5176 size = 1;
5177 }
5178
5179 if (size <= 32 && pos < 32)
5180 {
5181 s = "dext";
5182 fmt = "t,r,+A,+C";
5183 }
5184 else if (size <= 32)
5185 {
5186 s = "dextu";
5187 fmt = "t,r,+E,+H";
5188 }
5189 else
5190 {
5191 s = "dextm";
5192 fmt = "t,r,+A,+G";
5193 }
67c0d1eb 5194 macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos, size - 1);
5f74bc13 5195 }
8fc2e39e 5196 break;
5f74bc13
CD
5197
5198 case M_DINS:
5199 {
5200 unsigned long pos;
5201 unsigned long size;
5202
5203 if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5204 {
5205 as_bad (_("Unsupported large constant"));
5206 pos = size = 1;
5207 }
5208 else
5209 {
5210 pos = (unsigned long) imm_expr.X_add_number;
5211 size = (unsigned long) imm2_expr.X_add_number;
5212 }
5213
5214 if (pos > 63)
5215 {
5216 as_bad (_("Improper position (%lu)"), pos);
5217 pos = 1;
5218 }
5219 if (size == 0 || size > 64
5220 || (pos + size - 1) > 63)
5221 {
5222 as_bad (_("Improper insert size (%lu, position %lu)"),
5223 size, pos);
5224 size = 1;
5225 }
5226
5227 if (pos < 32 && (pos + size - 1) < 32)
5228 {
5229 s = "dins";
5230 fmt = "t,r,+A,+B";
5231 }
5232 else if (pos >= 32)
5233 {
5234 s = "dinsu";
5235 fmt = "t,r,+E,+F";
5236 }
5237 else
5238 {
5239 s = "dinsm";
5240 fmt = "t,r,+A,+F";
5241 }
67c0d1eb
RS
5242 macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos,
5243 pos + size - 1);
5f74bc13 5244 }
8fc2e39e 5245 break;
5f74bc13 5246
252b5132
RH
5247 case M_DDIV_3:
5248 dbl = 1;
5249 case M_DIV_3:
5250 s = "mflo";
5251 goto do_div3;
5252 case M_DREM_3:
5253 dbl = 1;
5254 case M_REM_3:
5255 s = "mfhi";
5256 do_div3:
5257 if (treg == 0)
5258 {
5259 as_warn (_("Divide by zero."));
5260 if (mips_trap)
67c0d1eb 5261 macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
252b5132 5262 else
67c0d1eb 5263 macro_build (NULL, "break", "c", 7);
8fc2e39e 5264 break;
252b5132
RH
5265 }
5266
7d10b47d 5267 start_noreorder ();
252b5132
RH
5268 if (mips_trap)
5269 {
67c0d1eb
RS
5270 macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5271 macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
252b5132
RH
5272 }
5273 else
5274 {
5275 expr1.X_add_number = 8;
67c0d1eb
RS
5276 macro_build (&expr1, "bne", "s,t,p", treg, 0);
5277 macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5278 macro_build (NULL, "break", "c", 7);
252b5132
RH
5279 }
5280 expr1.X_add_number = -1;
8fc2e39e 5281 used_at = 1;
f6a22291 5282 load_register (AT, &expr1, dbl);
252b5132 5283 expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
67c0d1eb 5284 macro_build (&expr1, "bne", "s,t,p", treg, AT);
252b5132
RH
5285 if (dbl)
5286 {
5287 expr1.X_add_number = 1;
f6a22291 5288 load_register (AT, &expr1, dbl);
67c0d1eb 5289 macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
252b5132
RH
5290 }
5291 else
5292 {
5293 expr1.X_add_number = 0x80000000;
67c0d1eb 5294 macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
252b5132
RH
5295 }
5296 if (mips_trap)
5297 {
67c0d1eb 5298 macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
252b5132
RH
5299 /* We want to close the noreorder block as soon as possible, so
5300 that later insns are available for delay slot filling. */
7d10b47d 5301 end_noreorder ();
252b5132
RH
5302 }
5303 else
5304 {
5305 expr1.X_add_number = 8;
67c0d1eb
RS
5306 macro_build (&expr1, "bne", "s,t,p", sreg, AT);
5307 macro_build (NULL, "nop", "", 0);
252b5132
RH
5308
5309 /* We want to close the noreorder block as soon as possible, so
5310 that later insns are available for delay slot filling. */
7d10b47d 5311 end_noreorder ();
252b5132 5312
67c0d1eb 5313 macro_build (NULL, "break", "c", 6);
252b5132 5314 }
67c0d1eb 5315 macro_build (NULL, s, "d", dreg);
252b5132
RH
5316 break;
5317
5318 case M_DIV_3I:
5319 s = "div";
5320 s2 = "mflo";
5321 goto do_divi;
5322 case M_DIVU_3I:
5323 s = "divu";
5324 s2 = "mflo";
5325 goto do_divi;
5326 case M_REM_3I:
5327 s = "div";
5328 s2 = "mfhi";
5329 goto do_divi;
5330 case M_REMU_3I:
5331 s = "divu";
5332 s2 = "mfhi";
5333 goto do_divi;
5334 case M_DDIV_3I:
5335 dbl = 1;
5336 s = "ddiv";
5337 s2 = "mflo";
5338 goto do_divi;
5339 case M_DDIVU_3I:
5340 dbl = 1;
5341 s = "ddivu";
5342 s2 = "mflo";
5343 goto do_divi;
5344 case M_DREM_3I:
5345 dbl = 1;
5346 s = "ddiv";
5347 s2 = "mfhi";
5348 goto do_divi;
5349 case M_DREMU_3I:
5350 dbl = 1;
5351 s = "ddivu";
5352 s2 = "mfhi";
5353 do_divi:
5354 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5355 {
5356 as_warn (_("Divide by zero."));
5357 if (mips_trap)
67c0d1eb 5358 macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
252b5132 5359 else
67c0d1eb 5360 macro_build (NULL, "break", "c", 7);
8fc2e39e 5361 break;
252b5132
RH
5362 }
5363 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5364 {
5365 if (strcmp (s2, "mflo") == 0)
67c0d1eb 5366 move_register (dreg, sreg);
252b5132 5367 else
67c0d1eb 5368 move_register (dreg, 0);
8fc2e39e 5369 break;
252b5132
RH
5370 }
5371 if (imm_expr.X_op == O_constant
5372 && imm_expr.X_add_number == -1
5373 && s[strlen (s) - 1] != 'u')
5374 {
5375 if (strcmp (s2, "mflo") == 0)
5376 {
67c0d1eb 5377 macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
252b5132
RH
5378 }
5379 else
67c0d1eb 5380 move_register (dreg, 0);
8fc2e39e 5381 break;
252b5132
RH
5382 }
5383
8fc2e39e 5384 used_at = 1;
67c0d1eb
RS
5385 load_register (AT, &imm_expr, dbl);
5386 macro_build (NULL, s, "z,s,t", sreg, AT);
5387 macro_build (NULL, s2, "d", dreg);
252b5132
RH
5388 break;
5389
5390 case M_DIVU_3:
5391 s = "divu";
5392 s2 = "mflo";
5393 goto do_divu3;
5394 case M_REMU_3:
5395 s = "divu";
5396 s2 = "mfhi";
5397 goto do_divu3;
5398 case M_DDIVU_3:
5399 s = "ddivu";
5400 s2 = "mflo";
5401 goto do_divu3;
5402 case M_DREMU_3:
5403 s = "ddivu";
5404 s2 = "mfhi";
5405 do_divu3:
7d10b47d 5406 start_noreorder ();
252b5132
RH
5407 if (mips_trap)
5408 {
67c0d1eb
RS
5409 macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5410 macro_build (NULL, s, "z,s,t", sreg, treg);
252b5132
RH
5411 /* We want to close the noreorder block as soon as possible, so
5412 that later insns are available for delay slot filling. */
7d10b47d 5413 end_noreorder ();
252b5132
RH
5414 }
5415 else
5416 {
5417 expr1.X_add_number = 8;
67c0d1eb
RS
5418 macro_build (&expr1, "bne", "s,t,p", treg, 0);
5419 macro_build (NULL, s, "z,s,t", sreg, treg);
252b5132
RH
5420
5421 /* We want to close the noreorder block as soon as possible, so
5422 that later insns are available for delay slot filling. */
7d10b47d 5423 end_noreorder ();
67c0d1eb 5424 macro_build (NULL, "break", "c", 7);
252b5132 5425 }
67c0d1eb 5426 macro_build (NULL, s2, "d", dreg);
8fc2e39e 5427 break;
252b5132 5428
1abe91b1
MR
5429 case M_DLCA_AB:
5430 dbl = 1;
5431 case M_LCA_AB:
5432 call = 1;
5433 goto do_la;
252b5132
RH
5434 case M_DLA_AB:
5435 dbl = 1;
5436 case M_LA_AB:
1abe91b1 5437 do_la:
252b5132
RH
5438 /* Load the address of a symbol into a register. If breg is not
5439 zero, we then add a base register to it. */
5440
3bec30a8
TS
5441 if (dbl && HAVE_32BIT_GPRS)
5442 as_warn (_("dla used to load 32-bit register"));
5443
c90bbe5b 5444 if (! dbl && HAVE_64BIT_OBJECTS)
3bec30a8
TS
5445 as_warn (_("la used to load 64-bit address"));
5446
0c11417f
MR
5447 if (offset_expr.X_op == O_constant
5448 && offset_expr.X_add_number >= -0x8000
5449 && offset_expr.X_add_number < 0x8000)
5450 {
aed1a261 5451 macro_build (&offset_expr, ADDRESS_ADDI_INSN,
17a2f251 5452 "t,r,j", treg, sreg, BFD_RELOC_LO16);
8fc2e39e 5453 break;
0c11417f
MR
5454 }
5455
741fe287 5456 if (mips_opts.at && (treg == breg))
afdbd6d0
CD
5457 {
5458 tempreg = AT;
5459 used_at = 1;
5460 }
5461 else
5462 {
5463 tempreg = treg;
afdbd6d0
CD
5464 }
5465
252b5132
RH
5466 if (offset_expr.X_op != O_symbol
5467 && offset_expr.X_op != O_constant)
5468 {
5469 as_bad (_("expression too complex"));
5470 offset_expr.X_op = O_constant;
5471 }
5472
252b5132 5473 if (offset_expr.X_op == O_constant)
aed1a261 5474 load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
252b5132
RH
5475 else if (mips_pic == NO_PIC)
5476 {
d6bc6245 5477 /* If this is a reference to a GP relative symbol, we want
cdf6fd85 5478 addiu $tempreg,$gp,<sym> (BFD_RELOC_GPREL16)
252b5132
RH
5479 Otherwise we want
5480 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
5481 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5482 If we have a constant, we need two instructions anyhow,
d6bc6245 5483 so we may as well always use the latter form.
76b3015f 5484
6caf9ef4
TS
5485 With 64bit address space and a usable $at we want
5486 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
5487 lui $at,<sym> (BFD_RELOC_HI16_S)
5488 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
5489 daddiu $at,<sym> (BFD_RELOC_LO16)
5490 dsll32 $tempreg,0
5491 daddu $tempreg,$tempreg,$at
5492
5493 If $at is already in use, we use a path which is suboptimal
5494 on superscalar processors.
5495 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
5496 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
5497 dsll $tempreg,16
5498 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
5499 dsll $tempreg,16
5500 daddiu $tempreg,<sym> (BFD_RELOC_LO16)
5501
5502 For GP relative symbols in 64bit address space we can use
5503 the same sequence as in 32bit address space. */
aed1a261 5504 if (HAVE_64BIT_SYMBOLS)
252b5132 5505 {
6caf9ef4
TS
5506 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5507 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5508 {
5509 relax_start (offset_expr.X_add_symbol);
5510 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5511 tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5512 relax_switch ();
5513 }
d6bc6245 5514
741fe287 5515 if (used_at == 0 && mips_opts.at)
98d3f06f 5516 {
67c0d1eb 5517 macro_build (&offset_expr, "lui", "t,u",
17a2f251 5518 tempreg, BFD_RELOC_MIPS_HIGHEST);
67c0d1eb 5519 macro_build (&offset_expr, "lui", "t,u",
17a2f251 5520 AT, BFD_RELOC_HI16_S);
67c0d1eb 5521 macro_build (&offset_expr, "daddiu", "t,r,j",
17a2f251 5522 tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
67c0d1eb 5523 macro_build (&offset_expr, "daddiu", "t,r,j",
17a2f251 5524 AT, AT, BFD_RELOC_LO16);
67c0d1eb
RS
5525 macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
5526 macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
98d3f06f
KH
5527 used_at = 1;
5528 }
5529 else
5530 {
67c0d1eb 5531 macro_build (&offset_expr, "lui", "t,u",
17a2f251 5532 tempreg, BFD_RELOC_MIPS_HIGHEST);
67c0d1eb 5533 macro_build (&offset_expr, "daddiu", "t,r,j",
17a2f251 5534 tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
67c0d1eb
RS
5535 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5536 macro_build (&offset_expr, "daddiu", "t,r,j",
17a2f251 5537 tempreg, tempreg, BFD_RELOC_HI16_S);
67c0d1eb
RS
5538 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5539 macro_build (&offset_expr, "daddiu", "t,r,j",
17a2f251 5540 tempreg, tempreg, BFD_RELOC_LO16);
98d3f06f 5541 }
6caf9ef4
TS
5542
5543 if (mips_relax.sequence)
5544 relax_end ();
98d3f06f
KH
5545 }
5546 else
5547 {
5548 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6caf9ef4 5549 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
98d3f06f 5550 {
4d7206a2 5551 relax_start (offset_expr.X_add_symbol);
67c0d1eb
RS
5552 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5553 tempreg, mips_gp_register, BFD_RELOC_GPREL16);
4d7206a2 5554 relax_switch ();
98d3f06f 5555 }
6943caf0
ILT
5556 if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
5557 as_bad (_("offset too large"));
67c0d1eb
RS
5558 macro_build_lui (&offset_expr, tempreg);
5559 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5560 tempreg, tempreg, BFD_RELOC_LO16);
4d7206a2
RS
5561 if (mips_relax.sequence)
5562 relax_end ();
98d3f06f 5563 }
252b5132 5564 }
0a44bf69 5565 else if (!mips_big_got && !HAVE_NEWABI)
252b5132 5566 {
9117d219
NC
5567 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5568
252b5132
RH
5569 /* If this is a reference to an external symbol, and there
5570 is no constant, we want
5571 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
1abe91b1 5572 or for lca or if tempreg is PIC_CALL_REG
9117d219 5573 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
252b5132
RH
5574 For a local symbol, we want
5575 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5576 nop
5577 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5578
5579 If we have a small constant, and this is a reference to
5580 an external symbol, we want
5581 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5582 nop
5583 addiu $tempreg,$tempreg,<constant>
5584 For a local symbol, we want the same instruction
5585 sequence, but we output a BFD_RELOC_LO16 reloc on the
5586 addiu instruction.
5587
5588 If we have a large constant, and this is a reference to
5589 an external symbol, we want
5590 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5591 lui $at,<hiconstant>
5592 addiu $at,$at,<loconstant>
5593 addu $tempreg,$tempreg,$at
5594 For a local symbol, we want the same instruction
5595 sequence, but we output a BFD_RELOC_LO16 reloc on the
ed6fb7bd 5596 addiu instruction.
ed6fb7bd
SC
5597 */
5598
4d7206a2 5599 if (offset_expr.X_add_number == 0)
252b5132 5600 {
0a44bf69
RS
5601 if (mips_pic == SVR4_PIC
5602 && breg == 0
5603 && (call || tempreg == PIC_CALL_REG))
4d7206a2
RS
5604 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5605
5606 relax_start (offset_expr.X_add_symbol);
67c0d1eb
RS
5607 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5608 lw_reloc_type, mips_gp_register);
4d7206a2 5609 if (breg != 0)
252b5132
RH
5610 {
5611 /* We're going to put in an addu instruction using
5612 tempreg, so we may as well insert the nop right
5613 now. */
269137b2 5614 load_delay_nop ();
252b5132 5615 }
4d7206a2 5616 relax_switch ();
67c0d1eb
RS
5617 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5618 tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
269137b2 5619 load_delay_nop ();
67c0d1eb
RS
5620 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5621 tempreg, tempreg, BFD_RELOC_LO16);
4d7206a2 5622 relax_end ();
252b5132
RH
5623 /* FIXME: If breg == 0, and the next instruction uses
5624 $tempreg, then if this variant case is used an extra
5625 nop will be generated. */
5626 }
4d7206a2
RS
5627 else if (offset_expr.X_add_number >= -0x8000
5628 && offset_expr.X_add_number < 0x8000)
252b5132 5629 {
67c0d1eb 5630 load_got_offset (tempreg, &offset_expr);
269137b2 5631 load_delay_nop ();
67c0d1eb 5632 add_got_offset (tempreg, &offset_expr);
252b5132
RH
5633 }
5634 else
5635 {
4d7206a2
RS
5636 expr1.X_add_number = offset_expr.X_add_number;
5637 offset_expr.X_add_number =
5638 ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
67c0d1eb 5639 load_got_offset (tempreg, &offset_expr);
f6a22291 5640 offset_expr.X_add_number = expr1.X_add_number;
252b5132
RH
5641 /* If we are going to add in a base register, and the
5642 target register and the base register are the same,
5643 then we are using AT as a temporary register. Since
5644 we want to load the constant into AT, we add our
5645 current AT (from the global offset table) and the
5646 register into the register now, and pretend we were
5647 not using a base register. */
67c0d1eb 5648 if (breg == treg)
252b5132 5649 {
269137b2 5650 load_delay_nop ();
67c0d1eb 5651 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 5652 treg, AT, breg);
252b5132
RH
5653 breg = 0;
5654 tempreg = treg;
252b5132 5655 }
f6a22291 5656 add_got_offset_hilo (tempreg, &offset_expr, AT);
252b5132
RH
5657 used_at = 1;
5658 }
5659 }
0a44bf69 5660 else if (!mips_big_got && HAVE_NEWABI)
f5040a92 5661 {
67c0d1eb 5662 int add_breg_early = 0;
f5040a92
AO
5663
5664 /* If this is a reference to an external, and there is no
5665 constant, or local symbol (*), with or without a
5666 constant, we want
5667 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
1abe91b1 5668 or for lca or if tempreg is PIC_CALL_REG
f5040a92
AO
5669 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
5670
5671 If we have a small constant, and this is a reference to
5672 an external symbol, we want
5673 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
5674 addiu $tempreg,$tempreg,<constant>
5675
5676 If we have a large constant, and this is a reference to
5677 an external symbol, we want
5678 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
5679 lui $at,<hiconstant>
5680 addiu $at,$at,<loconstant>
5681 addu $tempreg,$tempreg,$at
5682
5683 (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
5684 local symbols, even though it introduces an additional
5685 instruction. */
5686
f5040a92
AO
5687 if (offset_expr.X_add_number)
5688 {
4d7206a2 5689 expr1.X_add_number = offset_expr.X_add_number;
f5040a92
AO
5690 offset_expr.X_add_number = 0;
5691
4d7206a2 5692 relax_start (offset_expr.X_add_symbol);
67c0d1eb
RS
5693 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5694 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
f5040a92
AO
5695
5696 if (expr1.X_add_number >= -0x8000
5697 && expr1.X_add_number < 0x8000)
5698 {
67c0d1eb
RS
5699 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5700 tempreg, tempreg, BFD_RELOC_LO16);
f5040a92 5701 }
ecd13cd3 5702 else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
f5040a92
AO
5703 {
5704 int dreg;
5705
5706 /* If we are going to add in a base register, and the
5707 target register and the base register are the same,
5708 then we are using AT as a temporary register. Since
5709 we want to load the constant into AT, we add our
5710 current AT (from the global offset table) and the
5711 register into the register now, and pretend we were
5712 not using a base register. */
5713 if (breg != treg)
5714 dreg = tempreg;
5715 else
5716 {
5717 assert (tempreg == AT);
67c0d1eb
RS
5718 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5719 treg, AT, breg);
f5040a92 5720 dreg = treg;
67c0d1eb 5721 add_breg_early = 1;
f5040a92
AO
5722 }
5723
f6a22291 5724 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
67c0d1eb 5725 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 5726 dreg, dreg, AT);
f5040a92 5727
f5040a92
AO
5728 used_at = 1;
5729 }
5730 else
5731 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5732
4d7206a2 5733 relax_switch ();
f5040a92
AO
5734 offset_expr.X_add_number = expr1.X_add_number;
5735
67c0d1eb
RS
5736 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5737 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5738 if (add_breg_early)
f5040a92 5739 {
67c0d1eb 5740 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
f899b4b8 5741 treg, tempreg, breg);
f5040a92
AO
5742 breg = 0;
5743 tempreg = treg;
5744 }
4d7206a2 5745 relax_end ();
f5040a92 5746 }
4d7206a2 5747 else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
f5040a92 5748 {
4d7206a2 5749 relax_start (offset_expr.X_add_symbol);
67c0d1eb
RS
5750 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5751 BFD_RELOC_MIPS_CALL16, mips_gp_register);
4d7206a2 5752 relax_switch ();
67c0d1eb
RS
5753 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5754 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4d7206a2 5755 relax_end ();
f5040a92 5756 }
4d7206a2 5757 else
f5040a92 5758 {
67c0d1eb
RS
5759 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5760 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
f5040a92
AO
5761 }
5762 }
0a44bf69 5763 else if (mips_big_got && !HAVE_NEWABI)
252b5132 5764 {
67c0d1eb 5765 int gpdelay;
9117d219
NC
5766 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5767 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
ed6fb7bd 5768 int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
252b5132
RH
5769
5770 /* This is the large GOT case. If this is a reference to an
5771 external symbol, and there is no constant, we want
5772 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5773 addu $tempreg,$tempreg,$gp
5774 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
1abe91b1 5775 or for lca or if tempreg is PIC_CALL_REG
9117d219
NC
5776 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
5777 addu $tempreg,$tempreg,$gp
5778 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
252b5132
RH
5779 For a local symbol, we want
5780 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5781 nop
5782 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5783
5784 If we have a small constant, and this is a reference to
5785 an external symbol, we want
5786 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5787 addu $tempreg,$tempreg,$gp
5788 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5789 nop
5790 addiu $tempreg,$tempreg,<constant>
5791 For a local symbol, we want
5792 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5793 nop
5794 addiu $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5795
5796 If we have a large constant, and this is a reference to
5797 an external symbol, we want
5798 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5799 addu $tempreg,$tempreg,$gp
5800 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5801 lui $at,<hiconstant>
5802 addiu $at,$at,<loconstant>
5803 addu $tempreg,$tempreg,$at
5804 For a local symbol, we want
5805 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5806 lui $at,<hiconstant>
5807 addiu $at,$at,<loconstant> (BFD_RELOC_LO16)
5808 addu $tempreg,$tempreg,$at
f5040a92 5809 */
438c16b8 5810
252b5132
RH
5811 expr1.X_add_number = offset_expr.X_add_number;
5812 offset_expr.X_add_number = 0;
4d7206a2 5813 relax_start (offset_expr.X_add_symbol);
67c0d1eb 5814 gpdelay = reg_needs_delay (mips_gp_register);
1abe91b1
MR
5815 if (expr1.X_add_number == 0 && breg == 0
5816 && (call || tempreg == PIC_CALL_REG))
9117d219
NC
5817 {
5818 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5819 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5820 }
67c0d1eb
RS
5821 macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5822 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 5823 tempreg, tempreg, mips_gp_register);
67c0d1eb 5824 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
17a2f251 5825 tempreg, lw_reloc_type, tempreg);
252b5132
RH
5826 if (expr1.X_add_number == 0)
5827 {
67c0d1eb 5828 if (breg != 0)
252b5132
RH
5829 {
5830 /* We're going to put in an addu instruction using
5831 tempreg, so we may as well insert the nop right
5832 now. */
269137b2 5833 load_delay_nop ();
252b5132 5834 }
252b5132
RH
5835 }
5836 else if (expr1.X_add_number >= -0x8000
5837 && expr1.X_add_number < 0x8000)
5838 {
269137b2 5839 load_delay_nop ();
67c0d1eb 5840 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
17a2f251 5841 tempreg, tempreg, BFD_RELOC_LO16);
252b5132
RH
5842 }
5843 else
5844 {
67c0d1eb 5845 int dreg;
252b5132
RH
5846
5847 /* If we are going to add in a base register, and the
5848 target register and the base register are the same,
5849 then we are using AT as a temporary register. Since
5850 we want to load the constant into AT, we add our
5851 current AT (from the global offset table) and the
5852 register into the register now, and pretend we were
5853 not using a base register. */
5854 if (breg != treg)
67c0d1eb 5855 dreg = tempreg;
252b5132
RH
5856 else
5857 {
5858 assert (tempreg == AT);
269137b2 5859 load_delay_nop ();
67c0d1eb 5860 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 5861 treg, AT, breg);
252b5132 5862 dreg = treg;
252b5132
RH
5863 }
5864
f6a22291 5865 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
67c0d1eb 5866 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
252b5132 5867
252b5132
RH
5868 used_at = 1;
5869 }
4d7206a2
RS
5870 offset_expr.X_add_number =
5871 ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
5872 relax_switch ();
252b5132 5873
67c0d1eb 5874 if (gpdelay)
252b5132
RH
5875 {
5876 /* This is needed because this instruction uses $gp, but
f5040a92 5877 the first instruction on the main stream does not. */
67c0d1eb 5878 macro_build (NULL, "nop", "");
252b5132 5879 }
ed6fb7bd 5880
67c0d1eb
RS
5881 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5882 local_reloc_type, mips_gp_register);
f5040a92 5883 if (expr1.X_add_number >= -0x8000
252b5132
RH
5884 && expr1.X_add_number < 0x8000)
5885 {
269137b2 5886 load_delay_nop ();
67c0d1eb
RS
5887 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5888 tempreg, tempreg, BFD_RELOC_LO16);
252b5132 5889 /* FIXME: If add_number is 0, and there was no base
f5040a92
AO
5890 register, the external symbol case ended with a load,
5891 so if the symbol turns out to not be external, and
5892 the next instruction uses tempreg, an unnecessary nop
5893 will be inserted. */
252b5132
RH
5894 }
5895 else
5896 {
5897 if (breg == treg)
5898 {
5899 /* We must add in the base register now, as in the
f5040a92 5900 external symbol case. */
252b5132 5901 assert (tempreg == AT);
269137b2 5902 load_delay_nop ();
67c0d1eb 5903 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 5904 treg, AT, breg);
252b5132
RH
5905 tempreg = treg;
5906 /* We set breg to 0 because we have arranged to add
f5040a92 5907 it in in both cases. */
252b5132
RH
5908 breg = 0;
5909 }
5910
67c0d1eb
RS
5911 macro_build_lui (&expr1, AT);
5912 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
17a2f251 5913 AT, AT, BFD_RELOC_LO16);
67c0d1eb 5914 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 5915 tempreg, tempreg, AT);
8fc2e39e 5916 used_at = 1;
252b5132 5917 }
4d7206a2 5918 relax_end ();
252b5132 5919 }
0a44bf69 5920 else if (mips_big_got && HAVE_NEWABI)
f5040a92 5921 {
f5040a92
AO
5922 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5923 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
67c0d1eb 5924 int add_breg_early = 0;
f5040a92
AO
5925
5926 /* This is the large GOT case. If this is a reference to an
5927 external symbol, and there is no constant, we want
5928 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5929 add $tempreg,$tempreg,$gp
5930 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
1abe91b1 5931 or for lca or if tempreg is PIC_CALL_REG
f5040a92
AO
5932 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
5933 add $tempreg,$tempreg,$gp
5934 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5935
5936 If we have a small constant, and this is a reference to
5937 an external symbol, we want
5938 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5939 add $tempreg,$tempreg,$gp
5940 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5941 addi $tempreg,$tempreg,<constant>
5942
5943 If we have a large constant, and this is a reference to
5944 an external symbol, we want
5945 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5946 addu $tempreg,$tempreg,$gp
5947 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5948 lui $at,<hiconstant>
5949 addi $at,$at,<loconstant>
5950 add $tempreg,$tempreg,$at
5951
5952 If we have NewABI, and we know it's a local symbol, we want
5953 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
5954 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
5955 otherwise we have to resort to GOT_HI16/GOT_LO16. */
5956
4d7206a2 5957 relax_start (offset_expr.X_add_symbol);
f5040a92 5958
4d7206a2 5959 expr1.X_add_number = offset_expr.X_add_number;
f5040a92
AO
5960 offset_expr.X_add_number = 0;
5961
1abe91b1
MR
5962 if (expr1.X_add_number == 0 && breg == 0
5963 && (call || tempreg == PIC_CALL_REG))
f5040a92
AO
5964 {
5965 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5966 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5967 }
67c0d1eb
RS
5968 macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5969 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 5970 tempreg, tempreg, mips_gp_register);
67c0d1eb
RS
5971 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5972 tempreg, lw_reloc_type, tempreg);
f5040a92
AO
5973
5974 if (expr1.X_add_number == 0)
4d7206a2 5975 ;
f5040a92
AO
5976 else if (expr1.X_add_number >= -0x8000
5977 && expr1.X_add_number < 0x8000)
5978 {
67c0d1eb 5979 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
17a2f251 5980 tempreg, tempreg, BFD_RELOC_LO16);
f5040a92 5981 }
ecd13cd3 5982 else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
f5040a92
AO
5983 {
5984 int dreg;
5985
5986 /* If we are going to add in a base register, and the
5987 target register and the base register are the same,
5988 then we are using AT as a temporary register. Since
5989 we want to load the constant into AT, we add our
5990 current AT (from the global offset table) and the
5991 register into the register now, and pretend we were
5992 not using a base register. */
5993 if (breg != treg)
5994 dreg = tempreg;
5995 else
5996 {
5997 assert (tempreg == AT);
67c0d1eb 5998 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 5999 treg, AT, breg);
f5040a92 6000 dreg = treg;
67c0d1eb 6001 add_breg_early = 1;
f5040a92
AO
6002 }
6003
f6a22291 6004 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
67c0d1eb 6005 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
f5040a92 6006
f5040a92
AO
6007 used_at = 1;
6008 }
6009 else
6010 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
6011
4d7206a2 6012 relax_switch ();
f5040a92 6013 offset_expr.X_add_number = expr1.X_add_number;
67c0d1eb
RS
6014 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6015 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6016 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6017 tempreg, BFD_RELOC_MIPS_GOT_OFST);
6018 if (add_breg_early)
f5040a92 6019 {
67c0d1eb 6020 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6021 treg, tempreg, breg);
f5040a92
AO
6022 breg = 0;
6023 tempreg = treg;
6024 }
4d7206a2 6025 relax_end ();
f5040a92 6026 }
252b5132
RH
6027 else
6028 abort ();
6029
6030 if (breg != 0)
aed1a261 6031 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
252b5132
RH
6032 break;
6033
6034 case M_J_A:
6035 /* The j instruction may not be used in PIC code, since it
6036 requires an absolute address. We convert it to a b
6037 instruction. */
6038 if (mips_pic == NO_PIC)
67c0d1eb 6039 macro_build (&offset_expr, "j", "a");
252b5132 6040 else
67c0d1eb 6041 macro_build (&offset_expr, "b", "p");
8fc2e39e 6042 break;
252b5132
RH
6043
6044 /* The jal instructions must be handled as macros because when
6045 generating PIC code they expand to multi-instruction
6046 sequences. Normally they are simple instructions. */
6047 case M_JAL_1:
6048 dreg = RA;
6049 /* Fall through. */
6050 case M_JAL_2:
3e722fb5 6051 if (mips_pic == NO_PIC)
67c0d1eb 6052 macro_build (NULL, "jalr", "d,s", dreg, sreg);
0a44bf69 6053 else
252b5132
RH
6054 {
6055 if (sreg != PIC_CALL_REG)
6056 as_warn (_("MIPS PIC call to register other than $25"));
bdaaa2e1 6057
67c0d1eb 6058 macro_build (NULL, "jalr", "d,s", dreg, sreg);
0a44bf69 6059 if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
252b5132 6060 {
6478892d
TS
6061 if (mips_cprestore_offset < 0)
6062 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6063 else
6064 {
7a621144
DJ
6065 if (! mips_frame_reg_valid)
6066 {
6067 as_warn (_("No .frame pseudo-op used in PIC code"));
6068 /* Quiet this warning. */
6069 mips_frame_reg_valid = 1;
6070 }
6071 if (! mips_cprestore_valid)
6072 {
6073 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6074 /* Quiet this warning. */
6075 mips_cprestore_valid = 1;
6076 }
6478892d 6077 expr1.X_add_number = mips_cprestore_offset;
67c0d1eb 6078 macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
f899b4b8 6079 mips_gp_register,
256ab948
TS
6080 mips_frame_reg,
6081 HAVE_64BIT_ADDRESSES);
6478892d 6082 }
252b5132
RH
6083 }
6084 }
252b5132 6085
8fc2e39e 6086 break;
252b5132
RH
6087
6088 case M_JAL_A:
6089 if (mips_pic == NO_PIC)
67c0d1eb 6090 macro_build (&offset_expr, "jal", "a");
252b5132
RH
6091 else if (mips_pic == SVR4_PIC)
6092 {
6093 /* If this is a reference to an external symbol, and we are
6094 using a small GOT, we want
6095 lw $25,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
6096 nop
f9419b05 6097 jalr $ra,$25
252b5132
RH
6098 nop
6099 lw $gp,cprestore($sp)
6100 The cprestore value is set using the .cprestore
6101 pseudo-op. If we are using a big GOT, we want
6102 lui $25,<sym> (BFD_RELOC_MIPS_CALL_HI16)
6103 addu $25,$25,$gp
6104 lw $25,<sym>($25) (BFD_RELOC_MIPS_CALL_LO16)
6105 nop
f9419b05 6106 jalr $ra,$25
252b5132
RH
6107 nop
6108 lw $gp,cprestore($sp)
6109 If the symbol is not external, we want
6110 lw $25,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6111 nop
6112 addiu $25,$25,<sym> (BFD_RELOC_LO16)
f9419b05 6113 jalr $ra,$25
252b5132 6114 nop
438c16b8 6115 lw $gp,cprestore($sp)
f5040a92
AO
6116
6117 For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
6118 sequences above, minus nops, unless the symbol is local,
6119 which enables us to use GOT_PAGE/GOT_OFST (big got) or
6120 GOT_DISP. */
438c16b8 6121 if (HAVE_NEWABI)
252b5132 6122 {
f5040a92
AO
6123 if (! mips_big_got)
6124 {
4d7206a2 6125 relax_start (offset_expr.X_add_symbol);
67c0d1eb
RS
6126 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6127 PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
f5040a92 6128 mips_gp_register);
4d7206a2 6129 relax_switch ();
67c0d1eb
RS
6130 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6131 PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
4d7206a2
RS
6132 mips_gp_register);
6133 relax_end ();
f5040a92
AO
6134 }
6135 else
6136 {
4d7206a2 6137 relax_start (offset_expr.X_add_symbol);
67c0d1eb
RS
6138 macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6139 BFD_RELOC_MIPS_CALL_HI16);
6140 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6141 PIC_CALL_REG, mips_gp_register);
6142 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6143 PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6144 PIC_CALL_REG);
4d7206a2 6145 relax_switch ();
67c0d1eb
RS
6146 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6147 PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
6148 mips_gp_register);
6149 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6150 PIC_CALL_REG, PIC_CALL_REG,
17a2f251 6151 BFD_RELOC_MIPS_GOT_OFST);
4d7206a2 6152 relax_end ();
f5040a92 6153 }
684022ea 6154
67c0d1eb 6155 macro_build_jalr (&offset_expr);
252b5132
RH
6156 }
6157 else
6158 {
4d7206a2 6159 relax_start (offset_expr.X_add_symbol);
438c16b8
TS
6160 if (! mips_big_got)
6161 {
67c0d1eb
RS
6162 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6163 PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
17a2f251 6164 mips_gp_register);
269137b2 6165 load_delay_nop ();
4d7206a2 6166 relax_switch ();
438c16b8 6167 }
252b5132 6168 else
252b5132 6169 {
67c0d1eb
RS
6170 int gpdelay;
6171
6172 gpdelay = reg_needs_delay (mips_gp_register);
6173 macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6174 BFD_RELOC_MIPS_CALL_HI16);
6175 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6176 PIC_CALL_REG, mips_gp_register);
6177 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6178 PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6179 PIC_CALL_REG);
269137b2 6180 load_delay_nop ();
4d7206a2 6181 relax_switch ();
67c0d1eb
RS
6182 if (gpdelay)
6183 macro_build (NULL, "nop", "");
252b5132 6184 }
67c0d1eb
RS
6185 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6186 PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
4d7206a2 6187 mips_gp_register);
269137b2 6188 load_delay_nop ();
67c0d1eb
RS
6189 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6190 PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
4d7206a2 6191 relax_end ();
67c0d1eb 6192 macro_build_jalr (&offset_expr);
438c16b8 6193
6478892d
TS
6194 if (mips_cprestore_offset < 0)
6195 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6196 else
6197 {
7a621144
DJ
6198 if (! mips_frame_reg_valid)
6199 {
6200 as_warn (_("No .frame pseudo-op used in PIC code"));
6201 /* Quiet this warning. */
6202 mips_frame_reg_valid = 1;
6203 }
6204 if (! mips_cprestore_valid)
6205 {
6206 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6207 /* Quiet this warning. */
6208 mips_cprestore_valid = 1;
6209 }
6478892d 6210 if (mips_opts.noreorder)
67c0d1eb 6211 macro_build (NULL, "nop", "");
6478892d 6212 expr1.X_add_number = mips_cprestore_offset;
67c0d1eb 6213 macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
f899b4b8 6214 mips_gp_register,
256ab948
TS
6215 mips_frame_reg,
6216 HAVE_64BIT_ADDRESSES);
6478892d 6217 }
252b5132
RH
6218 }
6219 }
0a44bf69
RS
6220 else if (mips_pic == VXWORKS_PIC)
6221 as_bad (_("Non-PIC jump used in PIC library"));
252b5132
RH
6222 else
6223 abort ();
6224
8fc2e39e 6225 break;
252b5132
RH
6226
6227 case M_LB_AB:
6228 s = "lb";
6229 goto ld;
6230 case M_LBU_AB:
6231 s = "lbu";
6232 goto ld;
6233 case M_LH_AB:
6234 s = "lh";
6235 goto ld;
6236 case M_LHU_AB:
6237 s = "lhu";
6238 goto ld;
6239 case M_LW_AB:
6240 s = "lw";
6241 goto ld;
6242 case M_LWC0_AB:
6243 s = "lwc0";
bdaaa2e1 6244 /* Itbl support may require additional care here. */
252b5132
RH
6245 coproc = 1;
6246 goto ld;
6247 case M_LWC1_AB:
6248 s = "lwc1";
bdaaa2e1 6249 /* Itbl support may require additional care here. */
252b5132
RH
6250 coproc = 1;
6251 goto ld;
6252 case M_LWC2_AB:
6253 s = "lwc2";
bdaaa2e1 6254 /* Itbl support may require additional care here. */
252b5132
RH
6255 coproc = 1;
6256 goto ld;
6257 case M_LWC3_AB:
6258 s = "lwc3";
bdaaa2e1 6259 /* Itbl support may require additional care here. */
252b5132
RH
6260 coproc = 1;
6261 goto ld;
6262 case M_LWL_AB:
6263 s = "lwl";
6264 lr = 1;
6265 goto ld;
6266 case M_LWR_AB:
6267 s = "lwr";
6268 lr = 1;
6269 goto ld;
6270 case M_LDC1_AB:
252b5132 6271 s = "ldc1";
bdaaa2e1 6272 /* Itbl support may require additional care here. */
252b5132
RH
6273 coproc = 1;
6274 goto ld;
6275 case M_LDC2_AB:
6276 s = "ldc2";
bdaaa2e1 6277 /* Itbl support may require additional care here. */
252b5132
RH
6278 coproc = 1;
6279 goto ld;
6280 case M_LDC3_AB:
6281 s = "ldc3";
bdaaa2e1 6282 /* Itbl support may require additional care here. */
252b5132
RH
6283 coproc = 1;
6284 goto ld;
6285 case M_LDL_AB:
6286 s = "ldl";
6287 lr = 1;
6288 goto ld;
6289 case M_LDR_AB:
6290 s = "ldr";
6291 lr = 1;
6292 goto ld;
6293 case M_LL_AB:
6294 s = "ll";
6295 goto ld;
6296 case M_LLD_AB:
6297 s = "lld";
6298 goto ld;
6299 case M_LWU_AB:
6300 s = "lwu";
6301 ld:
8fc2e39e 6302 if (breg == treg || coproc || lr)
252b5132
RH
6303 {
6304 tempreg = AT;
6305 used_at = 1;
6306 }
6307 else
6308 {
6309 tempreg = treg;
252b5132
RH
6310 }
6311 goto ld_st;
6312 case M_SB_AB:
6313 s = "sb";
6314 goto st;
6315 case M_SH_AB:
6316 s = "sh";
6317 goto st;
6318 case M_SW_AB:
6319 s = "sw";
6320 goto st;
6321 case M_SWC0_AB:
6322 s = "swc0";
bdaaa2e1 6323 /* Itbl support may require additional care here. */
252b5132
RH
6324 coproc = 1;
6325 goto st;
6326 case M_SWC1_AB:
6327 s = "swc1";
bdaaa2e1 6328 /* Itbl support may require additional care here. */
252b5132
RH
6329 coproc = 1;
6330 goto st;
6331 case M_SWC2_AB:
6332 s = "swc2";
bdaaa2e1 6333 /* Itbl support may require additional care here. */
252b5132
RH
6334 coproc = 1;
6335 goto st;
6336 case M_SWC3_AB:
6337 s = "swc3";
bdaaa2e1 6338 /* Itbl support may require additional care here. */
252b5132
RH
6339 coproc = 1;
6340 goto st;
6341 case M_SWL_AB:
6342 s = "swl";
6343 goto st;
6344 case M_SWR_AB:
6345 s = "swr";
6346 goto st;
6347 case M_SC_AB:
6348 s = "sc";
6349 goto st;
6350 case M_SCD_AB:
6351 s = "scd";
6352 goto st;
d43b4baf
TS
6353 case M_CACHE_AB:
6354 s = "cache";
6355 goto st;
252b5132 6356 case M_SDC1_AB:
252b5132
RH
6357 s = "sdc1";
6358 coproc = 1;
bdaaa2e1 6359 /* Itbl support may require additional care here. */
252b5132
RH
6360 goto st;
6361 case M_SDC2_AB:
6362 s = "sdc2";
bdaaa2e1 6363 /* Itbl support may require additional care here. */
252b5132
RH
6364 coproc = 1;
6365 goto st;
6366 case M_SDC3_AB:
6367 s = "sdc3";
bdaaa2e1 6368 /* Itbl support may require additional care here. */
252b5132
RH
6369 coproc = 1;
6370 goto st;
6371 case M_SDL_AB:
6372 s = "sdl";
6373 goto st;
6374 case M_SDR_AB:
6375 s = "sdr";
6376 st:
8fc2e39e
TS
6377 tempreg = AT;
6378 used_at = 1;
252b5132 6379 ld_st:
b19e8a9b
AN
6380 if (coproc
6381 && NO_ISA_COP (mips_opts.arch)
6382 && (ip->insn_mo->pinfo2 & (INSN2_M_FP_S | INSN2_M_FP_D)) == 0)
6383 {
6384 as_bad (_("opcode not supported on this processor: %s"),
6385 mips_cpu_info_from_arch (mips_opts.arch)->name);
6386 break;
6387 }
6388
bdaaa2e1 6389 /* Itbl support may require additional care here. */
252b5132
RH
6390 if (mask == M_LWC1_AB
6391 || mask == M_SWC1_AB
6392 || mask == M_LDC1_AB
6393 || mask == M_SDC1_AB
6394 || mask == M_L_DAB
6395 || mask == M_S_DAB)
6396 fmt = "T,o(b)";
d43b4baf
TS
6397 else if (mask == M_CACHE_AB)
6398 fmt = "k,o(b)";
252b5132
RH
6399 else if (coproc)
6400 fmt = "E,o(b)";
6401 else
6402 fmt = "t,o(b)";
6403
6404 if (offset_expr.X_op != O_constant
6405 && offset_expr.X_op != O_symbol)
6406 {
6407 as_bad (_("expression too complex"));
6408 offset_expr.X_op = O_constant;
6409 }
6410
2051e8c4
MR
6411 if (HAVE_32BIT_ADDRESSES
6412 && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
55e08f71
NC
6413 {
6414 char value [32];
6415
6416 sprintf_vma (value, offset_expr.X_add_number);
20e1fcfd 6417 as_bad (_("Number (0x%s) larger than 32 bits"), value);
55e08f71 6418 }
2051e8c4 6419
252b5132
RH
6420 /* A constant expression in PIC code can be handled just as it
6421 is in non PIC code. */
aed1a261
RS
6422 if (offset_expr.X_op == O_constant)
6423 {
aed1a261
RS
6424 expr1.X_add_number = ((offset_expr.X_add_number + 0x8000)
6425 & ~(bfd_vma) 0xffff);
2051e8c4 6426 normalize_address_expr (&expr1);
aed1a261
RS
6427 load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
6428 if (breg != 0)
6429 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6430 tempreg, tempreg, breg);
6431 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6432 }
6433 else if (mips_pic == NO_PIC)
252b5132
RH
6434 {
6435 /* If this is a reference to a GP relative symbol, and there
6436 is no base register, we want
cdf6fd85 6437 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
252b5132
RH
6438 Otherwise, if there is no base register, we want
6439 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
6440 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6441 If we have a constant, we need two instructions anyhow,
6442 so we always use the latter form.
6443
6444 If we have a base register, and this is a reference to a
6445 GP relative symbol, we want
6446 addu $tempreg,$breg,$gp
cdf6fd85 6447 <op> $treg,<sym>($tempreg) (BFD_RELOC_GPREL16)
252b5132
RH
6448 Otherwise we want
6449 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
6450 addu $tempreg,$tempreg,$breg
6451 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
d6bc6245 6452 With a constant we always use the latter case.
76b3015f 6453
d6bc6245
TS
6454 With 64bit address space and no base register and $at usable,
6455 we want
6456 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6457 lui $at,<sym> (BFD_RELOC_HI16_S)
6458 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6459 dsll32 $tempreg,0
6460 daddu $tempreg,$at
6461 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6462 If we have a base register, we want
6463 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6464 lui $at,<sym> (BFD_RELOC_HI16_S)
6465 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6466 daddu $at,$breg
6467 dsll32 $tempreg,0
6468 daddu $tempreg,$at
6469 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6470
6471 Without $at we can't generate the optimal path for superscalar
6472 processors here since this would require two temporary registers.
6473 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6474 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6475 dsll $tempreg,16
6476 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
6477 dsll $tempreg,16
6478 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6479 If we have a base register, we want
6480 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6481 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6482 dsll $tempreg,16
6483 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
6484 dsll $tempreg,16
6485 daddu $tempreg,$tempreg,$breg
6486 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6373ee54 6487
6caf9ef4 6488 For GP relative symbols in 64bit address space we can use
aed1a261
RS
6489 the same sequence as in 32bit address space. */
6490 if (HAVE_64BIT_SYMBOLS)
d6bc6245 6491 {
aed1a261 6492 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6caf9ef4
TS
6493 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6494 {
6495 relax_start (offset_expr.X_add_symbol);
6496 if (breg == 0)
6497 {
6498 macro_build (&offset_expr, s, fmt, treg,
6499 BFD_RELOC_GPREL16, mips_gp_register);
6500 }
6501 else
6502 {
6503 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6504 tempreg, breg, mips_gp_register);
6505 macro_build (&offset_expr, s, fmt, treg,
6506 BFD_RELOC_GPREL16, tempreg);
6507 }
6508 relax_switch ();
6509 }
d6bc6245 6510
741fe287 6511 if (used_at == 0 && mips_opts.at)
d6bc6245 6512 {
67c0d1eb
RS
6513 macro_build (&offset_expr, "lui", "t,u", tempreg,
6514 BFD_RELOC_MIPS_HIGHEST);
6515 macro_build (&offset_expr, "lui", "t,u", AT,
6516 BFD_RELOC_HI16_S);
6517 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6518 tempreg, BFD_RELOC_MIPS_HIGHER);
d6bc6245 6519 if (breg != 0)
67c0d1eb
RS
6520 macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
6521 macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
6522 macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
6523 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
6524 tempreg);
d6bc6245
TS
6525 used_at = 1;
6526 }
6527 else
6528 {
67c0d1eb
RS
6529 macro_build (&offset_expr, "lui", "t,u", tempreg,
6530 BFD_RELOC_MIPS_HIGHEST);
6531 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6532 tempreg, BFD_RELOC_MIPS_HIGHER);
6533 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6534 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6535 tempreg, BFD_RELOC_HI16_S);
6536 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
d6bc6245 6537 if (breg != 0)
67c0d1eb 6538 macro_build (NULL, "daddu", "d,v,t",
17a2f251 6539 tempreg, tempreg, breg);
67c0d1eb 6540 macro_build (&offset_expr, s, fmt, treg,
17a2f251 6541 BFD_RELOC_LO16, tempreg);
d6bc6245 6542 }
6caf9ef4
TS
6543
6544 if (mips_relax.sequence)
6545 relax_end ();
8fc2e39e 6546 break;
d6bc6245 6547 }
256ab948 6548
252b5132
RH
6549 if (breg == 0)
6550 {
67c0d1eb 6551 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6caf9ef4 6552 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
252b5132 6553 {
4d7206a2 6554 relax_start (offset_expr.X_add_symbol);
67c0d1eb
RS
6555 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6556 mips_gp_register);
4d7206a2 6557 relax_switch ();
252b5132 6558 }
67c0d1eb
RS
6559 macro_build_lui (&offset_expr, tempreg);
6560 macro_build (&offset_expr, s, fmt, treg,
17a2f251 6561 BFD_RELOC_LO16, tempreg);
4d7206a2
RS
6562 if (mips_relax.sequence)
6563 relax_end ();
252b5132
RH
6564 }
6565 else
6566 {
67c0d1eb 6567 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6caf9ef4 6568 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
252b5132 6569 {
4d7206a2 6570 relax_start (offset_expr.X_add_symbol);
67c0d1eb 6571 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6572 tempreg, breg, mips_gp_register);
67c0d1eb 6573 macro_build (&offset_expr, s, fmt, treg,
17a2f251 6574 BFD_RELOC_GPREL16, tempreg);
4d7206a2 6575 relax_switch ();
252b5132 6576 }
67c0d1eb
RS
6577 macro_build_lui (&offset_expr, tempreg);
6578 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6579 tempreg, tempreg, breg);
67c0d1eb 6580 macro_build (&offset_expr, s, fmt, treg,
17a2f251 6581 BFD_RELOC_LO16, tempreg);
4d7206a2
RS
6582 if (mips_relax.sequence)
6583 relax_end ();
252b5132
RH
6584 }
6585 }
0a44bf69 6586 else if (!mips_big_got)
252b5132 6587 {
ed6fb7bd 6588 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
f9419b05 6589
252b5132
RH
6590 /* If this is a reference to an external symbol, we want
6591 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6592 nop
6593 <op> $treg,0($tempreg)
6594 Otherwise we want
6595 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6596 nop
6597 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6598 <op> $treg,0($tempreg)
f5040a92
AO
6599
6600 For NewABI, we want
6601 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
6602 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST)
6603
252b5132
RH
6604 If there is a base register, we add it to $tempreg before
6605 the <op>. If there is a constant, we stick it in the
6606 <op> instruction. We don't handle constants larger than
6607 16 bits, because we have no way to load the upper 16 bits
6608 (actually, we could handle them for the subset of cases
6609 in which we are not using $at). */
6610 assert (offset_expr.X_op == O_symbol);
f5040a92
AO
6611 if (HAVE_NEWABI)
6612 {
67c0d1eb
RS
6613 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6614 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
f5040a92 6615 if (breg != 0)
67c0d1eb 6616 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6617 tempreg, tempreg, breg);
67c0d1eb 6618 macro_build (&offset_expr, s, fmt, treg,
17a2f251 6619 BFD_RELOC_MIPS_GOT_OFST, tempreg);
f5040a92
AO
6620 break;
6621 }
252b5132
RH
6622 expr1.X_add_number = offset_expr.X_add_number;
6623 offset_expr.X_add_number = 0;
6624 if (expr1.X_add_number < -0x8000
6625 || expr1.X_add_number >= 0x8000)
6626 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
67c0d1eb
RS
6627 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6628 lw_reloc_type, mips_gp_register);
269137b2 6629 load_delay_nop ();
4d7206a2
RS
6630 relax_start (offset_expr.X_add_symbol);
6631 relax_switch ();
67c0d1eb
RS
6632 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6633 tempreg, BFD_RELOC_LO16);
4d7206a2 6634 relax_end ();
252b5132 6635 if (breg != 0)
67c0d1eb 6636 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6637 tempreg, tempreg, breg);
67c0d1eb 6638 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
252b5132 6639 }
0a44bf69 6640 else if (mips_big_got && !HAVE_NEWABI)
252b5132 6641 {
67c0d1eb 6642 int gpdelay;
252b5132
RH
6643
6644 /* If this is a reference to an external symbol, we want
6645 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6646 addu $tempreg,$tempreg,$gp
6647 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6648 <op> $treg,0($tempreg)
6649 Otherwise we want
6650 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6651 nop
6652 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6653 <op> $treg,0($tempreg)
6654 If there is a base register, we add it to $tempreg before
6655 the <op>. If there is a constant, we stick it in the
6656 <op> instruction. We don't handle constants larger than
6657 16 bits, because we have no way to load the upper 16 bits
6658 (actually, we could handle them for the subset of cases
f5040a92 6659 in which we are not using $at). */
252b5132
RH
6660 assert (offset_expr.X_op == O_symbol);
6661 expr1.X_add_number = offset_expr.X_add_number;
6662 offset_expr.X_add_number = 0;
6663 if (expr1.X_add_number < -0x8000
6664 || expr1.X_add_number >= 0x8000)
6665 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
67c0d1eb 6666 gpdelay = reg_needs_delay (mips_gp_register);
4d7206a2 6667 relax_start (offset_expr.X_add_symbol);
67c0d1eb 6668 macro_build (&offset_expr, "lui", "t,u", tempreg,
17a2f251 6669 BFD_RELOC_MIPS_GOT_HI16);
67c0d1eb
RS
6670 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6671 mips_gp_register);
6672 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6673 BFD_RELOC_MIPS_GOT_LO16, tempreg);
4d7206a2 6674 relax_switch ();
67c0d1eb
RS
6675 if (gpdelay)
6676 macro_build (NULL, "nop", "");
6677 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6678 BFD_RELOC_MIPS_GOT16, mips_gp_register);
269137b2 6679 load_delay_nop ();
67c0d1eb
RS
6680 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6681 tempreg, BFD_RELOC_LO16);
4d7206a2
RS
6682 relax_end ();
6683
252b5132 6684 if (breg != 0)
67c0d1eb 6685 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6686 tempreg, tempreg, breg);
67c0d1eb 6687 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
252b5132 6688 }
0a44bf69 6689 else if (mips_big_got && HAVE_NEWABI)
f5040a92 6690 {
f5040a92
AO
6691 /* If this is a reference to an external symbol, we want
6692 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6693 add $tempreg,$tempreg,$gp
6694 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6695 <op> $treg,<ofst>($tempreg)
6696 Otherwise, for local symbols, we want:
6697 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
6698 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST) */
6699 assert (offset_expr.X_op == O_symbol);
4d7206a2 6700 expr1.X_add_number = offset_expr.X_add_number;
f5040a92
AO
6701 offset_expr.X_add_number = 0;
6702 if (expr1.X_add_number < -0x8000
6703 || expr1.X_add_number >= 0x8000)
6704 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4d7206a2 6705 relax_start (offset_expr.X_add_symbol);
67c0d1eb 6706 macro_build (&offset_expr, "lui", "t,u", tempreg,
17a2f251 6707 BFD_RELOC_MIPS_GOT_HI16);
67c0d1eb
RS
6708 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6709 mips_gp_register);
6710 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6711 BFD_RELOC_MIPS_GOT_LO16, tempreg);
f5040a92 6712 if (breg != 0)
67c0d1eb 6713 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6714 tempreg, tempreg, breg);
67c0d1eb 6715 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
684022ea 6716
4d7206a2 6717 relax_switch ();
f5040a92 6718 offset_expr.X_add_number = expr1.X_add_number;
67c0d1eb
RS
6719 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6720 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
f5040a92 6721 if (breg != 0)
67c0d1eb 6722 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6723 tempreg, tempreg, breg);
67c0d1eb 6724 macro_build (&offset_expr, s, fmt, treg,
17a2f251 6725 BFD_RELOC_MIPS_GOT_OFST, tempreg);
4d7206a2 6726 relax_end ();
f5040a92 6727 }
252b5132
RH
6728 else
6729 abort ();
6730
252b5132
RH
6731 break;
6732
6733 case M_LI:
6734 case M_LI_S:
67c0d1eb 6735 load_register (treg, &imm_expr, 0);
8fc2e39e 6736 break;
252b5132
RH
6737
6738 case M_DLI:
67c0d1eb 6739 load_register (treg, &imm_expr, 1);
8fc2e39e 6740 break;
252b5132
RH
6741
6742 case M_LI_SS:
6743 if (imm_expr.X_op == O_constant)
6744 {
8fc2e39e 6745 used_at = 1;
67c0d1eb
RS
6746 load_register (AT, &imm_expr, 0);
6747 macro_build (NULL, "mtc1", "t,G", AT, treg);
252b5132
RH
6748 break;
6749 }
6750 else
6751 {
6752 assert (offset_expr.X_op == O_symbol
6753 && strcmp (segment_name (S_GET_SEGMENT
6754 (offset_expr.X_add_symbol)),
6755 ".lit4") == 0
6756 && offset_expr.X_add_number == 0);
67c0d1eb 6757 macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
17a2f251 6758 BFD_RELOC_MIPS_LITERAL, mips_gp_register);
8fc2e39e 6759 break;
252b5132
RH
6760 }
6761
6762 case M_LI_D:
ca4e0257
RS
6763 /* Check if we have a constant in IMM_EXPR. If the GPRs are 64 bits
6764 wide, IMM_EXPR is the entire value. Otherwise IMM_EXPR is the high
6765 order 32 bits of the value and the low order 32 bits are either
6766 zero or in OFFSET_EXPR. */
252b5132
RH
6767 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6768 {
ca4e0257 6769 if (HAVE_64BIT_GPRS)
67c0d1eb 6770 load_register (treg, &imm_expr, 1);
252b5132
RH
6771 else
6772 {
6773 int hreg, lreg;
6774
6775 if (target_big_endian)
6776 {
6777 hreg = treg;
6778 lreg = treg + 1;
6779 }
6780 else
6781 {
6782 hreg = treg + 1;
6783 lreg = treg;
6784 }
6785
6786 if (hreg <= 31)
67c0d1eb 6787 load_register (hreg, &imm_expr, 0);
252b5132
RH
6788 if (lreg <= 31)
6789 {
6790 if (offset_expr.X_op == O_absent)
67c0d1eb 6791 move_register (lreg, 0);
252b5132
RH
6792 else
6793 {
6794 assert (offset_expr.X_op == O_constant);
67c0d1eb 6795 load_register (lreg, &offset_expr, 0);
252b5132
RH
6796 }
6797 }
6798 }
8fc2e39e 6799 break;
252b5132
RH
6800 }
6801
6802 /* We know that sym is in the .rdata section. First we get the
6803 upper 16 bits of the address. */
6804 if (mips_pic == NO_PIC)
6805 {
67c0d1eb 6806 macro_build_lui (&offset_expr, AT);
8fc2e39e 6807 used_at = 1;
252b5132 6808 }
0a44bf69 6809 else
252b5132 6810 {
67c0d1eb
RS
6811 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6812 BFD_RELOC_MIPS_GOT16, mips_gp_register);
8fc2e39e 6813 used_at = 1;
252b5132 6814 }
bdaaa2e1 6815
252b5132 6816 /* Now we load the register(s). */
ca4e0257 6817 if (HAVE_64BIT_GPRS)
8fc2e39e
TS
6818 {
6819 used_at = 1;
6820 macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6821 }
252b5132
RH
6822 else
6823 {
8fc2e39e 6824 used_at = 1;
67c0d1eb 6825 macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
f9419b05 6826 if (treg != RA)
252b5132
RH
6827 {
6828 /* FIXME: How in the world do we deal with the possible
6829 overflow here? */
6830 offset_expr.X_add_number += 4;
67c0d1eb 6831 macro_build (&offset_expr, "lw", "t,o(b)",
17a2f251 6832 treg + 1, BFD_RELOC_LO16, AT);
252b5132
RH
6833 }
6834 }
252b5132
RH
6835 break;
6836
6837 case M_LI_DD:
ca4e0257
RS
6838 /* Check if we have a constant in IMM_EXPR. If the FPRs are 64 bits
6839 wide, IMM_EXPR is the entire value and the GPRs are known to be 64
6840 bits wide as well. Otherwise IMM_EXPR is the high order 32 bits of
6841 the value and the low order 32 bits are either zero or in
6842 OFFSET_EXPR. */
252b5132
RH
6843 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6844 {
8fc2e39e 6845 used_at = 1;
67c0d1eb 6846 load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
ca4e0257
RS
6847 if (HAVE_64BIT_FPRS)
6848 {
6849 assert (HAVE_64BIT_GPRS);
67c0d1eb 6850 macro_build (NULL, "dmtc1", "t,S", AT, treg);
ca4e0257 6851 }
252b5132
RH
6852 else
6853 {
67c0d1eb 6854 macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
252b5132 6855 if (offset_expr.X_op == O_absent)
67c0d1eb 6856 macro_build (NULL, "mtc1", "t,G", 0, treg);
252b5132
RH
6857 else
6858 {
6859 assert (offset_expr.X_op == O_constant);
67c0d1eb
RS
6860 load_register (AT, &offset_expr, 0);
6861 macro_build (NULL, "mtc1", "t,G", AT, treg);
252b5132
RH
6862 }
6863 }
6864 break;
6865 }
6866
6867 assert (offset_expr.X_op == O_symbol
6868 && offset_expr.X_add_number == 0);
6869 s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
6870 if (strcmp (s, ".lit8") == 0)
6871 {
e7af610e 6872 if (mips_opts.isa != ISA_MIPS1)
252b5132 6873 {
67c0d1eb 6874 macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
17a2f251 6875 BFD_RELOC_MIPS_LITERAL, mips_gp_register);
8fc2e39e 6876 break;
252b5132 6877 }
c9914766 6878 breg = mips_gp_register;
252b5132
RH
6879 r = BFD_RELOC_MIPS_LITERAL;
6880 goto dob;
6881 }
6882 else
6883 {
6884 assert (strcmp (s, RDATA_SECTION_NAME) == 0);
8fc2e39e 6885 used_at = 1;
0a44bf69 6886 if (mips_pic != NO_PIC)
67c0d1eb
RS
6887 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6888 BFD_RELOC_MIPS_GOT16, mips_gp_register);
252b5132
RH
6889 else
6890 {
6891 /* FIXME: This won't work for a 64 bit address. */
67c0d1eb 6892 macro_build_lui (&offset_expr, AT);
252b5132 6893 }
bdaaa2e1 6894
e7af610e 6895 if (mips_opts.isa != ISA_MIPS1)
252b5132 6896 {
67c0d1eb
RS
6897 macro_build (&offset_expr, "ldc1", "T,o(b)",
6898 treg, BFD_RELOC_LO16, AT);
252b5132
RH
6899 break;
6900 }
6901 breg = AT;
6902 r = BFD_RELOC_LO16;
6903 goto dob;
6904 }
6905
6906 case M_L_DOB:
252b5132
RH
6907 /* Even on a big endian machine $fn comes before $fn+1. We have
6908 to adjust when loading from memory. */
6909 r = BFD_RELOC_LO16;
6910 dob:
e7af610e 6911 assert (mips_opts.isa == ISA_MIPS1);
67c0d1eb 6912 macro_build (&offset_expr, "lwc1", "T,o(b)",
17a2f251 6913 target_big_endian ? treg + 1 : treg, r, breg);
252b5132
RH
6914 /* FIXME: A possible overflow which I don't know how to deal
6915 with. */
6916 offset_expr.X_add_number += 4;
67c0d1eb 6917 macro_build (&offset_expr, "lwc1", "T,o(b)",
17a2f251 6918 target_big_endian ? treg : treg + 1, r, breg);
252b5132
RH
6919 break;
6920
6921 case M_L_DAB:
6922 /*
6923 * The MIPS assembler seems to check for X_add_number not
6924 * being double aligned and generating:
6925 * lui at,%hi(foo+1)
6926 * addu at,at,v1
6927 * addiu at,at,%lo(foo+1)
6928 * lwc1 f2,0(at)
6929 * lwc1 f3,4(at)
6930 * But, the resulting address is the same after relocation so why
6931 * generate the extra instruction?
6932 */
bdaaa2e1 6933 /* Itbl support may require additional care here. */
252b5132 6934 coproc = 1;
e7af610e 6935 if (mips_opts.isa != ISA_MIPS1)
252b5132
RH
6936 {
6937 s = "ldc1";
6938 goto ld;
6939 }
6940
6941 s = "lwc1";
6942 fmt = "T,o(b)";
6943 goto ldd_std;
6944
6945 case M_S_DAB:
e7af610e 6946 if (mips_opts.isa != ISA_MIPS1)
252b5132
RH
6947 {
6948 s = "sdc1";
6949 goto st;
6950 }
6951
6952 s = "swc1";
6953 fmt = "T,o(b)";
bdaaa2e1 6954 /* Itbl support may require additional care here. */
252b5132
RH
6955 coproc = 1;
6956 goto ldd_std;
6957
6958 case M_LD_AB:
ca4e0257 6959 if (HAVE_64BIT_GPRS)
252b5132
RH
6960 {
6961 s = "ld";
6962 goto ld;
6963 }
6964
6965 s = "lw";
6966 fmt = "t,o(b)";
6967 goto ldd_std;
6968
6969 case M_SD_AB:
ca4e0257 6970 if (HAVE_64BIT_GPRS)
252b5132
RH
6971 {
6972 s = "sd";
6973 goto st;
6974 }
6975
6976 s = "sw";
6977 fmt = "t,o(b)";
6978
6979 ldd_std:
6980 if (offset_expr.X_op != O_symbol
6981 && offset_expr.X_op != O_constant)
6982 {
6983 as_bad (_("expression too complex"));
6984 offset_expr.X_op = O_constant;
6985 }
6986
2051e8c4
MR
6987 if (HAVE_32BIT_ADDRESSES
6988 && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
55e08f71
NC
6989 {
6990 char value [32];
6991
6992 sprintf_vma (value, offset_expr.X_add_number);
20e1fcfd 6993 as_bad (_("Number (0x%s) larger than 32 bits"), value);
55e08f71 6994 }
2051e8c4 6995
252b5132
RH
6996 /* Even on a big endian machine $fn comes before $fn+1. We have
6997 to adjust when loading from memory. We set coproc if we must
6998 load $fn+1 first. */
bdaaa2e1 6999 /* Itbl support may require additional care here. */
252b5132
RH
7000 if (! target_big_endian)
7001 coproc = 0;
7002
7003 if (mips_pic == NO_PIC
7004 || offset_expr.X_op == O_constant)
7005 {
7006 /* If this is a reference to a GP relative symbol, we want
cdf6fd85
TS
7007 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
7008 <op> $treg+1,<sym>+4($gp) (BFD_RELOC_GPREL16)
252b5132
RH
7009 If we have a base register, we use this
7010 addu $at,$breg,$gp
cdf6fd85
TS
7011 <op> $treg,<sym>($at) (BFD_RELOC_GPREL16)
7012 <op> $treg+1,<sym>+4($at) (BFD_RELOC_GPREL16)
252b5132
RH
7013 If this is not a GP relative symbol, we want
7014 lui $at,<sym> (BFD_RELOC_HI16_S)
7015 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
7016 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
7017 If there is a base register, we add it to $at after the
7018 lui instruction. If there is a constant, we always use
7019 the last case. */
39a59cf8
MR
7020 if (offset_expr.X_op == O_symbol
7021 && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6caf9ef4 7022 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
252b5132 7023 {
4d7206a2 7024 relax_start (offset_expr.X_add_symbol);
252b5132
RH
7025 if (breg == 0)
7026 {
c9914766 7027 tempreg = mips_gp_register;
252b5132
RH
7028 }
7029 else
7030 {
67c0d1eb 7031 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 7032 AT, breg, mips_gp_register);
252b5132 7033 tempreg = AT;
252b5132
RH
7034 used_at = 1;
7035 }
7036
beae10d5 7037 /* Itbl support may require additional care here. */
67c0d1eb 7038 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
17a2f251 7039 BFD_RELOC_GPREL16, tempreg);
252b5132
RH
7040 offset_expr.X_add_number += 4;
7041
7042 /* Set mips_optimize to 2 to avoid inserting an
7043 undesired nop. */
7044 hold_mips_optimize = mips_optimize;
7045 mips_optimize = 2;
beae10d5 7046 /* Itbl support may require additional care here. */
67c0d1eb 7047 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
17a2f251 7048 BFD_RELOC_GPREL16, tempreg);
252b5132
RH
7049 mips_optimize = hold_mips_optimize;
7050
4d7206a2 7051 relax_switch ();
252b5132
RH
7052
7053 /* We just generated two relocs. When tc_gen_reloc
7054 handles this case, it will skip the first reloc and
7055 handle the second. The second reloc already has an
7056 extra addend of 4, which we added above. We must
7057 subtract it out, and then subtract another 4 to make
7058 the first reloc come out right. The second reloc
7059 will come out right because we are going to add 4 to
7060 offset_expr when we build its instruction below.
7061
7062 If we have a symbol, then we don't want to include
7063 the offset, because it will wind up being included
7064 when we generate the reloc. */
7065
7066 if (offset_expr.X_op == O_constant)
7067 offset_expr.X_add_number -= 8;
7068 else
7069 {
7070 offset_expr.X_add_number = -4;
7071 offset_expr.X_op = O_constant;
7072 }
7073 }
8fc2e39e 7074 used_at = 1;
67c0d1eb 7075 macro_build_lui (&offset_expr, AT);
252b5132 7076 if (breg != 0)
67c0d1eb 7077 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
beae10d5 7078 /* Itbl support may require additional care here. */
67c0d1eb 7079 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
17a2f251 7080 BFD_RELOC_LO16, AT);
252b5132
RH
7081 /* FIXME: How do we handle overflow here? */
7082 offset_expr.X_add_number += 4;
beae10d5 7083 /* Itbl support may require additional care here. */
67c0d1eb 7084 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
17a2f251 7085 BFD_RELOC_LO16, AT);
4d7206a2
RS
7086 if (mips_relax.sequence)
7087 relax_end ();
bdaaa2e1 7088 }
0a44bf69 7089 else if (!mips_big_got)
252b5132 7090 {
252b5132
RH
7091 /* If this is a reference to an external symbol, we want
7092 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7093 nop
7094 <op> $treg,0($at)
7095 <op> $treg+1,4($at)
7096 Otherwise we want
7097 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7098 nop
7099 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
7100 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
7101 If there is a base register we add it to $at before the
7102 lwc1 instructions. If there is a constant we include it
7103 in the lwc1 instructions. */
7104 used_at = 1;
7105 expr1.X_add_number = offset_expr.X_add_number;
252b5132
RH
7106 if (expr1.X_add_number < -0x8000
7107 || expr1.X_add_number >= 0x8000 - 4)
7108 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
67c0d1eb 7109 load_got_offset (AT, &offset_expr);
269137b2 7110 load_delay_nop ();
252b5132 7111 if (breg != 0)
67c0d1eb 7112 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
252b5132
RH
7113
7114 /* Set mips_optimize to 2 to avoid inserting an undesired
7115 nop. */
7116 hold_mips_optimize = mips_optimize;
7117 mips_optimize = 2;
4d7206a2 7118
beae10d5 7119 /* Itbl support may require additional care here. */
4d7206a2 7120 relax_start (offset_expr.X_add_symbol);
67c0d1eb
RS
7121 macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7122 BFD_RELOC_LO16, AT);
4d7206a2 7123 expr1.X_add_number += 4;
67c0d1eb
RS
7124 macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7125 BFD_RELOC_LO16, AT);
4d7206a2 7126 relax_switch ();
67c0d1eb
RS
7127 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7128 BFD_RELOC_LO16, AT);
4d7206a2 7129 offset_expr.X_add_number += 4;
67c0d1eb
RS
7130 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7131 BFD_RELOC_LO16, AT);
4d7206a2 7132 relax_end ();
252b5132 7133
4d7206a2 7134 mips_optimize = hold_mips_optimize;
252b5132 7135 }
0a44bf69 7136 else if (mips_big_got)
252b5132 7137 {
67c0d1eb 7138 int gpdelay;
252b5132
RH
7139
7140 /* If this is a reference to an external symbol, we want
7141 lui $at,<sym> (BFD_RELOC_MIPS_GOT_HI16)
7142 addu $at,$at,$gp
7143 lw $at,<sym>($at) (BFD_RELOC_MIPS_GOT_LO16)
7144 nop
7145 <op> $treg,0($at)
7146 <op> $treg+1,4($at)
7147 Otherwise we want
7148 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7149 nop
7150 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
7151 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
7152 If there is a base register we add it to $at before the
7153 lwc1 instructions. If there is a constant we include it
7154 in the lwc1 instructions. */
7155 used_at = 1;
7156 expr1.X_add_number = offset_expr.X_add_number;
7157 offset_expr.X_add_number = 0;
7158 if (expr1.X_add_number < -0x8000
7159 || expr1.X_add_number >= 0x8000 - 4)
7160 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
67c0d1eb 7161 gpdelay = reg_needs_delay (mips_gp_register);
4d7206a2 7162 relax_start (offset_expr.X_add_symbol);
67c0d1eb
RS
7163 macro_build (&offset_expr, "lui", "t,u",
7164 AT, BFD_RELOC_MIPS_GOT_HI16);
7165 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 7166 AT, AT, mips_gp_register);
67c0d1eb 7167 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
17a2f251 7168 AT, BFD_RELOC_MIPS_GOT_LO16, AT);
269137b2 7169 load_delay_nop ();
252b5132 7170 if (breg != 0)
67c0d1eb 7171 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
beae10d5 7172 /* Itbl support may require additional care here. */
67c0d1eb 7173 macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
17a2f251 7174 BFD_RELOC_LO16, AT);
252b5132
RH
7175 expr1.X_add_number += 4;
7176
7177 /* Set mips_optimize to 2 to avoid inserting an undesired
7178 nop. */
7179 hold_mips_optimize = mips_optimize;
7180 mips_optimize = 2;
beae10d5 7181 /* Itbl support may require additional care here. */
67c0d1eb 7182 macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
17a2f251 7183 BFD_RELOC_LO16, AT);
252b5132
RH
7184 mips_optimize = hold_mips_optimize;
7185 expr1.X_add_number -= 4;
7186
4d7206a2
RS
7187 relax_switch ();
7188 offset_expr.X_add_number = expr1.X_add_number;
67c0d1eb
RS
7189 if (gpdelay)
7190 macro_build (NULL, "nop", "");
7191 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7192 BFD_RELOC_MIPS_GOT16, mips_gp_register);
269137b2 7193 load_delay_nop ();
252b5132 7194 if (breg != 0)
67c0d1eb 7195 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
beae10d5 7196 /* Itbl support may require additional care here. */
67c0d1eb
RS
7197 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7198 BFD_RELOC_LO16, AT);
4d7206a2 7199 offset_expr.X_add_number += 4;
252b5132
RH
7200
7201 /* Set mips_optimize to 2 to avoid inserting an undesired
7202 nop. */
7203 hold_mips_optimize = mips_optimize;
7204 mips_optimize = 2;
beae10d5 7205 /* Itbl support may require additional care here. */
67c0d1eb
RS
7206 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7207 BFD_RELOC_LO16, AT);
252b5132 7208 mips_optimize = hold_mips_optimize;
4d7206a2 7209 relax_end ();
252b5132 7210 }
252b5132
RH
7211 else
7212 abort ();
7213
252b5132
RH
7214 break;
7215
7216 case M_LD_OB:
7217 s = "lw";
7218 goto sd_ob;
7219 case M_SD_OB:
7220 s = "sw";
7221 sd_ob:
ca4e0257 7222 assert (HAVE_32BIT_ADDRESSES);
67c0d1eb 7223 macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
252b5132 7224 offset_expr.X_add_number += 4;
67c0d1eb 7225 macro_build (&offset_expr, s, "t,o(b)", treg + 1, BFD_RELOC_LO16, breg);
8fc2e39e 7226 break;
252b5132
RH
7227
7228 /* New code added to support COPZ instructions.
7229 This code builds table entries out of the macros in mip_opcodes.
7230 R4000 uses interlocks to handle coproc delays.
7231 Other chips (like the R3000) require nops to be inserted for delays.
7232
f72c8c98 7233 FIXME: Currently, we require that the user handle delays.
252b5132
RH
7234 In order to fill delay slots for non-interlocked chips,
7235 we must have a way to specify delays based on the coprocessor.
7236 Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
7237 What are the side-effects of the cop instruction?
7238 What cache support might we have and what are its effects?
7239 Both coprocessor & memory require delays. how long???
bdaaa2e1 7240 What registers are read/set/modified?
252b5132
RH
7241
7242 If an itbl is provided to interpret cop instructions,
bdaaa2e1 7243 this knowledge can be encoded in the itbl spec. */
252b5132
RH
7244
7245 case M_COP0:
7246 s = "c0";
7247 goto copz;
7248 case M_COP1:
7249 s = "c1";
7250 goto copz;
7251 case M_COP2:
7252 s = "c2";
7253 goto copz;
7254 case M_COP3:
7255 s = "c3";
7256 copz:
b19e8a9b
AN
7257 if (NO_ISA_COP (mips_opts.arch)
7258 && (ip->insn_mo->pinfo2 & INSN2_M_FP_S) == 0)
7259 {
7260 as_bad (_("opcode not supported on this processor: %s"),
7261 mips_cpu_info_from_arch (mips_opts.arch)->name);
7262 break;
7263 }
7264
252b5132
RH
7265 /* For now we just do C (same as Cz). The parameter will be
7266 stored in insn_opcode by mips_ip. */
67c0d1eb 7267 macro_build (NULL, s, "C", ip->insn_opcode);
8fc2e39e 7268 break;
252b5132 7269
ea1fb5dc 7270 case M_MOVE:
67c0d1eb 7271 move_register (dreg, sreg);
8fc2e39e 7272 break;
ea1fb5dc 7273
252b5132
RH
7274#ifdef LOSING_COMPILER
7275 default:
7276 /* Try and see if this is a new itbl instruction.
7277 This code builds table entries out of the macros in mip_opcodes.
7278 FIXME: For now we just assemble the expression and pass it's
7279 value along as a 32-bit immediate.
bdaaa2e1 7280 We may want to have the assembler assemble this value,
252b5132
RH
7281 so that we gain the assembler's knowledge of delay slots,
7282 symbols, etc.
7283 Would it be more efficient to use mask (id) here? */
bdaaa2e1 7284 if (itbl_have_entries
252b5132 7285 && (immed_expr = itbl_assemble (ip->insn_mo->name, "")))
beae10d5 7286 {
252b5132
RH
7287 s = ip->insn_mo->name;
7288 s2 = "cop3";
7289 coproc = ITBL_DECODE_PNUM (immed_expr);;
67c0d1eb 7290 macro_build (&immed_expr, s, "C");
8fc2e39e 7291 break;
beae10d5 7292 }
252b5132 7293 macro2 (ip);
8fc2e39e 7294 break;
252b5132 7295 }
741fe287 7296 if (!mips_opts.at && used_at)
8fc2e39e 7297 as_bad (_("Macro used $at after \".set noat\""));
252b5132 7298}
bdaaa2e1 7299
252b5132 7300static void
17a2f251 7301macro2 (struct mips_cl_insn *ip)
252b5132 7302{
741fe287
MR
7303 unsigned int treg, sreg, dreg, breg;
7304 unsigned int tempreg;
252b5132 7305 int mask;
252b5132
RH
7306 int used_at;
7307 expressionS expr1;
7308 const char *s;
7309 const char *s2;
7310 const char *fmt;
7311 int likely = 0;
7312 int dbl = 0;
7313 int coproc = 0;
7314 int lr = 0;
7315 int imm = 0;
7316 int off;
7317 offsetT maxnum;
7318 bfd_reloc_code_real_type r;
bdaaa2e1 7319
252b5132
RH
7320 treg = (ip->insn_opcode >> 16) & 0x1f;
7321 dreg = (ip->insn_opcode >> 11) & 0x1f;
7322 sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
7323 mask = ip->insn_mo->mask;
bdaaa2e1 7324
252b5132
RH
7325 expr1.X_op = O_constant;
7326 expr1.X_op_symbol = NULL;
7327 expr1.X_add_symbol = NULL;
7328 expr1.X_add_number = 1;
bdaaa2e1 7329
252b5132
RH
7330 switch (mask)
7331 {
7332#endif /* LOSING_COMPILER */
7333
7334 case M_DMUL:
7335 dbl = 1;
7336 case M_MUL:
67c0d1eb
RS
7337 macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7338 macro_build (NULL, "mflo", "d", dreg);
8fc2e39e 7339 break;
252b5132
RH
7340
7341 case M_DMUL_I:
7342 dbl = 1;
7343 case M_MUL_I:
7344 /* The MIPS assembler some times generates shifts and adds. I'm
7345 not trying to be that fancy. GCC should do this for us
7346 anyway. */
8fc2e39e 7347 used_at = 1;
67c0d1eb
RS
7348 load_register (AT, &imm_expr, dbl);
7349 macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
7350 macro_build (NULL, "mflo", "d", dreg);
252b5132
RH
7351 break;
7352
7353 case M_DMULO_I:
7354 dbl = 1;
7355 case M_MULO_I:
7356 imm = 1;
7357 goto do_mulo;
7358
7359 case M_DMULO:
7360 dbl = 1;
7361 case M_MULO:
7362 do_mulo:
7d10b47d 7363 start_noreorder ();
8fc2e39e 7364 used_at = 1;
252b5132 7365 if (imm)
67c0d1eb
RS
7366 load_register (AT, &imm_expr, dbl);
7367 macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
7368 macro_build (NULL, "mflo", "d", dreg);
7369 macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
7370 macro_build (NULL, "mfhi", "d", AT);
252b5132 7371 if (mips_trap)
67c0d1eb 7372 macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
252b5132
RH
7373 else
7374 {
7375 expr1.X_add_number = 8;
67c0d1eb
RS
7376 macro_build (&expr1, "beq", "s,t,p", dreg, AT);
7377 macro_build (NULL, "nop", "", 0);
7378 macro_build (NULL, "break", "c", 6);
252b5132 7379 }
7d10b47d 7380 end_noreorder ();
67c0d1eb 7381 macro_build (NULL, "mflo", "d", dreg);
252b5132
RH
7382 break;
7383
7384 case M_DMULOU_I:
7385 dbl = 1;
7386 case M_MULOU_I:
7387 imm = 1;
7388 goto do_mulou;
7389
7390 case M_DMULOU:
7391 dbl = 1;
7392 case M_MULOU:
7393 do_mulou:
7d10b47d 7394 start_noreorder ();
8fc2e39e 7395 used_at = 1;
252b5132 7396 if (imm)
67c0d1eb
RS
7397 load_register (AT, &imm_expr, dbl);
7398 macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
17a2f251 7399 sreg, imm ? AT : treg);
67c0d1eb
RS
7400 macro_build (NULL, "mfhi", "d", AT);
7401 macro_build (NULL, "mflo", "d", dreg);
252b5132 7402 if (mips_trap)
67c0d1eb 7403 macro_build (NULL, "tne", "s,t,q", AT, 0, 6);
252b5132
RH
7404 else
7405 {
7406 expr1.X_add_number = 8;
67c0d1eb
RS
7407 macro_build (&expr1, "beq", "s,t,p", AT, 0);
7408 macro_build (NULL, "nop", "", 0);
7409 macro_build (NULL, "break", "c", 6);
252b5132 7410 }
7d10b47d 7411 end_noreorder ();
252b5132
RH
7412 break;
7413
771c7ce4 7414 case M_DROL:
fef14a42 7415 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
82dd0097
CD
7416 {
7417 if (dreg == sreg)
7418 {
7419 tempreg = AT;
7420 used_at = 1;
7421 }
7422 else
7423 {
7424 tempreg = dreg;
82dd0097 7425 }
67c0d1eb
RS
7426 macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7427 macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
8fc2e39e 7428 break;
82dd0097 7429 }
8fc2e39e 7430 used_at = 1;
67c0d1eb
RS
7431 macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7432 macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
7433 macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
7434 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
771c7ce4
TS
7435 break;
7436
252b5132 7437 case M_ROL:
fef14a42 7438 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
82dd0097
CD
7439 {
7440 if (dreg == sreg)
7441 {
7442 tempreg = AT;
7443 used_at = 1;
7444 }
7445 else
7446 {
7447 tempreg = dreg;
82dd0097 7448 }
67c0d1eb
RS
7449 macro_build (NULL, "negu", "d,w", tempreg, treg);
7450 macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
8fc2e39e 7451 break;
82dd0097 7452 }
8fc2e39e 7453 used_at = 1;
67c0d1eb
RS
7454 macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7455 macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
7456 macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
7457 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
252b5132
RH
7458 break;
7459
771c7ce4
TS
7460 case M_DROL_I:
7461 {
7462 unsigned int rot;
82dd0097 7463 char *l, *r;
771c7ce4
TS
7464
7465 if (imm_expr.X_op != O_constant)
82dd0097 7466 as_bad (_("Improper rotate count"));
771c7ce4 7467 rot = imm_expr.X_add_number & 0x3f;
fef14a42 7468 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
60b63b72
RS
7469 {
7470 rot = (64 - rot) & 0x3f;
7471 if (rot >= 32)
67c0d1eb 7472 macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
60b63b72 7473 else
67c0d1eb 7474 macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
8fc2e39e 7475 break;
60b63b72 7476 }
483fc7cd 7477 if (rot == 0)
483fc7cd 7478 {
67c0d1eb 7479 macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
8fc2e39e 7480 break;
483fc7cd 7481 }
82dd0097
CD
7482 l = (rot < 0x20) ? "dsll" : "dsll32";
7483 r = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7484 rot &= 0x1f;
8fc2e39e 7485 used_at = 1;
67c0d1eb
RS
7486 macro_build (NULL, l, "d,w,<", AT, sreg, rot);
7487 macro_build (NULL, r, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7488 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
771c7ce4
TS
7489 }
7490 break;
7491
252b5132 7492 case M_ROL_I:
771c7ce4
TS
7493 {
7494 unsigned int rot;
7495
7496 if (imm_expr.X_op != O_constant)
82dd0097 7497 as_bad (_("Improper rotate count"));
771c7ce4 7498 rot = imm_expr.X_add_number & 0x1f;
fef14a42 7499 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
60b63b72 7500 {
67c0d1eb 7501 macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
8fc2e39e 7502 break;
60b63b72 7503 }
483fc7cd 7504 if (rot == 0)
483fc7cd 7505 {
67c0d1eb 7506 macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
8fc2e39e 7507 break;
483fc7cd 7508 }
8fc2e39e 7509 used_at = 1;
67c0d1eb
RS
7510 macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
7511 macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7512 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
771c7ce4
TS
7513 }
7514 break;
7515
7516 case M_DROR:
fef14a42 7517 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
82dd0097 7518 {
67c0d1eb 7519 macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
8fc2e39e 7520 break;
82dd0097 7521 }
8fc2e39e 7522 used_at = 1;
67c0d1eb
RS
7523 macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7524 macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
7525 macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
7526 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
252b5132
RH
7527 break;
7528
7529 case M_ROR:
fef14a42 7530 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
82dd0097 7531 {
67c0d1eb 7532 macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
8fc2e39e 7533 break;
82dd0097 7534 }
8fc2e39e 7535 used_at = 1;
67c0d1eb
RS
7536 macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7537 macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7538 macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7539 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
252b5132
RH
7540 break;
7541
771c7ce4
TS
7542 case M_DROR_I:
7543 {
7544 unsigned int rot;
82dd0097 7545 char *l, *r;
771c7ce4
TS
7546
7547 if (imm_expr.X_op != O_constant)
82dd0097 7548 as_bad (_("Improper rotate count"));
771c7ce4 7549 rot = imm_expr.X_add_number & 0x3f;
fef14a42 7550 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
82dd0097
CD
7551 {
7552 if (rot >= 32)
67c0d1eb 7553 macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
82dd0097 7554 else
67c0d1eb 7555 macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
8fc2e39e 7556 break;
82dd0097 7557 }
483fc7cd 7558 if (rot == 0)
483fc7cd 7559 {
67c0d1eb 7560 macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
8fc2e39e 7561 break;
483fc7cd 7562 }
82dd0097
CD
7563 r = (rot < 0x20) ? "dsrl" : "dsrl32";
7564 l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7565 rot &= 0x1f;
8fc2e39e 7566 used_at = 1;
67c0d1eb
RS
7567 macro_build (NULL, r, "d,w,<", AT, sreg, rot);
7568 macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7569 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
771c7ce4
TS
7570 }
7571 break;
7572
252b5132 7573 case M_ROR_I:
771c7ce4
TS
7574 {
7575 unsigned int rot;
7576
7577 if (imm_expr.X_op != O_constant)
82dd0097 7578 as_bad (_("Improper rotate count"));
771c7ce4 7579 rot = imm_expr.X_add_number & 0x1f;
fef14a42 7580 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
82dd0097 7581 {
67c0d1eb 7582 macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
8fc2e39e 7583 break;
82dd0097 7584 }
483fc7cd 7585 if (rot == 0)
483fc7cd 7586 {
67c0d1eb 7587 macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
8fc2e39e 7588 break;
483fc7cd 7589 }
8fc2e39e 7590 used_at = 1;
67c0d1eb
RS
7591 macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7592 macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7593 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
771c7ce4 7594 }
252b5132
RH
7595 break;
7596
7597 case M_S_DOB:
e7af610e 7598 assert (mips_opts.isa == ISA_MIPS1);
252b5132
RH
7599 /* Even on a big endian machine $fn comes before $fn+1. We have
7600 to adjust when storing to memory. */
67c0d1eb
RS
7601 macro_build (&offset_expr, "swc1", "T,o(b)",
7602 target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
252b5132 7603 offset_expr.X_add_number += 4;
67c0d1eb
RS
7604 macro_build (&offset_expr, "swc1", "T,o(b)",
7605 target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
8fc2e39e 7606 break;
252b5132
RH
7607
7608 case M_SEQ:
7609 if (sreg == 0)
67c0d1eb 7610 macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
252b5132 7611 else if (treg == 0)
67c0d1eb 7612 macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
252b5132
RH
7613 else
7614 {
67c0d1eb
RS
7615 macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7616 macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
252b5132 7617 }
8fc2e39e 7618 break;
252b5132
RH
7619
7620 case M_SEQ_I:
7621 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7622 {
67c0d1eb 7623 macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
8fc2e39e 7624 break;
252b5132
RH
7625 }
7626 if (sreg == 0)
7627 {
7628 as_warn (_("Instruction %s: result is always false"),
7629 ip->insn_mo->name);
67c0d1eb 7630 move_register (dreg, 0);
8fc2e39e 7631 break;
252b5132 7632 }
dd3cbb7e
NC
7633 if (CPU_HAS_SEQ (mips_opts.arch)
7634 && -512 <= imm_expr.X_add_number
7635 && imm_expr.X_add_number < 512)
7636 {
7637 macro_build (NULL, "seqi", "t,r,+Q", dreg, sreg,
7638 imm_expr.X_add_number);
7639 break;
7640 }
252b5132
RH
7641 if (imm_expr.X_op == O_constant
7642 && imm_expr.X_add_number >= 0
7643 && imm_expr.X_add_number < 0x10000)
7644 {
67c0d1eb 7645 macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
252b5132
RH
7646 }
7647 else if (imm_expr.X_op == O_constant
7648 && imm_expr.X_add_number > -0x8000
7649 && imm_expr.X_add_number < 0)
7650 {
7651 imm_expr.X_add_number = -imm_expr.X_add_number;
67c0d1eb 7652 macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
17a2f251 7653 "t,r,j", dreg, sreg, BFD_RELOC_LO16);
252b5132 7654 }
dd3cbb7e
NC
7655 else if (CPU_HAS_SEQ (mips_opts.arch))
7656 {
7657 used_at = 1;
7658 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7659 macro_build (NULL, "seq", "d,v,t", dreg, sreg, AT);
7660 break;
7661 }
252b5132
RH
7662 else
7663 {
67c0d1eb
RS
7664 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7665 macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
252b5132
RH
7666 used_at = 1;
7667 }
67c0d1eb 7668 macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
8fc2e39e 7669 break;
252b5132
RH
7670
7671 case M_SGE: /* sreg >= treg <==> not (sreg < treg) */
7672 s = "slt";
7673 goto sge;
7674 case M_SGEU:
7675 s = "sltu";
7676 sge:
67c0d1eb
RS
7677 macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
7678 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
8fc2e39e 7679 break;
252b5132
RH
7680
7681 case M_SGE_I: /* sreg >= I <==> not (sreg < I) */
7682 case M_SGEU_I:
7683 if (imm_expr.X_op == O_constant
7684 && imm_expr.X_add_number >= -0x8000
7685 && imm_expr.X_add_number < 0x8000)
7686 {
67c0d1eb
RS
7687 macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
7688 dreg, sreg, BFD_RELOC_LO16);
252b5132
RH
7689 }
7690 else
7691 {
67c0d1eb
RS
7692 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7693 macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
7694 dreg, sreg, AT);
252b5132
RH
7695 used_at = 1;
7696 }
67c0d1eb 7697 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
8fc2e39e 7698 break;
252b5132
RH
7699
7700 case M_SGT: /* sreg > treg <==> treg < sreg */
7701 s = "slt";
7702 goto sgt;
7703 case M_SGTU:
7704 s = "sltu";
7705 sgt:
67c0d1eb 7706 macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
8fc2e39e 7707 break;
252b5132
RH
7708
7709 case M_SGT_I: /* sreg > I <==> I < sreg */
7710 s = "slt";
7711 goto sgti;
7712 case M_SGTU_I:
7713 s = "sltu";
7714 sgti:
8fc2e39e 7715 used_at = 1;
67c0d1eb
RS
7716 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7717 macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
252b5132
RH
7718 break;
7719
2396cfb9 7720 case M_SLE: /* sreg <= treg <==> treg >= sreg <==> not (treg < sreg) */
252b5132
RH
7721 s = "slt";
7722 goto sle;
7723 case M_SLEU:
7724 s = "sltu";
7725 sle:
67c0d1eb
RS
7726 macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7727 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
8fc2e39e 7728 break;
252b5132 7729
2396cfb9 7730 case M_SLE_I: /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
252b5132
RH
7731 s = "slt";
7732 goto slei;
7733 case M_SLEU_I:
7734 s = "sltu";
7735 slei:
8fc2e39e 7736 used_at = 1;
67c0d1eb
RS
7737 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7738 macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7739 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
252b5132
RH
7740 break;
7741
7742 case M_SLT_I:
7743 if (imm_expr.X_op == O_constant
7744 && imm_expr.X_add_number >= -0x8000
7745 && imm_expr.X_add_number < 0x8000)
7746 {
67c0d1eb 7747 macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
8fc2e39e 7748 break;
252b5132 7749 }
8fc2e39e 7750 used_at = 1;
67c0d1eb
RS
7751 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7752 macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
252b5132
RH
7753 break;
7754
7755 case M_SLTU_I:
7756 if (imm_expr.X_op == O_constant
7757 && imm_expr.X_add_number >= -0x8000
7758 && imm_expr.X_add_number < 0x8000)
7759 {
67c0d1eb 7760 macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
17a2f251 7761 BFD_RELOC_LO16);
8fc2e39e 7762 break;
252b5132 7763 }
8fc2e39e 7764 used_at = 1;
67c0d1eb
RS
7765 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7766 macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
252b5132
RH
7767 break;
7768
7769 case M_SNE:
7770 if (sreg == 0)
67c0d1eb 7771 macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
252b5132 7772 else if (treg == 0)
67c0d1eb 7773 macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
252b5132
RH
7774 else
7775 {
67c0d1eb
RS
7776 macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7777 macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
252b5132 7778 }
8fc2e39e 7779 break;
252b5132
RH
7780
7781 case M_SNE_I:
7782 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7783 {
67c0d1eb 7784 macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
8fc2e39e 7785 break;
252b5132
RH
7786 }
7787 if (sreg == 0)
7788 {
7789 as_warn (_("Instruction %s: result is always true"),
7790 ip->insn_mo->name);
67c0d1eb
RS
7791 macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
7792 dreg, 0, BFD_RELOC_LO16);
8fc2e39e 7793 break;
252b5132 7794 }
dd3cbb7e
NC
7795 if (CPU_HAS_SEQ (mips_opts.arch)
7796 && -512 <= imm_expr.X_add_number
7797 && imm_expr.X_add_number < 512)
7798 {
7799 macro_build (NULL, "snei", "t,r,+Q", dreg, sreg,
7800 imm_expr.X_add_number);
7801 break;
7802 }
252b5132
RH
7803 if (imm_expr.X_op == O_constant
7804 && imm_expr.X_add_number >= 0
7805 && imm_expr.X_add_number < 0x10000)
7806 {
67c0d1eb 7807 macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
252b5132
RH
7808 }
7809 else if (imm_expr.X_op == O_constant
7810 && imm_expr.X_add_number > -0x8000
7811 && imm_expr.X_add_number < 0)
7812 {
7813 imm_expr.X_add_number = -imm_expr.X_add_number;
67c0d1eb 7814 macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
17a2f251 7815 "t,r,j", dreg, sreg, BFD_RELOC_LO16);
252b5132 7816 }
dd3cbb7e
NC
7817 else if (CPU_HAS_SEQ (mips_opts.arch))
7818 {
7819 used_at = 1;
7820 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7821 macro_build (NULL, "sne", "d,v,t", dreg, sreg, AT);
7822 break;
7823 }
252b5132
RH
7824 else
7825 {
67c0d1eb
RS
7826 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7827 macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
252b5132
RH
7828 used_at = 1;
7829 }
67c0d1eb 7830 macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
8fc2e39e 7831 break;
252b5132
RH
7832
7833 case M_DSUB_I:
7834 dbl = 1;
7835 case M_SUB_I:
7836 if (imm_expr.X_op == O_constant
7837 && imm_expr.X_add_number > -0x8000
7838 && imm_expr.X_add_number <= 0x8000)
7839 {
7840 imm_expr.X_add_number = -imm_expr.X_add_number;
67c0d1eb
RS
7841 macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
7842 dreg, sreg, BFD_RELOC_LO16);
8fc2e39e 7843 break;
252b5132 7844 }
8fc2e39e 7845 used_at = 1;
67c0d1eb
RS
7846 load_register (AT, &imm_expr, dbl);
7847 macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
252b5132
RH
7848 break;
7849
7850 case M_DSUBU_I:
7851 dbl = 1;
7852 case M_SUBU_I:
7853 if (imm_expr.X_op == O_constant
7854 && imm_expr.X_add_number > -0x8000
7855 && imm_expr.X_add_number <= 0x8000)
7856 {
7857 imm_expr.X_add_number = -imm_expr.X_add_number;
67c0d1eb
RS
7858 macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
7859 dreg, sreg, BFD_RELOC_LO16);
8fc2e39e 7860 break;
252b5132 7861 }
8fc2e39e 7862 used_at = 1;
67c0d1eb
RS
7863 load_register (AT, &imm_expr, dbl);
7864 macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
252b5132
RH
7865 break;
7866
7867 case M_TEQ_I:
7868 s = "teq";
7869 goto trap;
7870 case M_TGE_I:
7871 s = "tge";
7872 goto trap;
7873 case M_TGEU_I:
7874 s = "tgeu";
7875 goto trap;
7876 case M_TLT_I:
7877 s = "tlt";
7878 goto trap;
7879 case M_TLTU_I:
7880 s = "tltu";
7881 goto trap;
7882 case M_TNE_I:
7883 s = "tne";
7884 trap:
8fc2e39e 7885 used_at = 1;
67c0d1eb
RS
7886 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7887 macro_build (NULL, s, "s,t", sreg, AT);
252b5132
RH
7888 break;
7889
252b5132 7890 case M_TRUNCWS:
43841e91 7891 case M_TRUNCWD:
e7af610e 7892 assert (mips_opts.isa == ISA_MIPS1);
8fc2e39e 7893 used_at = 1;
252b5132
RH
7894 sreg = (ip->insn_opcode >> 11) & 0x1f; /* floating reg */
7895 dreg = (ip->insn_opcode >> 06) & 0x1f; /* floating reg */
7896
7897 /*
7898 * Is the double cfc1 instruction a bug in the mips assembler;
7899 * or is there a reason for it?
7900 */
7d10b47d 7901 start_noreorder ();
67c0d1eb
RS
7902 macro_build (NULL, "cfc1", "t,G", treg, RA);
7903 macro_build (NULL, "cfc1", "t,G", treg, RA);
7904 macro_build (NULL, "nop", "");
252b5132 7905 expr1.X_add_number = 3;
67c0d1eb 7906 macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
252b5132 7907 expr1.X_add_number = 2;
67c0d1eb
RS
7908 macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
7909 macro_build (NULL, "ctc1", "t,G", AT, RA);
7910 macro_build (NULL, "nop", "");
7911 macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
7912 dreg, sreg);
7913 macro_build (NULL, "ctc1", "t,G", treg, RA);
7914 macro_build (NULL, "nop", "");
7d10b47d 7915 end_noreorder ();
252b5132
RH
7916 break;
7917
7918 case M_ULH:
7919 s = "lb";
7920 goto ulh;
7921 case M_ULHU:
7922 s = "lbu";
7923 ulh:
8fc2e39e 7924 used_at = 1;
252b5132
RH
7925 if (offset_expr.X_add_number >= 0x7fff)
7926 as_bad (_("operand overflow"));
252b5132 7927 if (! target_big_endian)
f9419b05 7928 ++offset_expr.X_add_number;
67c0d1eb 7929 macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
252b5132 7930 if (! target_big_endian)
f9419b05 7931 --offset_expr.X_add_number;
252b5132 7932 else
f9419b05 7933 ++offset_expr.X_add_number;
67c0d1eb
RS
7934 macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7935 macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
7936 macro_build (NULL, "or", "d,v,t", treg, treg, AT);
252b5132
RH
7937 break;
7938
7939 case M_ULD:
7940 s = "ldl";
7941 s2 = "ldr";
7942 off = 7;
7943 goto ulw;
7944 case M_ULW:
7945 s = "lwl";
7946 s2 = "lwr";
7947 off = 3;
7948 ulw:
7949 if (offset_expr.X_add_number >= 0x8000 - off)
7950 as_bad (_("operand overflow"));
af22f5b2
CD
7951 if (treg != breg)
7952 tempreg = treg;
7953 else
8fc2e39e
TS
7954 {
7955 used_at = 1;
7956 tempreg = AT;
7957 }
252b5132
RH
7958 if (! target_big_endian)
7959 offset_expr.X_add_number += off;
67c0d1eb 7960 macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
252b5132
RH
7961 if (! target_big_endian)
7962 offset_expr.X_add_number -= off;
7963 else
7964 offset_expr.X_add_number += off;
67c0d1eb 7965 macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
af22f5b2
CD
7966
7967 /* If necessary, move the result in tempreg the final destination. */
7968 if (treg == tempreg)
8fc2e39e 7969 break;
af22f5b2 7970 /* Protect second load's delay slot. */
017315e4 7971 load_delay_nop ();
67c0d1eb 7972 move_register (treg, tempreg);
af22f5b2 7973 break;
252b5132
RH
7974
7975 case M_ULD_A:
7976 s = "ldl";
7977 s2 = "ldr";
7978 off = 7;
7979 goto ulwa;
7980 case M_ULW_A:
7981 s = "lwl";
7982 s2 = "lwr";
7983 off = 3;
7984 ulwa:
d6bc6245 7985 used_at = 1;
67c0d1eb 7986 load_address (AT, &offset_expr, &used_at);
252b5132 7987 if (breg != 0)
67c0d1eb 7988 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
252b5132
RH
7989 if (! target_big_endian)
7990 expr1.X_add_number = off;
7991 else
7992 expr1.X_add_number = 0;
67c0d1eb 7993 macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
252b5132
RH
7994 if (! target_big_endian)
7995 expr1.X_add_number = 0;
7996 else
7997 expr1.X_add_number = off;
67c0d1eb 7998 macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
252b5132
RH
7999 break;
8000
8001 case M_ULH_A:
8002 case M_ULHU_A:
d6bc6245 8003 used_at = 1;
67c0d1eb 8004 load_address (AT, &offset_expr, &used_at);
252b5132 8005 if (breg != 0)
67c0d1eb 8006 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
252b5132
RH
8007 if (target_big_endian)
8008 expr1.X_add_number = 0;
67c0d1eb 8009 macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
17a2f251 8010 treg, BFD_RELOC_LO16, AT);
252b5132
RH
8011 if (target_big_endian)
8012 expr1.X_add_number = 1;
8013 else
8014 expr1.X_add_number = 0;
67c0d1eb
RS
8015 macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8016 macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8017 macro_build (NULL, "or", "d,v,t", treg, treg, AT);
252b5132
RH
8018 break;
8019
8020 case M_USH:
8fc2e39e 8021 used_at = 1;
252b5132
RH
8022 if (offset_expr.X_add_number >= 0x7fff)
8023 as_bad (_("operand overflow"));
8024 if (target_big_endian)
f9419b05 8025 ++offset_expr.X_add_number;
67c0d1eb
RS
8026 macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8027 macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
252b5132 8028 if (target_big_endian)
f9419b05 8029 --offset_expr.X_add_number;
252b5132 8030 else
f9419b05 8031 ++offset_expr.X_add_number;
67c0d1eb 8032 macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
252b5132
RH
8033 break;
8034
8035 case M_USD:
8036 s = "sdl";
8037 s2 = "sdr";
8038 off = 7;
8039 goto usw;
8040 case M_USW:
8041 s = "swl";
8042 s2 = "swr";
8043 off = 3;
8044 usw:
8045 if (offset_expr.X_add_number >= 0x8000 - off)
8046 as_bad (_("operand overflow"));
8047 if (! target_big_endian)
8048 offset_expr.X_add_number += off;
67c0d1eb 8049 macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
252b5132
RH
8050 if (! target_big_endian)
8051 offset_expr.X_add_number -= off;
8052 else
8053 offset_expr.X_add_number += off;
67c0d1eb 8054 macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8fc2e39e 8055 break;
252b5132
RH
8056
8057 case M_USD_A:
8058 s = "sdl";
8059 s2 = "sdr";
8060 off = 7;
8061 goto uswa;
8062 case M_USW_A:
8063 s = "swl";
8064 s2 = "swr";
8065 off = 3;
8066 uswa:
d6bc6245 8067 used_at = 1;
67c0d1eb 8068 load_address (AT, &offset_expr, &used_at);
252b5132 8069 if (breg != 0)
67c0d1eb 8070 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
252b5132
RH
8071 if (! target_big_endian)
8072 expr1.X_add_number = off;
8073 else
8074 expr1.X_add_number = 0;
67c0d1eb 8075 macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
252b5132
RH
8076 if (! target_big_endian)
8077 expr1.X_add_number = 0;
8078 else
8079 expr1.X_add_number = off;
67c0d1eb 8080 macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
252b5132
RH
8081 break;
8082
8083 case M_USH_A:
d6bc6245 8084 used_at = 1;
67c0d1eb 8085 load_address (AT, &offset_expr, &used_at);
252b5132 8086 if (breg != 0)
67c0d1eb 8087 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
252b5132
RH
8088 if (! target_big_endian)
8089 expr1.X_add_number = 0;
67c0d1eb
RS
8090 macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8091 macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
252b5132
RH
8092 if (! target_big_endian)
8093 expr1.X_add_number = 1;
8094 else
8095 expr1.X_add_number = 0;
67c0d1eb 8096 macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
252b5132
RH
8097 if (! target_big_endian)
8098 expr1.X_add_number = 0;
8099 else
8100 expr1.X_add_number = 1;
67c0d1eb
RS
8101 macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8102 macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8103 macro_build (NULL, "or", "d,v,t", treg, treg, AT);
252b5132
RH
8104 break;
8105
8106 default:
8107 /* FIXME: Check if this is one of the itbl macros, since they
bdaaa2e1 8108 are added dynamically. */
252b5132
RH
8109 as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
8110 break;
8111 }
741fe287 8112 if (!mips_opts.at && used_at)
8fc2e39e 8113 as_bad (_("Macro used $at after \".set noat\""));
252b5132
RH
8114}
8115
8116/* Implement macros in mips16 mode. */
8117
8118static void
17a2f251 8119mips16_macro (struct mips_cl_insn *ip)
252b5132
RH
8120{
8121 int mask;
8122 int xreg, yreg, zreg, tmp;
252b5132
RH
8123 expressionS expr1;
8124 int dbl;
8125 const char *s, *s2, *s3;
8126
8127 mask = ip->insn_mo->mask;
8128
bf12938e
RS
8129 xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
8130 yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
8131 zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
252b5132 8132
252b5132
RH
8133 expr1.X_op = O_constant;
8134 expr1.X_op_symbol = NULL;
8135 expr1.X_add_symbol = NULL;
8136 expr1.X_add_number = 1;
8137
8138 dbl = 0;
8139
8140 switch (mask)
8141 {
8142 default:
8143 internalError ();
8144
8145 case M_DDIV_3:
8146 dbl = 1;
8147 case M_DIV_3:
8148 s = "mflo";
8149 goto do_div3;
8150 case M_DREM_3:
8151 dbl = 1;
8152 case M_REM_3:
8153 s = "mfhi";
8154 do_div3:
7d10b47d 8155 start_noreorder ();
67c0d1eb 8156 macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
252b5132 8157 expr1.X_add_number = 2;
67c0d1eb
RS
8158 macro_build (&expr1, "bnez", "x,p", yreg);
8159 macro_build (NULL, "break", "6", 7);
bdaaa2e1 8160
252b5132
RH
8161 /* FIXME: The normal code checks for of -1 / -0x80000000 here,
8162 since that causes an overflow. We should do that as well,
8163 but I don't see how to do the comparisons without a temporary
8164 register. */
7d10b47d 8165 end_noreorder ();
67c0d1eb 8166 macro_build (NULL, s, "x", zreg);
252b5132
RH
8167 break;
8168
8169 case M_DIVU_3:
8170 s = "divu";
8171 s2 = "mflo";
8172 goto do_divu3;
8173 case M_REMU_3:
8174 s = "divu";
8175 s2 = "mfhi";
8176 goto do_divu3;
8177 case M_DDIVU_3:
8178 s = "ddivu";
8179 s2 = "mflo";
8180 goto do_divu3;
8181 case M_DREMU_3:
8182 s = "ddivu";
8183 s2 = "mfhi";
8184 do_divu3:
7d10b47d 8185 start_noreorder ();
67c0d1eb 8186 macro_build (NULL, s, "0,x,y", xreg, yreg);
252b5132 8187 expr1.X_add_number = 2;
67c0d1eb
RS
8188 macro_build (&expr1, "bnez", "x,p", yreg);
8189 macro_build (NULL, "break", "6", 7);
7d10b47d 8190 end_noreorder ();
67c0d1eb 8191 macro_build (NULL, s2, "x", zreg);
252b5132
RH
8192 break;
8193
8194 case M_DMUL:
8195 dbl = 1;
8196 case M_MUL:
67c0d1eb
RS
8197 macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
8198 macro_build (NULL, "mflo", "x", zreg);
8fc2e39e 8199 break;
252b5132
RH
8200
8201 case M_DSUBU_I:
8202 dbl = 1;
8203 goto do_subu;
8204 case M_SUBU_I:
8205 do_subu:
8206 if (imm_expr.X_op != O_constant)
8207 as_bad (_("Unsupported large constant"));
8208 imm_expr.X_add_number = -imm_expr.X_add_number;
67c0d1eb 8209 macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
252b5132
RH
8210 break;
8211
8212 case M_SUBU_I_2:
8213 if (imm_expr.X_op != O_constant)
8214 as_bad (_("Unsupported large constant"));
8215 imm_expr.X_add_number = -imm_expr.X_add_number;
67c0d1eb 8216 macro_build (&imm_expr, "addiu", "x,k", xreg);
252b5132
RH
8217 break;
8218
8219 case M_DSUBU_I_2:
8220 if (imm_expr.X_op != O_constant)
8221 as_bad (_("Unsupported large constant"));
8222 imm_expr.X_add_number = -imm_expr.X_add_number;
67c0d1eb 8223 macro_build (&imm_expr, "daddiu", "y,j", yreg);
252b5132
RH
8224 break;
8225
8226 case M_BEQ:
8227 s = "cmp";
8228 s2 = "bteqz";
8229 goto do_branch;
8230 case M_BNE:
8231 s = "cmp";
8232 s2 = "btnez";
8233 goto do_branch;
8234 case M_BLT:
8235 s = "slt";
8236 s2 = "btnez";
8237 goto do_branch;
8238 case M_BLTU:
8239 s = "sltu";
8240 s2 = "btnez";
8241 goto do_branch;
8242 case M_BLE:
8243 s = "slt";
8244 s2 = "bteqz";
8245 goto do_reverse_branch;
8246 case M_BLEU:
8247 s = "sltu";
8248 s2 = "bteqz";
8249 goto do_reverse_branch;
8250 case M_BGE:
8251 s = "slt";
8252 s2 = "bteqz";
8253 goto do_branch;
8254 case M_BGEU:
8255 s = "sltu";
8256 s2 = "bteqz";
8257 goto do_branch;
8258 case M_BGT:
8259 s = "slt";
8260 s2 = "btnez";
8261 goto do_reverse_branch;
8262 case M_BGTU:
8263 s = "sltu";
8264 s2 = "btnez";
8265
8266 do_reverse_branch:
8267 tmp = xreg;
8268 xreg = yreg;
8269 yreg = tmp;
8270
8271 do_branch:
67c0d1eb
RS
8272 macro_build (NULL, s, "x,y", xreg, yreg);
8273 macro_build (&offset_expr, s2, "p");
252b5132
RH
8274 break;
8275
8276 case M_BEQ_I:
8277 s = "cmpi";
8278 s2 = "bteqz";
8279 s3 = "x,U";
8280 goto do_branch_i;
8281 case M_BNE_I:
8282 s = "cmpi";
8283 s2 = "btnez";
8284 s3 = "x,U";
8285 goto do_branch_i;
8286 case M_BLT_I:
8287 s = "slti";
8288 s2 = "btnez";
8289 s3 = "x,8";
8290 goto do_branch_i;
8291 case M_BLTU_I:
8292 s = "sltiu";
8293 s2 = "btnez";
8294 s3 = "x,8";
8295 goto do_branch_i;
8296 case M_BLE_I:
8297 s = "slti";
8298 s2 = "btnez";
8299 s3 = "x,8";
8300 goto do_addone_branch_i;
8301 case M_BLEU_I:
8302 s = "sltiu";
8303 s2 = "btnez";
8304 s3 = "x,8";
8305 goto do_addone_branch_i;
8306 case M_BGE_I:
8307 s = "slti";
8308 s2 = "bteqz";
8309 s3 = "x,8";
8310 goto do_branch_i;
8311 case M_BGEU_I:
8312 s = "sltiu";
8313 s2 = "bteqz";
8314 s3 = "x,8";
8315 goto do_branch_i;
8316 case M_BGT_I:
8317 s = "slti";
8318 s2 = "bteqz";
8319 s3 = "x,8";
8320 goto do_addone_branch_i;
8321 case M_BGTU_I:
8322 s = "sltiu";
8323 s2 = "bteqz";
8324 s3 = "x,8";
8325
8326 do_addone_branch_i:
8327 if (imm_expr.X_op != O_constant)
8328 as_bad (_("Unsupported large constant"));
8329 ++imm_expr.X_add_number;
8330
8331 do_branch_i:
67c0d1eb
RS
8332 macro_build (&imm_expr, s, s3, xreg);
8333 macro_build (&offset_expr, s2, "p");
252b5132
RH
8334 break;
8335
8336 case M_ABS:
8337 expr1.X_add_number = 0;
67c0d1eb 8338 macro_build (&expr1, "slti", "x,8", yreg);
252b5132 8339 if (xreg != yreg)
67c0d1eb 8340 move_register (xreg, yreg);
252b5132 8341 expr1.X_add_number = 2;
67c0d1eb
RS
8342 macro_build (&expr1, "bteqz", "p");
8343 macro_build (NULL, "neg", "x,w", xreg, xreg);
252b5132
RH
8344 }
8345}
8346
8347/* For consistency checking, verify that all bits are specified either
8348 by the match/mask part of the instruction definition, or by the
8349 operand list. */
8350static int
17a2f251 8351validate_mips_insn (const struct mips_opcode *opc)
252b5132
RH
8352{
8353 const char *p = opc->args;
8354 char c;
8355 unsigned long used_bits = opc->mask;
8356
8357 if ((used_bits & opc->match) != opc->match)
8358 {
8359 as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8360 opc->name, opc->args);
8361 return 0;
8362 }
8363#define USE_BITS(mask,shift) (used_bits |= ((mask) << (shift)))
8364 while (*p)
8365 switch (c = *p++)
8366 {
8367 case ',': break;
8368 case '(': break;
8369 case ')': break;
af7ee8bf
CD
8370 case '+':
8371 switch (c = *p++)
8372 {
9bcd4f99
TS
8373 case '1': USE_BITS (OP_MASK_UDI1, OP_SH_UDI1); break;
8374 case '2': USE_BITS (OP_MASK_UDI2, OP_SH_UDI2); break;
8375 case '3': USE_BITS (OP_MASK_UDI3, OP_SH_UDI3); break;
8376 case '4': USE_BITS (OP_MASK_UDI4, OP_SH_UDI4); break;
af7ee8bf
CD
8377 case 'A': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8378 case 'B': USE_BITS (OP_MASK_INSMSB, OP_SH_INSMSB); break;
8379 case 'C': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
bbcc0807
CD
8380 case 'D': USE_BITS (OP_MASK_RD, OP_SH_RD);
8381 USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
5f74bc13
CD
8382 case 'E': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8383 case 'F': USE_BITS (OP_MASK_INSMSB, OP_SH_INSMSB); break;
8384 case 'G': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
8385 case 'H': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
8386 case 'I': break;
ef2e4d86
CF
8387 case 't': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8388 case 'T': USE_BITS (OP_MASK_RT, OP_SH_RT);
8389 USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
bb35fb24
NC
8390 case 'x': USE_BITS (OP_MASK_BBITIND, OP_SH_BBITIND); break;
8391 case 'X': USE_BITS (OP_MASK_BBITIND, OP_SH_BBITIND); break;
8392 case 'p': USE_BITS (OP_MASK_CINSPOS, OP_SH_CINSPOS); break;
8393 case 'P': USE_BITS (OP_MASK_CINSPOS, OP_SH_CINSPOS); break;
dd3cbb7e 8394 case 'Q': USE_BITS (OP_MASK_SEQI, OP_SH_SEQI); break;
bb35fb24
NC
8395 case 's': USE_BITS (OP_MASK_CINSLM1, OP_SH_CINSLM1); break;
8396 case 'S': USE_BITS (OP_MASK_CINSLM1, OP_SH_CINSLM1); break;
8397
af7ee8bf
CD
8398 default:
8399 as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8400 c, opc->name, opc->args);
8401 return 0;
8402 }
8403 break;
252b5132
RH
8404 case '<': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8405 case '>': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8406 case 'A': break;
4372b673 8407 case 'B': USE_BITS (OP_MASK_CODE20, OP_SH_CODE20); break;
252b5132
RH
8408 case 'C': USE_BITS (OP_MASK_COPZ, OP_SH_COPZ); break;
8409 case 'D': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
8410 case 'E': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8411 case 'F': break;
8412 case 'G': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
156c2f8b 8413 case 'H': USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
252b5132 8414 case 'I': break;
e972090a 8415 case 'J': USE_BITS (OP_MASK_CODE19, OP_SH_CODE19); break;
af7ee8bf 8416 case 'K': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
252b5132
RH
8417 case 'L': break;
8418 case 'M': USE_BITS (OP_MASK_CCC, OP_SH_CCC); break;
8419 case 'N': USE_BITS (OP_MASK_BCC, OP_SH_BCC); break;
deec1734
CD
8420 case 'O': USE_BITS (OP_MASK_ALN, OP_SH_ALN); break;
8421 case 'Q': USE_BITS (OP_MASK_VSEL, OP_SH_VSEL);
8422 USE_BITS (OP_MASK_FT, OP_SH_FT); break;
252b5132
RH
8423 case 'R': USE_BITS (OP_MASK_FR, OP_SH_FR); break;
8424 case 'S': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8425 case 'T': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8426 case 'V': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8427 case 'W': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
deec1734
CD
8428 case 'X': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
8429 case 'Y': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8430 case 'Z': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
252b5132
RH
8431 case 'a': USE_BITS (OP_MASK_TARGET, OP_SH_TARGET); break;
8432 case 'b': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8433 case 'c': USE_BITS (OP_MASK_CODE, OP_SH_CODE); break;
8434 case 'd': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8435 case 'f': break;
8436 case 'h': USE_BITS (OP_MASK_PREFX, OP_SH_PREFX); break;
8437 case 'i': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
8438 case 'j': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8439 case 'k': USE_BITS (OP_MASK_CACHE, OP_SH_CACHE); break;
8440 case 'l': break;
8441 case 'o': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8442 case 'p': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8443 case 'q': USE_BITS (OP_MASK_CODE2, OP_SH_CODE2); break;
8444 case 'r': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8445 case 's': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8446 case 't': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8447 case 'u': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
8448 case 'v': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8449 case 'w': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8450 case 'x': break;
8451 case 'z': break;
8452 case 'P': USE_BITS (OP_MASK_PERFREG, OP_SH_PERFREG); break;
4372b673
NC
8453 case 'U': USE_BITS (OP_MASK_RD, OP_SH_RD);
8454 USE_BITS (OP_MASK_RT, OP_SH_RT); break;
60b63b72
RS
8455 case 'e': USE_BITS (OP_MASK_VECBYTE, OP_SH_VECBYTE); break;
8456 case '%': USE_BITS (OP_MASK_VECALIGN, OP_SH_VECALIGN); break;
8457 case '[': break;
8458 case ']': break;
620edafd 8459 case '1': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8b082fb1 8460 case '2': USE_BITS (OP_MASK_BP, OP_SH_BP); break;
74cd071d
CF
8461 case '3': USE_BITS (OP_MASK_SA3, OP_SH_SA3); break;
8462 case '4': USE_BITS (OP_MASK_SA4, OP_SH_SA4); break;
8463 case '5': USE_BITS (OP_MASK_IMM8, OP_SH_IMM8); break;
8464 case '6': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8465 case '7': USE_BITS (OP_MASK_DSPACC, OP_SH_DSPACC); break;
8466 case '8': USE_BITS (OP_MASK_WRDSP, OP_SH_WRDSP); break;
8467 case '9': USE_BITS (OP_MASK_DSPACC_S, OP_SH_DSPACC_S);break;
8468 case '0': USE_BITS (OP_MASK_DSPSFT, OP_SH_DSPSFT); break;
8469 case '\'': USE_BITS (OP_MASK_RDDSP, OP_SH_RDDSP); break;
8470 case ':': USE_BITS (OP_MASK_DSPSFT_7, OP_SH_DSPSFT_7);break;
8471 case '@': USE_BITS (OP_MASK_IMM10, OP_SH_IMM10); break;
ef2e4d86
CF
8472 case '!': USE_BITS (OP_MASK_MT_U, OP_SH_MT_U); break;
8473 case '$': USE_BITS (OP_MASK_MT_H, OP_SH_MT_H); break;
8474 case '*': USE_BITS (OP_MASK_MTACC_T, OP_SH_MTACC_T); break;
8475 case '&': USE_BITS (OP_MASK_MTACC_D, OP_SH_MTACC_D); break;
8476 case 'g': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
252b5132
RH
8477 default:
8478 as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8479 c, opc->name, opc->args);
8480 return 0;
8481 }
8482#undef USE_BITS
8483 if (used_bits != 0xffffffff)
8484 {
8485 as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8486 ~used_bits & 0xffffffff, opc->name, opc->args);
8487 return 0;
8488 }
8489 return 1;
8490}
8491
9bcd4f99
TS
8492/* UDI immediates. */
8493struct mips_immed {
8494 char type;
8495 unsigned int shift;
8496 unsigned long mask;
8497 const char * desc;
8498};
8499
8500static const struct mips_immed mips_immed[] = {
8501 { '1', OP_SH_UDI1, OP_MASK_UDI1, 0},
8502 { '2', OP_SH_UDI2, OP_MASK_UDI2, 0},
8503 { '3', OP_SH_UDI3, OP_MASK_UDI3, 0},
8504 { '4', OP_SH_UDI4, OP_MASK_UDI4, 0},
8505 { 0,0,0,0 }
8506};
8507
7455baf8
TS
8508/* Check whether an odd floating-point register is allowed. */
8509static int
8510mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
8511{
8512 const char *s = insn->name;
8513
8514 if (insn->pinfo == INSN_MACRO)
8515 /* Let a macro pass, we'll catch it later when it is expanded. */
8516 return 1;
8517
8518 if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
8519 {
8520 /* Allow odd registers for single-precision ops. */
8521 switch (insn->pinfo & (FP_S | FP_D))
8522 {
8523 case FP_S:
8524 case 0:
8525 return 1; /* both single precision - ok */
8526 case FP_D:
8527 return 0; /* both double precision - fail */
8528 default:
8529 break;
8530 }
8531
8532 /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand. */
8533 s = strchr (insn->name, '.');
8534 if (argnum == 2)
8535 s = s != NULL ? strchr (s + 1, '.') : NULL;
8536 return (s != NULL && (s[1] == 'w' || s[1] == 's'));
8537 }
8538
8539 /* Single-precision coprocessor loads and moves are OK too. */
8540 if ((insn->pinfo & FP_S)
8541 && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
8542 | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
8543 return 1;
8544
8545 return 0;
8546}
8547
252b5132
RH
8548/* This routine assembles an instruction into its binary format. As a
8549 side effect, it sets one of the global variables imm_reloc or
8550 offset_reloc to the type of relocation to do if one of the operands
8551 is an address expression. */
8552
8553static void
17a2f251 8554mips_ip (char *str, struct mips_cl_insn *ip)
252b5132
RH
8555{
8556 char *s;
8557 const char *args;
43841e91 8558 char c = 0;
252b5132
RH
8559 struct mips_opcode *insn;
8560 char *argsStart;
8561 unsigned int regno;
8562 unsigned int lastregno = 0;
af7ee8bf 8563 unsigned int lastpos = 0;
071742cf 8564 unsigned int limlo, limhi;
252b5132
RH
8565 char *s_reset;
8566 char save_c = 0;
74cd071d 8567 offsetT min_range, max_range;
707bfff6
TS
8568 int argnum;
8569 unsigned int rtype;
252b5132
RH
8570
8571 insn_error = NULL;
8572
8573 /* If the instruction contains a '.', we first try to match an instruction
8574 including the '.'. Then we try again without the '.'. */
8575 insn = NULL;
3882b010 8576 for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
252b5132
RH
8577 continue;
8578
8579 /* If we stopped on whitespace, then replace the whitespace with null for
8580 the call to hash_find. Save the character we replaced just in case we
8581 have to re-parse the instruction. */
3882b010 8582 if (ISSPACE (*s))
252b5132
RH
8583 {
8584 save_c = *s;
8585 *s++ = '\0';
8586 }
bdaaa2e1 8587
252b5132
RH
8588 insn = (struct mips_opcode *) hash_find (op_hash, str);
8589
8590 /* If we didn't find the instruction in the opcode table, try again, but
8591 this time with just the instruction up to, but not including the
8592 first '.'. */
8593 if (insn == NULL)
8594 {
bdaaa2e1 8595 /* Restore the character we overwrite above (if any). */
252b5132
RH
8596 if (save_c)
8597 *(--s) = save_c;
8598
8599 /* Scan up to the first '.' or whitespace. */
3882b010
L
8600 for (s = str;
8601 *s != '\0' && *s != '.' && !ISSPACE (*s);
8602 ++s)
252b5132
RH
8603 continue;
8604
8605 /* If we did not find a '.', then we can quit now. */
8606 if (*s != '.')
8607 {
8608 insn_error = "unrecognized opcode";
8609 return;
8610 }
8611
8612 /* Lookup the instruction in the hash table. */
8613 *s++ = '\0';
8614 if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8615 {
8616 insn_error = "unrecognized opcode";
8617 return;
8618 }
252b5132
RH
8619 }
8620
8621 argsStart = s;
8622 for (;;)
8623 {
b34976b6 8624 bfd_boolean ok;
252b5132
RH
8625
8626 assert (strcmp (insn->name, str) == 0);
8627
037b32b9 8628 ok = is_opcode_valid (insn, FALSE);
252b5132
RH
8629 if (! ok)
8630 {
8631 if (insn + 1 < &mips_opcodes[NUMOPCODES]
8632 && strcmp (insn->name, insn[1].name) == 0)
8633 {
8634 ++insn;
8635 continue;
8636 }
252b5132 8637 else
beae10d5 8638 {
268f6bed
L
8639 if (!insn_error)
8640 {
8641 static char buf[100];
fef14a42
TS
8642 sprintf (buf,
8643 _("opcode not supported on this processor: %s (%s)"),
8644 mips_cpu_info_from_arch (mips_opts.arch)->name,
8645 mips_cpu_info_from_isa (mips_opts.isa)->name);
268f6bed
L
8646 insn_error = buf;
8647 }
8648 if (save_c)
8649 *(--s) = save_c;
2bd7f1f3 8650 return;
252b5132 8651 }
252b5132
RH
8652 }
8653
1e915849 8654 create_insn (ip, insn);
268f6bed 8655 insn_error = NULL;
707bfff6 8656 argnum = 1;
252b5132
RH
8657 for (args = insn->args;; ++args)
8658 {
deec1734
CD
8659 int is_mdmx;
8660
ad8d3bb3 8661 s += strspn (s, " \t");
deec1734 8662 is_mdmx = 0;
252b5132
RH
8663 switch (*args)
8664 {
8665 case '\0': /* end of args */
8666 if (*s == '\0')
8667 return;
8668 break;
8669
8b082fb1
TS
8670 case '2': /* dsp 2-bit unsigned immediate in bit 11 */
8671 my_getExpression (&imm_expr, s);
8672 check_absolute_expr (ip, &imm_expr);
8673 if ((unsigned long) imm_expr.X_add_number != 1
8674 && (unsigned long) imm_expr.X_add_number != 3)
8675 {
8676 as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
8677 (unsigned long) imm_expr.X_add_number);
8678 }
8679 INSERT_OPERAND (BP, *ip, imm_expr.X_add_number);
8680 imm_expr.X_op = O_absent;
8681 s = expr_end;
8682 continue;
8683
74cd071d
CF
8684 case '3': /* dsp 3-bit unsigned immediate in bit 21 */
8685 my_getExpression (&imm_expr, s);
8686 check_absolute_expr (ip, &imm_expr);
8687 if (imm_expr.X_add_number & ~OP_MASK_SA3)
8688 {
a9e24354
TS
8689 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8690 OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
74cd071d 8691 }
a9e24354 8692 INSERT_OPERAND (SA3, *ip, imm_expr.X_add_number);
74cd071d
CF
8693 imm_expr.X_op = O_absent;
8694 s = expr_end;
8695 continue;
8696
8697 case '4': /* dsp 4-bit unsigned immediate in bit 21 */
8698 my_getExpression (&imm_expr, s);
8699 check_absolute_expr (ip, &imm_expr);
8700 if (imm_expr.X_add_number & ~OP_MASK_SA4)
8701 {
a9e24354
TS
8702 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8703 OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
74cd071d 8704 }
a9e24354 8705 INSERT_OPERAND (SA4, *ip, imm_expr.X_add_number);
74cd071d
CF
8706 imm_expr.X_op = O_absent;
8707 s = expr_end;
8708 continue;
8709
8710 case '5': /* dsp 8-bit unsigned immediate in bit 16 */
8711 my_getExpression (&imm_expr, s);
8712 check_absolute_expr (ip, &imm_expr);
8713 if (imm_expr.X_add_number & ~OP_MASK_IMM8)
8714 {
a9e24354
TS
8715 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8716 OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
74cd071d 8717 }
a9e24354 8718 INSERT_OPERAND (IMM8, *ip, imm_expr.X_add_number);
74cd071d
CF
8719 imm_expr.X_op = O_absent;
8720 s = expr_end;
8721 continue;
8722
8723 case '6': /* dsp 5-bit unsigned immediate in bit 21 */
8724 my_getExpression (&imm_expr, s);
8725 check_absolute_expr (ip, &imm_expr);
8726 if (imm_expr.X_add_number & ~OP_MASK_RS)
8727 {
a9e24354
TS
8728 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8729 OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
74cd071d 8730 }
a9e24354 8731 INSERT_OPERAND (RS, *ip, imm_expr.X_add_number);
74cd071d
CF
8732 imm_expr.X_op = O_absent;
8733 s = expr_end;
8734 continue;
8735
8736 case '7': /* four dsp accumulators in bits 11,12 */
8737 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8738 s[3] >= '0' && s[3] <= '3')
8739 {
8740 regno = s[3] - '0';
8741 s += 4;
a9e24354 8742 INSERT_OPERAND (DSPACC, *ip, regno);
74cd071d
CF
8743 continue;
8744 }
8745 else
8746 as_bad (_("Invalid dsp acc register"));
8747 break;
8748
8749 case '8': /* dsp 6-bit unsigned immediate in bit 11 */
8750 my_getExpression (&imm_expr, s);
8751 check_absolute_expr (ip, &imm_expr);
8752 if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
8753 {
a9e24354
TS
8754 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8755 OP_MASK_WRDSP,
8756 (unsigned long) imm_expr.X_add_number);
74cd071d 8757 }
a9e24354 8758 INSERT_OPERAND (WRDSP, *ip, imm_expr.X_add_number);
74cd071d
CF
8759 imm_expr.X_op = O_absent;
8760 s = expr_end;
8761 continue;
8762
8763 case '9': /* four dsp accumulators in bits 21,22 */
8764 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8765 s[3] >= '0' && s[3] <= '3')
8766 {
8767 regno = s[3] - '0';
8768 s += 4;
a9e24354 8769 INSERT_OPERAND (DSPACC_S, *ip, regno);
74cd071d
CF
8770 continue;
8771 }
8772 else
8773 as_bad (_("Invalid dsp acc register"));
8774 break;
8775
8776 case '0': /* dsp 6-bit signed immediate in bit 20 */
8777 my_getExpression (&imm_expr, s);
8778 check_absolute_expr (ip, &imm_expr);
8779 min_range = -((OP_MASK_DSPSFT + 1) >> 1);
8780 max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
8781 if (imm_expr.X_add_number < min_range ||
8782 imm_expr.X_add_number > max_range)
8783 {
a9e24354
TS
8784 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8785 (long) min_range, (long) max_range,
8786 (long) imm_expr.X_add_number);
74cd071d 8787 }
a9e24354 8788 INSERT_OPERAND (DSPSFT, *ip, imm_expr.X_add_number);
74cd071d
CF
8789 imm_expr.X_op = O_absent;
8790 s = expr_end;
8791 continue;
8792
8793 case '\'': /* dsp 6-bit unsigned immediate in bit 16 */
8794 my_getExpression (&imm_expr, s);
8795 check_absolute_expr (ip, &imm_expr);
8796 if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
8797 {
a9e24354
TS
8798 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8799 OP_MASK_RDDSP,
8800 (unsigned long) imm_expr.X_add_number);
74cd071d 8801 }
a9e24354 8802 INSERT_OPERAND (RDDSP, *ip, imm_expr.X_add_number);
74cd071d
CF
8803 imm_expr.X_op = O_absent;
8804 s = expr_end;
8805 continue;
8806
8807 case ':': /* dsp 7-bit signed immediate in bit 19 */
8808 my_getExpression (&imm_expr, s);
8809 check_absolute_expr (ip, &imm_expr);
8810 min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
8811 max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
8812 if (imm_expr.X_add_number < min_range ||
8813 imm_expr.X_add_number > max_range)
8814 {
a9e24354
TS
8815 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8816 (long) min_range, (long) max_range,
8817 (long) imm_expr.X_add_number);
74cd071d 8818 }
a9e24354 8819 INSERT_OPERAND (DSPSFT_7, *ip, imm_expr.X_add_number);
74cd071d
CF
8820 imm_expr.X_op = O_absent;
8821 s = expr_end;
8822 continue;
8823
8824 case '@': /* dsp 10-bit signed immediate in bit 16 */
8825 my_getExpression (&imm_expr, s);
8826 check_absolute_expr (ip, &imm_expr);
8827 min_range = -((OP_MASK_IMM10 + 1) >> 1);
8828 max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
8829 if (imm_expr.X_add_number < min_range ||
8830 imm_expr.X_add_number > max_range)
8831 {
a9e24354
TS
8832 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8833 (long) min_range, (long) max_range,
8834 (long) imm_expr.X_add_number);
74cd071d 8835 }
a9e24354 8836 INSERT_OPERAND (IMM10, *ip, imm_expr.X_add_number);
74cd071d
CF
8837 imm_expr.X_op = O_absent;
8838 s = expr_end;
8839 continue;
8840
a9e24354 8841 case '!': /* MT usermode flag bit. */
ef2e4d86
CF
8842 my_getExpression (&imm_expr, s);
8843 check_absolute_expr (ip, &imm_expr);
8844 if (imm_expr.X_add_number & ~OP_MASK_MT_U)
a9e24354
TS
8845 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
8846 (unsigned long) imm_expr.X_add_number);
8847 INSERT_OPERAND (MT_U, *ip, imm_expr.X_add_number);
ef2e4d86
CF
8848 imm_expr.X_op = O_absent;
8849 s = expr_end;
8850 continue;
8851
a9e24354 8852 case '$': /* MT load high flag bit. */
ef2e4d86
CF
8853 my_getExpression (&imm_expr, s);
8854 check_absolute_expr (ip, &imm_expr);
8855 if (imm_expr.X_add_number & ~OP_MASK_MT_H)
a9e24354
TS
8856 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
8857 (unsigned long) imm_expr.X_add_number);
8858 INSERT_OPERAND (MT_H, *ip, imm_expr.X_add_number);
ef2e4d86
CF
8859 imm_expr.X_op = O_absent;
8860 s = expr_end;
8861 continue;
8862
8863 case '*': /* four dsp accumulators in bits 18,19 */
8864 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8865 s[3] >= '0' && s[3] <= '3')
8866 {
8867 regno = s[3] - '0';
8868 s += 4;
a9e24354 8869 INSERT_OPERAND (MTACC_T, *ip, regno);
ef2e4d86
CF
8870 continue;
8871 }
8872 else
8873 as_bad (_("Invalid dsp/smartmips acc register"));
8874 break;
8875
8876 case '&': /* four dsp accumulators in bits 13,14 */
8877 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8878 s[3] >= '0' && s[3] <= '3')
8879 {
8880 regno = s[3] - '0';
8881 s += 4;
a9e24354 8882 INSERT_OPERAND (MTACC_D, *ip, regno);
ef2e4d86
CF
8883 continue;
8884 }
8885 else
8886 as_bad (_("Invalid dsp/smartmips acc register"));
8887 break;
8888
252b5132 8889 case ',':
a339155f 8890 ++argnum;
252b5132
RH
8891 if (*s++ == *args)
8892 continue;
8893 s--;
8894 switch (*++args)
8895 {
8896 case 'r':
8897 case 'v':
bf12938e 8898 INSERT_OPERAND (RS, *ip, lastregno);
252b5132
RH
8899 continue;
8900
8901 case 'w':
bf12938e 8902 INSERT_OPERAND (RT, *ip, lastregno);
38487616
TS
8903 continue;
8904
252b5132 8905 case 'W':
bf12938e 8906 INSERT_OPERAND (FT, *ip, lastregno);
252b5132
RH
8907 continue;
8908
8909 case 'V':
bf12938e 8910 INSERT_OPERAND (FS, *ip, lastregno);
252b5132
RH
8911 continue;
8912 }
8913 break;
8914
8915 case '(':
8916 /* Handle optional base register.
8917 Either the base register is omitted or
bdaaa2e1 8918 we must have a left paren. */
252b5132
RH
8919 /* This is dependent on the next operand specifier
8920 is a base register specification. */
8921 assert (args[1] == 'b' || args[1] == '5'
8922 || args[1] == '-' || args[1] == '4');
8923 if (*s == '\0')
8924 return;
8925
8926 case ')': /* these must match exactly */
60b63b72
RS
8927 case '[':
8928 case ']':
252b5132
RH
8929 if (*s++ == *args)
8930 continue;
8931 break;
8932
af7ee8bf
CD
8933 case '+': /* Opcode extension character. */
8934 switch (*++args)
8935 {
9bcd4f99
TS
8936 case '1': /* UDI immediates. */
8937 case '2':
8938 case '3':
8939 case '4':
8940 {
8941 const struct mips_immed *imm = mips_immed;
8942
8943 while (imm->type && imm->type != *args)
8944 ++imm;
8945 if (! imm->type)
8946 internalError ();
8947 my_getExpression (&imm_expr, s);
8948 check_absolute_expr (ip, &imm_expr);
8949 if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
8950 {
8951 as_warn (_("Illegal %s number (%lu, 0x%lx)"),
8952 imm->desc ? imm->desc : ip->insn_mo->name,
8953 (unsigned long) imm_expr.X_add_number,
8954 (unsigned long) imm_expr.X_add_number);
8955 imm_expr.X_add_number &= imm->mask;
8956 }
8957 ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
8958 << imm->shift);
8959 imm_expr.X_op = O_absent;
8960 s = expr_end;
8961 }
8962 continue;
8963
071742cf
CD
8964 case 'A': /* ins/ext position, becomes LSB. */
8965 limlo = 0;
8966 limhi = 31;
5f74bc13
CD
8967 goto do_lsb;
8968 case 'E':
8969 limlo = 32;
8970 limhi = 63;
8971 goto do_lsb;
8972do_lsb:
071742cf
CD
8973 my_getExpression (&imm_expr, s);
8974 check_absolute_expr (ip, &imm_expr);
8975 if ((unsigned long) imm_expr.X_add_number < limlo
8976 || (unsigned long) imm_expr.X_add_number > limhi)
8977 {
8978 as_bad (_("Improper position (%lu)"),
8979 (unsigned long) imm_expr.X_add_number);
8980 imm_expr.X_add_number = limlo;
8981 }
8982 lastpos = imm_expr.X_add_number;
bf12938e 8983 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
071742cf
CD
8984 imm_expr.X_op = O_absent;
8985 s = expr_end;
8986 continue;
8987
8988 case 'B': /* ins size, becomes MSB. */
8989 limlo = 1;
8990 limhi = 32;
5f74bc13
CD
8991 goto do_msb;
8992 case 'F':
8993 limlo = 33;
8994 limhi = 64;
8995 goto do_msb;
8996do_msb:
071742cf
CD
8997 my_getExpression (&imm_expr, s);
8998 check_absolute_expr (ip, &imm_expr);
8999 /* Check for negative input so that small negative numbers
9000 will not succeed incorrectly. The checks against
9001 (pos+size) transitively check "size" itself,
9002 assuming that "pos" is reasonable. */
9003 if ((long) imm_expr.X_add_number < 0
9004 || ((unsigned long) imm_expr.X_add_number
9005 + lastpos) < limlo
9006 || ((unsigned long) imm_expr.X_add_number
9007 + lastpos) > limhi)
9008 {
9009 as_bad (_("Improper insert size (%lu, position %lu)"),
9010 (unsigned long) imm_expr.X_add_number,
9011 (unsigned long) lastpos);
9012 imm_expr.X_add_number = limlo - lastpos;
9013 }
bf12938e
RS
9014 INSERT_OPERAND (INSMSB, *ip,
9015 lastpos + imm_expr.X_add_number - 1);
071742cf
CD
9016 imm_expr.X_op = O_absent;
9017 s = expr_end;
9018 continue;
9019
9020 case 'C': /* ext size, becomes MSBD. */
9021 limlo = 1;
9022 limhi = 32;
5f74bc13
CD
9023 goto do_msbd;
9024 case 'G':
9025 limlo = 33;
9026 limhi = 64;
9027 goto do_msbd;
9028 case 'H':
9029 limlo = 33;
9030 limhi = 64;
9031 goto do_msbd;
9032do_msbd:
071742cf
CD
9033 my_getExpression (&imm_expr, s);
9034 check_absolute_expr (ip, &imm_expr);
9035 /* Check for negative input so that small negative numbers
9036 will not succeed incorrectly. The checks against
9037 (pos+size) transitively check "size" itself,
9038 assuming that "pos" is reasonable. */
9039 if ((long) imm_expr.X_add_number < 0
9040 || ((unsigned long) imm_expr.X_add_number
9041 + lastpos) < limlo
9042 || ((unsigned long) imm_expr.X_add_number
9043 + lastpos) > limhi)
9044 {
9045 as_bad (_("Improper extract size (%lu, position %lu)"),
9046 (unsigned long) imm_expr.X_add_number,
9047 (unsigned long) lastpos);
9048 imm_expr.X_add_number = limlo - lastpos;
9049 }
bf12938e 9050 INSERT_OPERAND (EXTMSBD, *ip, imm_expr.X_add_number - 1);
071742cf
CD
9051 imm_expr.X_op = O_absent;
9052 s = expr_end;
9053 continue;
af7ee8bf 9054
bbcc0807
CD
9055 case 'D':
9056 /* +D is for disassembly only; never match. */
9057 break;
9058
5f74bc13
CD
9059 case 'I':
9060 /* "+I" is like "I", except that imm2_expr is used. */
9061 my_getExpression (&imm2_expr, s);
9062 if (imm2_expr.X_op != O_big
9063 && imm2_expr.X_op != O_constant)
9064 insn_error = _("absolute expression required");
9ee2a2d4
MR
9065 if (HAVE_32BIT_GPRS)
9066 normalize_constant_expr (&imm2_expr);
5f74bc13
CD
9067 s = expr_end;
9068 continue;
9069
707bfff6 9070 case 'T': /* Coprocessor register. */
ef2e4d86
CF
9071 /* +T is for disassembly only; never match. */
9072 break;
9073
707bfff6 9074 case 't': /* Coprocessor register number. */
ef2e4d86
CF
9075 if (s[0] == '$' && ISDIGIT (s[1]))
9076 {
9077 ++s;
9078 regno = 0;
9079 do
9080 {
9081 regno *= 10;
9082 regno += *s - '0';
9083 ++s;
9084 }
9085 while (ISDIGIT (*s));
9086 if (regno > 31)
9087 as_bad (_("Invalid register number (%d)"), regno);
9088 else
9089 {
a9e24354 9090 INSERT_OPERAND (RT, *ip, regno);
ef2e4d86
CF
9091 continue;
9092 }
9093 }
9094 else
9095 as_bad (_("Invalid coprocessor 0 register number"));
9096 break;
9097
bb35fb24
NC
9098 case 'x':
9099 /* bbit[01] and bbit[01]32 bit index. Give error if index
9100 is not in the valid range. */
9101 my_getExpression (&imm_expr, s);
9102 check_absolute_expr (ip, &imm_expr);
9103 if ((unsigned) imm_expr.X_add_number > 31)
9104 {
9105 as_bad (_("Improper bit index (%lu)"),
9106 (unsigned long) imm_expr.X_add_number);
9107 imm_expr.X_add_number = 0;
9108 }
9109 INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number);
9110 imm_expr.X_op = O_absent;
9111 s = expr_end;
9112 continue;
9113
9114 case 'X':
9115 /* bbit[01] bit index when bbit is used but we generate
9116 bbit[01]32 because the index is over 32. Move to the
9117 next candidate if index is not in the valid range. */
9118 my_getExpression (&imm_expr, s);
9119 check_absolute_expr (ip, &imm_expr);
9120 if ((unsigned) imm_expr.X_add_number < 32
9121 || (unsigned) imm_expr.X_add_number > 63)
9122 break;
9123 INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number - 32);
9124 imm_expr.X_op = O_absent;
9125 s = expr_end;
9126 continue;
9127
9128 case 'p':
9129 /* cins, cins32, exts and exts32 position field. Give error
9130 if it's not in the valid range. */
9131 my_getExpression (&imm_expr, s);
9132 check_absolute_expr (ip, &imm_expr);
9133 if ((unsigned) imm_expr.X_add_number > 31)
9134 {
9135 as_bad (_("Improper position (%lu)"),
9136 (unsigned long) imm_expr.X_add_number);
9137 imm_expr.X_add_number = 0;
9138 }
9139 /* Make the pos explicit to simplify +S. */
9140 lastpos = imm_expr.X_add_number + 32;
9141 INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number);
9142 imm_expr.X_op = O_absent;
9143 s = expr_end;
9144 continue;
9145
9146 case 'P':
9147 /* cins, cins32, exts and exts32 position field. Move to
9148 the next candidate if it's not in the valid range. */
9149 my_getExpression (&imm_expr, s);
9150 check_absolute_expr (ip, &imm_expr);
9151 if ((unsigned) imm_expr.X_add_number < 32
9152 || (unsigned) imm_expr.X_add_number > 63)
9153 break;
9154 lastpos = imm_expr.X_add_number;
9155 INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number - 32);
9156 imm_expr.X_op = O_absent;
9157 s = expr_end;
9158 continue;
9159
9160 case 's':
9161 /* cins and exts length-minus-one field. */
9162 my_getExpression (&imm_expr, s);
9163 check_absolute_expr (ip, &imm_expr);
9164 if ((unsigned long) imm_expr.X_add_number > 31)
9165 {
9166 as_bad (_("Improper size (%lu)"),
9167 (unsigned long) imm_expr.X_add_number);
9168 imm_expr.X_add_number = 0;
9169 }
9170 INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9171 imm_expr.X_op = O_absent;
9172 s = expr_end;
9173 continue;
9174
9175 case 'S':
9176 /* cins32/exts32 and cins/exts aliasing cint32/exts32
9177 length-minus-one field. */
9178 my_getExpression (&imm_expr, s);
9179 check_absolute_expr (ip, &imm_expr);
9180 if ((long) imm_expr.X_add_number < 0
9181 || (unsigned long) imm_expr.X_add_number + lastpos > 63)
9182 {
9183 as_bad (_("Improper size (%lu)"),
9184 (unsigned long) imm_expr.X_add_number);
9185 imm_expr.X_add_number = 0;
9186 }
9187 INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9188 imm_expr.X_op = O_absent;
9189 s = expr_end;
9190 continue;
9191
dd3cbb7e
NC
9192 case 'Q':
9193 /* seqi/snei immediate field. */
9194 my_getExpression (&imm_expr, s);
9195 check_absolute_expr (ip, &imm_expr);
9196 if ((long) imm_expr.X_add_number < -512
9197 || (long) imm_expr.X_add_number >= 512)
9198 {
9199 as_bad (_("Improper immediate (%ld)"),
9200 (long) imm_expr.X_add_number);
9201 imm_expr.X_add_number = 0;
9202 }
9203 INSERT_OPERAND (SEQI, *ip, imm_expr.X_add_number);
9204 imm_expr.X_op = O_absent;
9205 s = expr_end;
9206 continue;
9207
af7ee8bf
CD
9208 default:
9209 as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
9210 *args, insn->name, insn->args);
9211 /* Further processing is fruitless. */
9212 return;
9213 }
9214 break;
9215
252b5132
RH
9216 case '<': /* must be at least one digit */
9217 /*
9218 * According to the manual, if the shift amount is greater
b6ff326e
KH
9219 * than 31 or less than 0, then the shift amount should be
9220 * mod 32. In reality the mips assembler issues an error.
252b5132
RH
9221 * We issue a warning and mask out all but the low 5 bits.
9222 */
9223 my_getExpression (&imm_expr, s);
9224 check_absolute_expr (ip, &imm_expr);
9225 if ((unsigned long) imm_expr.X_add_number > 31)
bf12938e
RS
9226 as_warn (_("Improper shift amount (%lu)"),
9227 (unsigned long) imm_expr.X_add_number);
9228 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
252b5132
RH
9229 imm_expr.X_op = O_absent;
9230 s = expr_end;
9231 continue;
9232
9233 case '>': /* shift amount minus 32 */
9234 my_getExpression (&imm_expr, s);
9235 check_absolute_expr (ip, &imm_expr);
9236 if ((unsigned long) imm_expr.X_add_number < 32
9237 || (unsigned long) imm_expr.X_add_number > 63)
9238 break;
bf12938e 9239 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number - 32);
252b5132
RH
9240 imm_expr.X_op = O_absent;
9241 s = expr_end;
9242 continue;
9243
252b5132
RH
9244 case 'k': /* cache code */
9245 case 'h': /* prefx code */
620edafd 9246 case '1': /* sync type */
252b5132
RH
9247 my_getExpression (&imm_expr, s);
9248 check_absolute_expr (ip, &imm_expr);
9249 if ((unsigned long) imm_expr.X_add_number > 31)
bf12938e
RS
9250 as_warn (_("Invalid value for `%s' (%lu)"),
9251 ip->insn_mo->name,
9252 (unsigned long) imm_expr.X_add_number);
252b5132 9253 if (*args == 'k')
bf12938e 9254 INSERT_OPERAND (CACHE, *ip, imm_expr.X_add_number);
620edafd 9255 else if (*args == 'h')
bf12938e 9256 INSERT_OPERAND (PREFX, *ip, imm_expr.X_add_number);
620edafd
CF
9257 else
9258 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
252b5132
RH
9259 imm_expr.X_op = O_absent;
9260 s = expr_end;
9261 continue;
9262
9263 case 'c': /* break code */
9264 my_getExpression (&imm_expr, s);
9265 check_absolute_expr (ip, &imm_expr);
a9e24354
TS
9266 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE)
9267 as_warn (_("Code for %s not in range 0..1023 (%lu)"),
9268 ip->insn_mo->name,
bf12938e
RS
9269 (unsigned long) imm_expr.X_add_number);
9270 INSERT_OPERAND (CODE, *ip, imm_expr.X_add_number);
252b5132
RH
9271 imm_expr.X_op = O_absent;
9272 s = expr_end;
9273 continue;
9274
9275 case 'q': /* lower break code */
9276 my_getExpression (&imm_expr, s);
9277 check_absolute_expr (ip, &imm_expr);
a9e24354
TS
9278 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE2)
9279 as_warn (_("Lower code for %s not in range 0..1023 (%lu)"),
9280 ip->insn_mo->name,
bf12938e
RS
9281 (unsigned long) imm_expr.X_add_number);
9282 INSERT_OPERAND (CODE2, *ip, imm_expr.X_add_number);
252b5132
RH
9283 imm_expr.X_op = O_absent;
9284 s = expr_end;
9285 continue;
9286
4372b673 9287 case 'B': /* 20-bit syscall/break code. */
156c2f8b 9288 my_getExpression (&imm_expr, s);
156c2f8b 9289 check_absolute_expr (ip, &imm_expr);
793b27f4 9290 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
a9e24354
TS
9291 as_warn (_("Code for %s not in range 0..1048575 (%lu)"),
9292 ip->insn_mo->name,
793b27f4 9293 (unsigned long) imm_expr.X_add_number);
bf12938e 9294 INSERT_OPERAND (CODE20, *ip, imm_expr.X_add_number);
252b5132
RH
9295 imm_expr.X_op = O_absent;
9296 s = expr_end;
9297 continue;
9298
98d3f06f 9299 case 'C': /* Coprocessor code */
beae10d5 9300 my_getExpression (&imm_expr, s);
252b5132 9301 check_absolute_expr (ip, &imm_expr);
a9e24354 9302 if ((unsigned long) imm_expr.X_add_number > OP_MASK_COPZ)
252b5132 9303 {
793b27f4
TS
9304 as_warn (_("Coproccesor code > 25 bits (%lu)"),
9305 (unsigned long) imm_expr.X_add_number);
a9e24354 9306 imm_expr.X_add_number &= OP_MASK_COPZ;
252b5132 9307 }
a9e24354 9308 INSERT_OPERAND (COPZ, *ip, imm_expr.X_add_number);
beae10d5
KH
9309 imm_expr.X_op = O_absent;
9310 s = expr_end;
9311 continue;
252b5132 9312
4372b673
NC
9313 case 'J': /* 19-bit wait code. */
9314 my_getExpression (&imm_expr, s);
9315 check_absolute_expr (ip, &imm_expr);
793b27f4 9316 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
a9e24354
TS
9317 {
9318 as_warn (_("Illegal 19-bit code (%lu)"),
9319 (unsigned long) imm_expr.X_add_number);
9320 imm_expr.X_add_number &= OP_MASK_CODE19;
9321 }
bf12938e 9322 INSERT_OPERAND (CODE19, *ip, imm_expr.X_add_number);
4372b673
NC
9323 imm_expr.X_op = O_absent;
9324 s = expr_end;
9325 continue;
9326
707bfff6 9327 case 'P': /* Performance register. */
beae10d5 9328 my_getExpression (&imm_expr, s);
252b5132 9329 check_absolute_expr (ip, &imm_expr);
beae10d5 9330 if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
bf12938e
RS
9331 as_warn (_("Invalid performance register (%lu)"),
9332 (unsigned long) imm_expr.X_add_number);
9333 INSERT_OPERAND (PERFREG, *ip, imm_expr.X_add_number);
beae10d5
KH
9334 imm_expr.X_op = O_absent;
9335 s = expr_end;
9336 continue;
252b5132 9337
707bfff6
TS
9338 case 'G': /* Coprocessor destination register. */
9339 if (((ip->insn_opcode >> OP_SH_OP) & OP_MASK_OP) == OP_OP_COP0)
9340 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_CP0, &regno);
9341 else
9342 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
a9e24354 9343 INSERT_OPERAND (RD, *ip, regno);
707bfff6
TS
9344 if (ok)
9345 {
9346 lastregno = regno;
9347 continue;
9348 }
9349 else
9350 break;
9351
252b5132
RH
9352 case 'b': /* base register */
9353 case 'd': /* destination register */
9354 case 's': /* source register */
9355 case 't': /* target register */
9356 case 'r': /* both target and source */
9357 case 'v': /* both dest and source */
9358 case 'w': /* both dest and target */
9359 case 'E': /* coprocessor target register */
af7ee8bf 9360 case 'K': /* 'rdhwr' destination register */
252b5132
RH
9361 case 'x': /* ignore register name */
9362 case 'z': /* must be zero register */
4372b673 9363 case 'U': /* destination register (clo/clz). */
ef2e4d86 9364 case 'g': /* coprocessor destination register */
707bfff6
TS
9365 s_reset = s;
9366 if (*args == 'E' || *args == 'K')
9367 ok = reg_lookup (&s, RTYPE_NUM, &regno);
9368 else
9369 {
9370 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
741fe287
MR
9371 if (regno == AT && mips_opts.at)
9372 {
9373 if (mips_opts.at == ATREG)
9374 as_warn (_("used $at without \".set noat\""));
9375 else
9376 as_warn (_("used $%u with \".set at=$%u\""),
9377 regno, mips_opts.at);
9378 }
707bfff6
TS
9379 }
9380 if (ok)
252b5132 9381 {
252b5132
RH
9382 c = *args;
9383 if (*s == ' ')
f9419b05 9384 ++s;
252b5132
RH
9385 if (args[1] != *s)
9386 {
9387 if (c == 'r' || c == 'v' || c == 'w')
9388 {
9389 regno = lastregno;
9390 s = s_reset;
f9419b05 9391 ++args;
252b5132
RH
9392 }
9393 }
9394 /* 'z' only matches $0. */
9395 if (c == 'z' && regno != 0)
9396 break;
9397
e7c604dd
CM
9398 if (c == 's' && !strcmp (ip->insn_mo->name, "jalr"))
9399 {
9400 if (regno == lastregno)
9401 {
9402 insn_error = _("source and destinationations must be different");
9403 continue;
9404 }
9405 if (regno == 31 && lastregno == 0)
9406 {
9407 insn_error = _("a destination register must be supplied");
9408 continue;
9409 }
9410 }
bdaaa2e1
KH
9411 /* Now that we have assembled one operand, we use the args string
9412 * to figure out where it goes in the instruction. */
252b5132
RH
9413 switch (c)
9414 {
9415 case 'r':
9416 case 's':
9417 case 'v':
9418 case 'b':
bf12938e 9419 INSERT_OPERAND (RS, *ip, regno);
252b5132
RH
9420 break;
9421 case 'd':
9422 case 'G':
af7ee8bf 9423 case 'K':
ef2e4d86 9424 case 'g':
bf12938e 9425 INSERT_OPERAND (RD, *ip, regno);
252b5132 9426 break;
4372b673 9427 case 'U':
bf12938e
RS
9428 INSERT_OPERAND (RD, *ip, regno);
9429 INSERT_OPERAND (RT, *ip, regno);
4372b673 9430 break;
252b5132
RH
9431 case 'w':
9432 case 't':
9433 case 'E':
bf12938e 9434 INSERT_OPERAND (RT, *ip, regno);
252b5132
RH
9435 break;
9436 case 'x':
9437 /* This case exists because on the r3000 trunc
9438 expands into a macro which requires a gp
9439 register. On the r6000 or r4000 it is
9440 assembled into a single instruction which
9441 ignores the register. Thus the insn version
9442 is MIPS_ISA2 and uses 'x', and the macro
9443 version is MIPS_ISA1 and uses 't'. */
9444 break;
9445 case 'z':
9446 /* This case is for the div instruction, which
9447 acts differently if the destination argument
9448 is $0. This only matches $0, and is checked
9449 outside the switch. */
9450 break;
9451 case 'D':
9452 /* Itbl operand; not yet implemented. FIXME ?? */
9453 break;
9454 /* What about all other operands like 'i', which
9455 can be specified in the opcode table? */
9456 }
9457 lastregno = regno;
9458 continue;
9459 }
252b5132
RH
9460 switch (*args++)
9461 {
9462 case 'r':
9463 case 'v':
bf12938e 9464 INSERT_OPERAND (RS, *ip, lastregno);
252b5132
RH
9465 continue;
9466 case 'w':
bf12938e 9467 INSERT_OPERAND (RT, *ip, lastregno);
252b5132
RH
9468 continue;
9469 }
9470 break;
9471
deec1734
CD
9472 case 'O': /* MDMX alignment immediate constant. */
9473 my_getExpression (&imm_expr, s);
9474 check_absolute_expr (ip, &imm_expr);
9475 if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
bf12938e
RS
9476 as_warn ("Improper align amount (%ld), using low bits",
9477 (long) imm_expr.X_add_number);
9478 INSERT_OPERAND (ALN, *ip, imm_expr.X_add_number);
deec1734
CD
9479 imm_expr.X_op = O_absent;
9480 s = expr_end;
9481 continue;
9482
9483 case 'Q': /* MDMX vector, element sel, or const. */
9484 if (s[0] != '$')
9485 {
9486 /* MDMX Immediate. */
9487 my_getExpression (&imm_expr, s);
9488 check_absolute_expr (ip, &imm_expr);
9489 if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
bf12938e
RS
9490 as_warn (_("Invalid MDMX Immediate (%ld)"),
9491 (long) imm_expr.X_add_number);
9492 INSERT_OPERAND (FT, *ip, imm_expr.X_add_number);
deec1734
CD
9493 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9494 ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
9495 else
9496 ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
deec1734
CD
9497 imm_expr.X_op = O_absent;
9498 s = expr_end;
9499 continue;
9500 }
9501 /* Not MDMX Immediate. Fall through. */
9502 case 'X': /* MDMX destination register. */
9503 case 'Y': /* MDMX source register. */
9504 case 'Z': /* MDMX target register. */
9505 is_mdmx = 1;
252b5132
RH
9506 case 'D': /* floating point destination register */
9507 case 'S': /* floating point source register */
9508 case 'T': /* floating point target register */
9509 case 'R': /* floating point source register */
9510 case 'V':
9511 case 'W':
707bfff6
TS
9512 rtype = RTYPE_FPU;
9513 if (is_mdmx
9514 || (mips_opts.ase_mdmx
9515 && (ip->insn_mo->pinfo & FP_D)
9516 && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
9517 | INSN_COPROC_MEMORY_DELAY
9518 | INSN_LOAD_COPROC_DELAY
9519 | INSN_LOAD_MEMORY_DELAY
9520 | INSN_STORE_MEMORY))))
9521 rtype |= RTYPE_VEC;
252b5132 9522 s_reset = s;
707bfff6 9523 if (reg_lookup (&s, rtype, &regno))
252b5132 9524 {
252b5132 9525 if ((regno & 1) != 0
ca4e0257 9526 && HAVE_32BIT_FPRS
7455baf8 9527 && ! mips_oddfpreg_ok (ip->insn_mo, argnum))
252b5132
RH
9528 as_warn (_("Float register should be even, was %d"),
9529 regno);
9530
9531 c = *args;
9532 if (*s == ' ')
f9419b05 9533 ++s;
252b5132
RH
9534 if (args[1] != *s)
9535 {
9536 if (c == 'V' || c == 'W')
9537 {
9538 regno = lastregno;
9539 s = s_reset;
f9419b05 9540 ++args;
252b5132
RH
9541 }
9542 }
9543 switch (c)
9544 {
9545 case 'D':
deec1734 9546 case 'X':
bf12938e 9547 INSERT_OPERAND (FD, *ip, regno);
252b5132
RH
9548 break;
9549 case 'V':
9550 case 'S':
deec1734 9551 case 'Y':
bf12938e 9552 INSERT_OPERAND (FS, *ip, regno);
252b5132 9553 break;
deec1734
CD
9554 case 'Q':
9555 /* This is like 'Z', but also needs to fix the MDMX
9556 vector/scalar select bits. Note that the
9557 scalar immediate case is handled above. */
9558 if (*s == '[')
9559 {
9560 int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
9561 int max_el = (is_qh ? 3 : 7);
9562 s++;
9563 my_getExpression(&imm_expr, s);
9564 check_absolute_expr (ip, &imm_expr);
9565 s = expr_end;
9566 if (imm_expr.X_add_number > max_el)
9567 as_bad(_("Bad element selector %ld"),
9568 (long) imm_expr.X_add_number);
9569 imm_expr.X_add_number &= max_el;
9570 ip->insn_opcode |= (imm_expr.X_add_number
9571 << (OP_SH_VSEL +
9572 (is_qh ? 2 : 1)));
01a3f561 9573 imm_expr.X_op = O_absent;
deec1734
CD
9574 if (*s != ']')
9575 as_warn(_("Expecting ']' found '%s'"), s);
9576 else
9577 s++;
9578 }
9579 else
9580 {
9581 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9582 ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
9583 << OP_SH_VSEL);
9584 else
9585 ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
9586 OP_SH_VSEL);
9587 }
9588 /* Fall through */
252b5132
RH
9589 case 'W':
9590 case 'T':
deec1734 9591 case 'Z':
bf12938e 9592 INSERT_OPERAND (FT, *ip, regno);
252b5132
RH
9593 break;
9594 case 'R':
bf12938e 9595 INSERT_OPERAND (FR, *ip, regno);
252b5132
RH
9596 break;
9597 }
9598 lastregno = regno;
9599 continue;
9600 }
9601
252b5132
RH
9602 switch (*args++)
9603 {
9604 case 'V':
bf12938e 9605 INSERT_OPERAND (FS, *ip, lastregno);
252b5132
RH
9606 continue;
9607 case 'W':
bf12938e 9608 INSERT_OPERAND (FT, *ip, lastregno);
252b5132
RH
9609 continue;
9610 }
9611 break;
9612
9613 case 'I':
9614 my_getExpression (&imm_expr, s);
9615 if (imm_expr.X_op != O_big
9616 && imm_expr.X_op != O_constant)
9617 insn_error = _("absolute expression required");
9ee2a2d4
MR
9618 if (HAVE_32BIT_GPRS)
9619 normalize_constant_expr (&imm_expr);
252b5132
RH
9620 s = expr_end;
9621 continue;
9622
9623 case 'A':
9624 my_getExpression (&offset_expr, s);
2051e8c4 9625 normalize_address_expr (&offset_expr);
f6688943 9626 *imm_reloc = BFD_RELOC_32;
252b5132
RH
9627 s = expr_end;
9628 continue;
9629
9630 case 'F':
9631 case 'L':
9632 case 'f':
9633 case 'l':
9634 {
9635 int f64;
ca4e0257 9636 int using_gprs;
252b5132
RH
9637 char *save_in;
9638 char *err;
9639 unsigned char temp[8];
9640 int len;
9641 unsigned int length;
9642 segT seg;
9643 subsegT subseg;
9644 char *p;
9645
9646 /* These only appear as the last operand in an
9647 instruction, and every instruction that accepts
9648 them in any variant accepts them in all variants.
9649 This means we don't have to worry about backing out
9650 any changes if the instruction does not match.
9651
9652 The difference between them is the size of the
9653 floating point constant and where it goes. For 'F'
9654 and 'L' the constant is 64 bits; for 'f' and 'l' it
9655 is 32 bits. Where the constant is placed is based
9656 on how the MIPS assembler does things:
9657 F -- .rdata
9658 L -- .lit8
9659 f -- immediate value
9660 l -- .lit4
9661
9662 The .lit4 and .lit8 sections are only used if
9663 permitted by the -G argument.
9664
ca4e0257
RS
9665 The code below needs to know whether the target register
9666 is 32 or 64 bits wide. It relies on the fact 'f' and
9667 'F' are used with GPR-based instructions and 'l' and
9668 'L' are used with FPR-based instructions. */
252b5132
RH
9669
9670 f64 = *args == 'F' || *args == 'L';
ca4e0257 9671 using_gprs = *args == 'F' || *args == 'f';
252b5132
RH
9672
9673 save_in = input_line_pointer;
9674 input_line_pointer = s;
9675 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
9676 length = len;
9677 s = input_line_pointer;
9678 input_line_pointer = save_in;
9679 if (err != NULL && *err != '\0')
9680 {
9681 as_bad (_("Bad floating point constant: %s"), err);
9682 memset (temp, '\0', sizeof temp);
9683 length = f64 ? 8 : 4;
9684 }
9685
156c2f8b 9686 assert (length == (unsigned) (f64 ? 8 : 4));
252b5132
RH
9687
9688 if (*args == 'f'
9689 || (*args == 'l'
3e722fb5 9690 && (g_switch_value < 4
252b5132
RH
9691 || (temp[0] == 0 && temp[1] == 0)
9692 || (temp[2] == 0 && temp[3] == 0))))
9693 {
9694 imm_expr.X_op = O_constant;
9695 if (! target_big_endian)
9696 imm_expr.X_add_number = bfd_getl32 (temp);
9697 else
9698 imm_expr.X_add_number = bfd_getb32 (temp);
9699 }
9700 else if (length > 4
119d663a 9701 && ! mips_disable_float_construction
ca4e0257
RS
9702 /* Constants can only be constructed in GPRs and
9703 copied to FPRs if the GPRs are at least as wide
9704 as the FPRs. Force the constant into memory if
9705 we are using 64-bit FPRs but the GPRs are only
9706 32 bits wide. */
9707 && (using_gprs
9708 || ! (HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
252b5132
RH
9709 && ((temp[0] == 0 && temp[1] == 0)
9710 || (temp[2] == 0 && temp[3] == 0))
9711 && ((temp[4] == 0 && temp[5] == 0)
9712 || (temp[6] == 0 && temp[7] == 0)))
9713 {
ca4e0257
RS
9714 /* The value is simple enough to load with a couple of
9715 instructions. If using 32-bit registers, set
9716 imm_expr to the high order 32 bits and offset_expr to
9717 the low order 32 bits. Otherwise, set imm_expr to
9718 the entire 64 bit constant. */
9719 if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
252b5132
RH
9720 {
9721 imm_expr.X_op = O_constant;
9722 offset_expr.X_op = O_constant;
9723 if (! target_big_endian)
9724 {
9725 imm_expr.X_add_number = bfd_getl32 (temp + 4);
9726 offset_expr.X_add_number = bfd_getl32 (temp);
9727 }
9728 else
9729 {
9730 imm_expr.X_add_number = bfd_getb32 (temp);
9731 offset_expr.X_add_number = bfd_getb32 (temp + 4);
9732 }
9733 if (offset_expr.X_add_number == 0)
9734 offset_expr.X_op = O_absent;
9735 }
9736 else if (sizeof (imm_expr.X_add_number) > 4)
9737 {
9738 imm_expr.X_op = O_constant;
9739 if (! target_big_endian)
9740 imm_expr.X_add_number = bfd_getl64 (temp);
9741 else
9742 imm_expr.X_add_number = bfd_getb64 (temp);
9743 }
9744 else
9745 {
9746 imm_expr.X_op = O_big;
9747 imm_expr.X_add_number = 4;
9748 if (! target_big_endian)
9749 {
9750 generic_bignum[0] = bfd_getl16 (temp);
9751 generic_bignum[1] = bfd_getl16 (temp + 2);
9752 generic_bignum[2] = bfd_getl16 (temp + 4);
9753 generic_bignum[3] = bfd_getl16 (temp + 6);
9754 }
9755 else
9756 {
9757 generic_bignum[0] = bfd_getb16 (temp + 6);
9758 generic_bignum[1] = bfd_getb16 (temp + 4);
9759 generic_bignum[2] = bfd_getb16 (temp + 2);
9760 generic_bignum[3] = bfd_getb16 (temp);
9761 }
9762 }
9763 }
9764 else
9765 {
9766 const char *newname;
9767 segT new_seg;
9768
9769 /* Switch to the right section. */
9770 seg = now_seg;
9771 subseg = now_subseg;
9772 switch (*args)
9773 {
9774 default: /* unused default case avoids warnings. */
9775 case 'L':
9776 newname = RDATA_SECTION_NAME;
3e722fb5 9777 if (g_switch_value >= 8)
252b5132
RH
9778 newname = ".lit8";
9779 break;
9780 case 'F':
3e722fb5 9781 newname = RDATA_SECTION_NAME;
252b5132
RH
9782 break;
9783 case 'l':
4d0d148d 9784 assert (g_switch_value >= 4);
252b5132
RH
9785 newname = ".lit4";
9786 break;
9787 }
9788 new_seg = subseg_new (newname, (subsegT) 0);
f43abd2b 9789 if (IS_ELF)
252b5132
RH
9790 bfd_set_section_flags (stdoutput, new_seg,
9791 (SEC_ALLOC
9792 | SEC_LOAD
9793 | SEC_READONLY
9794 | SEC_DATA));
9795 frag_align (*args == 'l' ? 2 : 3, 0, 0);
c41e87e3 9796 if (IS_ELF && strncmp (TARGET_OS, "elf", 3) != 0)
252b5132
RH
9797 record_alignment (new_seg, 4);
9798 else
9799 record_alignment (new_seg, *args == 'l' ? 2 : 3);
9800 if (seg == now_seg)
9801 as_bad (_("Can't use floating point insn in this section"));
9802
9803 /* Set the argument to the current address in the
9804 section. */
9805 offset_expr.X_op = O_symbol;
9806 offset_expr.X_add_symbol =
9807 symbol_new ("L0\001", now_seg,
9808 (valueT) frag_now_fix (), frag_now);
9809 offset_expr.X_add_number = 0;
9810
9811 /* Put the floating point number into the section. */
9812 p = frag_more ((int) length);
9813 memcpy (p, temp, length);
9814
9815 /* Switch back to the original section. */
9816 subseg_set (seg, subseg);
9817 }
9818 }
9819 continue;
9820
9821 case 'i': /* 16 bit unsigned immediate */
9822 case 'j': /* 16 bit signed immediate */
f6688943 9823 *imm_reloc = BFD_RELOC_LO16;
5e0116d5 9824 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
252b5132
RH
9825 {
9826 int more;
5e0116d5
RS
9827 offsetT minval, maxval;
9828
9829 more = (insn + 1 < &mips_opcodes[NUMOPCODES]
9830 && strcmp (insn->name, insn[1].name) == 0);
9831
9832 /* If the expression was written as an unsigned number,
9833 only treat it as signed if there are no more
9834 alternatives. */
9835 if (more
9836 && *args == 'j'
9837 && sizeof (imm_expr.X_add_number) <= 4
9838 && imm_expr.X_op == O_constant
9839 && imm_expr.X_add_number < 0
9840 && imm_expr.X_unsigned
9841 && HAVE_64BIT_GPRS)
9842 break;
9843
9844 /* For compatibility with older assemblers, we accept
9845 0x8000-0xffff as signed 16-bit numbers when only
9846 signed numbers are allowed. */
9847 if (*args == 'i')
9848 minval = 0, maxval = 0xffff;
9849 else if (more)
9850 minval = -0x8000, maxval = 0x7fff;
252b5132 9851 else
5e0116d5
RS
9852 minval = -0x8000, maxval = 0xffff;
9853
9854 if (imm_expr.X_op != O_constant
9855 || imm_expr.X_add_number < minval
9856 || imm_expr.X_add_number > maxval)
252b5132
RH
9857 {
9858 if (more)
9859 break;
2ae7e77b
AH
9860 if (imm_expr.X_op == O_constant
9861 || imm_expr.X_op == O_big)
5e0116d5 9862 as_bad (_("expression out of range"));
252b5132
RH
9863 }
9864 }
9865 s = expr_end;
9866 continue;
9867
9868 case 'o': /* 16 bit offset */
5e0116d5
RS
9869 /* Check whether there is only a single bracketed expression
9870 left. If so, it must be the base register and the
9871 constant must be zero. */
9872 if (*s == '(' && strchr (s + 1, '(') == 0)
9873 {
9874 offset_expr.X_op = O_constant;
9875 offset_expr.X_add_number = 0;
9876 continue;
9877 }
252b5132
RH
9878
9879 /* If this value won't fit into a 16 bit offset, then go
9880 find a macro that will generate the 32 bit offset
afdbd6d0 9881 code pattern. */
5e0116d5 9882 if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
252b5132
RH
9883 && (offset_expr.X_op != O_constant
9884 || offset_expr.X_add_number >= 0x8000
afdbd6d0 9885 || offset_expr.X_add_number < -0x8000))
252b5132
RH
9886 break;
9887
252b5132
RH
9888 s = expr_end;
9889 continue;
9890
9891 case 'p': /* pc relative offset */
0b25d3e6 9892 *offset_reloc = BFD_RELOC_16_PCREL_S2;
252b5132
RH
9893 my_getExpression (&offset_expr, s);
9894 s = expr_end;
9895 continue;
9896
9897 case 'u': /* upper 16 bits */
5e0116d5
RS
9898 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
9899 && imm_expr.X_op == O_constant
9900 && (imm_expr.X_add_number < 0
9901 || imm_expr.X_add_number >= 0x10000))
252b5132
RH
9902 as_bad (_("lui expression not in range 0..65535"));
9903 s = expr_end;
9904 continue;
9905
9906 case 'a': /* 26 bit address */
9907 my_getExpression (&offset_expr, s);
9908 s = expr_end;
f6688943 9909 *offset_reloc = BFD_RELOC_MIPS_JMP;
252b5132
RH
9910 continue;
9911
9912 case 'N': /* 3 bit branch condition code */
9913 case 'M': /* 3 bit compare condition code */
707bfff6
TS
9914 rtype = RTYPE_CCC;
9915 if (ip->insn_mo->pinfo & (FP_D| FP_S))
9916 rtype |= RTYPE_FCC;
9917 if (!reg_lookup (&s, rtype, &regno))
252b5132 9918 break;
30c378fd
CD
9919 if ((strcmp(str + strlen(str) - 3, ".ps") == 0
9920 || strcmp(str + strlen(str) - 5, "any2f") == 0
9921 || strcmp(str + strlen(str) - 5, "any2t") == 0)
9922 && (regno & 1) != 0)
9923 as_warn(_("Condition code register should be even for %s, was %d"),
9924 str, regno);
9925 if ((strcmp(str + strlen(str) - 5, "any4f") == 0
9926 || strcmp(str + strlen(str) - 5, "any4t") == 0)
9927 && (regno & 3) != 0)
9928 as_warn(_("Condition code register should be 0 or 4 for %s, was %d"),
9929 str, regno);
252b5132 9930 if (*args == 'N')
bf12938e 9931 INSERT_OPERAND (BCC, *ip, regno);
252b5132 9932 else
bf12938e 9933 INSERT_OPERAND (CCC, *ip, regno);
beae10d5 9934 continue;
252b5132 9935
156c2f8b
NC
9936 case 'H':
9937 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
9938 s += 2;
3882b010 9939 if (ISDIGIT (*s))
156c2f8b
NC
9940 {
9941 c = 0;
9942 do
9943 {
9944 c *= 10;
9945 c += *s - '0';
9946 ++s;
9947 }
3882b010 9948 while (ISDIGIT (*s));
156c2f8b
NC
9949 }
9950 else
9951 c = 8; /* Invalid sel value. */
9952
9953 if (c > 7)
9954 as_bad (_("invalid coprocessor sub-selection value (0-7)"));
9955 ip->insn_opcode |= c;
9956 continue;
9957
60b63b72
RS
9958 case 'e':
9959 /* Must be at least one digit. */
9960 my_getExpression (&imm_expr, s);
9961 check_absolute_expr (ip, &imm_expr);
9962
9963 if ((unsigned long) imm_expr.X_add_number
9964 > (unsigned long) OP_MASK_VECBYTE)
9965 {
9966 as_bad (_("bad byte vector index (%ld)"),
9967 (long) imm_expr.X_add_number);
9968 imm_expr.X_add_number = 0;
9969 }
9970
bf12938e 9971 INSERT_OPERAND (VECBYTE, *ip, imm_expr.X_add_number);
60b63b72
RS
9972 imm_expr.X_op = O_absent;
9973 s = expr_end;
9974 continue;
9975
9976 case '%':
9977 my_getExpression (&imm_expr, s);
9978 check_absolute_expr (ip, &imm_expr);
9979
9980 if ((unsigned long) imm_expr.X_add_number
9981 > (unsigned long) OP_MASK_VECALIGN)
9982 {
9983 as_bad (_("bad byte vector index (%ld)"),
9984 (long) imm_expr.X_add_number);
9985 imm_expr.X_add_number = 0;
9986 }
9987
bf12938e 9988 INSERT_OPERAND (VECALIGN, *ip, imm_expr.X_add_number);
60b63b72
RS
9989 imm_expr.X_op = O_absent;
9990 s = expr_end;
9991 continue;
9992
252b5132
RH
9993 default:
9994 as_bad (_("bad char = '%c'\n"), *args);
9995 internalError ();
9996 }
9997 break;
9998 }
9999 /* Args don't match. */
10000 if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
10001 !strcmp (insn->name, insn[1].name))
10002 {
10003 ++insn;
10004 s = argsStart;
268f6bed 10005 insn_error = _("illegal operands");
252b5132
RH
10006 continue;
10007 }
268f6bed 10008 if (save_c)
570de991 10009 *(--argsStart) = save_c;
252b5132
RH
10010 insn_error = _("illegal operands");
10011 return;
10012 }
10013}
10014
0499d65b
TS
10015#define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
10016
252b5132
RH
10017/* This routine assembles an instruction into its binary format when
10018 assembling for the mips16. As a side effect, it sets one of the
10019 global variables imm_reloc or offset_reloc to the type of
10020 relocation to do if one of the operands is an address expression.
10021 It also sets mips16_small and mips16_ext if the user explicitly
10022 requested a small or extended instruction. */
10023
10024static void
17a2f251 10025mips16_ip (char *str, struct mips_cl_insn *ip)
252b5132
RH
10026{
10027 char *s;
10028 const char *args;
10029 struct mips_opcode *insn;
10030 char *argsstart;
10031 unsigned int regno;
10032 unsigned int lastregno = 0;
10033 char *s_reset;
d6f16593 10034 size_t i;
252b5132
RH
10035
10036 insn_error = NULL;
10037
b34976b6
AM
10038 mips16_small = FALSE;
10039 mips16_ext = FALSE;
252b5132 10040
3882b010 10041 for (s = str; ISLOWER (*s); ++s)
252b5132
RH
10042 ;
10043 switch (*s)
10044 {
10045 case '\0':
10046 break;
10047
10048 case ' ':
10049 *s++ = '\0';
10050 break;
10051
10052 case '.':
10053 if (s[1] == 't' && s[2] == ' ')
10054 {
10055 *s = '\0';
b34976b6 10056 mips16_small = TRUE;
252b5132
RH
10057 s += 3;
10058 break;
10059 }
10060 else if (s[1] == 'e' && s[2] == ' ')
10061 {
10062 *s = '\0';
b34976b6 10063 mips16_ext = TRUE;
252b5132
RH
10064 s += 3;
10065 break;
10066 }
10067 /* Fall through. */
10068 default:
10069 insn_error = _("unknown opcode");
10070 return;
10071 }
10072
10073 if (mips_opts.noautoextend && ! mips16_ext)
b34976b6 10074 mips16_small = TRUE;
252b5132
RH
10075
10076 if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
10077 {
10078 insn_error = _("unrecognized opcode");
10079 return;
10080 }
10081
10082 argsstart = s;
10083 for (;;)
10084 {
9b3f89ee
TS
10085 bfd_boolean ok;
10086
252b5132
RH
10087 assert (strcmp (insn->name, str) == 0);
10088
037b32b9 10089 ok = is_opcode_valid_16 (insn);
9b3f89ee
TS
10090 if (! ok)
10091 {
10092 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
10093 && strcmp (insn->name, insn[1].name) == 0)
10094 {
10095 ++insn;
10096 continue;
10097 }
10098 else
10099 {
10100 if (!insn_error)
10101 {
10102 static char buf[100];
10103 sprintf (buf,
10104 _("opcode not supported on this processor: %s (%s)"),
10105 mips_cpu_info_from_arch (mips_opts.arch)->name,
10106 mips_cpu_info_from_isa (mips_opts.isa)->name);
10107 insn_error = buf;
10108 }
10109 return;
10110 }
10111 }
10112
1e915849 10113 create_insn (ip, insn);
252b5132 10114 imm_expr.X_op = O_absent;
f6688943
TS
10115 imm_reloc[0] = BFD_RELOC_UNUSED;
10116 imm_reloc[1] = BFD_RELOC_UNUSED;
10117 imm_reloc[2] = BFD_RELOC_UNUSED;
5f74bc13 10118 imm2_expr.X_op = O_absent;
252b5132 10119 offset_expr.X_op = O_absent;
f6688943
TS
10120 offset_reloc[0] = BFD_RELOC_UNUSED;
10121 offset_reloc[1] = BFD_RELOC_UNUSED;
10122 offset_reloc[2] = BFD_RELOC_UNUSED;
252b5132
RH
10123 for (args = insn->args; 1; ++args)
10124 {
10125 int c;
10126
10127 if (*s == ' ')
10128 ++s;
10129
10130 /* In this switch statement we call break if we did not find
10131 a match, continue if we did find a match, or return if we
10132 are done. */
10133
10134 c = *args;
10135 switch (c)
10136 {
10137 case '\0':
10138 if (*s == '\0')
10139 {
10140 /* Stuff the immediate value in now, if we can. */
10141 if (imm_expr.X_op == O_constant
f6688943 10142 && *imm_reloc > BFD_RELOC_UNUSED
738e5348
RS
10143 && *imm_reloc != BFD_RELOC_MIPS16_GOT16
10144 && *imm_reloc != BFD_RELOC_MIPS16_CALL16
252b5132
RH
10145 && insn->pinfo != INSN_MACRO)
10146 {
d6f16593
MR
10147 valueT tmp;
10148
10149 switch (*offset_reloc)
10150 {
10151 case BFD_RELOC_MIPS16_HI16_S:
10152 tmp = (imm_expr.X_add_number + 0x8000) >> 16;
10153 break;
10154
10155 case BFD_RELOC_MIPS16_HI16:
10156 tmp = imm_expr.X_add_number >> 16;
10157 break;
10158
10159 case BFD_RELOC_MIPS16_LO16:
10160 tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
10161 - 0x8000;
10162 break;
10163
10164 case BFD_RELOC_UNUSED:
10165 tmp = imm_expr.X_add_number;
10166 break;
10167
10168 default:
10169 internalError ();
10170 }
10171 *offset_reloc = BFD_RELOC_UNUSED;
10172
c4e7957c 10173 mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
d6f16593 10174 tmp, TRUE, mips16_small,
252b5132
RH
10175 mips16_ext, &ip->insn_opcode,
10176 &ip->use_extend, &ip->extend);
10177 imm_expr.X_op = O_absent;
f6688943 10178 *imm_reloc = BFD_RELOC_UNUSED;
252b5132
RH
10179 }
10180
10181 return;
10182 }
10183 break;
10184
10185 case ',':
10186 if (*s++ == c)
10187 continue;
10188 s--;
10189 switch (*++args)
10190 {
10191 case 'v':
bf12938e 10192 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
252b5132
RH
10193 continue;
10194 case 'w':
bf12938e 10195 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
252b5132
RH
10196 continue;
10197 }
10198 break;
10199
10200 case '(':
10201 case ')':
10202 if (*s++ == c)
10203 continue;
10204 break;
10205
10206 case 'v':
10207 case 'w':
10208 if (s[0] != '$')
10209 {
10210 if (c == 'v')
bf12938e 10211 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
252b5132 10212 else
bf12938e 10213 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
252b5132
RH
10214 ++args;
10215 continue;
10216 }
10217 /* Fall through. */
10218 case 'x':
10219 case 'y':
10220 case 'z':
10221 case 'Z':
10222 case '0':
10223 case 'S':
10224 case 'R':
10225 case 'X':
10226 case 'Y':
707bfff6
TS
10227 s_reset = s;
10228 if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
252b5132 10229 {
707bfff6 10230 if (c == 'v' || c == 'w')
85b51719 10231 {
707bfff6 10232 if (c == 'v')
a9e24354 10233 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
707bfff6 10234 else
a9e24354 10235 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
707bfff6
TS
10236 ++args;
10237 continue;
85b51719 10238 }
707bfff6 10239 break;
252b5132
RH
10240 }
10241
10242 if (*s == ' ')
10243 ++s;
10244 if (args[1] != *s)
10245 {
10246 if (c == 'v' || c == 'w')
10247 {
10248 regno = mips16_to_32_reg_map[lastregno];
10249 s = s_reset;
f9419b05 10250 ++args;
252b5132
RH
10251 }
10252 }
10253
10254 switch (c)
10255 {
10256 case 'x':
10257 case 'y':
10258 case 'z':
10259 case 'v':
10260 case 'w':
10261 case 'Z':
10262 regno = mips32_to_16_reg_map[regno];
10263 break;
10264
10265 case '0':
10266 if (regno != 0)
10267 regno = ILLEGAL_REG;
10268 break;
10269
10270 case 'S':
10271 if (regno != SP)
10272 regno = ILLEGAL_REG;
10273 break;
10274
10275 case 'R':
10276 if (regno != RA)
10277 regno = ILLEGAL_REG;
10278 break;
10279
10280 case 'X':
10281 case 'Y':
741fe287
MR
10282 if (regno == AT && mips_opts.at)
10283 {
10284 if (mips_opts.at == ATREG)
10285 as_warn (_("used $at without \".set noat\""));
10286 else
10287 as_warn (_("used $%u with \".set at=$%u\""),
10288 regno, mips_opts.at);
10289 }
252b5132
RH
10290 break;
10291
10292 default:
10293 internalError ();
10294 }
10295
10296 if (regno == ILLEGAL_REG)
10297 break;
10298
10299 switch (c)
10300 {
10301 case 'x':
10302 case 'v':
bf12938e 10303 MIPS16_INSERT_OPERAND (RX, *ip, regno);
252b5132
RH
10304 break;
10305 case 'y':
10306 case 'w':
bf12938e 10307 MIPS16_INSERT_OPERAND (RY, *ip, regno);
252b5132
RH
10308 break;
10309 case 'z':
bf12938e 10310 MIPS16_INSERT_OPERAND (RZ, *ip, regno);
252b5132
RH
10311 break;
10312 case 'Z':
bf12938e 10313 MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
252b5132
RH
10314 case '0':
10315 case 'S':
10316 case 'R':
10317 break;
10318 case 'X':
bf12938e 10319 MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
252b5132
RH
10320 break;
10321 case 'Y':
10322 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
bf12938e 10323 MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
252b5132
RH
10324 break;
10325 default:
10326 internalError ();
10327 }
10328
10329 lastregno = regno;
10330 continue;
10331
10332 case 'P':
10333 if (strncmp (s, "$pc", 3) == 0)
10334 {
10335 s += 3;
10336 continue;
10337 }
10338 break;
10339
252b5132
RH
10340 case '5':
10341 case 'H':
10342 case 'W':
10343 case 'D':
10344 case 'j':
252b5132
RH
10345 case 'V':
10346 case 'C':
10347 case 'U':
10348 case 'k':
10349 case 'K':
d6f16593
MR
10350 i = my_getSmallExpression (&imm_expr, imm_reloc, s);
10351 if (i > 0)
252b5132 10352 {
d6f16593 10353 if (imm_expr.X_op != O_constant)
252b5132 10354 {
b34976b6 10355 mips16_ext = TRUE;
b34976b6 10356 ip->use_extend = TRUE;
252b5132 10357 ip->extend = 0;
252b5132 10358 }
d6f16593
MR
10359 else
10360 {
10361 /* We need to relax this instruction. */
10362 *offset_reloc = *imm_reloc;
10363 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10364 }
10365 s = expr_end;
10366 continue;
252b5132 10367 }
d6f16593
MR
10368 *imm_reloc = BFD_RELOC_UNUSED;
10369 /* Fall through. */
10370 case '<':
10371 case '>':
10372 case '[':
10373 case ']':
10374 case '4':
10375 case '8':
10376 my_getExpression (&imm_expr, s);
252b5132
RH
10377 if (imm_expr.X_op == O_register)
10378 {
10379 /* What we thought was an expression turned out to
10380 be a register. */
10381
10382 if (s[0] == '(' && args[1] == '(')
10383 {
10384 /* It looks like the expression was omitted
10385 before a register indirection, which means
10386 that the expression is implicitly zero. We
10387 still set up imm_expr, so that we handle
10388 explicit extensions correctly. */
10389 imm_expr.X_op = O_constant;
10390 imm_expr.X_add_number = 0;
f6688943 10391 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
252b5132
RH
10392 continue;
10393 }
10394
10395 break;
10396 }
10397
10398 /* We need to relax this instruction. */
f6688943 10399 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
252b5132
RH
10400 s = expr_end;
10401 continue;
10402
10403 case 'p':
10404 case 'q':
10405 case 'A':
10406 case 'B':
10407 case 'E':
10408 /* We use offset_reloc rather than imm_reloc for the PC
10409 relative operands. This lets macros with both
10410 immediate and address operands work correctly. */
10411 my_getExpression (&offset_expr, s);
10412
10413 if (offset_expr.X_op == O_register)
10414 break;
10415
10416 /* We need to relax this instruction. */
f6688943 10417 *offset_reloc = (int) BFD_RELOC_UNUSED + c;
252b5132
RH
10418 s = expr_end;
10419 continue;
10420
10421 case '6': /* break code */
10422 my_getExpression (&imm_expr, s);
10423 check_absolute_expr (ip, &imm_expr);
10424 if ((unsigned long) imm_expr.X_add_number > 63)
bf12938e
RS
10425 as_warn (_("Invalid value for `%s' (%lu)"),
10426 ip->insn_mo->name,
10427 (unsigned long) imm_expr.X_add_number);
10428 MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
252b5132
RH
10429 imm_expr.X_op = O_absent;
10430 s = expr_end;
10431 continue;
10432
10433 case 'a': /* 26 bit address */
10434 my_getExpression (&offset_expr, s);
10435 s = expr_end;
f6688943 10436 *offset_reloc = BFD_RELOC_MIPS16_JMP;
252b5132
RH
10437 ip->insn_opcode <<= 16;
10438 continue;
10439
10440 case 'l': /* register list for entry macro */
10441 case 'L': /* register list for exit macro */
10442 {
10443 int mask;
10444
10445 if (c == 'l')
10446 mask = 0;
10447 else
10448 mask = 7 << 3;
10449 while (*s != '\0')
10450 {
707bfff6 10451 unsigned int freg, reg1, reg2;
252b5132
RH
10452
10453 while (*s == ' ' || *s == ',')
10454 ++s;
707bfff6 10455 if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
252b5132 10456 freg = 0;
707bfff6
TS
10457 else if (reg_lookup (&s, RTYPE_FPU, &reg1))
10458 freg = 1;
252b5132
RH
10459 else
10460 {
707bfff6
TS
10461 as_bad (_("can't parse register list"));
10462 break;
252b5132
RH
10463 }
10464 if (*s == ' ')
10465 ++s;
10466 if (*s != '-')
10467 reg2 = reg1;
10468 else
10469 {
10470 ++s;
707bfff6
TS
10471 if (!reg_lookup (&s, freg ? RTYPE_FPU
10472 : (RTYPE_GP | RTYPE_NUM), &reg2))
252b5132 10473 {
707bfff6
TS
10474 as_bad (_("invalid register list"));
10475 break;
252b5132
RH
10476 }
10477 }
10478 if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10479 {
10480 mask &= ~ (7 << 3);
10481 mask |= 5 << 3;
10482 }
10483 else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10484 {
10485 mask &= ~ (7 << 3);
10486 mask |= 6 << 3;
10487 }
10488 else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
10489 mask |= (reg2 - 3) << 3;
10490 else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
10491 mask |= (reg2 - 15) << 1;
f9419b05 10492 else if (reg1 == RA && reg2 == RA)
252b5132
RH
10493 mask |= 1;
10494 else
10495 {
10496 as_bad (_("invalid register list"));
10497 break;
10498 }
10499 }
10500 /* The mask is filled in in the opcode table for the
10501 benefit of the disassembler. We remove it before
10502 applying the actual mask. */
10503 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
10504 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
10505 }
10506 continue;
10507
0499d65b
TS
10508 case 'm': /* Register list for save insn. */
10509 case 'M': /* Register list for restore insn. */
10510 {
10511 int opcode = 0;
10512 int framesz = 0, seen_framesz = 0;
10513 int args = 0, statics = 0, sregs = 0;
10514
10515 while (*s != '\0')
10516 {
10517 unsigned int reg1, reg2;
10518
10519 SKIP_SPACE_TABS (s);
10520 while (*s == ',')
10521 ++s;
10522 SKIP_SPACE_TABS (s);
10523
10524 my_getExpression (&imm_expr, s);
10525 if (imm_expr.X_op == O_constant)
10526 {
10527 /* Handle the frame size. */
10528 if (seen_framesz)
10529 {
10530 as_bad (_("more than one frame size in list"));
10531 break;
10532 }
10533 seen_framesz = 1;
10534 framesz = imm_expr.X_add_number;
10535 imm_expr.X_op = O_absent;
10536 s = expr_end;
10537 continue;
10538 }
10539
707bfff6 10540 if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
0499d65b
TS
10541 {
10542 as_bad (_("can't parse register list"));
10543 break;
10544 }
0499d65b 10545
707bfff6
TS
10546 while (*s == ' ')
10547 ++s;
10548
0499d65b
TS
10549 if (*s != '-')
10550 reg2 = reg1;
10551 else
10552 {
10553 ++s;
707bfff6
TS
10554 if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
10555 || reg2 < reg1)
0499d65b
TS
10556 {
10557 as_bad (_("can't parse register list"));
10558 break;
10559 }
0499d65b
TS
10560 }
10561
10562 while (reg1 <= reg2)
10563 {
10564 if (reg1 >= 4 && reg1 <= 7)
10565 {
3a93f742 10566 if (!seen_framesz)
0499d65b
TS
10567 /* args $a0-$a3 */
10568 args |= 1 << (reg1 - 4);
10569 else
10570 /* statics $a0-$a3 */
10571 statics |= 1 << (reg1 - 4);
10572 }
10573 else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
10574 {
10575 /* $s0-$s8 */
10576 sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
10577 }
10578 else if (reg1 == 31)
10579 {
10580 /* Add $ra to insn. */
10581 opcode |= 0x40;
10582 }
10583 else
10584 {
10585 as_bad (_("unexpected register in list"));
10586 break;
10587 }
10588 if (++reg1 == 24)
10589 reg1 = 30;
10590 }
10591 }
10592
10593 /* Encode args/statics combination. */
10594 if (args & statics)
10595 as_bad (_("arg/static registers overlap"));
10596 else if (args == 0xf)
10597 /* All $a0-$a3 are args. */
10598 opcode |= MIPS16_ALL_ARGS << 16;
10599 else if (statics == 0xf)
10600 /* All $a0-$a3 are statics. */
10601 opcode |= MIPS16_ALL_STATICS << 16;
10602 else
10603 {
10604 int narg = 0, nstat = 0;
10605
10606 /* Count arg registers. */
10607 while (args & 0x1)
10608 {
10609 args >>= 1;
10610 narg++;
10611 }
10612 if (args != 0)
10613 as_bad (_("invalid arg register list"));
10614
10615 /* Count static registers. */
10616 while (statics & 0x8)
10617 {
10618 statics = (statics << 1) & 0xf;
10619 nstat++;
10620 }
10621 if (statics != 0)
10622 as_bad (_("invalid static register list"));
10623
10624 /* Encode args/statics. */
10625 opcode |= ((narg << 2) | nstat) << 16;
10626 }
10627
10628 /* Encode $s0/$s1. */
10629 if (sregs & (1 << 0)) /* $s0 */
10630 opcode |= 0x20;
10631 if (sregs & (1 << 1)) /* $s1 */
10632 opcode |= 0x10;
10633 sregs >>= 2;
10634
10635 if (sregs != 0)
10636 {
10637 /* Count regs $s2-$s8. */
10638 int nsreg = 0;
10639 while (sregs & 1)
10640 {
10641 sregs >>= 1;
10642 nsreg++;
10643 }
10644 if (sregs != 0)
10645 as_bad (_("invalid static register list"));
10646 /* Encode $s2-$s8. */
10647 opcode |= nsreg << 24;
10648 }
10649
10650 /* Encode frame size. */
10651 if (!seen_framesz)
10652 as_bad (_("missing frame size"));
10653 else if ((framesz & 7) != 0 || framesz < 0
10654 || framesz > 0xff * 8)
10655 as_bad (_("invalid frame size"));
10656 else if (framesz != 128 || (opcode >> 16) != 0)
10657 {
10658 framesz /= 8;
10659 opcode |= (((framesz & 0xf0) << 16)
10660 | (framesz & 0x0f));
10661 }
10662
10663 /* Finally build the instruction. */
10664 if ((opcode >> 16) != 0 || framesz == 0)
10665 {
10666 ip->use_extend = TRUE;
10667 ip->extend = opcode >> 16;
10668 }
10669 ip->insn_opcode |= opcode & 0x7f;
10670 }
10671 continue;
10672
252b5132
RH
10673 case 'e': /* extend code */
10674 my_getExpression (&imm_expr, s);
10675 check_absolute_expr (ip, &imm_expr);
10676 if ((unsigned long) imm_expr.X_add_number > 0x7ff)
10677 {
10678 as_warn (_("Invalid value for `%s' (%lu)"),
10679 ip->insn_mo->name,
10680 (unsigned long) imm_expr.X_add_number);
10681 imm_expr.X_add_number &= 0x7ff;
10682 }
10683 ip->insn_opcode |= imm_expr.X_add_number;
10684 imm_expr.X_op = O_absent;
10685 s = expr_end;
10686 continue;
10687
10688 default:
10689 internalError ();
10690 }
10691 break;
10692 }
10693
10694 /* Args don't match. */
10695 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
10696 strcmp (insn->name, insn[1].name) == 0)
10697 {
10698 ++insn;
10699 s = argsstart;
10700 continue;
10701 }
10702
10703 insn_error = _("illegal operands");
10704
10705 return;
10706 }
10707}
10708
10709/* This structure holds information we know about a mips16 immediate
10710 argument type. */
10711
e972090a
NC
10712struct mips16_immed_operand
10713{
252b5132
RH
10714 /* The type code used in the argument string in the opcode table. */
10715 int type;
10716 /* The number of bits in the short form of the opcode. */
10717 int nbits;
10718 /* The number of bits in the extended form of the opcode. */
10719 int extbits;
10720 /* The amount by which the short form is shifted when it is used;
10721 for example, the sw instruction has a shift count of 2. */
10722 int shift;
10723 /* The amount by which the short form is shifted when it is stored
10724 into the instruction code. */
10725 int op_shift;
10726 /* Non-zero if the short form is unsigned. */
10727 int unsp;
10728 /* Non-zero if the extended form is unsigned. */
10729 int extu;
10730 /* Non-zero if the value is PC relative. */
10731 int pcrel;
10732};
10733
10734/* The mips16 immediate operand types. */
10735
10736static const struct mips16_immed_operand mips16_immed_operands[] =
10737{
10738 { '<', 3, 5, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
10739 { '>', 3, 5, 0, MIPS16OP_SH_RX, 1, 1, 0 },
10740 { '[', 3, 6, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
10741 { ']', 3, 6, 0, MIPS16OP_SH_RX, 1, 1, 0 },
10742 { '4', 4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
10743 { '5', 5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
10744 { 'H', 5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
10745 { 'W', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
10746 { 'D', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
10747 { 'j', 5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
10748 { '8', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
10749 { 'V', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
10750 { 'C', 8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
10751 { 'U', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
10752 { 'k', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
10753 { 'K', 8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
10754 { 'p', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10755 { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10756 { 'A', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
10757 { 'B', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
10758 { 'E', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
10759};
10760
10761#define MIPS16_NUM_IMMED \
10762 (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
10763
10764/* Handle a mips16 instruction with an immediate value. This or's the
10765 small immediate value into *INSN. It sets *USE_EXTEND to indicate
10766 whether an extended value is needed; if one is needed, it sets
10767 *EXTEND to the value. The argument type is TYPE. The value is VAL.
10768 If SMALL is true, an unextended opcode was explicitly requested.
10769 If EXT is true, an extended opcode was explicitly requested. If
10770 WARN is true, warn if EXT does not match reality. */
10771
10772static void
17a2f251
TS
10773mips16_immed (char *file, unsigned int line, int type, offsetT val,
10774 bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
10775 unsigned long *insn, bfd_boolean *use_extend,
10776 unsigned short *extend)
252b5132 10777{
3994f87e 10778 const struct mips16_immed_operand *op;
252b5132 10779 int mintiny, maxtiny;
b34976b6 10780 bfd_boolean needext;
252b5132
RH
10781
10782 op = mips16_immed_operands;
10783 while (op->type != type)
10784 {
10785 ++op;
10786 assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
10787 }
10788
10789 if (op->unsp)
10790 {
10791 if (type == '<' || type == '>' || type == '[' || type == ']')
10792 {
10793 mintiny = 1;
10794 maxtiny = 1 << op->nbits;
10795 }
10796 else
10797 {
10798 mintiny = 0;
10799 maxtiny = (1 << op->nbits) - 1;
10800 }
10801 }
10802 else
10803 {
10804 mintiny = - (1 << (op->nbits - 1));
10805 maxtiny = (1 << (op->nbits - 1)) - 1;
10806 }
10807
10808 /* Branch offsets have an implicit 0 in the lowest bit. */
10809 if (type == 'p' || type == 'q')
10810 val /= 2;
10811
10812 if ((val & ((1 << op->shift) - 1)) != 0
10813 || val < (mintiny << op->shift)
10814 || val > (maxtiny << op->shift))
b34976b6 10815 needext = TRUE;
252b5132 10816 else
b34976b6 10817 needext = FALSE;
252b5132
RH
10818
10819 if (warn && ext && ! needext)
beae10d5
KH
10820 as_warn_where (file, line,
10821 _("extended operand requested but not required"));
252b5132
RH
10822 if (small && needext)
10823 as_bad_where (file, line, _("invalid unextended operand value"));
10824
10825 if (small || (! ext && ! needext))
10826 {
10827 int insnval;
10828
b34976b6 10829 *use_extend = FALSE;
252b5132
RH
10830 insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
10831 insnval <<= op->op_shift;
10832 *insn |= insnval;
10833 }
10834 else
10835 {
10836 long minext, maxext;
10837 int extval;
10838
10839 if (op->extu)
10840 {
10841 minext = 0;
10842 maxext = (1 << op->extbits) - 1;
10843 }
10844 else
10845 {
10846 minext = - (1 << (op->extbits - 1));
10847 maxext = (1 << (op->extbits - 1)) - 1;
10848 }
10849 if (val < minext || val > maxext)
10850 as_bad_where (file, line,
10851 _("operand value out of range for instruction"));
10852
b34976b6 10853 *use_extend = TRUE;
252b5132
RH
10854 if (op->extbits == 16)
10855 {
10856 extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
10857 val &= 0x1f;
10858 }
10859 else if (op->extbits == 15)
10860 {
10861 extval = ((val >> 11) & 0xf) | (val & 0x7f0);
10862 val &= 0xf;
10863 }
10864 else
10865 {
10866 extval = ((val & 0x1f) << 6) | (val & 0x20);
10867 val = 0;
10868 }
10869
10870 *extend = (unsigned short) extval;
10871 *insn |= val;
10872 }
10873}
10874\f
d6f16593 10875struct percent_op_match
ad8d3bb3 10876{
5e0116d5
RS
10877 const char *str;
10878 bfd_reloc_code_real_type reloc;
d6f16593
MR
10879};
10880
10881static const struct percent_op_match mips_percent_op[] =
ad8d3bb3 10882{
5e0116d5 10883 {"%lo", BFD_RELOC_LO16},
ad8d3bb3 10884#ifdef OBJ_ELF
5e0116d5
RS
10885 {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
10886 {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
10887 {"%call16", BFD_RELOC_MIPS_CALL16},
10888 {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
10889 {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
10890 {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
10891 {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
10892 {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
10893 {"%got", BFD_RELOC_MIPS_GOT16},
10894 {"%gp_rel", BFD_RELOC_GPREL16},
10895 {"%half", BFD_RELOC_16},
10896 {"%highest", BFD_RELOC_MIPS_HIGHEST},
10897 {"%higher", BFD_RELOC_MIPS_HIGHER},
10898 {"%neg", BFD_RELOC_MIPS_SUB},
3f98094e
DJ
10899 {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
10900 {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
10901 {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
10902 {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
10903 {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
10904 {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
10905 {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
ad8d3bb3 10906#endif
5e0116d5 10907 {"%hi", BFD_RELOC_HI16_S}
ad8d3bb3
TS
10908};
10909
d6f16593
MR
10910static const struct percent_op_match mips16_percent_op[] =
10911{
10912 {"%lo", BFD_RELOC_MIPS16_LO16},
10913 {"%gprel", BFD_RELOC_MIPS16_GPREL},
738e5348
RS
10914 {"%got", BFD_RELOC_MIPS16_GOT16},
10915 {"%call16", BFD_RELOC_MIPS16_CALL16},
d6f16593
MR
10916 {"%hi", BFD_RELOC_MIPS16_HI16_S}
10917};
10918
252b5132 10919
5e0116d5
RS
10920/* Return true if *STR points to a relocation operator. When returning true,
10921 move *STR over the operator and store its relocation code in *RELOC.
10922 Leave both *STR and *RELOC alone when returning false. */
10923
10924static bfd_boolean
17a2f251 10925parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
252b5132 10926{
d6f16593
MR
10927 const struct percent_op_match *percent_op;
10928 size_t limit, i;
10929
10930 if (mips_opts.mips16)
10931 {
10932 percent_op = mips16_percent_op;
10933 limit = ARRAY_SIZE (mips16_percent_op);
10934 }
10935 else
10936 {
10937 percent_op = mips_percent_op;
10938 limit = ARRAY_SIZE (mips_percent_op);
10939 }
76b3015f 10940
d6f16593 10941 for (i = 0; i < limit; i++)
5e0116d5 10942 if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
394f9b3a 10943 {
3f98094e
DJ
10944 int len = strlen (percent_op[i].str);
10945
10946 if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
10947 continue;
10948
5e0116d5
RS
10949 *str += strlen (percent_op[i].str);
10950 *reloc = percent_op[i].reloc;
394f9b3a 10951
5e0116d5
RS
10952 /* Check whether the output BFD supports this relocation.
10953 If not, issue an error and fall back on something safe. */
10954 if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
394f9b3a 10955 {
5e0116d5
RS
10956 as_bad ("relocation %s isn't supported by the current ABI",
10957 percent_op[i].str);
01a3f561 10958 *reloc = BFD_RELOC_UNUSED;
394f9b3a 10959 }
5e0116d5 10960 return TRUE;
394f9b3a 10961 }
5e0116d5 10962 return FALSE;
394f9b3a 10963}
ad8d3bb3 10964
ad8d3bb3 10965
5e0116d5
RS
10966/* Parse string STR as a 16-bit relocatable operand. Store the
10967 expression in *EP and the relocations in the array starting
10968 at RELOC. Return the number of relocation operators used.
ad8d3bb3 10969
01a3f561 10970 On exit, EXPR_END points to the first character after the expression. */
ad8d3bb3 10971
5e0116d5 10972static size_t
17a2f251
TS
10973my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
10974 char *str)
ad8d3bb3 10975{
5e0116d5
RS
10976 bfd_reloc_code_real_type reversed_reloc[3];
10977 size_t reloc_index, i;
09b8f35a
RS
10978 int crux_depth, str_depth;
10979 char *crux;
5e0116d5
RS
10980
10981 /* Search for the start of the main expression, recoding relocations
09b8f35a
RS
10982 in REVERSED_RELOC. End the loop with CRUX pointing to the start
10983 of the main expression and with CRUX_DEPTH containing the number
10984 of open brackets at that point. */
10985 reloc_index = -1;
10986 str_depth = 0;
10987 do
fb1b3232 10988 {
09b8f35a
RS
10989 reloc_index++;
10990 crux = str;
10991 crux_depth = str_depth;
10992
10993 /* Skip over whitespace and brackets, keeping count of the number
10994 of brackets. */
10995 while (*str == ' ' || *str == '\t' || *str == '(')
10996 if (*str++ == '(')
10997 str_depth++;
5e0116d5 10998 }
09b8f35a
RS
10999 while (*str == '%'
11000 && reloc_index < (HAVE_NEWABI ? 3 : 1)
11001 && parse_relocation (&str, &reversed_reloc[reloc_index]));
ad8d3bb3 11002
09b8f35a 11003 my_getExpression (ep, crux);
5e0116d5 11004 str = expr_end;
394f9b3a 11005
5e0116d5 11006 /* Match every open bracket. */
09b8f35a 11007 while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
5e0116d5 11008 if (*str++ == ')')
09b8f35a 11009 crux_depth--;
394f9b3a 11010
09b8f35a 11011 if (crux_depth > 0)
5e0116d5 11012 as_bad ("unclosed '('");
394f9b3a 11013
5e0116d5 11014 expr_end = str;
252b5132 11015
01a3f561 11016 if (reloc_index != 0)
64bdfcaf
RS
11017 {
11018 prev_reloc_op_frag = frag_now;
11019 for (i = 0; i < reloc_index; i++)
11020 reloc[i] = reversed_reloc[reloc_index - 1 - i];
11021 }
fb1b3232 11022
5e0116d5 11023 return reloc_index;
252b5132
RH
11024}
11025
11026static void
17a2f251 11027my_getExpression (expressionS *ep, char *str)
252b5132
RH
11028{
11029 char *save_in;
98aa84af 11030 valueT val;
252b5132
RH
11031
11032 save_in = input_line_pointer;
11033 input_line_pointer = str;
11034 expression (ep);
11035 expr_end = input_line_pointer;
11036 input_line_pointer = save_in;
11037
11038 /* If we are in mips16 mode, and this is an expression based on `.',
11039 then we bump the value of the symbol by 1 since that is how other
11040 text symbols are handled. We don't bother to handle complex
11041 expressions, just `.' plus or minus a constant. */
11042 if (mips_opts.mips16
11043 && ep->X_op == O_symbol
11044 && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
11045 && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
49309057
ILT
11046 && symbol_get_frag (ep->X_add_symbol) == frag_now
11047 && symbol_constant_p (ep->X_add_symbol)
98aa84af
AM
11048 && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
11049 S_SET_VALUE (ep->X_add_symbol, val + 1);
252b5132
RH
11050}
11051
252b5132 11052char *
17a2f251 11053md_atof (int type, char *litP, int *sizeP)
252b5132 11054{
499ac353 11055 return ieee_md_atof (type, litP, sizeP, target_big_endian);
252b5132
RH
11056}
11057
11058void
17a2f251 11059md_number_to_chars (char *buf, valueT val, int n)
252b5132
RH
11060{
11061 if (target_big_endian)
11062 number_to_chars_bigendian (buf, val, n);
11063 else
11064 number_to_chars_littleendian (buf, val, n);
11065}
11066\f
ae948b86 11067#ifdef OBJ_ELF
e013f690
TS
11068static int support_64bit_objects(void)
11069{
11070 const char **list, **l;
aa3d8fdf 11071 int yes;
e013f690
TS
11072
11073 list = bfd_target_list ();
11074 for (l = list; *l != NULL; l++)
11075#ifdef TE_TMIPS
11076 /* This is traditional mips */
11077 if (strcmp (*l, "elf64-tradbigmips") == 0
11078 || strcmp (*l, "elf64-tradlittlemips") == 0)
11079#else
11080 if (strcmp (*l, "elf64-bigmips") == 0
11081 || strcmp (*l, "elf64-littlemips") == 0)
11082#endif
11083 break;
aa3d8fdf 11084 yes = (*l != NULL);
e013f690 11085 free (list);
aa3d8fdf 11086 return yes;
e013f690 11087}
ae948b86 11088#endif /* OBJ_ELF */
e013f690 11089
78849248 11090const char *md_shortopts = "O::g::G:";
252b5132 11091
e972090a
NC
11092struct option md_longopts[] =
11093{
f9b4148d
CD
11094 /* Options which specify architecture. */
11095#define OPTION_ARCH_BASE (OPTION_MD_BASE)
11096#define OPTION_MARCH (OPTION_ARCH_BASE + 0)
11097 {"march", required_argument, NULL, OPTION_MARCH},
11098#define OPTION_MTUNE (OPTION_ARCH_BASE + 1)
11099 {"mtune", required_argument, NULL, OPTION_MTUNE},
11100#define OPTION_MIPS1 (OPTION_ARCH_BASE + 2)
252b5132
RH
11101 {"mips0", no_argument, NULL, OPTION_MIPS1},
11102 {"mips1", no_argument, NULL, OPTION_MIPS1},
f9b4148d 11103#define OPTION_MIPS2 (OPTION_ARCH_BASE + 3)
252b5132 11104 {"mips2", no_argument, NULL, OPTION_MIPS2},
f9b4148d 11105#define OPTION_MIPS3 (OPTION_ARCH_BASE + 4)
252b5132 11106 {"mips3", no_argument, NULL, OPTION_MIPS3},
f9b4148d 11107#define OPTION_MIPS4 (OPTION_ARCH_BASE + 5)
252b5132 11108 {"mips4", no_argument, NULL, OPTION_MIPS4},
f9b4148d 11109#define OPTION_MIPS5 (OPTION_ARCH_BASE + 6)
ae948b86 11110 {"mips5", no_argument, NULL, OPTION_MIPS5},
f9b4148d 11111#define OPTION_MIPS32 (OPTION_ARCH_BASE + 7)
ae948b86 11112 {"mips32", no_argument, NULL, OPTION_MIPS32},
f9b4148d 11113#define OPTION_MIPS64 (OPTION_ARCH_BASE + 8)
ae948b86 11114 {"mips64", no_argument, NULL, OPTION_MIPS64},
f9b4148d
CD
11115#define OPTION_MIPS32R2 (OPTION_ARCH_BASE + 9)
11116 {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
5f74bc13
CD
11117#define OPTION_MIPS64R2 (OPTION_ARCH_BASE + 10)
11118 {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
f9b4148d
CD
11119
11120 /* Options which specify Application Specific Extensions (ASEs). */
5f74bc13 11121#define OPTION_ASE_BASE (OPTION_ARCH_BASE + 11)
f9b4148d
CD
11122#define OPTION_MIPS16 (OPTION_ASE_BASE + 0)
11123 {"mips16", no_argument, NULL, OPTION_MIPS16},
11124#define OPTION_NO_MIPS16 (OPTION_ASE_BASE + 1)
11125 {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
11126#define OPTION_MIPS3D (OPTION_ASE_BASE + 2)
11127 {"mips3d", no_argument, NULL, OPTION_MIPS3D},
11128#define OPTION_NO_MIPS3D (OPTION_ASE_BASE + 3)
11129 {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
11130#define OPTION_MDMX (OPTION_ASE_BASE + 4)
11131 {"mdmx", no_argument, NULL, OPTION_MDMX},
11132#define OPTION_NO_MDMX (OPTION_ASE_BASE + 5)
11133 {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
74cd071d
CF
11134#define OPTION_DSP (OPTION_ASE_BASE + 6)
11135 {"mdsp", no_argument, NULL, OPTION_DSP},
11136#define OPTION_NO_DSP (OPTION_ASE_BASE + 7)
11137 {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
ef2e4d86
CF
11138#define OPTION_MT (OPTION_ASE_BASE + 8)
11139 {"mmt", no_argument, NULL, OPTION_MT},
11140#define OPTION_NO_MT (OPTION_ASE_BASE + 9)
11141 {"mno-mt", no_argument, NULL, OPTION_NO_MT},
e16bfa71
TS
11142#define OPTION_SMARTMIPS (OPTION_ASE_BASE + 10)
11143 {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
11144#define OPTION_NO_SMARTMIPS (OPTION_ASE_BASE + 11)
11145 {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
8b082fb1
TS
11146#define OPTION_DSPR2 (OPTION_ASE_BASE + 12)
11147 {"mdspr2", no_argument, NULL, OPTION_DSPR2},
11148#define OPTION_NO_DSPR2 (OPTION_ASE_BASE + 13)
11149 {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
f9b4148d
CD
11150
11151 /* Old-style architecture options. Don't add more of these. */
8b082fb1 11152#define OPTION_COMPAT_ARCH_BASE (OPTION_ASE_BASE + 14)
f9b4148d
CD
11153#define OPTION_M4650 (OPTION_COMPAT_ARCH_BASE + 0)
11154 {"m4650", no_argument, NULL, OPTION_M4650},
11155#define OPTION_NO_M4650 (OPTION_COMPAT_ARCH_BASE + 1)
11156 {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
11157#define OPTION_M4010 (OPTION_COMPAT_ARCH_BASE + 2)
11158 {"m4010", no_argument, NULL, OPTION_M4010},
11159#define OPTION_NO_M4010 (OPTION_COMPAT_ARCH_BASE + 3)
11160 {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
11161#define OPTION_M4100 (OPTION_COMPAT_ARCH_BASE + 4)
11162 {"m4100", no_argument, NULL, OPTION_M4100},
11163#define OPTION_NO_M4100 (OPTION_COMPAT_ARCH_BASE + 5)
11164 {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
11165#define OPTION_M3900 (OPTION_COMPAT_ARCH_BASE + 6)
11166 {"m3900", no_argument, NULL, OPTION_M3900},
11167#define OPTION_NO_M3900 (OPTION_COMPAT_ARCH_BASE + 7)
11168 {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
11169
11170 /* Options which enable bug fixes. */
11171#define OPTION_FIX_BASE (OPTION_COMPAT_ARCH_BASE + 8)
11172#define OPTION_M7000_HILO_FIX (OPTION_FIX_BASE + 0)
11173 {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
11174#define OPTION_MNO_7000_HILO_FIX (OPTION_FIX_BASE + 1)
11175 {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11176 {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
d766e8ec
RS
11177#define OPTION_FIX_VR4120 (OPTION_FIX_BASE + 2)
11178#define OPTION_NO_FIX_VR4120 (OPTION_FIX_BASE + 3)
11179 {"mfix-vr4120", no_argument, NULL, OPTION_FIX_VR4120},
11180 {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
7d8e00cf
RS
11181#define OPTION_FIX_VR4130 (OPTION_FIX_BASE + 4)
11182#define OPTION_NO_FIX_VR4130 (OPTION_FIX_BASE + 5)
11183 {"mfix-vr4130", no_argument, NULL, OPTION_FIX_VR4130},
11184 {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
f9b4148d
CD
11185
11186 /* Miscellaneous options. */
7d8e00cf 11187#define OPTION_MISC_BASE (OPTION_FIX_BASE + 6)
1ffcab4b 11188#define OPTION_TRAP (OPTION_MISC_BASE + 0)
252b5132
RH
11189 {"trap", no_argument, NULL, OPTION_TRAP},
11190 {"no-break", no_argument, NULL, OPTION_TRAP},
1ffcab4b 11191#define OPTION_BREAK (OPTION_MISC_BASE + 1)
252b5132
RH
11192 {"break", no_argument, NULL, OPTION_BREAK},
11193 {"no-trap", no_argument, NULL, OPTION_BREAK},
1ffcab4b 11194#define OPTION_EB (OPTION_MISC_BASE + 2)
252b5132 11195 {"EB", no_argument, NULL, OPTION_EB},
1ffcab4b 11196#define OPTION_EL (OPTION_MISC_BASE + 3)
252b5132 11197 {"EL", no_argument, NULL, OPTION_EL},
1ffcab4b 11198#define OPTION_FP32 (OPTION_MISC_BASE + 4)
ae948b86 11199 {"mfp32", no_argument, NULL, OPTION_FP32},
1ffcab4b 11200#define OPTION_GP32 (OPTION_MISC_BASE + 5)
c97ef257 11201 {"mgp32", no_argument, NULL, OPTION_GP32},
1ffcab4b 11202#define OPTION_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 6)
119d663a 11203 {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
1ffcab4b 11204#define OPTION_NO_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 7)
119d663a 11205 {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
1ffcab4b 11206#define OPTION_FP64 (OPTION_MISC_BASE + 8)
316f5878 11207 {"mfp64", no_argument, NULL, OPTION_FP64},
1ffcab4b 11208#define OPTION_GP64 (OPTION_MISC_BASE + 9)
ae948b86 11209 {"mgp64", no_argument, NULL, OPTION_GP64},
1ffcab4b
CD
11210#define OPTION_RELAX_BRANCH (OPTION_MISC_BASE + 10)
11211#define OPTION_NO_RELAX_BRANCH (OPTION_MISC_BASE + 11)
4a6a3df4
AO
11212 {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
11213 {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
aa6975fb
ILT
11214#define OPTION_MSHARED (OPTION_MISC_BASE + 12)
11215#define OPTION_MNO_SHARED (OPTION_MISC_BASE + 13)
11216 {"mshared", no_argument, NULL, OPTION_MSHARED},
11217 {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
aed1a261
RS
11218#define OPTION_MSYM32 (OPTION_MISC_BASE + 14)
11219#define OPTION_MNO_SYM32 (OPTION_MISC_BASE + 15)
11220 {"msym32", no_argument, NULL, OPTION_MSYM32},
11221 {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
037b32b9
AN
11222#define OPTION_SOFT_FLOAT (OPTION_MISC_BASE + 16)
11223#define OPTION_HARD_FLOAT (OPTION_MISC_BASE + 17)
11224 {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
11225 {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
11226#define OPTION_SINGLE_FLOAT (OPTION_MISC_BASE + 18)
11227#define OPTION_DOUBLE_FLOAT (OPTION_MISC_BASE + 19)
11228 {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
11229 {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
11230
f9b4148d 11231 /* ELF-specific options. */
156c2f8b 11232#ifdef OBJ_ELF
037b32b9 11233#define OPTION_ELF_BASE (OPTION_MISC_BASE + 20)
156c2f8b 11234#define OPTION_CALL_SHARED (OPTION_ELF_BASE + 0)
156c2f8b
NC
11235 {"KPIC", no_argument, NULL, OPTION_CALL_SHARED},
11236 {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
861fb55a
DJ
11237#define OPTION_CALL_NONPIC (OPTION_ELF_BASE + 1)
11238 {"call_nonpic", no_argument, NULL, OPTION_CALL_NONPIC},
11239#define OPTION_NON_SHARED (OPTION_ELF_BASE + 2)
156c2f8b 11240 {"non_shared", no_argument, NULL, OPTION_NON_SHARED},
861fb55a 11241#define OPTION_XGOT (OPTION_ELF_BASE + 3)
156c2f8b 11242 {"xgot", no_argument, NULL, OPTION_XGOT},
861fb55a 11243#define OPTION_MABI (OPTION_ELF_BASE + 4)
ae948b86 11244 {"mabi", required_argument, NULL, OPTION_MABI},
861fb55a 11245#define OPTION_32 (OPTION_ELF_BASE + 5)
156c2f8b 11246 {"32", no_argument, NULL, OPTION_32},
861fb55a 11247#define OPTION_N32 (OPTION_ELF_BASE + 6)
e013f690 11248 {"n32", no_argument, NULL, OPTION_N32},
861fb55a 11249#define OPTION_64 (OPTION_ELF_BASE + 7)
156c2f8b 11250 {"64", no_argument, NULL, OPTION_64},
861fb55a 11251#define OPTION_MDEBUG (OPTION_ELF_BASE + 8)
ecb4347a 11252 {"mdebug", no_argument, NULL, OPTION_MDEBUG},
861fb55a 11253#define OPTION_NO_MDEBUG (OPTION_ELF_BASE + 9)
ecb4347a 11254 {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
861fb55a 11255#define OPTION_PDR (OPTION_ELF_BASE + 10)
dcd410fe 11256 {"mpdr", no_argument, NULL, OPTION_PDR},
861fb55a 11257#define OPTION_NO_PDR (OPTION_ELF_BASE + 11)
dcd410fe 11258 {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
861fb55a 11259#define OPTION_MVXWORKS_PIC (OPTION_ELF_BASE + 12)
0a44bf69 11260 {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
ae948b86 11261#endif /* OBJ_ELF */
f9b4148d 11262
252b5132
RH
11263 {NULL, no_argument, NULL, 0}
11264};
156c2f8b 11265size_t md_longopts_size = sizeof (md_longopts);
252b5132 11266
316f5878
RS
11267/* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
11268 NEW_VALUE. Warn if another value was already specified. Note:
11269 we have to defer parsing the -march and -mtune arguments in order
11270 to handle 'from-abi' correctly, since the ABI might be specified
11271 in a later argument. */
11272
11273static void
17a2f251 11274mips_set_option_string (const char **string_ptr, const char *new_value)
316f5878
RS
11275{
11276 if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
11277 as_warn (_("A different %s was already specified, is now %s"),
11278 string_ptr == &mips_arch_string ? "-march" : "-mtune",
11279 new_value);
11280
11281 *string_ptr = new_value;
11282}
11283
252b5132 11284int
17a2f251 11285md_parse_option (int c, char *arg)
252b5132
RH
11286{
11287 switch (c)
11288 {
119d663a
NC
11289 case OPTION_CONSTRUCT_FLOATS:
11290 mips_disable_float_construction = 0;
11291 break;
bdaaa2e1 11292
119d663a
NC
11293 case OPTION_NO_CONSTRUCT_FLOATS:
11294 mips_disable_float_construction = 1;
11295 break;
bdaaa2e1 11296
252b5132
RH
11297 case OPTION_TRAP:
11298 mips_trap = 1;
11299 break;
11300
11301 case OPTION_BREAK:
11302 mips_trap = 0;
11303 break;
11304
11305 case OPTION_EB:
11306 target_big_endian = 1;
11307 break;
11308
11309 case OPTION_EL:
11310 target_big_endian = 0;
11311 break;
11312
11313 case 'O':
4ffff32f
TS
11314 if (arg == NULL)
11315 mips_optimize = 1;
11316 else if (arg[0] == '0')
11317 mips_optimize = 0;
11318 else if (arg[0] == '1')
252b5132
RH
11319 mips_optimize = 1;
11320 else
11321 mips_optimize = 2;
11322 break;
11323
11324 case 'g':
11325 if (arg == NULL)
11326 mips_debug = 2;
11327 else
11328 mips_debug = atoi (arg);
252b5132
RH
11329 break;
11330
11331 case OPTION_MIPS1:
316f5878 11332 file_mips_isa = ISA_MIPS1;
252b5132
RH
11333 break;
11334
11335 case OPTION_MIPS2:
316f5878 11336 file_mips_isa = ISA_MIPS2;
252b5132
RH
11337 break;
11338
11339 case OPTION_MIPS3:
316f5878 11340 file_mips_isa = ISA_MIPS3;
252b5132
RH
11341 break;
11342
11343 case OPTION_MIPS4:
316f5878 11344 file_mips_isa = ISA_MIPS4;
e7af610e
NC
11345 break;
11346
84ea6cf2 11347 case OPTION_MIPS5:
316f5878 11348 file_mips_isa = ISA_MIPS5;
84ea6cf2
NC
11349 break;
11350
e7af610e 11351 case OPTION_MIPS32:
316f5878 11352 file_mips_isa = ISA_MIPS32;
252b5132
RH
11353 break;
11354
af7ee8bf
CD
11355 case OPTION_MIPS32R2:
11356 file_mips_isa = ISA_MIPS32R2;
11357 break;
11358
5f74bc13
CD
11359 case OPTION_MIPS64R2:
11360 file_mips_isa = ISA_MIPS64R2;
11361 break;
11362
84ea6cf2 11363 case OPTION_MIPS64:
316f5878 11364 file_mips_isa = ISA_MIPS64;
84ea6cf2
NC
11365 break;
11366
ec68c924 11367 case OPTION_MTUNE:
316f5878
RS
11368 mips_set_option_string (&mips_tune_string, arg);
11369 break;
ec68c924 11370
316f5878
RS
11371 case OPTION_MARCH:
11372 mips_set_option_string (&mips_arch_string, arg);
252b5132
RH
11373 break;
11374
11375 case OPTION_M4650:
316f5878
RS
11376 mips_set_option_string (&mips_arch_string, "4650");
11377 mips_set_option_string (&mips_tune_string, "4650");
252b5132
RH
11378 break;
11379
11380 case OPTION_NO_M4650:
11381 break;
11382
11383 case OPTION_M4010:
316f5878
RS
11384 mips_set_option_string (&mips_arch_string, "4010");
11385 mips_set_option_string (&mips_tune_string, "4010");
252b5132
RH
11386 break;
11387
11388 case OPTION_NO_M4010:
11389 break;
11390
11391 case OPTION_M4100:
316f5878
RS
11392 mips_set_option_string (&mips_arch_string, "4100");
11393 mips_set_option_string (&mips_tune_string, "4100");
252b5132
RH
11394 break;
11395
11396 case OPTION_NO_M4100:
11397 break;
11398
252b5132 11399 case OPTION_M3900:
316f5878
RS
11400 mips_set_option_string (&mips_arch_string, "3900");
11401 mips_set_option_string (&mips_tune_string, "3900");
252b5132 11402 break;
bdaaa2e1 11403
252b5132
RH
11404 case OPTION_NO_M3900:
11405 break;
11406
deec1734
CD
11407 case OPTION_MDMX:
11408 mips_opts.ase_mdmx = 1;
11409 break;
11410
11411 case OPTION_NO_MDMX:
11412 mips_opts.ase_mdmx = 0;
11413 break;
11414
74cd071d
CF
11415 case OPTION_DSP:
11416 mips_opts.ase_dsp = 1;
8b082fb1 11417 mips_opts.ase_dspr2 = 0;
74cd071d
CF
11418 break;
11419
11420 case OPTION_NO_DSP:
8b082fb1
TS
11421 mips_opts.ase_dsp = 0;
11422 mips_opts.ase_dspr2 = 0;
11423 break;
11424
11425 case OPTION_DSPR2:
11426 mips_opts.ase_dspr2 = 1;
11427 mips_opts.ase_dsp = 1;
11428 break;
11429
11430 case OPTION_NO_DSPR2:
11431 mips_opts.ase_dspr2 = 0;
74cd071d
CF
11432 mips_opts.ase_dsp = 0;
11433 break;
11434
ef2e4d86
CF
11435 case OPTION_MT:
11436 mips_opts.ase_mt = 1;
11437 break;
11438
11439 case OPTION_NO_MT:
11440 mips_opts.ase_mt = 0;
11441 break;
11442
252b5132
RH
11443 case OPTION_MIPS16:
11444 mips_opts.mips16 = 1;
7d10b47d 11445 mips_no_prev_insn ();
252b5132
RH
11446 break;
11447
11448 case OPTION_NO_MIPS16:
11449 mips_opts.mips16 = 0;
7d10b47d 11450 mips_no_prev_insn ();
252b5132
RH
11451 break;
11452
1f25f5d3
CD
11453 case OPTION_MIPS3D:
11454 mips_opts.ase_mips3d = 1;
11455 break;
11456
11457 case OPTION_NO_MIPS3D:
11458 mips_opts.ase_mips3d = 0;
11459 break;
11460
e16bfa71
TS
11461 case OPTION_SMARTMIPS:
11462 mips_opts.ase_smartmips = 1;
11463 break;
11464
11465 case OPTION_NO_SMARTMIPS:
11466 mips_opts.ase_smartmips = 0;
11467 break;
11468
d766e8ec
RS
11469 case OPTION_FIX_VR4120:
11470 mips_fix_vr4120 = 1;
60b63b72
RS
11471 break;
11472
d766e8ec
RS
11473 case OPTION_NO_FIX_VR4120:
11474 mips_fix_vr4120 = 0;
60b63b72
RS
11475 break;
11476
7d8e00cf
RS
11477 case OPTION_FIX_VR4130:
11478 mips_fix_vr4130 = 1;
11479 break;
11480
11481 case OPTION_NO_FIX_VR4130:
11482 mips_fix_vr4130 = 0;
11483 break;
11484
4a6a3df4
AO
11485 case OPTION_RELAX_BRANCH:
11486 mips_relax_branch = 1;
11487 break;
11488
11489 case OPTION_NO_RELAX_BRANCH:
11490 mips_relax_branch = 0;
11491 break;
11492
aa6975fb
ILT
11493 case OPTION_MSHARED:
11494 mips_in_shared = TRUE;
11495 break;
11496
11497 case OPTION_MNO_SHARED:
11498 mips_in_shared = FALSE;
11499 break;
11500
aed1a261
RS
11501 case OPTION_MSYM32:
11502 mips_opts.sym32 = TRUE;
11503 break;
11504
11505 case OPTION_MNO_SYM32:
11506 mips_opts.sym32 = FALSE;
11507 break;
11508
0f074f60 11509#ifdef OBJ_ELF
252b5132
RH
11510 /* When generating ELF code, we permit -KPIC and -call_shared to
11511 select SVR4_PIC, and -non_shared to select no PIC. This is
11512 intended to be compatible with Irix 5. */
11513 case OPTION_CALL_SHARED:
f43abd2b 11514 if (!IS_ELF)
252b5132
RH
11515 {
11516 as_bad (_("-call_shared is supported only for ELF format"));
11517 return 0;
11518 }
11519 mips_pic = SVR4_PIC;
143d77c5 11520 mips_abicalls = TRUE;
252b5132
RH
11521 break;
11522
861fb55a
DJ
11523 case OPTION_CALL_NONPIC:
11524 if (!IS_ELF)
11525 {
11526 as_bad (_("-call_nonpic is supported only for ELF format"));
11527 return 0;
11528 }
11529 mips_pic = NO_PIC;
11530 mips_abicalls = TRUE;
11531 break;
11532
252b5132 11533 case OPTION_NON_SHARED:
f43abd2b 11534 if (!IS_ELF)
252b5132
RH
11535 {
11536 as_bad (_("-non_shared is supported only for ELF format"));
11537 return 0;
11538 }
11539 mips_pic = NO_PIC;
143d77c5 11540 mips_abicalls = FALSE;
252b5132
RH
11541 break;
11542
44075ae2
TS
11543 /* The -xgot option tells the assembler to use 32 bit offsets
11544 when accessing the got in SVR4_PIC mode. It is for Irix
252b5132
RH
11545 compatibility. */
11546 case OPTION_XGOT:
11547 mips_big_got = 1;
11548 break;
0f074f60 11549#endif /* OBJ_ELF */
252b5132
RH
11550
11551 case 'G':
6caf9ef4
TS
11552 g_switch_value = atoi (arg);
11553 g_switch_seen = 1;
252b5132
RH
11554 break;
11555
0f074f60 11556#ifdef OBJ_ELF
34ba82a8
TS
11557 /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
11558 and -mabi=64. */
252b5132 11559 case OPTION_32:
f43abd2b 11560 if (!IS_ELF)
34ba82a8
TS
11561 {
11562 as_bad (_("-32 is supported for ELF format only"));
11563 return 0;
11564 }
316f5878 11565 mips_abi = O32_ABI;
252b5132
RH
11566 break;
11567
e013f690 11568 case OPTION_N32:
f43abd2b 11569 if (!IS_ELF)
34ba82a8
TS
11570 {
11571 as_bad (_("-n32 is supported for ELF format only"));
11572 return 0;
11573 }
316f5878 11574 mips_abi = N32_ABI;
e013f690 11575 break;
252b5132 11576
e013f690 11577 case OPTION_64:
f43abd2b 11578 if (!IS_ELF)
34ba82a8
TS
11579 {
11580 as_bad (_("-64 is supported for ELF format only"));
11581 return 0;
11582 }
316f5878 11583 mips_abi = N64_ABI;
f43abd2b 11584 if (!support_64bit_objects())
e013f690 11585 as_fatal (_("No compiled in support for 64 bit object file format"));
252b5132 11586 break;
ae948b86 11587#endif /* OBJ_ELF */
252b5132 11588
c97ef257 11589 case OPTION_GP32:
a325df1d 11590 file_mips_gp32 = 1;
c97ef257
AH
11591 break;
11592
11593 case OPTION_GP64:
a325df1d 11594 file_mips_gp32 = 0;
c97ef257 11595 break;
252b5132 11596
ca4e0257 11597 case OPTION_FP32:
a325df1d 11598 file_mips_fp32 = 1;
316f5878
RS
11599 break;
11600
11601 case OPTION_FP64:
11602 file_mips_fp32 = 0;
ca4e0257
RS
11603 break;
11604
037b32b9
AN
11605 case OPTION_SINGLE_FLOAT:
11606 file_mips_single_float = 1;
11607 break;
11608
11609 case OPTION_DOUBLE_FLOAT:
11610 file_mips_single_float = 0;
11611 break;
11612
11613 case OPTION_SOFT_FLOAT:
11614 file_mips_soft_float = 1;
11615 break;
11616
11617 case OPTION_HARD_FLOAT:
11618 file_mips_soft_float = 0;
11619 break;
11620
ae948b86 11621#ifdef OBJ_ELF
252b5132 11622 case OPTION_MABI:
f43abd2b 11623 if (!IS_ELF)
34ba82a8
TS
11624 {
11625 as_bad (_("-mabi is supported for ELF format only"));
11626 return 0;
11627 }
e013f690 11628 if (strcmp (arg, "32") == 0)
316f5878 11629 mips_abi = O32_ABI;
e013f690 11630 else if (strcmp (arg, "o64") == 0)
316f5878 11631 mips_abi = O64_ABI;
e013f690 11632 else if (strcmp (arg, "n32") == 0)
316f5878 11633 mips_abi = N32_ABI;
e013f690
TS
11634 else if (strcmp (arg, "64") == 0)
11635 {
316f5878 11636 mips_abi = N64_ABI;
e013f690
TS
11637 if (! support_64bit_objects())
11638 as_fatal (_("No compiled in support for 64 bit object file "
11639 "format"));
11640 }
11641 else if (strcmp (arg, "eabi") == 0)
316f5878 11642 mips_abi = EABI_ABI;
e013f690 11643 else
da0e507f
TS
11644 {
11645 as_fatal (_("invalid abi -mabi=%s"), arg);
11646 return 0;
11647 }
252b5132 11648 break;
e013f690 11649#endif /* OBJ_ELF */
252b5132 11650
6b76fefe 11651 case OPTION_M7000_HILO_FIX:
b34976b6 11652 mips_7000_hilo_fix = TRUE;
6b76fefe
CM
11653 break;
11654
9ee72ff1 11655 case OPTION_MNO_7000_HILO_FIX:
b34976b6 11656 mips_7000_hilo_fix = FALSE;
6b76fefe
CM
11657 break;
11658
ecb4347a
DJ
11659#ifdef OBJ_ELF
11660 case OPTION_MDEBUG:
b34976b6 11661 mips_flag_mdebug = TRUE;
ecb4347a
DJ
11662 break;
11663
11664 case OPTION_NO_MDEBUG:
b34976b6 11665 mips_flag_mdebug = FALSE;
ecb4347a 11666 break;
dcd410fe
RO
11667
11668 case OPTION_PDR:
11669 mips_flag_pdr = TRUE;
11670 break;
11671
11672 case OPTION_NO_PDR:
11673 mips_flag_pdr = FALSE;
11674 break;
0a44bf69
RS
11675
11676 case OPTION_MVXWORKS_PIC:
11677 mips_pic = VXWORKS_PIC;
11678 break;
ecb4347a
DJ
11679#endif /* OBJ_ELF */
11680
252b5132
RH
11681 default:
11682 return 0;
11683 }
11684
11685 return 1;
11686}
316f5878
RS
11687\f
11688/* Set up globals to generate code for the ISA or processor
11689 described by INFO. */
252b5132 11690
252b5132 11691static void
17a2f251 11692mips_set_architecture (const struct mips_cpu_info *info)
252b5132 11693{
316f5878 11694 if (info != 0)
252b5132 11695 {
fef14a42
TS
11696 file_mips_arch = info->cpu;
11697 mips_opts.arch = info->cpu;
316f5878 11698 mips_opts.isa = info->isa;
252b5132 11699 }
252b5132
RH
11700}
11701
252b5132 11702
316f5878 11703/* Likewise for tuning. */
252b5132 11704
316f5878 11705static void
17a2f251 11706mips_set_tune (const struct mips_cpu_info *info)
316f5878
RS
11707{
11708 if (info != 0)
fef14a42 11709 mips_tune = info->cpu;
316f5878 11710}
80cc45a5 11711
34ba82a8 11712
252b5132 11713void
17a2f251 11714mips_after_parse_args (void)
e9670677 11715{
fef14a42
TS
11716 const struct mips_cpu_info *arch_info = 0;
11717 const struct mips_cpu_info *tune_info = 0;
11718
e9670677 11719 /* GP relative stuff not working for PE */
6caf9ef4 11720 if (strncmp (TARGET_OS, "pe", 2) == 0)
e9670677 11721 {
6caf9ef4 11722 if (g_switch_seen && g_switch_value != 0)
e9670677
MR
11723 as_bad (_("-G not supported in this configuration."));
11724 g_switch_value = 0;
11725 }
11726
cac012d6
AO
11727 if (mips_abi == NO_ABI)
11728 mips_abi = MIPS_DEFAULT_ABI;
11729
22923709
RS
11730 /* The following code determines the architecture and register size.
11731 Similar code was added to GCC 3.3 (see override_options() in
11732 config/mips/mips.c). The GAS and GCC code should be kept in sync
11733 as much as possible. */
e9670677 11734
316f5878 11735 if (mips_arch_string != 0)
fef14a42 11736 arch_info = mips_parse_cpu ("-march", mips_arch_string);
e9670677 11737
316f5878 11738 if (file_mips_isa != ISA_UNKNOWN)
e9670677 11739 {
316f5878 11740 /* Handle -mipsN. At this point, file_mips_isa contains the
fef14a42 11741 ISA level specified by -mipsN, while arch_info->isa contains
316f5878 11742 the -march selection (if any). */
fef14a42 11743 if (arch_info != 0)
e9670677 11744 {
316f5878
RS
11745 /* -march takes precedence over -mipsN, since it is more descriptive.
11746 There's no harm in specifying both as long as the ISA levels
11747 are the same. */
fef14a42 11748 if (file_mips_isa != arch_info->isa)
316f5878
RS
11749 as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
11750 mips_cpu_info_from_isa (file_mips_isa)->name,
fef14a42 11751 mips_cpu_info_from_isa (arch_info->isa)->name);
e9670677 11752 }
316f5878 11753 else
fef14a42 11754 arch_info = mips_cpu_info_from_isa (file_mips_isa);
e9670677
MR
11755 }
11756
fef14a42
TS
11757 if (arch_info == 0)
11758 arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
e9670677 11759
fef14a42 11760 if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
316f5878 11761 as_bad ("-march=%s is not compatible with the selected ABI",
fef14a42
TS
11762 arch_info->name);
11763
11764 mips_set_architecture (arch_info);
11765
11766 /* Optimize for file_mips_arch, unless -mtune selects a different processor. */
11767 if (mips_tune_string != 0)
11768 tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
e9670677 11769
fef14a42
TS
11770 if (tune_info == 0)
11771 mips_set_tune (arch_info);
11772 else
11773 mips_set_tune (tune_info);
e9670677 11774
316f5878 11775 if (file_mips_gp32 >= 0)
e9670677 11776 {
316f5878
RS
11777 /* The user specified the size of the integer registers. Make sure
11778 it agrees with the ABI and ISA. */
11779 if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
11780 as_bad (_("-mgp64 used with a 32-bit processor"));
11781 else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
11782 as_bad (_("-mgp32 used with a 64-bit ABI"));
11783 else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
11784 as_bad (_("-mgp64 used with a 32-bit ABI"));
e9670677
MR
11785 }
11786 else
11787 {
316f5878
RS
11788 /* Infer the integer register size from the ABI and processor.
11789 Restrict ourselves to 32-bit registers if that's all the
11790 processor has, or if the ABI cannot handle 64-bit registers. */
11791 file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
11792 || !ISA_HAS_64BIT_REGS (mips_opts.isa));
e9670677
MR
11793 }
11794
ad3fea08
TS
11795 switch (file_mips_fp32)
11796 {
11797 default:
11798 case -1:
11799 /* No user specified float register size.
11800 ??? GAS treats single-float processors as though they had 64-bit
11801 float registers (although it complains when double-precision
11802 instructions are used). As things stand, saying they have 32-bit
11803 registers would lead to spurious "register must be even" messages.
11804 So here we assume float registers are never smaller than the
11805 integer ones. */
11806 if (file_mips_gp32 == 0)
11807 /* 64-bit integer registers implies 64-bit float registers. */
11808 file_mips_fp32 = 0;
11809 else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
11810 && ISA_HAS_64BIT_FPRS (mips_opts.isa))
11811 /* -mips3d and -mdmx imply 64-bit float registers, if possible. */
11812 file_mips_fp32 = 0;
11813 else
11814 /* 32-bit float registers. */
11815 file_mips_fp32 = 1;
11816 break;
11817
11818 /* The user specified the size of the float registers. Check if it
11819 agrees with the ABI and ISA. */
11820 case 0:
11821 if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
11822 as_bad (_("-mfp64 used with a 32-bit fpu"));
11823 else if (ABI_NEEDS_32BIT_REGS (mips_abi)
11824 && !ISA_HAS_MXHC1 (mips_opts.isa))
11825 as_warn (_("-mfp64 used with a 32-bit ABI"));
11826 break;
11827 case 1:
11828 if (ABI_NEEDS_64BIT_REGS (mips_abi))
11829 as_warn (_("-mfp32 used with a 64-bit ABI"));
11830 break;
11831 }
e9670677 11832
316f5878 11833 /* End of GCC-shared inference code. */
e9670677 11834
17a2f251
TS
11835 /* This flag is set when we have a 64-bit capable CPU but use only
11836 32-bit wide registers. Note that EABI does not use it. */
11837 if (ISA_HAS_64BIT_REGS (mips_opts.isa)
11838 && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
11839 || mips_abi == O32_ABI))
316f5878 11840 mips_32bitmode = 1;
e9670677
MR
11841
11842 if (mips_opts.isa == ISA_MIPS1 && mips_trap)
11843 as_bad (_("trap exception not supported at ISA 1"));
11844
e9670677
MR
11845 /* If the selected architecture includes support for ASEs, enable
11846 generation of code for them. */
a4672219 11847 if (mips_opts.mips16 == -1)
fef14a42 11848 mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
ffdefa66 11849 if (mips_opts.ase_mips3d == -1)
65263ce3 11850 mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
ad3fea08
TS
11851 && file_mips_fp32 == 0) ? 1 : 0;
11852 if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
11853 as_bad (_("-mfp32 used with -mips3d"));
11854
ffdefa66 11855 if (mips_opts.ase_mdmx == -1)
65263ce3 11856 mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
ad3fea08
TS
11857 && file_mips_fp32 == 0) ? 1 : 0;
11858 if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
11859 as_bad (_("-mfp32 used with -mdmx"));
11860
11861 if (mips_opts.ase_smartmips == -1)
11862 mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
11863 if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
11864 as_warn ("%s ISA does not support SmartMIPS",
11865 mips_cpu_info_from_isa (mips_opts.isa)->name);
11866
74cd071d 11867 if (mips_opts.ase_dsp == -1)
ad3fea08
TS
11868 mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
11869 if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
11870 as_warn ("%s ISA does not support DSP ASE",
11871 mips_cpu_info_from_isa (mips_opts.isa)->name);
11872
8b082fb1
TS
11873 if (mips_opts.ase_dspr2 == -1)
11874 {
11875 mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
11876 mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
11877 }
11878 if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
11879 as_warn ("%s ISA does not support DSP R2 ASE",
11880 mips_cpu_info_from_isa (mips_opts.isa)->name);
11881
ef2e4d86 11882 if (mips_opts.ase_mt == -1)
ad3fea08
TS
11883 mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
11884 if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
8b082fb1 11885 as_warn ("%s ISA does not support MT ASE",
ad3fea08 11886 mips_cpu_info_from_isa (mips_opts.isa)->name);
e9670677 11887
e9670677 11888 file_mips_isa = mips_opts.isa;
a4672219 11889 file_ase_mips16 = mips_opts.mips16;
e9670677
MR
11890 file_ase_mips3d = mips_opts.ase_mips3d;
11891 file_ase_mdmx = mips_opts.ase_mdmx;
e16bfa71 11892 file_ase_smartmips = mips_opts.ase_smartmips;
74cd071d 11893 file_ase_dsp = mips_opts.ase_dsp;
8b082fb1 11894 file_ase_dspr2 = mips_opts.ase_dspr2;
ef2e4d86 11895 file_ase_mt = mips_opts.ase_mt;
e9670677
MR
11896 mips_opts.gp32 = file_mips_gp32;
11897 mips_opts.fp32 = file_mips_fp32;
037b32b9
AN
11898 mips_opts.soft_float = file_mips_soft_float;
11899 mips_opts.single_float = file_mips_single_float;
e9670677 11900
ecb4347a
DJ
11901 if (mips_flag_mdebug < 0)
11902 {
11903#ifdef OBJ_MAYBE_ECOFF
11904 if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
11905 mips_flag_mdebug = 1;
11906 else
11907#endif /* OBJ_MAYBE_ECOFF */
11908 mips_flag_mdebug = 0;
11909 }
e9670677
MR
11910}
11911\f
11912void
17a2f251 11913mips_init_after_args (void)
252b5132
RH
11914{
11915 /* initialize opcodes */
11916 bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
beae10d5 11917 mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
252b5132
RH
11918}
11919
11920long
17a2f251 11921md_pcrel_from (fixS *fixP)
252b5132 11922{
a7ebbfdf
TS
11923 valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
11924 switch (fixP->fx_r_type)
11925 {
11926 case BFD_RELOC_16_PCREL_S2:
11927 case BFD_RELOC_MIPS_JMP:
11928 /* Return the address of the delay slot. */
11929 return addr + 4;
11930 default:
58ea3d6a 11931 /* We have no relocation type for PC relative MIPS16 instructions. */
64817874
TS
11932 if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
11933 as_bad_where (fixP->fx_file, fixP->fx_line,
11934 _("PC relative MIPS16 instruction references a different section"));
a7ebbfdf
TS
11935 return addr;
11936 }
252b5132
RH
11937}
11938
252b5132
RH
11939/* This is called before the symbol table is processed. In order to
11940 work with gcc when using mips-tfile, we must keep all local labels.
11941 However, in other cases, we want to discard them. If we were
11942 called with -g, but we didn't see any debugging information, it may
11943 mean that gcc is smuggling debugging information through to
11944 mips-tfile, in which case we must generate all local labels. */
11945
11946void
17a2f251 11947mips_frob_file_before_adjust (void)
252b5132
RH
11948{
11949#ifndef NO_ECOFF_DEBUGGING
11950 if (ECOFF_DEBUGGING
11951 && mips_debug != 0
11952 && ! ecoff_debugging_seen)
11953 flag_keep_locals = 1;
11954#endif
11955}
11956
3b91255e 11957/* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
55cf6793 11958 the corresponding LO16 reloc. This is called before md_apply_fix and
3b91255e
RS
11959 tc_gen_reloc. Unmatched relocs can only be generated by use of explicit
11960 relocation operators.
11961
11962 For our purposes, a %lo() expression matches a %got() or %hi()
11963 expression if:
11964
11965 (a) it refers to the same symbol; and
11966 (b) the offset applied in the %lo() expression is no lower than
11967 the offset applied in the %got() or %hi().
11968
11969 (b) allows us to cope with code like:
11970
11971 lui $4,%hi(foo)
11972 lh $4,%lo(foo+2)($4)
11973
11974 ...which is legal on RELA targets, and has a well-defined behaviour
11975 if the user knows that adding 2 to "foo" will not induce a carry to
11976 the high 16 bits.
11977
11978 When several %lo()s match a particular %got() or %hi(), we use the
11979 following rules to distinguish them:
11980
11981 (1) %lo()s with smaller offsets are a better match than %lo()s with
11982 higher offsets.
11983
11984 (2) %lo()s with no matching %got() or %hi() are better than those
11985 that already have a matching %got() or %hi().
11986
11987 (3) later %lo()s are better than earlier %lo()s.
11988
11989 These rules are applied in order.
11990
11991 (1) means, among other things, that %lo()s with identical offsets are
11992 chosen if they exist.
11993
11994 (2) means that we won't associate several high-part relocations with
11995 the same low-part relocation unless there's no alternative. Having
11996 several high parts for the same low part is a GNU extension; this rule
11997 allows careful users to avoid it.
11998
11999 (3) is purely cosmetic. mips_hi_fixup_list is is in reverse order,
12000 with the last high-part relocation being at the front of the list.
12001 It therefore makes sense to choose the last matching low-part
12002 relocation, all other things being equal. It's also easier
12003 to code that way. */
252b5132
RH
12004
12005void
17a2f251 12006mips_frob_file (void)
252b5132
RH
12007{
12008 struct mips_hi_fixup *l;
35903be0 12009 bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
252b5132
RH
12010
12011 for (l = mips_hi_fixup_list; l != NULL; l = l->next)
12012 {
12013 segment_info_type *seginfo;
3b91255e
RS
12014 bfd_boolean matched_lo_p;
12015 fixS **hi_pos, **lo_pos, **pos;
252b5132 12016
5919d012 12017 assert (reloc_needs_lo_p (l->fixp->fx_r_type));
252b5132 12018
5919d012
RS
12019 /* If a GOT16 relocation turns out to be against a global symbol,
12020 there isn't supposed to be a matching LO. */
738e5348 12021 if (got16_reloc_p (l->fixp->fx_r_type)
5919d012
RS
12022 && !pic_need_relax (l->fixp->fx_addsy, l->seg))
12023 continue;
12024
12025 /* Check quickly whether the next fixup happens to be a matching %lo. */
12026 if (fixup_has_matching_lo_p (l->fixp))
252b5132
RH
12027 continue;
12028
252b5132 12029 seginfo = seg_info (l->seg);
252b5132 12030
3b91255e
RS
12031 /* Set HI_POS to the position of this relocation in the chain.
12032 Set LO_POS to the position of the chosen low-part relocation.
12033 MATCHED_LO_P is true on entry to the loop if *POS is a low-part
12034 relocation that matches an immediately-preceding high-part
12035 relocation. */
12036 hi_pos = NULL;
12037 lo_pos = NULL;
12038 matched_lo_p = FALSE;
738e5348 12039 looking_for_rtype = matching_lo_reloc (l->fixp->fx_r_type);
35903be0 12040
3b91255e
RS
12041 for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
12042 {
12043 if (*pos == l->fixp)
12044 hi_pos = pos;
12045
35903be0 12046 if ((*pos)->fx_r_type == looking_for_rtype
3b91255e
RS
12047 && (*pos)->fx_addsy == l->fixp->fx_addsy
12048 && (*pos)->fx_offset >= l->fixp->fx_offset
12049 && (lo_pos == NULL
12050 || (*pos)->fx_offset < (*lo_pos)->fx_offset
12051 || (!matched_lo_p
12052 && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
12053 lo_pos = pos;
12054
12055 matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
12056 && fixup_has_matching_lo_p (*pos));
12057 }
12058
12059 /* If we found a match, remove the high-part relocation from its
12060 current position and insert it before the low-part relocation.
12061 Make the offsets match so that fixup_has_matching_lo_p()
12062 will return true.
12063
12064 We don't warn about unmatched high-part relocations since some
12065 versions of gcc have been known to emit dead "lui ...%hi(...)"
12066 instructions. */
12067 if (lo_pos != NULL)
12068 {
12069 l->fixp->fx_offset = (*lo_pos)->fx_offset;
12070 if (l->fixp->fx_next != *lo_pos)
252b5132 12071 {
3b91255e
RS
12072 *hi_pos = l->fixp->fx_next;
12073 l->fixp->fx_next = *lo_pos;
12074 *lo_pos = l->fixp;
252b5132 12075 }
252b5132
RH
12076 }
12077 }
12078}
12079
3e722fb5 12080/* We may have combined relocations without symbols in the N32/N64 ABI.
f6688943 12081 We have to prevent gas from dropping them. */
252b5132 12082
252b5132 12083int
17a2f251 12084mips_force_relocation (fixS *fixp)
252b5132 12085{
ae6063d4 12086 if (generic_force_reloc (fixp))
252b5132
RH
12087 return 1;
12088
f6688943
TS
12089 if (HAVE_NEWABI
12090 && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
12091 && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
738e5348
RS
12092 || hi16_reloc_p (fixp->fx_r_type)
12093 || lo16_reloc_p (fixp->fx_r_type)))
f6688943
TS
12094 return 1;
12095
3e722fb5 12096 return 0;
252b5132
RH
12097}
12098
12099/* Apply a fixup to the object file. */
12100
94f592af 12101void
55cf6793 12102md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
252b5132 12103{
874e8986 12104 bfd_byte *buf;
98aa84af 12105 long insn;
a7ebbfdf 12106 reloc_howto_type *howto;
252b5132 12107
a7ebbfdf
TS
12108 /* We ignore generic BFD relocations we don't know about. */
12109 howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
12110 if (! howto)
12111 return;
65551fa4 12112
252b5132
RH
12113 assert (fixP->fx_size == 4
12114 || fixP->fx_r_type == BFD_RELOC_16
12115 || fixP->fx_r_type == BFD_RELOC_64
f6688943
TS
12116 || fixP->fx_r_type == BFD_RELOC_CTOR
12117 || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
252b5132 12118 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
741d6ea8
JM
12119 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
12120 || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
252b5132 12121
a7ebbfdf 12122 buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
252b5132 12123
3994f87e 12124 assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2);
b1dca8ee
RS
12125
12126 /* Don't treat parts of a composite relocation as done. There are two
12127 reasons for this:
12128
12129 (1) The second and third parts will be against 0 (RSS_UNDEF) but
12130 should nevertheless be emitted if the first part is.
12131
12132 (2) In normal usage, composite relocations are never assembly-time
12133 constants. The easiest way of dealing with the pathological
12134 exceptions is to generate a relocation against STN_UNDEF and
12135 leave everything up to the linker. */
3994f87e 12136 if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
252b5132
RH
12137 fixP->fx_done = 1;
12138
12139 switch (fixP->fx_r_type)
12140 {
3f98094e
DJ
12141 case BFD_RELOC_MIPS_TLS_GD:
12142 case BFD_RELOC_MIPS_TLS_LDM:
741d6ea8
JM
12143 case BFD_RELOC_MIPS_TLS_DTPREL32:
12144 case BFD_RELOC_MIPS_TLS_DTPREL64:
3f98094e
DJ
12145 case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
12146 case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
12147 case BFD_RELOC_MIPS_TLS_GOTTPREL:
12148 case BFD_RELOC_MIPS_TLS_TPREL_HI16:
12149 case BFD_RELOC_MIPS_TLS_TPREL_LO16:
12150 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12151 /* fall through */
12152
252b5132 12153 case BFD_RELOC_MIPS_JMP:
e369bcce
TS
12154 case BFD_RELOC_MIPS_SHIFT5:
12155 case BFD_RELOC_MIPS_SHIFT6:
12156 case BFD_RELOC_MIPS_GOT_DISP:
12157 case BFD_RELOC_MIPS_GOT_PAGE:
12158 case BFD_RELOC_MIPS_GOT_OFST:
12159 case BFD_RELOC_MIPS_SUB:
12160 case BFD_RELOC_MIPS_INSERT_A:
12161 case BFD_RELOC_MIPS_INSERT_B:
12162 case BFD_RELOC_MIPS_DELETE:
12163 case BFD_RELOC_MIPS_HIGHEST:
12164 case BFD_RELOC_MIPS_HIGHER:
12165 case BFD_RELOC_MIPS_SCN_DISP:
12166 case BFD_RELOC_MIPS_REL16:
12167 case BFD_RELOC_MIPS_RELGOT:
12168 case BFD_RELOC_MIPS_JALR:
252b5132
RH
12169 case BFD_RELOC_HI16:
12170 case BFD_RELOC_HI16_S:
cdf6fd85 12171 case BFD_RELOC_GPREL16:
252b5132
RH
12172 case BFD_RELOC_MIPS_LITERAL:
12173 case BFD_RELOC_MIPS_CALL16:
12174 case BFD_RELOC_MIPS_GOT16:
cdf6fd85 12175 case BFD_RELOC_GPREL32:
252b5132
RH
12176 case BFD_RELOC_MIPS_GOT_HI16:
12177 case BFD_RELOC_MIPS_GOT_LO16:
12178 case BFD_RELOC_MIPS_CALL_HI16:
12179 case BFD_RELOC_MIPS_CALL_LO16:
12180 case BFD_RELOC_MIPS16_GPREL:
738e5348
RS
12181 case BFD_RELOC_MIPS16_GOT16:
12182 case BFD_RELOC_MIPS16_CALL16:
d6f16593
MR
12183 case BFD_RELOC_MIPS16_HI16:
12184 case BFD_RELOC_MIPS16_HI16_S:
252b5132 12185 case BFD_RELOC_MIPS16_JMP:
54f4ddb3 12186 /* Nothing needed to do. The value comes from the reloc entry. */
252b5132
RH
12187 break;
12188
252b5132
RH
12189 case BFD_RELOC_64:
12190 /* This is handled like BFD_RELOC_32, but we output a sign
12191 extended value if we are only 32 bits. */
3e722fb5 12192 if (fixP->fx_done)
252b5132
RH
12193 {
12194 if (8 <= sizeof (valueT))
2132e3a3 12195 md_number_to_chars ((char *) buf, *valP, 8);
252b5132
RH
12196 else
12197 {
a7ebbfdf 12198 valueT hiv;
252b5132 12199
a7ebbfdf 12200 if ((*valP & 0x80000000) != 0)
252b5132
RH
12201 hiv = 0xffffffff;
12202 else
12203 hiv = 0;
b215186b 12204 md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
a7ebbfdf 12205 *valP, 4);
b215186b 12206 md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
a7ebbfdf 12207 hiv, 4);
252b5132
RH
12208 }
12209 }
12210 break;
12211
056350c6 12212 case BFD_RELOC_RVA:
252b5132 12213 case BFD_RELOC_32:
252b5132
RH
12214 case BFD_RELOC_16:
12215 /* If we are deleting this reloc entry, we must fill in the
54f4ddb3
TS
12216 value now. This can happen if we have a .word which is not
12217 resolved when it appears but is later defined. */
252b5132 12218 if (fixP->fx_done)
54f4ddb3 12219 md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
252b5132
RH
12220 break;
12221
12222 case BFD_RELOC_LO16:
d6f16593 12223 case BFD_RELOC_MIPS16_LO16:
3e722fb5
CD
12224 /* FIXME: Now that embedded-PIC is gone, some of this code/comment
12225 may be safe to remove, but if so it's not obvious. */
252b5132
RH
12226 /* When handling an embedded PIC switch statement, we can wind
12227 up deleting a LO16 reloc. See the 'o' case in mips_ip. */
12228 if (fixP->fx_done)
12229 {
a7ebbfdf 12230 if (*valP + 0x8000 > 0xffff)
252b5132
RH
12231 as_bad_where (fixP->fx_file, fixP->fx_line,
12232 _("relocation overflow"));
252b5132
RH
12233 if (target_big_endian)
12234 buf += 2;
2132e3a3 12235 md_number_to_chars ((char *) buf, *valP, 2);
252b5132
RH
12236 }
12237 break;
12238
12239 case BFD_RELOC_16_PCREL_S2:
a7ebbfdf 12240 if ((*valP & 0x3) != 0)
cb56d3d3 12241 as_bad_where (fixP->fx_file, fixP->fx_line,
bad36eac 12242 _("Branch to misaligned address (%lx)"), (long) *valP);
cb56d3d3 12243
54f4ddb3
TS
12244 /* We need to save the bits in the instruction since fixup_segment()
12245 might be deleting the relocation entry (i.e., a branch within
12246 the current segment). */
a7ebbfdf 12247 if (! fixP->fx_done)
bb2d6cd7 12248 break;
252b5132 12249
54f4ddb3 12250 /* Update old instruction data. */
252b5132
RH
12251 if (target_big_endian)
12252 insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
12253 else
12254 insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
12255
a7ebbfdf
TS
12256 if (*valP + 0x20000 <= 0x3ffff)
12257 {
12258 insn |= (*valP >> 2) & 0xffff;
2132e3a3 12259 md_number_to_chars ((char *) buf, insn, 4);
a7ebbfdf
TS
12260 }
12261 else if (mips_pic == NO_PIC
12262 && fixP->fx_done
12263 && fixP->fx_frag->fr_address >= text_section->vma
12264 && (fixP->fx_frag->fr_address
587aac4e 12265 < text_section->vma + bfd_get_section_size (text_section))
a7ebbfdf
TS
12266 && ((insn & 0xffff0000) == 0x10000000 /* beq $0,$0 */
12267 || (insn & 0xffff0000) == 0x04010000 /* bgez $0 */
12268 || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
252b5132
RH
12269 {
12270 /* The branch offset is too large. If this is an
12271 unconditional branch, and we are not generating PIC code,
12272 we can convert it to an absolute jump instruction. */
a7ebbfdf
TS
12273 if ((insn & 0xffff0000) == 0x04110000) /* bgezal $0 */
12274 insn = 0x0c000000; /* jal */
252b5132 12275 else
a7ebbfdf
TS
12276 insn = 0x08000000; /* j */
12277 fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
12278 fixP->fx_done = 0;
12279 fixP->fx_addsy = section_symbol (text_section);
12280 *valP += md_pcrel_from (fixP);
2132e3a3 12281 md_number_to_chars ((char *) buf, insn, 4);
a7ebbfdf
TS
12282 }
12283 else
12284 {
12285 /* If we got here, we have branch-relaxation disabled,
12286 and there's nothing we can do to fix this instruction
12287 without turning it into a longer sequence. */
12288 as_bad_where (fixP->fx_file, fixP->fx_line,
12289 _("Branch out of range"));
252b5132 12290 }
252b5132
RH
12291 break;
12292
12293 case BFD_RELOC_VTABLE_INHERIT:
12294 fixP->fx_done = 0;
12295 if (fixP->fx_addsy
12296 && !S_IS_DEFINED (fixP->fx_addsy)
12297 && !S_IS_WEAK (fixP->fx_addsy))
12298 S_SET_WEAK (fixP->fx_addsy);
12299 break;
12300
12301 case BFD_RELOC_VTABLE_ENTRY:
12302 fixP->fx_done = 0;
12303 break;
12304
12305 default:
12306 internalError ();
12307 }
a7ebbfdf
TS
12308
12309 /* Remember value for tc_gen_reloc. */
12310 fixP->fx_addnumber = *valP;
252b5132
RH
12311}
12312
252b5132 12313static symbolS *
17a2f251 12314get_symbol (void)
252b5132
RH
12315{
12316 int c;
12317 char *name;
12318 symbolS *p;
12319
12320 name = input_line_pointer;
12321 c = get_symbol_end ();
12322 p = (symbolS *) symbol_find_or_make (name);
12323 *input_line_pointer = c;
12324 return p;
12325}
12326
742a56fe
RS
12327/* Align the current frag to a given power of two. If a particular
12328 fill byte should be used, FILL points to an integer that contains
12329 that byte, otherwise FILL is null.
12330
12331 The MIPS assembler also automatically adjusts any preceding
12332 label. */
252b5132
RH
12333
12334static void
742a56fe 12335mips_align (int to, int *fill, symbolS *label)
252b5132 12336{
7d10b47d 12337 mips_emit_delays ();
742a56fe
RS
12338 mips_record_mips16_mode ();
12339 if (fill == NULL && subseg_text_p (now_seg))
12340 frag_align_code (to, 0);
12341 else
12342 frag_align (to, fill ? *fill : 0, 0);
252b5132
RH
12343 record_alignment (now_seg, to);
12344 if (label != NULL)
12345 {
12346 assert (S_GET_SEGMENT (label) == now_seg);
49309057 12347 symbol_set_frag (label, frag_now);
252b5132
RH
12348 S_SET_VALUE (label, (valueT) frag_now_fix ());
12349 }
12350}
12351
12352/* Align to a given power of two. .align 0 turns off the automatic
12353 alignment used by the data creating pseudo-ops. */
12354
12355static void
17a2f251 12356s_align (int x ATTRIBUTE_UNUSED)
252b5132 12357{
742a56fe 12358 int temp, fill_value, *fill_ptr;
49954fb4 12359 long max_alignment = 28;
252b5132 12360
54f4ddb3 12361 /* o Note that the assembler pulls down any immediately preceding label
252b5132 12362 to the aligned address.
54f4ddb3 12363 o It's not documented but auto alignment is reinstated by
252b5132 12364 a .align pseudo instruction.
54f4ddb3 12365 o Note also that after auto alignment is turned off the mips assembler
252b5132 12366 issues an error on attempt to assemble an improperly aligned data item.
54f4ddb3 12367 We don't. */
252b5132
RH
12368
12369 temp = get_absolute_expression ();
12370 if (temp > max_alignment)
12371 as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
12372 else if (temp < 0)
12373 {
12374 as_warn (_("Alignment negative: 0 assumed."));
12375 temp = 0;
12376 }
12377 if (*input_line_pointer == ',')
12378 {
f9419b05 12379 ++input_line_pointer;
742a56fe
RS
12380 fill_value = get_absolute_expression ();
12381 fill_ptr = &fill_value;
252b5132
RH
12382 }
12383 else
742a56fe 12384 fill_ptr = 0;
252b5132
RH
12385 if (temp)
12386 {
a8dbcb85
TS
12387 segment_info_type *si = seg_info (now_seg);
12388 struct insn_label_list *l = si->label_list;
54f4ddb3 12389 /* Auto alignment should be switched on by next section change. */
252b5132 12390 auto_align = 1;
742a56fe 12391 mips_align (temp, fill_ptr, l != NULL ? l->label : NULL);
252b5132
RH
12392 }
12393 else
12394 {
12395 auto_align = 0;
12396 }
12397
12398 demand_empty_rest_of_line ();
12399}
12400
252b5132 12401static void
17a2f251 12402s_change_sec (int sec)
252b5132
RH
12403{
12404 segT seg;
12405
252b5132
RH
12406#ifdef OBJ_ELF
12407 /* The ELF backend needs to know that we are changing sections, so
12408 that .previous works correctly. We could do something like check
b6ff326e 12409 for an obj_section_change_hook macro, but that might be confusing
252b5132
RH
12410 as it would not be appropriate to use it in the section changing
12411 functions in read.c, since obj-elf.c intercepts those. FIXME:
12412 This should be cleaner, somehow. */
f43abd2b
TS
12413 if (IS_ELF)
12414 obj_elf_section_change_hook ();
252b5132
RH
12415#endif
12416
7d10b47d 12417 mips_emit_delays ();
252b5132
RH
12418 switch (sec)
12419 {
12420 case 't':
12421 s_text (0);
12422 break;
12423 case 'd':
12424 s_data (0);
12425 break;
12426 case 'b':
12427 subseg_set (bss_section, (subsegT) get_absolute_expression ());
12428 demand_empty_rest_of_line ();
12429 break;
12430
12431 case 'r':
4d0d148d
TS
12432 seg = subseg_new (RDATA_SECTION_NAME,
12433 (subsegT) get_absolute_expression ());
f43abd2b 12434 if (IS_ELF)
252b5132 12435 {
4d0d148d
TS
12436 bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
12437 | SEC_READONLY | SEC_RELOC
12438 | SEC_DATA));
c41e87e3 12439 if (strncmp (TARGET_OS, "elf", 3) != 0)
4d0d148d 12440 record_alignment (seg, 4);
252b5132 12441 }
4d0d148d 12442 demand_empty_rest_of_line ();
252b5132
RH
12443 break;
12444
12445 case 's':
4d0d148d 12446 seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
f43abd2b 12447 if (IS_ELF)
252b5132 12448 {
4d0d148d
TS
12449 bfd_set_section_flags (stdoutput, seg,
12450 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
c41e87e3 12451 if (strncmp (TARGET_OS, "elf", 3) != 0)
4d0d148d 12452 record_alignment (seg, 4);
252b5132 12453 }
4d0d148d
TS
12454 demand_empty_rest_of_line ();
12455 break;
252b5132
RH
12456 }
12457
12458 auto_align = 1;
12459}
b34976b6 12460
cca86cc8 12461void
17a2f251 12462s_change_section (int ignore ATTRIBUTE_UNUSED)
cca86cc8 12463{
7ed4a06a 12464#ifdef OBJ_ELF
cca86cc8
SC
12465 char *section_name;
12466 char c;
684022ea 12467 char next_c = 0;
cca86cc8
SC
12468 int section_type;
12469 int section_flag;
12470 int section_entry_size;
12471 int section_alignment;
b34976b6 12472
f43abd2b 12473 if (!IS_ELF)
7ed4a06a
TS
12474 return;
12475
cca86cc8
SC
12476 section_name = input_line_pointer;
12477 c = get_symbol_end ();
a816d1ed
AO
12478 if (c)
12479 next_c = *(input_line_pointer + 1);
cca86cc8 12480
4cf0dd0d
TS
12481 /* Do we have .section Name<,"flags">? */
12482 if (c != ',' || (c == ',' && next_c == '"'))
cca86cc8 12483 {
4cf0dd0d
TS
12484 /* just after name is now '\0'. */
12485 *input_line_pointer = c;
cca86cc8
SC
12486 input_line_pointer = section_name;
12487 obj_elf_section (ignore);
12488 return;
12489 }
12490 input_line_pointer++;
12491
12492 /* Do we have .section Name<,type><,flag><,entry_size><,alignment> */
12493 if (c == ',')
12494 section_type = get_absolute_expression ();
12495 else
12496 section_type = 0;
12497 if (*input_line_pointer++ == ',')
12498 section_flag = get_absolute_expression ();
12499 else
12500 section_flag = 0;
12501 if (*input_line_pointer++ == ',')
12502 section_entry_size = get_absolute_expression ();
12503 else
12504 section_entry_size = 0;
12505 if (*input_line_pointer++ == ',')
12506 section_alignment = get_absolute_expression ();
12507 else
12508 section_alignment = 0;
12509
a816d1ed
AO
12510 section_name = xstrdup (section_name);
12511
8ab8a5c8
RS
12512 /* When using the generic form of .section (as implemented by obj-elf.c),
12513 there's no way to set the section type to SHT_MIPS_DWARF. Users have
12514 traditionally had to fall back on the more common @progbits instead.
12515
12516 There's nothing really harmful in this, since bfd will correct
12517 SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file. But it
708587a4 12518 means that, for backwards compatibility, the special_section entries
8ab8a5c8
RS
12519 for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
12520
12521 Even so, we shouldn't force users of the MIPS .section syntax to
12522 incorrectly label the sections as SHT_PROGBITS. The best compromise
12523 seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
12524 generic type-checking code. */
12525 if (section_type == SHT_MIPS_DWARF)
12526 section_type = SHT_PROGBITS;
12527
cca86cc8
SC
12528 obj_elf_change_section (section_name, section_type, section_flag,
12529 section_entry_size, 0, 0, 0);
a816d1ed
AO
12530
12531 if (now_seg->name != section_name)
12532 free (section_name);
7ed4a06a 12533#endif /* OBJ_ELF */
cca86cc8 12534}
252b5132
RH
12535
12536void
17a2f251 12537mips_enable_auto_align (void)
252b5132
RH
12538{
12539 auto_align = 1;
12540}
12541
12542static void
17a2f251 12543s_cons (int log_size)
252b5132 12544{
a8dbcb85
TS
12545 segment_info_type *si = seg_info (now_seg);
12546 struct insn_label_list *l = si->label_list;
252b5132
RH
12547 symbolS *label;
12548
a8dbcb85 12549 label = l != NULL ? l->label : NULL;
7d10b47d 12550 mips_emit_delays ();
252b5132
RH
12551 if (log_size > 0 && auto_align)
12552 mips_align (log_size, 0, label);
12553 mips_clear_insn_labels ();
12554 cons (1 << log_size);
12555}
12556
12557static void
17a2f251 12558s_float_cons (int type)
252b5132 12559{
a8dbcb85
TS
12560 segment_info_type *si = seg_info (now_seg);
12561 struct insn_label_list *l = si->label_list;
252b5132
RH
12562 symbolS *label;
12563
a8dbcb85 12564 label = l != NULL ? l->label : NULL;
252b5132 12565
7d10b47d 12566 mips_emit_delays ();
252b5132
RH
12567
12568 if (auto_align)
49309057
ILT
12569 {
12570 if (type == 'd')
12571 mips_align (3, 0, label);
12572 else
12573 mips_align (2, 0, label);
12574 }
252b5132
RH
12575
12576 mips_clear_insn_labels ();
12577
12578 float_cons (type);
12579}
12580
12581/* Handle .globl. We need to override it because on Irix 5 you are
12582 permitted to say
12583 .globl foo .text
12584 where foo is an undefined symbol, to mean that foo should be
12585 considered to be the address of a function. */
12586
12587static void
17a2f251 12588s_mips_globl (int x ATTRIBUTE_UNUSED)
252b5132
RH
12589{
12590 char *name;
12591 int c;
12592 symbolS *symbolP;
12593 flagword flag;
12594
8a06b769 12595 do
252b5132 12596 {
8a06b769 12597 name = input_line_pointer;
252b5132 12598 c = get_symbol_end ();
8a06b769
TS
12599 symbolP = symbol_find_or_make (name);
12600 S_SET_EXTERNAL (symbolP);
12601
252b5132 12602 *input_line_pointer = c;
8a06b769 12603 SKIP_WHITESPACE ();
252b5132 12604
8a06b769
TS
12605 /* On Irix 5, every global symbol that is not explicitly labelled as
12606 being a function is apparently labelled as being an object. */
12607 flag = BSF_OBJECT;
252b5132 12608
8a06b769
TS
12609 if (!is_end_of_line[(unsigned char) *input_line_pointer]
12610 && (*input_line_pointer != ','))
12611 {
12612 char *secname;
12613 asection *sec;
12614
12615 secname = input_line_pointer;
12616 c = get_symbol_end ();
12617 sec = bfd_get_section_by_name (stdoutput, secname);
12618 if (sec == NULL)
12619 as_bad (_("%s: no such section"), secname);
12620 *input_line_pointer = c;
12621
12622 if (sec != NULL && (sec->flags & SEC_CODE) != 0)
12623 flag = BSF_FUNCTION;
12624 }
12625
12626 symbol_get_bfdsym (symbolP)->flags |= flag;
12627
12628 c = *input_line_pointer;
12629 if (c == ',')
12630 {
12631 input_line_pointer++;
12632 SKIP_WHITESPACE ();
12633 if (is_end_of_line[(unsigned char) *input_line_pointer])
12634 c = '\n';
12635 }
12636 }
12637 while (c == ',');
252b5132 12638
252b5132
RH
12639 demand_empty_rest_of_line ();
12640}
12641
12642static void
17a2f251 12643s_option (int x ATTRIBUTE_UNUSED)
252b5132
RH
12644{
12645 char *opt;
12646 char c;
12647
12648 opt = input_line_pointer;
12649 c = get_symbol_end ();
12650
12651 if (*opt == 'O')
12652 {
12653 /* FIXME: What does this mean? */
12654 }
12655 else if (strncmp (opt, "pic", 3) == 0)
12656 {
12657 int i;
12658
12659 i = atoi (opt + 3);
12660 if (i == 0)
12661 mips_pic = NO_PIC;
12662 else if (i == 2)
143d77c5 12663 {
252b5132 12664 mips_pic = SVR4_PIC;
143d77c5
EC
12665 mips_abicalls = TRUE;
12666 }
252b5132
RH
12667 else
12668 as_bad (_(".option pic%d not supported"), i);
12669
4d0d148d 12670 if (mips_pic == SVR4_PIC)
252b5132
RH
12671 {
12672 if (g_switch_seen && g_switch_value != 0)
12673 as_warn (_("-G may not be used with SVR4 PIC code"));
12674 g_switch_value = 0;
12675 bfd_set_gp_size (stdoutput, 0);
12676 }
12677 }
12678 else
12679 as_warn (_("Unrecognized option \"%s\""), opt);
12680
12681 *input_line_pointer = c;
12682 demand_empty_rest_of_line ();
12683}
12684
12685/* This structure is used to hold a stack of .set values. */
12686
e972090a
NC
12687struct mips_option_stack
12688{
252b5132
RH
12689 struct mips_option_stack *next;
12690 struct mips_set_options options;
12691};
12692
12693static struct mips_option_stack *mips_opts_stack;
12694
12695/* Handle the .set pseudo-op. */
12696
12697static void
17a2f251 12698s_mipsset (int x ATTRIBUTE_UNUSED)
252b5132
RH
12699{
12700 char *name = input_line_pointer, ch;
12701
12702 while (!is_end_of_line[(unsigned char) *input_line_pointer])
f9419b05 12703 ++input_line_pointer;
252b5132
RH
12704 ch = *input_line_pointer;
12705 *input_line_pointer = '\0';
12706
12707 if (strcmp (name, "reorder") == 0)
12708 {
7d10b47d
RS
12709 if (mips_opts.noreorder)
12710 end_noreorder ();
252b5132
RH
12711 }
12712 else if (strcmp (name, "noreorder") == 0)
12713 {
7d10b47d
RS
12714 if (!mips_opts.noreorder)
12715 start_noreorder ();
252b5132 12716 }
741fe287
MR
12717 else if (strncmp (name, "at=", 3) == 0)
12718 {
12719 char *s = name + 3;
12720
12721 if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
12722 as_bad (_("Unrecognized register name `%s'"), s);
12723 }
252b5132
RH
12724 else if (strcmp (name, "at") == 0)
12725 {
741fe287 12726 mips_opts.at = ATREG;
252b5132
RH
12727 }
12728 else if (strcmp (name, "noat") == 0)
12729 {
741fe287 12730 mips_opts.at = ZERO;
252b5132
RH
12731 }
12732 else if (strcmp (name, "macro") == 0)
12733 {
12734 mips_opts.warn_about_macros = 0;
12735 }
12736 else if (strcmp (name, "nomacro") == 0)
12737 {
12738 if (mips_opts.noreorder == 0)
12739 as_bad (_("`noreorder' must be set before `nomacro'"));
12740 mips_opts.warn_about_macros = 1;
12741 }
12742 else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
12743 {
12744 mips_opts.nomove = 0;
12745 }
12746 else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
12747 {
12748 mips_opts.nomove = 1;
12749 }
12750 else if (strcmp (name, "bopt") == 0)
12751 {
12752 mips_opts.nobopt = 0;
12753 }
12754 else if (strcmp (name, "nobopt") == 0)
12755 {
12756 mips_opts.nobopt = 1;
12757 }
ad3fea08
TS
12758 else if (strcmp (name, "gp=default") == 0)
12759 mips_opts.gp32 = file_mips_gp32;
12760 else if (strcmp (name, "gp=32") == 0)
12761 mips_opts.gp32 = 1;
12762 else if (strcmp (name, "gp=64") == 0)
12763 {
12764 if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
12765 as_warn ("%s isa does not support 64-bit registers",
12766 mips_cpu_info_from_isa (mips_opts.isa)->name);
12767 mips_opts.gp32 = 0;
12768 }
12769 else if (strcmp (name, "fp=default") == 0)
12770 mips_opts.fp32 = file_mips_fp32;
12771 else if (strcmp (name, "fp=32") == 0)
12772 mips_opts.fp32 = 1;
12773 else if (strcmp (name, "fp=64") == 0)
12774 {
12775 if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
12776 as_warn ("%s isa does not support 64-bit floating point registers",
12777 mips_cpu_info_from_isa (mips_opts.isa)->name);
12778 mips_opts.fp32 = 0;
12779 }
037b32b9
AN
12780 else if (strcmp (name, "softfloat") == 0)
12781 mips_opts.soft_float = 1;
12782 else if (strcmp (name, "hardfloat") == 0)
12783 mips_opts.soft_float = 0;
12784 else if (strcmp (name, "singlefloat") == 0)
12785 mips_opts.single_float = 1;
12786 else if (strcmp (name, "doublefloat") == 0)
12787 mips_opts.single_float = 0;
252b5132
RH
12788 else if (strcmp (name, "mips16") == 0
12789 || strcmp (name, "MIPS-16") == 0)
12790 mips_opts.mips16 = 1;
12791 else if (strcmp (name, "nomips16") == 0
12792 || strcmp (name, "noMIPS-16") == 0)
12793 mips_opts.mips16 = 0;
e16bfa71
TS
12794 else if (strcmp (name, "smartmips") == 0)
12795 {
ad3fea08 12796 if (!ISA_SUPPORTS_SMARTMIPS)
e16bfa71
TS
12797 as_warn ("%s ISA does not support SmartMIPS ASE",
12798 mips_cpu_info_from_isa (mips_opts.isa)->name);
12799 mips_opts.ase_smartmips = 1;
12800 }
12801 else if (strcmp (name, "nosmartmips") == 0)
12802 mips_opts.ase_smartmips = 0;
1f25f5d3
CD
12803 else if (strcmp (name, "mips3d") == 0)
12804 mips_opts.ase_mips3d = 1;
12805 else if (strcmp (name, "nomips3d") == 0)
12806 mips_opts.ase_mips3d = 0;
a4672219
TS
12807 else if (strcmp (name, "mdmx") == 0)
12808 mips_opts.ase_mdmx = 1;
12809 else if (strcmp (name, "nomdmx") == 0)
12810 mips_opts.ase_mdmx = 0;
74cd071d 12811 else if (strcmp (name, "dsp") == 0)
ad3fea08
TS
12812 {
12813 if (!ISA_SUPPORTS_DSP_ASE)
12814 as_warn ("%s ISA does not support DSP ASE",
12815 mips_cpu_info_from_isa (mips_opts.isa)->name);
12816 mips_opts.ase_dsp = 1;
8b082fb1 12817 mips_opts.ase_dspr2 = 0;
ad3fea08 12818 }
74cd071d 12819 else if (strcmp (name, "nodsp") == 0)
8b082fb1
TS
12820 {
12821 mips_opts.ase_dsp = 0;
12822 mips_opts.ase_dspr2 = 0;
12823 }
12824 else if (strcmp (name, "dspr2") == 0)
12825 {
12826 if (!ISA_SUPPORTS_DSPR2_ASE)
12827 as_warn ("%s ISA does not support DSP R2 ASE",
12828 mips_cpu_info_from_isa (mips_opts.isa)->name);
12829 mips_opts.ase_dspr2 = 1;
12830 mips_opts.ase_dsp = 1;
12831 }
12832 else if (strcmp (name, "nodspr2") == 0)
12833 {
12834 mips_opts.ase_dspr2 = 0;
12835 mips_opts.ase_dsp = 0;
12836 }
ef2e4d86 12837 else if (strcmp (name, "mt") == 0)
ad3fea08
TS
12838 {
12839 if (!ISA_SUPPORTS_MT_ASE)
12840 as_warn ("%s ISA does not support MT ASE",
12841 mips_cpu_info_from_isa (mips_opts.isa)->name);
12842 mips_opts.ase_mt = 1;
12843 }
ef2e4d86
CF
12844 else if (strcmp (name, "nomt") == 0)
12845 mips_opts.ase_mt = 0;
1a2c1fad 12846 else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
252b5132 12847 {
af7ee8bf 12848 int reset = 0;
252b5132 12849
1a2c1fad
CD
12850 /* Permit the user to change the ISA and architecture on the fly.
12851 Needless to say, misuse can cause serious problems. */
81a21e38 12852 if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
af7ee8bf
CD
12853 {
12854 reset = 1;
12855 mips_opts.isa = file_mips_isa;
1a2c1fad 12856 mips_opts.arch = file_mips_arch;
1a2c1fad
CD
12857 }
12858 else if (strncmp (name, "arch=", 5) == 0)
12859 {
12860 const struct mips_cpu_info *p;
12861
12862 p = mips_parse_cpu("internal use", name + 5);
12863 if (!p)
12864 as_bad (_("unknown architecture %s"), name + 5);
12865 else
12866 {
12867 mips_opts.arch = p->cpu;
12868 mips_opts.isa = p->isa;
12869 }
12870 }
81a21e38
TS
12871 else if (strncmp (name, "mips", 4) == 0)
12872 {
12873 const struct mips_cpu_info *p;
12874
12875 p = mips_parse_cpu("internal use", name);
12876 if (!p)
12877 as_bad (_("unknown ISA level %s"), name + 4);
12878 else
12879 {
12880 mips_opts.arch = p->cpu;
12881 mips_opts.isa = p->isa;
12882 }
12883 }
af7ee8bf 12884 else
81a21e38 12885 as_bad (_("unknown ISA or architecture %s"), name);
af7ee8bf
CD
12886
12887 switch (mips_opts.isa)
98d3f06f
KH
12888 {
12889 case 0:
98d3f06f 12890 break;
af7ee8bf
CD
12891 case ISA_MIPS1:
12892 case ISA_MIPS2:
12893 case ISA_MIPS32:
12894 case ISA_MIPS32R2:
98d3f06f
KH
12895 mips_opts.gp32 = 1;
12896 mips_opts.fp32 = 1;
12897 break;
af7ee8bf
CD
12898 case ISA_MIPS3:
12899 case ISA_MIPS4:
12900 case ISA_MIPS5:
12901 case ISA_MIPS64:
5f74bc13 12902 case ISA_MIPS64R2:
98d3f06f
KH
12903 mips_opts.gp32 = 0;
12904 mips_opts.fp32 = 0;
12905 break;
12906 default:
12907 as_bad (_("unknown ISA level %s"), name + 4);
12908 break;
12909 }
af7ee8bf 12910 if (reset)
98d3f06f 12911 {
af7ee8bf
CD
12912 mips_opts.gp32 = file_mips_gp32;
12913 mips_opts.fp32 = file_mips_fp32;
98d3f06f 12914 }
252b5132
RH
12915 }
12916 else if (strcmp (name, "autoextend") == 0)
12917 mips_opts.noautoextend = 0;
12918 else if (strcmp (name, "noautoextend") == 0)
12919 mips_opts.noautoextend = 1;
12920 else if (strcmp (name, "push") == 0)
12921 {
12922 struct mips_option_stack *s;
12923
12924 s = (struct mips_option_stack *) xmalloc (sizeof *s);
12925 s->next = mips_opts_stack;
12926 s->options = mips_opts;
12927 mips_opts_stack = s;
12928 }
12929 else if (strcmp (name, "pop") == 0)
12930 {
12931 struct mips_option_stack *s;
12932
12933 s = mips_opts_stack;
12934 if (s == NULL)
12935 as_bad (_(".set pop with no .set push"));
12936 else
12937 {
12938 /* If we're changing the reorder mode we need to handle
12939 delay slots correctly. */
12940 if (s->options.noreorder && ! mips_opts.noreorder)
7d10b47d 12941 start_noreorder ();
252b5132 12942 else if (! s->options.noreorder && mips_opts.noreorder)
7d10b47d 12943 end_noreorder ();
252b5132
RH
12944
12945 mips_opts = s->options;
12946 mips_opts_stack = s->next;
12947 free (s);
12948 }
12949 }
aed1a261
RS
12950 else if (strcmp (name, "sym32") == 0)
12951 mips_opts.sym32 = TRUE;
12952 else if (strcmp (name, "nosym32") == 0)
12953 mips_opts.sym32 = FALSE;
e6559e01
JM
12954 else if (strchr (name, ','))
12955 {
12956 /* Generic ".set" directive; use the generic handler. */
12957 *input_line_pointer = ch;
12958 input_line_pointer = name;
12959 s_set (0);
12960 return;
12961 }
252b5132
RH
12962 else
12963 {
12964 as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
12965 }
12966 *input_line_pointer = ch;
12967 demand_empty_rest_of_line ();
12968}
12969
12970/* Handle the .abicalls pseudo-op. I believe this is equivalent to
12971 .option pic2. It means to generate SVR4 PIC calls. */
12972
12973static void
17a2f251 12974s_abicalls (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
12975{
12976 mips_pic = SVR4_PIC;
143d77c5 12977 mips_abicalls = TRUE;
4d0d148d
TS
12978
12979 if (g_switch_seen && g_switch_value != 0)
12980 as_warn (_("-G may not be used with SVR4 PIC code"));
12981 g_switch_value = 0;
12982
252b5132
RH
12983 bfd_set_gp_size (stdoutput, 0);
12984 demand_empty_rest_of_line ();
12985}
12986
12987/* Handle the .cpload pseudo-op. This is used when generating SVR4
12988 PIC code. It sets the $gp register for the function based on the
12989 function address, which is in the register named in the argument.
12990 This uses a relocation against _gp_disp, which is handled specially
12991 by the linker. The result is:
12992 lui $gp,%hi(_gp_disp)
12993 addiu $gp,$gp,%lo(_gp_disp)
12994 addu $gp,$gp,.cpload argument
aa6975fb
ILT
12995 The .cpload argument is normally $25 == $t9.
12996
12997 The -mno-shared option changes this to:
bbe506e8
TS
12998 lui $gp,%hi(__gnu_local_gp)
12999 addiu $gp,$gp,%lo(__gnu_local_gp)
aa6975fb
ILT
13000 and the argument is ignored. This saves an instruction, but the
13001 resulting code is not position independent; it uses an absolute
bbe506e8
TS
13002 address for __gnu_local_gp. Thus code assembled with -mno-shared
13003 can go into an ordinary executable, but not into a shared library. */
252b5132
RH
13004
13005static void
17a2f251 13006s_cpload (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
13007{
13008 expressionS ex;
aa6975fb
ILT
13009 int reg;
13010 int in_shared;
252b5132 13011
6478892d
TS
13012 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13013 .cpload is ignored. */
13014 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
252b5132
RH
13015 {
13016 s_ignore (0);
13017 return;
13018 }
13019
d3ecfc59 13020 /* .cpload should be in a .set noreorder section. */
252b5132
RH
13021 if (mips_opts.noreorder == 0)
13022 as_warn (_(".cpload not in noreorder section"));
13023
aa6975fb
ILT
13024 reg = tc_get_register (0);
13025
13026 /* If we need to produce a 64-bit address, we are better off using
13027 the default instruction sequence. */
aed1a261 13028 in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
aa6975fb 13029
252b5132 13030 ex.X_op = O_symbol;
bbe506e8
TS
13031 ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
13032 "__gnu_local_gp");
252b5132
RH
13033 ex.X_op_symbol = NULL;
13034 ex.X_add_number = 0;
13035
13036 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
49309057 13037 symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
252b5132 13038
584892a6 13039 macro_start ();
67c0d1eb
RS
13040 macro_build_lui (&ex, mips_gp_register);
13041 macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
17a2f251 13042 mips_gp_register, BFD_RELOC_LO16);
aa6975fb
ILT
13043 if (in_shared)
13044 macro_build (NULL, "addu", "d,v,t", mips_gp_register,
13045 mips_gp_register, reg);
584892a6 13046 macro_end ();
252b5132
RH
13047
13048 demand_empty_rest_of_line ();
13049}
13050
6478892d
TS
13051/* Handle the .cpsetup pseudo-op defined for NewABI PIC code. The syntax is:
13052 .cpsetup $reg1, offset|$reg2, label
13053
13054 If offset is given, this results in:
13055 sd $gp, offset($sp)
956cd1d6 13056 lui $gp, %hi(%neg(%gp_rel(label)))
698b7d9d
TS
13057 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
13058 daddu $gp, $gp, $reg1
6478892d
TS
13059
13060 If $reg2 is given, this results in:
13061 daddu $reg2, $gp, $0
956cd1d6 13062 lui $gp, %hi(%neg(%gp_rel(label)))
698b7d9d
TS
13063 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
13064 daddu $gp, $gp, $reg1
aa6975fb
ILT
13065 $reg1 is normally $25 == $t9.
13066
13067 The -mno-shared option replaces the last three instructions with
13068 lui $gp,%hi(_gp)
54f4ddb3 13069 addiu $gp,$gp,%lo(_gp) */
aa6975fb 13070
6478892d 13071static void
17a2f251 13072s_cpsetup (int ignore ATTRIBUTE_UNUSED)
6478892d
TS
13073{
13074 expressionS ex_off;
13075 expressionS ex_sym;
13076 int reg1;
6478892d 13077
8586fc66 13078 /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
6478892d
TS
13079 We also need NewABI support. */
13080 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13081 {
13082 s_ignore (0);
13083 return;
13084 }
13085
13086 reg1 = tc_get_register (0);
13087 SKIP_WHITESPACE ();
13088 if (*input_line_pointer != ',')
13089 {
13090 as_bad (_("missing argument separator ',' for .cpsetup"));
13091 return;
13092 }
13093 else
80245285 13094 ++input_line_pointer;
6478892d
TS
13095 SKIP_WHITESPACE ();
13096 if (*input_line_pointer == '$')
80245285
TS
13097 {
13098 mips_cpreturn_register = tc_get_register (0);
13099 mips_cpreturn_offset = -1;
13100 }
6478892d 13101 else
80245285
TS
13102 {
13103 mips_cpreturn_offset = get_absolute_expression ();
13104 mips_cpreturn_register = -1;
13105 }
6478892d
TS
13106 SKIP_WHITESPACE ();
13107 if (*input_line_pointer != ',')
13108 {
13109 as_bad (_("missing argument separator ',' for .cpsetup"));
13110 return;
13111 }
13112 else
f9419b05 13113 ++input_line_pointer;
6478892d 13114 SKIP_WHITESPACE ();
f21f8242 13115 expression (&ex_sym);
6478892d 13116
584892a6 13117 macro_start ();
6478892d
TS
13118 if (mips_cpreturn_register == -1)
13119 {
13120 ex_off.X_op = O_constant;
13121 ex_off.X_add_symbol = NULL;
13122 ex_off.X_op_symbol = NULL;
13123 ex_off.X_add_number = mips_cpreturn_offset;
13124
67c0d1eb 13125 macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
17a2f251 13126 BFD_RELOC_LO16, SP);
6478892d
TS
13127 }
13128 else
67c0d1eb 13129 macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
17a2f251 13130 mips_gp_register, 0);
6478892d 13131
aed1a261 13132 if (mips_in_shared || HAVE_64BIT_SYMBOLS)
aa6975fb
ILT
13133 {
13134 macro_build (&ex_sym, "lui", "t,u", mips_gp_register,
13135 -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
13136 BFD_RELOC_HI16_S);
13137
13138 macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
13139 mips_gp_register, -1, BFD_RELOC_GPREL16,
13140 BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
13141
13142 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
13143 mips_gp_register, reg1);
13144 }
13145 else
13146 {
13147 expressionS ex;
13148
13149 ex.X_op = O_symbol;
4184909a 13150 ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
aa6975fb
ILT
13151 ex.X_op_symbol = NULL;
13152 ex.X_add_number = 0;
6e1304d8 13153
aa6975fb
ILT
13154 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
13155 symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13156
13157 macro_build_lui (&ex, mips_gp_register);
13158 macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13159 mips_gp_register, BFD_RELOC_LO16);
13160 }
f21f8242 13161
584892a6 13162 macro_end ();
6478892d
TS
13163
13164 demand_empty_rest_of_line ();
13165}
13166
13167static void
17a2f251 13168s_cplocal (int ignore ATTRIBUTE_UNUSED)
6478892d
TS
13169{
13170 /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
54f4ddb3 13171 .cplocal is ignored. */
6478892d
TS
13172 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13173 {
13174 s_ignore (0);
13175 return;
13176 }
13177
13178 mips_gp_register = tc_get_register (0);
85b51719 13179 demand_empty_rest_of_line ();
6478892d
TS
13180}
13181
252b5132
RH
13182/* Handle the .cprestore pseudo-op. This stores $gp into a given
13183 offset from $sp. The offset is remembered, and after making a PIC
13184 call $gp is restored from that location. */
13185
13186static void
17a2f251 13187s_cprestore (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
13188{
13189 expressionS ex;
252b5132 13190
6478892d 13191 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
c9914766 13192 .cprestore is ignored. */
6478892d 13193 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
252b5132
RH
13194 {
13195 s_ignore (0);
13196 return;
13197 }
13198
13199 mips_cprestore_offset = get_absolute_expression ();
7a621144 13200 mips_cprestore_valid = 1;
252b5132
RH
13201
13202 ex.X_op = O_constant;
13203 ex.X_add_symbol = NULL;
13204 ex.X_op_symbol = NULL;
13205 ex.X_add_number = mips_cprestore_offset;
13206
584892a6 13207 macro_start ();
67c0d1eb
RS
13208 macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
13209 SP, HAVE_64BIT_ADDRESSES);
584892a6 13210 macro_end ();
252b5132
RH
13211
13212 demand_empty_rest_of_line ();
13213}
13214
6478892d 13215/* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
67c1ffbe 13216 was given in the preceding .cpsetup, it results in:
6478892d 13217 ld $gp, offset($sp)
76b3015f 13218
6478892d 13219 If a register $reg2 was given there, it results in:
54f4ddb3
TS
13220 daddu $gp, $reg2, $0 */
13221
6478892d 13222static void
17a2f251 13223s_cpreturn (int ignore ATTRIBUTE_UNUSED)
6478892d
TS
13224{
13225 expressionS ex;
6478892d
TS
13226
13227 /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
13228 We also need NewABI support. */
13229 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13230 {
13231 s_ignore (0);
13232 return;
13233 }
13234
584892a6 13235 macro_start ();
6478892d
TS
13236 if (mips_cpreturn_register == -1)
13237 {
13238 ex.X_op = O_constant;
13239 ex.X_add_symbol = NULL;
13240 ex.X_op_symbol = NULL;
13241 ex.X_add_number = mips_cpreturn_offset;
13242
67c0d1eb 13243 macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
6478892d
TS
13244 }
13245 else
67c0d1eb 13246 macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
17a2f251 13247 mips_cpreturn_register, 0);
584892a6 13248 macro_end ();
6478892d
TS
13249
13250 demand_empty_rest_of_line ();
13251}
13252
741d6ea8
JM
13253/* Handle the .dtprelword and .dtpreldword pseudo-ops. They generate
13254 a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
13255 use in DWARF debug information. */
13256
13257static void
13258s_dtprel_internal (size_t bytes)
13259{
13260 expressionS ex;
13261 char *p;
13262
13263 expression (&ex);
13264
13265 if (ex.X_op != O_symbol)
13266 {
13267 as_bad (_("Unsupported use of %s"), (bytes == 8
13268 ? ".dtpreldword"
13269 : ".dtprelword"));
13270 ignore_rest_of_line ();
13271 }
13272
13273 p = frag_more (bytes);
13274 md_number_to_chars (p, 0, bytes);
13275 fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
13276 (bytes == 8
13277 ? BFD_RELOC_MIPS_TLS_DTPREL64
13278 : BFD_RELOC_MIPS_TLS_DTPREL32));
13279
13280 demand_empty_rest_of_line ();
13281}
13282
13283/* Handle .dtprelword. */
13284
13285static void
13286s_dtprelword (int ignore ATTRIBUTE_UNUSED)
13287{
13288 s_dtprel_internal (4);
13289}
13290
13291/* Handle .dtpreldword. */
13292
13293static void
13294s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
13295{
13296 s_dtprel_internal (8);
13297}
13298
6478892d
TS
13299/* Handle the .gpvalue pseudo-op. This is used when generating NewABI PIC
13300 code. It sets the offset to use in gp_rel relocations. */
13301
13302static void
17a2f251 13303s_gpvalue (int ignore ATTRIBUTE_UNUSED)
6478892d
TS
13304{
13305 /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
13306 We also need NewABI support. */
13307 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13308 {
13309 s_ignore (0);
13310 return;
13311 }
13312
def2e0dd 13313 mips_gprel_offset = get_absolute_expression ();
6478892d
TS
13314
13315 demand_empty_rest_of_line ();
13316}
13317
252b5132
RH
13318/* Handle the .gpword pseudo-op. This is used when generating PIC
13319 code. It generates a 32 bit GP relative reloc. */
13320
13321static void
17a2f251 13322s_gpword (int ignore ATTRIBUTE_UNUSED)
252b5132 13323{
a8dbcb85
TS
13324 segment_info_type *si;
13325 struct insn_label_list *l;
252b5132
RH
13326 symbolS *label;
13327 expressionS ex;
13328 char *p;
13329
13330 /* When not generating PIC code, this is treated as .word. */
13331 if (mips_pic != SVR4_PIC)
13332 {
13333 s_cons (2);
13334 return;
13335 }
13336
a8dbcb85
TS
13337 si = seg_info (now_seg);
13338 l = si->label_list;
13339 label = l != NULL ? l->label : NULL;
7d10b47d 13340 mips_emit_delays ();
252b5132
RH
13341 if (auto_align)
13342 mips_align (2, 0, label);
13343 mips_clear_insn_labels ();
13344
13345 expression (&ex);
13346
13347 if (ex.X_op != O_symbol || ex.X_add_number != 0)
13348 {
13349 as_bad (_("Unsupported use of .gpword"));
13350 ignore_rest_of_line ();
13351 }
13352
13353 p = frag_more (4);
17a2f251 13354 md_number_to_chars (p, 0, 4);
b34976b6 13355 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
cdf6fd85 13356 BFD_RELOC_GPREL32);
252b5132
RH
13357
13358 demand_empty_rest_of_line ();
13359}
13360
10181a0d 13361static void
17a2f251 13362s_gpdword (int ignore ATTRIBUTE_UNUSED)
10181a0d 13363{
a8dbcb85
TS
13364 segment_info_type *si;
13365 struct insn_label_list *l;
10181a0d
AO
13366 symbolS *label;
13367 expressionS ex;
13368 char *p;
13369
13370 /* When not generating PIC code, this is treated as .dword. */
13371 if (mips_pic != SVR4_PIC)
13372 {
13373 s_cons (3);
13374 return;
13375 }
13376
a8dbcb85
TS
13377 si = seg_info (now_seg);
13378 l = si->label_list;
13379 label = l != NULL ? l->label : NULL;
7d10b47d 13380 mips_emit_delays ();
10181a0d
AO
13381 if (auto_align)
13382 mips_align (3, 0, label);
13383 mips_clear_insn_labels ();
13384
13385 expression (&ex);
13386
13387 if (ex.X_op != O_symbol || ex.X_add_number != 0)
13388 {
13389 as_bad (_("Unsupported use of .gpdword"));
13390 ignore_rest_of_line ();
13391 }
13392
13393 p = frag_more (8);
17a2f251 13394 md_number_to_chars (p, 0, 8);
a105a300 13395 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
6e1304d8 13396 BFD_RELOC_GPREL32)->fx_tcbit = 1;
10181a0d
AO
13397
13398 /* GPREL32 composed with 64 gives a 64-bit GP offset. */
6e1304d8
RS
13399 fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
13400 FALSE, BFD_RELOC_64)->fx_tcbit = 1;
10181a0d
AO
13401
13402 demand_empty_rest_of_line ();
13403}
13404
252b5132
RH
13405/* Handle the .cpadd pseudo-op. This is used when dealing with switch
13406 tables in SVR4 PIC code. */
13407
13408static void
17a2f251 13409s_cpadd (int ignore ATTRIBUTE_UNUSED)
252b5132 13410{
252b5132
RH
13411 int reg;
13412
10181a0d
AO
13413 /* This is ignored when not generating SVR4 PIC code. */
13414 if (mips_pic != SVR4_PIC)
252b5132
RH
13415 {
13416 s_ignore (0);
13417 return;
13418 }
13419
13420 /* Add $gp to the register named as an argument. */
584892a6 13421 macro_start ();
252b5132 13422 reg = tc_get_register (0);
67c0d1eb 13423 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
584892a6 13424 macro_end ();
252b5132 13425
bdaaa2e1 13426 demand_empty_rest_of_line ();
252b5132
RH
13427}
13428
13429/* Handle the .insn pseudo-op. This marks instruction labels in
13430 mips16 mode. This permits the linker to handle them specially,
13431 such as generating jalx instructions when needed. We also make
13432 them odd for the duration of the assembly, in order to generate the
13433 right sort of code. We will make them even in the adjust_symtab
13434 routine, while leaving them marked. This is convenient for the
13435 debugger and the disassembler. The linker knows to make them odd
13436 again. */
13437
13438static void
17a2f251 13439s_insn (int ignore ATTRIBUTE_UNUSED)
252b5132 13440{
f9419b05 13441 mips16_mark_labels ();
252b5132
RH
13442
13443 demand_empty_rest_of_line ();
13444}
13445
13446/* Handle a .stabn directive. We need these in order to mark a label
13447 as being a mips16 text label correctly. Sometimes the compiler
13448 will emit a label, followed by a .stabn, and then switch sections.
13449 If the label and .stabn are in mips16 mode, then the label is
13450 really a mips16 text label. */
13451
13452static void
17a2f251 13453s_mips_stab (int type)
252b5132 13454{
f9419b05 13455 if (type == 'n')
252b5132
RH
13456 mips16_mark_labels ();
13457
13458 s_stab (type);
13459}
13460
54f4ddb3 13461/* Handle the .weakext pseudo-op as defined in Kane and Heinrich. */
252b5132
RH
13462
13463static void
17a2f251 13464s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
13465{
13466 char *name;
13467 int c;
13468 symbolS *symbolP;
13469 expressionS exp;
13470
13471 name = input_line_pointer;
13472 c = get_symbol_end ();
13473 symbolP = symbol_find_or_make (name);
13474 S_SET_WEAK (symbolP);
13475 *input_line_pointer = c;
13476
13477 SKIP_WHITESPACE ();
13478
13479 if (! is_end_of_line[(unsigned char) *input_line_pointer])
13480 {
13481 if (S_IS_DEFINED (symbolP))
13482 {
956cd1d6 13483 as_bad ("ignoring attempt to redefine symbol %s",
252b5132
RH
13484 S_GET_NAME (symbolP));
13485 ignore_rest_of_line ();
13486 return;
13487 }
bdaaa2e1 13488
252b5132
RH
13489 if (*input_line_pointer == ',')
13490 {
13491 ++input_line_pointer;
13492 SKIP_WHITESPACE ();
13493 }
bdaaa2e1 13494
252b5132
RH
13495 expression (&exp);
13496 if (exp.X_op != O_symbol)
13497 {
13498 as_bad ("bad .weakext directive");
98d3f06f 13499 ignore_rest_of_line ();
252b5132
RH
13500 return;
13501 }
49309057 13502 symbol_set_value_expression (symbolP, &exp);
252b5132
RH
13503 }
13504
13505 demand_empty_rest_of_line ();
13506}
13507
13508/* Parse a register string into a number. Called from the ECOFF code
13509 to parse .frame. The argument is non-zero if this is the frame
13510 register, so that we can record it in mips_frame_reg. */
13511
13512int
17a2f251 13513tc_get_register (int frame)
252b5132 13514{
707bfff6 13515 unsigned int reg;
252b5132
RH
13516
13517 SKIP_WHITESPACE ();
707bfff6
TS
13518 if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
13519 reg = 0;
252b5132 13520 if (frame)
7a621144
DJ
13521 {
13522 mips_frame_reg = reg != 0 ? reg : SP;
13523 mips_frame_reg_valid = 1;
13524 mips_cprestore_valid = 0;
13525 }
252b5132
RH
13526 return reg;
13527}
13528
13529valueT
17a2f251 13530md_section_align (asection *seg, valueT addr)
252b5132
RH
13531{
13532 int align = bfd_get_section_alignment (stdoutput, seg);
13533
b4c71f56
TS
13534 if (IS_ELF)
13535 {
13536 /* We don't need to align ELF sections to the full alignment.
13537 However, Irix 5 may prefer that we align them at least to a 16
13538 byte boundary. We don't bother to align the sections if we
13539 are targeted for an embedded system. */
c41e87e3 13540 if (strncmp (TARGET_OS, "elf", 3) == 0)
b4c71f56
TS
13541 return addr;
13542 if (align > 4)
13543 align = 4;
13544 }
252b5132
RH
13545
13546 return ((addr + (1 << align) - 1) & (-1 << align));
13547}
13548
13549/* Utility routine, called from above as well. If called while the
13550 input file is still being read, it's only an approximation. (For
13551 example, a symbol may later become defined which appeared to be
13552 undefined earlier.) */
13553
13554static int
17a2f251 13555nopic_need_relax (symbolS *sym, int before_relaxing)
252b5132
RH
13556{
13557 if (sym == 0)
13558 return 0;
13559
4d0d148d 13560 if (g_switch_value > 0)
252b5132
RH
13561 {
13562 const char *symname;
13563 int change;
13564
c9914766 13565 /* Find out whether this symbol can be referenced off the $gp
252b5132
RH
13566 register. It can be if it is smaller than the -G size or if
13567 it is in the .sdata or .sbss section. Certain symbols can
c9914766 13568 not be referenced off the $gp, although it appears as though
252b5132
RH
13569 they can. */
13570 symname = S_GET_NAME (sym);
13571 if (symname != (const char *) NULL
13572 && (strcmp (symname, "eprol") == 0
13573 || strcmp (symname, "etext") == 0
13574 || strcmp (symname, "_gp") == 0
13575 || strcmp (symname, "edata") == 0
13576 || strcmp (symname, "_fbss") == 0
13577 || strcmp (symname, "_fdata") == 0
13578 || strcmp (symname, "_ftext") == 0
13579 || strcmp (symname, "end") == 0
13580 || strcmp (symname, "_gp_disp") == 0))
13581 change = 1;
13582 else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
13583 && (0
13584#ifndef NO_ECOFF_DEBUGGING
49309057
ILT
13585 || (symbol_get_obj (sym)->ecoff_extern_size != 0
13586 && (symbol_get_obj (sym)->ecoff_extern_size
13587 <= g_switch_value))
252b5132
RH
13588#endif
13589 /* We must defer this decision until after the whole
13590 file has been read, since there might be a .extern
13591 after the first use of this symbol. */
13592 || (before_relaxing
13593#ifndef NO_ECOFF_DEBUGGING
49309057 13594 && symbol_get_obj (sym)->ecoff_extern_size == 0
252b5132
RH
13595#endif
13596 && S_GET_VALUE (sym) == 0)
13597 || (S_GET_VALUE (sym) != 0
13598 && S_GET_VALUE (sym) <= g_switch_value)))
13599 change = 0;
13600 else
13601 {
13602 const char *segname;
13603
13604 segname = segment_name (S_GET_SEGMENT (sym));
13605 assert (strcmp (segname, ".lit8") != 0
13606 && strcmp (segname, ".lit4") != 0);
13607 change = (strcmp (segname, ".sdata") != 0
fba2b7f9
GK
13608 && strcmp (segname, ".sbss") != 0
13609 && strncmp (segname, ".sdata.", 7) != 0
d4dc2f22
TS
13610 && strncmp (segname, ".sbss.", 6) != 0
13611 && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
fba2b7f9 13612 && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
252b5132
RH
13613 }
13614 return change;
13615 }
13616 else
c9914766 13617 /* We are not optimizing for the $gp register. */
252b5132
RH
13618 return 1;
13619}
13620
5919d012
RS
13621
13622/* Return true if the given symbol should be considered local for SVR4 PIC. */
13623
13624static bfd_boolean
17a2f251 13625pic_need_relax (symbolS *sym, asection *segtype)
5919d012
RS
13626{
13627 asection *symsec;
5919d012
RS
13628
13629 /* Handle the case of a symbol equated to another symbol. */
13630 while (symbol_equated_reloc_p (sym))
13631 {
13632 symbolS *n;
13633
5f0fe04b 13634 /* It's possible to get a loop here in a badly written program. */
5919d012
RS
13635 n = symbol_get_value_expression (sym)->X_add_symbol;
13636 if (n == sym)
13637 break;
13638 sym = n;
13639 }
13640
df1f3cda
DD
13641 if (symbol_section_p (sym))
13642 return TRUE;
13643
5919d012
RS
13644 symsec = S_GET_SEGMENT (sym);
13645
5919d012
RS
13646 /* This must duplicate the test in adjust_reloc_syms. */
13647 return (symsec != &bfd_und_section
13648 && symsec != &bfd_abs_section
5f0fe04b
TS
13649 && !bfd_is_com_section (symsec)
13650 && !s_is_linkonce (sym, segtype)
5919d012
RS
13651#ifdef OBJ_ELF
13652 /* A global or weak symbol is treated as external. */
f43abd2b 13653 && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
5919d012
RS
13654#endif
13655 );
13656}
13657
13658
252b5132
RH
13659/* Given a mips16 variant frag FRAGP, return non-zero if it needs an
13660 extended opcode. SEC is the section the frag is in. */
13661
13662static int
17a2f251 13663mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
252b5132
RH
13664{
13665 int type;
3994f87e 13666 const struct mips16_immed_operand *op;
252b5132
RH
13667 offsetT val;
13668 int mintiny, maxtiny;
13669 segT symsec;
98aa84af 13670 fragS *sym_frag;
252b5132
RH
13671
13672 if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
13673 return 0;
13674 if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
13675 return 1;
13676
13677 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13678 op = mips16_immed_operands;
13679 while (op->type != type)
13680 {
13681 ++op;
13682 assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
13683 }
13684
13685 if (op->unsp)
13686 {
13687 if (type == '<' || type == '>' || type == '[' || type == ']')
13688 {
13689 mintiny = 1;
13690 maxtiny = 1 << op->nbits;
13691 }
13692 else
13693 {
13694 mintiny = 0;
13695 maxtiny = (1 << op->nbits) - 1;
13696 }
13697 }
13698 else
13699 {
13700 mintiny = - (1 << (op->nbits - 1));
13701 maxtiny = (1 << (op->nbits - 1)) - 1;
13702 }
13703
98aa84af 13704 sym_frag = symbol_get_frag (fragp->fr_symbol);
ac62c346 13705 val = S_GET_VALUE (fragp->fr_symbol);
98aa84af 13706 symsec = S_GET_SEGMENT (fragp->fr_symbol);
252b5132
RH
13707
13708 if (op->pcrel)
13709 {
13710 addressT addr;
13711
13712 /* We won't have the section when we are called from
13713 mips_relax_frag. However, we will always have been called
13714 from md_estimate_size_before_relax first. If this is a
13715 branch to a different section, we mark it as such. If SEC is
13716 NULL, and the frag is not marked, then it must be a branch to
13717 the same section. */
13718 if (sec == NULL)
13719 {
13720 if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
13721 return 1;
13722 }
13723 else
13724 {
98aa84af 13725 /* Must have been called from md_estimate_size_before_relax. */
252b5132
RH
13726 if (symsec != sec)
13727 {
13728 fragp->fr_subtype =
13729 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13730
13731 /* FIXME: We should support this, and let the linker
13732 catch branches and loads that are out of range. */
13733 as_bad_where (fragp->fr_file, fragp->fr_line,
13734 _("unsupported PC relative reference to different section"));
13735
13736 return 1;
13737 }
98aa84af
AM
13738 if (fragp != sym_frag && sym_frag->fr_address == 0)
13739 /* Assume non-extended on the first relaxation pass.
13740 The address we have calculated will be bogus if this is
13741 a forward branch to another frag, as the forward frag
13742 will have fr_address == 0. */
13743 return 0;
252b5132
RH
13744 }
13745
13746 /* In this case, we know for sure that the symbol fragment is in
98aa84af
AM
13747 the same section. If the relax_marker of the symbol fragment
13748 differs from the relax_marker of this fragment, we have not
13749 yet adjusted the symbol fragment fr_address. We want to add
252b5132
RH
13750 in STRETCH in order to get a better estimate of the address.
13751 This particularly matters because of the shift bits. */
13752 if (stretch != 0
98aa84af 13753 && sym_frag->relax_marker != fragp->relax_marker)
252b5132
RH
13754 {
13755 fragS *f;
13756
13757 /* Adjust stretch for any alignment frag. Note that if have
13758 been expanding the earlier code, the symbol may be
13759 defined in what appears to be an earlier frag. FIXME:
13760 This doesn't handle the fr_subtype field, which specifies
13761 a maximum number of bytes to skip when doing an
13762 alignment. */
98aa84af 13763 for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
252b5132
RH
13764 {
13765 if (f->fr_type == rs_align || f->fr_type == rs_align_code)
13766 {
13767 if (stretch < 0)
13768 stretch = - ((- stretch)
13769 & ~ ((1 << (int) f->fr_offset) - 1));
13770 else
13771 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
13772 if (stretch == 0)
13773 break;
13774 }
13775 }
13776 if (f != NULL)
13777 val += stretch;
13778 }
13779
13780 addr = fragp->fr_address + fragp->fr_fix;
13781
13782 /* The base address rules are complicated. The base address of
13783 a branch is the following instruction. The base address of a
13784 PC relative load or add is the instruction itself, but if it
13785 is in a delay slot (in which case it can not be extended) use
13786 the address of the instruction whose delay slot it is in. */
13787 if (type == 'p' || type == 'q')
13788 {
13789 addr += 2;
13790
13791 /* If we are currently assuming that this frag should be
13792 extended, then, the current address is two bytes
bdaaa2e1 13793 higher. */
252b5132
RH
13794 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13795 addr += 2;
13796
13797 /* Ignore the low bit in the target, since it will be set
13798 for a text label. */
13799 if ((val & 1) != 0)
13800 --val;
13801 }
13802 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13803 addr -= 4;
13804 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13805 addr -= 2;
13806
13807 val -= addr & ~ ((1 << op->shift) - 1);
13808
13809 /* Branch offsets have an implicit 0 in the lowest bit. */
13810 if (type == 'p' || type == 'q')
13811 val /= 2;
13812
13813 /* If any of the shifted bits are set, we must use an extended
13814 opcode. If the address depends on the size of this
13815 instruction, this can lead to a loop, so we arrange to always
13816 use an extended opcode. We only check this when we are in
13817 the main relaxation loop, when SEC is NULL. */
13818 if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
13819 {
13820 fragp->fr_subtype =
13821 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13822 return 1;
13823 }
13824
13825 /* If we are about to mark a frag as extended because the value
13826 is precisely maxtiny + 1, then there is a chance of an
13827 infinite loop as in the following code:
13828 la $4,foo
13829 .skip 1020
13830 .align 2
13831 foo:
13832 In this case when the la is extended, foo is 0x3fc bytes
13833 away, so the la can be shrunk, but then foo is 0x400 away, so
13834 the la must be extended. To avoid this loop, we mark the
13835 frag as extended if it was small, and is about to become
13836 extended with a value of maxtiny + 1. */
13837 if (val == ((maxtiny + 1) << op->shift)
13838 && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
13839 && sec == NULL)
13840 {
13841 fragp->fr_subtype =
13842 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13843 return 1;
13844 }
13845 }
13846 else if (symsec != absolute_section && sec != NULL)
13847 as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
13848
13849 if ((val & ((1 << op->shift) - 1)) != 0
13850 || val < (mintiny << op->shift)
13851 || val > (maxtiny << op->shift))
13852 return 1;
13853 else
13854 return 0;
13855}
13856
4a6a3df4
AO
13857/* Compute the length of a branch sequence, and adjust the
13858 RELAX_BRANCH_TOOFAR bit accordingly. If FRAGP is NULL, the
13859 worst-case length is computed, with UPDATE being used to indicate
13860 whether an unconditional (-1), branch-likely (+1) or regular (0)
13861 branch is to be computed. */
13862static int
17a2f251 13863relaxed_branch_length (fragS *fragp, asection *sec, int update)
4a6a3df4 13864{
b34976b6 13865 bfd_boolean toofar;
4a6a3df4
AO
13866 int length;
13867
13868 if (fragp
13869 && S_IS_DEFINED (fragp->fr_symbol)
13870 && sec == S_GET_SEGMENT (fragp->fr_symbol))
13871 {
13872 addressT addr;
13873 offsetT val;
13874
13875 val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
13876
13877 addr = fragp->fr_address + fragp->fr_fix + 4;
13878
13879 val -= addr;
13880
13881 toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
13882 }
13883 else if (fragp)
13884 /* If the symbol is not defined or it's in a different segment,
13885 assume the user knows what's going on and emit a short
13886 branch. */
b34976b6 13887 toofar = FALSE;
4a6a3df4 13888 else
b34976b6 13889 toofar = TRUE;
4a6a3df4
AO
13890
13891 if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
13892 fragp->fr_subtype
af6ae2ad 13893 = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp->fr_subtype),
4a6a3df4
AO
13894 RELAX_BRANCH_LIKELY (fragp->fr_subtype),
13895 RELAX_BRANCH_LINK (fragp->fr_subtype),
13896 toofar);
13897
13898 length = 4;
13899 if (toofar)
13900 {
13901 if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
13902 length += 8;
13903
13904 if (mips_pic != NO_PIC)
13905 {
13906 /* Additional space for PIC loading of target address. */
13907 length += 8;
13908 if (mips_opts.isa == ISA_MIPS1)
13909 /* Additional space for $at-stabilizing nop. */
13910 length += 4;
13911 }
13912
13913 /* If branch is conditional. */
13914 if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
13915 length += 8;
13916 }
b34976b6 13917
4a6a3df4
AO
13918 return length;
13919}
13920
252b5132
RH
13921/* Estimate the size of a frag before relaxing. Unless this is the
13922 mips16, we are not really relaxing here, and the final size is
13923 encoded in the subtype information. For the mips16, we have to
13924 decide whether we are using an extended opcode or not. */
13925
252b5132 13926int
17a2f251 13927md_estimate_size_before_relax (fragS *fragp, asection *segtype)
252b5132 13928{
5919d012 13929 int change;
252b5132 13930
4a6a3df4
AO
13931 if (RELAX_BRANCH_P (fragp->fr_subtype))
13932 {
13933
b34976b6
AM
13934 fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
13935
4a6a3df4
AO
13936 return fragp->fr_var;
13937 }
13938
252b5132 13939 if (RELAX_MIPS16_P (fragp->fr_subtype))
177b4a6a
AO
13940 /* We don't want to modify the EXTENDED bit here; it might get us
13941 into infinite loops. We change it only in mips_relax_frag(). */
13942 return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
252b5132
RH
13943
13944 if (mips_pic == NO_PIC)
5919d012 13945 change = nopic_need_relax (fragp->fr_symbol, 0);
252b5132 13946 else if (mips_pic == SVR4_PIC)
5919d012 13947 change = pic_need_relax (fragp->fr_symbol, segtype);
0a44bf69
RS
13948 else if (mips_pic == VXWORKS_PIC)
13949 /* For vxworks, GOT16 relocations never have a corresponding LO16. */
13950 change = 0;
252b5132
RH
13951 else
13952 abort ();
13953
13954 if (change)
13955 {
4d7206a2 13956 fragp->fr_subtype |= RELAX_USE_SECOND;
4d7206a2 13957 return -RELAX_FIRST (fragp->fr_subtype);
252b5132 13958 }
4d7206a2
RS
13959 else
13960 return -RELAX_SECOND (fragp->fr_subtype);
252b5132
RH
13961}
13962
13963/* This is called to see whether a reloc against a defined symbol
de7e6852 13964 should be converted into a reloc against a section. */
252b5132
RH
13965
13966int
17a2f251 13967mips_fix_adjustable (fixS *fixp)
252b5132 13968{
252b5132
RH
13969 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
13970 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13971 return 0;
a161fe53 13972
252b5132
RH
13973 if (fixp->fx_addsy == NULL)
13974 return 1;
a161fe53 13975
de7e6852
RS
13976 /* If symbol SYM is in a mergeable section, relocations of the form
13977 SYM + 0 can usually be made section-relative. The mergeable data
13978 is then identified by the section offset rather than by the symbol.
13979
13980 However, if we're generating REL LO16 relocations, the offset is split
13981 between the LO16 and parterning high part relocation. The linker will
13982 need to recalculate the complete offset in order to correctly identify
13983 the merge data.
13984
13985 The linker has traditionally not looked for the parterning high part
13986 relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
13987 placed anywhere. Rather than break backwards compatibility by changing
13988 this, it seems better not to force the issue, and instead keep the
13989 original symbol. This will work with either linker behavior. */
738e5348 13990 if ((lo16_reloc_p (fixp->fx_r_type)
704803a9 13991 || reloc_needs_lo_p (fixp->fx_r_type))
de7e6852
RS
13992 && HAVE_IN_PLACE_ADDENDS
13993 && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
13994 return 0;
13995
252b5132 13996#ifdef OBJ_ELF
b314ec0e
RS
13997 /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
13998 to a floating-point stub. The same is true for non-R_MIPS16_26
13999 relocations against MIPS16 functions; in this case, the stub becomes
14000 the function's canonical address.
14001
14002 Floating-point stubs are stored in unique .mips16.call.* or
14003 .mips16.fn.* sections. If a stub T for function F is in section S,
14004 the first relocation in section S must be against F; this is how the
14005 linker determines the target function. All relocations that might
14006 resolve to T must also be against F. We therefore have the following
14007 restrictions, which are given in an intentionally-redundant way:
14008
14009 1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
14010 symbols.
14011
14012 2. We cannot reduce a stub's relocations against non-MIPS16 symbols
14013 if that stub might be used.
14014
14015 3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
14016 symbols.
14017
14018 4. We cannot reduce a stub's relocations against MIPS16 symbols if
14019 that stub might be used.
14020
14021 There is a further restriction:
14022
14023 5. We cannot reduce R_MIPS16_26 relocations against MIPS16 symbols
14024 on targets with in-place addends; the relocation field cannot
14025 encode the low bit.
14026
14027 For simplicity, we deal with (3)-(5) by not reducing _any_ relocation
14028 against a MIPS16 symbol.
14029
14030 We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
14031 relocation against some symbol R, no relocation against R may be
14032 reduced. (Note that this deals with (2) as well as (1) because
14033 relocations against global symbols will never be reduced on ELF
14034 targets.) This approach is a little simpler than trying to detect
14035 stub sections, and gives the "all or nothing" per-symbol consistency
14036 that we have for MIPS16 symbols. */
f43abd2b 14037 if (IS_ELF
b314ec0e 14038 && fixp->fx_subsy == NULL
30c09090 14039 && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
b314ec0e 14040 || *symbol_get_tc (fixp->fx_addsy)))
252b5132
RH
14041 return 0;
14042#endif
a161fe53 14043
252b5132
RH
14044 return 1;
14045}
14046
14047/* Translate internal representation of relocation info to BFD target
14048 format. */
14049
14050arelent **
17a2f251 14051tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
252b5132
RH
14052{
14053 static arelent *retval[4];
14054 arelent *reloc;
14055 bfd_reloc_code_real_type code;
14056
4b0cff4e
TS
14057 memset (retval, 0, sizeof(retval));
14058 reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
49309057
ILT
14059 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
14060 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
14061 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
14062
bad36eac
DJ
14063 if (fixp->fx_pcrel)
14064 {
14065 assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2);
14066
14067 /* At this point, fx_addnumber is "symbol offset - pcrel address".
14068 Relocations want only the symbol offset. */
14069 reloc->addend = fixp->fx_addnumber + reloc->address;
f43abd2b 14070 if (!IS_ELF)
bad36eac
DJ
14071 {
14072 /* A gruesome hack which is a result of the gruesome gas
14073 reloc handling. What's worse, for COFF (as opposed to
14074 ECOFF), we might need yet another copy of reloc->address.
14075 See bfd_install_relocation. */
14076 reloc->addend += reloc->address;
14077 }
14078 }
14079 else
14080 reloc->addend = fixp->fx_addnumber;
252b5132 14081
438c16b8
TS
14082 /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
14083 entry to be used in the relocation's section offset. */
14084 if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
252b5132
RH
14085 {
14086 reloc->address = reloc->addend;
14087 reloc->addend = 0;
14088 }
14089
252b5132 14090 code = fixp->fx_r_type;
252b5132 14091
bad36eac 14092 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
252b5132
RH
14093 if (reloc->howto == NULL)
14094 {
14095 as_bad_where (fixp->fx_file, fixp->fx_line,
14096 _("Can not represent %s relocation in this object file format"),
14097 bfd_get_reloc_code_name (code));
14098 retval[0] = NULL;
14099 }
14100
14101 return retval;
14102}
14103
14104/* Relax a machine dependent frag. This returns the amount by which
14105 the current size of the frag should change. */
14106
14107int
17a2f251 14108mips_relax_frag (asection *sec, fragS *fragp, long stretch)
252b5132 14109{
4a6a3df4
AO
14110 if (RELAX_BRANCH_P (fragp->fr_subtype))
14111 {
14112 offsetT old_var = fragp->fr_var;
b34976b6
AM
14113
14114 fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
4a6a3df4
AO
14115
14116 return fragp->fr_var - old_var;
14117 }
14118
252b5132
RH
14119 if (! RELAX_MIPS16_P (fragp->fr_subtype))
14120 return 0;
14121
c4e7957c 14122 if (mips16_extended_frag (fragp, NULL, stretch))
252b5132
RH
14123 {
14124 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14125 return 0;
14126 fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
14127 return 2;
14128 }
14129 else
14130 {
14131 if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14132 return 0;
14133 fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
14134 return -2;
14135 }
14136
14137 return 0;
14138}
14139
14140/* Convert a machine dependent frag. */
14141
14142void
17a2f251 14143md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
252b5132 14144{
4a6a3df4
AO
14145 if (RELAX_BRANCH_P (fragp->fr_subtype))
14146 {
14147 bfd_byte *buf;
14148 unsigned long insn;
14149 expressionS exp;
14150 fixS *fixp;
b34976b6 14151
4a6a3df4
AO
14152 buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
14153
14154 if (target_big_endian)
14155 insn = bfd_getb32 (buf);
14156 else
14157 insn = bfd_getl32 (buf);
b34976b6 14158
4a6a3df4
AO
14159 if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14160 {
14161 /* We generate a fixup instead of applying it right now
14162 because, if there are linker relaxations, we're going to
14163 need the relocations. */
14164 exp.X_op = O_symbol;
14165 exp.X_add_symbol = fragp->fr_symbol;
14166 exp.X_add_number = fragp->fr_offset;
14167
14168 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
3994f87e 14169 4, &exp, TRUE, BFD_RELOC_16_PCREL_S2);
4a6a3df4
AO
14170 fixp->fx_file = fragp->fr_file;
14171 fixp->fx_line = fragp->fr_line;
b34976b6 14172
2132e3a3 14173 md_number_to_chars ((char *) buf, insn, 4);
4a6a3df4
AO
14174 buf += 4;
14175 }
14176 else
14177 {
14178 int i;
14179
14180 as_warn_where (fragp->fr_file, fragp->fr_line,
14181 _("relaxed out-of-range branch into a jump"));
14182
14183 if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
14184 goto uncond;
14185
14186 if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14187 {
14188 /* Reverse the branch. */
14189 switch ((insn >> 28) & 0xf)
14190 {
14191 case 4:
14192 /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
14193 have the condition reversed by tweaking a single
14194 bit, and their opcodes all have 0x4???????. */
14195 assert ((insn & 0xf1000000) == 0x41000000);
14196 insn ^= 0x00010000;
14197 break;
14198
14199 case 0:
14200 /* bltz 0x04000000 bgez 0x04010000
54f4ddb3 14201 bltzal 0x04100000 bgezal 0x04110000 */
4a6a3df4
AO
14202 assert ((insn & 0xfc0e0000) == 0x04000000);
14203 insn ^= 0x00010000;
14204 break;
b34976b6 14205
4a6a3df4
AO
14206 case 1:
14207 /* beq 0x10000000 bne 0x14000000
54f4ddb3 14208 blez 0x18000000 bgtz 0x1c000000 */
4a6a3df4
AO
14209 insn ^= 0x04000000;
14210 break;
14211
14212 default:
14213 abort ();
14214 }
14215 }
14216
14217 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14218 {
14219 /* Clear the and-link bit. */
14220 assert ((insn & 0xfc1c0000) == 0x04100000);
14221
54f4ddb3
TS
14222 /* bltzal 0x04100000 bgezal 0x04110000
14223 bltzall 0x04120000 bgezall 0x04130000 */
4a6a3df4
AO
14224 insn &= ~0x00100000;
14225 }
14226
14227 /* Branch over the branch (if the branch was likely) or the
14228 full jump (not likely case). Compute the offset from the
14229 current instruction to branch to. */
14230 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14231 i = 16;
14232 else
14233 {
14234 /* How many bytes in instructions we've already emitted? */
14235 i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14236 /* How many bytes in instructions from here to the end? */
14237 i = fragp->fr_var - i;
14238 }
14239 /* Convert to instruction count. */
14240 i >>= 2;
14241 /* Branch counts from the next instruction. */
b34976b6 14242 i--;
4a6a3df4
AO
14243 insn |= i;
14244 /* Branch over the jump. */
2132e3a3 14245 md_number_to_chars ((char *) buf, insn, 4);
4a6a3df4
AO
14246 buf += 4;
14247
54f4ddb3 14248 /* nop */
2132e3a3 14249 md_number_to_chars ((char *) buf, 0, 4);
4a6a3df4
AO
14250 buf += 4;
14251
14252 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14253 {
14254 /* beql $0, $0, 2f */
14255 insn = 0x50000000;
14256 /* Compute the PC offset from the current instruction to
14257 the end of the variable frag. */
14258 /* How many bytes in instructions we've already emitted? */
14259 i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14260 /* How many bytes in instructions from here to the end? */
14261 i = fragp->fr_var - i;
14262 /* Convert to instruction count. */
14263 i >>= 2;
14264 /* Don't decrement i, because we want to branch over the
14265 delay slot. */
14266
14267 insn |= i;
2132e3a3 14268 md_number_to_chars ((char *) buf, insn, 4);
4a6a3df4
AO
14269 buf += 4;
14270
2132e3a3 14271 md_number_to_chars ((char *) buf, 0, 4);
4a6a3df4
AO
14272 buf += 4;
14273 }
14274
14275 uncond:
14276 if (mips_pic == NO_PIC)
14277 {
14278 /* j or jal. */
14279 insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
14280 ? 0x0c000000 : 0x08000000);
14281 exp.X_op = O_symbol;
14282 exp.X_add_symbol = fragp->fr_symbol;
14283 exp.X_add_number = fragp->fr_offset;
14284
14285 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
3994f87e 14286 4, &exp, FALSE, BFD_RELOC_MIPS_JMP);
4a6a3df4
AO
14287 fixp->fx_file = fragp->fr_file;
14288 fixp->fx_line = fragp->fr_line;
14289
2132e3a3 14290 md_number_to_chars ((char *) buf, insn, 4);
4a6a3df4
AO
14291 buf += 4;
14292 }
14293 else
14294 {
14295 /* lw/ld $at, <sym>($gp) R_MIPS_GOT16 */
14296 insn = HAVE_64BIT_ADDRESSES ? 0xdf810000 : 0x8f810000;
14297 exp.X_op = O_symbol;
14298 exp.X_add_symbol = fragp->fr_symbol;
14299 exp.X_add_number = fragp->fr_offset;
14300
14301 if (fragp->fr_offset)
14302 {
14303 exp.X_add_symbol = make_expr_symbol (&exp);
14304 exp.X_add_number = 0;
14305 }
14306
14307 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
3994f87e 14308 4, &exp, FALSE, BFD_RELOC_MIPS_GOT16);
4a6a3df4
AO
14309 fixp->fx_file = fragp->fr_file;
14310 fixp->fx_line = fragp->fr_line;
14311
2132e3a3 14312 md_number_to_chars ((char *) buf, insn, 4);
4a6a3df4 14313 buf += 4;
b34976b6 14314
4a6a3df4
AO
14315 if (mips_opts.isa == ISA_MIPS1)
14316 {
14317 /* nop */
2132e3a3 14318 md_number_to_chars ((char *) buf, 0, 4);
4a6a3df4
AO
14319 buf += 4;
14320 }
14321
14322 /* d/addiu $at, $at, <sym> R_MIPS_LO16 */
14323 insn = HAVE_64BIT_ADDRESSES ? 0x64210000 : 0x24210000;
14324
14325 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
3994f87e 14326 4, &exp, FALSE, BFD_RELOC_LO16);
4a6a3df4
AO
14327 fixp->fx_file = fragp->fr_file;
14328 fixp->fx_line = fragp->fr_line;
b34976b6 14329
2132e3a3 14330 md_number_to_chars ((char *) buf, insn, 4);
4a6a3df4
AO
14331 buf += 4;
14332
14333 /* j(al)r $at. */
14334 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14335 insn = 0x0020f809;
14336 else
14337 insn = 0x00200008;
14338
2132e3a3 14339 md_number_to_chars ((char *) buf, insn, 4);
4a6a3df4
AO
14340 buf += 4;
14341 }
14342 }
14343
14344 assert (buf == (bfd_byte *)fragp->fr_literal
14345 + fragp->fr_fix + fragp->fr_var);
14346
14347 fragp->fr_fix += fragp->fr_var;
14348
14349 return;
14350 }
14351
252b5132
RH
14352 if (RELAX_MIPS16_P (fragp->fr_subtype))
14353 {
14354 int type;
3994f87e 14355 const struct mips16_immed_operand *op;
b34976b6 14356 bfd_boolean small, ext;
252b5132
RH
14357 offsetT val;
14358 bfd_byte *buf;
14359 unsigned long insn;
b34976b6 14360 bfd_boolean use_extend;
252b5132
RH
14361 unsigned short extend;
14362
14363 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14364 op = mips16_immed_operands;
14365 while (op->type != type)
14366 ++op;
14367
14368 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14369 {
b34976b6
AM
14370 small = FALSE;
14371 ext = TRUE;
252b5132
RH
14372 }
14373 else
14374 {
b34976b6
AM
14375 small = TRUE;
14376 ext = FALSE;
252b5132
RH
14377 }
14378
6386f3a7 14379 resolve_symbol_value (fragp->fr_symbol);
252b5132
RH
14380 val = S_GET_VALUE (fragp->fr_symbol);
14381 if (op->pcrel)
14382 {
14383 addressT addr;
14384
14385 addr = fragp->fr_address + fragp->fr_fix;
14386
14387 /* The rules for the base address of a PC relative reloc are
14388 complicated; see mips16_extended_frag. */
14389 if (type == 'p' || type == 'q')
14390 {
14391 addr += 2;
14392 if (ext)
14393 addr += 2;
14394 /* Ignore the low bit in the target, since it will be
14395 set for a text label. */
14396 if ((val & 1) != 0)
14397 --val;
14398 }
14399 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14400 addr -= 4;
14401 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14402 addr -= 2;
14403
14404 addr &= ~ (addressT) ((1 << op->shift) - 1);
14405 val -= addr;
14406
14407 /* Make sure the section winds up with the alignment we have
14408 assumed. */
14409 if (op->shift > 0)
14410 record_alignment (asec, op->shift);
14411 }
14412
14413 if (ext
14414 && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
14415 || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
14416 as_warn_where (fragp->fr_file, fragp->fr_line,
14417 _("extended instruction in delay slot"));
14418
14419 buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
14420
14421 if (target_big_endian)
14422 insn = bfd_getb16 (buf);
14423 else
14424 insn = bfd_getl16 (buf);
14425
14426 mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
14427 RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
14428 small, ext, &insn, &use_extend, &extend);
14429
14430 if (use_extend)
14431 {
2132e3a3 14432 md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
252b5132
RH
14433 fragp->fr_fix += 2;
14434 buf += 2;
14435 }
14436
2132e3a3 14437 md_number_to_chars ((char *) buf, insn, 2);
252b5132
RH
14438 fragp->fr_fix += 2;
14439 buf += 2;
14440 }
14441 else
14442 {
4d7206a2
RS
14443 int first, second;
14444 fixS *fixp;
252b5132 14445
4d7206a2
RS
14446 first = RELAX_FIRST (fragp->fr_subtype);
14447 second = RELAX_SECOND (fragp->fr_subtype);
14448 fixp = (fixS *) fragp->fr_opcode;
252b5132 14449
584892a6
RS
14450 /* Possibly emit a warning if we've chosen the longer option. */
14451 if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
14452 == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
14453 {
14454 const char *msg = macro_warning (fragp->fr_subtype);
14455 if (msg != 0)
14456 as_warn_where (fragp->fr_file, fragp->fr_line, msg);
14457 }
14458
4d7206a2
RS
14459 /* Go through all the fixups for the first sequence. Disable them
14460 (by marking them as done) if we're going to use the second
14461 sequence instead. */
14462 while (fixp
14463 && fixp->fx_frag == fragp
14464 && fixp->fx_where < fragp->fr_fix - second)
14465 {
14466 if (fragp->fr_subtype & RELAX_USE_SECOND)
14467 fixp->fx_done = 1;
14468 fixp = fixp->fx_next;
14469 }
252b5132 14470
4d7206a2
RS
14471 /* Go through the fixups for the second sequence. Disable them if
14472 we're going to use the first sequence, otherwise adjust their
14473 addresses to account for the relaxation. */
14474 while (fixp && fixp->fx_frag == fragp)
14475 {
14476 if (fragp->fr_subtype & RELAX_USE_SECOND)
14477 fixp->fx_where -= first;
14478 else
14479 fixp->fx_done = 1;
14480 fixp = fixp->fx_next;
14481 }
14482
14483 /* Now modify the frag contents. */
14484 if (fragp->fr_subtype & RELAX_USE_SECOND)
14485 {
14486 char *start;
14487
14488 start = fragp->fr_literal + fragp->fr_fix - first - second;
14489 memmove (start, start + first, second);
14490 fragp->fr_fix -= first;
14491 }
14492 else
14493 fragp->fr_fix -= second;
252b5132
RH
14494 }
14495}
14496
14497#ifdef OBJ_ELF
14498
14499/* This function is called after the relocs have been generated.
14500 We've been storing mips16 text labels as odd. Here we convert them
14501 back to even for the convenience of the debugger. */
14502
14503void
17a2f251 14504mips_frob_file_after_relocs (void)
252b5132
RH
14505{
14506 asymbol **syms;
14507 unsigned int count, i;
14508
f43abd2b 14509 if (!IS_ELF)
252b5132
RH
14510 return;
14511
14512 syms = bfd_get_outsymbols (stdoutput);
14513 count = bfd_get_symcount (stdoutput);
14514 for (i = 0; i < count; i++, syms++)
14515 {
30c09090 14516 if (ELF_ST_IS_MIPS16 (elf_symbol (*syms)->internal_elf_sym.st_other)
252b5132
RH
14517 && ((*syms)->value & 1) != 0)
14518 {
14519 (*syms)->value &= ~1;
14520 /* If the symbol has an odd size, it was probably computed
14521 incorrectly, so adjust that as well. */
14522 if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
14523 ++elf_symbol (*syms)->internal_elf_sym.st_size;
14524 }
14525 }
14526}
14527
14528#endif
14529
14530/* This function is called whenever a label is defined. It is used
14531 when handling branch delays; if a branch has a label, we assume we
14532 can not move it. */
14533
14534void
17a2f251 14535mips_define_label (symbolS *sym)
252b5132 14536{
a8dbcb85 14537 segment_info_type *si = seg_info (now_seg);
252b5132
RH
14538 struct insn_label_list *l;
14539
14540 if (free_insn_labels == NULL)
14541 l = (struct insn_label_list *) xmalloc (sizeof *l);
14542 else
14543 {
14544 l = free_insn_labels;
14545 free_insn_labels = l->next;
14546 }
14547
14548 l->label = sym;
a8dbcb85
TS
14549 l->next = si->label_list;
14550 si->label_list = l;
07a53e5c
RH
14551
14552#ifdef OBJ_ELF
14553 dwarf2_emit_label (sym);
14554#endif
252b5132
RH
14555}
14556\f
14557#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14558
14559/* Some special processing for a MIPS ELF file. */
14560
14561void
17a2f251 14562mips_elf_final_processing (void)
252b5132
RH
14563{
14564 /* Write out the register information. */
316f5878 14565 if (mips_abi != N64_ABI)
252b5132
RH
14566 {
14567 Elf32_RegInfo s;
14568
14569 s.ri_gprmask = mips_gprmask;
14570 s.ri_cprmask[0] = mips_cprmask[0];
14571 s.ri_cprmask[1] = mips_cprmask[1];
14572 s.ri_cprmask[2] = mips_cprmask[2];
14573 s.ri_cprmask[3] = mips_cprmask[3];
14574 /* The gp_value field is set by the MIPS ELF backend. */
14575
14576 bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
14577 ((Elf32_External_RegInfo *)
14578 mips_regmask_frag));
14579 }
14580 else
14581 {
14582 Elf64_Internal_RegInfo s;
14583
14584 s.ri_gprmask = mips_gprmask;
14585 s.ri_pad = 0;
14586 s.ri_cprmask[0] = mips_cprmask[0];
14587 s.ri_cprmask[1] = mips_cprmask[1];
14588 s.ri_cprmask[2] = mips_cprmask[2];
14589 s.ri_cprmask[3] = mips_cprmask[3];
14590 /* The gp_value field is set by the MIPS ELF backend. */
14591
14592 bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
14593 ((Elf64_External_RegInfo *)
14594 mips_regmask_frag));
14595 }
14596
14597 /* Set the MIPS ELF flag bits. FIXME: There should probably be some
14598 sort of BFD interface for this. */
14599 if (mips_any_noreorder)
14600 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
14601 if (mips_pic != NO_PIC)
143d77c5 14602 {
252b5132 14603 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
143d77c5
EC
14604 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14605 }
14606 if (mips_abicalls)
14607 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
252b5132 14608
98d3f06f 14609 /* Set MIPS ELF flags for ASEs. */
74cd071d
CF
14610 /* We may need to define a new flag for DSP ASE, and set this flag when
14611 file_ase_dsp is true. */
8b082fb1 14612 /* Same for DSP R2. */
ef2e4d86
CF
14613 /* We may need to define a new flag for MT ASE, and set this flag when
14614 file_ase_mt is true. */
a4672219
TS
14615 if (file_ase_mips16)
14616 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
1f25f5d3
CD
14617#if 0 /* XXX FIXME */
14618 if (file_ase_mips3d)
14619 elf_elfheader (stdoutput)->e_flags |= ???;
14620#endif
deec1734
CD
14621 if (file_ase_mdmx)
14622 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
1f25f5d3 14623
bdaaa2e1 14624 /* Set the MIPS ELF ABI flags. */
316f5878 14625 if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
252b5132 14626 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
316f5878 14627 else if (mips_abi == O64_ABI)
252b5132 14628 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
316f5878 14629 else if (mips_abi == EABI_ABI)
252b5132 14630 {
316f5878 14631 if (!file_mips_gp32)
252b5132
RH
14632 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
14633 else
14634 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
14635 }
316f5878 14636 else if (mips_abi == N32_ABI)
be00bddd
TS
14637 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
14638
c9914766 14639 /* Nothing to do for N64_ABI. */
252b5132
RH
14640
14641 if (mips_32bitmode)
14642 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
ad3fea08
TS
14643
14644#if 0 /* XXX FIXME */
14645 /* 32 bit code with 64 bit FP registers. */
14646 if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
14647 elf_elfheader (stdoutput)->e_flags |= ???;
14648#endif
252b5132
RH
14649}
14650
14651#endif /* OBJ_ELF || OBJ_MAYBE_ELF */
14652\f
beae10d5 14653typedef struct proc {
9b2f1d35
EC
14654 symbolS *func_sym;
14655 symbolS *func_end_sym;
beae10d5
KH
14656 unsigned long reg_mask;
14657 unsigned long reg_offset;
14658 unsigned long fpreg_mask;
14659 unsigned long fpreg_offset;
14660 unsigned long frame_offset;
14661 unsigned long frame_reg;
14662 unsigned long pc_reg;
14663} procS;
252b5132
RH
14664
14665static procS cur_proc;
14666static procS *cur_proc_ptr;
14667static int numprocs;
14668
742a56fe
RS
14669/* Implement NOP_OPCODE. We encode a MIPS16 nop as "1" and a normal
14670 nop as "0". */
14671
14672char
14673mips_nop_opcode (void)
14674{
14675 return seg_info (now_seg)->tc_segment_info_data.mips16;
14676}
14677
14678/* Fill in an rs_align_code fragment. This only needs to do something
14679 for MIPS16 code, where 0 is not a nop. */
a19d8eb0 14680
0a9ef439 14681void
17a2f251 14682mips_handle_align (fragS *fragp)
a19d8eb0 14683{
742a56fe
RS
14684 char *p;
14685
0a9ef439
RH
14686 if (fragp->fr_type != rs_align_code)
14687 return;
14688
742a56fe
RS
14689 p = fragp->fr_literal + fragp->fr_fix;
14690 if (*p)
a19d8eb0 14691 {
0a9ef439 14692 int bytes;
a19d8eb0 14693
0a9ef439 14694 bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
0a9ef439
RH
14695 if (bytes & 1)
14696 {
14697 *p++ = 0;
f9419b05 14698 fragp->fr_fix++;
0a9ef439 14699 }
742a56fe 14700 md_number_to_chars (p, mips16_nop_insn.insn_opcode, 2);
0a9ef439 14701 fragp->fr_var = 2;
a19d8eb0 14702 }
a19d8eb0
CP
14703}
14704
252b5132 14705static void
17a2f251 14706md_obj_begin (void)
252b5132
RH
14707{
14708}
14709
14710static void
17a2f251 14711md_obj_end (void)
252b5132 14712{
54f4ddb3 14713 /* Check for premature end, nesting errors, etc. */
252b5132 14714 if (cur_proc_ptr)
9a41af64 14715 as_warn (_("missing .end at end of assembly"));
252b5132
RH
14716}
14717
14718static long
17a2f251 14719get_number (void)
252b5132
RH
14720{
14721 int negative = 0;
14722 long val = 0;
14723
14724 if (*input_line_pointer == '-')
14725 {
14726 ++input_line_pointer;
14727 negative = 1;
14728 }
3882b010 14729 if (!ISDIGIT (*input_line_pointer))
956cd1d6 14730 as_bad (_("expected simple number"));
252b5132
RH
14731 if (input_line_pointer[0] == '0')
14732 {
14733 if (input_line_pointer[1] == 'x')
14734 {
14735 input_line_pointer += 2;
3882b010 14736 while (ISXDIGIT (*input_line_pointer))
252b5132
RH
14737 {
14738 val <<= 4;
14739 val |= hex_value (*input_line_pointer++);
14740 }
14741 return negative ? -val : val;
14742 }
14743 else
14744 {
14745 ++input_line_pointer;
3882b010 14746 while (ISDIGIT (*input_line_pointer))
252b5132
RH
14747 {
14748 val <<= 3;
14749 val |= *input_line_pointer++ - '0';
14750 }
14751 return negative ? -val : val;
14752 }
14753 }
3882b010 14754 if (!ISDIGIT (*input_line_pointer))
252b5132
RH
14755 {
14756 printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
14757 *input_line_pointer, *input_line_pointer);
956cd1d6 14758 as_warn (_("invalid number"));
252b5132
RH
14759 return -1;
14760 }
3882b010 14761 while (ISDIGIT (*input_line_pointer))
252b5132
RH
14762 {
14763 val *= 10;
14764 val += *input_line_pointer++ - '0';
14765 }
14766 return negative ? -val : val;
14767}
14768
14769/* The .file directive; just like the usual .file directive, but there
c5dd6aab
DJ
14770 is an initial number which is the ECOFF file index. In the non-ECOFF
14771 case .file implies DWARF-2. */
14772
14773static void
17a2f251 14774s_mips_file (int x ATTRIBUTE_UNUSED)
c5dd6aab 14775{
ecb4347a
DJ
14776 static int first_file_directive = 0;
14777
c5dd6aab
DJ
14778 if (ECOFF_DEBUGGING)
14779 {
14780 get_number ();
14781 s_app_file (0);
14782 }
14783 else
ecb4347a
DJ
14784 {
14785 char *filename;
14786
14787 filename = dwarf2_directive_file (0);
14788
14789 /* Versions of GCC up to 3.1 start files with a ".file"
14790 directive even for stabs output. Make sure that this
14791 ".file" is handled. Note that you need a version of GCC
14792 after 3.1 in order to support DWARF-2 on MIPS. */
14793 if (filename != NULL && ! first_file_directive)
14794 {
14795 (void) new_logical_line (filename, -1);
c04f5787 14796 s_app_file_string (filename, 0);
ecb4347a
DJ
14797 }
14798 first_file_directive = 1;
14799 }
c5dd6aab
DJ
14800}
14801
14802/* The .loc directive, implying DWARF-2. */
252b5132
RH
14803
14804static void
17a2f251 14805s_mips_loc (int x ATTRIBUTE_UNUSED)
252b5132 14806{
c5dd6aab
DJ
14807 if (!ECOFF_DEBUGGING)
14808 dwarf2_directive_loc (0);
252b5132
RH
14809}
14810
252b5132
RH
14811/* The .end directive. */
14812
14813static void
17a2f251 14814s_mips_end (int x ATTRIBUTE_UNUSED)
252b5132
RH
14815{
14816 symbolS *p;
252b5132 14817
7a621144
DJ
14818 /* Following functions need their own .frame and .cprestore directives. */
14819 mips_frame_reg_valid = 0;
14820 mips_cprestore_valid = 0;
14821
252b5132
RH
14822 if (!is_end_of_line[(unsigned char) *input_line_pointer])
14823 {
14824 p = get_symbol ();
14825 demand_empty_rest_of_line ();
14826 }
14827 else
14828 p = NULL;
14829
14949570 14830 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
252b5132
RH
14831 as_warn (_(".end not in text section"));
14832
14833 if (!cur_proc_ptr)
14834 {
14835 as_warn (_(".end directive without a preceding .ent directive."));
14836 demand_empty_rest_of_line ();
14837 return;
14838 }
14839
14840 if (p != NULL)
14841 {
14842 assert (S_GET_NAME (p));
9b2f1d35 14843 if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
252b5132 14844 as_warn (_(".end symbol does not match .ent symbol."));
ecb4347a
DJ
14845
14846 if (debug_type == DEBUG_STABS)
14847 stabs_generate_asm_endfunc (S_GET_NAME (p),
14848 S_GET_NAME (p));
252b5132
RH
14849 }
14850 else
14851 as_warn (_(".end directive missing or unknown symbol"));
14852
2132e3a3 14853#ifdef OBJ_ELF
9b2f1d35
EC
14854 /* Create an expression to calculate the size of the function. */
14855 if (p && cur_proc_ptr)
14856 {
14857 OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
14858 expressionS *exp = xmalloc (sizeof (expressionS));
14859
14860 obj->size = exp;
14861 exp->X_op = O_subtract;
14862 exp->X_add_symbol = symbol_temp_new_now ();
14863 exp->X_op_symbol = p;
14864 exp->X_add_number = 0;
14865
14866 cur_proc_ptr->func_end_sym = exp->X_add_symbol;
14867 }
14868
ecb4347a 14869 /* Generate a .pdr section. */
f43abd2b 14870 if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
ecb4347a
DJ
14871 {
14872 segT saved_seg = now_seg;
14873 subsegT saved_subseg = now_subseg;
14874 valueT dot;
14875 expressionS exp;
14876 char *fragp;
252b5132 14877
ecb4347a 14878 dot = frag_now_fix ();
252b5132
RH
14879
14880#ifdef md_flush_pending_output
ecb4347a 14881 md_flush_pending_output ();
252b5132
RH
14882#endif
14883
ecb4347a
DJ
14884 assert (pdr_seg);
14885 subseg_set (pdr_seg, 0);
252b5132 14886
ecb4347a
DJ
14887 /* Write the symbol. */
14888 exp.X_op = O_symbol;
14889 exp.X_add_symbol = p;
14890 exp.X_add_number = 0;
14891 emit_expr (&exp, 4);
252b5132 14892
ecb4347a 14893 fragp = frag_more (7 * 4);
252b5132 14894
17a2f251
TS
14895 md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
14896 md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
14897 md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
14898 md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
14899 md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
14900 md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
14901 md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
252b5132 14902
ecb4347a
DJ
14903 subseg_set (saved_seg, saved_subseg);
14904 }
14905#endif /* OBJ_ELF */
252b5132
RH
14906
14907 cur_proc_ptr = NULL;
14908}
14909
14910/* The .aent and .ent directives. */
14911
14912static void
17a2f251 14913s_mips_ent (int aent)
252b5132 14914{
252b5132 14915 symbolS *symbolP;
252b5132
RH
14916
14917 symbolP = get_symbol ();
14918 if (*input_line_pointer == ',')
f9419b05 14919 ++input_line_pointer;
252b5132 14920 SKIP_WHITESPACE ();
3882b010 14921 if (ISDIGIT (*input_line_pointer)
d9a62219 14922 || *input_line_pointer == '-')
874e8986 14923 get_number ();
252b5132 14924
14949570 14925 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
252b5132
RH
14926 as_warn (_(".ent or .aent not in text section."));
14927
14928 if (!aent && cur_proc_ptr)
9a41af64 14929 as_warn (_("missing .end"));
252b5132
RH
14930
14931 if (!aent)
14932 {
7a621144
DJ
14933 /* This function needs its own .frame and .cprestore directives. */
14934 mips_frame_reg_valid = 0;
14935 mips_cprestore_valid = 0;
14936
252b5132
RH
14937 cur_proc_ptr = &cur_proc;
14938 memset (cur_proc_ptr, '\0', sizeof (procS));
14939
9b2f1d35 14940 cur_proc_ptr->func_sym = symbolP;
252b5132 14941
49309057 14942 symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
252b5132 14943
f9419b05 14944 ++numprocs;
ecb4347a
DJ
14945
14946 if (debug_type == DEBUG_STABS)
14947 stabs_generate_asm_func (S_GET_NAME (symbolP),
14948 S_GET_NAME (symbolP));
252b5132
RH
14949 }
14950
14951 demand_empty_rest_of_line ();
14952}
14953
14954/* The .frame directive. If the mdebug section is present (IRIX 5 native)
bdaaa2e1 14955 then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
252b5132 14956 s_mips_frame is used so that we can set the PDR information correctly.
bdaaa2e1 14957 We can't use the ecoff routines because they make reference to the ecoff
252b5132
RH
14958 symbol table (in the mdebug section). */
14959
14960static void
17a2f251 14961s_mips_frame (int ignore ATTRIBUTE_UNUSED)
252b5132 14962{
ecb4347a 14963#ifdef OBJ_ELF
f43abd2b 14964 if (IS_ELF && !ECOFF_DEBUGGING)
ecb4347a
DJ
14965 {
14966 long val;
252b5132 14967
ecb4347a
DJ
14968 if (cur_proc_ptr == (procS *) NULL)
14969 {
14970 as_warn (_(".frame outside of .ent"));
14971 demand_empty_rest_of_line ();
14972 return;
14973 }
252b5132 14974
ecb4347a
DJ
14975 cur_proc_ptr->frame_reg = tc_get_register (1);
14976
14977 SKIP_WHITESPACE ();
14978 if (*input_line_pointer++ != ','
14979 || get_absolute_expression_and_terminator (&val) != ',')
14980 {
14981 as_warn (_("Bad .frame directive"));
14982 --input_line_pointer;
14983 demand_empty_rest_of_line ();
14984 return;
14985 }
252b5132 14986
ecb4347a
DJ
14987 cur_proc_ptr->frame_offset = val;
14988 cur_proc_ptr->pc_reg = tc_get_register (0);
252b5132 14989
252b5132 14990 demand_empty_rest_of_line ();
252b5132 14991 }
ecb4347a
DJ
14992 else
14993#endif /* OBJ_ELF */
14994 s_ignore (ignore);
252b5132
RH
14995}
14996
bdaaa2e1
KH
14997/* The .fmask and .mask directives. If the mdebug section is present
14998 (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
252b5132 14999 embedded targets, s_mips_mask is used so that we can set the PDR
bdaaa2e1 15000 information correctly. We can't use the ecoff routines because they
252b5132
RH
15001 make reference to the ecoff symbol table (in the mdebug section). */
15002
15003static void
17a2f251 15004s_mips_mask (int reg_type)
252b5132 15005{
ecb4347a 15006#ifdef OBJ_ELF
f43abd2b 15007 if (IS_ELF && !ECOFF_DEBUGGING)
252b5132 15008 {
ecb4347a 15009 long mask, off;
252b5132 15010
ecb4347a
DJ
15011 if (cur_proc_ptr == (procS *) NULL)
15012 {
15013 as_warn (_(".mask/.fmask outside of .ent"));
15014 demand_empty_rest_of_line ();
15015 return;
15016 }
252b5132 15017
ecb4347a
DJ
15018 if (get_absolute_expression_and_terminator (&mask) != ',')
15019 {
15020 as_warn (_("Bad .mask/.fmask directive"));
15021 --input_line_pointer;
15022 demand_empty_rest_of_line ();
15023 return;
15024 }
252b5132 15025
ecb4347a
DJ
15026 off = get_absolute_expression ();
15027
15028 if (reg_type == 'F')
15029 {
15030 cur_proc_ptr->fpreg_mask = mask;
15031 cur_proc_ptr->fpreg_offset = off;
15032 }
15033 else
15034 {
15035 cur_proc_ptr->reg_mask = mask;
15036 cur_proc_ptr->reg_offset = off;
15037 }
15038
15039 demand_empty_rest_of_line ();
252b5132
RH
15040 }
15041 else
ecb4347a
DJ
15042#endif /* OBJ_ELF */
15043 s_ignore (reg_type);
252b5132
RH
15044}
15045
316f5878
RS
15046/* A table describing all the processors gas knows about. Names are
15047 matched in the order listed.
e7af610e 15048
316f5878
RS
15049 To ease comparison, please keep this table in the same order as
15050 gcc's mips_cpu_info_table[]. */
e972090a
NC
15051static const struct mips_cpu_info mips_cpu_info_table[] =
15052{
316f5878 15053 /* Entries for generic ISAs */
ad3fea08
TS
15054 { "mips1", MIPS_CPU_IS_ISA, ISA_MIPS1, CPU_R3000 },
15055 { "mips2", MIPS_CPU_IS_ISA, ISA_MIPS2, CPU_R6000 },
15056 { "mips3", MIPS_CPU_IS_ISA, ISA_MIPS3, CPU_R4000 },
15057 { "mips4", MIPS_CPU_IS_ISA, ISA_MIPS4, CPU_R8000 },
15058 { "mips5", MIPS_CPU_IS_ISA, ISA_MIPS5, CPU_MIPS5 },
15059 { "mips32", MIPS_CPU_IS_ISA, ISA_MIPS32, CPU_MIPS32 },
15060 { "mips32r2", MIPS_CPU_IS_ISA, ISA_MIPS32R2, CPU_MIPS32R2 },
15061 { "mips64", MIPS_CPU_IS_ISA, ISA_MIPS64, CPU_MIPS64 },
15062 { "mips64r2", MIPS_CPU_IS_ISA, ISA_MIPS64R2, CPU_MIPS64R2 },
316f5878
RS
15063
15064 /* MIPS I */
ad3fea08
TS
15065 { "r3000", 0, ISA_MIPS1, CPU_R3000 },
15066 { "r2000", 0, ISA_MIPS1, CPU_R3000 },
15067 { "r3900", 0, ISA_MIPS1, CPU_R3900 },
316f5878
RS
15068
15069 /* MIPS II */
ad3fea08 15070 { "r6000", 0, ISA_MIPS2, CPU_R6000 },
316f5878
RS
15071
15072 /* MIPS III */
ad3fea08
TS
15073 { "r4000", 0, ISA_MIPS3, CPU_R4000 },
15074 { "r4010", 0, ISA_MIPS2, CPU_R4010 },
15075 { "vr4100", 0, ISA_MIPS3, CPU_VR4100 },
15076 { "vr4111", 0, ISA_MIPS3, CPU_R4111 },
15077 { "vr4120", 0, ISA_MIPS3, CPU_VR4120 },
15078 { "vr4130", 0, ISA_MIPS3, CPU_VR4120 },
15079 { "vr4181", 0, ISA_MIPS3, CPU_R4111 },
15080 { "vr4300", 0, ISA_MIPS3, CPU_R4300 },
15081 { "r4400", 0, ISA_MIPS3, CPU_R4400 },
15082 { "r4600", 0, ISA_MIPS3, CPU_R4600 },
15083 { "orion", 0, ISA_MIPS3, CPU_R4600 },
15084 { "r4650", 0, ISA_MIPS3, CPU_R4650 },
b15591bb
AN
15085 /* ST Microelectronics Loongson 2E and 2F cores */
15086 { "loongson2e", 0, ISA_MIPS3, CPU_LOONGSON_2E },
15087 { "loongson2f", 0, ISA_MIPS3, CPU_LOONGSON_2F },
316f5878
RS
15088
15089 /* MIPS IV */
ad3fea08
TS
15090 { "r8000", 0, ISA_MIPS4, CPU_R8000 },
15091 { "r10000", 0, ISA_MIPS4, CPU_R10000 },
15092 { "r12000", 0, ISA_MIPS4, CPU_R12000 },
15093 { "vr5000", 0, ISA_MIPS4, CPU_R5000 },
15094 { "vr5400", 0, ISA_MIPS4, CPU_VR5400 },
15095 { "vr5500", 0, ISA_MIPS4, CPU_VR5500 },
15096 { "rm5200", 0, ISA_MIPS4, CPU_R5000 },
15097 { "rm5230", 0, ISA_MIPS4, CPU_R5000 },
15098 { "rm5231", 0, ISA_MIPS4, CPU_R5000 },
15099 { "rm5261", 0, ISA_MIPS4, CPU_R5000 },
15100 { "rm5721", 0, ISA_MIPS4, CPU_R5000 },
15101 { "rm7000", 0, ISA_MIPS4, CPU_RM7000 },
15102 { "rm9000", 0, ISA_MIPS4, CPU_RM9000 },
316f5878
RS
15103
15104 /* MIPS 32 */
ad3fea08
TS
15105 { "4kc", 0, ISA_MIPS32, CPU_MIPS32 },
15106 { "4km", 0, ISA_MIPS32, CPU_MIPS32 },
15107 { "4kp", 0, ISA_MIPS32, CPU_MIPS32 },
15108 { "4ksc", MIPS_CPU_ASE_SMARTMIPS, ISA_MIPS32, CPU_MIPS32 },
15109
15110 /* MIPS 32 Release 2 */
15111 { "4kec", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15112 { "4kem", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15113 { "4kep", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15114 { "4ksd", MIPS_CPU_ASE_SMARTMIPS, ISA_MIPS32R2, CPU_MIPS32R2 },
15115 { "m4k", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15116 { "m4kp", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
ad3fea08 15117 { "24kc", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
0fdf1951 15118 { "24kf2_1", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
ad3fea08 15119 { "24kf", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
0fdf1951
RS
15120 { "24kf1_1", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15121 /* Deprecated forms of the above. */
15122 { "24kfx", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
ad3fea08 15123 { "24kx", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
01fd108f 15124 /* 24KE is a 24K with DSP ASE, other ASEs are optional. */
ad3fea08 15125 { "24kec", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
0fdf1951 15126 { "24kef2_1", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
ad3fea08 15127 { "24kef", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
0fdf1951
RS
15128 { "24kef1_1", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
15129 /* Deprecated forms of the above. */
15130 { "24kefx", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
65263ce3 15131 { "24kex", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
01fd108f 15132 /* 34K is a 24K with DSP and MT ASE, other ASEs are optional. */
a360e743
TS
15133 { "34kc", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15134 ISA_MIPS32R2, CPU_MIPS32R2 },
0fdf1951
RS
15135 { "34kf2_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15136 ISA_MIPS32R2, CPU_MIPS32R2 },
a360e743
TS
15137 { "34kf", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15138 ISA_MIPS32R2, CPU_MIPS32R2 },
0fdf1951
RS
15139 { "34kf1_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15140 ISA_MIPS32R2, CPU_MIPS32R2 },
15141 /* Deprecated forms of the above. */
15142 { "34kfx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15143 ISA_MIPS32R2, CPU_MIPS32R2 },
a360e743
TS
15144 { "34kx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15145 ISA_MIPS32R2, CPU_MIPS32R2 },
01fd108f
TS
15146 /* 74K with DSP and DSPR2 ASE, other ASEs are optional. */
15147 { "74kc", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15148 ISA_MIPS32R2, CPU_MIPS32R2 },
0fdf1951
RS
15149 { "74kf2_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15150 ISA_MIPS32R2, CPU_MIPS32R2 },
01fd108f
TS
15151 { "74kf", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15152 ISA_MIPS32R2, CPU_MIPS32R2 },
0fdf1951
RS
15153 { "74kf1_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15154 ISA_MIPS32R2, CPU_MIPS32R2 },
15155 { "74kf3_2", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15156 ISA_MIPS32R2, CPU_MIPS32R2 },
15157 /* Deprecated forms of the above. */
15158 { "74kfx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15159 ISA_MIPS32R2, CPU_MIPS32R2 },
01fd108f
TS
15160 { "74kx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15161 ISA_MIPS32R2, CPU_MIPS32R2 },
32b26a03 15162
316f5878 15163 /* MIPS 64 */
ad3fea08
TS
15164 { "5kc", 0, ISA_MIPS64, CPU_MIPS64 },
15165 { "5kf", 0, ISA_MIPS64, CPU_MIPS64 },
15166 { "20kc", MIPS_CPU_ASE_MIPS3D, ISA_MIPS64, CPU_MIPS64 },
7764b395 15167 { "25kf", MIPS_CPU_ASE_MIPS3D, ISA_MIPS64, CPU_MIPS64 },
ad3fea08 15168
c7a23324 15169 /* Broadcom SB-1 CPU core */
65263ce3
TS
15170 { "sb1", MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15171 ISA_MIPS64, CPU_SB1 },
1e85aad8
JW
15172 /* Broadcom SB-1A CPU core */
15173 { "sb1a", MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15174 ISA_MIPS64, CPU_SB1 },
e7af610e 15175
ed163775
MR
15176 /* MIPS 64 Release 2 */
15177
967344c6
AN
15178 /* Cavium Networks Octeon CPU core */
15179 { "octeon", 0, ISA_MIPS64R2, CPU_OCTEON },
15180
316f5878
RS
15181 /* End marker */
15182 { NULL, 0, 0, 0 }
15183};
e7af610e 15184
84ea6cf2 15185
316f5878
RS
15186/* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
15187 with a final "000" replaced by "k". Ignore case.
e7af610e 15188
316f5878 15189 Note: this function is shared between GCC and GAS. */
c6c98b38 15190
b34976b6 15191static bfd_boolean
17a2f251 15192mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
316f5878
RS
15193{
15194 while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
15195 given++, canonical++;
15196
15197 return ((*given == 0 && *canonical == 0)
15198 || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
15199}
15200
15201
15202/* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
15203 CPU name. We've traditionally allowed a lot of variation here.
15204
15205 Note: this function is shared between GCC and GAS. */
15206
b34976b6 15207static bfd_boolean
17a2f251 15208mips_matching_cpu_name_p (const char *canonical, const char *given)
316f5878
RS
15209{
15210 /* First see if the name matches exactly, or with a final "000"
15211 turned into "k". */
15212 if (mips_strict_matching_cpu_name_p (canonical, given))
b34976b6 15213 return TRUE;
316f5878
RS
15214
15215 /* If not, try comparing based on numerical designation alone.
15216 See if GIVEN is an unadorned number, or 'r' followed by a number. */
15217 if (TOLOWER (*given) == 'r')
15218 given++;
15219 if (!ISDIGIT (*given))
b34976b6 15220 return FALSE;
316f5878
RS
15221
15222 /* Skip over some well-known prefixes in the canonical name,
15223 hoping to find a number there too. */
15224 if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
15225 canonical += 2;
15226 else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
15227 canonical += 2;
15228 else if (TOLOWER (canonical[0]) == 'r')
15229 canonical += 1;
15230
15231 return mips_strict_matching_cpu_name_p (canonical, given);
15232}
15233
15234
15235/* Parse an option that takes the name of a processor as its argument.
15236 OPTION is the name of the option and CPU_STRING is the argument.
15237 Return the corresponding processor enumeration if the CPU_STRING is
15238 recognized, otherwise report an error and return null.
15239
15240 A similar function exists in GCC. */
e7af610e
NC
15241
15242static const struct mips_cpu_info *
17a2f251 15243mips_parse_cpu (const char *option, const char *cpu_string)
e7af610e 15244{
316f5878 15245 const struct mips_cpu_info *p;
e7af610e 15246
316f5878
RS
15247 /* 'from-abi' selects the most compatible architecture for the given
15248 ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs. For the
15249 EABIs, we have to decide whether we're using the 32-bit or 64-bit
15250 version. Look first at the -mgp options, if given, otherwise base
15251 the choice on MIPS_DEFAULT_64BIT.
e7af610e 15252
316f5878
RS
15253 Treat NO_ABI like the EABIs. One reason to do this is that the
15254 plain 'mips' and 'mips64' configs have 'from-abi' as their default
15255 architecture. This code picks MIPS I for 'mips' and MIPS III for
15256 'mips64', just as we did in the days before 'from-abi'. */
15257 if (strcasecmp (cpu_string, "from-abi") == 0)
15258 {
15259 if (ABI_NEEDS_32BIT_REGS (mips_abi))
15260 return mips_cpu_info_from_isa (ISA_MIPS1);
15261
15262 if (ABI_NEEDS_64BIT_REGS (mips_abi))
15263 return mips_cpu_info_from_isa (ISA_MIPS3);
15264
15265 if (file_mips_gp32 >= 0)
15266 return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
15267
15268 return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
15269 ? ISA_MIPS3
15270 : ISA_MIPS1);
15271 }
15272
15273 /* 'default' has traditionally been a no-op. Probably not very useful. */
15274 if (strcasecmp (cpu_string, "default") == 0)
15275 return 0;
15276
15277 for (p = mips_cpu_info_table; p->name != 0; p++)
15278 if (mips_matching_cpu_name_p (p->name, cpu_string))
15279 return p;
15280
15281 as_bad ("Bad value (%s) for %s", cpu_string, option);
15282 return 0;
e7af610e
NC
15283}
15284
316f5878
RS
15285/* Return the canonical processor information for ISA (a member of the
15286 ISA_MIPS* enumeration). */
15287
e7af610e 15288static const struct mips_cpu_info *
17a2f251 15289mips_cpu_info_from_isa (int isa)
e7af610e
NC
15290{
15291 int i;
15292
15293 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
ad3fea08 15294 if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
316f5878 15295 && isa == mips_cpu_info_table[i].isa)
e7af610e
NC
15296 return (&mips_cpu_info_table[i]);
15297
e972090a 15298 return NULL;
e7af610e 15299}
fef14a42
TS
15300
15301static const struct mips_cpu_info *
17a2f251 15302mips_cpu_info_from_arch (int arch)
fef14a42
TS
15303{
15304 int i;
15305
15306 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15307 if (arch == mips_cpu_info_table[i].cpu)
15308 return (&mips_cpu_info_table[i]);
15309
15310 return NULL;
15311}
316f5878
RS
15312\f
15313static void
17a2f251 15314show (FILE *stream, const char *string, int *col_p, int *first_p)
316f5878
RS
15315{
15316 if (*first_p)
15317 {
15318 fprintf (stream, "%24s", "");
15319 *col_p = 24;
15320 }
15321 else
15322 {
15323 fprintf (stream, ", ");
15324 *col_p += 2;
15325 }
e7af610e 15326
316f5878
RS
15327 if (*col_p + strlen (string) > 72)
15328 {
15329 fprintf (stream, "\n%24s", "");
15330 *col_p = 24;
15331 }
15332
15333 fprintf (stream, "%s", string);
15334 *col_p += strlen (string);
15335
15336 *first_p = 0;
15337}
15338
15339void
17a2f251 15340md_show_usage (FILE *stream)
e7af610e 15341{
316f5878
RS
15342 int column, first;
15343 size_t i;
15344
15345 fprintf (stream, _("\
15346MIPS options:\n\
316f5878
RS
15347-EB generate big endian output\n\
15348-EL generate little endian output\n\
15349-g, -g2 do not remove unneeded NOPs or swap branches\n\
15350-G NUM allow referencing objects up to NUM bytes\n\
15351 implicitly with the gp register [default 8]\n"));
15352 fprintf (stream, _("\
15353-mips1 generate MIPS ISA I instructions\n\
15354-mips2 generate MIPS ISA II instructions\n\
15355-mips3 generate MIPS ISA III instructions\n\
15356-mips4 generate MIPS ISA IV instructions\n\
15357-mips5 generate MIPS ISA V instructions\n\
15358-mips32 generate MIPS32 ISA instructions\n\
af7ee8bf 15359-mips32r2 generate MIPS32 release 2 ISA instructions\n\
316f5878 15360-mips64 generate MIPS64 ISA instructions\n\
5f74bc13 15361-mips64r2 generate MIPS64 release 2 ISA instructions\n\
316f5878
RS
15362-march=CPU/-mtune=CPU generate code/schedule for CPU, where CPU is one of:\n"));
15363
15364 first = 1;
e7af610e
NC
15365
15366 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
316f5878
RS
15367 show (stream, mips_cpu_info_table[i].name, &column, &first);
15368 show (stream, "from-abi", &column, &first);
15369 fputc ('\n', stream);
e7af610e 15370
316f5878
RS
15371 fprintf (stream, _("\
15372-mCPU equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
15373-no-mCPU don't generate code specific to CPU.\n\
15374 For -mCPU and -no-mCPU, CPU must be one of:\n"));
15375
15376 first = 1;
15377
15378 show (stream, "3900", &column, &first);
15379 show (stream, "4010", &column, &first);
15380 show (stream, "4100", &column, &first);
15381 show (stream, "4650", &column, &first);
15382 fputc ('\n', stream);
15383
15384 fprintf (stream, _("\
15385-mips16 generate mips16 instructions\n\
15386-no-mips16 do not generate mips16 instructions\n"));
15387 fprintf (stream, _("\
e16bfa71
TS
15388-msmartmips generate smartmips instructions\n\
15389-mno-smartmips do not generate smartmips instructions\n"));
15390 fprintf (stream, _("\
74cd071d
CF
15391-mdsp generate DSP instructions\n\
15392-mno-dsp do not generate DSP instructions\n"));
15393 fprintf (stream, _("\
8b082fb1
TS
15394-mdspr2 generate DSP R2 instructions\n\
15395-mno-dspr2 do not generate DSP R2 instructions\n"));
15396 fprintf (stream, _("\
ef2e4d86
CF
15397-mmt generate MT instructions\n\
15398-mno-mt do not generate MT instructions\n"));
15399 fprintf (stream, _("\
d766e8ec 15400-mfix-vr4120 work around certain VR4120 errata\n\
7d8e00cf 15401-mfix-vr4130 work around VR4130 mflo/mfhi errata\n\
316f5878
RS
15402-mgp32 use 32-bit GPRs, regardless of the chosen ISA\n\
15403-mfp32 use 32-bit FPRs, regardless of the chosen ISA\n\
aed1a261 15404-msym32 assume all symbols have 32-bit values\n\
316f5878
RS
15405-O0 remove unneeded NOPs, do not swap branches\n\
15406-O remove unneeded NOPs and swap branches\n\
316f5878
RS
15407--trap, --no-break trap exception on div by 0 and mult overflow\n\
15408--break, --no-trap break exception on div by 0 and mult overflow\n"));
037b32b9
AN
15409 fprintf (stream, _("\
15410-mhard-float allow floating-point instructions\n\
15411-msoft-float do not allow floating-point instructions\n\
15412-msingle-float only allow 32-bit floating-point operations\n\
15413-mdouble-float allow 32-bit and 64-bit floating-point operations\n\
15414--[no-]construct-floats [dis]allow floating point values to be constructed\n"
15415 ));
316f5878
RS
15416#ifdef OBJ_ELF
15417 fprintf (stream, _("\
15418-KPIC, -call_shared generate SVR4 position independent code\n\
861fb55a 15419-call_nonpic generate non-PIC code that can operate with DSOs\n\
0c000745 15420-mvxworks-pic generate VxWorks position independent code\n\
861fb55a 15421-non_shared do not generate code that can operate with DSOs\n\
316f5878 15422-xgot assume a 32 bit GOT\n\
dcd410fe 15423-mpdr, -mno-pdr enable/disable creation of .pdr sections\n\
bbe506e8 15424-mshared, -mno-shared disable/enable .cpload optimization for\n\
d821e36b 15425 position dependent (non shared) code\n\
316f5878
RS
15426-mabi=ABI create ABI conformant object file for:\n"));
15427
15428 first = 1;
15429
15430 show (stream, "32", &column, &first);
15431 show (stream, "o64", &column, &first);
15432 show (stream, "n32", &column, &first);
15433 show (stream, "64", &column, &first);
15434 show (stream, "eabi", &column, &first);
15435
15436 fputc ('\n', stream);
15437
15438 fprintf (stream, _("\
15439-32 create o32 ABI object file (default)\n\
15440-n32 create n32 ABI object file\n\
15441-64 create 64 ABI object file\n"));
15442#endif
e7af610e 15443}
14e777e0
KB
15444
15445enum dwarf2_format
413a266c 15446mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
14e777e0 15447{
369943fe 15448 if (HAVE_64BIT_SYMBOLS)
1de5b6a1
AO
15449 {
15450#ifdef TE_IRIX
15451 return dwarf2_format_64bit_irix;
15452#else
15453 return dwarf2_format_64bit;
15454#endif
15455 }
14e777e0
KB
15456 else
15457 return dwarf2_format_32bit;
15458}
73369e65
EC
15459
15460int
15461mips_dwarf2_addr_size (void)
15462{
369943fe 15463 if (HAVE_64BIT_SYMBOLS)
73369e65 15464 return 8;
73369e65
EC
15465 else
15466 return 4;
15467}
5862107c
EC
15468
15469/* Standard calling conventions leave the CFA at SP on entry. */
15470void
15471mips_cfi_frame_initial_instructions (void)
15472{
15473 cfi_add_CFA_def_cfa_register (SP);
15474}
15475
707bfff6
TS
15476int
15477tc_mips_regname_to_dw2regnum (char *regname)
15478{
15479 unsigned int regnum = -1;
15480 unsigned int reg;
15481
15482 if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
15483 regnum = reg;
15484
15485 return regnum;
15486}
This page took 1.933799 seconds and 4 git commands to generate.