2010-12-10 Tobias Burnus <burnus@net-b.de>
[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,
c67a084a
NC
3 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4 Free Software Foundation, Inc.
252b5132
RH
5 Contributed by the OSF and Ralph Campbell.
6 Written by Keith Knowles and Ralph Campbell, working independently.
7 Modified for ECOFF and R4000 support by Ian Lance Taylor of Cygnus
8 Support.
9
10 This file is part of GAS.
11
12 GAS is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
ec2655a6 14 the Free Software Foundation; either version 3, or (at your option)
252b5132
RH
15 any later version.
16
17 GAS is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
21
22 You should have received a copy of the GNU General Public License
23 along with GAS; see the file COPYING. If not, write to the Free
4b4da160
NC
24 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
25 02110-1301, USA. */
252b5132
RH
26
27#include "as.h"
28#include "config.h"
29#include "subsegs.h"
3882b010 30#include "safe-ctype.h"
252b5132 31
252b5132
RH
32#include "opcode/mips.h"
33#include "itbl-ops.h"
c5dd6aab 34#include "dwarf2dbg.h"
5862107c 35#include "dw2gencfi.h"
252b5132
RH
36
37#ifdef DEBUG
38#define DBG(x) printf x
39#else
40#define DBG(x)
41#endif
42
43#ifdef OBJ_MAYBE_ELF
44/* Clean up namespace so we can include obj-elf.h too. */
17a2f251
TS
45static int mips_output_flavor (void);
46static int mips_output_flavor (void) { return OUTPUT_FLAVOR; }
252b5132
RH
47#undef OBJ_PROCESS_STAB
48#undef OUTPUT_FLAVOR
49#undef S_GET_ALIGN
50#undef S_GET_SIZE
51#undef S_SET_ALIGN
52#undef S_SET_SIZE
252b5132
RH
53#undef obj_frob_file
54#undef obj_frob_file_after_relocs
55#undef obj_frob_symbol
56#undef obj_pop_insert
57#undef obj_sec_sym_ok_for_reloc
58#undef OBJ_COPY_SYMBOL_ATTRIBUTES
59
60#include "obj-elf.h"
61/* Fix any of them that we actually care about. */
62#undef OUTPUT_FLAVOR
63#define OUTPUT_FLAVOR mips_output_flavor()
64#endif
65
66#if defined (OBJ_ELF)
67#include "elf/mips.h"
68#endif
69
70#ifndef ECOFF_DEBUGGING
71#define NO_ECOFF_DEBUGGING
72#define ECOFF_DEBUGGING 0
73#endif
74
ecb4347a
DJ
75int mips_flag_mdebug = -1;
76
dcd410fe
RO
77/* Control generation of .pdr sections. Off by default on IRIX: the native
78 linker doesn't know about and discards them, but relocations against them
79 remain, leading to rld crashes. */
80#ifdef TE_IRIX
81int mips_flag_pdr = FALSE;
82#else
83int mips_flag_pdr = TRUE;
84#endif
85
252b5132
RH
86#include "ecoff.h"
87
88#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
89static char *mips_regmask_frag;
90#endif
91
85b51719 92#define ZERO 0
741fe287 93#define ATREG 1
252b5132
RH
94#define TREG 24
95#define PIC_CALL_REG 25
96#define KT0 26
97#define KT1 27
98#define GP 28
99#define SP 29
100#define FP 30
101#define RA 31
102
103#define ILLEGAL_REG (32)
104
741fe287
MR
105#define AT mips_opts.at
106
252b5132
RH
107/* Allow override of standard little-endian ECOFF format. */
108
109#ifndef ECOFF_LITTLE_FORMAT
110#define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
111#endif
112
113extern int target_big_endian;
114
252b5132 115/* The name of the readonly data section. */
4d0d148d 116#define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
252b5132 117 ? ".rdata" \
056350c6
NC
118 : OUTPUT_FLAVOR == bfd_target_coff_flavour \
119 ? ".rdata" \
252b5132
RH
120 : OUTPUT_FLAVOR == bfd_target_elf_flavour \
121 ? ".rodata" \
122 : (abort (), ""))
123
47e39b9d
RS
124/* Information about an instruction, including its format, operands
125 and fixups. */
126struct mips_cl_insn
127{
128 /* The opcode's entry in mips_opcodes or mips16_opcodes. */
129 const struct mips_opcode *insn_mo;
130
131 /* True if this is a mips16 instruction and if we want the extended
132 form of INSN_MO. */
133 bfd_boolean use_extend;
134
135 /* The 16-bit extension instruction to use when USE_EXTEND is true. */
136 unsigned short extend;
137
138 /* The 16-bit or 32-bit bitstring of the instruction itself. This is
139 a copy of INSN_MO->match with the operands filled in. */
140 unsigned long insn_opcode;
141
142 /* The frag that contains the instruction. */
143 struct frag *frag;
144
145 /* The offset into FRAG of the first instruction byte. */
146 long where;
147
148 /* The relocs associated with the instruction, if any. */
149 fixS *fixp[3];
150
a38419a5
RS
151 /* True if this entry cannot be moved from its current position. */
152 unsigned int fixed_p : 1;
47e39b9d 153
708587a4 154 /* True if this instruction occurred in a .set noreorder block. */
47e39b9d
RS
155 unsigned int noreorder_p : 1;
156
2fa15973
RS
157 /* True for mips16 instructions that jump to an absolute address. */
158 unsigned int mips16_absolute_jump_p : 1;
47e39b9d
RS
159};
160
a325df1d
TS
161/* The ABI to use. */
162enum mips_abi_level
163{
164 NO_ABI = 0,
165 O32_ABI,
166 O64_ABI,
167 N32_ABI,
168 N64_ABI,
169 EABI_ABI
170};
171
172/* MIPS ABI we are using for this output file. */
316f5878 173static enum mips_abi_level mips_abi = NO_ABI;
a325df1d 174
143d77c5
EC
175/* Whether or not we have code that can call pic code. */
176int mips_abicalls = FALSE;
177
aa6975fb
ILT
178/* Whether or not we have code which can be put into a shared
179 library. */
180static bfd_boolean mips_in_shared = TRUE;
181
252b5132
RH
182/* This is the set of options which may be modified by the .set
183 pseudo-op. We use a struct so that .set push and .set pop are more
184 reliable. */
185
e972090a
NC
186struct mips_set_options
187{
252b5132
RH
188 /* MIPS ISA (Instruction Set Architecture) level. This is set to -1
189 if it has not been initialized. Changed by `.set mipsN', and the
190 -mipsN command line option, and the default CPU. */
191 int isa;
1f25f5d3
CD
192 /* Enabled Application Specific Extensions (ASEs). These are set to -1
193 if they have not been initialized. Changed by `.set <asename>', by
194 command line options, and based on the default architecture. */
195 int ase_mips3d;
deec1734 196 int ase_mdmx;
e16bfa71 197 int ase_smartmips;
74cd071d 198 int ase_dsp;
8b082fb1 199 int ase_dspr2;
ef2e4d86 200 int ase_mt;
252b5132
RH
201 /* Whether we are assembling for the mips16 processor. 0 if we are
202 not, 1 if we are, and -1 if the value has not been initialized.
203 Changed by `.set mips16' and `.set nomips16', and the -mips16 and
204 -nomips16 command line options, and the default CPU. */
205 int mips16;
206 /* Non-zero if we should not reorder instructions. Changed by `.set
207 reorder' and `.set noreorder'. */
208 int noreorder;
741fe287
MR
209 /* Non-zero if we should not permit the register designated "assembler
210 temporary" to be used in instructions. The value is the register
211 number, normally $at ($1). Changed by `.set at=REG', `.set noat'
212 (same as `.set at=$0') and `.set at' (same as `.set at=$1'). */
213 unsigned int at;
252b5132
RH
214 /* Non-zero if we should warn when a macro instruction expands into
215 more than one machine instruction. Changed by `.set nomacro' and
216 `.set macro'. */
217 int warn_about_macros;
218 /* Non-zero if we should not move instructions. Changed by `.set
219 move', `.set volatile', `.set nomove', and `.set novolatile'. */
220 int nomove;
221 /* Non-zero if we should not optimize branches by moving the target
222 of the branch into the delay slot. Actually, we don't perform
223 this optimization anyhow. Changed by `.set bopt' and `.set
224 nobopt'. */
225 int nobopt;
226 /* Non-zero if we should not autoextend mips16 instructions.
227 Changed by `.set autoextend' and `.set noautoextend'. */
228 int noautoextend;
a325df1d
TS
229 /* Restrict general purpose registers and floating point registers
230 to 32 bit. This is initially determined when -mgp32 or -mfp32
231 is passed but can changed if the assembler code uses .set mipsN. */
232 int gp32;
233 int fp32;
fef14a42
TS
234 /* MIPS architecture (CPU) type. Changed by .set arch=FOO, the -march
235 command line option, and the default CPU. */
236 int arch;
aed1a261
RS
237 /* True if ".set sym32" is in effect. */
238 bfd_boolean sym32;
037b32b9
AN
239 /* True if floating-point operations are not allowed. Changed by .set
240 softfloat or .set hardfloat, by command line options -msoft-float or
241 -mhard-float. The default is false. */
242 bfd_boolean soft_float;
243
244 /* True if only single-precision floating-point operations are allowed.
245 Changed by .set singlefloat or .set doublefloat, command-line options
246 -msingle-float or -mdouble-float. The default is false. */
247 bfd_boolean single_float;
252b5132
RH
248};
249
037b32b9
AN
250/* This is the struct we use to hold the current set of options. Note
251 that we must set the isa field to ISA_UNKNOWN and the ASE fields to
252 -1 to indicate that they have not been initialized. */
253
a325df1d 254/* True if -mgp32 was passed. */
a8e8e863 255static int file_mips_gp32 = -1;
a325df1d
TS
256
257/* True if -mfp32 was passed. */
a8e8e863 258static int file_mips_fp32 = -1;
a325df1d 259
037b32b9
AN
260/* 1 if -msoft-float, 0 if -mhard-float. The default is 0. */
261static int file_mips_soft_float = 0;
262
263/* 1 if -msingle-float, 0 if -mdouble-float. The default is 0. */
264static int file_mips_single_float = 0;
252b5132 265
e972090a
NC
266static struct mips_set_options mips_opts =
267{
037b32b9
AN
268 /* isa */ ISA_UNKNOWN, /* ase_mips3d */ -1, /* ase_mdmx */ -1,
269 /* ase_smartmips */ 0, /* ase_dsp */ -1, /* ase_dspr2 */ -1, /* ase_mt */ -1,
270 /* mips16 */ -1, /* noreorder */ 0, /* at */ ATREG,
271 /* warn_about_macros */ 0, /* nomove */ 0, /* nobopt */ 0,
272 /* noautoextend */ 0, /* gp32 */ 0, /* fp32 */ 0, /* arch */ CPU_UNKNOWN,
273 /* sym32 */ FALSE, /* soft_float */ FALSE, /* single_float */ FALSE
e7af610e 274};
252b5132
RH
275
276/* These variables are filled in with the masks of registers used.
277 The object format code reads them and puts them in the appropriate
278 place. */
279unsigned long mips_gprmask;
280unsigned long mips_cprmask[4];
281
282/* MIPS ISA we are using for this output file. */
e7af610e 283static int file_mips_isa = ISA_UNKNOWN;
252b5132 284
738f4d98 285/* True if any MIPS16 code was produced. */
a4672219
TS
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
b12dd2e4
CF
293/* True if we want to create R_MIPS_JALR for jalr $25. */
294#ifdef TE_IRIX
1180b5a4 295#define MIPS_JALR_HINT_P(EXPR) HAVE_NEWABI
b12dd2e4 296#else
1180b5a4
RS
297/* As a GNU extension, we use R_MIPS_JALR for o32 too. However,
298 because there's no place for any addend, the only acceptable
299 expression is a bare symbol. */
300#define MIPS_JALR_HINT_P(EXPR) \
301 (!HAVE_IN_PLACE_ADDENDS \
302 || ((EXPR)->X_op == O_symbol && (EXPR)->X_add_number == 0))
b12dd2e4
CF
303#endif
304
1f25f5d3
CD
305/* True if -mips3d was passed or implied by arguments passed on the
306 command line (e.g., by -march). */
307static int file_ase_mips3d;
308
deec1734
CD
309/* True if -mdmx was passed or implied by arguments passed on the
310 command line (e.g., by -march). */
311static int file_ase_mdmx;
312
e16bfa71
TS
313/* True if -msmartmips was passed or implied by arguments passed on the
314 command line (e.g., by -march). */
315static int file_ase_smartmips;
316
ad3fea08
TS
317#define ISA_SUPPORTS_SMARTMIPS (mips_opts.isa == ISA_MIPS32 \
318 || mips_opts.isa == ISA_MIPS32R2)
e16bfa71 319
74cd071d
CF
320/* True if -mdsp was passed or implied by arguments passed on the
321 command line (e.g., by -march). */
322static int file_ase_dsp;
323
ad3fea08
TS
324#define ISA_SUPPORTS_DSP_ASE (mips_opts.isa == ISA_MIPS32R2 \
325 || mips_opts.isa == ISA_MIPS64R2)
326
65263ce3
TS
327#define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
328
8b082fb1
TS
329/* True if -mdspr2 was passed or implied by arguments passed on the
330 command line (e.g., by -march). */
331static int file_ase_dspr2;
332
333#define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2 \
334 || mips_opts.isa == ISA_MIPS64R2)
335
ef2e4d86
CF
336/* True if -mmt was passed or implied by arguments passed on the
337 command line (e.g., by -march). */
338static int file_ase_mt;
339
ad3fea08
TS
340#define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2 \
341 || mips_opts.isa == ISA_MIPS64R2)
342
ec68c924 343/* The argument of the -march= flag. The architecture we are assembling. */
fef14a42 344static int file_mips_arch = CPU_UNKNOWN;
316f5878 345static const char *mips_arch_string;
ec68c924
EC
346
347/* The argument of the -mtune= flag. The architecture for which we
348 are optimizing. */
349static int mips_tune = CPU_UNKNOWN;
316f5878 350static const char *mips_tune_string;
ec68c924 351
316f5878 352/* True when generating 32-bit code for a 64-bit processor. */
252b5132
RH
353static int mips_32bitmode = 0;
354
316f5878
RS
355/* True if the given ABI requires 32-bit registers. */
356#define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
357
358/* Likewise 64-bit registers. */
707bfff6
TS
359#define ABI_NEEDS_64BIT_REGS(ABI) \
360 ((ABI) == N32_ABI \
361 || (ABI) == N64_ABI \
316f5878
RS
362 || (ABI) == O64_ABI)
363
ad3fea08 364/* Return true if ISA supports 64 bit wide gp registers. */
707bfff6
TS
365#define ISA_HAS_64BIT_REGS(ISA) \
366 ((ISA) == ISA_MIPS3 \
367 || (ISA) == ISA_MIPS4 \
368 || (ISA) == ISA_MIPS5 \
369 || (ISA) == ISA_MIPS64 \
370 || (ISA) == ISA_MIPS64R2)
9ce8a5dd 371
ad3fea08
TS
372/* Return true if ISA supports 64 bit wide float registers. */
373#define ISA_HAS_64BIT_FPRS(ISA) \
374 ((ISA) == ISA_MIPS3 \
375 || (ISA) == ISA_MIPS4 \
376 || (ISA) == ISA_MIPS5 \
377 || (ISA) == ISA_MIPS32R2 \
378 || (ISA) == ISA_MIPS64 \
379 || (ISA) == ISA_MIPS64R2)
380
af7ee8bf
CD
381/* Return true if ISA supports 64-bit right rotate (dror et al.)
382 instructions. */
707bfff6
TS
383#define ISA_HAS_DROR(ISA) \
384 ((ISA) == ISA_MIPS64R2)
af7ee8bf
CD
385
386/* Return true if ISA supports 32-bit right rotate (ror et al.)
387 instructions. */
707bfff6
TS
388#define ISA_HAS_ROR(ISA) \
389 ((ISA) == ISA_MIPS32R2 \
390 || (ISA) == ISA_MIPS64R2 \
391 || mips_opts.ase_smartmips)
392
7455baf8
TS
393/* Return true if ISA supports single-precision floats in odd registers. */
394#define ISA_HAS_ODD_SINGLE_FPR(ISA) \
395 ((ISA) == ISA_MIPS32 \
396 || (ISA) == ISA_MIPS32R2 \
397 || (ISA) == ISA_MIPS64 \
398 || (ISA) == ISA_MIPS64R2)
af7ee8bf 399
ad3fea08
TS
400/* Return true if ISA supports move to/from high part of a 64-bit
401 floating-point register. */
402#define ISA_HAS_MXHC1(ISA) \
403 ((ISA) == ISA_MIPS32R2 \
404 || (ISA) == ISA_MIPS64R2)
405
e013f690 406#define HAVE_32BIT_GPRS \
ad3fea08 407 (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
ca4e0257 408
e013f690 409#define HAVE_32BIT_FPRS \
ad3fea08 410 (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
ca4e0257 411
ad3fea08
TS
412#define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
413#define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
ca4e0257 414
316f5878 415#define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
e013f690 416
316f5878 417#define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
e013f690 418
3b91255e
RS
419/* True if relocations are stored in-place. */
420#define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
421
aed1a261
RS
422/* The ABI-derived address size. */
423#define HAVE_64BIT_ADDRESSES \
424 (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
425#define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
e013f690 426
aed1a261
RS
427/* The size of symbolic constants (i.e., expressions of the form
428 "SYMBOL" or "SYMBOL + OFFSET"). */
429#define HAVE_32BIT_SYMBOLS \
430 (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
431#define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
ca4e0257 432
b7c7d6c1
TS
433/* Addresses are loaded in different ways, depending on the address size
434 in use. The n32 ABI Documentation also mandates the use of additions
435 with overflow checking, but existing implementations don't follow it. */
f899b4b8 436#define ADDRESS_ADD_INSN \
b7c7d6c1 437 (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
f899b4b8
TS
438
439#define ADDRESS_ADDI_INSN \
b7c7d6c1 440 (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
f899b4b8
TS
441
442#define ADDRESS_LOAD_INSN \
443 (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
444
445#define ADDRESS_STORE_INSN \
446 (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
447
a4672219 448/* Return true if the given CPU supports the MIPS16 ASE. */
3396de36
TS
449#define CPU_HAS_MIPS16(cpu) \
450 (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0 \
451 || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
a4672219 452
60b63b72
RS
453/* True if CPU has a dror instruction. */
454#define CPU_HAS_DROR(CPU) ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
455
456/* True if CPU has a ror instruction. */
457#define CPU_HAS_ROR(CPU) CPU_HAS_DROR (CPU)
458
dd3cbb7e
NC
459/* True if CPU has seq/sne and seqi/snei instructions. */
460#define CPU_HAS_SEQ(CPU) ((CPU) == CPU_OCTEON)
461
b19e8a9b
AN
462/* True if CPU does not implement the all the coprocessor insns. For these
463 CPUs only those COP insns are accepted that are explicitly marked to be
464 available on the CPU. ISA membership for COP insns is ignored. */
465#define NO_ISA_COP(CPU) ((CPU) == CPU_OCTEON)
466
c8978940
CD
467/* True if mflo and mfhi can be immediately followed by instructions
468 which write to the HI and LO registers.
469
470 According to MIPS specifications, MIPS ISAs I, II, and III need
471 (at least) two instructions between the reads of HI/LO and
472 instructions which write them, and later ISAs do not. Contradicting
473 the MIPS specifications, some MIPS IV processor user manuals (e.g.
474 the UM for the NEC Vr5000) document needing the instructions between
475 HI/LO reads and writes, as well. Therefore, we declare only MIPS32,
476 MIPS64 and later ISAs to have the interlocks, plus any specific
477 earlier-ISA CPUs for which CPU documentation declares that the
478 instructions are really interlocked. */
479#define hilo_interlocks \
480 (mips_opts.isa == ISA_MIPS32 \
481 || mips_opts.isa == ISA_MIPS32R2 \
482 || mips_opts.isa == ISA_MIPS64 \
483 || mips_opts.isa == ISA_MIPS64R2 \
484 || mips_opts.arch == CPU_R4010 \
485 || mips_opts.arch == CPU_R10000 \
486 || mips_opts.arch == CPU_R12000 \
3aa3176b
TS
487 || mips_opts.arch == CPU_R14000 \
488 || mips_opts.arch == CPU_R16000 \
c8978940 489 || mips_opts.arch == CPU_RM7000 \
c8978940
CD
490 || mips_opts.arch == CPU_VR5500 \
491 )
252b5132
RH
492
493/* Whether the processor uses hardware interlocks to protect reads
81912461
ILT
494 from the GPRs after they are loaded from memory, and thus does not
495 require nops to be inserted. This applies to instructions marked
496 INSN_LOAD_MEMORY_DELAY. These nops are only required at MIPS ISA
497 level I. */
252b5132 498#define gpr_interlocks \
e7af610e 499 (mips_opts.isa != ISA_MIPS1 \
fef14a42 500 || mips_opts.arch == CPU_R3900)
252b5132 501
81912461
ILT
502/* Whether the processor uses hardware interlocks to avoid delays
503 required by coprocessor instructions, and thus does not require
504 nops to be inserted. This applies to instructions marked
505 INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
506 between instructions marked INSN_WRITE_COND_CODE and ones marked
507 INSN_READ_COND_CODE. These nops are only required at MIPS ISA
508 levels I, II, and III. */
bdaaa2e1 509/* Itbl support may require additional care here. */
81912461
ILT
510#define cop_interlocks \
511 ((mips_opts.isa != ISA_MIPS1 \
512 && mips_opts.isa != ISA_MIPS2 \
513 && mips_opts.isa != ISA_MIPS3) \
514 || mips_opts.arch == CPU_R4300 \
81912461
ILT
515 )
516
517/* Whether the processor uses hardware interlocks to protect reads
518 from coprocessor registers after they are loaded from memory, and
519 thus does not require nops to be inserted. This applies to
520 instructions marked INSN_COPROC_MEMORY_DELAY. These nops are only
521 requires at MIPS ISA level I. */
522#define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
252b5132 523
6b76fefe
CM
524/* Is this a mfhi or mflo instruction? */
525#define MF_HILO_INSN(PINFO) \
b19e8a9b
AN
526 ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
527
528/* Returns true for a (non floating-point) coprocessor instruction. Reading
529 or writing the condition code is only possible on the coprocessors and
530 these insns are not marked with INSN_COP. Thus for these insns use the
a242dc0d 531 condition-code flags. */
b19e8a9b
AN
532#define COP_INSN(PINFO) \
533 (PINFO != INSN_MACRO \
a242dc0d
AN
534 && ((PINFO) & (FP_S | FP_D)) == 0 \
535 && ((PINFO) & (INSN_COP | INSN_READ_COND_CODE | INSN_WRITE_COND_CODE)))
6b76fefe 536
252b5132
RH
537/* MIPS PIC level. */
538
a161fe53 539enum mips_pic_level mips_pic;
252b5132 540
c9914766 541/* 1 if we should generate 32 bit offsets from the $gp register in
252b5132 542 SVR4_PIC mode. Currently has no meaning in other modes. */
c9914766 543static int mips_big_got = 0;
252b5132
RH
544
545/* 1 if trap instructions should used for overflow rather than break
546 instructions. */
c9914766 547static int mips_trap = 0;
252b5132 548
119d663a 549/* 1 if double width floating point constants should not be constructed
b6ff326e 550 by assembling two single width halves into two single width floating
119d663a
NC
551 point registers which just happen to alias the double width destination
552 register. On some architectures this aliasing can be disabled by a bit
d547a75e 553 in the status register, and the setting of this bit cannot be determined
119d663a
NC
554 automatically at assemble time. */
555static int mips_disable_float_construction;
556
252b5132
RH
557/* Non-zero if any .set noreorder directives were used. */
558
559static int mips_any_noreorder;
560
6b76fefe
CM
561/* Non-zero if nops should be inserted when the register referenced in
562 an mfhi/mflo instruction is read in the next two instructions. */
563static int mips_7000_hilo_fix;
564
02ffd3e4 565/* The size of objects in the small data section. */
156c2f8b 566static unsigned int g_switch_value = 8;
252b5132
RH
567/* Whether the -G option was used. */
568static int g_switch_seen = 0;
569
570#define N_RMASK 0xc4
571#define N_VFP 0xd4
572
573/* If we can determine in advance that GP optimization won't be
574 possible, we can skip the relaxation stuff that tries to produce
575 GP-relative references. This makes delay slot optimization work
576 better.
577
578 This function can only provide a guess, but it seems to work for
fba2b7f9
GK
579 gcc output. It needs to guess right for gcc, otherwise gcc
580 will put what it thinks is a GP-relative instruction in a branch
581 delay slot.
252b5132
RH
582
583 I don't know if a fix is needed for the SVR4_PIC mode. I've only
584 fixed it for the non-PIC mode. KR 95/04/07 */
17a2f251 585static int nopic_need_relax (symbolS *, int);
252b5132
RH
586
587/* handle of the OPCODE hash table */
588static struct hash_control *op_hash = NULL;
589
590/* The opcode hash table we use for the mips16. */
591static struct hash_control *mips16_op_hash = NULL;
592
593/* This array holds the chars that always start a comment. If the
594 pre-processor is disabled, these aren't very useful */
595const char comment_chars[] = "#";
596
597/* This array holds the chars that only start a comment at the beginning of
598 a line. If the line seems to have the form '# 123 filename'
599 .line and .file directives will appear in the pre-processed output */
600/* Note that input_file.c hand checks for '#' at the beginning of the
601 first line of the input file. This is because the compiler outputs
bdaaa2e1 602 #NO_APP at the beginning of its output. */
252b5132
RH
603/* Also note that C style comments are always supported. */
604const char line_comment_chars[] = "#";
605
bdaaa2e1 606/* This array holds machine specific line separator characters. */
63a0b638 607const char line_separator_chars[] = ";";
252b5132
RH
608
609/* Chars that can be used to separate mant from exp in floating point nums */
610const char EXP_CHARS[] = "eE";
611
612/* Chars that mean this number is a floating point constant */
613/* As in 0f12.456 */
614/* or 0d1.2345e12 */
615const char FLT_CHARS[] = "rRsSfFdDxXpP";
616
617/* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
618 changed in read.c . Ideally it shouldn't have to know about it at all,
619 but nothing is ideal around here.
620 */
621
622static char *insn_error;
623
624static int auto_align = 1;
625
626/* When outputting SVR4 PIC code, the assembler needs to know the
627 offset in the stack frame from which to restore the $gp register.
628 This is set by the .cprestore pseudo-op, and saved in this
629 variable. */
630static offsetT mips_cprestore_offset = -1;
631
67c1ffbe 632/* Similar for NewABI PIC code, where $gp is callee-saved. NewABI has some
6478892d 633 more optimizations, it can use a register value instead of a memory-saved
956cd1d6 634 offset and even an other register than $gp as global pointer. */
6478892d
TS
635static offsetT mips_cpreturn_offset = -1;
636static int mips_cpreturn_register = -1;
637static int mips_gp_register = GP;
def2e0dd 638static int mips_gprel_offset = 0;
6478892d 639
7a621144
DJ
640/* Whether mips_cprestore_offset has been set in the current function
641 (or whether it has already been warned about, if not). */
642static int mips_cprestore_valid = 0;
643
252b5132
RH
644/* This is the register which holds the stack frame, as set by the
645 .frame pseudo-op. This is needed to implement .cprestore. */
646static int mips_frame_reg = SP;
647
7a621144
DJ
648/* Whether mips_frame_reg has been set in the current function
649 (or whether it has already been warned about, if not). */
650static int mips_frame_reg_valid = 0;
651
252b5132
RH
652/* To output NOP instructions correctly, we need to keep information
653 about the previous two instructions. */
654
655/* Whether we are optimizing. The default value of 2 means to remove
656 unneeded NOPs and swap branch instructions when possible. A value
657 of 1 means to not swap branches. A value of 0 means to always
658 insert NOPs. */
659static int mips_optimize = 2;
660
661/* Debugging level. -g sets this to 2. -gN sets this to N. -g0 is
662 equivalent to seeing no -g option at all. */
663static int mips_debug = 0;
664
7d8e00cf
RS
665/* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata. */
666#define MAX_VR4130_NOPS 4
667
668/* The maximum number of NOPs needed to fill delay slots. */
669#define MAX_DELAY_NOPS 2
670
671/* The maximum number of NOPs needed for any purpose. */
672#define MAX_NOPS 4
71400594
RS
673
674/* A list of previous instructions, with index 0 being the most recent.
675 We need to look back MAX_NOPS instructions when filling delay slots
676 or working around processor errata. We need to look back one
677 instruction further if we're thinking about using history[0] to
678 fill a branch delay slot. */
679static struct mips_cl_insn history[1 + MAX_NOPS];
252b5132 680
1e915849
RS
681/* Nop instructions used by emit_nop. */
682static struct mips_cl_insn nop_insn, mips16_nop_insn;
683
684/* The appropriate nop for the current mode. */
685#define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn : &nop_insn)
252b5132 686
252b5132
RH
687/* If this is set, it points to a frag holding nop instructions which
688 were inserted before the start of a noreorder section. If those
689 nops turn out to be unnecessary, the size of the frag can be
690 decreased. */
691static fragS *prev_nop_frag;
692
693/* The number of nop instructions we created in prev_nop_frag. */
694static int prev_nop_frag_holds;
695
696/* The number of nop instructions that we know we need in
bdaaa2e1 697 prev_nop_frag. */
252b5132
RH
698static int prev_nop_frag_required;
699
700/* The number of instructions we've seen since prev_nop_frag. */
701static int prev_nop_frag_since;
702
703/* For ECOFF and ELF, relocations against symbols are done in two
704 parts, with a HI relocation and a LO relocation. Each relocation
705 has only 16 bits of space to store an addend. This means that in
706 order for the linker to handle carries correctly, it must be able
707 to locate both the HI and the LO relocation. This means that the
708 relocations must appear in order in the relocation table.
709
710 In order to implement this, we keep track of each unmatched HI
711 relocation. We then sort them so that they immediately precede the
bdaaa2e1 712 corresponding LO relocation. */
252b5132 713
e972090a
NC
714struct mips_hi_fixup
715{
252b5132
RH
716 /* Next HI fixup. */
717 struct mips_hi_fixup *next;
718 /* This fixup. */
719 fixS *fixp;
720 /* The section this fixup is in. */
721 segT seg;
722};
723
724/* The list of unmatched HI relocs. */
725
726static struct mips_hi_fixup *mips_hi_fixup_list;
727
64bdfcaf
RS
728/* The frag containing the last explicit relocation operator.
729 Null if explicit relocations have not been used. */
730
731static fragS *prev_reloc_op_frag;
732
252b5132
RH
733/* Map normal MIPS register numbers to mips16 register numbers. */
734
735#define X ILLEGAL_REG
e972090a
NC
736static const int mips32_to_16_reg_map[] =
737{
252b5132
RH
738 X, X, 2, 3, 4, 5, 6, 7,
739 X, X, X, X, X, X, X, X,
740 0, 1, X, X, X, X, X, X,
741 X, X, X, X, X, X, X, X
742};
743#undef X
744
745/* Map mips16 register numbers to normal MIPS register numbers. */
746
e972090a
NC
747static const unsigned int mips16_to_32_reg_map[] =
748{
252b5132
RH
749 16, 17, 2, 3, 4, 5, 6, 7
750};
60b63b72 751
71400594
RS
752/* Classifies the kind of instructions we're interested in when
753 implementing -mfix-vr4120. */
c67a084a
NC
754enum fix_vr4120_class
755{
71400594
RS
756 FIX_VR4120_MACC,
757 FIX_VR4120_DMACC,
758 FIX_VR4120_MULT,
759 FIX_VR4120_DMULT,
760 FIX_VR4120_DIV,
761 FIX_VR4120_MTHILO,
762 NUM_FIX_VR4120_CLASSES
763};
764
c67a084a
NC
765/* ...likewise -mfix-loongson2f-jump. */
766static bfd_boolean mips_fix_loongson2f_jump;
767
768/* ...likewise -mfix-loongson2f-nop. */
769static bfd_boolean mips_fix_loongson2f_nop;
770
771/* True if -mfix-loongson2f-nop or -mfix-loongson2f-jump passed. */
772static bfd_boolean mips_fix_loongson2f;
773
71400594
RS
774/* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
775 there must be at least one other instruction between an instruction
776 of type X and an instruction of type Y. */
777static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
778
779/* True if -mfix-vr4120 is in force. */
d766e8ec 780static int mips_fix_vr4120;
4a6a3df4 781
7d8e00cf
RS
782/* ...likewise -mfix-vr4130. */
783static int mips_fix_vr4130;
784
6a32d874
CM
785/* ...likewise -mfix-24k. */
786static int mips_fix_24k;
787
d954098f
DD
788/* ...likewise -mfix-cn63xxp1 */
789static bfd_boolean mips_fix_cn63xxp1;
790
4a6a3df4
AO
791/* We don't relax branches by default, since this causes us to expand
792 `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
793 fail to compute the offset before expanding the macro to the most
794 efficient expansion. */
795
796static int mips_relax_branch;
252b5132 797\f
4d7206a2
RS
798/* The expansion of many macros depends on the type of symbol that
799 they refer to. For example, when generating position-dependent code,
800 a macro that refers to a symbol may have two different expansions,
801 one which uses GP-relative addresses and one which uses absolute
802 addresses. When generating SVR4-style PIC, a macro may have
803 different expansions for local and global symbols.
804
805 We handle these situations by generating both sequences and putting
806 them in variant frags. In position-dependent code, the first sequence
807 will be the GP-relative one and the second sequence will be the
808 absolute one. In SVR4 PIC, the first sequence will be for global
809 symbols and the second will be for local symbols.
810
584892a6
RS
811 The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
812 SECOND are the lengths of the two sequences in bytes. These fields
813 can be extracted using RELAX_FIRST() and RELAX_SECOND(). In addition,
814 the subtype has the following flags:
4d7206a2 815
584892a6
RS
816 RELAX_USE_SECOND
817 Set if it has been decided that we should use the second
818 sequence instead of the first.
819
820 RELAX_SECOND_LONGER
821 Set in the first variant frag if the macro's second implementation
822 is longer than its first. This refers to the macro as a whole,
823 not an individual relaxation.
824
825 RELAX_NOMACRO
826 Set in the first variant frag if the macro appeared in a .set nomacro
827 block and if one alternative requires a warning but the other does not.
828
829 RELAX_DELAY_SLOT
830 Like RELAX_NOMACRO, but indicates that the macro appears in a branch
831 delay slot.
4d7206a2
RS
832
833 The frag's "opcode" points to the first fixup for relaxable code.
834
835 Relaxable macros are generated using a sequence such as:
836
837 relax_start (SYMBOL);
838 ... generate first expansion ...
839 relax_switch ();
840 ... generate second expansion ...
841 relax_end ();
842
843 The code and fixups for the unwanted alternative are discarded
844 by md_convert_frag. */
584892a6 845#define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
4d7206a2 846
584892a6
RS
847#define RELAX_FIRST(X) (((X) >> 8) & 0xff)
848#define RELAX_SECOND(X) ((X) & 0xff)
849#define RELAX_USE_SECOND 0x10000
850#define RELAX_SECOND_LONGER 0x20000
851#define RELAX_NOMACRO 0x40000
852#define RELAX_DELAY_SLOT 0x80000
252b5132 853
4a6a3df4
AO
854/* Branch without likely bit. If label is out of range, we turn:
855
856 beq reg1, reg2, label
857 delay slot
858
859 into
860
861 bne reg1, reg2, 0f
862 nop
863 j label
864 0: delay slot
865
866 with the following opcode replacements:
867
868 beq <-> bne
869 blez <-> bgtz
870 bltz <-> bgez
871 bc1f <-> bc1t
872
873 bltzal <-> bgezal (with jal label instead of j label)
874
875 Even though keeping the delay slot instruction in the delay slot of
876 the branch would be more efficient, it would be very tricky to do
877 correctly, because we'd have to introduce a variable frag *after*
878 the delay slot instruction, and expand that instead. Let's do it
879 the easy way for now, even if the branch-not-taken case now costs
880 one additional instruction. Out-of-range branches are not supposed
881 to be common, anyway.
882
883 Branch likely. If label is out of range, we turn:
884
885 beql reg1, reg2, label
886 delay slot (annulled if branch not taken)
887
888 into
889
890 beql reg1, reg2, 1f
891 nop
892 beql $0, $0, 2f
893 nop
894 1: j[al] label
895 delay slot (executed only if branch taken)
896 2:
897
898 It would be possible to generate a shorter sequence by losing the
899 likely bit, generating something like:
b34976b6 900
4a6a3df4
AO
901 bne reg1, reg2, 0f
902 nop
903 j[al] label
904 delay slot (executed only if branch taken)
905 0:
906
907 beql -> bne
908 bnel -> beq
909 blezl -> bgtz
910 bgtzl -> blez
911 bltzl -> bgez
912 bgezl -> bltz
913 bc1fl -> bc1t
914 bc1tl -> bc1f
915
916 bltzall -> bgezal (with jal label instead of j label)
917 bgezall -> bltzal (ditto)
918
919
920 but it's not clear that it would actually improve performance. */
af6ae2ad 921#define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
4a6a3df4
AO
922 ((relax_substateT) \
923 (0xc0000000 \
924 | ((toofar) ? 1 : 0) \
925 | ((link) ? 2 : 0) \
926 | ((likely) ? 4 : 0) \
af6ae2ad 927 | ((uncond) ? 8 : 0)))
4a6a3df4 928#define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
4a6a3df4
AO
929#define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
930#define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
931#define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
ae6063d4 932#define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
4a6a3df4 933
252b5132
RH
934/* For mips16 code, we use an entirely different form of relaxation.
935 mips16 supports two versions of most instructions which take
936 immediate values: a small one which takes some small value, and a
937 larger one which takes a 16 bit value. Since branches also follow
938 this pattern, relaxing these values is required.
939
940 We can assemble both mips16 and normal MIPS code in a single
941 object. Therefore, we need to support this type of relaxation at
942 the same time that we support the relaxation described above. We
943 use the high bit of the subtype field to distinguish these cases.
944
945 The information we store for this type of relaxation is the
946 argument code found in the opcode file for this relocation, whether
947 the user explicitly requested a small or extended form, and whether
948 the relocation is in a jump or jal delay slot. That tells us the
949 size of the value, and how it should be stored. We also store
950 whether the fragment is considered to be extended or not. We also
951 store whether this is known to be a branch to a different section,
952 whether we have tried to relax this frag yet, and whether we have
953 ever extended a PC relative fragment because of a shift count. */
954#define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
955 (0x80000000 \
956 | ((type) & 0xff) \
957 | ((small) ? 0x100 : 0) \
958 | ((ext) ? 0x200 : 0) \
959 | ((dslot) ? 0x400 : 0) \
960 | ((jal_dslot) ? 0x800 : 0))
4a6a3df4 961#define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
252b5132
RH
962#define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
963#define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
964#define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
965#define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
966#define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
967#define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
968#define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
969#define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
970#define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
971#define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
972#define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
885add95
CD
973
974/* Is the given value a sign-extended 32-bit value? */
975#define IS_SEXT_32BIT_NUM(x) \
976 (((x) &~ (offsetT) 0x7fffffff) == 0 \
977 || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
978
979/* Is the given value a sign-extended 16-bit value? */
980#define IS_SEXT_16BIT_NUM(x) \
981 (((x) &~ (offsetT) 0x7fff) == 0 \
982 || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
983
2051e8c4
MR
984/* Is the given value a zero-extended 32-bit value? Or a negated one? */
985#define IS_ZEXT_32BIT_NUM(x) \
986 (((x) &~ (offsetT) 0xffffffff) == 0 \
987 || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
988
bf12938e
RS
989/* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
990 VALUE << SHIFT. VALUE is evaluated exactly once. */
991#define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
992 (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
993 | (((VALUE) & (MASK)) << (SHIFT)))
994
995/* Extract bits MASK << SHIFT from STRUCT and shift them right
996 SHIFT places. */
997#define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
998 (((STRUCT) >> (SHIFT)) & (MASK))
999
1000/* Change INSN's opcode so that the operand given by FIELD has value VALUE.
1001 INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
1002
1003 include/opcode/mips.h specifies operand fields using the macros
1004 OP_MASK_<FIELD> and OP_SH_<FIELD>. The MIPS16 equivalents start
1005 with "MIPS16OP" instead of "OP". */
1006#define INSERT_OPERAND(FIELD, INSN, VALUE) \
1007 INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
1008#define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
1009 INSERT_BITS ((INSN).insn_opcode, VALUE, \
1010 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
1011
1012/* Extract the operand given by FIELD from mips_cl_insn INSN. */
1013#define EXTRACT_OPERAND(FIELD, INSN) \
1014 EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD)
1015#define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
1016 EXTRACT_BITS ((INSN).insn_opcode, \
1017 MIPS16OP_MASK_##FIELD, \
1018 MIPS16OP_SH_##FIELD)
4d7206a2
RS
1019\f
1020/* Global variables used when generating relaxable macros. See the
1021 comment above RELAX_ENCODE for more details about how relaxation
1022 is used. */
1023static struct {
1024 /* 0 if we're not emitting a relaxable macro.
1025 1 if we're emitting the first of the two relaxation alternatives.
1026 2 if we're emitting the second alternative. */
1027 int sequence;
1028
1029 /* The first relaxable fixup in the current frag. (In other words,
1030 the first fixup that refers to relaxable code.) */
1031 fixS *first_fixup;
1032
1033 /* sizes[0] says how many bytes of the first alternative are stored in
1034 the current frag. Likewise sizes[1] for the second alternative. */
1035 unsigned int sizes[2];
1036
1037 /* The symbol on which the choice of sequence depends. */
1038 symbolS *symbol;
1039} mips_relax;
252b5132 1040\f
584892a6
RS
1041/* Global variables used to decide whether a macro needs a warning. */
1042static struct {
1043 /* True if the macro is in a branch delay slot. */
1044 bfd_boolean delay_slot_p;
1045
1046 /* For relaxable macros, sizes[0] is the length of the first alternative
1047 in bytes and sizes[1] is the length of the second alternative.
1048 For non-relaxable macros, both elements give the length of the
1049 macro in bytes. */
1050 unsigned int sizes[2];
1051
1052 /* The first variant frag for this macro. */
1053 fragS *first_frag;
1054} mips_macro_warning;
1055\f
252b5132
RH
1056/* Prototypes for static functions. */
1057
17a2f251 1058#define internalError() \
252b5132 1059 as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
252b5132
RH
1060
1061enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
1062
b34976b6 1063static void append_insn
c67a084a 1064 (struct mips_cl_insn *, expressionS *, bfd_reloc_code_real_type *);
7d10b47d 1065static void mips_no_prev_insn (void);
c67a084a 1066static void macro_build (expressionS *, const char *, const char *, ...);
b34976b6 1067static void mips16_macro_build
03ea81db 1068 (expressionS *, const char *, const char *, va_list *);
67c0d1eb 1069static void load_register (int, expressionS *, int);
584892a6
RS
1070static void macro_start (void);
1071static void macro_end (void);
17a2f251
TS
1072static void macro (struct mips_cl_insn * ip);
1073static void mips16_macro (struct mips_cl_insn * ip);
17a2f251
TS
1074static void mips_ip (char *str, struct mips_cl_insn * ip);
1075static void mips16_ip (char *str, struct mips_cl_insn * ip);
b34976b6 1076static void mips16_immed
17a2f251
TS
1077 (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
1078 unsigned long *, bfd_boolean *, unsigned short *);
5e0116d5 1079static size_t my_getSmallExpression
17a2f251
TS
1080 (expressionS *, bfd_reloc_code_real_type *, char *);
1081static void my_getExpression (expressionS *, char *);
1082static void s_align (int);
1083static void s_change_sec (int);
1084static void s_change_section (int);
1085static void s_cons (int);
1086static void s_float_cons (int);
1087static void s_mips_globl (int);
1088static void s_option (int);
1089static void s_mipsset (int);
1090static void s_abicalls (int);
1091static void s_cpload (int);
1092static void s_cpsetup (int);
1093static void s_cplocal (int);
1094static void s_cprestore (int);
1095static void s_cpreturn (int);
741d6ea8
JM
1096static void s_dtprelword (int);
1097static void s_dtpreldword (int);
17a2f251
TS
1098static void s_gpvalue (int);
1099static void s_gpword (int);
1100static void s_gpdword (int);
1101static void s_cpadd (int);
1102static void s_insn (int);
1103static void md_obj_begin (void);
1104static void md_obj_end (void);
1105static void s_mips_ent (int);
1106static void s_mips_end (int);
1107static void s_mips_frame (int);
1108static void s_mips_mask (int reg_type);
1109static void s_mips_stab (int);
1110static void s_mips_weakext (int);
1111static void s_mips_file (int);
1112static void s_mips_loc (int);
1113static bfd_boolean pic_need_relax (symbolS *, asection *);
4a6a3df4 1114static int relaxed_branch_length (fragS *, asection *, int);
17a2f251 1115static int validate_mips_insn (const struct mips_opcode *);
e7af610e
NC
1116
1117/* Table and functions used to map between CPU/ISA names, and
1118 ISA levels, and CPU numbers. */
1119
e972090a
NC
1120struct mips_cpu_info
1121{
e7af610e 1122 const char *name; /* CPU or ISA name. */
ad3fea08 1123 int flags; /* ASEs available, or ISA flag. */
e7af610e
NC
1124 int isa; /* ISA level. */
1125 int cpu; /* CPU number (default CPU if ISA). */
1126};
1127
ad3fea08
TS
1128#define MIPS_CPU_IS_ISA 0x0001 /* Is this an ISA? (If 0, a CPU.) */
1129#define MIPS_CPU_ASE_SMARTMIPS 0x0002 /* CPU implements SmartMIPS ASE */
1130#define MIPS_CPU_ASE_DSP 0x0004 /* CPU implements DSP ASE */
1131#define MIPS_CPU_ASE_MT 0x0008 /* CPU implements MT ASE */
1132#define MIPS_CPU_ASE_MIPS3D 0x0010 /* CPU implements MIPS-3D ASE */
1133#define MIPS_CPU_ASE_MDMX 0x0020 /* CPU implements MDMX ASE */
8b082fb1 1134#define MIPS_CPU_ASE_DSPR2 0x0040 /* CPU implements DSP R2 ASE */
ad3fea08 1135
17a2f251
TS
1136static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1137static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1138static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
252b5132
RH
1139\f
1140/* Pseudo-op table.
1141
1142 The following pseudo-ops from the Kane and Heinrich MIPS book
1143 should be defined here, but are currently unsupported: .alias,
1144 .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1145
1146 The following pseudo-ops from the Kane and Heinrich MIPS book are
1147 specific to the type of debugging information being generated, and
1148 should be defined by the object format: .aent, .begin, .bend,
1149 .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1150 .vreg.
1151
1152 The following pseudo-ops from the Kane and Heinrich MIPS book are
1153 not MIPS CPU specific, but are also not specific to the object file
1154 format. This file is probably the best place to define them, but
d84bcf09 1155 they are not currently supported: .asm0, .endr, .lab, .struct. */
252b5132 1156
e972090a
NC
1157static const pseudo_typeS mips_pseudo_table[] =
1158{
beae10d5 1159 /* MIPS specific pseudo-ops. */
252b5132
RH
1160 {"option", s_option, 0},
1161 {"set", s_mipsset, 0},
1162 {"rdata", s_change_sec, 'r'},
1163 {"sdata", s_change_sec, 's'},
1164 {"livereg", s_ignore, 0},
1165 {"abicalls", s_abicalls, 0},
1166 {"cpload", s_cpload, 0},
6478892d
TS
1167 {"cpsetup", s_cpsetup, 0},
1168 {"cplocal", s_cplocal, 0},
252b5132 1169 {"cprestore", s_cprestore, 0},
6478892d 1170 {"cpreturn", s_cpreturn, 0},
741d6ea8
JM
1171 {"dtprelword", s_dtprelword, 0},
1172 {"dtpreldword", s_dtpreldword, 0},
6478892d 1173 {"gpvalue", s_gpvalue, 0},
252b5132 1174 {"gpword", s_gpword, 0},
10181a0d 1175 {"gpdword", s_gpdword, 0},
252b5132
RH
1176 {"cpadd", s_cpadd, 0},
1177 {"insn", s_insn, 0},
1178
beae10d5 1179 /* Relatively generic pseudo-ops that happen to be used on MIPS
252b5132 1180 chips. */
38a57ae7 1181 {"asciiz", stringer, 8 + 1},
252b5132
RH
1182 {"bss", s_change_sec, 'b'},
1183 {"err", s_err, 0},
1184 {"half", s_cons, 1},
1185 {"dword", s_cons, 3},
1186 {"weakext", s_mips_weakext, 0},
7c752c2a
TS
1187 {"origin", s_org, 0},
1188 {"repeat", s_rept, 0},
252b5132 1189
998b3c36
MR
1190 /* For MIPS this is non-standard, but we define it for consistency. */
1191 {"sbss", s_change_sec, 'B'},
1192
beae10d5 1193 /* These pseudo-ops are defined in read.c, but must be overridden
252b5132
RH
1194 here for one reason or another. */
1195 {"align", s_align, 0},
1196 {"byte", s_cons, 0},
1197 {"data", s_change_sec, 'd'},
1198 {"double", s_float_cons, 'd'},
1199 {"float", s_float_cons, 'f'},
1200 {"globl", s_mips_globl, 0},
1201 {"global", s_mips_globl, 0},
1202 {"hword", s_cons, 1},
1203 {"int", s_cons, 2},
1204 {"long", s_cons, 2},
1205 {"octa", s_cons, 4},
1206 {"quad", s_cons, 3},
cca86cc8 1207 {"section", s_change_section, 0},
252b5132
RH
1208 {"short", s_cons, 1},
1209 {"single", s_float_cons, 'f'},
1210 {"stabn", s_mips_stab, 'n'},
1211 {"text", s_change_sec, 't'},
1212 {"word", s_cons, 2},
add56521 1213
add56521 1214 { "extern", ecoff_directive_extern, 0},
add56521 1215
43841e91 1216 { NULL, NULL, 0 },
252b5132
RH
1217};
1218
e972090a
NC
1219static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1220{
beae10d5
KH
1221 /* These pseudo-ops should be defined by the object file format.
1222 However, a.out doesn't support them, so we have versions here. */
252b5132
RH
1223 {"aent", s_mips_ent, 1},
1224 {"bgnb", s_ignore, 0},
1225 {"end", s_mips_end, 0},
1226 {"endb", s_ignore, 0},
1227 {"ent", s_mips_ent, 0},
c5dd6aab 1228 {"file", s_mips_file, 0},
252b5132
RH
1229 {"fmask", s_mips_mask, 'F'},
1230 {"frame", s_mips_frame, 0},
c5dd6aab 1231 {"loc", s_mips_loc, 0},
252b5132
RH
1232 {"mask", s_mips_mask, 'R'},
1233 {"verstamp", s_ignore, 0},
43841e91 1234 { NULL, NULL, 0 },
252b5132
RH
1235};
1236
17a2f251 1237extern void pop_insert (const pseudo_typeS *);
252b5132
RH
1238
1239void
17a2f251 1240mips_pop_insert (void)
252b5132
RH
1241{
1242 pop_insert (mips_pseudo_table);
1243 if (! ECOFF_DEBUGGING)
1244 pop_insert (mips_nonecoff_pseudo_table);
1245}
1246\f
1247/* Symbols labelling the current insn. */
1248
e972090a
NC
1249struct insn_label_list
1250{
252b5132
RH
1251 struct insn_label_list *next;
1252 symbolS *label;
1253};
1254
252b5132 1255static struct insn_label_list *free_insn_labels;
742a56fe 1256#define label_list tc_segment_info_data.labels
252b5132 1257
17a2f251 1258static void mips_clear_insn_labels (void);
252b5132
RH
1259
1260static inline void
17a2f251 1261mips_clear_insn_labels (void)
252b5132
RH
1262{
1263 register struct insn_label_list **pl;
a8dbcb85 1264 segment_info_type *si;
252b5132 1265
a8dbcb85
TS
1266 if (now_seg)
1267 {
1268 for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1269 ;
1270
1271 si = seg_info (now_seg);
1272 *pl = si->label_list;
1273 si->label_list = NULL;
1274 }
252b5132 1275}
a8dbcb85 1276
252b5132
RH
1277\f
1278static char *expr_end;
1279
1280/* Expressions which appear in instructions. These are set by
1281 mips_ip. */
1282
1283static expressionS imm_expr;
5f74bc13 1284static expressionS imm2_expr;
252b5132
RH
1285static expressionS offset_expr;
1286
1287/* Relocs associated with imm_expr and offset_expr. */
1288
f6688943
TS
1289static bfd_reloc_code_real_type imm_reloc[3]
1290 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1291static bfd_reloc_code_real_type offset_reloc[3]
1292 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
252b5132 1293
252b5132
RH
1294/* These are set by mips16_ip if an explicit extension is used. */
1295
b34976b6 1296static bfd_boolean mips16_small, mips16_ext;
252b5132 1297
7ed4a06a 1298#ifdef OBJ_ELF
ecb4347a
DJ
1299/* The pdr segment for per procedure frame/regmask info. Not used for
1300 ECOFF debugging. */
252b5132
RH
1301
1302static segT pdr_seg;
7ed4a06a 1303#endif
252b5132 1304
e013f690
TS
1305/* The default target format to use. */
1306
1307const char *
17a2f251 1308mips_target_format (void)
e013f690
TS
1309{
1310 switch (OUTPUT_FLAVOR)
1311 {
e013f690
TS
1312 case bfd_target_ecoff_flavour:
1313 return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1314 case bfd_target_coff_flavour:
1315 return "pe-mips";
1316 case bfd_target_elf_flavour:
0a44bf69
RS
1317#ifdef TE_VXWORKS
1318 if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1319 return (target_big_endian
1320 ? "elf32-bigmips-vxworks"
1321 : "elf32-littlemips-vxworks");
1322#endif
e013f690 1323#ifdef TE_TMIPS
cfe86eaa 1324 /* This is traditional mips. */
e013f690 1325 return (target_big_endian
cfe86eaa
TS
1326 ? (HAVE_64BIT_OBJECTS
1327 ? "elf64-tradbigmips"
1328 : (HAVE_NEWABI
1329 ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1330 : (HAVE_64BIT_OBJECTS
1331 ? "elf64-tradlittlemips"
1332 : (HAVE_NEWABI
1333 ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
e013f690
TS
1334#else
1335 return (target_big_endian
cfe86eaa
TS
1336 ? (HAVE_64BIT_OBJECTS
1337 ? "elf64-bigmips"
1338 : (HAVE_NEWABI
1339 ? "elf32-nbigmips" : "elf32-bigmips"))
1340 : (HAVE_64BIT_OBJECTS
1341 ? "elf64-littlemips"
1342 : (HAVE_NEWABI
1343 ? "elf32-nlittlemips" : "elf32-littlemips")));
e013f690
TS
1344#endif
1345 default:
1346 abort ();
1347 return NULL;
1348 }
1349}
1350
1e915849
RS
1351/* Return the length of instruction INSN. */
1352
1353static inline unsigned int
1354insn_length (const struct mips_cl_insn *insn)
1355{
1356 if (!mips_opts.mips16)
1357 return 4;
1358 return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1359}
1360
1361/* Initialise INSN from opcode entry MO. Leave its position unspecified. */
1362
1363static void
1364create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1365{
1366 size_t i;
1367
1368 insn->insn_mo = mo;
1369 insn->use_extend = FALSE;
1370 insn->extend = 0;
1371 insn->insn_opcode = mo->match;
1372 insn->frag = NULL;
1373 insn->where = 0;
1374 for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1375 insn->fixp[i] = NULL;
1376 insn->fixed_p = (mips_opts.noreorder > 0);
1377 insn->noreorder_p = (mips_opts.noreorder > 0);
1378 insn->mips16_absolute_jump_p = 0;
1379}
1380
742a56fe
RS
1381/* Record the current MIPS16 mode in now_seg. */
1382
1383static void
1384mips_record_mips16_mode (void)
1385{
1386 segment_info_type *si;
1387
1388 si = seg_info (now_seg);
1389 if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
1390 si->tc_segment_info_data.mips16 = mips_opts.mips16;
1391}
1392
1e915849
RS
1393/* Install INSN at the location specified by its "frag" and "where" fields. */
1394
1395static void
1396install_insn (const struct mips_cl_insn *insn)
1397{
1398 char *f = insn->frag->fr_literal + insn->where;
1399 if (!mips_opts.mips16)
1400 md_number_to_chars (f, insn->insn_opcode, 4);
1401 else if (insn->mips16_absolute_jump_p)
1402 {
1403 md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1404 md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1405 }
1406 else
1407 {
1408 if (insn->use_extend)
1409 {
1410 md_number_to_chars (f, 0xf000 | insn->extend, 2);
1411 f += 2;
1412 }
1413 md_number_to_chars (f, insn->insn_opcode, 2);
1414 }
742a56fe 1415 mips_record_mips16_mode ();
1e915849
RS
1416}
1417
1418/* Move INSN to offset WHERE in FRAG. Adjust the fixups accordingly
1419 and install the opcode in the new location. */
1420
1421static void
1422move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1423{
1424 size_t i;
1425
1426 insn->frag = frag;
1427 insn->where = where;
1428 for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1429 if (insn->fixp[i] != NULL)
1430 {
1431 insn->fixp[i]->fx_frag = frag;
1432 insn->fixp[i]->fx_where = where;
1433 }
1434 install_insn (insn);
1435}
1436
1437/* Add INSN to the end of the output. */
1438
1439static void
1440add_fixed_insn (struct mips_cl_insn *insn)
1441{
1442 char *f = frag_more (insn_length (insn));
1443 move_insn (insn, frag_now, f - frag_now->fr_literal);
1444}
1445
1446/* Start a variant frag and move INSN to the start of the variant part,
1447 marking it as fixed. The other arguments are as for frag_var. */
1448
1449static void
1450add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1451 relax_substateT subtype, symbolS *symbol, offsetT offset)
1452{
1453 frag_grow (max_chars);
1454 move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1455 insn->fixed_p = 1;
1456 frag_var (rs_machine_dependent, max_chars, var,
1457 subtype, symbol, offset, NULL);
1458}
1459
1460/* Insert N copies of INSN into the history buffer, starting at
1461 position FIRST. Neither FIRST nor N need to be clipped. */
1462
1463static void
1464insert_into_history (unsigned int first, unsigned int n,
1465 const struct mips_cl_insn *insn)
1466{
1467 if (mips_relax.sequence != 2)
1468 {
1469 unsigned int i;
1470
1471 for (i = ARRAY_SIZE (history); i-- > first;)
1472 if (i >= first + n)
1473 history[i] = history[i - n];
1474 else
1475 history[i] = *insn;
1476 }
1477}
1478
1479/* Emit a nop instruction, recording it in the history buffer. */
1480
1481static void
1482emit_nop (void)
1483{
1484 add_fixed_insn (NOP_INSN);
1485 insert_into_history (0, 1, NOP_INSN);
1486}
1487
71400594
RS
1488/* Initialize vr4120_conflicts. There is a bit of duplication here:
1489 the idea is to make it obvious at a glance that each errata is
1490 included. */
1491
1492static void
1493init_vr4120_conflicts (void)
1494{
1495#define CONFLICT(FIRST, SECOND) \
1496 vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1497
1498 /* Errata 21 - [D]DIV[U] after [D]MACC */
1499 CONFLICT (MACC, DIV);
1500 CONFLICT (DMACC, DIV);
1501
1502 /* Errata 23 - Continuous DMULT[U]/DMACC instructions. */
1503 CONFLICT (DMULT, DMULT);
1504 CONFLICT (DMULT, DMACC);
1505 CONFLICT (DMACC, DMULT);
1506 CONFLICT (DMACC, DMACC);
1507
1508 /* Errata 24 - MT{LO,HI} after [D]MACC */
1509 CONFLICT (MACC, MTHILO);
1510 CONFLICT (DMACC, MTHILO);
1511
1512 /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1513 instruction is executed immediately after a MACC or DMACC
1514 instruction, the result of [either instruction] is incorrect." */
1515 CONFLICT (MACC, MULT);
1516 CONFLICT (MACC, DMULT);
1517 CONFLICT (DMACC, MULT);
1518 CONFLICT (DMACC, DMULT);
1519
1520 /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1521 executed immediately after a DMULT, DMULTU, DIV, DIVU,
1522 DDIV or DDIVU instruction, the result of the MACC or
1523 DMACC instruction is incorrect.". */
1524 CONFLICT (DMULT, MACC);
1525 CONFLICT (DMULT, DMACC);
1526 CONFLICT (DIV, MACC);
1527 CONFLICT (DIV, DMACC);
1528
1529#undef CONFLICT
1530}
1531
707bfff6
TS
1532struct regname {
1533 const char *name;
1534 unsigned int num;
1535};
1536
1537#define RTYPE_MASK 0x1ff00
1538#define RTYPE_NUM 0x00100
1539#define RTYPE_FPU 0x00200
1540#define RTYPE_FCC 0x00400
1541#define RTYPE_VEC 0x00800
1542#define RTYPE_GP 0x01000
1543#define RTYPE_CP0 0x02000
1544#define RTYPE_PC 0x04000
1545#define RTYPE_ACC 0x08000
1546#define RTYPE_CCC 0x10000
1547#define RNUM_MASK 0x000ff
1548#define RWARN 0x80000
1549
1550#define GENERIC_REGISTER_NUMBERS \
1551 {"$0", RTYPE_NUM | 0}, \
1552 {"$1", RTYPE_NUM | 1}, \
1553 {"$2", RTYPE_NUM | 2}, \
1554 {"$3", RTYPE_NUM | 3}, \
1555 {"$4", RTYPE_NUM | 4}, \
1556 {"$5", RTYPE_NUM | 5}, \
1557 {"$6", RTYPE_NUM | 6}, \
1558 {"$7", RTYPE_NUM | 7}, \
1559 {"$8", RTYPE_NUM | 8}, \
1560 {"$9", RTYPE_NUM | 9}, \
1561 {"$10", RTYPE_NUM | 10}, \
1562 {"$11", RTYPE_NUM | 11}, \
1563 {"$12", RTYPE_NUM | 12}, \
1564 {"$13", RTYPE_NUM | 13}, \
1565 {"$14", RTYPE_NUM | 14}, \
1566 {"$15", RTYPE_NUM | 15}, \
1567 {"$16", RTYPE_NUM | 16}, \
1568 {"$17", RTYPE_NUM | 17}, \
1569 {"$18", RTYPE_NUM | 18}, \
1570 {"$19", RTYPE_NUM | 19}, \
1571 {"$20", RTYPE_NUM | 20}, \
1572 {"$21", RTYPE_NUM | 21}, \
1573 {"$22", RTYPE_NUM | 22}, \
1574 {"$23", RTYPE_NUM | 23}, \
1575 {"$24", RTYPE_NUM | 24}, \
1576 {"$25", RTYPE_NUM | 25}, \
1577 {"$26", RTYPE_NUM | 26}, \
1578 {"$27", RTYPE_NUM | 27}, \
1579 {"$28", RTYPE_NUM | 28}, \
1580 {"$29", RTYPE_NUM | 29}, \
1581 {"$30", RTYPE_NUM | 30}, \
1582 {"$31", RTYPE_NUM | 31}
1583
1584#define FPU_REGISTER_NAMES \
1585 {"$f0", RTYPE_FPU | 0}, \
1586 {"$f1", RTYPE_FPU | 1}, \
1587 {"$f2", RTYPE_FPU | 2}, \
1588 {"$f3", RTYPE_FPU | 3}, \
1589 {"$f4", RTYPE_FPU | 4}, \
1590 {"$f5", RTYPE_FPU | 5}, \
1591 {"$f6", RTYPE_FPU | 6}, \
1592 {"$f7", RTYPE_FPU | 7}, \
1593 {"$f8", RTYPE_FPU | 8}, \
1594 {"$f9", RTYPE_FPU | 9}, \
1595 {"$f10", RTYPE_FPU | 10}, \
1596 {"$f11", RTYPE_FPU | 11}, \
1597 {"$f12", RTYPE_FPU | 12}, \
1598 {"$f13", RTYPE_FPU | 13}, \
1599 {"$f14", RTYPE_FPU | 14}, \
1600 {"$f15", RTYPE_FPU | 15}, \
1601 {"$f16", RTYPE_FPU | 16}, \
1602 {"$f17", RTYPE_FPU | 17}, \
1603 {"$f18", RTYPE_FPU | 18}, \
1604 {"$f19", RTYPE_FPU | 19}, \
1605 {"$f20", RTYPE_FPU | 20}, \
1606 {"$f21", RTYPE_FPU | 21}, \
1607 {"$f22", RTYPE_FPU | 22}, \
1608 {"$f23", RTYPE_FPU | 23}, \
1609 {"$f24", RTYPE_FPU | 24}, \
1610 {"$f25", RTYPE_FPU | 25}, \
1611 {"$f26", RTYPE_FPU | 26}, \
1612 {"$f27", RTYPE_FPU | 27}, \
1613 {"$f28", RTYPE_FPU | 28}, \
1614 {"$f29", RTYPE_FPU | 29}, \
1615 {"$f30", RTYPE_FPU | 30}, \
1616 {"$f31", RTYPE_FPU | 31}
1617
1618#define FPU_CONDITION_CODE_NAMES \
1619 {"$fcc0", RTYPE_FCC | 0}, \
1620 {"$fcc1", RTYPE_FCC | 1}, \
1621 {"$fcc2", RTYPE_FCC | 2}, \
1622 {"$fcc3", RTYPE_FCC | 3}, \
1623 {"$fcc4", RTYPE_FCC | 4}, \
1624 {"$fcc5", RTYPE_FCC | 5}, \
1625 {"$fcc6", RTYPE_FCC | 6}, \
1626 {"$fcc7", RTYPE_FCC | 7}
1627
1628#define COPROC_CONDITION_CODE_NAMES \
1629 {"$cc0", RTYPE_FCC | RTYPE_CCC | 0}, \
1630 {"$cc1", RTYPE_FCC | RTYPE_CCC | 1}, \
1631 {"$cc2", RTYPE_FCC | RTYPE_CCC | 2}, \
1632 {"$cc3", RTYPE_FCC | RTYPE_CCC | 3}, \
1633 {"$cc4", RTYPE_FCC | RTYPE_CCC | 4}, \
1634 {"$cc5", RTYPE_FCC | RTYPE_CCC | 5}, \
1635 {"$cc6", RTYPE_FCC | RTYPE_CCC | 6}, \
1636 {"$cc7", RTYPE_FCC | RTYPE_CCC | 7}
1637
1638#define N32N64_SYMBOLIC_REGISTER_NAMES \
1639 {"$a4", RTYPE_GP | 8}, \
1640 {"$a5", RTYPE_GP | 9}, \
1641 {"$a6", RTYPE_GP | 10}, \
1642 {"$a7", RTYPE_GP | 11}, \
1643 {"$ta0", RTYPE_GP | 8}, /* alias for $a4 */ \
1644 {"$ta1", RTYPE_GP | 9}, /* alias for $a5 */ \
1645 {"$ta2", RTYPE_GP | 10}, /* alias for $a6 */ \
1646 {"$ta3", RTYPE_GP | 11}, /* alias for $a7 */ \
1647 {"$t0", RTYPE_GP | 12}, \
1648 {"$t1", RTYPE_GP | 13}, \
1649 {"$t2", RTYPE_GP | 14}, \
1650 {"$t3", RTYPE_GP | 15}
1651
1652#define O32_SYMBOLIC_REGISTER_NAMES \
1653 {"$t0", RTYPE_GP | 8}, \
1654 {"$t1", RTYPE_GP | 9}, \
1655 {"$t2", RTYPE_GP | 10}, \
1656 {"$t3", RTYPE_GP | 11}, \
1657 {"$t4", RTYPE_GP | 12}, \
1658 {"$t5", RTYPE_GP | 13}, \
1659 {"$t6", RTYPE_GP | 14}, \
1660 {"$t7", RTYPE_GP | 15}, \
1661 {"$ta0", RTYPE_GP | 12}, /* alias for $t4 */ \
1662 {"$ta1", RTYPE_GP | 13}, /* alias for $t5 */ \
1663 {"$ta2", RTYPE_GP | 14}, /* alias for $t6 */ \
1664 {"$ta3", RTYPE_GP | 15} /* alias for $t7 */
1665
1666/* Remaining symbolic register names */
1667#define SYMBOLIC_REGISTER_NAMES \
1668 {"$zero", RTYPE_GP | 0}, \
1669 {"$at", RTYPE_GP | 1}, \
1670 {"$AT", RTYPE_GP | 1}, \
1671 {"$v0", RTYPE_GP | 2}, \
1672 {"$v1", RTYPE_GP | 3}, \
1673 {"$a0", RTYPE_GP | 4}, \
1674 {"$a1", RTYPE_GP | 5}, \
1675 {"$a2", RTYPE_GP | 6}, \
1676 {"$a3", RTYPE_GP | 7}, \
1677 {"$s0", RTYPE_GP | 16}, \
1678 {"$s1", RTYPE_GP | 17}, \
1679 {"$s2", RTYPE_GP | 18}, \
1680 {"$s3", RTYPE_GP | 19}, \
1681 {"$s4", RTYPE_GP | 20}, \
1682 {"$s5", RTYPE_GP | 21}, \
1683 {"$s6", RTYPE_GP | 22}, \
1684 {"$s7", RTYPE_GP | 23}, \
1685 {"$t8", RTYPE_GP | 24}, \
1686 {"$t9", RTYPE_GP | 25}, \
1687 {"$k0", RTYPE_GP | 26}, \
1688 {"$kt0", RTYPE_GP | 26}, \
1689 {"$k1", RTYPE_GP | 27}, \
1690 {"$kt1", RTYPE_GP | 27}, \
1691 {"$gp", RTYPE_GP | 28}, \
1692 {"$sp", RTYPE_GP | 29}, \
1693 {"$s8", RTYPE_GP | 30}, \
1694 {"$fp", RTYPE_GP | 30}, \
1695 {"$ra", RTYPE_GP | 31}
1696
1697#define MIPS16_SPECIAL_REGISTER_NAMES \
1698 {"$pc", RTYPE_PC | 0}
1699
1700#define MDMX_VECTOR_REGISTER_NAMES \
1701 /* {"$v0", RTYPE_VEC | 0}, clash with REG 2 above */ \
1702 /* {"$v1", RTYPE_VEC | 1}, clash with REG 3 above */ \
1703 {"$v2", RTYPE_VEC | 2}, \
1704 {"$v3", RTYPE_VEC | 3}, \
1705 {"$v4", RTYPE_VEC | 4}, \
1706 {"$v5", RTYPE_VEC | 5}, \
1707 {"$v6", RTYPE_VEC | 6}, \
1708 {"$v7", RTYPE_VEC | 7}, \
1709 {"$v8", RTYPE_VEC | 8}, \
1710 {"$v9", RTYPE_VEC | 9}, \
1711 {"$v10", RTYPE_VEC | 10}, \
1712 {"$v11", RTYPE_VEC | 11}, \
1713 {"$v12", RTYPE_VEC | 12}, \
1714 {"$v13", RTYPE_VEC | 13}, \
1715 {"$v14", RTYPE_VEC | 14}, \
1716 {"$v15", RTYPE_VEC | 15}, \
1717 {"$v16", RTYPE_VEC | 16}, \
1718 {"$v17", RTYPE_VEC | 17}, \
1719 {"$v18", RTYPE_VEC | 18}, \
1720 {"$v19", RTYPE_VEC | 19}, \
1721 {"$v20", RTYPE_VEC | 20}, \
1722 {"$v21", RTYPE_VEC | 21}, \
1723 {"$v22", RTYPE_VEC | 22}, \
1724 {"$v23", RTYPE_VEC | 23}, \
1725 {"$v24", RTYPE_VEC | 24}, \
1726 {"$v25", RTYPE_VEC | 25}, \
1727 {"$v26", RTYPE_VEC | 26}, \
1728 {"$v27", RTYPE_VEC | 27}, \
1729 {"$v28", RTYPE_VEC | 28}, \
1730 {"$v29", RTYPE_VEC | 29}, \
1731 {"$v30", RTYPE_VEC | 30}, \
1732 {"$v31", RTYPE_VEC | 31}
1733
1734#define MIPS_DSP_ACCUMULATOR_NAMES \
1735 {"$ac0", RTYPE_ACC | 0}, \
1736 {"$ac1", RTYPE_ACC | 1}, \
1737 {"$ac2", RTYPE_ACC | 2}, \
1738 {"$ac3", RTYPE_ACC | 3}
1739
1740static const struct regname reg_names[] = {
1741 GENERIC_REGISTER_NUMBERS,
1742 FPU_REGISTER_NAMES,
1743 FPU_CONDITION_CODE_NAMES,
1744 COPROC_CONDITION_CODE_NAMES,
1745
1746 /* The $txx registers depends on the abi,
1747 these will be added later into the symbol table from
1748 one of the tables below once mips_abi is set after
1749 parsing of arguments from the command line. */
1750 SYMBOLIC_REGISTER_NAMES,
1751
1752 MIPS16_SPECIAL_REGISTER_NAMES,
1753 MDMX_VECTOR_REGISTER_NAMES,
1754 MIPS_DSP_ACCUMULATOR_NAMES,
1755 {0, 0}
1756};
1757
1758static const struct regname reg_names_o32[] = {
1759 O32_SYMBOLIC_REGISTER_NAMES,
1760 {0, 0}
1761};
1762
1763static const struct regname reg_names_n32n64[] = {
1764 N32N64_SYMBOLIC_REGISTER_NAMES,
1765 {0, 0}
1766};
1767
1768static int
1769reg_lookup (char **s, unsigned int types, unsigned int *regnop)
1770{
1771 symbolS *symbolP;
1772 char *e;
1773 char save_c;
1774 int reg = -1;
1775
1776 /* Find end of name. */
1777 e = *s;
1778 if (is_name_beginner (*e))
1779 ++e;
1780 while (is_part_of_name (*e))
1781 ++e;
1782
1783 /* Terminate name. */
1784 save_c = *e;
1785 *e = '\0';
1786
1787 /* Look for a register symbol. */
1788 if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
1789 {
1790 int r = S_GET_VALUE (symbolP);
1791 if (r & types)
1792 reg = r & RNUM_MASK;
1793 else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
1794 /* Convert GP reg $v0/1 to MDMX reg $v0/1! */
1795 reg = (r & RNUM_MASK) - 2;
1796 }
1797 /* Else see if this is a register defined in an itbl entry. */
1798 else if ((types & RTYPE_GP) && itbl_have_entries)
1799 {
1800 char *n = *s;
1801 unsigned long r;
1802
1803 if (*n == '$')
1804 ++n;
1805 if (itbl_get_reg_val (n, &r))
1806 reg = r & RNUM_MASK;
1807 }
1808
1809 /* Advance to next token if a register was recognised. */
1810 if (reg >= 0)
1811 *s = e;
1812 else if (types & RWARN)
20203fb9 1813 as_warn (_("Unrecognized register name `%s'"), *s);
707bfff6
TS
1814
1815 *e = save_c;
1816 if (regnop)
1817 *regnop = reg;
1818 return reg >= 0;
1819}
1820
037b32b9 1821/* Return TRUE if opcode MO is valid on the currently selected ISA and
f79e2745 1822 architecture. Use is_opcode_valid_16 for MIPS16 opcodes. */
037b32b9
AN
1823
1824static bfd_boolean
f79e2745 1825is_opcode_valid (const struct mips_opcode *mo)
037b32b9
AN
1826{
1827 int isa = mips_opts.isa;
1828 int fp_s, fp_d;
1829
1830 if (mips_opts.ase_mdmx)
1831 isa |= INSN_MDMX;
1832 if (mips_opts.ase_dsp)
1833 isa |= INSN_DSP;
1834 if (mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
1835 isa |= INSN_DSP64;
1836 if (mips_opts.ase_dspr2)
1837 isa |= INSN_DSPR2;
1838 if (mips_opts.ase_mt)
1839 isa |= INSN_MT;
1840 if (mips_opts.ase_mips3d)
1841 isa |= INSN_MIPS3D;
1842 if (mips_opts.ase_smartmips)
1843 isa |= INSN_SMARTMIPS;
1844
b19e8a9b
AN
1845 /* Don't accept instructions based on the ISA if the CPU does not implement
1846 all the coprocessor insns. */
1847 if (NO_ISA_COP (mips_opts.arch)
1848 && COP_INSN (mo->pinfo))
1849 isa = 0;
1850
037b32b9
AN
1851 if (!OPCODE_IS_MEMBER (mo, isa, mips_opts.arch))
1852 return FALSE;
1853
1854 /* Check whether the instruction or macro requires single-precision or
1855 double-precision floating-point support. Note that this information is
1856 stored differently in the opcode table for insns and macros. */
1857 if (mo->pinfo == INSN_MACRO)
1858 {
1859 fp_s = mo->pinfo2 & INSN2_M_FP_S;
1860 fp_d = mo->pinfo2 & INSN2_M_FP_D;
1861 }
1862 else
1863 {
1864 fp_s = mo->pinfo & FP_S;
1865 fp_d = mo->pinfo & FP_D;
1866 }
1867
1868 if (fp_d && (mips_opts.soft_float || mips_opts.single_float))
1869 return FALSE;
1870
1871 if (fp_s && mips_opts.soft_float)
1872 return FALSE;
1873
1874 return TRUE;
1875}
1876
1877/* Return TRUE if the MIPS16 opcode MO is valid on the currently
1878 selected ISA and architecture. */
1879
1880static bfd_boolean
1881is_opcode_valid_16 (const struct mips_opcode *mo)
1882{
1883 return OPCODE_IS_MEMBER (mo, mips_opts.isa, mips_opts.arch) ? TRUE : FALSE;
1884}
1885
707bfff6
TS
1886/* This function is called once, at assembler startup time. It should set up
1887 all the tables, etc. that the MD part of the assembler will need. */
156c2f8b 1888
252b5132 1889void
17a2f251 1890md_begin (void)
252b5132 1891{
3994f87e 1892 const char *retval = NULL;
156c2f8b 1893 int i = 0;
252b5132 1894 int broken = 0;
1f25f5d3 1895
0a44bf69
RS
1896 if (mips_pic != NO_PIC)
1897 {
1898 if (g_switch_seen && g_switch_value != 0)
1899 as_bad (_("-G may not be used in position-independent code"));
1900 g_switch_value = 0;
1901 }
1902
fef14a42 1903 if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
252b5132
RH
1904 as_warn (_("Could not set architecture and machine"));
1905
252b5132
RH
1906 op_hash = hash_new ();
1907
1908 for (i = 0; i < NUMOPCODES;)
1909 {
1910 const char *name = mips_opcodes[i].name;
1911
17a2f251 1912 retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
252b5132
RH
1913 if (retval != NULL)
1914 {
1915 fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1916 mips_opcodes[i].name, retval);
1917 /* Probably a memory allocation problem? Give up now. */
1918 as_fatal (_("Broken assembler. No assembly attempted."));
1919 }
1920 do
1921 {
1922 if (mips_opcodes[i].pinfo != INSN_MACRO)
1923 {
1924 if (!validate_mips_insn (&mips_opcodes[i]))
1925 broken = 1;
1e915849
RS
1926 if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1927 {
1928 create_insn (&nop_insn, mips_opcodes + i);
c67a084a
NC
1929 if (mips_fix_loongson2f_nop)
1930 nop_insn.insn_opcode = LOONGSON2F_NOP_INSN;
1e915849
RS
1931 nop_insn.fixed_p = 1;
1932 }
252b5132
RH
1933 }
1934 ++i;
1935 }
1936 while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1937 }
1938
1939 mips16_op_hash = hash_new ();
1940
1941 i = 0;
1942 while (i < bfd_mips16_num_opcodes)
1943 {
1944 const char *name = mips16_opcodes[i].name;
1945
17a2f251 1946 retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
252b5132
RH
1947 if (retval != NULL)
1948 as_fatal (_("internal: can't hash `%s': %s"),
1949 mips16_opcodes[i].name, retval);
1950 do
1951 {
1952 if (mips16_opcodes[i].pinfo != INSN_MACRO
1953 && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1954 != mips16_opcodes[i].match))
1955 {
1956 fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1957 mips16_opcodes[i].name, mips16_opcodes[i].args);
1958 broken = 1;
1959 }
1e915849
RS
1960 if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1961 {
1962 create_insn (&mips16_nop_insn, mips16_opcodes + i);
1963 mips16_nop_insn.fixed_p = 1;
1964 }
252b5132
RH
1965 ++i;
1966 }
1967 while (i < bfd_mips16_num_opcodes
1968 && strcmp (mips16_opcodes[i].name, name) == 0);
1969 }
1970
1971 if (broken)
1972 as_fatal (_("Broken assembler. No assembly attempted."));
1973
1974 /* We add all the general register names to the symbol table. This
1975 helps us detect invalid uses of them. */
707bfff6
TS
1976 for (i = 0; reg_names[i].name; i++)
1977 symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
8fc4ee9b 1978 reg_names[i].num, /* & RNUM_MASK, */
707bfff6
TS
1979 &zero_address_frag));
1980 if (HAVE_NEWABI)
1981 for (i = 0; reg_names_n32n64[i].name; i++)
1982 symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
8fc4ee9b 1983 reg_names_n32n64[i].num, /* & RNUM_MASK, */
252b5132 1984 &zero_address_frag));
707bfff6
TS
1985 else
1986 for (i = 0; reg_names_o32[i].name; i++)
1987 symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
8fc4ee9b 1988 reg_names_o32[i].num, /* & RNUM_MASK, */
6047c971 1989 &zero_address_frag));
6047c971 1990
7d10b47d 1991 mips_no_prev_insn ();
252b5132
RH
1992
1993 mips_gprmask = 0;
1994 mips_cprmask[0] = 0;
1995 mips_cprmask[1] = 0;
1996 mips_cprmask[2] = 0;
1997 mips_cprmask[3] = 0;
1998
1999 /* set the default alignment for the text section (2**2) */
2000 record_alignment (text_section, 2);
2001
4d0d148d 2002 bfd_set_gp_size (stdoutput, g_switch_value);
252b5132 2003
707bfff6 2004#ifdef OBJ_ELF
f43abd2b 2005 if (IS_ELF)
252b5132 2006 {
0a44bf69
RS
2007 /* On a native system other than VxWorks, sections must be aligned
2008 to 16 byte boundaries. When configured for an embedded ELF
2009 target, we don't bother. */
c41e87e3
CF
2010 if (strncmp (TARGET_OS, "elf", 3) != 0
2011 && strncmp (TARGET_OS, "vxworks", 7) != 0)
252b5132
RH
2012 {
2013 (void) bfd_set_section_alignment (stdoutput, text_section, 4);
2014 (void) bfd_set_section_alignment (stdoutput, data_section, 4);
2015 (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
2016 }
2017
2018 /* Create a .reginfo section for register masks and a .mdebug
2019 section for debugging information. */
2020 {
2021 segT seg;
2022 subsegT subseg;
2023 flagword flags;
2024 segT sec;
2025
2026 seg = now_seg;
2027 subseg = now_subseg;
2028
2029 /* The ABI says this section should be loaded so that the
2030 running program can access it. However, we don't load it
2031 if we are configured for an embedded target */
2032 flags = SEC_READONLY | SEC_DATA;
c41e87e3 2033 if (strncmp (TARGET_OS, "elf", 3) != 0)
252b5132
RH
2034 flags |= SEC_ALLOC | SEC_LOAD;
2035
316f5878 2036 if (mips_abi != N64_ABI)
252b5132
RH
2037 {
2038 sec = subseg_new (".reginfo", (subsegT) 0);
2039
195325d2
TS
2040 bfd_set_section_flags (stdoutput, sec, flags);
2041 bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
bdaaa2e1 2042
252b5132 2043 mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
252b5132
RH
2044 }
2045 else
2046 {
2047 /* The 64-bit ABI uses a .MIPS.options section rather than
2048 .reginfo section. */
2049 sec = subseg_new (".MIPS.options", (subsegT) 0);
195325d2
TS
2050 bfd_set_section_flags (stdoutput, sec, flags);
2051 bfd_set_section_alignment (stdoutput, sec, 3);
252b5132 2052
252b5132
RH
2053 /* Set up the option header. */
2054 {
2055 Elf_Internal_Options opthdr;
2056 char *f;
2057
2058 opthdr.kind = ODK_REGINFO;
2059 opthdr.size = (sizeof (Elf_External_Options)
2060 + sizeof (Elf64_External_RegInfo));
2061 opthdr.section = 0;
2062 opthdr.info = 0;
2063 f = frag_more (sizeof (Elf_External_Options));
2064 bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
2065 (Elf_External_Options *) f);
2066
2067 mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
2068 }
252b5132
RH
2069 }
2070
2071 if (ECOFF_DEBUGGING)
2072 {
2073 sec = subseg_new (".mdebug", (subsegT) 0);
2074 (void) bfd_set_section_flags (stdoutput, sec,
2075 SEC_HAS_CONTENTS | SEC_READONLY);
2076 (void) bfd_set_section_alignment (stdoutput, sec, 2);
2077 }
f43abd2b 2078 else if (mips_flag_pdr)
ecb4347a
DJ
2079 {
2080 pdr_seg = subseg_new (".pdr", (subsegT) 0);
2081 (void) bfd_set_section_flags (stdoutput, pdr_seg,
2082 SEC_READONLY | SEC_RELOC
2083 | SEC_DEBUGGING);
2084 (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
2085 }
252b5132
RH
2086
2087 subseg_set (seg, subseg);
2088 }
2089 }
707bfff6 2090#endif /* OBJ_ELF */
252b5132
RH
2091
2092 if (! ECOFF_DEBUGGING)
2093 md_obj_begin ();
71400594
RS
2094
2095 if (mips_fix_vr4120)
2096 init_vr4120_conflicts ();
252b5132
RH
2097}
2098
2099void
17a2f251 2100md_mips_end (void)
252b5132
RH
2101{
2102 if (! ECOFF_DEBUGGING)
2103 md_obj_end ();
2104}
2105
2106void
17a2f251 2107md_assemble (char *str)
252b5132
RH
2108{
2109 struct mips_cl_insn insn;
f6688943
TS
2110 bfd_reloc_code_real_type unused_reloc[3]
2111 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
252b5132
RH
2112
2113 imm_expr.X_op = O_absent;
5f74bc13 2114 imm2_expr.X_op = O_absent;
252b5132 2115 offset_expr.X_op = O_absent;
f6688943
TS
2116 imm_reloc[0] = BFD_RELOC_UNUSED;
2117 imm_reloc[1] = BFD_RELOC_UNUSED;
2118 imm_reloc[2] = BFD_RELOC_UNUSED;
2119 offset_reloc[0] = BFD_RELOC_UNUSED;
2120 offset_reloc[1] = BFD_RELOC_UNUSED;
2121 offset_reloc[2] = BFD_RELOC_UNUSED;
252b5132
RH
2122
2123 if (mips_opts.mips16)
2124 mips16_ip (str, &insn);
2125 else
2126 {
2127 mips_ip (str, &insn);
beae10d5
KH
2128 DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
2129 str, insn.insn_opcode));
252b5132
RH
2130 }
2131
2132 if (insn_error)
2133 {
2134 as_bad ("%s `%s'", insn_error, str);
2135 return;
2136 }
2137
2138 if (insn.insn_mo->pinfo == INSN_MACRO)
2139 {
584892a6 2140 macro_start ();
252b5132
RH
2141 if (mips_opts.mips16)
2142 mips16_macro (&insn);
2143 else
2144 macro (&insn);
584892a6 2145 macro_end ();
252b5132
RH
2146 }
2147 else
2148 {
2149 if (imm_expr.X_op != O_absent)
4d7206a2 2150 append_insn (&insn, &imm_expr, imm_reloc);
252b5132 2151 else if (offset_expr.X_op != O_absent)
4d7206a2 2152 append_insn (&insn, &offset_expr, offset_reloc);
252b5132 2153 else
4d7206a2 2154 append_insn (&insn, NULL, unused_reloc);
252b5132
RH
2155 }
2156}
2157
738e5348
RS
2158/* Convenience functions for abstracting away the differences between
2159 MIPS16 and non-MIPS16 relocations. */
2160
2161static inline bfd_boolean
2162mips16_reloc_p (bfd_reloc_code_real_type reloc)
2163{
2164 switch (reloc)
2165 {
2166 case BFD_RELOC_MIPS16_JMP:
2167 case BFD_RELOC_MIPS16_GPREL:
2168 case BFD_RELOC_MIPS16_GOT16:
2169 case BFD_RELOC_MIPS16_CALL16:
2170 case BFD_RELOC_MIPS16_HI16_S:
2171 case BFD_RELOC_MIPS16_HI16:
2172 case BFD_RELOC_MIPS16_LO16:
2173 return TRUE;
2174
2175 default:
2176 return FALSE;
2177 }
2178}
2179
2180static inline bfd_boolean
2181got16_reloc_p (bfd_reloc_code_real_type reloc)
2182{
2183 return reloc == BFD_RELOC_MIPS_GOT16 || reloc == BFD_RELOC_MIPS16_GOT16;
2184}
2185
2186static inline bfd_boolean
2187hi16_reloc_p (bfd_reloc_code_real_type reloc)
2188{
2189 return reloc == BFD_RELOC_HI16_S || reloc == BFD_RELOC_MIPS16_HI16_S;
2190}
2191
2192static inline bfd_boolean
2193lo16_reloc_p (bfd_reloc_code_real_type reloc)
2194{
2195 return reloc == BFD_RELOC_LO16 || reloc == BFD_RELOC_MIPS16_LO16;
2196}
2197
5919d012 2198/* Return true if the given relocation might need a matching %lo().
0a44bf69
RS
2199 This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2200 need a matching %lo() when applied to local symbols. */
5919d012
RS
2201
2202static inline bfd_boolean
17a2f251 2203reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
5919d012 2204{
3b91255e 2205 return (HAVE_IN_PLACE_ADDENDS
738e5348 2206 && (hi16_reloc_p (reloc)
0a44bf69
RS
2207 /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2208 all GOT16 relocations evaluate to "G". */
738e5348
RS
2209 || (got16_reloc_p (reloc) && mips_pic != VXWORKS_PIC)));
2210}
2211
2212/* Return the type of %lo() reloc needed by RELOC, given that
2213 reloc_needs_lo_p. */
2214
2215static inline bfd_reloc_code_real_type
2216matching_lo_reloc (bfd_reloc_code_real_type reloc)
2217{
2218 return mips16_reloc_p (reloc) ? BFD_RELOC_MIPS16_LO16 : BFD_RELOC_LO16;
5919d012
RS
2219}
2220
2221/* Return true if the given fixup is followed by a matching R_MIPS_LO16
2222 relocation. */
2223
2224static inline bfd_boolean
17a2f251 2225fixup_has_matching_lo_p (fixS *fixp)
5919d012
RS
2226{
2227 return (fixp->fx_next != NULL
738e5348 2228 && fixp->fx_next->fx_r_type == matching_lo_reloc (fixp->fx_r_type)
5919d012
RS
2229 && fixp->fx_addsy == fixp->fx_next->fx_addsy
2230 && fixp->fx_offset == fixp->fx_next->fx_offset);
2231}
2232
252b5132
RH
2233/* See whether instruction IP reads register REG. CLASS is the type
2234 of register. */
2235
2236static int
71400594 2237insn_uses_reg (const struct mips_cl_insn *ip, unsigned int reg,
96d56e9f 2238 enum mips_regclass regclass)
252b5132 2239{
96d56e9f 2240 if (regclass == MIPS16_REG)
252b5132 2241 {
9c2799c2 2242 gas_assert (mips_opts.mips16);
252b5132 2243 reg = mips16_to_32_reg_map[reg];
96d56e9f 2244 regclass = MIPS_GR_REG;
252b5132
RH
2245 }
2246
85b51719 2247 /* Don't report on general register ZERO, since it never changes. */
96d56e9f 2248 if (regclass == MIPS_GR_REG && reg == ZERO)
252b5132
RH
2249 return 0;
2250
96d56e9f 2251 if (regclass == MIPS_FP_REG)
252b5132 2252 {
9c2799c2 2253 gas_assert (! mips_opts.mips16);
252b5132
RH
2254 /* If we are called with either $f0 or $f1, we must check $f0.
2255 This is not optimal, because it will introduce an unnecessary
2256 NOP between "lwc1 $f0" and "swc1 $f1". To fix this we would
2257 need to distinguish reading both $f0 and $f1 or just one of
2258 them. Note that we don't have to check the other way,
2259 because there is no instruction that sets both $f0 and $f1
2260 and requires a delay. */
2261 if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
bf12938e 2262 && ((EXTRACT_OPERAND (FS, *ip) & ~(unsigned) 1)
252b5132
RH
2263 == (reg &~ (unsigned) 1)))
2264 return 1;
2265 if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
bf12938e 2266 && ((EXTRACT_OPERAND (FT, *ip) & ~(unsigned) 1)
252b5132
RH
2267 == (reg &~ (unsigned) 1)))
2268 return 1;
2269 }
2270 else if (! mips_opts.mips16)
2271 {
2272 if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
bf12938e 2273 && EXTRACT_OPERAND (RS, *ip) == reg)
252b5132
RH
2274 return 1;
2275 if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
bf12938e 2276 && EXTRACT_OPERAND (RT, *ip) == reg)
252b5132
RH
2277 return 1;
2278 }
2279 else
2280 {
2281 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
bf12938e 2282 && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)] == reg)
252b5132
RH
2283 return 1;
2284 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
bf12938e 2285 && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)] == reg)
252b5132
RH
2286 return 1;
2287 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
bf12938e 2288 && (mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]
252b5132
RH
2289 == reg))
2290 return 1;
2291 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
2292 return 1;
2293 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
2294 return 1;
2295 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
2296 return 1;
2297 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
bf12938e 2298 && MIPS16_EXTRACT_OPERAND (REGR32, *ip) == reg)
252b5132
RH
2299 return 1;
2300 }
2301
2302 return 0;
2303}
2304
2305/* This function returns true if modifying a register requires a
2306 delay. */
2307
2308static int
17a2f251 2309reg_needs_delay (unsigned int reg)
252b5132
RH
2310{
2311 unsigned long prev_pinfo;
2312
47e39b9d 2313 prev_pinfo = history[0].insn_mo->pinfo;
252b5132 2314 if (! mips_opts.noreorder
81912461
ILT
2315 && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2316 && ! gpr_interlocks)
2317 || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2318 && ! cop_interlocks)))
252b5132 2319 {
81912461
ILT
2320 /* A load from a coprocessor or from memory. All load delays
2321 delay the use of general register rt for one instruction. */
bdaaa2e1 2322 /* Itbl support may require additional care here. */
252b5132 2323 know (prev_pinfo & INSN_WRITE_GPR_T);
bf12938e 2324 if (reg == EXTRACT_OPERAND (RT, history[0]))
252b5132
RH
2325 return 1;
2326 }
2327
2328 return 0;
2329}
2330
404a8071
RS
2331/* Move all labels in insn_labels to the current insertion point. */
2332
2333static void
2334mips_move_labels (void)
2335{
a8dbcb85 2336 segment_info_type *si = seg_info (now_seg);
404a8071
RS
2337 struct insn_label_list *l;
2338 valueT val;
2339
a8dbcb85 2340 for (l = si->label_list; l != NULL; l = l->next)
404a8071 2341 {
9c2799c2 2342 gas_assert (S_GET_SEGMENT (l->label) == now_seg);
404a8071
RS
2343 symbol_set_frag (l->label, frag_now);
2344 val = (valueT) frag_now_fix ();
2345 /* mips16 text labels are stored as odd. */
2346 if (mips_opts.mips16)
2347 ++val;
2348 S_SET_VALUE (l->label, val);
2349 }
2350}
2351
5f0fe04b
TS
2352static bfd_boolean
2353s_is_linkonce (symbolS *sym, segT from_seg)
2354{
2355 bfd_boolean linkonce = FALSE;
2356 segT symseg = S_GET_SEGMENT (sym);
2357
2358 if (symseg != from_seg && !S_IS_LOCAL (sym))
2359 {
2360 if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
2361 linkonce = TRUE;
2362#ifdef OBJ_ELF
2363 /* The GNU toolchain uses an extension for ELF: a section
2364 beginning with the magic string .gnu.linkonce is a
2365 linkonce section. */
2366 if (strncmp (segment_name (symseg), ".gnu.linkonce",
2367 sizeof ".gnu.linkonce" - 1) == 0)
2368 linkonce = TRUE;
2369#endif
2370 }
2371 return linkonce;
2372}
2373
252b5132
RH
2374/* Mark instruction labels in mips16 mode. This permits the linker to
2375 handle them specially, such as generating jalx instructions when
2376 needed. We also make them odd for the duration of the assembly, in
2377 order to generate the right sort of code. We will make them even
2378 in the adjust_symtab routine, while leaving them marked. This is
2379 convenient for the debugger and the disassembler. The linker knows
2380 to make them odd again. */
2381
2382static void
17a2f251 2383mips16_mark_labels (void)
252b5132 2384{
a8dbcb85
TS
2385 segment_info_type *si = seg_info (now_seg);
2386 struct insn_label_list *l;
252b5132 2387
a8dbcb85
TS
2388 if (!mips_opts.mips16)
2389 return;
2390
2391 for (l = si->label_list; l != NULL; l = l->next)
2392 {
2393 symbolS *label = l->label;
2394
2395#if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
f43abd2b 2396 if (IS_ELF)
30c09090 2397 S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label)));
252b5132 2398#endif
5f0fe04b
TS
2399 if ((S_GET_VALUE (label) & 1) == 0
2400 /* Don't adjust the address if the label is global or weak, or
2401 in a link-once section, since we'll be emitting symbol reloc
2402 references to it which will be patched up by the linker, and
2403 the final value of the symbol may or may not be MIPS16. */
2404 && ! S_IS_WEAK (label)
2405 && ! S_IS_EXTERNAL (label)
2406 && ! s_is_linkonce (label, now_seg))
a8dbcb85 2407 S_SET_VALUE (label, S_GET_VALUE (label) | 1);
252b5132
RH
2408 }
2409}
2410
4d7206a2
RS
2411/* End the current frag. Make it a variant frag and record the
2412 relaxation info. */
2413
2414static void
2415relax_close_frag (void)
2416{
584892a6 2417 mips_macro_warning.first_frag = frag_now;
4d7206a2 2418 frag_var (rs_machine_dependent, 0, 0,
584892a6 2419 RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
4d7206a2
RS
2420 mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2421
2422 memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2423 mips_relax.first_fixup = 0;
2424}
2425
2426/* Start a new relaxation sequence whose expansion depends on SYMBOL.
2427 See the comment above RELAX_ENCODE for more details. */
2428
2429static void
2430relax_start (symbolS *symbol)
2431{
9c2799c2 2432 gas_assert (mips_relax.sequence == 0);
4d7206a2
RS
2433 mips_relax.sequence = 1;
2434 mips_relax.symbol = symbol;
2435}
2436
2437/* Start generating the second version of a relaxable sequence.
2438 See the comment above RELAX_ENCODE for more details. */
252b5132
RH
2439
2440static void
4d7206a2
RS
2441relax_switch (void)
2442{
9c2799c2 2443 gas_assert (mips_relax.sequence == 1);
4d7206a2
RS
2444 mips_relax.sequence = 2;
2445}
2446
2447/* End the current relaxable sequence. */
2448
2449static void
2450relax_end (void)
2451{
9c2799c2 2452 gas_assert (mips_relax.sequence == 2);
4d7206a2
RS
2453 relax_close_frag ();
2454 mips_relax.sequence = 0;
2455}
2456
71400594
RS
2457/* Classify an instruction according to the FIX_VR4120_* enumeration.
2458 Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
2459 by VR4120 errata. */
4d7206a2 2460
71400594
RS
2461static unsigned int
2462classify_vr4120_insn (const char *name)
252b5132 2463{
71400594
RS
2464 if (strncmp (name, "macc", 4) == 0)
2465 return FIX_VR4120_MACC;
2466 if (strncmp (name, "dmacc", 5) == 0)
2467 return FIX_VR4120_DMACC;
2468 if (strncmp (name, "mult", 4) == 0)
2469 return FIX_VR4120_MULT;
2470 if (strncmp (name, "dmult", 5) == 0)
2471 return FIX_VR4120_DMULT;
2472 if (strstr (name, "div"))
2473 return FIX_VR4120_DIV;
2474 if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
2475 return FIX_VR4120_MTHILO;
2476 return NUM_FIX_VR4120_CLASSES;
2477}
252b5132 2478
ff239038
CM
2479#define INSN_ERET 0x42000018
2480#define INSN_DERET 0x4200001f
2481
71400594
RS
2482/* Return the number of instructions that must separate INSN1 and INSN2,
2483 where INSN1 is the earlier instruction. Return the worst-case value
2484 for any INSN2 if INSN2 is null. */
252b5132 2485
71400594
RS
2486static unsigned int
2487insns_between (const struct mips_cl_insn *insn1,
2488 const struct mips_cl_insn *insn2)
2489{
2490 unsigned long pinfo1, pinfo2;
2491
2492 /* This function needs to know which pinfo flags are set for INSN2
2493 and which registers INSN2 uses. The former is stored in PINFO2 and
2494 the latter is tested via INSN2_USES_REG. If INSN2 is null, PINFO2
2495 will have every flag set and INSN2_USES_REG will always return true. */
2496 pinfo1 = insn1->insn_mo->pinfo;
2497 pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
252b5132 2498
71400594
RS
2499#define INSN2_USES_REG(REG, CLASS) \
2500 (insn2 == NULL || insn_uses_reg (insn2, REG, CLASS))
2501
2502 /* For most targets, write-after-read dependencies on the HI and LO
2503 registers must be separated by at least two instructions. */
2504 if (!hilo_interlocks)
252b5132 2505 {
71400594
RS
2506 if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
2507 return 2;
2508 if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
2509 return 2;
2510 }
2511
2512 /* If we're working around r7000 errata, there must be two instructions
2513 between an mfhi or mflo and any instruction that uses the result. */
2514 if (mips_7000_hilo_fix
2515 && MF_HILO_INSN (pinfo1)
2516 && INSN2_USES_REG (EXTRACT_OPERAND (RD, *insn1), MIPS_GR_REG))
2517 return 2;
2518
ff239038
CM
2519 /* If we're working around 24K errata, one instruction is required
2520 if an ERET or DERET is followed by a branch instruction. */
2521 if (mips_fix_24k)
2522 {
2523 if (insn1->insn_opcode == INSN_ERET
2524 || insn1->insn_opcode == INSN_DERET)
2525 {
2526 if (insn2 == NULL
2527 || insn2->insn_opcode == INSN_ERET
2528 || insn2->insn_opcode == INSN_DERET
2529 || (insn2->insn_mo->pinfo
2530 & (INSN_UNCOND_BRANCH_DELAY
2531 | INSN_COND_BRANCH_DELAY
2532 | INSN_COND_BRANCH_LIKELY)) != 0)
2533 return 1;
2534 }
2535 }
2536
71400594
RS
2537 /* If working around VR4120 errata, check for combinations that need
2538 a single intervening instruction. */
2539 if (mips_fix_vr4120)
2540 {
2541 unsigned int class1, class2;
252b5132 2542
71400594
RS
2543 class1 = classify_vr4120_insn (insn1->insn_mo->name);
2544 if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
252b5132 2545 {
71400594
RS
2546 if (insn2 == NULL)
2547 return 1;
2548 class2 = classify_vr4120_insn (insn2->insn_mo->name);
2549 if (vr4120_conflicts[class1] & (1 << class2))
2550 return 1;
252b5132 2551 }
71400594
RS
2552 }
2553
2554 if (!mips_opts.mips16)
2555 {
2556 /* Check for GPR or coprocessor load delays. All such delays
2557 are on the RT register. */
2558 /* Itbl support may require additional care here. */
2559 if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
2560 || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
252b5132 2561 {
71400594
RS
2562 know (pinfo1 & INSN_WRITE_GPR_T);
2563 if (INSN2_USES_REG (EXTRACT_OPERAND (RT, *insn1), MIPS_GR_REG))
2564 return 1;
2565 }
2566
2567 /* Check for generic coprocessor hazards.
2568
2569 This case is not handled very well. There is no special
2570 knowledge of CP0 handling, and the coprocessors other than
2571 the floating point unit are not distinguished at all. */
2572 /* Itbl support may require additional care here. FIXME!
2573 Need to modify this to include knowledge about
2574 user specified delays! */
2575 else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
2576 || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
2577 {
2578 /* Handle cases where INSN1 writes to a known general coprocessor
2579 register. There must be a one instruction delay before INSN2
2580 if INSN2 reads that register, otherwise no delay is needed. */
2581 if (pinfo1 & INSN_WRITE_FPR_T)
252b5132 2582 {
71400594
RS
2583 if (INSN2_USES_REG (EXTRACT_OPERAND (FT, *insn1), MIPS_FP_REG))
2584 return 1;
252b5132 2585 }
71400594 2586 else if (pinfo1 & INSN_WRITE_FPR_S)
252b5132 2587 {
71400594
RS
2588 if (INSN2_USES_REG (EXTRACT_OPERAND (FS, *insn1), MIPS_FP_REG))
2589 return 1;
252b5132
RH
2590 }
2591 else
2592 {
71400594
RS
2593 /* Read-after-write dependencies on the control registers
2594 require a two-instruction gap. */
2595 if ((pinfo1 & INSN_WRITE_COND_CODE)
2596 && (pinfo2 & INSN_READ_COND_CODE))
2597 return 2;
2598
2599 /* We don't know exactly what INSN1 does. If INSN2 is
2600 also a coprocessor instruction, assume there must be
2601 a one instruction gap. */
2602 if (pinfo2 & INSN_COP)
2603 return 1;
252b5132
RH
2604 }
2605 }
6b76fefe 2606
71400594
RS
2607 /* Check for read-after-write dependencies on the coprocessor
2608 control registers in cases where INSN1 does not need a general
2609 coprocessor delay. This means that INSN1 is a floating point
2610 comparison instruction. */
2611 /* Itbl support may require additional care here. */
2612 else if (!cop_interlocks
2613 && (pinfo1 & INSN_WRITE_COND_CODE)
2614 && (pinfo2 & INSN_READ_COND_CODE))
2615 return 1;
2616 }
6b76fefe 2617
71400594 2618#undef INSN2_USES_REG
6b76fefe 2619
71400594
RS
2620 return 0;
2621}
6b76fefe 2622
7d8e00cf
RS
2623/* Return the number of nops that would be needed to work around the
2624 VR4130 mflo/mfhi errata if instruction INSN immediately followed
91d6fa6a 2625 the MAX_VR4130_NOPS instructions described by HIST. */
7d8e00cf
RS
2626
2627static int
91d6fa6a 2628nops_for_vr4130 (const struct mips_cl_insn *hist,
7d8e00cf
RS
2629 const struct mips_cl_insn *insn)
2630{
2631 int i, j, reg;
2632
2633 /* Check if the instruction writes to HI or LO. MTHI and MTLO
2634 are not affected by the errata. */
2635 if (insn != 0
2636 && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
2637 || strcmp (insn->insn_mo->name, "mtlo") == 0
2638 || strcmp (insn->insn_mo->name, "mthi") == 0))
2639 return 0;
2640
2641 /* Search for the first MFLO or MFHI. */
2642 for (i = 0; i < MAX_VR4130_NOPS; i++)
91d6fa6a 2643 if (MF_HILO_INSN (hist[i].insn_mo->pinfo))
7d8e00cf
RS
2644 {
2645 /* Extract the destination register. */
2646 if (mips_opts.mips16)
91d6fa6a 2647 reg = mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, hist[i])];
7d8e00cf 2648 else
91d6fa6a 2649 reg = EXTRACT_OPERAND (RD, hist[i]);
7d8e00cf
RS
2650
2651 /* No nops are needed if INSN reads that register. */
2652 if (insn != NULL && insn_uses_reg (insn, reg, MIPS_GR_REG))
2653 return 0;
2654
2655 /* ...or if any of the intervening instructions do. */
2656 for (j = 0; j < i; j++)
91d6fa6a 2657 if (insn_uses_reg (&hist[j], reg, MIPS_GR_REG))
7d8e00cf
RS
2658 return 0;
2659
2660 return MAX_VR4130_NOPS - i;
2661 }
2662 return 0;
2663}
2664
71400594 2665/* Return the number of nops that would be needed if instruction INSN
91d6fa6a
NC
2666 immediately followed the MAX_NOPS instructions given by HIST,
2667 where HIST[0] is the most recent instruction. If INSN is null,
71400594 2668 return the worse-case number of nops for any instruction. */
bdaaa2e1 2669
71400594 2670static int
91d6fa6a 2671nops_for_insn (const struct mips_cl_insn *hist,
71400594
RS
2672 const struct mips_cl_insn *insn)
2673{
2674 int i, nops, tmp_nops;
bdaaa2e1 2675
71400594 2676 nops = 0;
7d8e00cf 2677 for (i = 0; i < MAX_DELAY_NOPS; i++)
65b02341 2678 {
91d6fa6a 2679 tmp_nops = insns_between (hist + i, insn) - i;
65b02341
RS
2680 if (tmp_nops > nops)
2681 nops = tmp_nops;
2682 }
7d8e00cf
RS
2683
2684 if (mips_fix_vr4130)
2685 {
91d6fa6a 2686 tmp_nops = nops_for_vr4130 (hist, insn);
7d8e00cf
RS
2687 if (tmp_nops > nops)
2688 nops = tmp_nops;
2689 }
2690
71400594
RS
2691 return nops;
2692}
252b5132 2693
71400594 2694/* The variable arguments provide NUM_INSNS extra instructions that
91d6fa6a 2695 might be added to HIST. Return the largest number of nops that
71400594 2696 would be needed after the extended sequence. */
252b5132 2697
71400594 2698static int
91d6fa6a 2699nops_for_sequence (int num_insns, const struct mips_cl_insn *hist, ...)
71400594
RS
2700{
2701 va_list args;
2702 struct mips_cl_insn buffer[MAX_NOPS];
2703 struct mips_cl_insn *cursor;
2704 int nops;
2705
91d6fa6a 2706 va_start (args, hist);
71400594 2707 cursor = buffer + num_insns;
91d6fa6a 2708 memcpy (cursor, hist, (MAX_NOPS - num_insns) * sizeof (*cursor));
71400594
RS
2709 while (cursor > buffer)
2710 *--cursor = *va_arg (args, const struct mips_cl_insn *);
2711
2712 nops = nops_for_insn (buffer, NULL);
2713 va_end (args);
2714 return nops;
2715}
252b5132 2716
71400594
RS
2717/* Like nops_for_insn, but if INSN is a branch, take into account the
2718 worst-case delay for the branch target. */
252b5132 2719
71400594 2720static int
91d6fa6a 2721nops_for_insn_or_target (const struct mips_cl_insn *hist,
71400594
RS
2722 const struct mips_cl_insn *insn)
2723{
2724 int nops, tmp_nops;
60b63b72 2725
91d6fa6a 2726 nops = nops_for_insn (hist, insn);
71400594
RS
2727 if (insn->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2728 | INSN_COND_BRANCH_DELAY
2729 | INSN_COND_BRANCH_LIKELY))
2730 {
91d6fa6a 2731 tmp_nops = nops_for_sequence (2, hist, insn, NOP_INSN);
71400594
RS
2732 if (tmp_nops > nops)
2733 nops = tmp_nops;
2734 }
9a2c7088
MR
2735 else if (mips_opts.mips16
2736 && (insn->insn_mo->pinfo & (MIPS16_INSN_UNCOND_BRANCH
2737 | MIPS16_INSN_COND_BRANCH)))
71400594 2738 {
91d6fa6a 2739 tmp_nops = nops_for_sequence (1, hist, insn);
71400594
RS
2740 if (tmp_nops > nops)
2741 nops = tmp_nops;
2742 }
2743 return nops;
2744}
2745
c67a084a
NC
2746/* Fix NOP issue: Replace nops by "or at,at,zero". */
2747
2748static void
2749fix_loongson2f_nop (struct mips_cl_insn * ip)
2750{
2751 if (strcmp (ip->insn_mo->name, "nop") == 0)
2752 ip->insn_opcode = LOONGSON2F_NOP_INSN;
2753}
2754
2755/* Fix Jump Issue: Eliminate instruction fetch from outside 256M region
2756 jr target pc &= 'hffff_ffff_cfff_ffff. */
2757
2758static void
2759fix_loongson2f_jump (struct mips_cl_insn * ip)
2760{
2761 if (strcmp (ip->insn_mo->name, "j") == 0
2762 || strcmp (ip->insn_mo->name, "jr") == 0
2763 || strcmp (ip->insn_mo->name, "jalr") == 0)
2764 {
2765 int sreg;
2766 expressionS ep;
2767
2768 if (! mips_opts.at)
2769 return;
2770
2771 sreg = EXTRACT_OPERAND (RS, *ip);
2772 if (sreg == ZERO || sreg == KT0 || sreg == KT1 || sreg == ATREG)
2773 return;
2774
2775 ep.X_op = O_constant;
2776 ep.X_add_number = 0xcfff0000;
2777 macro_build (&ep, "lui", "t,u", ATREG, BFD_RELOC_HI16);
2778 ep.X_add_number = 0xffff;
2779 macro_build (&ep, "ori", "t,r,i", ATREG, ATREG, BFD_RELOC_LO16);
2780 macro_build (NULL, "and", "d,v,t", sreg, sreg, ATREG);
2781 }
2782}
2783
2784static void
2785fix_loongson2f (struct mips_cl_insn * ip)
2786{
2787 if (mips_fix_loongson2f_nop)
2788 fix_loongson2f_nop (ip);
2789
2790 if (mips_fix_loongson2f_jump)
2791 fix_loongson2f_jump (ip);
2792}
2793
71400594
RS
2794/* Output an instruction. IP is the instruction information.
2795 ADDRESS_EXPR is an operand of the instruction to be used with
2796 RELOC_TYPE. */
2797
2798static void
2799append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
2800 bfd_reloc_code_real_type *reloc_type)
2801{
3994f87e 2802 unsigned long prev_pinfo, pinfo;
71400594
RS
2803 relax_stateT prev_insn_frag_type = 0;
2804 bfd_boolean relaxed_branch = FALSE;
a8dbcb85 2805 segment_info_type *si = seg_info (now_seg);
71400594 2806
c67a084a
NC
2807 if (mips_fix_loongson2f)
2808 fix_loongson2f (ip);
2809
71400594
RS
2810 /* Mark instruction labels in mips16 mode. */
2811 mips16_mark_labels ();
2812
738f4d98
MR
2813 file_ase_mips16 |= mips_opts.mips16;
2814
71400594
RS
2815 prev_pinfo = history[0].insn_mo->pinfo;
2816 pinfo = ip->insn_mo->pinfo;
2817
2818 if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2819 {
2820 /* There are a lot of optimizations we could do that we don't.
2821 In particular, we do not, in general, reorder instructions.
2822 If you use gcc with optimization, it will reorder
2823 instructions and generally do much more optimization then we
2824 do here; repeating all that work in the assembler would only
2825 benefit hand written assembly code, and does not seem worth
2826 it. */
2827 int nops = (mips_optimize == 0
2828 ? nops_for_insn (history, NULL)
2829 : nops_for_insn_or_target (history, ip));
2830 if (nops > 0)
252b5132
RH
2831 {
2832 fragS *old_frag;
2833 unsigned long old_frag_offset;
2834 int i;
252b5132
RH
2835
2836 old_frag = frag_now;
2837 old_frag_offset = frag_now_fix ();
2838
2839 for (i = 0; i < nops; i++)
2840 emit_nop ();
2841
2842 if (listing)
2843 {
2844 listing_prev_line ();
2845 /* We may be at the start of a variant frag. In case we
2846 are, make sure there is enough space for the frag
2847 after the frags created by listing_prev_line. The
2848 argument to frag_grow here must be at least as large
2849 as the argument to all other calls to frag_grow in
2850 this file. We don't have to worry about being in the
2851 middle of a variant frag, because the variants insert
2852 all needed nop instructions themselves. */
2853 frag_grow (40);
2854 }
2855
404a8071 2856 mips_move_labels ();
252b5132
RH
2857
2858#ifndef NO_ECOFF_DEBUGGING
2859 if (ECOFF_DEBUGGING)
2860 ecoff_fix_loc (old_frag, old_frag_offset);
2861#endif
2862 }
71400594
RS
2863 }
2864 else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
2865 {
2866 /* Work out how many nops in prev_nop_frag are needed by IP. */
2867 int nops = nops_for_insn_or_target (history, ip);
9c2799c2 2868 gas_assert (nops <= prev_nop_frag_holds);
252b5132 2869
71400594
RS
2870 /* Enforce NOPS as a minimum. */
2871 if (nops > prev_nop_frag_required)
2872 prev_nop_frag_required = nops;
252b5132 2873
71400594
RS
2874 if (prev_nop_frag_holds == prev_nop_frag_required)
2875 {
2876 /* Settle for the current number of nops. Update the history
2877 accordingly (for the benefit of any future .set reorder code). */
2878 prev_nop_frag = NULL;
2879 insert_into_history (prev_nop_frag_since,
2880 prev_nop_frag_holds, NOP_INSN);
2881 }
2882 else
2883 {
2884 /* Allow this instruction to replace one of the nops that was
2885 tentatively added to prev_nop_frag. */
2886 prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
2887 prev_nop_frag_holds--;
2888 prev_nop_frag_since++;
252b5132
RH
2889 }
2890 }
2891
58e2ea4d
MR
2892#ifdef OBJ_ELF
2893 /* The value passed to dwarf2_emit_insn is the distance between
2894 the beginning of the current instruction and the address that
2895 should be recorded in the debug tables. For MIPS16 debug info
2896 we want to use ISA-encoded addresses, so we pass -1 for an
2897 address higher by one than the current. */
2898 dwarf2_emit_insn (mips_opts.mips16 ? -1 : 0);
2899#endif
2900
895921c9 2901 /* Record the frag type before frag_var. */
47e39b9d
RS
2902 if (history[0].frag)
2903 prev_insn_frag_type = history[0].frag->fr_type;
895921c9 2904
4d7206a2 2905 if (address_expr
0b25d3e6 2906 && *reloc_type == BFD_RELOC_16_PCREL_S2
4a6a3df4
AO
2907 && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
2908 || pinfo & INSN_COND_BRANCH_LIKELY)
2909 && mips_relax_branch
2910 /* Don't try branch relaxation within .set nomacro, or within
2911 .set noat if we use $at for PIC computations. If it turns
2912 out that the branch was out-of-range, we'll get an error. */
2913 && !mips_opts.warn_about_macros
741fe287 2914 && (mips_opts.at || mips_pic == NO_PIC)
4a6a3df4
AO
2915 && !mips_opts.mips16)
2916 {
895921c9 2917 relaxed_branch = TRUE;
1e915849
RS
2918 add_relaxed_insn (ip, (relaxed_branch_length
2919 (NULL, NULL,
2920 (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2921 : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1
2922 : 0)), 4,
2923 RELAX_BRANCH_ENCODE
2924 (pinfo & INSN_UNCOND_BRANCH_DELAY,
2925 pinfo & INSN_COND_BRANCH_LIKELY,
2926 pinfo & INSN_WRITE_GPR_31,
2927 0),
2928 address_expr->X_add_symbol,
2929 address_expr->X_add_number);
4a6a3df4
AO
2930 *reloc_type = BFD_RELOC_UNUSED;
2931 }
2932 else if (*reloc_type > BFD_RELOC_UNUSED)
252b5132
RH
2933 {
2934 /* We need to set up a variant frag. */
9c2799c2 2935 gas_assert (mips_opts.mips16 && address_expr != NULL);
1e915849
RS
2936 add_relaxed_insn (ip, 4, 0,
2937 RELAX_MIPS16_ENCODE
2938 (*reloc_type - BFD_RELOC_UNUSED,
2939 mips16_small, mips16_ext,
2940 prev_pinfo & INSN_UNCOND_BRANCH_DELAY,
2941 history[0].mips16_absolute_jump_p),
2942 make_expr_symbol (address_expr), 0);
252b5132 2943 }
252b5132
RH
2944 else if (mips_opts.mips16
2945 && ! ip->use_extend
f6688943 2946 && *reloc_type != BFD_RELOC_MIPS16_JMP)
9497f5ac 2947 {
b8ee1a6e
DU
2948 if ((pinfo & INSN_UNCOND_BRANCH_DELAY) == 0)
2949 /* Make sure there is enough room to swap this instruction with
2950 a following jump instruction. */
2951 frag_grow (6);
1e915849 2952 add_fixed_insn (ip);
252b5132
RH
2953 }
2954 else
2955 {
2956 if (mips_opts.mips16
2957 && mips_opts.noreorder
2958 && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2959 as_warn (_("extended instruction in delay slot"));
2960
4d7206a2
RS
2961 if (mips_relax.sequence)
2962 {
2963 /* If we've reached the end of this frag, turn it into a variant
2964 frag and record the information for the instructions we've
2965 written so far. */
2966 if (frag_room () < 4)
2967 relax_close_frag ();
2968 mips_relax.sizes[mips_relax.sequence - 1] += 4;
2969 }
2970
584892a6
RS
2971 if (mips_relax.sequence != 2)
2972 mips_macro_warning.sizes[0] += 4;
2973 if (mips_relax.sequence != 1)
2974 mips_macro_warning.sizes[1] += 4;
2975
1e915849
RS
2976 if (mips_opts.mips16)
2977 {
2978 ip->fixed_p = 1;
2979 ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
2980 }
2981 add_fixed_insn (ip);
252b5132
RH
2982 }
2983
01a3f561 2984 if (address_expr != NULL && *reloc_type <= BFD_RELOC_UNUSED)
252b5132
RH
2985 {
2986 if (address_expr->X_op == O_constant)
2987 {
f17c130b 2988 unsigned int tmp;
f6688943
TS
2989
2990 switch (*reloc_type)
252b5132
RH
2991 {
2992 case BFD_RELOC_32:
2993 ip->insn_opcode |= address_expr->X_add_number;
2994 break;
2995
f6688943 2996 case BFD_RELOC_MIPS_HIGHEST:
f17c130b
AM
2997 tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
2998 ip->insn_opcode |= tmp & 0xffff;
f6688943
TS
2999 break;
3000
3001 case BFD_RELOC_MIPS_HIGHER:
f17c130b
AM
3002 tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
3003 ip->insn_opcode |= tmp & 0xffff;
f6688943
TS
3004 break;
3005
3006 case BFD_RELOC_HI16_S:
f17c130b
AM
3007 tmp = (address_expr->X_add_number + 0x8000) >> 16;
3008 ip->insn_opcode |= tmp & 0xffff;
f6688943
TS
3009 break;
3010
3011 case BFD_RELOC_HI16:
3012 ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
3013 break;
3014
01a3f561 3015 case BFD_RELOC_UNUSED:
252b5132 3016 case BFD_RELOC_LO16:
ed6fb7bd 3017 case BFD_RELOC_MIPS_GOT_DISP:
252b5132
RH
3018 ip->insn_opcode |= address_expr->X_add_number & 0xffff;
3019 break;
3020
3021 case BFD_RELOC_MIPS_JMP:
3022 if ((address_expr->X_add_number & 3) != 0)
3023 as_bad (_("jump to misaligned address (0x%lx)"),
3024 (unsigned long) address_expr->X_add_number);
3025 ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
3026 break;
3027
3028 case BFD_RELOC_MIPS16_JMP:
3029 if ((address_expr->X_add_number & 3) != 0)
3030 as_bad (_("jump to misaligned address (0x%lx)"),
3031 (unsigned long) address_expr->X_add_number);
3032 ip->insn_opcode |=
3033 (((address_expr->X_add_number & 0x7c0000) << 3)
3034 | ((address_expr->X_add_number & 0xf800000) >> 7)
3035 | ((address_expr->X_add_number & 0x3fffc) >> 2));
3036 break;
3037
252b5132 3038 case BFD_RELOC_16_PCREL_S2:
bad36eac
DJ
3039 if ((address_expr->X_add_number & 3) != 0)
3040 as_bad (_("branch to misaligned address (0x%lx)"),
3041 (unsigned long) address_expr->X_add_number);
3042 if (mips_relax_branch)
3043 goto need_reloc;
3044 if ((address_expr->X_add_number + 0x20000) & ~0x3ffff)
3045 as_bad (_("branch address range overflow (0x%lx)"),
3046 (unsigned long) address_expr->X_add_number);
3047 ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0xffff;
3048 break;
252b5132
RH
3049
3050 default:
3051 internalError ();
3052 }
3053 }
01a3f561 3054 else if (*reloc_type < BFD_RELOC_UNUSED)
252b5132 3055 need_reloc:
4d7206a2
RS
3056 {
3057 reloc_howto_type *howto;
3058 int i;
34ce925e 3059
4d7206a2
RS
3060 /* In a compound relocation, it is the final (outermost)
3061 operator that determines the relocated field. */
3062 for (i = 1; i < 3; i++)
3063 if (reloc_type[i] == BFD_RELOC_UNUSED)
3064 break;
34ce925e 3065
4d7206a2 3066 howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
23fce1e3
NC
3067 if (howto == NULL)
3068 {
3069 /* To reproduce this failure try assembling gas/testsuites/
3070 gas/mips/mips16-intermix.s with a mips-ecoff targeted
3071 assembler. */
3072 as_bad (_("Unsupported MIPS relocation number %d"), reloc_type[i - 1]);
3073 howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_16);
3074 }
3075
1e915849
RS
3076 ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
3077 bfd_get_reloc_size (howto),
3078 address_expr,
3079 reloc_type[0] == BFD_RELOC_16_PCREL_S2,
3080 reloc_type[0]);
4d7206a2 3081
b314ec0e
RS
3082 /* Tag symbols that have a R_MIPS16_26 relocation against them. */
3083 if (reloc_type[0] == BFD_RELOC_MIPS16_JMP
3084 && ip->fixp[0]->fx_addsy)
3085 *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
3086
4d7206a2
RS
3087 /* These relocations can have an addend that won't fit in
3088 4 octets for 64bit assembly. */
3089 if (HAVE_64BIT_GPRS
3090 && ! howto->partial_inplace
3091 && (reloc_type[0] == BFD_RELOC_16
3092 || reloc_type[0] == BFD_RELOC_32
3093 || reloc_type[0] == BFD_RELOC_MIPS_JMP
4d7206a2
RS
3094 || reloc_type[0] == BFD_RELOC_GPREL16
3095 || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
3096 || reloc_type[0] == BFD_RELOC_GPREL32
3097 || reloc_type[0] == BFD_RELOC_64
3098 || reloc_type[0] == BFD_RELOC_CTOR
3099 || reloc_type[0] == BFD_RELOC_MIPS_SUB
3100 || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
3101 || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
3102 || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
3103 || reloc_type[0] == BFD_RELOC_MIPS_REL16
d6f16593
MR
3104 || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
3105 || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
738e5348
RS
3106 || hi16_reloc_p (reloc_type[0])
3107 || lo16_reloc_p (reloc_type[0])))
1e915849 3108 ip->fixp[0]->fx_no_overflow = 1;
4d7206a2
RS
3109
3110 if (mips_relax.sequence)
3111 {
3112 if (mips_relax.first_fixup == 0)
1e915849 3113 mips_relax.first_fixup = ip->fixp[0];
4d7206a2
RS
3114 }
3115 else if (reloc_needs_lo_p (*reloc_type))
3116 {
3117 struct mips_hi_fixup *hi_fixup;
252b5132 3118
4d7206a2
RS
3119 /* Reuse the last entry if it already has a matching %lo. */
3120 hi_fixup = mips_hi_fixup_list;
3121 if (hi_fixup == 0
3122 || !fixup_has_matching_lo_p (hi_fixup->fixp))
3123 {
3124 hi_fixup = ((struct mips_hi_fixup *)
3125 xmalloc (sizeof (struct mips_hi_fixup)));
3126 hi_fixup->next = mips_hi_fixup_list;
3127 mips_hi_fixup_list = hi_fixup;
252b5132 3128 }
1e915849 3129 hi_fixup->fixp = ip->fixp[0];
4d7206a2
RS
3130 hi_fixup->seg = now_seg;
3131 }
f6688943 3132
4d7206a2
RS
3133 /* Add fixups for the second and third relocations, if given.
3134 Note that the ABI allows the second relocation to be
3135 against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC. At the
3136 moment we only use RSS_UNDEF, but we could add support
3137 for the others if it ever becomes necessary. */
3138 for (i = 1; i < 3; i++)
3139 if (reloc_type[i] != BFD_RELOC_UNUSED)
3140 {
1e915849
RS
3141 ip->fixp[i] = fix_new (ip->frag, ip->where,
3142 ip->fixp[0]->fx_size, NULL, 0,
3143 FALSE, reloc_type[i]);
b1dca8ee
RS
3144
3145 /* Use fx_tcbit to mark compound relocs. */
1e915849
RS
3146 ip->fixp[0]->fx_tcbit = 1;
3147 ip->fixp[i]->fx_tcbit = 1;
4d7206a2 3148 }
252b5132
RH
3149 }
3150 }
1e915849 3151 install_insn (ip);
252b5132
RH
3152
3153 /* Update the register mask information. */
3154 if (! mips_opts.mips16)
3155 {
3156 if (pinfo & INSN_WRITE_GPR_D)
bf12938e 3157 mips_gprmask |= 1 << EXTRACT_OPERAND (RD, *ip);
252b5132 3158 if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
bf12938e 3159 mips_gprmask |= 1 << EXTRACT_OPERAND (RT, *ip);
252b5132 3160 if (pinfo & INSN_READ_GPR_S)
bf12938e 3161 mips_gprmask |= 1 << EXTRACT_OPERAND (RS, *ip);
252b5132 3162 if (pinfo & INSN_WRITE_GPR_31)
f9419b05 3163 mips_gprmask |= 1 << RA;
252b5132 3164 if (pinfo & INSN_WRITE_FPR_D)
bf12938e 3165 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FD, *ip);
252b5132 3166 if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
bf12938e 3167 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FS, *ip);
252b5132 3168 if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
bf12938e 3169 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FT, *ip);
252b5132 3170 if ((pinfo & INSN_READ_FPR_R) != 0)
bf12938e 3171 mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FR, *ip);
252b5132
RH
3172 if (pinfo & INSN_COP)
3173 {
bdaaa2e1
KH
3174 /* We don't keep enough information to sort these cases out.
3175 The itbl support does keep this information however, although
3176 we currently don't support itbl fprmats as part of the cop
3177 instruction. May want to add this support in the future. */
252b5132
RH
3178 }
3179 /* Never set the bit for $0, which is always zero. */
beae10d5 3180 mips_gprmask &= ~1 << 0;
252b5132
RH
3181 }
3182 else
3183 {
3184 if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
bf12938e 3185 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RX, *ip);
252b5132 3186 if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
bf12938e 3187 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RY, *ip);
252b5132 3188 if (pinfo & MIPS16_INSN_WRITE_Z)
bf12938e 3189 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RZ, *ip);
252b5132
RH
3190 if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
3191 mips_gprmask |= 1 << TREG;
3192 if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
3193 mips_gprmask |= 1 << SP;
3194 if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
3195 mips_gprmask |= 1 << RA;
3196 if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
3197 mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
3198 if (pinfo & MIPS16_INSN_READ_Z)
bf12938e 3199 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip);
252b5132 3200 if (pinfo & MIPS16_INSN_READ_GPR_X)
bf12938e 3201 mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
252b5132
RH
3202 }
3203
4d7206a2 3204 if (mips_relax.sequence != 2 && !mips_opts.noreorder)
252b5132
RH
3205 {
3206 /* Filling the branch delay slot is more complex. We try to
3207 switch the branch with the previous instruction, which we can
3208 do if the previous instruction does not set up a condition
3209 that the branch tests and if the branch is not itself the
3210 target of any branch. */
3211 if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
3212 || (pinfo & INSN_COND_BRANCH_DELAY))
3213 {
3214 if (mips_optimize < 2
3215 /* If we have seen .set volatile or .set nomove, don't
3216 optimize. */
3217 || mips_opts.nomove != 0
a38419a5
RS
3218 /* We can't swap if the previous instruction's position
3219 is fixed. */
3220 || history[0].fixed_p
252b5132
RH
3221 /* If the previous previous insn was in a .set
3222 noreorder, we can't swap. Actually, the MIPS
3223 assembler will swap in this situation. However, gcc
3224 configured -with-gnu-as will generate code like
3225 .set noreorder
3226 lw $4,XXX
3227 .set reorder
3228 INSN
3229 bne $4,$0,foo
3230 in which we can not swap the bne and INSN. If gcc is
3231 not configured -with-gnu-as, it does not output the
a38419a5 3232 .set pseudo-ops. */
47e39b9d 3233 || history[1].noreorder_p
252b5132
RH
3234 /* If the branch is itself the target of a branch, we
3235 can not swap. We cheat on this; all we check for is
3236 whether there is a label on this instruction. If
3237 there are any branches to anything other than a
3238 label, users must use .set noreorder. */
a8dbcb85 3239 || si->label_list != NULL
895921c9
MR
3240 /* If the previous instruction is in a variant frag
3241 other than this branch's one, we cannot do the swap.
3242 This does not apply to the mips16, which uses variant
3243 frags for different purposes. */
252b5132 3244 || (! mips_opts.mips16
895921c9 3245 && prev_insn_frag_type == rs_machine_dependent)
71400594
RS
3246 /* Check for conflicts between the branch and the instructions
3247 before the candidate delay slot. */
3248 || nops_for_insn (history + 1, ip) > 0
3249 /* Check for conflicts between the swapped sequence and the
3250 target of the branch. */
3251 || nops_for_sequence (2, history + 1, ip, history) > 0
252b5132
RH
3252 /* We do not swap with a trap instruction, since it
3253 complicates trap handlers to have the trap
3254 instruction be in a delay slot. */
3255 || (prev_pinfo & INSN_TRAP)
3256 /* If the branch reads a register that the previous
3257 instruction sets, we can not swap. */
3258 || (! mips_opts.mips16
3259 && (prev_pinfo & INSN_WRITE_GPR_T)
bf12938e 3260 && insn_uses_reg (ip, EXTRACT_OPERAND (RT, history[0]),
252b5132
RH
3261 MIPS_GR_REG))
3262 || (! mips_opts.mips16
3263 && (prev_pinfo & INSN_WRITE_GPR_D)
bf12938e 3264 && insn_uses_reg (ip, EXTRACT_OPERAND (RD, history[0]),
252b5132
RH
3265 MIPS_GR_REG))
3266 || (mips_opts.mips16
3267 && (((prev_pinfo & MIPS16_INSN_WRITE_X)
bf12938e
RS
3268 && (insn_uses_reg
3269 (ip, MIPS16_EXTRACT_OPERAND (RX, history[0]),
3270 MIPS16_REG)))
252b5132 3271 || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
bf12938e
RS
3272 && (insn_uses_reg
3273 (ip, MIPS16_EXTRACT_OPERAND (RY, history[0]),
3274 MIPS16_REG)))
252b5132 3275 || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
bf12938e
RS
3276 && (insn_uses_reg
3277 (ip, MIPS16_EXTRACT_OPERAND (RZ, history[0]),
3278 MIPS16_REG)))
252b5132
RH
3279 || ((prev_pinfo & MIPS16_INSN_WRITE_T)
3280 && insn_uses_reg (ip, TREG, MIPS_GR_REG))
3281 || ((prev_pinfo & MIPS16_INSN_WRITE_31)
3282 && insn_uses_reg (ip, RA, MIPS_GR_REG))
3283 || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3284 && insn_uses_reg (ip,
47e39b9d
RS
3285 MIPS16OP_EXTRACT_REG32R
3286 (history[0].insn_opcode),
252b5132
RH
3287 MIPS_GR_REG))))
3288 /* If the branch writes a register that the previous
3289 instruction sets, we can not swap (we know that
3290 branches write only to RD or to $31). */
3291 || (! mips_opts.mips16
3292 && (prev_pinfo & INSN_WRITE_GPR_T)
3293 && (((pinfo & INSN_WRITE_GPR_D)
bf12938e
RS
3294 && (EXTRACT_OPERAND (RT, history[0])
3295 == EXTRACT_OPERAND (RD, *ip)))
252b5132 3296 || ((pinfo & INSN_WRITE_GPR_31)
bf12938e 3297 && EXTRACT_OPERAND (RT, history[0]) == RA)))
252b5132
RH
3298 || (! mips_opts.mips16
3299 && (prev_pinfo & INSN_WRITE_GPR_D)
3300 && (((pinfo & INSN_WRITE_GPR_D)
bf12938e
RS
3301 && (EXTRACT_OPERAND (RD, history[0])
3302 == EXTRACT_OPERAND (RD, *ip)))
252b5132 3303 || ((pinfo & INSN_WRITE_GPR_31)
bf12938e 3304 && EXTRACT_OPERAND (RD, history[0]) == RA)))
252b5132
RH
3305 || (mips_opts.mips16
3306 && (pinfo & MIPS16_INSN_WRITE_31)
3307 && ((prev_pinfo & MIPS16_INSN_WRITE_31)
3308 || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
47e39b9d 3309 && (MIPS16OP_EXTRACT_REG32R (history[0].insn_opcode)
252b5132
RH
3310 == RA))))
3311 /* If the branch writes a register that the previous
3312 instruction reads, we can not swap (we know that
3313 branches only write to RD or to $31). */
3314 || (! mips_opts.mips16
3315 && (pinfo & INSN_WRITE_GPR_D)
47e39b9d 3316 && insn_uses_reg (&history[0],
bf12938e 3317 EXTRACT_OPERAND (RD, *ip),
252b5132
RH
3318 MIPS_GR_REG))
3319 || (! mips_opts.mips16
3320 && (pinfo & INSN_WRITE_GPR_31)
47e39b9d 3321 && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
252b5132
RH
3322 || (mips_opts.mips16
3323 && (pinfo & MIPS16_INSN_WRITE_31)
47e39b9d 3324 && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
252b5132
RH
3325 /* If one instruction sets a condition code and the
3326 other one uses a condition code, we can not swap. */
3327 || ((pinfo & INSN_READ_COND_CODE)
3328 && (prev_pinfo & INSN_WRITE_COND_CODE))
3329 || ((pinfo & INSN_WRITE_COND_CODE)
3330 && (prev_pinfo & INSN_READ_COND_CODE))
3331 /* If the previous instruction uses the PC, we can not
3332 swap. */
3333 || (mips_opts.mips16
3334 && (prev_pinfo & MIPS16_INSN_READ_PC))
252b5132
RH
3335 /* If the previous instruction had a fixup in mips16
3336 mode, we can not swap. This normally means that the
3337 previous instruction was a 4 byte branch anyhow. */
47e39b9d 3338 || (mips_opts.mips16 && history[0].fixp[0])
bdaaa2e1
KH
3339 /* If the previous instruction is a sync, sync.l, or
3340 sync.p, we can not swap. */
6a32d874
CM
3341 || (prev_pinfo & INSN_SYNC)
3342 /* If the previous instruction is an ERET or
3343 DERET, avoid the swap. */
3344 || (history[0].insn_opcode == INSN_ERET)
3345 || (history[0].insn_opcode == INSN_DERET))
252b5132 3346 {
29024861
DU
3347 if (mips_opts.mips16
3348 && (pinfo & INSN_UNCOND_BRANCH_DELAY)
3349 && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31))
3994f87e 3350 && ISA_SUPPORTS_MIPS16E)
29024861
DU
3351 {
3352 /* Convert MIPS16 jr/jalr into a "compact" jump. */
3353 ip->insn_opcode |= 0x0080;
3354 install_insn (ip);
3355 insert_into_history (0, 1, ip);
3356 }
3357 else
3358 {
3359 /* We could do even better for unconditional branches to
3360 portions of this object file; we could pick up the
3361 instruction at the destination, put it in the delay
3362 slot, and bump the destination address. */
3363 insert_into_history (0, 1, ip);
3364 emit_nop ();
3365 }
3366
dd22970f
ILT
3367 if (mips_relax.sequence)
3368 mips_relax.sizes[mips_relax.sequence - 1] += 4;
252b5132
RH
3369 }
3370 else
3371 {
3372 /* It looks like we can actually do the swap. */
1e915849
RS
3373 struct mips_cl_insn delay = history[0];
3374 if (mips_opts.mips16)
252b5132 3375 {
b8ee1a6e
DU
3376 know (delay.frag == ip->frag);
3377 move_insn (ip, delay.frag, delay.where);
3378 move_insn (&delay, ip->frag, ip->where + insn_length (ip));
1e915849
RS
3379 }
3380 else if (relaxed_branch)
3381 {
3382 /* Add the delay slot instruction to the end of the
3383 current frag and shrink the fixed part of the
3384 original frag. If the branch occupies the tail of
3385 the latter, move it backwards to cover the gap. */
3386 delay.frag->fr_fix -= 4;
3387 if (delay.frag == ip->frag)
3388 move_insn (ip, ip->frag, ip->where - 4);
3389 add_fixed_insn (&delay);
252b5132
RH
3390 }
3391 else
3392 {
1e915849
RS
3393 move_insn (&delay, ip->frag, ip->where);
3394 move_insn (ip, history[0].frag, history[0].where);
252b5132 3395 }
1e915849
RS
3396 history[0] = *ip;
3397 delay.fixed_p = 1;
3398 insert_into_history (0, 1, &delay);
252b5132 3399 }
252b5132
RH
3400
3401 /* If that was an unconditional branch, forget the previous
3402 insn information. */
3403 if (pinfo & INSN_UNCOND_BRANCH_DELAY)
6a32d874 3404 {
6a32d874
CM
3405 mips_no_prev_insn ();
3406 }
252b5132
RH
3407 }
3408 else if (pinfo & INSN_COND_BRANCH_LIKELY)
3409 {
3410 /* We don't yet optimize a branch likely. What we should do
3411 is look at the target, copy the instruction found there
3412 into the delay slot, and increment the branch to jump to
3413 the next instruction. */
1e915849 3414 insert_into_history (0, 1, ip);
252b5132 3415 emit_nop ();
252b5132
RH
3416 }
3417 else
1e915849 3418 insert_into_history (0, 1, ip);
252b5132 3419 }
1e915849
RS
3420 else
3421 insert_into_history (0, 1, ip);
252b5132
RH
3422
3423 /* We just output an insn, so the next one doesn't have a label. */
3424 mips_clear_insn_labels ();
252b5132
RH
3425}
3426
7d10b47d 3427/* Forget that there was any previous instruction or label. */
252b5132
RH
3428
3429static void
7d10b47d 3430mips_no_prev_insn (void)
252b5132 3431{
7d10b47d
RS
3432 prev_nop_frag = NULL;
3433 insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
252b5132
RH
3434 mips_clear_insn_labels ();
3435}
3436
7d10b47d
RS
3437/* This function must be called before we emit something other than
3438 instructions. It is like mips_no_prev_insn except that it inserts
3439 any NOPS that might be needed by previous instructions. */
252b5132 3440
7d10b47d
RS
3441void
3442mips_emit_delays (void)
252b5132
RH
3443{
3444 if (! mips_opts.noreorder)
3445 {
71400594 3446 int nops = nops_for_insn (history, NULL);
252b5132
RH
3447 if (nops > 0)
3448 {
7d10b47d
RS
3449 while (nops-- > 0)
3450 add_fixed_insn (NOP_INSN);
3451 mips_move_labels ();
3452 }
3453 }
3454 mips_no_prev_insn ();
3455}
3456
3457/* Start a (possibly nested) noreorder block. */
3458
3459static void
3460start_noreorder (void)
3461{
3462 if (mips_opts.noreorder == 0)
3463 {
3464 unsigned int i;
3465 int nops;
3466
3467 /* None of the instructions before the .set noreorder can be moved. */
3468 for (i = 0; i < ARRAY_SIZE (history); i++)
3469 history[i].fixed_p = 1;
3470
3471 /* Insert any nops that might be needed between the .set noreorder
3472 block and the previous instructions. We will later remove any
3473 nops that turn out not to be needed. */
3474 nops = nops_for_insn (history, NULL);
3475 if (nops > 0)
3476 {
3477 if (mips_optimize != 0)
252b5132
RH
3478 {
3479 /* Record the frag which holds the nop instructions, so
3480 that we can remove them if we don't need them. */
3481 frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
3482 prev_nop_frag = frag_now;
3483 prev_nop_frag_holds = nops;
3484 prev_nop_frag_required = 0;
3485 prev_nop_frag_since = 0;
3486 }
3487
3488 for (; nops > 0; --nops)
1e915849 3489 add_fixed_insn (NOP_INSN);
252b5132 3490
7d10b47d
RS
3491 /* Move on to a new frag, so that it is safe to simply
3492 decrease the size of prev_nop_frag. */
3493 frag_wane (frag_now);
3494 frag_new (0);
404a8071 3495 mips_move_labels ();
252b5132 3496 }
7d10b47d
RS
3497 mips16_mark_labels ();
3498 mips_clear_insn_labels ();
252b5132 3499 }
7d10b47d
RS
3500 mips_opts.noreorder++;
3501 mips_any_noreorder = 1;
3502}
252b5132 3503
7d10b47d 3504/* End a nested noreorder block. */
252b5132 3505
7d10b47d
RS
3506static void
3507end_noreorder (void)
3508{
6a32d874 3509
7d10b47d
RS
3510 mips_opts.noreorder--;
3511 if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
3512 {
3513 /* Commit to inserting prev_nop_frag_required nops and go back to
3514 handling nop insertion the .set reorder way. */
3515 prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
3516 * (mips_opts.mips16 ? 2 : 4));
3517 insert_into_history (prev_nop_frag_since,
3518 prev_nop_frag_required, NOP_INSN);
3519 prev_nop_frag = NULL;
3520 }
252b5132
RH
3521}
3522
584892a6
RS
3523/* Set up global variables for the start of a new macro. */
3524
3525static void
3526macro_start (void)
3527{
3528 memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
3529 mips_macro_warning.delay_slot_p = (mips_opts.noreorder
47e39b9d 3530 && (history[0].insn_mo->pinfo
584892a6
RS
3531 & (INSN_UNCOND_BRANCH_DELAY
3532 | INSN_COND_BRANCH_DELAY
3533 | INSN_COND_BRANCH_LIKELY)) != 0);
3534}
3535
3536/* Given that a macro is longer than 4 bytes, return the appropriate warning
3537 for it. Return null if no warning is needed. SUBTYPE is a bitmask of
3538 RELAX_DELAY_SLOT and RELAX_NOMACRO. */
3539
3540static const char *
3541macro_warning (relax_substateT subtype)
3542{
3543 if (subtype & RELAX_DELAY_SLOT)
3544 return _("Macro instruction expanded into multiple instructions"
3545 " in a branch delay slot");
3546 else if (subtype & RELAX_NOMACRO)
3547 return _("Macro instruction expanded into multiple instructions");
3548 else
3549 return 0;
3550}
3551
3552/* Finish up a macro. Emit warnings as appropriate. */
3553
3554static void
3555macro_end (void)
3556{
3557 if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
3558 {
3559 relax_substateT subtype;
3560
3561 /* Set up the relaxation warning flags. */
3562 subtype = 0;
3563 if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
3564 subtype |= RELAX_SECOND_LONGER;
3565 if (mips_opts.warn_about_macros)
3566 subtype |= RELAX_NOMACRO;
3567 if (mips_macro_warning.delay_slot_p)
3568 subtype |= RELAX_DELAY_SLOT;
3569
3570 if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
3571 {
3572 /* Either the macro has a single implementation or both
3573 implementations are longer than 4 bytes. Emit the
3574 warning now. */
3575 const char *msg = macro_warning (subtype);
3576 if (msg != 0)
520725ea 3577 as_warn ("%s", msg);
584892a6
RS
3578 }
3579 else
3580 {
3581 /* One implementation might need a warning but the other
3582 definitely doesn't. */
3583 mips_macro_warning.first_frag->fr_subtype |= subtype;
3584 }
3585 }
3586}
3587
6e1304d8
RS
3588/* Read a macro's relocation codes from *ARGS and store them in *R.
3589 The first argument in *ARGS will be either the code for a single
3590 relocation or -1 followed by the three codes that make up a
3591 composite relocation. */
3592
3593static void
3594macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
3595{
3596 int i, next;
3597
3598 next = va_arg (*args, int);
3599 if (next >= 0)
3600 r[0] = (bfd_reloc_code_real_type) next;
3601 else
3602 for (i = 0; i < 3; i++)
3603 r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
3604}
3605
252b5132
RH
3606/* Build an instruction created by a macro expansion. This is passed
3607 a pointer to the count of instructions created so far, an
3608 expression, the name of the instruction to build, an operand format
3609 string, and corresponding arguments. */
3610
252b5132 3611static void
67c0d1eb 3612macro_build (expressionS *ep, const char *name, const char *fmt, ...)
252b5132 3613{
1e915849 3614 const struct mips_opcode *mo;
252b5132 3615 struct mips_cl_insn insn;
f6688943 3616 bfd_reloc_code_real_type r[3];
252b5132 3617 va_list args;
252b5132 3618
252b5132 3619 va_start (args, fmt);
252b5132 3620
252b5132
RH
3621 if (mips_opts.mips16)
3622 {
03ea81db 3623 mips16_macro_build (ep, name, fmt, &args);
252b5132
RH
3624 va_end (args);
3625 return;
3626 }
3627
f6688943
TS
3628 r[0] = BFD_RELOC_UNUSED;
3629 r[1] = BFD_RELOC_UNUSED;
3630 r[2] = BFD_RELOC_UNUSED;
1e915849 3631 mo = (struct mips_opcode *) hash_find (op_hash, name);
9c2799c2
NC
3632 gas_assert (mo);
3633 gas_assert (strcmp (name, mo->name) == 0);
1e915849 3634
8b082fb1
TS
3635 while (1)
3636 {
3637 /* Search until we get a match for NAME. It is assumed here that
3638 macros will never generate MDMX, MIPS-3D, or MT instructions. */
3639 if (strcmp (fmt, mo->args) == 0
3640 && mo->pinfo != INSN_MACRO
f79e2745 3641 && is_opcode_valid (mo))
8b082fb1
TS
3642 break;
3643
1e915849 3644 ++mo;
9c2799c2
NC
3645 gas_assert (mo->name);
3646 gas_assert (strcmp (name, mo->name) == 0);
252b5132
RH
3647 }
3648
1e915849 3649 create_insn (&insn, mo);
252b5132
RH
3650 for (;;)
3651 {
3652 switch (*fmt++)
3653 {
3654 case '\0':
3655 break;
3656
3657 case ',':
3658 case '(':
3659 case ')':
3660 continue;
3661
5f74bc13
CD
3662 case '+':
3663 switch (*fmt++)
3664 {
3665 case 'A':
3666 case 'E':
bf12938e 3667 INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
5f74bc13
CD
3668 continue;
3669
3670 case 'B':
3671 case 'F':
3672 /* Note that in the macro case, these arguments are already
3673 in MSB form. (When handling the instruction in the
3674 non-macro case, these arguments are sizes from which
3675 MSB values must be calculated.) */
bf12938e 3676 INSERT_OPERAND (INSMSB, insn, va_arg (args, int));
5f74bc13
CD
3677 continue;
3678
3679 case 'C':
3680 case 'G':
3681 case 'H':
3682 /* Note that in the macro case, these arguments are already
3683 in MSBD form. (When handling the instruction in the
3684 non-macro case, these arguments are sizes from which
3685 MSBD values must be calculated.) */
bf12938e 3686 INSERT_OPERAND (EXTMSBD, insn, va_arg (args, int));
5f74bc13
CD
3687 continue;
3688
dd3cbb7e
NC
3689 case 'Q':
3690 INSERT_OPERAND (SEQI, insn, va_arg (args, int));
3691 continue;
3692
5f74bc13
CD
3693 default:
3694 internalError ();
3695 }
3696 continue;
3697
8b082fb1
TS
3698 case '2':
3699 INSERT_OPERAND (BP, insn, va_arg (args, int));
3700 continue;
3701
252b5132
RH
3702 case 't':
3703 case 'w':
3704 case 'E':
bf12938e 3705 INSERT_OPERAND (RT, insn, va_arg (args, int));
252b5132
RH
3706 continue;
3707
3708 case 'c':
bf12938e 3709 INSERT_OPERAND (CODE, insn, va_arg (args, int));
38487616
TS
3710 continue;
3711
252b5132
RH
3712 case 'T':
3713 case 'W':
bf12938e 3714 INSERT_OPERAND (FT, insn, va_arg (args, int));
252b5132
RH
3715 continue;
3716
3717 case 'd':
3718 case 'G':
af7ee8bf 3719 case 'K':
bf12938e 3720 INSERT_OPERAND (RD, insn, va_arg (args, int));
252b5132
RH
3721 continue;
3722
4372b673
NC
3723 case 'U':
3724 {
3725 int tmp = va_arg (args, int);
3726
bf12938e
RS
3727 INSERT_OPERAND (RT, insn, tmp);
3728 INSERT_OPERAND (RD, insn, tmp);
beae10d5 3729 continue;
4372b673
NC
3730 }
3731
252b5132
RH
3732 case 'V':
3733 case 'S':
bf12938e 3734 INSERT_OPERAND (FS, insn, va_arg (args, int));
252b5132
RH
3735 continue;
3736
3737 case 'z':
3738 continue;
3739
3740 case '<':
bf12938e 3741 INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
252b5132
RH
3742 continue;
3743
3744 case 'D':
bf12938e 3745 INSERT_OPERAND (FD, insn, va_arg (args, int));
252b5132
RH
3746 continue;
3747
3748 case 'B':
bf12938e 3749 INSERT_OPERAND (CODE20, insn, va_arg (args, int));
252b5132
RH
3750 continue;
3751
4372b673 3752 case 'J':
bf12938e 3753 INSERT_OPERAND (CODE19, insn, va_arg (args, int));
4372b673
NC
3754 continue;
3755
252b5132 3756 case 'q':
bf12938e 3757 INSERT_OPERAND (CODE2, insn, va_arg (args, int));
252b5132
RH
3758 continue;
3759
3760 case 'b':
3761 case 's':
3762 case 'r':
3763 case 'v':
bf12938e 3764 INSERT_OPERAND (RS, insn, va_arg (args, int));
252b5132
RH
3765 continue;
3766
3767 case 'i':
3768 case 'j':
6e1304d8 3769 macro_read_relocs (&args, r);
9c2799c2 3770 gas_assert (*r == BFD_RELOC_GPREL16
e391c024
RS
3771 || *r == BFD_RELOC_MIPS_HIGHER
3772 || *r == BFD_RELOC_HI16_S
3773 || *r == BFD_RELOC_LO16
3774 || *r == BFD_RELOC_MIPS_GOT_OFST);
3775 continue;
3776
3777 case 'o':
3778 macro_read_relocs (&args, r);
252b5132
RH
3779 continue;
3780
3781 case 'u':
6e1304d8 3782 macro_read_relocs (&args, r);
9c2799c2 3783 gas_assert (ep != NULL
90ecf173
MR
3784 && (ep->X_op == O_constant
3785 || (ep->X_op == O_symbol
3786 && (*r == BFD_RELOC_MIPS_HIGHEST
3787 || *r == BFD_RELOC_HI16_S
3788 || *r == BFD_RELOC_HI16
3789 || *r == BFD_RELOC_GPREL16
3790 || *r == BFD_RELOC_MIPS_GOT_HI16
3791 || *r == BFD_RELOC_MIPS_CALL_HI16))));
252b5132
RH
3792 continue;
3793
3794 case 'p':
9c2799c2 3795 gas_assert (ep != NULL);
bad36eac 3796
252b5132
RH
3797 /*
3798 * This allows macro() to pass an immediate expression for
3799 * creating short branches without creating a symbol.
bad36eac
DJ
3800 *
3801 * We don't allow branch relaxation for these branches, as
3802 * they should only appear in ".set nomacro" anyway.
252b5132
RH
3803 */
3804 if (ep->X_op == O_constant)
3805 {
bad36eac
DJ
3806 if ((ep->X_add_number & 3) != 0)
3807 as_bad (_("branch to misaligned address (0x%lx)"),
3808 (unsigned long) ep->X_add_number);
3809 if ((ep->X_add_number + 0x20000) & ~0x3ffff)
3810 as_bad (_("branch address range overflow (0x%lx)"),
3811 (unsigned long) ep->X_add_number);
252b5132
RH
3812 insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3813 ep = NULL;
3814 }
3815 else
0b25d3e6 3816 *r = BFD_RELOC_16_PCREL_S2;
252b5132
RH
3817 continue;
3818
3819 case 'a':
9c2799c2 3820 gas_assert (ep != NULL);
f6688943 3821 *r = BFD_RELOC_MIPS_JMP;
252b5132
RH
3822 continue;
3823
3824 case 'C':
a9e24354 3825 INSERT_OPERAND (COPZ, insn, va_arg (args, unsigned long));
252b5132
RH
3826 continue;
3827
d43b4baf 3828 case 'k':
a9e24354 3829 INSERT_OPERAND (CACHE, insn, va_arg (args, unsigned long));
d43b4baf
TS
3830 continue;
3831
252b5132
RH
3832 default:
3833 internalError ();
3834 }
3835 break;
3836 }
3837 va_end (args);
9c2799c2 3838 gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
252b5132 3839
4d7206a2 3840 append_insn (&insn, ep, r);
252b5132
RH
3841}
3842
3843static void
67c0d1eb 3844mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
03ea81db 3845 va_list *args)
252b5132 3846{
1e915849 3847 struct mips_opcode *mo;
252b5132 3848 struct mips_cl_insn insn;
f6688943
TS
3849 bfd_reloc_code_real_type r[3]
3850 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
252b5132 3851
1e915849 3852 mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
9c2799c2
NC
3853 gas_assert (mo);
3854 gas_assert (strcmp (name, mo->name) == 0);
252b5132 3855
1e915849 3856 while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
252b5132 3857 {
1e915849 3858 ++mo;
9c2799c2
NC
3859 gas_assert (mo->name);
3860 gas_assert (strcmp (name, mo->name) == 0);
252b5132
RH
3861 }
3862
1e915849 3863 create_insn (&insn, mo);
252b5132
RH
3864 for (;;)
3865 {
3866 int c;
3867
3868 c = *fmt++;
3869 switch (c)
3870 {
3871 case '\0':
3872 break;
3873
3874 case ',':
3875 case '(':
3876 case ')':
3877 continue;
3878
3879 case 'y':
3880 case 'w':
03ea81db 3881 MIPS16_INSERT_OPERAND (RY, insn, va_arg (*args, int));
252b5132
RH
3882 continue;
3883
3884 case 'x':
3885 case 'v':
03ea81db 3886 MIPS16_INSERT_OPERAND (RX, insn, va_arg (*args, int));
252b5132
RH
3887 continue;
3888
3889 case 'z':
03ea81db 3890 MIPS16_INSERT_OPERAND (RZ, insn, va_arg (*args, int));
252b5132
RH
3891 continue;
3892
3893 case 'Z':
03ea81db 3894 MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (*args, int));
252b5132
RH
3895 continue;
3896
3897 case '0':
3898 case 'S':
3899 case 'P':
3900 case 'R':
3901 continue;
3902
3903 case 'X':
03ea81db 3904 MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (*args, int));
252b5132
RH
3905 continue;
3906
3907 case 'Y':
3908 {
3909 int regno;
3910
03ea81db 3911 regno = va_arg (*args, int);
252b5132 3912 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
a9e24354 3913 MIPS16_INSERT_OPERAND (REG32R, insn, regno);
252b5132
RH
3914 }
3915 continue;
3916
3917 case '<':
3918 case '>':
3919 case '4':
3920 case '5':
3921 case 'H':
3922 case 'W':
3923 case 'D':
3924 case 'j':
3925 case '8':
3926 case 'V':
3927 case 'C':
3928 case 'U':
3929 case 'k':
3930 case 'K':
3931 case 'p':
3932 case 'q':
3933 {
9c2799c2 3934 gas_assert (ep != NULL);
252b5132
RH
3935
3936 if (ep->X_op != O_constant)
874e8986 3937 *r = (int) BFD_RELOC_UNUSED + c;
252b5132
RH
3938 else
3939 {
b34976b6
AM
3940 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3941 FALSE, &insn.insn_opcode, &insn.use_extend,
c4e7957c 3942 &insn.extend);
252b5132 3943 ep = NULL;
f6688943 3944 *r = BFD_RELOC_UNUSED;
252b5132
RH
3945 }
3946 }
3947 continue;
3948
3949 case '6':
03ea81db 3950 MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (*args, int));
252b5132
RH
3951 continue;
3952 }
3953
3954 break;
3955 }
3956
9c2799c2 3957 gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
252b5132 3958
4d7206a2 3959 append_insn (&insn, ep, r);
252b5132
RH
3960}
3961
2051e8c4
MR
3962/*
3963 * Sign-extend 32-bit mode constants that have bit 31 set and all
3964 * higher bits unset.
3965 */
9f872bbe 3966static void
2051e8c4
MR
3967normalize_constant_expr (expressionS *ex)
3968{
9ee2a2d4 3969 if (ex->X_op == O_constant
2051e8c4
MR
3970 && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3971 ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3972 - 0x80000000);
3973}
3974
3975/*
3976 * Sign-extend 32-bit mode address offsets that have bit 31 set and
3977 * all higher bits unset.
3978 */
3979static void
3980normalize_address_expr (expressionS *ex)
3981{
3982 if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
3983 || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
3984 && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3985 ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3986 - 0x80000000);
3987}
3988
438c16b8
TS
3989/*
3990 * Generate a "jalr" instruction with a relocation hint to the called
3991 * function. This occurs in NewABI PIC code.
3992 */
3993static void
67c0d1eb 3994macro_build_jalr (expressionS *ep)
438c16b8 3995{
685736be 3996 char *f = NULL;
b34976b6 3997
1180b5a4 3998 if (MIPS_JALR_HINT_P (ep))
f21f8242 3999 {
cc3d92a5 4000 frag_grow (8);
f21f8242
AO
4001 f = frag_more (0);
4002 }
67c0d1eb 4003 macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
1180b5a4 4004 if (MIPS_JALR_HINT_P (ep))
f21f8242 4005 fix_new_exp (frag_now, f - frag_now->fr_literal,
a105a300 4006 4, ep, FALSE, BFD_RELOC_MIPS_JALR);
438c16b8
TS
4007}
4008
252b5132
RH
4009/*
4010 * Generate a "lui" instruction.
4011 */
4012static void
67c0d1eb 4013macro_build_lui (expressionS *ep, int regnum)
252b5132
RH
4014{
4015 expressionS high_expr;
1e915849 4016 const struct mips_opcode *mo;
252b5132 4017 struct mips_cl_insn insn;
f6688943
TS
4018 bfd_reloc_code_real_type r[3]
4019 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
5a38dc70
AM
4020 const char *name = "lui";
4021 const char *fmt = "t,u";
252b5132 4022
9c2799c2 4023 gas_assert (! mips_opts.mips16);
252b5132 4024
4d7206a2 4025 high_expr = *ep;
252b5132
RH
4026
4027 if (high_expr.X_op == O_constant)
4028 {
54f4ddb3 4029 /* We can compute the instruction now without a relocation entry. */
e7d556df
TS
4030 high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
4031 >> 16) & 0xffff;
f6688943 4032 *r = BFD_RELOC_UNUSED;
252b5132 4033 }
78e1bb40 4034 else
252b5132 4035 {
9c2799c2 4036 gas_assert (ep->X_op == O_symbol);
bbe506e8
TS
4037 /* _gp_disp is a special case, used from s_cpload.
4038 __gnu_local_gp is used if mips_no_shared. */
9c2799c2 4039 gas_assert (mips_pic == NO_PIC
78e1bb40 4040 || (! HAVE_NEWABI
aa6975fb
ILT
4041 && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
4042 || (! mips_in_shared
bbe506e8
TS
4043 && strcmp (S_GET_NAME (ep->X_add_symbol),
4044 "__gnu_local_gp") == 0));
f6688943 4045 *r = BFD_RELOC_HI16_S;
252b5132
RH
4046 }
4047
1e915849 4048 mo = hash_find (op_hash, name);
9c2799c2
NC
4049 gas_assert (strcmp (name, mo->name) == 0);
4050 gas_assert (strcmp (fmt, mo->args) == 0);
1e915849 4051 create_insn (&insn, mo);
252b5132 4052
bf12938e
RS
4053 insn.insn_opcode = insn.insn_mo->match;
4054 INSERT_OPERAND (RT, insn, regnum);
f6688943 4055 if (*r == BFD_RELOC_UNUSED)
252b5132
RH
4056 {
4057 insn.insn_opcode |= high_expr.X_add_number;
4d7206a2 4058 append_insn (&insn, NULL, r);
252b5132
RH
4059 }
4060 else
4d7206a2 4061 append_insn (&insn, &high_expr, r);
252b5132
RH
4062}
4063
885add95
CD
4064/* Generate a sequence of instructions to do a load or store from a constant
4065 offset off of a base register (breg) into/from a target register (treg),
4066 using AT if necessary. */
4067static void
67c0d1eb
RS
4068macro_build_ldst_constoffset (expressionS *ep, const char *op,
4069 int treg, int breg, int dbl)
885add95 4070{
9c2799c2 4071 gas_assert (ep->X_op == O_constant);
885add95 4072
256ab948 4073 /* Sign-extending 32-bit constants makes their handling easier. */
2051e8c4
MR
4074 if (!dbl)
4075 normalize_constant_expr (ep);
256ab948 4076
67c1ffbe 4077 /* Right now, this routine can only handle signed 32-bit constants. */
ecd13cd3 4078 if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
885add95
CD
4079 as_warn (_("operand overflow"));
4080
4081 if (IS_SEXT_16BIT_NUM(ep->X_add_number))
4082 {
4083 /* Signed 16-bit offset will fit in the op. Easy! */
67c0d1eb 4084 macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
885add95
CD
4085 }
4086 else
4087 {
4088 /* 32-bit offset, need multiple instructions and AT, like:
4089 lui $tempreg,const_hi (BFD_RELOC_HI16_S)
4090 addu $tempreg,$tempreg,$breg
4091 <op> $treg,const_lo($tempreg) (BFD_RELOC_LO16)
4092 to handle the complete offset. */
67c0d1eb
RS
4093 macro_build_lui (ep, AT);
4094 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
4095 macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
885add95 4096
741fe287 4097 if (!mips_opts.at)
8fc2e39e 4098 as_bad (_("Macro used $at after \".set noat\""));
885add95
CD
4099 }
4100}
4101
252b5132
RH
4102/* set_at()
4103 * Generates code to set the $at register to true (one)
4104 * if reg is less than the immediate expression.
4105 */
4106static void
67c0d1eb 4107set_at (int reg, int unsignedp)
252b5132
RH
4108{
4109 if (imm_expr.X_op == O_constant
4110 && imm_expr.X_add_number >= -0x8000
4111 && imm_expr.X_add_number < 0x8000)
67c0d1eb
RS
4112 macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
4113 AT, reg, BFD_RELOC_LO16);
252b5132
RH
4114 else
4115 {
67c0d1eb
RS
4116 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4117 macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
252b5132
RH
4118 }
4119}
4120
4121/* Warn if an expression is not a constant. */
4122
4123static void
17a2f251 4124check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
252b5132
RH
4125{
4126 if (ex->X_op == O_big)
4127 as_bad (_("unsupported large constant"));
4128 else if (ex->X_op != O_constant)
9ee2a2d4
MR
4129 as_bad (_("Instruction %s requires absolute expression"),
4130 ip->insn_mo->name);
13757d0c 4131
9ee2a2d4
MR
4132 if (HAVE_32BIT_GPRS)
4133 normalize_constant_expr (ex);
252b5132
RH
4134}
4135
4136/* Count the leading zeroes by performing a binary chop. This is a
4137 bulky bit of source, but performance is a LOT better for the
4138 majority of values than a simple loop to count the bits:
4139 for (lcnt = 0; (lcnt < 32); lcnt++)
4140 if ((v) & (1 << (31 - lcnt)))
4141 break;
4142 However it is not code size friendly, and the gain will drop a bit
4143 on certain cached systems.
4144*/
4145#define COUNT_TOP_ZEROES(v) \
4146 (((v) & ~0xffff) == 0 \
4147 ? ((v) & ~0xff) == 0 \
4148 ? ((v) & ~0xf) == 0 \
4149 ? ((v) & ~0x3) == 0 \
4150 ? ((v) & ~0x1) == 0 \
4151 ? !(v) \
4152 ? 32 \
4153 : 31 \
4154 : 30 \
4155 : ((v) & ~0x7) == 0 \
4156 ? 29 \
4157 : 28 \
4158 : ((v) & ~0x3f) == 0 \
4159 ? ((v) & ~0x1f) == 0 \
4160 ? 27 \
4161 : 26 \
4162 : ((v) & ~0x7f) == 0 \
4163 ? 25 \
4164 : 24 \
4165 : ((v) & ~0xfff) == 0 \
4166 ? ((v) & ~0x3ff) == 0 \
4167 ? ((v) & ~0x1ff) == 0 \
4168 ? 23 \
4169 : 22 \
4170 : ((v) & ~0x7ff) == 0 \
4171 ? 21 \
4172 : 20 \
4173 : ((v) & ~0x3fff) == 0 \
4174 ? ((v) & ~0x1fff) == 0 \
4175 ? 19 \
4176 : 18 \
4177 : ((v) & ~0x7fff) == 0 \
4178 ? 17 \
4179 : 16 \
4180 : ((v) & ~0xffffff) == 0 \
4181 ? ((v) & ~0xfffff) == 0 \
4182 ? ((v) & ~0x3ffff) == 0 \
4183 ? ((v) & ~0x1ffff) == 0 \
4184 ? 15 \
4185 : 14 \
4186 : ((v) & ~0x7ffff) == 0 \
4187 ? 13 \
4188 : 12 \
4189 : ((v) & ~0x3fffff) == 0 \
4190 ? ((v) & ~0x1fffff) == 0 \
4191 ? 11 \
4192 : 10 \
4193 : ((v) & ~0x7fffff) == 0 \
4194 ? 9 \
4195 : 8 \
4196 : ((v) & ~0xfffffff) == 0 \
4197 ? ((v) & ~0x3ffffff) == 0 \
4198 ? ((v) & ~0x1ffffff) == 0 \
4199 ? 7 \
4200 : 6 \
4201 : ((v) & ~0x7ffffff) == 0 \
4202 ? 5 \
4203 : 4 \
4204 : ((v) & ~0x3fffffff) == 0 \
4205 ? ((v) & ~0x1fffffff) == 0 \
4206 ? 3 \
4207 : 2 \
4208 : ((v) & ~0x7fffffff) == 0 \
4209 ? 1 \
4210 : 0)
4211
4212/* load_register()
67c1ffbe 4213 * This routine generates the least number of instructions necessary to load
252b5132
RH
4214 * an absolute expression value into a register.
4215 */
4216static void
67c0d1eb 4217load_register (int reg, expressionS *ep, int dbl)
252b5132
RH
4218{
4219 int freg;
4220 expressionS hi32, lo32;
4221
4222 if (ep->X_op != O_big)
4223 {
9c2799c2 4224 gas_assert (ep->X_op == O_constant);
256ab948
TS
4225
4226 /* Sign-extending 32-bit constants makes their handling easier. */
2051e8c4
MR
4227 if (!dbl)
4228 normalize_constant_expr (ep);
256ab948
TS
4229
4230 if (IS_SEXT_16BIT_NUM (ep->X_add_number))
252b5132
RH
4231 {
4232 /* We can handle 16 bit signed values with an addiu to
4233 $zero. No need to ever use daddiu here, since $zero and
4234 the result are always correct in 32 bit mode. */
67c0d1eb 4235 macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
252b5132
RH
4236 return;
4237 }
4238 else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
4239 {
4240 /* We can handle 16 bit unsigned values with an ori to
4241 $zero. */
67c0d1eb 4242 macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
252b5132
RH
4243 return;
4244 }
256ab948 4245 else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
252b5132
RH
4246 {
4247 /* 32 bit values require an lui. */
67c0d1eb 4248 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
252b5132 4249 if ((ep->X_add_number & 0xffff) != 0)
67c0d1eb 4250 macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
252b5132
RH
4251 return;
4252 }
4253 }
4254
4255 /* The value is larger than 32 bits. */
4256
2051e8c4 4257 if (!dbl || HAVE_32BIT_GPRS)
252b5132 4258 {
55e08f71
NC
4259 char value[32];
4260
4261 sprintf_vma (value, ep->X_add_number);
20e1fcfd 4262 as_bad (_("Number (0x%s) larger than 32 bits"), value);
67c0d1eb 4263 macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
252b5132
RH
4264 return;
4265 }
4266
4267 if (ep->X_op != O_big)
4268 {
4269 hi32 = *ep;
4270 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4271 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4272 hi32.X_add_number &= 0xffffffff;
4273 lo32 = *ep;
4274 lo32.X_add_number &= 0xffffffff;
4275 }
4276 else
4277 {
9c2799c2 4278 gas_assert (ep->X_add_number > 2);
252b5132
RH
4279 if (ep->X_add_number == 3)
4280 generic_bignum[3] = 0;
4281 else if (ep->X_add_number > 4)
4282 as_bad (_("Number larger than 64 bits"));
4283 lo32.X_op = O_constant;
4284 lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
4285 hi32.X_op = O_constant;
4286 hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
4287 }
4288
4289 if (hi32.X_add_number == 0)
4290 freg = 0;
4291 else
4292 {
4293 int shift, bit;
4294 unsigned long hi, lo;
4295
956cd1d6 4296 if (hi32.X_add_number == (offsetT) 0xffffffff)
beae10d5
KH
4297 {
4298 if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
4299 {
67c0d1eb 4300 macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
beae10d5
KH
4301 return;
4302 }
4303 if (lo32.X_add_number & 0x80000000)
4304 {
67c0d1eb 4305 macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
252b5132 4306 if (lo32.X_add_number & 0xffff)
67c0d1eb 4307 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
beae10d5
KH
4308 return;
4309 }
4310 }
252b5132
RH
4311
4312 /* Check for 16bit shifted constant. We know that hi32 is
4313 non-zero, so start the mask on the first bit of the hi32
4314 value. */
4315 shift = 17;
4316 do
beae10d5
KH
4317 {
4318 unsigned long himask, lomask;
4319
4320 if (shift < 32)
4321 {
4322 himask = 0xffff >> (32 - shift);
4323 lomask = (0xffff << shift) & 0xffffffff;
4324 }
4325 else
4326 {
4327 himask = 0xffff << (shift - 32);
4328 lomask = 0;
4329 }
4330 if ((hi32.X_add_number & ~(offsetT) himask) == 0
4331 && (lo32.X_add_number & ~(offsetT) lomask) == 0)
4332 {
4333 expressionS tmp;
4334
4335 tmp.X_op = O_constant;
4336 if (shift < 32)
4337 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
4338 | (lo32.X_add_number >> shift));
4339 else
4340 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
67c0d1eb
RS
4341 macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4342 macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
4343 reg, reg, (shift >= 32) ? shift - 32 : shift);
beae10d5
KH
4344 return;
4345 }
f9419b05 4346 ++shift;
beae10d5
KH
4347 }
4348 while (shift <= (64 - 16));
252b5132
RH
4349
4350 /* Find the bit number of the lowest one bit, and store the
4351 shifted value in hi/lo. */
4352 hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
4353 lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
4354 if (lo != 0)
4355 {
4356 bit = 0;
4357 while ((lo & 1) == 0)
4358 {
4359 lo >>= 1;
4360 ++bit;
4361 }
4362 lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
4363 hi >>= bit;
4364 }
4365 else
4366 {
4367 bit = 32;
4368 while ((hi & 1) == 0)
4369 {
4370 hi >>= 1;
4371 ++bit;
4372 }
4373 lo = hi;
4374 hi = 0;
4375 }
4376
4377 /* Optimize if the shifted value is a (power of 2) - 1. */
4378 if ((hi == 0 && ((lo + 1) & lo) == 0)
4379 || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
beae10d5
KH
4380 {
4381 shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
252b5132 4382 if (shift != 0)
beae10d5 4383 {
252b5132
RH
4384 expressionS tmp;
4385
4386 /* This instruction will set the register to be all
4387 ones. */
beae10d5
KH
4388 tmp.X_op = O_constant;
4389 tmp.X_add_number = (offsetT) -1;
67c0d1eb 4390 macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
beae10d5
KH
4391 if (bit != 0)
4392 {
4393 bit += shift;
67c0d1eb
RS
4394 macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
4395 reg, reg, (bit >= 32) ? bit - 32 : bit);
beae10d5 4396 }
67c0d1eb
RS
4397 macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
4398 reg, reg, (shift >= 32) ? shift - 32 : shift);
beae10d5
KH
4399 return;
4400 }
4401 }
252b5132
RH
4402
4403 /* Sign extend hi32 before calling load_register, because we can
4404 generally get better code when we load a sign extended value. */
4405 if ((hi32.X_add_number & 0x80000000) != 0)
beae10d5 4406 hi32.X_add_number |= ~(offsetT) 0xffffffff;
67c0d1eb 4407 load_register (reg, &hi32, 0);
252b5132
RH
4408 freg = reg;
4409 }
4410 if ((lo32.X_add_number & 0xffff0000) == 0)
4411 {
4412 if (freg != 0)
4413 {
67c0d1eb 4414 macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
252b5132
RH
4415 freg = reg;
4416 }
4417 }
4418 else
4419 {
4420 expressionS mid16;
4421
956cd1d6 4422 if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
beae10d5 4423 {
67c0d1eb
RS
4424 macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4425 macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
beae10d5
KH
4426 return;
4427 }
252b5132
RH
4428
4429 if (freg != 0)
4430 {
67c0d1eb 4431 macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
252b5132
RH
4432 freg = reg;
4433 }
4434 mid16 = lo32;
4435 mid16.X_add_number >>= 16;
67c0d1eb
RS
4436 macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4437 macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
252b5132
RH
4438 freg = reg;
4439 }
4440 if ((lo32.X_add_number & 0xffff) != 0)
67c0d1eb 4441 macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
252b5132
RH
4442}
4443
269137b2
TS
4444static inline void
4445load_delay_nop (void)
4446{
4447 if (!gpr_interlocks)
4448 macro_build (NULL, "nop", "");
4449}
4450
252b5132
RH
4451/* Load an address into a register. */
4452
4453static void
67c0d1eb 4454load_address (int reg, expressionS *ep, int *used_at)
252b5132 4455{
252b5132
RH
4456 if (ep->X_op != O_constant
4457 && ep->X_op != O_symbol)
4458 {
4459 as_bad (_("expression too complex"));
4460 ep->X_op = O_constant;
4461 }
4462
4463 if (ep->X_op == O_constant)
4464 {
67c0d1eb 4465 load_register (reg, ep, HAVE_64BIT_ADDRESSES);
252b5132
RH
4466 return;
4467 }
4468
4469 if (mips_pic == NO_PIC)
4470 {
4471 /* If this is a reference to a GP relative symbol, we want
cdf6fd85 4472 addiu $reg,$gp,<sym> (BFD_RELOC_GPREL16)
252b5132
RH
4473 Otherwise we want
4474 lui $reg,<sym> (BFD_RELOC_HI16_S)
4475 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
d6bc6245 4476 If we have an addend, we always use the latter form.
76b3015f 4477
d6bc6245
TS
4478 With 64bit address space and a usable $at we want
4479 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
4480 lui $at,<sym> (BFD_RELOC_HI16_S)
4481 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
4482 daddiu $at,<sym> (BFD_RELOC_LO16)
4483 dsll32 $reg,0
3a482fd5 4484 daddu $reg,$reg,$at
76b3015f 4485
c03099e6 4486 If $at is already in use, we use a path which is suboptimal
d6bc6245
TS
4487 on superscalar processors.
4488 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
4489 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
4490 dsll $reg,16
4491 daddiu $reg,<sym> (BFD_RELOC_HI16_S)
4492 dsll $reg,16
4493 daddiu $reg,<sym> (BFD_RELOC_LO16)
6caf9ef4
TS
4494
4495 For GP relative symbols in 64bit address space we can use
4496 the same sequence as in 32bit address space. */
aed1a261 4497 if (HAVE_64BIT_SYMBOLS)
d6bc6245 4498 {
6caf9ef4
TS
4499 if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4500 && !nopic_need_relax (ep->X_add_symbol, 1))
4501 {
4502 relax_start (ep->X_add_symbol);
4503 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4504 mips_gp_register, BFD_RELOC_GPREL16);
4505 relax_switch ();
4506 }
d6bc6245 4507
741fe287 4508 if (*used_at == 0 && mips_opts.at)
d6bc6245 4509 {
67c0d1eb
RS
4510 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4511 macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
4512 macro_build (ep, "daddiu", "t,r,j", reg, reg,
4513 BFD_RELOC_MIPS_HIGHER);
4514 macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
4515 macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
4516 macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
d6bc6245
TS
4517 *used_at = 1;
4518 }
4519 else
4520 {
67c0d1eb
RS
4521 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4522 macro_build (ep, "daddiu", "t,r,j", reg, reg,
4523 BFD_RELOC_MIPS_HIGHER);
4524 macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4525 macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
4526 macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4527 macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
d6bc6245 4528 }
6caf9ef4
TS
4529
4530 if (mips_relax.sequence)
4531 relax_end ();
d6bc6245 4532 }
252b5132
RH
4533 else
4534 {
d6bc6245 4535 if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
6caf9ef4 4536 && !nopic_need_relax (ep->X_add_symbol, 1))
d6bc6245 4537 {
4d7206a2 4538 relax_start (ep->X_add_symbol);
67c0d1eb 4539 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
17a2f251 4540 mips_gp_register, BFD_RELOC_GPREL16);
4d7206a2 4541 relax_switch ();
d6bc6245 4542 }
67c0d1eb
RS
4543 macro_build_lui (ep, reg);
4544 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
4545 reg, reg, BFD_RELOC_LO16);
4d7206a2
RS
4546 if (mips_relax.sequence)
4547 relax_end ();
d6bc6245 4548 }
252b5132 4549 }
0a44bf69 4550 else if (!mips_big_got)
252b5132
RH
4551 {
4552 expressionS ex;
4553
4554 /* If this is a reference to an external symbol, we want
4555 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4556 Otherwise we want
4557 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4558 nop
4559 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
f5040a92
AO
4560 If there is a constant, it must be added in after.
4561
ed6fb7bd 4562 If we have NewABI, we want
f5040a92
AO
4563 lw $reg,<sym+cst>($gp) (BFD_RELOC_MIPS_GOT_DISP)
4564 unless we're referencing a global symbol with a non-zero
4565 offset, in which case cst must be added separately. */
ed6fb7bd
SC
4566 if (HAVE_NEWABI)
4567 {
f5040a92
AO
4568 if (ep->X_add_number)
4569 {
4d7206a2 4570 ex.X_add_number = ep->X_add_number;
f5040a92 4571 ep->X_add_number = 0;
4d7206a2 4572 relax_start (ep->X_add_symbol);
67c0d1eb
RS
4573 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4574 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
f5040a92
AO
4575 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4576 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4577 ex.X_op = O_constant;
67c0d1eb 4578 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
17a2f251 4579 reg, reg, BFD_RELOC_LO16);
f5040a92 4580 ep->X_add_number = ex.X_add_number;
4d7206a2 4581 relax_switch ();
f5040a92 4582 }
67c0d1eb 4583 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
17a2f251 4584 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4d7206a2
RS
4585 if (mips_relax.sequence)
4586 relax_end ();
ed6fb7bd
SC
4587 }
4588 else
4589 {
f5040a92
AO
4590 ex.X_add_number = ep->X_add_number;
4591 ep->X_add_number = 0;
67c0d1eb
RS
4592 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4593 BFD_RELOC_MIPS_GOT16, mips_gp_register);
269137b2 4594 load_delay_nop ();
4d7206a2
RS
4595 relax_start (ep->X_add_symbol);
4596 relax_switch ();
67c0d1eb 4597 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
17a2f251 4598 BFD_RELOC_LO16);
4d7206a2 4599 relax_end ();
ed6fb7bd 4600
f5040a92
AO
4601 if (ex.X_add_number != 0)
4602 {
4603 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4604 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4605 ex.X_op = O_constant;
67c0d1eb 4606 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
17a2f251 4607 reg, reg, BFD_RELOC_LO16);
f5040a92 4608 }
252b5132
RH
4609 }
4610 }
0a44bf69 4611 else if (mips_big_got)
252b5132
RH
4612 {
4613 expressionS ex;
252b5132
RH
4614
4615 /* This is the large GOT case. If this is a reference to an
4616 external symbol, we want
4617 lui $reg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
4618 addu $reg,$reg,$gp
4619 lw $reg,<sym>($reg) (BFD_RELOC_MIPS_GOT_LO16)
f5040a92
AO
4620
4621 Otherwise, for a reference to a local symbol in old ABI, we want
252b5132
RH
4622 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4623 nop
4624 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
684022ea 4625 If there is a constant, it must be added in after.
f5040a92
AO
4626
4627 In the NewABI, for local symbols, with or without offsets, we want:
438c16b8
TS
4628 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
4629 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
f5040a92 4630 */
438c16b8
TS
4631 if (HAVE_NEWABI)
4632 {
4d7206a2 4633 ex.X_add_number = ep->X_add_number;
f5040a92 4634 ep->X_add_number = 0;
4d7206a2 4635 relax_start (ep->X_add_symbol);
67c0d1eb
RS
4636 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4637 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4638 reg, reg, mips_gp_register);
4639 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4640 reg, BFD_RELOC_MIPS_GOT_LO16, reg);
f5040a92
AO
4641 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4642 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4643 else if (ex.X_add_number)
4644 {
4645 ex.X_op = O_constant;
67c0d1eb
RS
4646 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4647 BFD_RELOC_LO16);
f5040a92
AO
4648 }
4649
4650 ep->X_add_number = ex.X_add_number;
4d7206a2 4651 relax_switch ();
67c0d1eb 4652 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
17a2f251 4653 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
67c0d1eb
RS
4654 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4655 BFD_RELOC_MIPS_GOT_OFST);
4d7206a2 4656 relax_end ();
438c16b8 4657 }
252b5132 4658 else
438c16b8 4659 {
f5040a92
AO
4660 ex.X_add_number = ep->X_add_number;
4661 ep->X_add_number = 0;
4d7206a2 4662 relax_start (ep->X_add_symbol);
67c0d1eb
RS
4663 macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4664 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4665 reg, reg, mips_gp_register);
4666 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4667 reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4d7206a2
RS
4668 relax_switch ();
4669 if (reg_needs_delay (mips_gp_register))
438c16b8
TS
4670 {
4671 /* We need a nop before loading from $gp. This special
4672 check is required because the lui which starts the main
4673 instruction stream does not refer to $gp, and so will not
4674 insert the nop which may be required. */
67c0d1eb 4675 macro_build (NULL, "nop", "");
438c16b8 4676 }
67c0d1eb 4677 macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
17a2f251 4678 BFD_RELOC_MIPS_GOT16, mips_gp_register);
269137b2 4679 load_delay_nop ();
67c0d1eb 4680 macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
17a2f251 4681 BFD_RELOC_LO16);
4d7206a2 4682 relax_end ();
438c16b8 4683
f5040a92
AO
4684 if (ex.X_add_number != 0)
4685 {
4686 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4687 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4688 ex.X_op = O_constant;
67c0d1eb
RS
4689 macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4690 BFD_RELOC_LO16);
f5040a92 4691 }
252b5132
RH
4692 }
4693 }
252b5132
RH
4694 else
4695 abort ();
8fc2e39e 4696
741fe287 4697 if (!mips_opts.at && *used_at == 1)
8fc2e39e 4698 as_bad (_("Macro used $at after \".set noat\""));
252b5132
RH
4699}
4700
ea1fb5dc
RS
4701/* Move the contents of register SOURCE into register DEST. */
4702
4703static void
67c0d1eb 4704move_register (int dest, int source)
ea1fb5dc 4705{
67c0d1eb
RS
4706 macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4707 dest, source, 0);
ea1fb5dc
RS
4708}
4709
4d7206a2 4710/* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
f6a22291
MR
4711 LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
4712 The two alternatives are:
4d7206a2
RS
4713
4714 Global symbol Local sybmol
4715 ------------- ------------
4716 lw DEST,%got(SYMBOL) lw DEST,%got(SYMBOL + OFFSET)
4717 ... ...
4718 addiu DEST,DEST,OFFSET addiu DEST,DEST,%lo(SYMBOL + OFFSET)
4719
4720 load_got_offset emits the first instruction and add_got_offset
f6a22291
MR
4721 emits the second for a 16-bit offset or add_got_offset_hilo emits
4722 a sequence to add a 32-bit offset using a scratch register. */
4d7206a2
RS
4723
4724static void
67c0d1eb 4725load_got_offset (int dest, expressionS *local)
4d7206a2
RS
4726{
4727 expressionS global;
4728
4729 global = *local;
4730 global.X_add_number = 0;
4731
4732 relax_start (local->X_add_symbol);
67c0d1eb
RS
4733 macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4734 BFD_RELOC_MIPS_GOT16, mips_gp_register);
4d7206a2 4735 relax_switch ();
67c0d1eb
RS
4736 macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4737 BFD_RELOC_MIPS_GOT16, mips_gp_register);
4d7206a2
RS
4738 relax_end ();
4739}
4740
4741static void
67c0d1eb 4742add_got_offset (int dest, expressionS *local)
4d7206a2
RS
4743{
4744 expressionS global;
4745
4746 global.X_op = O_constant;
4747 global.X_op_symbol = NULL;
4748 global.X_add_symbol = NULL;
4749 global.X_add_number = local->X_add_number;
4750
4751 relax_start (local->X_add_symbol);
67c0d1eb 4752 macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
4d7206a2
RS
4753 dest, dest, BFD_RELOC_LO16);
4754 relax_switch ();
67c0d1eb 4755 macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
4d7206a2
RS
4756 relax_end ();
4757}
4758
f6a22291
MR
4759static void
4760add_got_offset_hilo (int dest, expressionS *local, int tmp)
4761{
4762 expressionS global;
4763 int hold_mips_optimize;
4764
4765 global.X_op = O_constant;
4766 global.X_op_symbol = NULL;
4767 global.X_add_symbol = NULL;
4768 global.X_add_number = local->X_add_number;
4769
4770 relax_start (local->X_add_symbol);
4771 load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
4772 relax_switch ();
4773 /* Set mips_optimize around the lui instruction to avoid
4774 inserting an unnecessary nop after the lw. */
4775 hold_mips_optimize = mips_optimize;
4776 mips_optimize = 2;
4777 macro_build_lui (&global, tmp);
4778 mips_optimize = hold_mips_optimize;
4779 macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
4780 relax_end ();
4781
4782 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
4783}
4784
252b5132
RH
4785/*
4786 * Build macros
4787 * This routine implements the seemingly endless macro or synthesized
4788 * instructions and addressing modes in the mips assembly language. Many
4789 * of these macros are simple and are similar to each other. These could
67c1ffbe 4790 * probably be handled by some kind of table or grammar approach instead of
252b5132
RH
4791 * this verbose method. Others are not simple macros but are more like
4792 * optimizing code generation.
4793 * One interesting optimization is when several store macros appear
67c1ffbe 4794 * consecutively that would load AT with the upper half of the same address.
252b5132
RH
4795 * The ensuing load upper instructions are ommited. This implies some kind
4796 * of global optimization. We currently only optimize within a single macro.
4797 * For many of the load and store macros if the address is specified as a
4798 * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4799 * first load register 'at' with zero and use it as the base register. The
4800 * mips assembler simply uses register $zero. Just one tiny optimization
4801 * we're missing.
4802 */
4803static void
17a2f251 4804macro (struct mips_cl_insn *ip)
252b5132 4805{
741fe287
MR
4806 unsigned int treg, sreg, dreg, breg;
4807 unsigned int tempreg;
252b5132 4808 int mask;
43841e91 4809 int used_at = 0;
252b5132
RH
4810 expressionS expr1;
4811 const char *s;
4812 const char *s2;
4813 const char *fmt;
4814 int likely = 0;
4815 int dbl = 0;
4816 int coproc = 0;
4817 int lr = 0;
4818 int imm = 0;
1abe91b1 4819 int call = 0;
252b5132 4820 int off;
67c0d1eb 4821 offsetT maxnum;
252b5132 4822 bfd_reloc_code_real_type r;
252b5132
RH
4823 int hold_mips_optimize;
4824
9c2799c2 4825 gas_assert (! mips_opts.mips16);
252b5132 4826
bbea7ebc
MR
4827 treg = EXTRACT_OPERAND (RT, *ip);
4828 dreg = EXTRACT_OPERAND (RD, *ip);
4829 sreg = breg = EXTRACT_OPERAND (RS, *ip);
252b5132
RH
4830 mask = ip->insn_mo->mask;
4831
4832 expr1.X_op = O_constant;
4833 expr1.X_op_symbol = NULL;
4834 expr1.X_add_symbol = NULL;
4835 expr1.X_add_number = 1;
4836
4837 switch (mask)
4838 {
4839 case M_DABS:
4840 dbl = 1;
4841 case M_ABS:
4842 /* bgez $a0,.+12
4843 move v0,$a0
4844 sub v0,$zero,$a0
4845 */
4846
7d10b47d 4847 start_noreorder ();
252b5132
RH
4848
4849 expr1.X_add_number = 8;
67c0d1eb 4850 macro_build (&expr1, "bgez", "s,p", sreg);
252b5132 4851 if (dreg == sreg)
a605d2b3 4852 macro_build (NULL, "nop", "");
252b5132 4853 else
67c0d1eb
RS
4854 move_register (dreg, sreg);
4855 macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
252b5132 4856
7d10b47d 4857 end_noreorder ();
8fc2e39e 4858 break;
252b5132
RH
4859
4860 case M_ADD_I:
4861 s = "addi";
4862 s2 = "add";
4863 goto do_addi;
4864 case M_ADDU_I:
4865 s = "addiu";
4866 s2 = "addu";
4867 goto do_addi;
4868 case M_DADD_I:
4869 dbl = 1;
4870 s = "daddi";
4871 s2 = "dadd";
4872 goto do_addi;
4873 case M_DADDU_I:
4874 dbl = 1;
4875 s = "daddiu";
4876 s2 = "daddu";
4877 do_addi:
4878 if (imm_expr.X_op == O_constant
4879 && imm_expr.X_add_number >= -0x8000
4880 && imm_expr.X_add_number < 0x8000)
4881 {
67c0d1eb 4882 macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
8fc2e39e 4883 break;
252b5132 4884 }
8fc2e39e 4885 used_at = 1;
67c0d1eb
RS
4886 load_register (AT, &imm_expr, dbl);
4887 macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
252b5132
RH
4888 break;
4889
4890 case M_AND_I:
4891 s = "andi";
4892 s2 = "and";
4893 goto do_bit;
4894 case M_OR_I:
4895 s = "ori";
4896 s2 = "or";
4897 goto do_bit;
4898 case M_NOR_I:
4899 s = "";
4900 s2 = "nor";
4901 goto do_bit;
4902 case M_XOR_I:
4903 s = "xori";
4904 s2 = "xor";
4905 do_bit:
4906 if (imm_expr.X_op == O_constant
4907 && imm_expr.X_add_number >= 0
4908 && imm_expr.X_add_number < 0x10000)
4909 {
4910 if (mask != M_NOR_I)
67c0d1eb 4911 macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
252b5132
RH
4912 else
4913 {
67c0d1eb
RS
4914 macro_build (&imm_expr, "ori", "t,r,i",
4915 treg, sreg, BFD_RELOC_LO16);
4916 macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
252b5132 4917 }
8fc2e39e 4918 break;
252b5132
RH
4919 }
4920
8fc2e39e 4921 used_at = 1;
67c0d1eb
RS
4922 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4923 macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
252b5132
RH
4924 break;
4925
8b082fb1
TS
4926 case M_BALIGN:
4927 switch (imm_expr.X_add_number)
4928 {
4929 case 0:
4930 macro_build (NULL, "nop", "");
4931 break;
4932 case 2:
4933 macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
4934 break;
4935 default:
4936 macro_build (NULL, "balign", "t,s,2", treg, sreg,
90ecf173 4937 (int) imm_expr.X_add_number);
8b082fb1
TS
4938 break;
4939 }
4940 break;
4941
252b5132
RH
4942 case M_BEQ_I:
4943 s = "beq";
4944 goto beq_i;
4945 case M_BEQL_I:
4946 s = "beql";
4947 likely = 1;
4948 goto beq_i;
4949 case M_BNE_I:
4950 s = "bne";
4951 goto beq_i;
4952 case M_BNEL_I:
4953 s = "bnel";
4954 likely = 1;
4955 beq_i:
4956 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4957 {
c80c840e 4958 macro_build (&offset_expr, s, "s,t,p", sreg, ZERO);
8fc2e39e 4959 break;
252b5132 4960 }
8fc2e39e 4961 used_at = 1;
67c0d1eb
RS
4962 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4963 macro_build (&offset_expr, s, "s,t,p", sreg, AT);
252b5132
RH
4964 break;
4965
4966 case M_BGEL:
4967 likely = 1;
4968 case M_BGE:
4969 if (treg == 0)
4970 {
67c0d1eb 4971 macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
8fc2e39e 4972 break;
252b5132
RH
4973 }
4974 if (sreg == 0)
4975 {
67c0d1eb 4976 macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
8fc2e39e 4977 break;
252b5132 4978 }
8fc2e39e 4979 used_at = 1;
67c0d1eb 4980 macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
c80c840e 4981 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
252b5132
RH
4982 break;
4983
4984 case M_BGTL_I:
4985 likely = 1;
4986 case M_BGT_I:
90ecf173 4987 /* Check for > max integer. */
252b5132 4988 maxnum = 0x7fffffff;
ca4e0257 4989 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
252b5132
RH
4990 {
4991 maxnum <<= 16;
4992 maxnum |= 0xffff;
4993 maxnum <<= 16;
4994 maxnum |= 0xffff;
4995 }
4996 if (imm_expr.X_op == O_constant
4997 && imm_expr.X_add_number >= maxnum
ca4e0257 4998 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
252b5132
RH
4999 {
5000 do_false:
90ecf173 5001 /* Result is always false. */
252b5132 5002 if (! likely)
a605d2b3 5003 macro_build (NULL, "nop", "");
252b5132 5004 else
c80c840e 5005 macro_build (&offset_expr, "bnel", "s,t,p", ZERO, ZERO);
8fc2e39e 5006 break;
252b5132
RH
5007 }
5008 if (imm_expr.X_op != O_constant)
5009 as_bad (_("Unsupported large constant"));
f9419b05 5010 ++imm_expr.X_add_number;
252b5132
RH
5011 /* FALLTHROUGH */
5012 case M_BGE_I:
5013 case M_BGEL_I:
5014 if (mask == M_BGEL_I)
5015 likely = 1;
5016 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5017 {
67c0d1eb 5018 macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
8fc2e39e 5019 break;
252b5132
RH
5020 }
5021 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5022 {
67c0d1eb 5023 macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
8fc2e39e 5024 break;
252b5132
RH
5025 }
5026 maxnum = 0x7fffffff;
ca4e0257 5027 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
252b5132
RH
5028 {
5029 maxnum <<= 16;
5030 maxnum |= 0xffff;
5031 maxnum <<= 16;
5032 maxnum |= 0xffff;
5033 }
5034 maxnum = - maxnum - 1;
5035 if (imm_expr.X_op == O_constant
5036 && imm_expr.X_add_number <= maxnum
ca4e0257 5037 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
252b5132
RH
5038 {
5039 do_true:
5040 /* result is always true */
5041 as_warn (_("Branch %s is always true"), ip->insn_mo->name);
67c0d1eb 5042 macro_build (&offset_expr, "b", "p");
8fc2e39e 5043 break;
252b5132 5044 }
8fc2e39e 5045 used_at = 1;
67c0d1eb 5046 set_at (sreg, 0);
c80c840e 5047 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
252b5132
RH
5048 break;
5049
5050 case M_BGEUL:
5051 likely = 1;
5052 case M_BGEU:
5053 if (treg == 0)
5054 goto do_true;
5055 if (sreg == 0)
5056 {
67c0d1eb 5057 macro_build (&offset_expr, likely ? "beql" : "beq",
c80c840e 5058 "s,t,p", ZERO, treg);
8fc2e39e 5059 break;
252b5132 5060 }
8fc2e39e 5061 used_at = 1;
67c0d1eb 5062 macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
c80c840e 5063 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
252b5132
RH
5064 break;
5065
5066 case M_BGTUL_I:
5067 likely = 1;
5068 case M_BGTU_I:
5069 if (sreg == 0
ca4e0257 5070 || (HAVE_32BIT_GPRS
252b5132 5071 && imm_expr.X_op == O_constant
f01dc953 5072 && imm_expr.X_add_number == -1))
252b5132
RH
5073 goto do_false;
5074 if (imm_expr.X_op != O_constant)
5075 as_bad (_("Unsupported large constant"));
f9419b05 5076 ++imm_expr.X_add_number;
252b5132
RH
5077 /* FALLTHROUGH */
5078 case M_BGEU_I:
5079 case M_BGEUL_I:
5080 if (mask == M_BGEUL_I)
5081 likely = 1;
5082 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5083 goto do_true;
5084 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5085 {
67c0d1eb 5086 macro_build (&offset_expr, likely ? "bnel" : "bne",
c80c840e 5087 "s,t,p", sreg, ZERO);
8fc2e39e 5088 break;
252b5132 5089 }
8fc2e39e 5090 used_at = 1;
67c0d1eb 5091 set_at (sreg, 1);
c80c840e 5092 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
252b5132
RH
5093 break;
5094
5095 case M_BGTL:
5096 likely = 1;
5097 case M_BGT:
5098 if (treg == 0)
5099 {
67c0d1eb 5100 macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
8fc2e39e 5101 break;
252b5132
RH
5102 }
5103 if (sreg == 0)
5104 {
67c0d1eb 5105 macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
8fc2e39e 5106 break;
252b5132 5107 }
8fc2e39e 5108 used_at = 1;
67c0d1eb 5109 macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
c80c840e 5110 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
252b5132
RH
5111 break;
5112
5113 case M_BGTUL:
5114 likely = 1;
5115 case M_BGTU:
5116 if (treg == 0)
5117 {
67c0d1eb 5118 macro_build (&offset_expr, likely ? "bnel" : "bne",
c80c840e 5119 "s,t,p", sreg, ZERO);
8fc2e39e 5120 break;
252b5132
RH
5121 }
5122 if (sreg == 0)
5123 goto do_false;
8fc2e39e 5124 used_at = 1;
67c0d1eb 5125 macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
c80c840e 5126 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
252b5132
RH
5127 break;
5128
5129 case M_BLEL:
5130 likely = 1;
5131 case M_BLE:
5132 if (treg == 0)
5133 {
67c0d1eb 5134 macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
8fc2e39e 5135 break;
252b5132
RH
5136 }
5137 if (sreg == 0)
5138 {
67c0d1eb 5139 macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
8fc2e39e 5140 break;
252b5132 5141 }
8fc2e39e 5142 used_at = 1;
67c0d1eb 5143 macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
c80c840e 5144 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
252b5132
RH
5145 break;
5146
5147 case M_BLEL_I:
5148 likely = 1;
5149 case M_BLE_I:
5150 maxnum = 0x7fffffff;
ca4e0257 5151 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
252b5132
RH
5152 {
5153 maxnum <<= 16;
5154 maxnum |= 0xffff;
5155 maxnum <<= 16;
5156 maxnum |= 0xffff;
5157 }
5158 if (imm_expr.X_op == O_constant
5159 && imm_expr.X_add_number >= maxnum
ca4e0257 5160 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
252b5132
RH
5161 goto do_true;
5162 if (imm_expr.X_op != O_constant)
5163 as_bad (_("Unsupported large constant"));
f9419b05 5164 ++imm_expr.X_add_number;
252b5132
RH
5165 /* FALLTHROUGH */
5166 case M_BLT_I:
5167 case M_BLTL_I:
5168 if (mask == M_BLTL_I)
5169 likely = 1;
5170 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5171 {
67c0d1eb 5172 macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
8fc2e39e 5173 break;
252b5132
RH
5174 }
5175 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5176 {
67c0d1eb 5177 macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
8fc2e39e 5178 break;
252b5132 5179 }
8fc2e39e 5180 used_at = 1;
67c0d1eb 5181 set_at (sreg, 0);
c80c840e 5182 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
252b5132
RH
5183 break;
5184
5185 case M_BLEUL:
5186 likely = 1;
5187 case M_BLEU:
5188 if (treg == 0)
5189 {
67c0d1eb 5190 macro_build (&offset_expr, likely ? "beql" : "beq",
c80c840e 5191 "s,t,p", sreg, ZERO);
8fc2e39e 5192 break;
252b5132
RH
5193 }
5194 if (sreg == 0)
5195 goto do_true;
8fc2e39e 5196 used_at = 1;
67c0d1eb 5197 macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
c80c840e 5198 macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
252b5132
RH
5199 break;
5200
5201 case M_BLEUL_I:
5202 likely = 1;
5203 case M_BLEU_I:
5204 if (sreg == 0
ca4e0257 5205 || (HAVE_32BIT_GPRS
252b5132 5206 && imm_expr.X_op == O_constant
f01dc953 5207 && imm_expr.X_add_number == -1))
252b5132
RH
5208 goto do_true;
5209 if (imm_expr.X_op != O_constant)
5210 as_bad (_("Unsupported large constant"));
f9419b05 5211 ++imm_expr.X_add_number;
252b5132
RH
5212 /* FALLTHROUGH */
5213 case M_BLTU_I:
5214 case M_BLTUL_I:
5215 if (mask == M_BLTUL_I)
5216 likely = 1;
5217 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5218 goto do_false;
5219 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5220 {
67c0d1eb 5221 macro_build (&offset_expr, likely ? "beql" : "beq",
c80c840e 5222 "s,t,p", sreg, ZERO);
8fc2e39e 5223 break;
252b5132 5224 }
8fc2e39e 5225 used_at = 1;
67c0d1eb 5226 set_at (sreg, 1);
c80c840e 5227 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
252b5132
RH
5228 break;
5229
5230 case M_BLTL:
5231 likely = 1;
5232 case M_BLT:
5233 if (treg == 0)
5234 {
67c0d1eb 5235 macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
8fc2e39e 5236 break;
252b5132
RH
5237 }
5238 if (sreg == 0)
5239 {
67c0d1eb 5240 macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
8fc2e39e 5241 break;
252b5132 5242 }
8fc2e39e 5243 used_at = 1;
67c0d1eb 5244 macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
c80c840e 5245 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
252b5132
RH
5246 break;
5247
5248 case M_BLTUL:
5249 likely = 1;
5250 case M_BLTU:
5251 if (treg == 0)
5252 goto do_false;
5253 if (sreg == 0)
5254 {
67c0d1eb 5255 macro_build (&offset_expr, likely ? "bnel" : "bne",
c80c840e 5256 "s,t,p", ZERO, treg);
8fc2e39e 5257 break;
252b5132 5258 }
8fc2e39e 5259 used_at = 1;
67c0d1eb 5260 macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
c80c840e 5261 macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
252b5132
RH
5262 break;
5263
5f74bc13
CD
5264 case M_DEXT:
5265 {
d5818fca
MR
5266 /* Use unsigned arithmetic. */
5267 addressT pos;
5268 addressT size;
5f74bc13 5269
90ecf173 5270 if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5f74bc13
CD
5271 {
5272 as_bad (_("Unsupported large constant"));
5273 pos = size = 1;
5274 }
5275 else
5276 {
d5818fca
MR
5277 pos = imm_expr.X_add_number;
5278 size = imm2_expr.X_add_number;
5f74bc13
CD
5279 }
5280
5281 if (pos > 63)
5282 {
d5818fca 5283 as_bad (_("Improper position (%lu)"), (unsigned long) pos);
5f74bc13
CD
5284 pos = 1;
5285 }
90ecf173 5286 if (size == 0 || size > 64 || (pos + size - 1) > 63)
5f74bc13
CD
5287 {
5288 as_bad (_("Improper extract size (%lu, position %lu)"),
d5818fca 5289 (unsigned long) size, (unsigned long) pos);
5f74bc13
CD
5290 size = 1;
5291 }
5292
5293 if (size <= 32 && pos < 32)
5294 {
5295 s = "dext";
5296 fmt = "t,r,+A,+C";
5297 }
5298 else if (size <= 32)
5299 {
5300 s = "dextu";
5301 fmt = "t,r,+E,+H";
5302 }
5303 else
5304 {
5305 s = "dextm";
5306 fmt = "t,r,+A,+G";
5307 }
d5818fca
MR
5308 macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
5309 (int) (size - 1));
5f74bc13 5310 }
8fc2e39e 5311 break;
5f74bc13
CD
5312
5313 case M_DINS:
5314 {
d5818fca
MR
5315 /* Use unsigned arithmetic. */
5316 addressT pos;
5317 addressT size;
5f74bc13 5318
90ecf173 5319 if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5f74bc13
CD
5320 {
5321 as_bad (_("Unsupported large constant"));
5322 pos = size = 1;
5323 }
5324 else
5325 {
d5818fca
MR
5326 pos = imm_expr.X_add_number;
5327 size = imm2_expr.X_add_number;
5f74bc13
CD
5328 }
5329
5330 if (pos > 63)
5331 {
d5818fca 5332 as_bad (_("Improper position (%lu)"), (unsigned long) pos);
5f74bc13
CD
5333 pos = 1;
5334 }
90ecf173 5335 if (size == 0 || size > 64 || (pos + size - 1) > 63)
5f74bc13
CD
5336 {
5337 as_bad (_("Improper insert size (%lu, position %lu)"),
d5818fca 5338 (unsigned long) size, (unsigned long) pos);
5f74bc13
CD
5339 size = 1;
5340 }
5341
5342 if (pos < 32 && (pos + size - 1) < 32)
5343 {
5344 s = "dins";
5345 fmt = "t,r,+A,+B";
5346 }
5347 else if (pos >= 32)
5348 {
5349 s = "dinsu";
5350 fmt = "t,r,+E,+F";
5351 }
5352 else
5353 {
5354 s = "dinsm";
5355 fmt = "t,r,+A,+F";
5356 }
750bdd57
AS
5357 macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
5358 (int) (pos + size - 1));
5f74bc13 5359 }
8fc2e39e 5360 break;
5f74bc13 5361
252b5132
RH
5362 case M_DDIV_3:
5363 dbl = 1;
5364 case M_DIV_3:
5365 s = "mflo";
5366 goto do_div3;
5367 case M_DREM_3:
5368 dbl = 1;
5369 case M_REM_3:
5370 s = "mfhi";
5371 do_div3:
5372 if (treg == 0)
5373 {
5374 as_warn (_("Divide by zero."));
5375 if (mips_trap)
c80c840e 5376 macro_build (NULL, "teq", "s,t,q", ZERO, ZERO, 7);
252b5132 5377 else
67c0d1eb 5378 macro_build (NULL, "break", "c", 7);
8fc2e39e 5379 break;
252b5132
RH
5380 }
5381
7d10b47d 5382 start_noreorder ();
252b5132
RH
5383 if (mips_trap)
5384 {
c80c840e 5385 macro_build (NULL, "teq", "s,t,q", treg, ZERO, 7);
67c0d1eb 5386 macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
252b5132
RH
5387 }
5388 else
5389 {
5390 expr1.X_add_number = 8;
c80c840e 5391 macro_build (&expr1, "bne", "s,t,p", treg, ZERO);
67c0d1eb
RS
5392 macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5393 macro_build (NULL, "break", "c", 7);
252b5132
RH
5394 }
5395 expr1.X_add_number = -1;
8fc2e39e 5396 used_at = 1;
f6a22291 5397 load_register (AT, &expr1, dbl);
252b5132 5398 expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
67c0d1eb 5399 macro_build (&expr1, "bne", "s,t,p", treg, AT);
252b5132
RH
5400 if (dbl)
5401 {
5402 expr1.X_add_number = 1;
f6a22291 5403 load_register (AT, &expr1, dbl);
67c0d1eb 5404 macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
252b5132
RH
5405 }
5406 else
5407 {
5408 expr1.X_add_number = 0x80000000;
67c0d1eb 5409 macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
252b5132
RH
5410 }
5411 if (mips_trap)
5412 {
67c0d1eb 5413 macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
252b5132
RH
5414 /* We want to close the noreorder block as soon as possible, so
5415 that later insns are available for delay slot filling. */
7d10b47d 5416 end_noreorder ();
252b5132
RH
5417 }
5418 else
5419 {
5420 expr1.X_add_number = 8;
67c0d1eb 5421 macro_build (&expr1, "bne", "s,t,p", sreg, AT);
a605d2b3 5422 macro_build (NULL, "nop", "");
252b5132
RH
5423
5424 /* We want to close the noreorder block as soon as possible, so
5425 that later insns are available for delay slot filling. */
7d10b47d 5426 end_noreorder ();
252b5132 5427
67c0d1eb 5428 macro_build (NULL, "break", "c", 6);
252b5132 5429 }
67c0d1eb 5430 macro_build (NULL, s, "d", dreg);
252b5132
RH
5431 break;
5432
5433 case M_DIV_3I:
5434 s = "div";
5435 s2 = "mflo";
5436 goto do_divi;
5437 case M_DIVU_3I:
5438 s = "divu";
5439 s2 = "mflo";
5440 goto do_divi;
5441 case M_REM_3I:
5442 s = "div";
5443 s2 = "mfhi";
5444 goto do_divi;
5445 case M_REMU_3I:
5446 s = "divu";
5447 s2 = "mfhi";
5448 goto do_divi;
5449 case M_DDIV_3I:
5450 dbl = 1;
5451 s = "ddiv";
5452 s2 = "mflo";
5453 goto do_divi;
5454 case M_DDIVU_3I:
5455 dbl = 1;
5456 s = "ddivu";
5457 s2 = "mflo";
5458 goto do_divi;
5459 case M_DREM_3I:
5460 dbl = 1;
5461 s = "ddiv";
5462 s2 = "mfhi";
5463 goto do_divi;
5464 case M_DREMU_3I:
5465 dbl = 1;
5466 s = "ddivu";
5467 s2 = "mfhi";
5468 do_divi:
5469 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5470 {
5471 as_warn (_("Divide by zero."));
5472 if (mips_trap)
c80c840e 5473 macro_build (NULL, "teq", "s,t,q", ZERO, ZERO, 7);
252b5132 5474 else
67c0d1eb 5475 macro_build (NULL, "break", "c", 7);
8fc2e39e 5476 break;
252b5132
RH
5477 }
5478 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5479 {
5480 if (strcmp (s2, "mflo") == 0)
67c0d1eb 5481 move_register (dreg, sreg);
252b5132 5482 else
c80c840e 5483 move_register (dreg, ZERO);
8fc2e39e 5484 break;
252b5132
RH
5485 }
5486 if (imm_expr.X_op == O_constant
5487 && imm_expr.X_add_number == -1
5488 && s[strlen (s) - 1] != 'u')
5489 {
5490 if (strcmp (s2, "mflo") == 0)
5491 {
67c0d1eb 5492 macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
252b5132
RH
5493 }
5494 else
c80c840e 5495 move_register (dreg, ZERO);
8fc2e39e 5496 break;
252b5132
RH
5497 }
5498
8fc2e39e 5499 used_at = 1;
67c0d1eb
RS
5500 load_register (AT, &imm_expr, dbl);
5501 macro_build (NULL, s, "z,s,t", sreg, AT);
5502 macro_build (NULL, s2, "d", dreg);
252b5132
RH
5503 break;
5504
5505 case M_DIVU_3:
5506 s = "divu";
5507 s2 = "mflo";
5508 goto do_divu3;
5509 case M_REMU_3:
5510 s = "divu";
5511 s2 = "mfhi";
5512 goto do_divu3;
5513 case M_DDIVU_3:
5514 s = "ddivu";
5515 s2 = "mflo";
5516 goto do_divu3;
5517 case M_DREMU_3:
5518 s = "ddivu";
5519 s2 = "mfhi";
5520 do_divu3:
7d10b47d 5521 start_noreorder ();
252b5132
RH
5522 if (mips_trap)
5523 {
c80c840e 5524 macro_build (NULL, "teq", "s,t,q", treg, ZERO, 7);
67c0d1eb 5525 macro_build (NULL, s, "z,s,t", sreg, treg);
252b5132
RH
5526 /* We want to close the noreorder block as soon as possible, so
5527 that later insns are available for delay slot filling. */
7d10b47d 5528 end_noreorder ();
252b5132
RH
5529 }
5530 else
5531 {
5532 expr1.X_add_number = 8;
c80c840e 5533 macro_build (&expr1, "bne", "s,t,p", treg, ZERO);
67c0d1eb 5534 macro_build (NULL, s, "z,s,t", sreg, treg);
252b5132
RH
5535
5536 /* We want to close the noreorder block as soon as possible, so
5537 that later insns are available for delay slot filling. */
7d10b47d 5538 end_noreorder ();
67c0d1eb 5539 macro_build (NULL, "break", "c", 7);
252b5132 5540 }
67c0d1eb 5541 macro_build (NULL, s2, "d", dreg);
8fc2e39e 5542 break;
252b5132 5543
1abe91b1
MR
5544 case M_DLCA_AB:
5545 dbl = 1;
5546 case M_LCA_AB:
5547 call = 1;
5548 goto do_la;
252b5132
RH
5549 case M_DLA_AB:
5550 dbl = 1;
5551 case M_LA_AB:
1abe91b1 5552 do_la:
252b5132
RH
5553 /* Load the address of a symbol into a register. If breg is not
5554 zero, we then add a base register to it. */
5555
3bec30a8
TS
5556 if (dbl && HAVE_32BIT_GPRS)
5557 as_warn (_("dla used to load 32-bit register"));
5558
90ecf173 5559 if (!dbl && HAVE_64BIT_OBJECTS)
3bec30a8
TS
5560 as_warn (_("la used to load 64-bit address"));
5561
0c11417f
MR
5562 if (offset_expr.X_op == O_constant
5563 && offset_expr.X_add_number >= -0x8000
5564 && offset_expr.X_add_number < 0x8000)
5565 {
aed1a261 5566 macro_build (&offset_expr, ADDRESS_ADDI_INSN,
17a2f251 5567 "t,r,j", treg, sreg, BFD_RELOC_LO16);
8fc2e39e 5568 break;
0c11417f
MR
5569 }
5570
741fe287 5571 if (mips_opts.at && (treg == breg))
afdbd6d0
CD
5572 {
5573 tempreg = AT;
5574 used_at = 1;
5575 }
5576 else
5577 {
5578 tempreg = treg;
afdbd6d0
CD
5579 }
5580
252b5132
RH
5581 if (offset_expr.X_op != O_symbol
5582 && offset_expr.X_op != O_constant)
5583 {
f71d0d44 5584 as_bad (_("Expression too complex"));
252b5132
RH
5585 offset_expr.X_op = O_constant;
5586 }
5587
252b5132 5588 if (offset_expr.X_op == O_constant)
aed1a261 5589 load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
252b5132
RH
5590 else if (mips_pic == NO_PIC)
5591 {
d6bc6245 5592 /* If this is a reference to a GP relative symbol, we want
cdf6fd85 5593 addiu $tempreg,$gp,<sym> (BFD_RELOC_GPREL16)
252b5132
RH
5594 Otherwise we want
5595 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
5596 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5597 If we have a constant, we need two instructions anyhow,
d6bc6245 5598 so we may as well always use the latter form.
76b3015f 5599
6caf9ef4
TS
5600 With 64bit address space and a usable $at we want
5601 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
5602 lui $at,<sym> (BFD_RELOC_HI16_S)
5603 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
5604 daddiu $at,<sym> (BFD_RELOC_LO16)
5605 dsll32 $tempreg,0
5606 daddu $tempreg,$tempreg,$at
5607
5608 If $at is already in use, we use a path which is suboptimal
5609 on superscalar processors.
5610 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
5611 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
5612 dsll $tempreg,16
5613 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
5614 dsll $tempreg,16
5615 daddiu $tempreg,<sym> (BFD_RELOC_LO16)
5616
5617 For GP relative symbols in 64bit address space we can use
5618 the same sequence as in 32bit address space. */
aed1a261 5619 if (HAVE_64BIT_SYMBOLS)
252b5132 5620 {
6caf9ef4
TS
5621 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5622 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5623 {
5624 relax_start (offset_expr.X_add_symbol);
5625 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5626 tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5627 relax_switch ();
5628 }
d6bc6245 5629
741fe287 5630 if (used_at == 0 && mips_opts.at)
98d3f06f 5631 {
67c0d1eb 5632 macro_build (&offset_expr, "lui", "t,u",
17a2f251 5633 tempreg, BFD_RELOC_MIPS_HIGHEST);
67c0d1eb 5634 macro_build (&offset_expr, "lui", "t,u",
17a2f251 5635 AT, BFD_RELOC_HI16_S);
67c0d1eb 5636 macro_build (&offset_expr, "daddiu", "t,r,j",
17a2f251 5637 tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
67c0d1eb 5638 macro_build (&offset_expr, "daddiu", "t,r,j",
17a2f251 5639 AT, AT, BFD_RELOC_LO16);
67c0d1eb
RS
5640 macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
5641 macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
98d3f06f
KH
5642 used_at = 1;
5643 }
5644 else
5645 {
67c0d1eb 5646 macro_build (&offset_expr, "lui", "t,u",
17a2f251 5647 tempreg, BFD_RELOC_MIPS_HIGHEST);
67c0d1eb 5648 macro_build (&offset_expr, "daddiu", "t,r,j",
17a2f251 5649 tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
67c0d1eb
RS
5650 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5651 macro_build (&offset_expr, "daddiu", "t,r,j",
17a2f251 5652 tempreg, tempreg, BFD_RELOC_HI16_S);
67c0d1eb
RS
5653 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5654 macro_build (&offset_expr, "daddiu", "t,r,j",
17a2f251 5655 tempreg, tempreg, BFD_RELOC_LO16);
98d3f06f 5656 }
6caf9ef4
TS
5657
5658 if (mips_relax.sequence)
5659 relax_end ();
98d3f06f
KH
5660 }
5661 else
5662 {
5663 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6caf9ef4 5664 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
98d3f06f 5665 {
4d7206a2 5666 relax_start (offset_expr.X_add_symbol);
67c0d1eb
RS
5667 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5668 tempreg, mips_gp_register, BFD_RELOC_GPREL16);
4d7206a2 5669 relax_switch ();
98d3f06f 5670 }
6943caf0 5671 if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
f71d0d44 5672 as_bad (_("Offset too large"));
67c0d1eb
RS
5673 macro_build_lui (&offset_expr, tempreg);
5674 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5675 tempreg, tempreg, BFD_RELOC_LO16);
4d7206a2
RS
5676 if (mips_relax.sequence)
5677 relax_end ();
98d3f06f 5678 }
252b5132 5679 }
0a44bf69 5680 else if (!mips_big_got && !HAVE_NEWABI)
252b5132 5681 {
9117d219
NC
5682 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5683
252b5132
RH
5684 /* If this is a reference to an external symbol, and there
5685 is no constant, we want
5686 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
1abe91b1 5687 or for lca or if tempreg is PIC_CALL_REG
9117d219 5688 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
252b5132
RH
5689 For a local symbol, we want
5690 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5691 nop
5692 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5693
5694 If we have a small constant, and this is a reference to
5695 an external symbol, we want
5696 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5697 nop
5698 addiu $tempreg,$tempreg,<constant>
5699 For a local symbol, we want the same instruction
5700 sequence, but we output a BFD_RELOC_LO16 reloc on the
5701 addiu instruction.
5702
5703 If we have a large constant, and this is a reference to
5704 an external symbol, we want
5705 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5706 lui $at,<hiconstant>
5707 addiu $at,$at,<loconstant>
5708 addu $tempreg,$tempreg,$at
5709 For a local symbol, we want the same instruction
5710 sequence, but we output a BFD_RELOC_LO16 reloc on the
ed6fb7bd 5711 addiu instruction.
ed6fb7bd
SC
5712 */
5713
4d7206a2 5714 if (offset_expr.X_add_number == 0)
252b5132 5715 {
0a44bf69
RS
5716 if (mips_pic == SVR4_PIC
5717 && breg == 0
5718 && (call || tempreg == PIC_CALL_REG))
4d7206a2
RS
5719 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5720
5721 relax_start (offset_expr.X_add_symbol);
67c0d1eb
RS
5722 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5723 lw_reloc_type, mips_gp_register);
4d7206a2 5724 if (breg != 0)
252b5132
RH
5725 {
5726 /* We're going to put in an addu instruction using
5727 tempreg, so we may as well insert the nop right
5728 now. */
269137b2 5729 load_delay_nop ();
252b5132 5730 }
4d7206a2 5731 relax_switch ();
67c0d1eb
RS
5732 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5733 tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
269137b2 5734 load_delay_nop ();
67c0d1eb
RS
5735 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5736 tempreg, tempreg, BFD_RELOC_LO16);
4d7206a2 5737 relax_end ();
252b5132
RH
5738 /* FIXME: If breg == 0, and the next instruction uses
5739 $tempreg, then if this variant case is used an extra
5740 nop will be generated. */
5741 }
4d7206a2
RS
5742 else if (offset_expr.X_add_number >= -0x8000
5743 && offset_expr.X_add_number < 0x8000)
252b5132 5744 {
67c0d1eb 5745 load_got_offset (tempreg, &offset_expr);
269137b2 5746 load_delay_nop ();
67c0d1eb 5747 add_got_offset (tempreg, &offset_expr);
252b5132
RH
5748 }
5749 else
5750 {
4d7206a2
RS
5751 expr1.X_add_number = offset_expr.X_add_number;
5752 offset_expr.X_add_number =
5753 ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
67c0d1eb 5754 load_got_offset (tempreg, &offset_expr);
f6a22291 5755 offset_expr.X_add_number = expr1.X_add_number;
252b5132
RH
5756 /* If we are going to add in a base register, and the
5757 target register and the base register are the same,
5758 then we are using AT as a temporary register. Since
5759 we want to load the constant into AT, we add our
5760 current AT (from the global offset table) and the
5761 register into the register now, and pretend we were
5762 not using a base register. */
67c0d1eb 5763 if (breg == treg)
252b5132 5764 {
269137b2 5765 load_delay_nop ();
67c0d1eb 5766 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 5767 treg, AT, breg);
252b5132
RH
5768 breg = 0;
5769 tempreg = treg;
252b5132 5770 }
f6a22291 5771 add_got_offset_hilo (tempreg, &offset_expr, AT);
252b5132
RH
5772 used_at = 1;
5773 }
5774 }
0a44bf69 5775 else if (!mips_big_got && HAVE_NEWABI)
f5040a92 5776 {
67c0d1eb 5777 int add_breg_early = 0;
f5040a92
AO
5778
5779 /* If this is a reference to an external, and there is no
5780 constant, or local symbol (*), with or without a
5781 constant, we want
5782 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
1abe91b1 5783 or for lca or if tempreg is PIC_CALL_REG
f5040a92
AO
5784 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
5785
5786 If we have a small constant, and this is a reference to
5787 an external symbol, we want
5788 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
5789 addiu $tempreg,$tempreg,<constant>
5790
5791 If we have a large constant, and this is a reference to
5792 an external symbol, we want
5793 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
5794 lui $at,<hiconstant>
5795 addiu $at,$at,<loconstant>
5796 addu $tempreg,$tempreg,$at
5797
5798 (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
5799 local symbols, even though it introduces an additional
5800 instruction. */
5801
f5040a92
AO
5802 if (offset_expr.X_add_number)
5803 {
4d7206a2 5804 expr1.X_add_number = offset_expr.X_add_number;
f5040a92
AO
5805 offset_expr.X_add_number = 0;
5806
4d7206a2 5807 relax_start (offset_expr.X_add_symbol);
67c0d1eb
RS
5808 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5809 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
f5040a92
AO
5810
5811 if (expr1.X_add_number >= -0x8000
5812 && expr1.X_add_number < 0x8000)
5813 {
67c0d1eb
RS
5814 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5815 tempreg, tempreg, BFD_RELOC_LO16);
f5040a92 5816 }
ecd13cd3 5817 else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
f5040a92 5818 {
f5040a92
AO
5819 /* If we are going to add in a base register, and the
5820 target register and the base register are the same,
5821 then we are using AT as a temporary register. Since
5822 we want to load the constant into AT, we add our
5823 current AT (from the global offset table) and the
5824 register into the register now, and pretend we were
5825 not using a base register. */
5826 if (breg != treg)
5827 dreg = tempreg;
5828 else
5829 {
9c2799c2 5830 gas_assert (tempreg == AT);
67c0d1eb
RS
5831 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5832 treg, AT, breg);
f5040a92 5833 dreg = treg;
67c0d1eb 5834 add_breg_early = 1;
f5040a92
AO
5835 }
5836
f6a22291 5837 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
67c0d1eb 5838 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 5839 dreg, dreg, AT);
f5040a92 5840
f5040a92
AO
5841 used_at = 1;
5842 }
5843 else
5844 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5845
4d7206a2 5846 relax_switch ();
f5040a92
AO
5847 offset_expr.X_add_number = expr1.X_add_number;
5848
67c0d1eb
RS
5849 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5850 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5851 if (add_breg_early)
f5040a92 5852 {
67c0d1eb 5853 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
f899b4b8 5854 treg, tempreg, breg);
f5040a92
AO
5855 breg = 0;
5856 tempreg = treg;
5857 }
4d7206a2 5858 relax_end ();
f5040a92 5859 }
4d7206a2 5860 else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
f5040a92 5861 {
4d7206a2 5862 relax_start (offset_expr.X_add_symbol);
67c0d1eb
RS
5863 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5864 BFD_RELOC_MIPS_CALL16, mips_gp_register);
4d7206a2 5865 relax_switch ();
67c0d1eb
RS
5866 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5867 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4d7206a2 5868 relax_end ();
f5040a92 5869 }
4d7206a2 5870 else
f5040a92 5871 {
67c0d1eb
RS
5872 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5873 BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
f5040a92
AO
5874 }
5875 }
0a44bf69 5876 else if (mips_big_got && !HAVE_NEWABI)
252b5132 5877 {
67c0d1eb 5878 int gpdelay;
9117d219
NC
5879 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5880 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
ed6fb7bd 5881 int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
252b5132
RH
5882
5883 /* This is the large GOT case. If this is a reference to an
5884 external symbol, and there is no constant, we want
5885 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5886 addu $tempreg,$tempreg,$gp
5887 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
1abe91b1 5888 or for lca or if tempreg is PIC_CALL_REG
9117d219
NC
5889 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
5890 addu $tempreg,$tempreg,$gp
5891 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
252b5132
RH
5892 For a local symbol, we want
5893 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5894 nop
5895 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5896
5897 If we have a small constant, and this is a reference to
5898 an external symbol, we want
5899 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5900 addu $tempreg,$tempreg,$gp
5901 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5902 nop
5903 addiu $tempreg,$tempreg,<constant>
5904 For a local symbol, we want
5905 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5906 nop
5907 addiu $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5908
5909 If we have a large constant, and this is a reference to
5910 an external symbol, we want
5911 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5912 addu $tempreg,$tempreg,$gp
5913 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5914 lui $at,<hiconstant>
5915 addiu $at,$at,<loconstant>
5916 addu $tempreg,$tempreg,$at
5917 For a local symbol, we want
5918 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5919 lui $at,<hiconstant>
5920 addiu $at,$at,<loconstant> (BFD_RELOC_LO16)
5921 addu $tempreg,$tempreg,$at
f5040a92 5922 */
438c16b8 5923
252b5132
RH
5924 expr1.X_add_number = offset_expr.X_add_number;
5925 offset_expr.X_add_number = 0;
4d7206a2 5926 relax_start (offset_expr.X_add_symbol);
67c0d1eb 5927 gpdelay = reg_needs_delay (mips_gp_register);
1abe91b1
MR
5928 if (expr1.X_add_number == 0 && breg == 0
5929 && (call || tempreg == PIC_CALL_REG))
9117d219
NC
5930 {
5931 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5932 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5933 }
67c0d1eb
RS
5934 macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5935 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 5936 tempreg, tempreg, mips_gp_register);
67c0d1eb 5937 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
17a2f251 5938 tempreg, lw_reloc_type, tempreg);
252b5132
RH
5939 if (expr1.X_add_number == 0)
5940 {
67c0d1eb 5941 if (breg != 0)
252b5132
RH
5942 {
5943 /* We're going to put in an addu instruction using
5944 tempreg, so we may as well insert the nop right
5945 now. */
269137b2 5946 load_delay_nop ();
252b5132 5947 }
252b5132
RH
5948 }
5949 else if (expr1.X_add_number >= -0x8000
5950 && expr1.X_add_number < 0x8000)
5951 {
269137b2 5952 load_delay_nop ();
67c0d1eb 5953 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
17a2f251 5954 tempreg, tempreg, BFD_RELOC_LO16);
252b5132
RH
5955 }
5956 else
5957 {
252b5132
RH
5958 /* If we are going to add in a base register, and the
5959 target register and the base register are the same,
5960 then we are using AT as a temporary register. Since
5961 we want to load the constant into AT, we add our
5962 current AT (from the global offset table) and the
5963 register into the register now, and pretend we were
5964 not using a base register. */
5965 if (breg != treg)
67c0d1eb 5966 dreg = tempreg;
252b5132
RH
5967 else
5968 {
9c2799c2 5969 gas_assert (tempreg == AT);
269137b2 5970 load_delay_nop ();
67c0d1eb 5971 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 5972 treg, AT, breg);
252b5132 5973 dreg = treg;
252b5132
RH
5974 }
5975
f6a22291 5976 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
67c0d1eb 5977 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
252b5132 5978
252b5132
RH
5979 used_at = 1;
5980 }
4d7206a2
RS
5981 offset_expr.X_add_number =
5982 ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
5983 relax_switch ();
252b5132 5984
67c0d1eb 5985 if (gpdelay)
252b5132
RH
5986 {
5987 /* This is needed because this instruction uses $gp, but
f5040a92 5988 the first instruction on the main stream does not. */
67c0d1eb 5989 macro_build (NULL, "nop", "");
252b5132 5990 }
ed6fb7bd 5991
67c0d1eb
RS
5992 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5993 local_reloc_type, mips_gp_register);
f5040a92 5994 if (expr1.X_add_number >= -0x8000
252b5132
RH
5995 && expr1.X_add_number < 0x8000)
5996 {
269137b2 5997 load_delay_nop ();
67c0d1eb
RS
5998 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5999 tempreg, tempreg, BFD_RELOC_LO16);
252b5132 6000 /* FIXME: If add_number is 0, and there was no base
f5040a92
AO
6001 register, the external symbol case ended with a load,
6002 so if the symbol turns out to not be external, and
6003 the next instruction uses tempreg, an unnecessary nop
6004 will be inserted. */
252b5132
RH
6005 }
6006 else
6007 {
6008 if (breg == treg)
6009 {
6010 /* We must add in the base register now, as in the
f5040a92 6011 external symbol case. */
9c2799c2 6012 gas_assert (tempreg == AT);
269137b2 6013 load_delay_nop ();
67c0d1eb 6014 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6015 treg, AT, breg);
252b5132
RH
6016 tempreg = treg;
6017 /* We set breg to 0 because we have arranged to add
f5040a92 6018 it in in both cases. */
252b5132
RH
6019 breg = 0;
6020 }
6021
67c0d1eb
RS
6022 macro_build_lui (&expr1, AT);
6023 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
17a2f251 6024 AT, AT, BFD_RELOC_LO16);
67c0d1eb 6025 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6026 tempreg, tempreg, AT);
8fc2e39e 6027 used_at = 1;
252b5132 6028 }
4d7206a2 6029 relax_end ();
252b5132 6030 }
0a44bf69 6031 else if (mips_big_got && HAVE_NEWABI)
f5040a92 6032 {
f5040a92
AO
6033 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
6034 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
67c0d1eb 6035 int add_breg_early = 0;
f5040a92
AO
6036
6037 /* This is the large GOT case. If this is a reference to an
6038 external symbol, and there is no constant, we want
6039 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6040 add $tempreg,$tempreg,$gp
6041 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
1abe91b1 6042 or for lca or if tempreg is PIC_CALL_REG
f5040a92
AO
6043 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
6044 add $tempreg,$tempreg,$gp
6045 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
6046
6047 If we have a small constant, and this is a reference to
6048 an external symbol, we want
6049 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6050 add $tempreg,$tempreg,$gp
6051 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6052 addi $tempreg,$tempreg,<constant>
6053
6054 If we have a large constant, and this is a reference to
6055 an external symbol, we want
6056 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6057 addu $tempreg,$tempreg,$gp
6058 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6059 lui $at,<hiconstant>
6060 addi $at,$at,<loconstant>
6061 add $tempreg,$tempreg,$at
6062
6063 If we have NewABI, and we know it's a local symbol, we want
6064 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
6065 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
6066 otherwise we have to resort to GOT_HI16/GOT_LO16. */
6067
4d7206a2 6068 relax_start (offset_expr.X_add_symbol);
f5040a92 6069
4d7206a2 6070 expr1.X_add_number = offset_expr.X_add_number;
f5040a92
AO
6071 offset_expr.X_add_number = 0;
6072
1abe91b1
MR
6073 if (expr1.X_add_number == 0 && breg == 0
6074 && (call || tempreg == PIC_CALL_REG))
f5040a92
AO
6075 {
6076 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
6077 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
6078 }
67c0d1eb
RS
6079 macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
6080 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6081 tempreg, tempreg, mips_gp_register);
67c0d1eb
RS
6082 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6083 tempreg, lw_reloc_type, tempreg);
f5040a92
AO
6084
6085 if (expr1.X_add_number == 0)
4d7206a2 6086 ;
f5040a92
AO
6087 else if (expr1.X_add_number >= -0x8000
6088 && expr1.X_add_number < 0x8000)
6089 {
67c0d1eb 6090 macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
17a2f251 6091 tempreg, tempreg, BFD_RELOC_LO16);
f5040a92 6092 }
ecd13cd3 6093 else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
f5040a92 6094 {
f5040a92
AO
6095 /* If we are going to add in a base register, and the
6096 target register and the base register are the same,
6097 then we are using AT as a temporary register. Since
6098 we want to load the constant into AT, we add our
6099 current AT (from the global offset table) and the
6100 register into the register now, and pretend we were
6101 not using a base register. */
6102 if (breg != treg)
6103 dreg = tempreg;
6104 else
6105 {
9c2799c2 6106 gas_assert (tempreg == AT);
67c0d1eb 6107 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6108 treg, AT, breg);
f5040a92 6109 dreg = treg;
67c0d1eb 6110 add_breg_early = 1;
f5040a92
AO
6111 }
6112
f6a22291 6113 load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
67c0d1eb 6114 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
f5040a92 6115
f5040a92
AO
6116 used_at = 1;
6117 }
6118 else
6119 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
6120
4d7206a2 6121 relax_switch ();
f5040a92 6122 offset_expr.X_add_number = expr1.X_add_number;
67c0d1eb
RS
6123 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6124 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6125 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6126 tempreg, BFD_RELOC_MIPS_GOT_OFST);
6127 if (add_breg_early)
f5040a92 6128 {
67c0d1eb 6129 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6130 treg, tempreg, breg);
f5040a92
AO
6131 breg = 0;
6132 tempreg = treg;
6133 }
4d7206a2 6134 relax_end ();
f5040a92 6135 }
252b5132
RH
6136 else
6137 abort ();
6138
6139 if (breg != 0)
aed1a261 6140 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
252b5132
RH
6141 break;
6142
52b6b6b9
JM
6143 case M_MSGSND:
6144 {
6145 unsigned long temp = (treg << 16) | (0x01);
6146 macro_build (NULL, "c2", "C", temp);
6147 }
c7af4273 6148 break;
52b6b6b9
JM
6149
6150 case M_MSGLD:
6151 {
6152 unsigned long temp = (0x02);
6153 macro_build (NULL, "c2", "C", temp);
6154 }
c7af4273 6155 break;
52b6b6b9
JM
6156
6157 case M_MSGLD_T:
6158 {
6159 unsigned long temp = (treg << 16) | (0x02);
6160 macro_build (NULL, "c2", "C", temp);
6161 }
c7af4273 6162 break;
52b6b6b9
JM
6163
6164 case M_MSGWAIT:
6165 macro_build (NULL, "c2", "C", 3);
c7af4273 6166 break;
52b6b6b9
JM
6167
6168 case M_MSGWAIT_T:
6169 {
6170 unsigned long temp = (treg << 16) | 0x03;
6171 macro_build (NULL, "c2", "C", temp);
6172 }
c7af4273 6173 break;
52b6b6b9 6174
252b5132
RH
6175 case M_J_A:
6176 /* The j instruction may not be used in PIC code, since it
6177 requires an absolute address. We convert it to a b
6178 instruction. */
6179 if (mips_pic == NO_PIC)
67c0d1eb 6180 macro_build (&offset_expr, "j", "a");
252b5132 6181 else
67c0d1eb 6182 macro_build (&offset_expr, "b", "p");
8fc2e39e 6183 break;
252b5132
RH
6184
6185 /* The jal instructions must be handled as macros because when
6186 generating PIC code they expand to multi-instruction
6187 sequences. Normally they are simple instructions. */
6188 case M_JAL_1:
6189 dreg = RA;
6190 /* Fall through. */
6191 case M_JAL_2:
3e722fb5 6192 if (mips_pic == NO_PIC)
67c0d1eb 6193 macro_build (NULL, "jalr", "d,s", dreg, sreg);
0a44bf69 6194 else
252b5132
RH
6195 {
6196 if (sreg != PIC_CALL_REG)
6197 as_warn (_("MIPS PIC call to register other than $25"));
bdaaa2e1 6198
67c0d1eb 6199 macro_build (NULL, "jalr", "d,s", dreg, sreg);
0a44bf69 6200 if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
252b5132 6201 {
6478892d
TS
6202 if (mips_cprestore_offset < 0)
6203 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6204 else
6205 {
90ecf173 6206 if (!mips_frame_reg_valid)
7a621144
DJ
6207 {
6208 as_warn (_("No .frame pseudo-op used in PIC code"));
6209 /* Quiet this warning. */
6210 mips_frame_reg_valid = 1;
6211 }
90ecf173 6212 if (!mips_cprestore_valid)
7a621144
DJ
6213 {
6214 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6215 /* Quiet this warning. */
6216 mips_cprestore_valid = 1;
6217 }
d3fca0b5
MR
6218 if (mips_opts.noreorder)
6219 macro_build (NULL, "nop", "");
6478892d 6220 expr1.X_add_number = mips_cprestore_offset;
67c0d1eb 6221 macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
f899b4b8 6222 mips_gp_register,
256ab948
TS
6223 mips_frame_reg,
6224 HAVE_64BIT_ADDRESSES);
6478892d 6225 }
252b5132
RH
6226 }
6227 }
252b5132 6228
8fc2e39e 6229 break;
252b5132
RH
6230
6231 case M_JAL_A:
6232 if (mips_pic == NO_PIC)
67c0d1eb 6233 macro_build (&offset_expr, "jal", "a");
252b5132
RH
6234 else if (mips_pic == SVR4_PIC)
6235 {
6236 /* If this is a reference to an external symbol, and we are
6237 using a small GOT, we want
6238 lw $25,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
6239 nop
f9419b05 6240 jalr $ra,$25
252b5132
RH
6241 nop
6242 lw $gp,cprestore($sp)
6243 The cprestore value is set using the .cprestore
6244 pseudo-op. If we are using a big GOT, we want
6245 lui $25,<sym> (BFD_RELOC_MIPS_CALL_HI16)
6246 addu $25,$25,$gp
6247 lw $25,<sym>($25) (BFD_RELOC_MIPS_CALL_LO16)
6248 nop
f9419b05 6249 jalr $ra,$25
252b5132
RH
6250 nop
6251 lw $gp,cprestore($sp)
6252 If the symbol is not external, we want
6253 lw $25,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6254 nop
6255 addiu $25,$25,<sym> (BFD_RELOC_LO16)
f9419b05 6256 jalr $ra,$25
252b5132 6257 nop
438c16b8 6258 lw $gp,cprestore($sp)
f5040a92
AO
6259
6260 For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
6261 sequences above, minus nops, unless the symbol is local,
6262 which enables us to use GOT_PAGE/GOT_OFST (big got) or
6263 GOT_DISP. */
438c16b8 6264 if (HAVE_NEWABI)
252b5132 6265 {
90ecf173 6266 if (!mips_big_got)
f5040a92 6267 {
4d7206a2 6268 relax_start (offset_expr.X_add_symbol);
67c0d1eb
RS
6269 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6270 PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
f5040a92 6271 mips_gp_register);
4d7206a2 6272 relax_switch ();
67c0d1eb
RS
6273 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6274 PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
4d7206a2
RS
6275 mips_gp_register);
6276 relax_end ();
f5040a92
AO
6277 }
6278 else
6279 {
4d7206a2 6280 relax_start (offset_expr.X_add_symbol);
67c0d1eb
RS
6281 macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6282 BFD_RELOC_MIPS_CALL_HI16);
6283 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6284 PIC_CALL_REG, mips_gp_register);
6285 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6286 PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6287 PIC_CALL_REG);
4d7206a2 6288 relax_switch ();
67c0d1eb
RS
6289 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6290 PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
6291 mips_gp_register);
6292 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6293 PIC_CALL_REG, PIC_CALL_REG,
17a2f251 6294 BFD_RELOC_MIPS_GOT_OFST);
4d7206a2 6295 relax_end ();
f5040a92 6296 }
684022ea 6297
67c0d1eb 6298 macro_build_jalr (&offset_expr);
252b5132
RH
6299 }
6300 else
6301 {
4d7206a2 6302 relax_start (offset_expr.X_add_symbol);
90ecf173 6303 if (!mips_big_got)
438c16b8 6304 {
67c0d1eb
RS
6305 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6306 PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
17a2f251 6307 mips_gp_register);
269137b2 6308 load_delay_nop ();
4d7206a2 6309 relax_switch ();
438c16b8 6310 }
252b5132 6311 else
252b5132 6312 {
67c0d1eb
RS
6313 int gpdelay;
6314
6315 gpdelay = reg_needs_delay (mips_gp_register);
6316 macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6317 BFD_RELOC_MIPS_CALL_HI16);
6318 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6319 PIC_CALL_REG, mips_gp_register);
6320 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6321 PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6322 PIC_CALL_REG);
269137b2 6323 load_delay_nop ();
4d7206a2 6324 relax_switch ();
67c0d1eb
RS
6325 if (gpdelay)
6326 macro_build (NULL, "nop", "");
252b5132 6327 }
67c0d1eb
RS
6328 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6329 PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
4d7206a2 6330 mips_gp_register);
269137b2 6331 load_delay_nop ();
67c0d1eb
RS
6332 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6333 PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
4d7206a2 6334 relax_end ();
67c0d1eb 6335 macro_build_jalr (&offset_expr);
438c16b8 6336
6478892d
TS
6337 if (mips_cprestore_offset < 0)
6338 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6339 else
6340 {
90ecf173 6341 if (!mips_frame_reg_valid)
7a621144
DJ
6342 {
6343 as_warn (_("No .frame pseudo-op used in PIC code"));
6344 /* Quiet this warning. */
6345 mips_frame_reg_valid = 1;
6346 }
90ecf173 6347 if (!mips_cprestore_valid)
7a621144
DJ
6348 {
6349 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6350 /* Quiet this warning. */
6351 mips_cprestore_valid = 1;
6352 }
6478892d 6353 if (mips_opts.noreorder)
67c0d1eb 6354 macro_build (NULL, "nop", "");
6478892d 6355 expr1.X_add_number = mips_cprestore_offset;
67c0d1eb 6356 macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
f899b4b8 6357 mips_gp_register,
256ab948
TS
6358 mips_frame_reg,
6359 HAVE_64BIT_ADDRESSES);
6478892d 6360 }
252b5132
RH
6361 }
6362 }
0a44bf69
RS
6363 else if (mips_pic == VXWORKS_PIC)
6364 as_bad (_("Non-PIC jump used in PIC library"));
252b5132
RH
6365 else
6366 abort ();
6367
8fc2e39e 6368 break;
252b5132
RH
6369
6370 case M_LB_AB:
6371 s = "lb";
6372 goto ld;
6373 case M_LBU_AB:
6374 s = "lbu";
6375 goto ld;
6376 case M_LH_AB:
6377 s = "lh";
6378 goto ld;
6379 case M_LHU_AB:
6380 s = "lhu";
6381 goto ld;
6382 case M_LW_AB:
6383 s = "lw";
6384 goto ld;
6385 case M_LWC0_AB:
6386 s = "lwc0";
bdaaa2e1 6387 /* Itbl support may require additional care here. */
252b5132
RH
6388 coproc = 1;
6389 goto ld;
6390 case M_LWC1_AB:
6391 s = "lwc1";
bdaaa2e1 6392 /* Itbl support may require additional care here. */
252b5132
RH
6393 coproc = 1;
6394 goto ld;
6395 case M_LWC2_AB:
6396 s = "lwc2";
bdaaa2e1 6397 /* Itbl support may require additional care here. */
252b5132
RH
6398 coproc = 1;
6399 goto ld;
6400 case M_LWC3_AB:
6401 s = "lwc3";
bdaaa2e1 6402 /* Itbl support may require additional care here. */
252b5132
RH
6403 coproc = 1;
6404 goto ld;
6405 case M_LWL_AB:
6406 s = "lwl";
6407 lr = 1;
6408 goto ld;
6409 case M_LWR_AB:
6410 s = "lwr";
6411 lr = 1;
6412 goto ld;
6413 case M_LDC1_AB:
252b5132 6414 s = "ldc1";
bdaaa2e1 6415 /* Itbl support may require additional care here. */
252b5132
RH
6416 coproc = 1;
6417 goto ld;
6418 case M_LDC2_AB:
6419 s = "ldc2";
bdaaa2e1 6420 /* Itbl support may require additional care here. */
252b5132
RH
6421 coproc = 1;
6422 goto ld;
6423 case M_LDC3_AB:
6424 s = "ldc3";
bdaaa2e1 6425 /* Itbl support may require additional care here. */
252b5132
RH
6426 coproc = 1;
6427 goto ld;
6428 case M_LDL_AB:
6429 s = "ldl";
6430 lr = 1;
6431 goto ld;
6432 case M_LDR_AB:
6433 s = "ldr";
6434 lr = 1;
6435 goto ld;
6436 case M_LL_AB:
6437 s = "ll";
6438 goto ld;
6439 case M_LLD_AB:
6440 s = "lld";
6441 goto ld;
6442 case M_LWU_AB:
6443 s = "lwu";
6444 ld:
8fc2e39e 6445 if (breg == treg || coproc || lr)
252b5132
RH
6446 {
6447 tempreg = AT;
6448 used_at = 1;
6449 }
6450 else
6451 {
6452 tempreg = treg;
252b5132
RH
6453 }
6454 goto ld_st;
6455 case M_SB_AB:
6456 s = "sb";
6457 goto st;
6458 case M_SH_AB:
6459 s = "sh";
6460 goto st;
6461 case M_SW_AB:
6462 s = "sw";
6463 goto st;
6464 case M_SWC0_AB:
6465 s = "swc0";
bdaaa2e1 6466 /* Itbl support may require additional care here. */
252b5132
RH
6467 coproc = 1;
6468 goto st;
6469 case M_SWC1_AB:
6470 s = "swc1";
bdaaa2e1 6471 /* Itbl support may require additional care here. */
252b5132
RH
6472 coproc = 1;
6473 goto st;
6474 case M_SWC2_AB:
6475 s = "swc2";
bdaaa2e1 6476 /* Itbl support may require additional care here. */
252b5132
RH
6477 coproc = 1;
6478 goto st;
6479 case M_SWC3_AB:
6480 s = "swc3";
bdaaa2e1 6481 /* Itbl support may require additional care here. */
252b5132
RH
6482 coproc = 1;
6483 goto st;
6484 case M_SWL_AB:
6485 s = "swl";
6486 goto st;
6487 case M_SWR_AB:
6488 s = "swr";
6489 goto st;
6490 case M_SC_AB:
6491 s = "sc";
6492 goto st;
6493 case M_SCD_AB:
6494 s = "scd";
6495 goto st;
d43b4baf
TS
6496 case M_CACHE_AB:
6497 s = "cache";
6498 goto st;
252b5132 6499 case M_SDC1_AB:
252b5132
RH
6500 s = "sdc1";
6501 coproc = 1;
bdaaa2e1 6502 /* Itbl support may require additional care here. */
252b5132
RH
6503 goto st;
6504 case M_SDC2_AB:
6505 s = "sdc2";
bdaaa2e1 6506 /* Itbl support may require additional care here. */
252b5132
RH
6507 coproc = 1;
6508 goto st;
6509 case M_SDC3_AB:
6510 s = "sdc3";
bdaaa2e1 6511 /* Itbl support may require additional care here. */
252b5132
RH
6512 coproc = 1;
6513 goto st;
6514 case M_SDL_AB:
6515 s = "sdl";
6516 goto st;
6517 case M_SDR_AB:
6518 s = "sdr";
6519 st:
8fc2e39e
TS
6520 tempreg = AT;
6521 used_at = 1;
252b5132 6522 ld_st:
b19e8a9b
AN
6523 if (coproc
6524 && NO_ISA_COP (mips_opts.arch)
6525 && (ip->insn_mo->pinfo2 & (INSN2_M_FP_S | INSN2_M_FP_D)) == 0)
6526 {
f71d0d44 6527 as_bad (_("Opcode not supported on this processor: %s"),
b19e8a9b
AN
6528 mips_cpu_info_from_arch (mips_opts.arch)->name);
6529 break;
6530 }
6531
bdaaa2e1 6532 /* Itbl support may require additional care here. */
252b5132
RH
6533 if (mask == M_LWC1_AB
6534 || mask == M_SWC1_AB
6535 || mask == M_LDC1_AB
6536 || mask == M_SDC1_AB
6537 || mask == M_L_DAB
6538 || mask == M_S_DAB)
6539 fmt = "T,o(b)";
d43b4baf
TS
6540 else if (mask == M_CACHE_AB)
6541 fmt = "k,o(b)";
252b5132
RH
6542 else if (coproc)
6543 fmt = "E,o(b)";
6544 else
6545 fmt = "t,o(b)";
6546
6547 if (offset_expr.X_op != O_constant
6548 && offset_expr.X_op != O_symbol)
6549 {
f71d0d44 6550 as_bad (_("Expression too complex"));
252b5132
RH
6551 offset_expr.X_op = O_constant;
6552 }
6553
2051e8c4
MR
6554 if (HAVE_32BIT_ADDRESSES
6555 && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
55e08f71
NC
6556 {
6557 char value [32];
6558
6559 sprintf_vma (value, offset_expr.X_add_number);
20e1fcfd 6560 as_bad (_("Number (0x%s) larger than 32 bits"), value);
55e08f71 6561 }
2051e8c4 6562
252b5132
RH
6563 /* A constant expression in PIC code can be handled just as it
6564 is in non PIC code. */
aed1a261
RS
6565 if (offset_expr.X_op == O_constant)
6566 {
842f8b2a 6567 expr1.X_add_number = offset_expr.X_add_number;
2051e8c4 6568 normalize_address_expr (&expr1);
842f8b2a
MR
6569 if (!IS_SEXT_16BIT_NUM (expr1.X_add_number))
6570 {
6571 expr1.X_add_number = ((expr1.X_add_number + 0x8000)
6572 & ~(bfd_vma) 0xffff);
6573 load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
6574 if (breg != 0)
6575 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6576 tempreg, tempreg, breg);
6577 breg = tempreg;
6578 }
6579 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, breg);
aed1a261
RS
6580 }
6581 else if (mips_pic == NO_PIC)
252b5132
RH
6582 {
6583 /* If this is a reference to a GP relative symbol, and there
6584 is no base register, we want
cdf6fd85 6585 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
252b5132
RH
6586 Otherwise, if there is no base register, we want
6587 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
6588 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6589 If we have a constant, we need two instructions anyhow,
6590 so we always use the latter form.
6591
6592 If we have a base register, and this is a reference to a
6593 GP relative symbol, we want
6594 addu $tempreg,$breg,$gp
cdf6fd85 6595 <op> $treg,<sym>($tempreg) (BFD_RELOC_GPREL16)
252b5132
RH
6596 Otherwise we want
6597 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
6598 addu $tempreg,$tempreg,$breg
6599 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
d6bc6245 6600 With a constant we always use the latter case.
76b3015f 6601
d6bc6245
TS
6602 With 64bit address space and no base register and $at usable,
6603 we want
6604 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6605 lui $at,<sym> (BFD_RELOC_HI16_S)
6606 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6607 dsll32 $tempreg,0
6608 daddu $tempreg,$at
6609 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6610 If we have a base register, we want
6611 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6612 lui $at,<sym> (BFD_RELOC_HI16_S)
6613 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6614 daddu $at,$breg
6615 dsll32 $tempreg,0
6616 daddu $tempreg,$at
6617 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6618
6619 Without $at we can't generate the optimal path for superscalar
6620 processors here since this would require two temporary registers.
6621 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6622 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6623 dsll $tempreg,16
6624 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
6625 dsll $tempreg,16
6626 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6627 If we have a base register, we want
6628 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
6629 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
6630 dsll $tempreg,16
6631 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
6632 dsll $tempreg,16
6633 daddu $tempreg,$tempreg,$breg
6634 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6373ee54 6635
6caf9ef4 6636 For GP relative symbols in 64bit address space we can use
aed1a261
RS
6637 the same sequence as in 32bit address space. */
6638 if (HAVE_64BIT_SYMBOLS)
d6bc6245 6639 {
aed1a261 6640 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6caf9ef4
TS
6641 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6642 {
6643 relax_start (offset_expr.X_add_symbol);
6644 if (breg == 0)
6645 {
6646 macro_build (&offset_expr, s, fmt, treg,
6647 BFD_RELOC_GPREL16, mips_gp_register);
6648 }
6649 else
6650 {
6651 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6652 tempreg, breg, mips_gp_register);
6653 macro_build (&offset_expr, s, fmt, treg,
6654 BFD_RELOC_GPREL16, tempreg);
6655 }
6656 relax_switch ();
6657 }
d6bc6245 6658
741fe287 6659 if (used_at == 0 && mips_opts.at)
d6bc6245 6660 {
67c0d1eb
RS
6661 macro_build (&offset_expr, "lui", "t,u", tempreg,
6662 BFD_RELOC_MIPS_HIGHEST);
6663 macro_build (&offset_expr, "lui", "t,u", AT,
6664 BFD_RELOC_HI16_S);
6665 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6666 tempreg, BFD_RELOC_MIPS_HIGHER);
d6bc6245 6667 if (breg != 0)
67c0d1eb
RS
6668 macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
6669 macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
6670 macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
6671 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
6672 tempreg);
d6bc6245
TS
6673 used_at = 1;
6674 }
6675 else
6676 {
67c0d1eb
RS
6677 macro_build (&offset_expr, "lui", "t,u", tempreg,
6678 BFD_RELOC_MIPS_HIGHEST);
6679 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6680 tempreg, BFD_RELOC_MIPS_HIGHER);
6681 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6682 macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6683 tempreg, BFD_RELOC_HI16_S);
6684 macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
d6bc6245 6685 if (breg != 0)
67c0d1eb 6686 macro_build (NULL, "daddu", "d,v,t",
17a2f251 6687 tempreg, tempreg, breg);
67c0d1eb 6688 macro_build (&offset_expr, s, fmt, treg,
17a2f251 6689 BFD_RELOC_LO16, tempreg);
d6bc6245 6690 }
6caf9ef4
TS
6691
6692 if (mips_relax.sequence)
6693 relax_end ();
8fc2e39e 6694 break;
d6bc6245 6695 }
256ab948 6696
252b5132
RH
6697 if (breg == 0)
6698 {
67c0d1eb 6699 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6caf9ef4 6700 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
252b5132 6701 {
4d7206a2 6702 relax_start (offset_expr.X_add_symbol);
67c0d1eb
RS
6703 macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6704 mips_gp_register);
4d7206a2 6705 relax_switch ();
252b5132 6706 }
67c0d1eb
RS
6707 macro_build_lui (&offset_expr, tempreg);
6708 macro_build (&offset_expr, s, fmt, treg,
17a2f251 6709 BFD_RELOC_LO16, tempreg);
4d7206a2
RS
6710 if (mips_relax.sequence)
6711 relax_end ();
252b5132
RH
6712 }
6713 else
6714 {
67c0d1eb 6715 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6caf9ef4 6716 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
252b5132 6717 {
4d7206a2 6718 relax_start (offset_expr.X_add_symbol);
67c0d1eb 6719 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6720 tempreg, breg, mips_gp_register);
67c0d1eb 6721 macro_build (&offset_expr, s, fmt, treg,
17a2f251 6722 BFD_RELOC_GPREL16, tempreg);
4d7206a2 6723 relax_switch ();
252b5132 6724 }
67c0d1eb
RS
6725 macro_build_lui (&offset_expr, tempreg);
6726 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6727 tempreg, tempreg, breg);
67c0d1eb 6728 macro_build (&offset_expr, s, fmt, treg,
17a2f251 6729 BFD_RELOC_LO16, tempreg);
4d7206a2
RS
6730 if (mips_relax.sequence)
6731 relax_end ();
252b5132
RH
6732 }
6733 }
0a44bf69 6734 else if (!mips_big_got)
252b5132 6735 {
ed6fb7bd 6736 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
f9419b05 6737
252b5132
RH
6738 /* If this is a reference to an external symbol, we want
6739 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6740 nop
6741 <op> $treg,0($tempreg)
6742 Otherwise we want
6743 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6744 nop
6745 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6746 <op> $treg,0($tempreg)
f5040a92
AO
6747
6748 For NewABI, we want
6749 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
6750 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST)
6751
252b5132
RH
6752 If there is a base register, we add it to $tempreg before
6753 the <op>. If there is a constant, we stick it in the
6754 <op> instruction. We don't handle constants larger than
6755 16 bits, because we have no way to load the upper 16 bits
6756 (actually, we could handle them for the subset of cases
6757 in which we are not using $at). */
9c2799c2 6758 gas_assert (offset_expr.X_op == O_symbol);
f5040a92
AO
6759 if (HAVE_NEWABI)
6760 {
67c0d1eb
RS
6761 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6762 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
f5040a92 6763 if (breg != 0)
67c0d1eb 6764 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6765 tempreg, tempreg, breg);
67c0d1eb 6766 macro_build (&offset_expr, s, fmt, treg,
17a2f251 6767 BFD_RELOC_MIPS_GOT_OFST, tempreg);
f5040a92
AO
6768 break;
6769 }
252b5132
RH
6770 expr1.X_add_number = offset_expr.X_add_number;
6771 offset_expr.X_add_number = 0;
6772 if (expr1.X_add_number < -0x8000
6773 || expr1.X_add_number >= 0x8000)
6774 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
67c0d1eb
RS
6775 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6776 lw_reloc_type, mips_gp_register);
269137b2 6777 load_delay_nop ();
4d7206a2
RS
6778 relax_start (offset_expr.X_add_symbol);
6779 relax_switch ();
67c0d1eb
RS
6780 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6781 tempreg, BFD_RELOC_LO16);
4d7206a2 6782 relax_end ();
252b5132 6783 if (breg != 0)
67c0d1eb 6784 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6785 tempreg, tempreg, breg);
67c0d1eb 6786 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
252b5132 6787 }
0a44bf69 6788 else if (mips_big_got && !HAVE_NEWABI)
252b5132 6789 {
67c0d1eb 6790 int gpdelay;
252b5132
RH
6791
6792 /* If this is a reference to an external symbol, we want
6793 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6794 addu $tempreg,$tempreg,$gp
6795 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6796 <op> $treg,0($tempreg)
6797 Otherwise we want
6798 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6799 nop
6800 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6801 <op> $treg,0($tempreg)
6802 If there is a base register, we add it to $tempreg before
6803 the <op>. If there is a constant, we stick it in the
6804 <op> instruction. We don't handle constants larger than
6805 16 bits, because we have no way to load the upper 16 bits
6806 (actually, we could handle them for the subset of cases
f5040a92 6807 in which we are not using $at). */
9c2799c2 6808 gas_assert (offset_expr.X_op == O_symbol);
252b5132
RH
6809 expr1.X_add_number = offset_expr.X_add_number;
6810 offset_expr.X_add_number = 0;
6811 if (expr1.X_add_number < -0x8000
6812 || expr1.X_add_number >= 0x8000)
6813 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
67c0d1eb 6814 gpdelay = reg_needs_delay (mips_gp_register);
4d7206a2 6815 relax_start (offset_expr.X_add_symbol);
67c0d1eb 6816 macro_build (&offset_expr, "lui", "t,u", tempreg,
17a2f251 6817 BFD_RELOC_MIPS_GOT_HI16);
67c0d1eb
RS
6818 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6819 mips_gp_register);
6820 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6821 BFD_RELOC_MIPS_GOT_LO16, tempreg);
4d7206a2 6822 relax_switch ();
67c0d1eb
RS
6823 if (gpdelay)
6824 macro_build (NULL, "nop", "");
6825 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6826 BFD_RELOC_MIPS_GOT16, mips_gp_register);
269137b2 6827 load_delay_nop ();
67c0d1eb
RS
6828 macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6829 tempreg, BFD_RELOC_LO16);
4d7206a2
RS
6830 relax_end ();
6831
252b5132 6832 if (breg != 0)
67c0d1eb 6833 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6834 tempreg, tempreg, breg);
67c0d1eb 6835 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
252b5132 6836 }
0a44bf69 6837 else if (mips_big_got && HAVE_NEWABI)
f5040a92 6838 {
f5040a92
AO
6839 /* If this is a reference to an external symbol, we want
6840 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6841 add $tempreg,$tempreg,$gp
6842 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6843 <op> $treg,<ofst>($tempreg)
6844 Otherwise, for local symbols, we want:
6845 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
6846 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_OFST) */
9c2799c2 6847 gas_assert (offset_expr.X_op == O_symbol);
4d7206a2 6848 expr1.X_add_number = offset_expr.X_add_number;
f5040a92
AO
6849 offset_expr.X_add_number = 0;
6850 if (expr1.X_add_number < -0x8000
6851 || expr1.X_add_number >= 0x8000)
6852 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4d7206a2 6853 relax_start (offset_expr.X_add_symbol);
67c0d1eb 6854 macro_build (&offset_expr, "lui", "t,u", tempreg,
17a2f251 6855 BFD_RELOC_MIPS_GOT_HI16);
67c0d1eb
RS
6856 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6857 mips_gp_register);
6858 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6859 BFD_RELOC_MIPS_GOT_LO16, tempreg);
f5040a92 6860 if (breg != 0)
67c0d1eb 6861 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6862 tempreg, tempreg, breg);
67c0d1eb 6863 macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
684022ea 6864
4d7206a2 6865 relax_switch ();
f5040a92 6866 offset_expr.X_add_number = expr1.X_add_number;
67c0d1eb
RS
6867 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6868 BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
f5040a92 6869 if (breg != 0)
67c0d1eb 6870 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 6871 tempreg, tempreg, breg);
67c0d1eb 6872 macro_build (&offset_expr, s, fmt, treg,
17a2f251 6873 BFD_RELOC_MIPS_GOT_OFST, tempreg);
4d7206a2 6874 relax_end ();
f5040a92 6875 }
252b5132
RH
6876 else
6877 abort ();
6878
252b5132
RH
6879 break;
6880
6881 case M_LI:
6882 case M_LI_S:
67c0d1eb 6883 load_register (treg, &imm_expr, 0);
8fc2e39e 6884 break;
252b5132
RH
6885
6886 case M_DLI:
67c0d1eb 6887 load_register (treg, &imm_expr, 1);
8fc2e39e 6888 break;
252b5132
RH
6889
6890 case M_LI_SS:
6891 if (imm_expr.X_op == O_constant)
6892 {
8fc2e39e 6893 used_at = 1;
67c0d1eb
RS
6894 load_register (AT, &imm_expr, 0);
6895 macro_build (NULL, "mtc1", "t,G", AT, treg);
252b5132
RH
6896 break;
6897 }
6898 else
6899 {
9c2799c2 6900 gas_assert (offset_expr.X_op == O_symbol
90ecf173
MR
6901 && strcmp (segment_name (S_GET_SEGMENT
6902 (offset_expr.X_add_symbol)),
6903 ".lit4") == 0
6904 && offset_expr.X_add_number == 0);
67c0d1eb 6905 macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
17a2f251 6906 BFD_RELOC_MIPS_LITERAL, mips_gp_register);
8fc2e39e 6907 break;
252b5132
RH
6908 }
6909
6910 case M_LI_D:
ca4e0257
RS
6911 /* Check if we have a constant in IMM_EXPR. If the GPRs are 64 bits
6912 wide, IMM_EXPR is the entire value. Otherwise IMM_EXPR is the high
6913 order 32 bits of the value and the low order 32 bits are either
6914 zero or in OFFSET_EXPR. */
252b5132
RH
6915 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6916 {
ca4e0257 6917 if (HAVE_64BIT_GPRS)
67c0d1eb 6918 load_register (treg, &imm_expr, 1);
252b5132
RH
6919 else
6920 {
6921 int hreg, lreg;
6922
6923 if (target_big_endian)
6924 {
6925 hreg = treg;
6926 lreg = treg + 1;
6927 }
6928 else
6929 {
6930 hreg = treg + 1;
6931 lreg = treg;
6932 }
6933
6934 if (hreg <= 31)
67c0d1eb 6935 load_register (hreg, &imm_expr, 0);
252b5132
RH
6936 if (lreg <= 31)
6937 {
6938 if (offset_expr.X_op == O_absent)
67c0d1eb 6939 move_register (lreg, 0);
252b5132
RH
6940 else
6941 {
9c2799c2 6942 gas_assert (offset_expr.X_op == O_constant);
67c0d1eb 6943 load_register (lreg, &offset_expr, 0);
252b5132
RH
6944 }
6945 }
6946 }
8fc2e39e 6947 break;
252b5132
RH
6948 }
6949
6950 /* We know that sym is in the .rdata section. First we get the
6951 upper 16 bits of the address. */
6952 if (mips_pic == NO_PIC)
6953 {
67c0d1eb 6954 macro_build_lui (&offset_expr, AT);
8fc2e39e 6955 used_at = 1;
252b5132 6956 }
0a44bf69 6957 else
252b5132 6958 {
67c0d1eb
RS
6959 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6960 BFD_RELOC_MIPS_GOT16, mips_gp_register);
8fc2e39e 6961 used_at = 1;
252b5132 6962 }
bdaaa2e1 6963
252b5132 6964 /* Now we load the register(s). */
ca4e0257 6965 if (HAVE_64BIT_GPRS)
8fc2e39e
TS
6966 {
6967 used_at = 1;
6968 macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6969 }
252b5132
RH
6970 else
6971 {
8fc2e39e 6972 used_at = 1;
67c0d1eb 6973 macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
f9419b05 6974 if (treg != RA)
252b5132
RH
6975 {
6976 /* FIXME: How in the world do we deal with the possible
6977 overflow here? */
6978 offset_expr.X_add_number += 4;
67c0d1eb 6979 macro_build (&offset_expr, "lw", "t,o(b)",
17a2f251 6980 treg + 1, BFD_RELOC_LO16, AT);
252b5132
RH
6981 }
6982 }
252b5132
RH
6983 break;
6984
6985 case M_LI_DD:
ca4e0257
RS
6986 /* Check if we have a constant in IMM_EXPR. If the FPRs are 64 bits
6987 wide, IMM_EXPR is the entire value and the GPRs are known to be 64
6988 bits wide as well. Otherwise IMM_EXPR is the high order 32 bits of
6989 the value and the low order 32 bits are either zero or in
6990 OFFSET_EXPR. */
252b5132
RH
6991 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6992 {
8fc2e39e 6993 used_at = 1;
67c0d1eb 6994 load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
ca4e0257
RS
6995 if (HAVE_64BIT_FPRS)
6996 {
9c2799c2 6997 gas_assert (HAVE_64BIT_GPRS);
67c0d1eb 6998 macro_build (NULL, "dmtc1", "t,S", AT, treg);
ca4e0257 6999 }
252b5132
RH
7000 else
7001 {
67c0d1eb 7002 macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
252b5132 7003 if (offset_expr.X_op == O_absent)
67c0d1eb 7004 macro_build (NULL, "mtc1", "t,G", 0, treg);
252b5132
RH
7005 else
7006 {
9c2799c2 7007 gas_assert (offset_expr.X_op == O_constant);
67c0d1eb
RS
7008 load_register (AT, &offset_expr, 0);
7009 macro_build (NULL, "mtc1", "t,G", AT, treg);
252b5132
RH
7010 }
7011 }
7012 break;
7013 }
7014
9c2799c2 7015 gas_assert (offset_expr.X_op == O_symbol
90ecf173 7016 && offset_expr.X_add_number == 0);
252b5132
RH
7017 s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
7018 if (strcmp (s, ".lit8") == 0)
7019 {
e7af610e 7020 if (mips_opts.isa != ISA_MIPS1)
252b5132 7021 {
67c0d1eb 7022 macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
17a2f251 7023 BFD_RELOC_MIPS_LITERAL, mips_gp_register);
8fc2e39e 7024 break;
252b5132 7025 }
c9914766 7026 breg = mips_gp_register;
252b5132
RH
7027 r = BFD_RELOC_MIPS_LITERAL;
7028 goto dob;
7029 }
7030 else
7031 {
9c2799c2 7032 gas_assert (strcmp (s, RDATA_SECTION_NAME) == 0);
8fc2e39e 7033 used_at = 1;
0a44bf69 7034 if (mips_pic != NO_PIC)
67c0d1eb
RS
7035 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7036 BFD_RELOC_MIPS_GOT16, mips_gp_register);
252b5132
RH
7037 else
7038 {
7039 /* FIXME: This won't work for a 64 bit address. */
67c0d1eb 7040 macro_build_lui (&offset_expr, AT);
252b5132 7041 }
bdaaa2e1 7042
e7af610e 7043 if (mips_opts.isa != ISA_MIPS1)
252b5132 7044 {
67c0d1eb
RS
7045 macro_build (&offset_expr, "ldc1", "T,o(b)",
7046 treg, BFD_RELOC_LO16, AT);
252b5132
RH
7047 break;
7048 }
7049 breg = AT;
7050 r = BFD_RELOC_LO16;
7051 goto dob;
7052 }
7053
7054 case M_L_DOB:
252b5132
RH
7055 /* Even on a big endian machine $fn comes before $fn+1. We have
7056 to adjust when loading from memory. */
7057 r = BFD_RELOC_LO16;
7058 dob:
9c2799c2 7059 gas_assert (mips_opts.isa == ISA_MIPS1);
67c0d1eb 7060 macro_build (&offset_expr, "lwc1", "T,o(b)",
17a2f251 7061 target_big_endian ? treg + 1 : treg, r, breg);
252b5132
RH
7062 /* FIXME: A possible overflow which I don't know how to deal
7063 with. */
7064 offset_expr.X_add_number += 4;
67c0d1eb 7065 macro_build (&offset_expr, "lwc1", "T,o(b)",
17a2f251 7066 target_big_endian ? treg : treg + 1, r, breg);
252b5132
RH
7067 break;
7068
c4a68bea
MR
7069 case M_S_DOB:
7070 gas_assert (mips_opts.isa == ISA_MIPS1);
7071 /* Even on a big endian machine $fn comes before $fn+1. We have
7072 to adjust when storing to memory. */
7073 macro_build (&offset_expr, "swc1", "T,o(b)",
7074 target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7075 offset_expr.X_add_number += 4;
7076 macro_build (&offset_expr, "swc1", "T,o(b)",
7077 target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7078 break;
7079
252b5132
RH
7080 case M_L_DAB:
7081 /*
7082 * The MIPS assembler seems to check for X_add_number not
7083 * being double aligned and generating:
7084 * lui at,%hi(foo+1)
7085 * addu at,at,v1
7086 * addiu at,at,%lo(foo+1)
7087 * lwc1 f2,0(at)
7088 * lwc1 f3,4(at)
7089 * But, the resulting address is the same after relocation so why
7090 * generate the extra instruction?
7091 */
bdaaa2e1 7092 /* Itbl support may require additional care here. */
252b5132 7093 coproc = 1;
e7af610e 7094 if (mips_opts.isa != ISA_MIPS1)
252b5132
RH
7095 {
7096 s = "ldc1";
7097 goto ld;
7098 }
7099
7100 s = "lwc1";
7101 fmt = "T,o(b)";
7102 goto ldd_std;
7103
7104 case M_S_DAB:
e7af610e 7105 if (mips_opts.isa != ISA_MIPS1)
252b5132
RH
7106 {
7107 s = "sdc1";
7108 goto st;
7109 }
7110
7111 s = "swc1";
7112 fmt = "T,o(b)";
bdaaa2e1 7113 /* Itbl support may require additional care here. */
252b5132
RH
7114 coproc = 1;
7115 goto ldd_std;
7116
7117 case M_LD_AB:
ca4e0257 7118 if (HAVE_64BIT_GPRS)
252b5132
RH
7119 {
7120 s = "ld";
7121 goto ld;
7122 }
7123
7124 s = "lw";
7125 fmt = "t,o(b)";
7126 goto ldd_std;
7127
7128 case M_SD_AB:
ca4e0257 7129 if (HAVE_64BIT_GPRS)
252b5132
RH
7130 {
7131 s = "sd";
7132 goto st;
7133 }
7134
7135 s = "sw";
7136 fmt = "t,o(b)";
7137
7138 ldd_std:
7139 if (offset_expr.X_op != O_symbol
7140 && offset_expr.X_op != O_constant)
7141 {
f71d0d44 7142 as_bad (_("Expression too complex"));
252b5132
RH
7143 offset_expr.X_op = O_constant;
7144 }
7145
2051e8c4
MR
7146 if (HAVE_32BIT_ADDRESSES
7147 && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
55e08f71
NC
7148 {
7149 char value [32];
7150
7151 sprintf_vma (value, offset_expr.X_add_number);
20e1fcfd 7152 as_bad (_("Number (0x%s) larger than 32 bits"), value);
55e08f71 7153 }
2051e8c4 7154
252b5132
RH
7155 /* Even on a big endian machine $fn comes before $fn+1. We have
7156 to adjust when loading from memory. We set coproc if we must
7157 load $fn+1 first. */
bdaaa2e1 7158 /* Itbl support may require additional care here. */
90ecf173 7159 if (!target_big_endian)
252b5132
RH
7160 coproc = 0;
7161
90ecf173 7162 if (mips_pic == NO_PIC || offset_expr.X_op == O_constant)
252b5132
RH
7163 {
7164 /* If this is a reference to a GP relative symbol, we want
cdf6fd85
TS
7165 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
7166 <op> $treg+1,<sym>+4($gp) (BFD_RELOC_GPREL16)
252b5132
RH
7167 If we have a base register, we use this
7168 addu $at,$breg,$gp
cdf6fd85
TS
7169 <op> $treg,<sym>($at) (BFD_RELOC_GPREL16)
7170 <op> $treg+1,<sym>+4($at) (BFD_RELOC_GPREL16)
252b5132
RH
7171 If this is not a GP relative symbol, we want
7172 lui $at,<sym> (BFD_RELOC_HI16_S)
7173 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
7174 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
7175 If there is a base register, we add it to $at after the
7176 lui instruction. If there is a constant, we always use
7177 the last case. */
39a59cf8
MR
7178 if (offset_expr.X_op == O_symbol
7179 && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6caf9ef4 7180 && !nopic_need_relax (offset_expr.X_add_symbol, 1))
252b5132 7181 {
4d7206a2 7182 relax_start (offset_expr.X_add_symbol);
252b5132
RH
7183 if (breg == 0)
7184 {
c9914766 7185 tempreg = mips_gp_register;
252b5132
RH
7186 }
7187 else
7188 {
67c0d1eb 7189 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 7190 AT, breg, mips_gp_register);
252b5132 7191 tempreg = AT;
252b5132
RH
7192 used_at = 1;
7193 }
7194
beae10d5 7195 /* Itbl support may require additional care here. */
67c0d1eb 7196 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
17a2f251 7197 BFD_RELOC_GPREL16, tempreg);
252b5132
RH
7198 offset_expr.X_add_number += 4;
7199
7200 /* Set mips_optimize to 2 to avoid inserting an
7201 undesired nop. */
7202 hold_mips_optimize = mips_optimize;
7203 mips_optimize = 2;
beae10d5 7204 /* Itbl support may require additional care here. */
67c0d1eb 7205 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
17a2f251 7206 BFD_RELOC_GPREL16, tempreg);
252b5132
RH
7207 mips_optimize = hold_mips_optimize;
7208
4d7206a2 7209 relax_switch ();
252b5132 7210
0970e49e 7211 offset_expr.X_add_number -= 4;
252b5132 7212 }
8fc2e39e 7213 used_at = 1;
67c0d1eb 7214 macro_build_lui (&offset_expr, AT);
252b5132 7215 if (breg != 0)
67c0d1eb 7216 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
beae10d5 7217 /* Itbl support may require additional care here. */
67c0d1eb 7218 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
17a2f251 7219 BFD_RELOC_LO16, AT);
252b5132
RH
7220 /* FIXME: How do we handle overflow here? */
7221 offset_expr.X_add_number += 4;
beae10d5 7222 /* Itbl support may require additional care here. */
67c0d1eb 7223 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
17a2f251 7224 BFD_RELOC_LO16, AT);
4d7206a2
RS
7225 if (mips_relax.sequence)
7226 relax_end ();
bdaaa2e1 7227 }
0a44bf69 7228 else if (!mips_big_got)
252b5132 7229 {
252b5132
RH
7230 /* If this is a reference to an external symbol, we want
7231 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7232 nop
7233 <op> $treg,0($at)
7234 <op> $treg+1,4($at)
7235 Otherwise we want
7236 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7237 nop
7238 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
7239 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
7240 If there is a base register we add it to $at before the
7241 lwc1 instructions. If there is a constant we include it
7242 in the lwc1 instructions. */
7243 used_at = 1;
7244 expr1.X_add_number = offset_expr.X_add_number;
252b5132
RH
7245 if (expr1.X_add_number < -0x8000
7246 || expr1.X_add_number >= 0x8000 - 4)
7247 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
67c0d1eb 7248 load_got_offset (AT, &offset_expr);
269137b2 7249 load_delay_nop ();
252b5132 7250 if (breg != 0)
67c0d1eb 7251 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
252b5132
RH
7252
7253 /* Set mips_optimize to 2 to avoid inserting an undesired
7254 nop. */
7255 hold_mips_optimize = mips_optimize;
7256 mips_optimize = 2;
4d7206a2 7257
beae10d5 7258 /* Itbl support may require additional care here. */
4d7206a2 7259 relax_start (offset_expr.X_add_symbol);
67c0d1eb
RS
7260 macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7261 BFD_RELOC_LO16, AT);
4d7206a2 7262 expr1.X_add_number += 4;
67c0d1eb
RS
7263 macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7264 BFD_RELOC_LO16, AT);
4d7206a2 7265 relax_switch ();
67c0d1eb
RS
7266 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7267 BFD_RELOC_LO16, AT);
4d7206a2 7268 offset_expr.X_add_number += 4;
67c0d1eb
RS
7269 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7270 BFD_RELOC_LO16, AT);
4d7206a2 7271 relax_end ();
252b5132 7272
4d7206a2 7273 mips_optimize = hold_mips_optimize;
252b5132 7274 }
0a44bf69 7275 else if (mips_big_got)
252b5132 7276 {
67c0d1eb 7277 int gpdelay;
252b5132
RH
7278
7279 /* If this is a reference to an external symbol, we want
7280 lui $at,<sym> (BFD_RELOC_MIPS_GOT_HI16)
7281 addu $at,$at,$gp
7282 lw $at,<sym>($at) (BFD_RELOC_MIPS_GOT_LO16)
7283 nop
7284 <op> $treg,0($at)
7285 <op> $treg+1,4($at)
7286 Otherwise we want
7287 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
7288 nop
7289 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
7290 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
7291 If there is a base register we add it to $at before the
7292 lwc1 instructions. If there is a constant we include it
7293 in the lwc1 instructions. */
7294 used_at = 1;
7295 expr1.X_add_number = offset_expr.X_add_number;
7296 offset_expr.X_add_number = 0;
7297 if (expr1.X_add_number < -0x8000
7298 || expr1.X_add_number >= 0x8000 - 4)
7299 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
67c0d1eb 7300 gpdelay = reg_needs_delay (mips_gp_register);
4d7206a2 7301 relax_start (offset_expr.X_add_symbol);
67c0d1eb
RS
7302 macro_build (&offset_expr, "lui", "t,u",
7303 AT, BFD_RELOC_MIPS_GOT_HI16);
7304 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
17a2f251 7305 AT, AT, mips_gp_register);
67c0d1eb 7306 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
17a2f251 7307 AT, BFD_RELOC_MIPS_GOT_LO16, AT);
269137b2 7308 load_delay_nop ();
252b5132 7309 if (breg != 0)
67c0d1eb 7310 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
beae10d5 7311 /* Itbl support may require additional care here. */
67c0d1eb 7312 macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
17a2f251 7313 BFD_RELOC_LO16, AT);
252b5132
RH
7314 expr1.X_add_number += 4;
7315
7316 /* Set mips_optimize to 2 to avoid inserting an undesired
7317 nop. */
7318 hold_mips_optimize = mips_optimize;
7319 mips_optimize = 2;
beae10d5 7320 /* Itbl support may require additional care here. */
67c0d1eb 7321 macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
17a2f251 7322 BFD_RELOC_LO16, AT);
252b5132
RH
7323 mips_optimize = hold_mips_optimize;
7324 expr1.X_add_number -= 4;
7325
4d7206a2
RS
7326 relax_switch ();
7327 offset_expr.X_add_number = expr1.X_add_number;
67c0d1eb
RS
7328 if (gpdelay)
7329 macro_build (NULL, "nop", "");
7330 macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7331 BFD_RELOC_MIPS_GOT16, mips_gp_register);
269137b2 7332 load_delay_nop ();
252b5132 7333 if (breg != 0)
67c0d1eb 7334 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
beae10d5 7335 /* Itbl support may require additional care here. */
67c0d1eb
RS
7336 macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7337 BFD_RELOC_LO16, AT);
4d7206a2 7338 offset_expr.X_add_number += 4;
252b5132
RH
7339
7340 /* Set mips_optimize to 2 to avoid inserting an undesired
7341 nop. */
7342 hold_mips_optimize = mips_optimize;
7343 mips_optimize = 2;
beae10d5 7344 /* Itbl support may require additional care here. */
67c0d1eb
RS
7345 macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7346 BFD_RELOC_LO16, AT);
252b5132 7347 mips_optimize = hold_mips_optimize;
4d7206a2 7348 relax_end ();
252b5132 7349 }
252b5132
RH
7350 else
7351 abort ();
7352
252b5132
RH
7353 break;
7354
7355 case M_LD_OB:
704897fb 7356 s = HAVE_64BIT_GPRS ? "ld" : "lw";
252b5132
RH
7357 goto sd_ob;
7358 case M_SD_OB:
704897fb 7359 s = HAVE_64BIT_GPRS ? "sd" : "sw";
252b5132 7360 sd_ob:
4614d845
MR
7361 macro_build (&offset_expr, s, "t,o(b)", treg,
7362 -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
7363 breg);
704897fb
MR
7364 if (!HAVE_64BIT_GPRS)
7365 {
7366 offset_expr.X_add_number += 4;
7367 macro_build (&offset_expr, s, "t,o(b)", treg + 1,
4614d845
MR
7368 -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
7369 breg);
704897fb 7370 }
8fc2e39e 7371 break;
252b5132
RH
7372
7373 /* New code added to support COPZ instructions.
7374 This code builds table entries out of the macros in mip_opcodes.
7375 R4000 uses interlocks to handle coproc delays.
7376 Other chips (like the R3000) require nops to be inserted for delays.
7377
f72c8c98 7378 FIXME: Currently, we require that the user handle delays.
252b5132
RH
7379 In order to fill delay slots for non-interlocked chips,
7380 we must have a way to specify delays based on the coprocessor.
7381 Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
7382 What are the side-effects of the cop instruction?
7383 What cache support might we have and what are its effects?
7384 Both coprocessor & memory require delays. how long???
bdaaa2e1 7385 What registers are read/set/modified?
252b5132
RH
7386
7387 If an itbl is provided to interpret cop instructions,
bdaaa2e1 7388 this knowledge can be encoded in the itbl spec. */
252b5132
RH
7389
7390 case M_COP0:
7391 s = "c0";
7392 goto copz;
7393 case M_COP1:
7394 s = "c1";
7395 goto copz;
7396 case M_COP2:
7397 s = "c2";
7398 goto copz;
7399 case M_COP3:
7400 s = "c3";
7401 copz:
b19e8a9b
AN
7402 if (NO_ISA_COP (mips_opts.arch)
7403 && (ip->insn_mo->pinfo2 & INSN2_M_FP_S) == 0)
7404 {
7405 as_bad (_("opcode not supported on this processor: %s"),
7406 mips_cpu_info_from_arch (mips_opts.arch)->name);
7407 break;
7408 }
7409
252b5132
RH
7410 /* For now we just do C (same as Cz). The parameter will be
7411 stored in insn_opcode by mips_ip. */
67c0d1eb 7412 macro_build (NULL, s, "C", ip->insn_opcode);
8fc2e39e 7413 break;
252b5132 7414
ea1fb5dc 7415 case M_MOVE:
67c0d1eb 7416 move_register (dreg, sreg);
8fc2e39e 7417 break;
ea1fb5dc 7418
252b5132
RH
7419 case M_DMUL:
7420 dbl = 1;
7421 case M_MUL:
67c0d1eb
RS
7422 macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7423 macro_build (NULL, "mflo", "d", dreg);
8fc2e39e 7424 break;
252b5132
RH
7425
7426 case M_DMUL_I:
7427 dbl = 1;
7428 case M_MUL_I:
7429 /* The MIPS assembler some times generates shifts and adds. I'm
7430 not trying to be that fancy. GCC should do this for us
7431 anyway. */
8fc2e39e 7432 used_at = 1;
67c0d1eb
RS
7433 load_register (AT, &imm_expr, dbl);
7434 macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
7435 macro_build (NULL, "mflo", "d", dreg);
252b5132
RH
7436 break;
7437
7438 case M_DMULO_I:
7439 dbl = 1;
7440 case M_MULO_I:
7441 imm = 1;
7442 goto do_mulo;
7443
7444 case M_DMULO:
7445 dbl = 1;
7446 case M_MULO:
7447 do_mulo:
7d10b47d 7448 start_noreorder ();
8fc2e39e 7449 used_at = 1;
252b5132 7450 if (imm)
67c0d1eb
RS
7451 load_register (AT, &imm_expr, dbl);
7452 macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
7453 macro_build (NULL, "mflo", "d", dreg);
7454 macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
7455 macro_build (NULL, "mfhi", "d", AT);
252b5132 7456 if (mips_trap)
67c0d1eb 7457 macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
252b5132
RH
7458 else
7459 {
7460 expr1.X_add_number = 8;
67c0d1eb 7461 macro_build (&expr1, "beq", "s,t,p", dreg, AT);
a605d2b3 7462 macro_build (NULL, "nop", "");
67c0d1eb 7463 macro_build (NULL, "break", "c", 6);
252b5132 7464 }
7d10b47d 7465 end_noreorder ();
67c0d1eb 7466 macro_build (NULL, "mflo", "d", dreg);
252b5132
RH
7467 break;
7468
7469 case M_DMULOU_I:
7470 dbl = 1;
7471 case M_MULOU_I:
7472 imm = 1;
7473 goto do_mulou;
7474
7475 case M_DMULOU:
7476 dbl = 1;
7477 case M_MULOU:
7478 do_mulou:
7d10b47d 7479 start_noreorder ();
8fc2e39e 7480 used_at = 1;
252b5132 7481 if (imm)
67c0d1eb
RS
7482 load_register (AT, &imm_expr, dbl);
7483 macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
17a2f251 7484 sreg, imm ? AT : treg);
67c0d1eb
RS
7485 macro_build (NULL, "mfhi", "d", AT);
7486 macro_build (NULL, "mflo", "d", dreg);
252b5132 7487 if (mips_trap)
c80c840e 7488 macro_build (NULL, "tne", "s,t,q", AT, ZERO, 6);
252b5132
RH
7489 else
7490 {
7491 expr1.X_add_number = 8;
c80c840e 7492 macro_build (&expr1, "beq", "s,t,p", AT, ZERO);
a605d2b3 7493 macro_build (NULL, "nop", "");
67c0d1eb 7494 macro_build (NULL, "break", "c", 6);
252b5132 7495 }
7d10b47d 7496 end_noreorder ();
252b5132
RH
7497 break;
7498
771c7ce4 7499 case M_DROL:
fef14a42 7500 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
82dd0097
CD
7501 {
7502 if (dreg == sreg)
7503 {
7504 tempreg = AT;
7505 used_at = 1;
7506 }
7507 else
7508 {
7509 tempreg = dreg;
82dd0097 7510 }
67c0d1eb
RS
7511 macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7512 macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
8fc2e39e 7513 break;
82dd0097 7514 }
8fc2e39e 7515 used_at = 1;
c80c840e 7516 macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
67c0d1eb
RS
7517 macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
7518 macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
7519 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
771c7ce4
TS
7520 break;
7521
252b5132 7522 case M_ROL:
fef14a42 7523 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
82dd0097
CD
7524 {
7525 if (dreg == sreg)
7526 {
7527 tempreg = AT;
7528 used_at = 1;
7529 }
7530 else
7531 {
7532 tempreg = dreg;
82dd0097 7533 }
67c0d1eb
RS
7534 macro_build (NULL, "negu", "d,w", tempreg, treg);
7535 macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
8fc2e39e 7536 break;
82dd0097 7537 }
8fc2e39e 7538 used_at = 1;
c80c840e 7539 macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
67c0d1eb
RS
7540 macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
7541 macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
7542 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
252b5132
RH
7543 break;
7544
771c7ce4
TS
7545 case M_DROL_I:
7546 {
7547 unsigned int rot;
91d6fa6a
NC
7548 char *l;
7549 char *rr;
771c7ce4
TS
7550
7551 if (imm_expr.X_op != O_constant)
82dd0097 7552 as_bad (_("Improper rotate count"));
771c7ce4 7553 rot = imm_expr.X_add_number & 0x3f;
fef14a42 7554 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
60b63b72
RS
7555 {
7556 rot = (64 - rot) & 0x3f;
7557 if (rot >= 32)
67c0d1eb 7558 macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
60b63b72 7559 else
67c0d1eb 7560 macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
8fc2e39e 7561 break;
60b63b72 7562 }
483fc7cd 7563 if (rot == 0)
483fc7cd 7564 {
67c0d1eb 7565 macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
8fc2e39e 7566 break;
483fc7cd 7567 }
82dd0097 7568 l = (rot < 0x20) ? "dsll" : "dsll32";
91d6fa6a 7569 rr = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
82dd0097 7570 rot &= 0x1f;
8fc2e39e 7571 used_at = 1;
67c0d1eb 7572 macro_build (NULL, l, "d,w,<", AT, sreg, rot);
91d6fa6a 7573 macro_build (NULL, rr, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
67c0d1eb 7574 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
771c7ce4
TS
7575 }
7576 break;
7577
252b5132 7578 case M_ROL_I:
771c7ce4
TS
7579 {
7580 unsigned int rot;
7581
7582 if (imm_expr.X_op != O_constant)
82dd0097 7583 as_bad (_("Improper rotate count"));
771c7ce4 7584 rot = imm_expr.X_add_number & 0x1f;
fef14a42 7585 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
60b63b72 7586 {
67c0d1eb 7587 macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
8fc2e39e 7588 break;
60b63b72 7589 }
483fc7cd 7590 if (rot == 0)
483fc7cd 7591 {
67c0d1eb 7592 macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
8fc2e39e 7593 break;
483fc7cd 7594 }
8fc2e39e 7595 used_at = 1;
67c0d1eb
RS
7596 macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
7597 macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7598 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
771c7ce4
TS
7599 }
7600 break;
7601
7602 case M_DROR:
fef14a42 7603 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
82dd0097 7604 {
67c0d1eb 7605 macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
8fc2e39e 7606 break;
82dd0097 7607 }
8fc2e39e 7608 used_at = 1;
c80c840e 7609 macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
67c0d1eb
RS
7610 macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
7611 macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
7612 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
252b5132
RH
7613 break;
7614
7615 case M_ROR:
fef14a42 7616 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
82dd0097 7617 {
67c0d1eb 7618 macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
8fc2e39e 7619 break;
82dd0097 7620 }
8fc2e39e 7621 used_at = 1;
c80c840e 7622 macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
67c0d1eb
RS
7623 macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7624 macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7625 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
252b5132
RH
7626 break;
7627
771c7ce4
TS
7628 case M_DROR_I:
7629 {
7630 unsigned int rot;
91d6fa6a
NC
7631 char *l;
7632 char *rr;
771c7ce4
TS
7633
7634 if (imm_expr.X_op != O_constant)
82dd0097 7635 as_bad (_("Improper rotate count"));
771c7ce4 7636 rot = imm_expr.X_add_number & 0x3f;
fef14a42 7637 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
82dd0097
CD
7638 {
7639 if (rot >= 32)
67c0d1eb 7640 macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
82dd0097 7641 else
67c0d1eb 7642 macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
8fc2e39e 7643 break;
82dd0097 7644 }
483fc7cd 7645 if (rot == 0)
483fc7cd 7646 {
67c0d1eb 7647 macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
8fc2e39e 7648 break;
483fc7cd 7649 }
91d6fa6a 7650 rr = (rot < 0x20) ? "dsrl" : "dsrl32";
82dd0097
CD
7651 l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7652 rot &= 0x1f;
8fc2e39e 7653 used_at = 1;
91d6fa6a 7654 macro_build (NULL, rr, "d,w,<", AT, sreg, rot);
67c0d1eb
RS
7655 macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7656 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
771c7ce4
TS
7657 }
7658 break;
7659
252b5132 7660 case M_ROR_I:
771c7ce4
TS
7661 {
7662 unsigned int rot;
7663
7664 if (imm_expr.X_op != O_constant)
82dd0097 7665 as_bad (_("Improper rotate count"));
771c7ce4 7666 rot = imm_expr.X_add_number & 0x1f;
fef14a42 7667 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
82dd0097 7668 {
67c0d1eb 7669 macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
8fc2e39e 7670 break;
82dd0097 7671 }
483fc7cd 7672 if (rot == 0)
483fc7cd 7673 {
67c0d1eb 7674 macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
8fc2e39e 7675 break;
483fc7cd 7676 }
8fc2e39e 7677 used_at = 1;
67c0d1eb
RS
7678 macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7679 macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7680 macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
771c7ce4 7681 }
252b5132
RH
7682 break;
7683
252b5132
RH
7684 case M_SEQ:
7685 if (sreg == 0)
67c0d1eb 7686 macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
252b5132 7687 else if (treg == 0)
67c0d1eb 7688 macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
252b5132
RH
7689 else
7690 {
67c0d1eb
RS
7691 macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7692 macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
252b5132 7693 }
8fc2e39e 7694 break;
252b5132
RH
7695
7696 case M_SEQ_I:
7697 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7698 {
67c0d1eb 7699 macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
8fc2e39e 7700 break;
252b5132
RH
7701 }
7702 if (sreg == 0)
7703 {
7704 as_warn (_("Instruction %s: result is always false"),
7705 ip->insn_mo->name);
67c0d1eb 7706 move_register (dreg, 0);
8fc2e39e 7707 break;
252b5132 7708 }
dd3cbb7e
NC
7709 if (CPU_HAS_SEQ (mips_opts.arch)
7710 && -512 <= imm_expr.X_add_number
7711 && imm_expr.X_add_number < 512)
7712 {
7713 macro_build (NULL, "seqi", "t,r,+Q", dreg, sreg,
750bdd57 7714 (int) imm_expr.X_add_number);
dd3cbb7e
NC
7715 break;
7716 }
252b5132
RH
7717 if (imm_expr.X_op == O_constant
7718 && imm_expr.X_add_number >= 0
7719 && imm_expr.X_add_number < 0x10000)
7720 {
67c0d1eb 7721 macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
252b5132
RH
7722 }
7723 else if (imm_expr.X_op == O_constant
7724 && imm_expr.X_add_number > -0x8000
7725 && imm_expr.X_add_number < 0)
7726 {
7727 imm_expr.X_add_number = -imm_expr.X_add_number;
67c0d1eb 7728 macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
17a2f251 7729 "t,r,j", dreg, sreg, BFD_RELOC_LO16);
252b5132 7730 }
dd3cbb7e
NC
7731 else if (CPU_HAS_SEQ (mips_opts.arch))
7732 {
7733 used_at = 1;
7734 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7735 macro_build (NULL, "seq", "d,v,t", dreg, sreg, AT);
7736 break;
7737 }
252b5132
RH
7738 else
7739 {
67c0d1eb
RS
7740 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7741 macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
252b5132
RH
7742 used_at = 1;
7743 }
67c0d1eb 7744 macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
8fc2e39e 7745 break;
252b5132
RH
7746
7747 case M_SGE: /* sreg >= treg <==> not (sreg < treg) */
7748 s = "slt";
7749 goto sge;
7750 case M_SGEU:
7751 s = "sltu";
7752 sge:
67c0d1eb
RS
7753 macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
7754 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
8fc2e39e 7755 break;
252b5132
RH
7756
7757 case M_SGE_I: /* sreg >= I <==> not (sreg < I) */
7758 case M_SGEU_I:
7759 if (imm_expr.X_op == O_constant
7760 && imm_expr.X_add_number >= -0x8000
7761 && imm_expr.X_add_number < 0x8000)
7762 {
67c0d1eb
RS
7763 macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
7764 dreg, sreg, BFD_RELOC_LO16);
252b5132
RH
7765 }
7766 else
7767 {
67c0d1eb
RS
7768 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7769 macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
7770 dreg, sreg, AT);
252b5132
RH
7771 used_at = 1;
7772 }
67c0d1eb 7773 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
8fc2e39e 7774 break;
252b5132
RH
7775
7776 case M_SGT: /* sreg > treg <==> treg < sreg */
7777 s = "slt";
7778 goto sgt;
7779 case M_SGTU:
7780 s = "sltu";
7781 sgt:
67c0d1eb 7782 macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
8fc2e39e 7783 break;
252b5132
RH
7784
7785 case M_SGT_I: /* sreg > I <==> I < sreg */
7786 s = "slt";
7787 goto sgti;
7788 case M_SGTU_I:
7789 s = "sltu";
7790 sgti:
8fc2e39e 7791 used_at = 1;
67c0d1eb
RS
7792 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7793 macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
252b5132
RH
7794 break;
7795
2396cfb9 7796 case M_SLE: /* sreg <= treg <==> treg >= sreg <==> not (treg < sreg) */
252b5132
RH
7797 s = "slt";
7798 goto sle;
7799 case M_SLEU:
7800 s = "sltu";
7801 sle:
67c0d1eb
RS
7802 macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7803 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
8fc2e39e 7804 break;
252b5132 7805
2396cfb9 7806 case M_SLE_I: /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
252b5132
RH
7807 s = "slt";
7808 goto slei;
7809 case M_SLEU_I:
7810 s = "sltu";
7811 slei:
8fc2e39e 7812 used_at = 1;
67c0d1eb
RS
7813 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7814 macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7815 macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
252b5132
RH
7816 break;
7817
7818 case M_SLT_I:
7819 if (imm_expr.X_op == O_constant
7820 && imm_expr.X_add_number >= -0x8000
7821 && imm_expr.X_add_number < 0x8000)
7822 {
67c0d1eb 7823 macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
8fc2e39e 7824 break;
252b5132 7825 }
8fc2e39e 7826 used_at = 1;
67c0d1eb
RS
7827 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7828 macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
252b5132
RH
7829 break;
7830
7831 case M_SLTU_I:
7832 if (imm_expr.X_op == O_constant
7833 && imm_expr.X_add_number >= -0x8000
7834 && imm_expr.X_add_number < 0x8000)
7835 {
67c0d1eb 7836 macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
17a2f251 7837 BFD_RELOC_LO16);
8fc2e39e 7838 break;
252b5132 7839 }
8fc2e39e 7840 used_at = 1;
67c0d1eb
RS
7841 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7842 macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
252b5132
RH
7843 break;
7844
7845 case M_SNE:
7846 if (sreg == 0)
67c0d1eb 7847 macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
252b5132 7848 else if (treg == 0)
67c0d1eb 7849 macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
252b5132
RH
7850 else
7851 {
67c0d1eb
RS
7852 macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7853 macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
252b5132 7854 }
8fc2e39e 7855 break;
252b5132
RH
7856
7857 case M_SNE_I:
7858 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7859 {
67c0d1eb 7860 macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
8fc2e39e 7861 break;
252b5132
RH
7862 }
7863 if (sreg == 0)
7864 {
7865 as_warn (_("Instruction %s: result is always true"),
7866 ip->insn_mo->name);
67c0d1eb
RS
7867 macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
7868 dreg, 0, BFD_RELOC_LO16);
8fc2e39e 7869 break;
252b5132 7870 }
dd3cbb7e
NC
7871 if (CPU_HAS_SEQ (mips_opts.arch)
7872 && -512 <= imm_expr.X_add_number
7873 && imm_expr.X_add_number < 512)
7874 {
7875 macro_build (NULL, "snei", "t,r,+Q", dreg, sreg,
750bdd57 7876 (int) imm_expr.X_add_number);
dd3cbb7e
NC
7877 break;
7878 }
252b5132
RH
7879 if (imm_expr.X_op == O_constant
7880 && imm_expr.X_add_number >= 0
7881 && imm_expr.X_add_number < 0x10000)
7882 {
67c0d1eb 7883 macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
252b5132
RH
7884 }
7885 else if (imm_expr.X_op == O_constant
7886 && imm_expr.X_add_number > -0x8000
7887 && imm_expr.X_add_number < 0)
7888 {
7889 imm_expr.X_add_number = -imm_expr.X_add_number;
67c0d1eb 7890 macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
17a2f251 7891 "t,r,j", dreg, sreg, BFD_RELOC_LO16);
252b5132 7892 }
dd3cbb7e
NC
7893 else if (CPU_HAS_SEQ (mips_opts.arch))
7894 {
7895 used_at = 1;
7896 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7897 macro_build (NULL, "sne", "d,v,t", dreg, sreg, AT);
7898 break;
7899 }
252b5132
RH
7900 else
7901 {
67c0d1eb
RS
7902 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7903 macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
252b5132
RH
7904 used_at = 1;
7905 }
67c0d1eb 7906 macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
8fc2e39e 7907 break;
252b5132
RH
7908
7909 case M_DSUB_I:
7910 dbl = 1;
7911 case M_SUB_I:
7912 if (imm_expr.X_op == O_constant
7913 && imm_expr.X_add_number > -0x8000
7914 && imm_expr.X_add_number <= 0x8000)
7915 {
7916 imm_expr.X_add_number = -imm_expr.X_add_number;
67c0d1eb
RS
7917 macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
7918 dreg, sreg, BFD_RELOC_LO16);
8fc2e39e 7919 break;
252b5132 7920 }
8fc2e39e 7921 used_at = 1;
67c0d1eb
RS
7922 load_register (AT, &imm_expr, dbl);
7923 macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
252b5132
RH
7924 break;
7925
7926 case M_DSUBU_I:
7927 dbl = 1;
7928 case M_SUBU_I:
7929 if (imm_expr.X_op == O_constant
7930 && imm_expr.X_add_number > -0x8000
7931 && imm_expr.X_add_number <= 0x8000)
7932 {
7933 imm_expr.X_add_number = -imm_expr.X_add_number;
67c0d1eb
RS
7934 macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
7935 dreg, sreg, BFD_RELOC_LO16);
8fc2e39e 7936 break;
252b5132 7937 }
8fc2e39e 7938 used_at = 1;
67c0d1eb
RS
7939 load_register (AT, &imm_expr, dbl);
7940 macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
252b5132
RH
7941 break;
7942
7943 case M_TEQ_I:
7944 s = "teq";
7945 goto trap;
7946 case M_TGE_I:
7947 s = "tge";
7948 goto trap;
7949 case M_TGEU_I:
7950 s = "tgeu";
7951 goto trap;
7952 case M_TLT_I:
7953 s = "tlt";
7954 goto trap;
7955 case M_TLTU_I:
7956 s = "tltu";
7957 goto trap;
7958 case M_TNE_I:
7959 s = "tne";
7960 trap:
8fc2e39e 7961 used_at = 1;
67c0d1eb
RS
7962 load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7963 macro_build (NULL, s, "s,t", sreg, AT);
252b5132
RH
7964 break;
7965
252b5132 7966 case M_TRUNCWS:
43841e91 7967 case M_TRUNCWD:
9c2799c2 7968 gas_assert (mips_opts.isa == ISA_MIPS1);
8fc2e39e 7969 used_at = 1;
252b5132
RH
7970 sreg = (ip->insn_opcode >> 11) & 0x1f; /* floating reg */
7971 dreg = (ip->insn_opcode >> 06) & 0x1f; /* floating reg */
7972
7973 /*
7974 * Is the double cfc1 instruction a bug in the mips assembler;
7975 * or is there a reason for it?
7976 */
7d10b47d 7977 start_noreorder ();
67c0d1eb
RS
7978 macro_build (NULL, "cfc1", "t,G", treg, RA);
7979 macro_build (NULL, "cfc1", "t,G", treg, RA);
7980 macro_build (NULL, "nop", "");
252b5132 7981 expr1.X_add_number = 3;
67c0d1eb 7982 macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
252b5132 7983 expr1.X_add_number = 2;
67c0d1eb
RS
7984 macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
7985 macro_build (NULL, "ctc1", "t,G", AT, RA);
7986 macro_build (NULL, "nop", "");
7987 macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
7988 dreg, sreg);
7989 macro_build (NULL, "ctc1", "t,G", treg, RA);
7990 macro_build (NULL, "nop", "");
7d10b47d 7991 end_noreorder ();
252b5132
RH
7992 break;
7993
7994 case M_ULH:
7995 s = "lb";
7996 goto ulh;
7997 case M_ULHU:
7998 s = "lbu";
7999 ulh:
8fc2e39e 8000 used_at = 1;
252b5132 8001 if (offset_expr.X_add_number >= 0x7fff)
f71d0d44 8002 as_bad (_("Operand overflow"));
90ecf173 8003 if (!target_big_endian)
f9419b05 8004 ++offset_expr.X_add_number;
67c0d1eb 8005 macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
90ecf173 8006 if (!target_big_endian)
f9419b05 8007 --offset_expr.X_add_number;
252b5132 8008 else
f9419b05 8009 ++offset_expr.X_add_number;
67c0d1eb
RS
8010 macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8011 macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
8012 macro_build (NULL, "or", "d,v,t", treg, treg, AT);
252b5132
RH
8013 break;
8014
8015 case M_ULD:
8016 s = "ldl";
8017 s2 = "ldr";
8018 off = 7;
8019 goto ulw;
8020 case M_ULW:
8021 s = "lwl";
8022 s2 = "lwr";
8023 off = 3;
8024 ulw:
8025 if (offset_expr.X_add_number >= 0x8000 - off)
f71d0d44 8026 as_bad (_("Operand overflow"));
af22f5b2
CD
8027 if (treg != breg)
8028 tempreg = treg;
8029 else
8fc2e39e
TS
8030 {
8031 used_at = 1;
8032 tempreg = AT;
8033 }
90ecf173 8034 if (!target_big_endian)
252b5132 8035 offset_expr.X_add_number += off;
67c0d1eb 8036 macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
90ecf173 8037 if (!target_big_endian)
252b5132
RH
8038 offset_expr.X_add_number -= off;
8039 else
8040 offset_expr.X_add_number += off;
67c0d1eb 8041 macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
af22f5b2 8042
90ecf173 8043 /* If necessary, move the result in tempreg to the final destination. */
af22f5b2 8044 if (treg == tempreg)
8fc2e39e 8045 break;
af22f5b2 8046 /* Protect second load's delay slot. */
017315e4 8047 load_delay_nop ();
67c0d1eb 8048 move_register (treg, tempreg);
af22f5b2 8049 break;
252b5132
RH
8050
8051 case M_ULD_A:
8052 s = "ldl";
8053 s2 = "ldr";
8054 off = 7;
8055 goto ulwa;
8056 case M_ULW_A:
8057 s = "lwl";
8058 s2 = "lwr";
8059 off = 3;
8060 ulwa:
d6bc6245 8061 used_at = 1;
67c0d1eb 8062 load_address (AT, &offset_expr, &used_at);
252b5132 8063 if (breg != 0)
67c0d1eb 8064 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
90ecf173 8065 if (!target_big_endian)
252b5132
RH
8066 expr1.X_add_number = off;
8067 else
8068 expr1.X_add_number = 0;
67c0d1eb 8069 macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
90ecf173 8070 if (!target_big_endian)
252b5132
RH
8071 expr1.X_add_number = 0;
8072 else
8073 expr1.X_add_number = off;
67c0d1eb 8074 macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
252b5132
RH
8075 break;
8076
8077 case M_ULH_A:
8078 case M_ULHU_A:
d6bc6245 8079 used_at = 1;
67c0d1eb 8080 load_address (AT, &offset_expr, &used_at);
252b5132 8081 if (breg != 0)
67c0d1eb 8082 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
252b5132
RH
8083 if (target_big_endian)
8084 expr1.X_add_number = 0;
67c0d1eb 8085 macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
17a2f251 8086 treg, BFD_RELOC_LO16, AT);
252b5132
RH
8087 if (target_big_endian)
8088 expr1.X_add_number = 1;
8089 else
8090 expr1.X_add_number = 0;
67c0d1eb
RS
8091 macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8092 macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8093 macro_build (NULL, "or", "d,v,t", treg, treg, AT);
252b5132
RH
8094 break;
8095
8096 case M_USH:
8fc2e39e 8097 used_at = 1;
252b5132 8098 if (offset_expr.X_add_number >= 0x7fff)
f71d0d44 8099 as_bad (_("Operand overflow"));
252b5132 8100 if (target_big_endian)
f9419b05 8101 ++offset_expr.X_add_number;
67c0d1eb
RS
8102 macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8103 macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
252b5132 8104 if (target_big_endian)
f9419b05 8105 --offset_expr.X_add_number;
252b5132 8106 else
f9419b05 8107 ++offset_expr.X_add_number;
67c0d1eb 8108 macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
252b5132
RH
8109 break;
8110
8111 case M_USD:
8112 s = "sdl";
8113 s2 = "sdr";
8114 off = 7;
8115 goto usw;
8116 case M_USW:
8117 s = "swl";
8118 s2 = "swr";
8119 off = 3;
8120 usw:
8121 if (offset_expr.X_add_number >= 0x8000 - off)
f71d0d44 8122 as_bad (_("Operand overflow"));
90ecf173 8123 if (!target_big_endian)
252b5132 8124 offset_expr.X_add_number += off;
67c0d1eb 8125 macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
90ecf173 8126 if (!target_big_endian)
252b5132
RH
8127 offset_expr.X_add_number -= off;
8128 else
8129 offset_expr.X_add_number += off;
67c0d1eb 8130 macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8fc2e39e 8131 break;
252b5132
RH
8132
8133 case M_USD_A:
8134 s = "sdl";
8135 s2 = "sdr";
8136 off = 7;
8137 goto uswa;
8138 case M_USW_A:
8139 s = "swl";
8140 s2 = "swr";
8141 off = 3;
8142 uswa:
d6bc6245 8143 used_at = 1;
67c0d1eb 8144 load_address (AT, &offset_expr, &used_at);
252b5132 8145 if (breg != 0)
67c0d1eb 8146 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
90ecf173 8147 if (!target_big_endian)
252b5132
RH
8148 expr1.X_add_number = off;
8149 else
8150 expr1.X_add_number = 0;
67c0d1eb 8151 macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
90ecf173 8152 if (!target_big_endian)
252b5132
RH
8153 expr1.X_add_number = 0;
8154 else
8155 expr1.X_add_number = off;
67c0d1eb 8156 macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
252b5132
RH
8157 break;
8158
8159 case M_USH_A:
d6bc6245 8160 used_at = 1;
67c0d1eb 8161 load_address (AT, &offset_expr, &used_at);
252b5132 8162 if (breg != 0)
67c0d1eb 8163 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
90ecf173 8164 if (!target_big_endian)
252b5132 8165 expr1.X_add_number = 0;
67c0d1eb
RS
8166 macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8167 macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
90ecf173 8168 if (!target_big_endian)
252b5132
RH
8169 expr1.X_add_number = 1;
8170 else
8171 expr1.X_add_number = 0;
67c0d1eb 8172 macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
90ecf173 8173 if (!target_big_endian)
252b5132
RH
8174 expr1.X_add_number = 0;
8175 else
8176 expr1.X_add_number = 1;
67c0d1eb
RS
8177 macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8178 macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8179 macro_build (NULL, "or", "d,v,t", treg, treg, AT);
252b5132
RH
8180 break;
8181
8182 default:
8183 /* FIXME: Check if this is one of the itbl macros, since they
bdaaa2e1 8184 are added dynamically. */
252b5132
RH
8185 as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
8186 break;
8187 }
741fe287 8188 if (!mips_opts.at && used_at)
8fc2e39e 8189 as_bad (_("Macro used $at after \".set noat\""));
252b5132
RH
8190}
8191
8192/* Implement macros in mips16 mode. */
8193
8194static void
17a2f251 8195mips16_macro (struct mips_cl_insn *ip)
252b5132
RH
8196{
8197 int mask;
8198 int xreg, yreg, zreg, tmp;
252b5132
RH
8199 expressionS expr1;
8200 int dbl;
8201 const char *s, *s2, *s3;
8202
8203 mask = ip->insn_mo->mask;
8204
bf12938e
RS
8205 xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
8206 yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
8207 zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
252b5132 8208
252b5132
RH
8209 expr1.X_op = O_constant;
8210 expr1.X_op_symbol = NULL;
8211 expr1.X_add_symbol = NULL;
8212 expr1.X_add_number = 1;
8213
8214 dbl = 0;
8215
8216 switch (mask)
8217 {
8218 default:
8219 internalError ();
8220
8221 case M_DDIV_3:
8222 dbl = 1;
8223 case M_DIV_3:
8224 s = "mflo";
8225 goto do_div3;
8226 case M_DREM_3:
8227 dbl = 1;
8228 case M_REM_3:
8229 s = "mfhi";
8230 do_div3:
7d10b47d 8231 start_noreorder ();
67c0d1eb 8232 macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
252b5132 8233 expr1.X_add_number = 2;
67c0d1eb
RS
8234 macro_build (&expr1, "bnez", "x,p", yreg);
8235 macro_build (NULL, "break", "6", 7);
bdaaa2e1 8236
252b5132
RH
8237 /* FIXME: The normal code checks for of -1 / -0x80000000 here,
8238 since that causes an overflow. We should do that as well,
8239 but I don't see how to do the comparisons without a temporary
8240 register. */
7d10b47d 8241 end_noreorder ();
67c0d1eb 8242 macro_build (NULL, s, "x", zreg);
252b5132
RH
8243 break;
8244
8245 case M_DIVU_3:
8246 s = "divu";
8247 s2 = "mflo";
8248 goto do_divu3;
8249 case M_REMU_3:
8250 s = "divu";
8251 s2 = "mfhi";
8252 goto do_divu3;
8253 case M_DDIVU_3:
8254 s = "ddivu";
8255 s2 = "mflo";
8256 goto do_divu3;
8257 case M_DREMU_3:
8258 s = "ddivu";
8259 s2 = "mfhi";
8260 do_divu3:
7d10b47d 8261 start_noreorder ();
67c0d1eb 8262 macro_build (NULL, s, "0,x,y", xreg, yreg);
252b5132 8263 expr1.X_add_number = 2;
67c0d1eb
RS
8264 macro_build (&expr1, "bnez", "x,p", yreg);
8265 macro_build (NULL, "break", "6", 7);
7d10b47d 8266 end_noreorder ();
67c0d1eb 8267 macro_build (NULL, s2, "x", zreg);
252b5132
RH
8268 break;
8269
8270 case M_DMUL:
8271 dbl = 1;
8272 case M_MUL:
67c0d1eb
RS
8273 macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
8274 macro_build (NULL, "mflo", "x", zreg);
8fc2e39e 8275 break;
252b5132
RH
8276
8277 case M_DSUBU_I:
8278 dbl = 1;
8279 goto do_subu;
8280 case M_SUBU_I:
8281 do_subu:
8282 if (imm_expr.X_op != O_constant)
8283 as_bad (_("Unsupported large constant"));
8284 imm_expr.X_add_number = -imm_expr.X_add_number;
67c0d1eb 8285 macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
252b5132
RH
8286 break;
8287
8288 case M_SUBU_I_2:
8289 if (imm_expr.X_op != O_constant)
8290 as_bad (_("Unsupported large constant"));
8291 imm_expr.X_add_number = -imm_expr.X_add_number;
67c0d1eb 8292 macro_build (&imm_expr, "addiu", "x,k", xreg);
252b5132
RH
8293 break;
8294
8295 case M_DSUBU_I_2:
8296 if (imm_expr.X_op != O_constant)
8297 as_bad (_("Unsupported large constant"));
8298 imm_expr.X_add_number = -imm_expr.X_add_number;
67c0d1eb 8299 macro_build (&imm_expr, "daddiu", "y,j", yreg);
252b5132
RH
8300 break;
8301
8302 case M_BEQ:
8303 s = "cmp";
8304 s2 = "bteqz";
8305 goto do_branch;
8306 case M_BNE:
8307 s = "cmp";
8308 s2 = "btnez";
8309 goto do_branch;
8310 case M_BLT:
8311 s = "slt";
8312 s2 = "btnez";
8313 goto do_branch;
8314 case M_BLTU:
8315 s = "sltu";
8316 s2 = "btnez";
8317 goto do_branch;
8318 case M_BLE:
8319 s = "slt";
8320 s2 = "bteqz";
8321 goto do_reverse_branch;
8322 case M_BLEU:
8323 s = "sltu";
8324 s2 = "bteqz";
8325 goto do_reverse_branch;
8326 case M_BGE:
8327 s = "slt";
8328 s2 = "bteqz";
8329 goto do_branch;
8330 case M_BGEU:
8331 s = "sltu";
8332 s2 = "bteqz";
8333 goto do_branch;
8334 case M_BGT:
8335 s = "slt";
8336 s2 = "btnez";
8337 goto do_reverse_branch;
8338 case M_BGTU:
8339 s = "sltu";
8340 s2 = "btnez";
8341
8342 do_reverse_branch:
8343 tmp = xreg;
8344 xreg = yreg;
8345 yreg = tmp;
8346
8347 do_branch:
67c0d1eb
RS
8348 macro_build (NULL, s, "x,y", xreg, yreg);
8349 macro_build (&offset_expr, s2, "p");
252b5132
RH
8350 break;
8351
8352 case M_BEQ_I:
8353 s = "cmpi";
8354 s2 = "bteqz";
8355 s3 = "x,U";
8356 goto do_branch_i;
8357 case M_BNE_I:
8358 s = "cmpi";
8359 s2 = "btnez";
8360 s3 = "x,U";
8361 goto do_branch_i;
8362 case M_BLT_I:
8363 s = "slti";
8364 s2 = "btnez";
8365 s3 = "x,8";
8366 goto do_branch_i;
8367 case M_BLTU_I:
8368 s = "sltiu";
8369 s2 = "btnez";
8370 s3 = "x,8";
8371 goto do_branch_i;
8372 case M_BLE_I:
8373 s = "slti";
8374 s2 = "btnez";
8375 s3 = "x,8";
8376 goto do_addone_branch_i;
8377 case M_BLEU_I:
8378 s = "sltiu";
8379 s2 = "btnez";
8380 s3 = "x,8";
8381 goto do_addone_branch_i;
8382 case M_BGE_I:
8383 s = "slti";
8384 s2 = "bteqz";
8385 s3 = "x,8";
8386 goto do_branch_i;
8387 case M_BGEU_I:
8388 s = "sltiu";
8389 s2 = "bteqz";
8390 s3 = "x,8";
8391 goto do_branch_i;
8392 case M_BGT_I:
8393 s = "slti";
8394 s2 = "bteqz";
8395 s3 = "x,8";
8396 goto do_addone_branch_i;
8397 case M_BGTU_I:
8398 s = "sltiu";
8399 s2 = "bteqz";
8400 s3 = "x,8";
8401
8402 do_addone_branch_i:
8403 if (imm_expr.X_op != O_constant)
8404 as_bad (_("Unsupported large constant"));
8405 ++imm_expr.X_add_number;
8406
8407 do_branch_i:
67c0d1eb
RS
8408 macro_build (&imm_expr, s, s3, xreg);
8409 macro_build (&offset_expr, s2, "p");
252b5132
RH
8410 break;
8411
8412 case M_ABS:
8413 expr1.X_add_number = 0;
67c0d1eb 8414 macro_build (&expr1, "slti", "x,8", yreg);
252b5132 8415 if (xreg != yreg)
67c0d1eb 8416 move_register (xreg, yreg);
252b5132 8417 expr1.X_add_number = 2;
67c0d1eb
RS
8418 macro_build (&expr1, "bteqz", "p");
8419 macro_build (NULL, "neg", "x,w", xreg, xreg);
252b5132
RH
8420 }
8421}
8422
8423/* For consistency checking, verify that all bits are specified either
8424 by the match/mask part of the instruction definition, or by the
8425 operand list. */
8426static int
17a2f251 8427validate_mips_insn (const struct mips_opcode *opc)
252b5132
RH
8428{
8429 const char *p = opc->args;
8430 char c;
8431 unsigned long used_bits = opc->mask;
8432
8433 if ((used_bits & opc->match) != opc->match)
8434 {
8435 as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8436 opc->name, opc->args);
8437 return 0;
8438 }
8439#define USE_BITS(mask,shift) (used_bits |= ((mask) << (shift)))
8440 while (*p)
8441 switch (c = *p++)
8442 {
8443 case ',': break;
8444 case '(': break;
8445 case ')': break;
af7ee8bf
CD
8446 case '+':
8447 switch (c = *p++)
8448 {
9bcd4f99
TS
8449 case '1': USE_BITS (OP_MASK_UDI1, OP_SH_UDI1); break;
8450 case '2': USE_BITS (OP_MASK_UDI2, OP_SH_UDI2); break;
8451 case '3': USE_BITS (OP_MASK_UDI3, OP_SH_UDI3); break;
8452 case '4': USE_BITS (OP_MASK_UDI4, OP_SH_UDI4); break;
af7ee8bf
CD
8453 case 'A': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8454 case 'B': USE_BITS (OP_MASK_INSMSB, OP_SH_INSMSB); break;
8455 case 'C': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
bbcc0807
CD
8456 case 'D': USE_BITS (OP_MASK_RD, OP_SH_RD);
8457 USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
5f74bc13
CD
8458 case 'E': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8459 case 'F': USE_BITS (OP_MASK_INSMSB, OP_SH_INSMSB); break;
8460 case 'G': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
8461 case 'H': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
8462 case 'I': break;
ef2e4d86
CF
8463 case 't': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8464 case 'T': USE_BITS (OP_MASK_RT, OP_SH_RT);
8465 USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
bb35fb24
NC
8466 case 'x': USE_BITS (OP_MASK_BBITIND, OP_SH_BBITIND); break;
8467 case 'X': USE_BITS (OP_MASK_BBITIND, OP_SH_BBITIND); break;
8468 case 'p': USE_BITS (OP_MASK_CINSPOS, OP_SH_CINSPOS); break;
8469 case 'P': USE_BITS (OP_MASK_CINSPOS, OP_SH_CINSPOS); break;
dd3cbb7e 8470 case 'Q': USE_BITS (OP_MASK_SEQI, OP_SH_SEQI); break;
bb35fb24
NC
8471 case 's': USE_BITS (OP_MASK_CINSLM1, OP_SH_CINSLM1); break;
8472 case 'S': USE_BITS (OP_MASK_CINSLM1, OP_SH_CINSLM1); break;
8473
af7ee8bf
CD
8474 default:
8475 as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8476 c, opc->name, opc->args);
8477 return 0;
8478 }
8479 break;
252b5132
RH
8480 case '<': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8481 case '>': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8482 case 'A': break;
4372b673 8483 case 'B': USE_BITS (OP_MASK_CODE20, OP_SH_CODE20); break;
252b5132
RH
8484 case 'C': USE_BITS (OP_MASK_COPZ, OP_SH_COPZ); break;
8485 case 'D': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
8486 case 'E': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8487 case 'F': break;
8488 case 'G': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
156c2f8b 8489 case 'H': USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
252b5132 8490 case 'I': break;
e972090a 8491 case 'J': USE_BITS (OP_MASK_CODE19, OP_SH_CODE19); break;
af7ee8bf 8492 case 'K': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
252b5132
RH
8493 case 'L': break;
8494 case 'M': USE_BITS (OP_MASK_CCC, OP_SH_CCC); break;
8495 case 'N': USE_BITS (OP_MASK_BCC, OP_SH_BCC); break;
deec1734
CD
8496 case 'O': USE_BITS (OP_MASK_ALN, OP_SH_ALN); break;
8497 case 'Q': USE_BITS (OP_MASK_VSEL, OP_SH_VSEL);
8498 USE_BITS (OP_MASK_FT, OP_SH_FT); break;
252b5132
RH
8499 case 'R': USE_BITS (OP_MASK_FR, OP_SH_FR); break;
8500 case 'S': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8501 case 'T': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8502 case 'V': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8503 case 'W': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
deec1734
CD
8504 case 'X': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
8505 case 'Y': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8506 case 'Z': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
252b5132
RH
8507 case 'a': USE_BITS (OP_MASK_TARGET, OP_SH_TARGET); break;
8508 case 'b': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8509 case 'c': USE_BITS (OP_MASK_CODE, OP_SH_CODE); break;
8510 case 'd': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8511 case 'f': break;
8512 case 'h': USE_BITS (OP_MASK_PREFX, OP_SH_PREFX); break;
8513 case 'i': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
8514 case 'j': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8515 case 'k': USE_BITS (OP_MASK_CACHE, OP_SH_CACHE); break;
8516 case 'l': break;
8517 case 'o': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8518 case 'p': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8519 case 'q': USE_BITS (OP_MASK_CODE2, OP_SH_CODE2); break;
8520 case 'r': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8521 case 's': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8522 case 't': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8523 case 'u': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
8524 case 'v': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8525 case 'w': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8526 case 'x': break;
8527 case 'z': break;
8528 case 'P': USE_BITS (OP_MASK_PERFREG, OP_SH_PERFREG); break;
4372b673
NC
8529 case 'U': USE_BITS (OP_MASK_RD, OP_SH_RD);
8530 USE_BITS (OP_MASK_RT, OP_SH_RT); break;
60b63b72
RS
8531 case 'e': USE_BITS (OP_MASK_VECBYTE, OP_SH_VECBYTE); break;
8532 case '%': USE_BITS (OP_MASK_VECALIGN, OP_SH_VECALIGN); break;
8533 case '[': break;
8534 case ']': break;
620edafd 8535 case '1': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8b082fb1 8536 case '2': USE_BITS (OP_MASK_BP, OP_SH_BP); break;
74cd071d
CF
8537 case '3': USE_BITS (OP_MASK_SA3, OP_SH_SA3); break;
8538 case '4': USE_BITS (OP_MASK_SA4, OP_SH_SA4); break;
8539 case '5': USE_BITS (OP_MASK_IMM8, OP_SH_IMM8); break;
8540 case '6': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8541 case '7': USE_BITS (OP_MASK_DSPACC, OP_SH_DSPACC); break;
8542 case '8': USE_BITS (OP_MASK_WRDSP, OP_SH_WRDSP); break;
8543 case '9': USE_BITS (OP_MASK_DSPACC_S, OP_SH_DSPACC_S);break;
8544 case '0': USE_BITS (OP_MASK_DSPSFT, OP_SH_DSPSFT); break;
8545 case '\'': USE_BITS (OP_MASK_RDDSP, OP_SH_RDDSP); break;
8546 case ':': USE_BITS (OP_MASK_DSPSFT_7, OP_SH_DSPSFT_7);break;
8547 case '@': USE_BITS (OP_MASK_IMM10, OP_SH_IMM10); break;
ef2e4d86
CF
8548 case '!': USE_BITS (OP_MASK_MT_U, OP_SH_MT_U); break;
8549 case '$': USE_BITS (OP_MASK_MT_H, OP_SH_MT_H); break;
8550 case '*': USE_BITS (OP_MASK_MTACC_T, OP_SH_MTACC_T); break;
8551 case '&': USE_BITS (OP_MASK_MTACC_D, OP_SH_MTACC_D); break;
8552 case 'g': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
252b5132
RH
8553 default:
8554 as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8555 c, opc->name, opc->args);
8556 return 0;
8557 }
8558#undef USE_BITS
8559 if (used_bits != 0xffffffff)
8560 {
8561 as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8562 ~used_bits & 0xffffffff, opc->name, opc->args);
8563 return 0;
8564 }
8565 return 1;
8566}
8567
9bcd4f99
TS
8568/* UDI immediates. */
8569struct mips_immed {
8570 char type;
8571 unsigned int shift;
8572 unsigned long mask;
8573 const char * desc;
8574};
8575
8576static const struct mips_immed mips_immed[] = {
8577 { '1', OP_SH_UDI1, OP_MASK_UDI1, 0},
8578 { '2', OP_SH_UDI2, OP_MASK_UDI2, 0},
8579 { '3', OP_SH_UDI3, OP_MASK_UDI3, 0},
8580 { '4', OP_SH_UDI4, OP_MASK_UDI4, 0},
8581 { 0,0,0,0 }
8582};
8583
7455baf8
TS
8584/* Check whether an odd floating-point register is allowed. */
8585static int
8586mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
8587{
8588 const char *s = insn->name;
8589
8590 if (insn->pinfo == INSN_MACRO)
8591 /* Let a macro pass, we'll catch it later when it is expanded. */
8592 return 1;
8593
8594 if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
8595 {
8596 /* Allow odd registers for single-precision ops. */
8597 switch (insn->pinfo & (FP_S | FP_D))
8598 {
8599 case FP_S:
8600 case 0:
8601 return 1; /* both single precision - ok */
8602 case FP_D:
8603 return 0; /* both double precision - fail */
8604 default:
8605 break;
8606 }
8607
8608 /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand. */
8609 s = strchr (insn->name, '.');
8610 if (argnum == 2)
8611 s = s != NULL ? strchr (s + 1, '.') : NULL;
8612 return (s != NULL && (s[1] == 'w' || s[1] == 's'));
8613 }
8614
8615 /* Single-precision coprocessor loads and moves are OK too. */
8616 if ((insn->pinfo & FP_S)
8617 && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
8618 | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
8619 return 1;
8620
8621 return 0;
8622}
8623
252b5132
RH
8624/* This routine assembles an instruction into its binary format. As a
8625 side effect, it sets one of the global variables imm_reloc or
8626 offset_reloc to the type of relocation to do if one of the operands
8627 is an address expression. */
8628
8629static void
17a2f251 8630mips_ip (char *str, struct mips_cl_insn *ip)
252b5132
RH
8631{
8632 char *s;
8633 const char *args;
43841e91 8634 char c = 0;
252b5132
RH
8635 struct mips_opcode *insn;
8636 char *argsStart;
8637 unsigned int regno;
34224acf 8638 unsigned int lastregno;
af7ee8bf 8639 unsigned int lastpos = 0;
071742cf 8640 unsigned int limlo, limhi;
252b5132
RH
8641 char *s_reset;
8642 char save_c = 0;
74cd071d 8643 offsetT min_range, max_range;
707bfff6
TS
8644 int argnum;
8645 unsigned int rtype;
252b5132
RH
8646
8647 insn_error = NULL;
8648
8649 /* If the instruction contains a '.', we first try to match an instruction
8650 including the '.'. Then we try again without the '.'. */
8651 insn = NULL;
3882b010 8652 for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
252b5132
RH
8653 continue;
8654
8655 /* If we stopped on whitespace, then replace the whitespace with null for
8656 the call to hash_find. Save the character we replaced just in case we
8657 have to re-parse the instruction. */
3882b010 8658 if (ISSPACE (*s))
252b5132
RH
8659 {
8660 save_c = *s;
8661 *s++ = '\0';
8662 }
bdaaa2e1 8663
252b5132
RH
8664 insn = (struct mips_opcode *) hash_find (op_hash, str);
8665
8666 /* If we didn't find the instruction in the opcode table, try again, but
8667 this time with just the instruction up to, but not including the
8668 first '.'. */
8669 if (insn == NULL)
8670 {
bdaaa2e1 8671 /* Restore the character we overwrite above (if any). */
252b5132
RH
8672 if (save_c)
8673 *(--s) = save_c;
8674
8675 /* Scan up to the first '.' or whitespace. */
3882b010
L
8676 for (s = str;
8677 *s != '\0' && *s != '.' && !ISSPACE (*s);
8678 ++s)
252b5132
RH
8679 continue;
8680
8681 /* If we did not find a '.', then we can quit now. */
8682 if (*s != '.')
8683 {
f71d0d44 8684 insn_error = _("Unrecognized opcode");
252b5132
RH
8685 return;
8686 }
8687
8688 /* Lookup the instruction in the hash table. */
8689 *s++ = '\0';
8690 if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8691 {
f71d0d44 8692 insn_error = _("Unrecognized opcode");
252b5132
RH
8693 return;
8694 }
252b5132
RH
8695 }
8696
8697 argsStart = s;
8698 for (;;)
8699 {
b34976b6 8700 bfd_boolean ok;
252b5132 8701
9c2799c2 8702 gas_assert (strcmp (insn->name, str) == 0);
252b5132 8703
f79e2745 8704 ok = is_opcode_valid (insn);
252b5132
RH
8705 if (! ok)
8706 {
8707 if (insn + 1 < &mips_opcodes[NUMOPCODES]
8708 && strcmp (insn->name, insn[1].name) == 0)
8709 {
8710 ++insn;
8711 continue;
8712 }
252b5132 8713 else
beae10d5 8714 {
268f6bed
L
8715 if (!insn_error)
8716 {
8717 static char buf[100];
fef14a42
TS
8718 sprintf (buf,
8719 _("opcode not supported on this processor: %s (%s)"),
8720 mips_cpu_info_from_arch (mips_opts.arch)->name,
8721 mips_cpu_info_from_isa (mips_opts.isa)->name);
268f6bed
L
8722 insn_error = buf;
8723 }
8724 if (save_c)
8725 *(--s) = save_c;
2bd7f1f3 8726 return;
252b5132 8727 }
252b5132
RH
8728 }
8729
1e915849 8730 create_insn (ip, insn);
268f6bed 8731 insn_error = NULL;
707bfff6 8732 argnum = 1;
24864476 8733 lastregno = 0xffffffff;
252b5132
RH
8734 for (args = insn->args;; ++args)
8735 {
deec1734
CD
8736 int is_mdmx;
8737
ad8d3bb3 8738 s += strspn (s, " \t");
deec1734 8739 is_mdmx = 0;
252b5132
RH
8740 switch (*args)
8741 {
8742 case '\0': /* end of args */
8743 if (*s == '\0')
8744 return;
8745 break;
8746
90ecf173 8747 case '2': /* DSP 2-bit unsigned immediate in bit 11. */
8b082fb1
TS
8748 my_getExpression (&imm_expr, s);
8749 check_absolute_expr (ip, &imm_expr);
8750 if ((unsigned long) imm_expr.X_add_number != 1
8751 && (unsigned long) imm_expr.X_add_number != 3)
8752 {
8753 as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
8754 (unsigned long) imm_expr.X_add_number);
8755 }
8756 INSERT_OPERAND (BP, *ip, imm_expr.X_add_number);
8757 imm_expr.X_op = O_absent;
8758 s = expr_end;
8759 continue;
8760
90ecf173 8761 case '3': /* DSP 3-bit unsigned immediate in bit 21. */
74cd071d
CF
8762 my_getExpression (&imm_expr, s);
8763 check_absolute_expr (ip, &imm_expr);
8764 if (imm_expr.X_add_number & ~OP_MASK_SA3)
8765 {
a9e24354
TS
8766 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8767 OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
74cd071d 8768 }
a9e24354 8769 INSERT_OPERAND (SA3, *ip, imm_expr.X_add_number);
74cd071d
CF
8770 imm_expr.X_op = O_absent;
8771 s = expr_end;
8772 continue;
8773
90ecf173 8774 case '4': /* DSP 4-bit unsigned immediate in bit 21. */
74cd071d
CF
8775 my_getExpression (&imm_expr, s);
8776 check_absolute_expr (ip, &imm_expr);
8777 if (imm_expr.X_add_number & ~OP_MASK_SA4)
8778 {
a9e24354
TS
8779 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8780 OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
74cd071d 8781 }
a9e24354 8782 INSERT_OPERAND (SA4, *ip, imm_expr.X_add_number);
74cd071d
CF
8783 imm_expr.X_op = O_absent;
8784 s = expr_end;
8785 continue;
8786
90ecf173 8787 case '5': /* DSP 8-bit unsigned immediate in bit 16. */
74cd071d
CF
8788 my_getExpression (&imm_expr, s);
8789 check_absolute_expr (ip, &imm_expr);
8790 if (imm_expr.X_add_number & ~OP_MASK_IMM8)
8791 {
a9e24354
TS
8792 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8793 OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
74cd071d 8794 }
a9e24354 8795 INSERT_OPERAND (IMM8, *ip, imm_expr.X_add_number);
74cd071d
CF
8796 imm_expr.X_op = O_absent;
8797 s = expr_end;
8798 continue;
8799
90ecf173 8800 case '6': /* DSP 5-bit unsigned immediate in bit 21. */
74cd071d
CF
8801 my_getExpression (&imm_expr, s);
8802 check_absolute_expr (ip, &imm_expr);
8803 if (imm_expr.X_add_number & ~OP_MASK_RS)
8804 {
a9e24354
TS
8805 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8806 OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
74cd071d 8807 }
a9e24354 8808 INSERT_OPERAND (RS, *ip, imm_expr.X_add_number);
74cd071d
CF
8809 imm_expr.X_op = O_absent;
8810 s = expr_end;
8811 continue;
8812
90ecf173 8813 case '7': /* Four DSP accumulators in bits 11,12. */
74cd071d
CF
8814 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8815 s[3] >= '0' && s[3] <= '3')
8816 {
8817 regno = s[3] - '0';
8818 s += 4;
a9e24354 8819 INSERT_OPERAND (DSPACC, *ip, regno);
74cd071d
CF
8820 continue;
8821 }
8822 else
8823 as_bad (_("Invalid dsp acc register"));
8824 break;
8825
90ecf173 8826 case '8': /* DSP 6-bit unsigned immediate in bit 11. */
74cd071d
CF
8827 my_getExpression (&imm_expr, s);
8828 check_absolute_expr (ip, &imm_expr);
8829 if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
8830 {
a9e24354
TS
8831 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8832 OP_MASK_WRDSP,
8833 (unsigned long) imm_expr.X_add_number);
74cd071d 8834 }
a9e24354 8835 INSERT_OPERAND (WRDSP, *ip, imm_expr.X_add_number);
74cd071d
CF
8836 imm_expr.X_op = O_absent;
8837 s = expr_end;
8838 continue;
8839
90ecf173 8840 case '9': /* Four DSP accumulators in bits 21,22. */
74cd071d
CF
8841 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8842 s[3] >= '0' && s[3] <= '3')
8843 {
8844 regno = s[3] - '0';
8845 s += 4;
a9e24354 8846 INSERT_OPERAND (DSPACC_S, *ip, regno);
74cd071d
CF
8847 continue;
8848 }
8849 else
8850 as_bad (_("Invalid dsp acc register"));
8851 break;
8852
90ecf173 8853 case '0': /* DSP 6-bit signed immediate in bit 20. */
74cd071d
CF
8854 my_getExpression (&imm_expr, s);
8855 check_absolute_expr (ip, &imm_expr);
8856 min_range = -((OP_MASK_DSPSFT + 1) >> 1);
8857 max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
8858 if (imm_expr.X_add_number < min_range ||
8859 imm_expr.X_add_number > max_range)
8860 {
a9e24354
TS
8861 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8862 (long) min_range, (long) max_range,
8863 (long) imm_expr.X_add_number);
74cd071d 8864 }
a9e24354 8865 INSERT_OPERAND (DSPSFT, *ip, imm_expr.X_add_number);
74cd071d
CF
8866 imm_expr.X_op = O_absent;
8867 s = expr_end;
8868 continue;
8869
90ecf173 8870 case '\'': /* DSP 6-bit unsigned immediate in bit 16. */
74cd071d
CF
8871 my_getExpression (&imm_expr, s);
8872 check_absolute_expr (ip, &imm_expr);
8873 if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
8874 {
a9e24354
TS
8875 as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8876 OP_MASK_RDDSP,
8877 (unsigned long) imm_expr.X_add_number);
74cd071d 8878 }
a9e24354 8879 INSERT_OPERAND (RDDSP, *ip, imm_expr.X_add_number);
74cd071d
CF
8880 imm_expr.X_op = O_absent;
8881 s = expr_end;
8882 continue;
8883
90ecf173 8884 case ':': /* DSP 7-bit signed immediate in bit 19. */
74cd071d
CF
8885 my_getExpression (&imm_expr, s);
8886 check_absolute_expr (ip, &imm_expr);
8887 min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
8888 max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
8889 if (imm_expr.X_add_number < min_range ||
8890 imm_expr.X_add_number > max_range)
8891 {
a9e24354
TS
8892 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8893 (long) min_range, (long) max_range,
8894 (long) imm_expr.X_add_number);
74cd071d 8895 }
a9e24354 8896 INSERT_OPERAND (DSPSFT_7, *ip, imm_expr.X_add_number);
74cd071d
CF
8897 imm_expr.X_op = O_absent;
8898 s = expr_end;
8899 continue;
8900
90ecf173 8901 case '@': /* DSP 10-bit signed immediate in bit 16. */
74cd071d
CF
8902 my_getExpression (&imm_expr, s);
8903 check_absolute_expr (ip, &imm_expr);
8904 min_range = -((OP_MASK_IMM10 + 1) >> 1);
8905 max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
8906 if (imm_expr.X_add_number < min_range ||
8907 imm_expr.X_add_number > max_range)
8908 {
a9e24354
TS
8909 as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8910 (long) min_range, (long) max_range,
8911 (long) imm_expr.X_add_number);
74cd071d 8912 }
a9e24354 8913 INSERT_OPERAND (IMM10, *ip, imm_expr.X_add_number);
74cd071d
CF
8914 imm_expr.X_op = O_absent;
8915 s = expr_end;
8916 continue;
8917
a9e24354 8918 case '!': /* MT usermode flag bit. */
ef2e4d86
CF
8919 my_getExpression (&imm_expr, s);
8920 check_absolute_expr (ip, &imm_expr);
8921 if (imm_expr.X_add_number & ~OP_MASK_MT_U)
a9e24354
TS
8922 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
8923 (unsigned long) imm_expr.X_add_number);
8924 INSERT_OPERAND (MT_U, *ip, imm_expr.X_add_number);
ef2e4d86
CF
8925 imm_expr.X_op = O_absent;
8926 s = expr_end;
8927 continue;
8928
a9e24354 8929 case '$': /* MT load high flag bit. */
ef2e4d86
CF
8930 my_getExpression (&imm_expr, s);
8931 check_absolute_expr (ip, &imm_expr);
8932 if (imm_expr.X_add_number & ~OP_MASK_MT_H)
a9e24354
TS
8933 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
8934 (unsigned long) imm_expr.X_add_number);
8935 INSERT_OPERAND (MT_H, *ip, imm_expr.X_add_number);
ef2e4d86
CF
8936 imm_expr.X_op = O_absent;
8937 s = expr_end;
8938 continue;
8939
90ecf173 8940 case '*': /* Four DSP accumulators in bits 18,19. */
ef2e4d86
CF
8941 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8942 s[3] >= '0' && s[3] <= '3')
8943 {
8944 regno = s[3] - '0';
8945 s += 4;
a9e24354 8946 INSERT_OPERAND (MTACC_T, *ip, regno);
ef2e4d86
CF
8947 continue;
8948 }
8949 else
8950 as_bad (_("Invalid dsp/smartmips acc register"));
8951 break;
8952
90ecf173 8953 case '&': /* Four DSP accumulators in bits 13,14. */
ef2e4d86
CF
8954 if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8955 s[3] >= '0' && s[3] <= '3')
8956 {
8957 regno = s[3] - '0';
8958 s += 4;
a9e24354 8959 INSERT_OPERAND (MTACC_D, *ip, regno);
ef2e4d86
CF
8960 continue;
8961 }
8962 else
8963 as_bad (_("Invalid dsp/smartmips acc register"));
8964 break;
8965
252b5132 8966 case ',':
a339155f 8967 ++argnum;
252b5132
RH
8968 if (*s++ == *args)
8969 continue;
8970 s--;
8971 switch (*++args)
8972 {
8973 case 'r':
8974 case 'v':
bf12938e 8975 INSERT_OPERAND (RS, *ip, lastregno);
252b5132
RH
8976 continue;
8977
8978 case 'w':
bf12938e 8979 INSERT_OPERAND (RT, *ip, lastregno);
38487616
TS
8980 continue;
8981
252b5132 8982 case 'W':
bf12938e 8983 INSERT_OPERAND (FT, *ip, lastregno);
252b5132
RH
8984 continue;
8985
8986 case 'V':
bf12938e 8987 INSERT_OPERAND (FS, *ip, lastregno);
252b5132
RH
8988 continue;
8989 }
8990 break;
8991
8992 case '(':
8993 /* Handle optional base register.
8994 Either the base register is omitted or
bdaaa2e1 8995 we must have a left paren. */
252b5132
RH
8996 /* This is dependent on the next operand specifier
8997 is a base register specification. */
f9bbfb18 8998 gas_assert (args[1] == 'b');
252b5132
RH
8999 if (*s == '\0')
9000 return;
9001
90ecf173 9002 case ')': /* These must match exactly. */
60b63b72
RS
9003 case '[':
9004 case ']':
252b5132
RH
9005 if (*s++ == *args)
9006 continue;
9007 break;
9008
af7ee8bf
CD
9009 case '+': /* Opcode extension character. */
9010 switch (*++args)
9011 {
9bcd4f99
TS
9012 case '1': /* UDI immediates. */
9013 case '2':
9014 case '3':
9015 case '4':
9016 {
9017 const struct mips_immed *imm = mips_immed;
9018
9019 while (imm->type && imm->type != *args)
9020 ++imm;
9021 if (! imm->type)
9022 internalError ();
9023 my_getExpression (&imm_expr, s);
9024 check_absolute_expr (ip, &imm_expr);
9025 if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
9026 {
9027 as_warn (_("Illegal %s number (%lu, 0x%lx)"),
9028 imm->desc ? imm->desc : ip->insn_mo->name,
9029 (unsigned long) imm_expr.X_add_number,
9030 (unsigned long) imm_expr.X_add_number);
90ecf173 9031 imm_expr.X_add_number &= imm->mask;
9bcd4f99
TS
9032 }
9033 ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
9034 << imm->shift);
9035 imm_expr.X_op = O_absent;
9036 s = expr_end;
9037 }
9038 continue;
90ecf173 9039
071742cf
CD
9040 case 'A': /* ins/ext position, becomes LSB. */
9041 limlo = 0;
9042 limhi = 31;
5f74bc13
CD
9043 goto do_lsb;
9044 case 'E':
9045 limlo = 32;
9046 limhi = 63;
9047 goto do_lsb;
90ecf173 9048 do_lsb:
071742cf
CD
9049 my_getExpression (&imm_expr, s);
9050 check_absolute_expr (ip, &imm_expr);
9051 if ((unsigned long) imm_expr.X_add_number < limlo
9052 || (unsigned long) imm_expr.X_add_number > limhi)
9053 {
9054 as_bad (_("Improper position (%lu)"),
9055 (unsigned long) imm_expr.X_add_number);
9056 imm_expr.X_add_number = limlo;
9057 }
9058 lastpos = imm_expr.X_add_number;
bf12938e 9059 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
071742cf
CD
9060 imm_expr.X_op = O_absent;
9061 s = expr_end;
9062 continue;
9063
9064 case 'B': /* ins size, becomes MSB. */
9065 limlo = 1;
9066 limhi = 32;
5f74bc13
CD
9067 goto do_msb;
9068 case 'F':
9069 limlo = 33;
9070 limhi = 64;
9071 goto do_msb;
90ecf173 9072 do_msb:
071742cf
CD
9073 my_getExpression (&imm_expr, s);
9074 check_absolute_expr (ip, &imm_expr);
9075 /* Check for negative input so that small negative numbers
9076 will not succeed incorrectly. The checks against
9077 (pos+size) transitively check "size" itself,
9078 assuming that "pos" is reasonable. */
9079 if ((long) imm_expr.X_add_number < 0
9080 || ((unsigned long) imm_expr.X_add_number
9081 + lastpos) < limlo
9082 || ((unsigned long) imm_expr.X_add_number
9083 + lastpos) > limhi)
9084 {
9085 as_bad (_("Improper insert size (%lu, position %lu)"),
9086 (unsigned long) imm_expr.X_add_number,
9087 (unsigned long) lastpos);
9088 imm_expr.X_add_number = limlo - lastpos;
9089 }
bf12938e
RS
9090 INSERT_OPERAND (INSMSB, *ip,
9091 lastpos + imm_expr.X_add_number - 1);
071742cf
CD
9092 imm_expr.X_op = O_absent;
9093 s = expr_end;
9094 continue;
9095
9096 case 'C': /* ext size, becomes MSBD. */
9097 limlo = 1;
9098 limhi = 32;
5f74bc13
CD
9099 goto do_msbd;
9100 case 'G':
9101 limlo = 33;
9102 limhi = 64;
9103 goto do_msbd;
9104 case 'H':
9105 limlo = 33;
9106 limhi = 64;
9107 goto do_msbd;
90ecf173 9108 do_msbd:
071742cf
CD
9109 my_getExpression (&imm_expr, s);
9110 check_absolute_expr (ip, &imm_expr);
9111 /* Check for negative input so that small negative numbers
9112 will not succeed incorrectly. The checks against
9113 (pos+size) transitively check "size" itself,
9114 assuming that "pos" is reasonable. */
9115 if ((long) imm_expr.X_add_number < 0
9116 || ((unsigned long) imm_expr.X_add_number
9117 + lastpos) < limlo
9118 || ((unsigned long) imm_expr.X_add_number
9119 + lastpos) > limhi)
9120 {
9121 as_bad (_("Improper extract size (%lu, position %lu)"),
9122 (unsigned long) imm_expr.X_add_number,
9123 (unsigned long) lastpos);
9124 imm_expr.X_add_number = limlo - lastpos;
9125 }
bf12938e 9126 INSERT_OPERAND (EXTMSBD, *ip, imm_expr.X_add_number - 1);
071742cf
CD
9127 imm_expr.X_op = O_absent;
9128 s = expr_end;
9129 continue;
af7ee8bf 9130
bbcc0807
CD
9131 case 'D':
9132 /* +D is for disassembly only; never match. */
9133 break;
9134
5f74bc13
CD
9135 case 'I':
9136 /* "+I" is like "I", except that imm2_expr is used. */
9137 my_getExpression (&imm2_expr, s);
9138 if (imm2_expr.X_op != O_big
9139 && imm2_expr.X_op != O_constant)
9140 insn_error = _("absolute expression required");
9ee2a2d4
MR
9141 if (HAVE_32BIT_GPRS)
9142 normalize_constant_expr (&imm2_expr);
5f74bc13
CD
9143 s = expr_end;
9144 continue;
9145
707bfff6 9146 case 'T': /* Coprocessor register. */
ef2e4d86
CF
9147 /* +T is for disassembly only; never match. */
9148 break;
9149
707bfff6 9150 case 't': /* Coprocessor register number. */
ef2e4d86
CF
9151 if (s[0] == '$' && ISDIGIT (s[1]))
9152 {
9153 ++s;
9154 regno = 0;
9155 do
9156 {
9157 regno *= 10;
9158 regno += *s - '0';
9159 ++s;
9160 }
9161 while (ISDIGIT (*s));
9162 if (regno > 31)
9163 as_bad (_("Invalid register number (%d)"), regno);
9164 else
9165 {
a9e24354 9166 INSERT_OPERAND (RT, *ip, regno);
ef2e4d86
CF
9167 continue;
9168 }
9169 }
9170 else
9171 as_bad (_("Invalid coprocessor 0 register number"));
9172 break;
9173
bb35fb24
NC
9174 case 'x':
9175 /* bbit[01] and bbit[01]32 bit index. Give error if index
9176 is not in the valid range. */
9177 my_getExpression (&imm_expr, s);
9178 check_absolute_expr (ip, &imm_expr);
9179 if ((unsigned) imm_expr.X_add_number > 31)
9180 {
9181 as_bad (_("Improper bit index (%lu)"),
9182 (unsigned long) imm_expr.X_add_number);
9183 imm_expr.X_add_number = 0;
9184 }
9185 INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number);
9186 imm_expr.X_op = O_absent;
9187 s = expr_end;
9188 continue;
9189
9190 case 'X':
9191 /* bbit[01] bit index when bbit is used but we generate
9192 bbit[01]32 because the index is over 32. Move to the
9193 next candidate if index is not in the valid range. */
9194 my_getExpression (&imm_expr, s);
9195 check_absolute_expr (ip, &imm_expr);
9196 if ((unsigned) imm_expr.X_add_number < 32
9197 || (unsigned) imm_expr.X_add_number > 63)
9198 break;
9199 INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number - 32);
9200 imm_expr.X_op = O_absent;
9201 s = expr_end;
9202 continue;
9203
9204 case 'p':
9205 /* cins, cins32, exts and exts32 position field. Give error
9206 if it's not in the valid range. */
9207 my_getExpression (&imm_expr, s);
9208 check_absolute_expr (ip, &imm_expr);
9209 if ((unsigned) imm_expr.X_add_number > 31)
9210 {
9211 as_bad (_("Improper position (%lu)"),
9212 (unsigned long) imm_expr.X_add_number);
9213 imm_expr.X_add_number = 0;
9214 }
9215 /* Make the pos explicit to simplify +S. */
9216 lastpos = imm_expr.X_add_number + 32;
9217 INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number);
9218 imm_expr.X_op = O_absent;
9219 s = expr_end;
9220 continue;
9221
9222 case 'P':
9223 /* cins, cins32, exts and exts32 position field. Move to
9224 the next candidate if it's not in the valid range. */
9225 my_getExpression (&imm_expr, s);
9226 check_absolute_expr (ip, &imm_expr);
9227 if ((unsigned) imm_expr.X_add_number < 32
9228 || (unsigned) imm_expr.X_add_number > 63)
9229 break;
9230 lastpos = imm_expr.X_add_number;
9231 INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number - 32);
9232 imm_expr.X_op = O_absent;
9233 s = expr_end;
9234 continue;
9235
9236 case 's':
9237 /* cins and exts length-minus-one field. */
9238 my_getExpression (&imm_expr, s);
9239 check_absolute_expr (ip, &imm_expr);
9240 if ((unsigned long) imm_expr.X_add_number > 31)
9241 {
9242 as_bad (_("Improper size (%lu)"),
9243 (unsigned long) imm_expr.X_add_number);
9244 imm_expr.X_add_number = 0;
9245 }
9246 INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9247 imm_expr.X_op = O_absent;
9248 s = expr_end;
9249 continue;
9250
9251 case 'S':
9252 /* cins32/exts32 and cins/exts aliasing cint32/exts32
9253 length-minus-one field. */
9254 my_getExpression (&imm_expr, s);
9255 check_absolute_expr (ip, &imm_expr);
9256 if ((long) imm_expr.X_add_number < 0
9257 || (unsigned long) imm_expr.X_add_number + lastpos > 63)
9258 {
9259 as_bad (_("Improper size (%lu)"),
9260 (unsigned long) imm_expr.X_add_number);
9261 imm_expr.X_add_number = 0;
9262 }
9263 INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9264 imm_expr.X_op = O_absent;
9265 s = expr_end;
9266 continue;
9267
dd3cbb7e
NC
9268 case 'Q':
9269 /* seqi/snei immediate field. */
9270 my_getExpression (&imm_expr, s);
9271 check_absolute_expr (ip, &imm_expr);
9272 if ((long) imm_expr.X_add_number < -512
9273 || (long) imm_expr.X_add_number >= 512)
9274 {
9275 as_bad (_("Improper immediate (%ld)"),
9276 (long) imm_expr.X_add_number);
9277 imm_expr.X_add_number = 0;
9278 }
9279 INSERT_OPERAND (SEQI, *ip, imm_expr.X_add_number);
9280 imm_expr.X_op = O_absent;
9281 s = expr_end;
9282 continue;
9283
af7ee8bf 9284 default:
f71d0d44 9285 as_bad (_("Internal error: bad mips opcode "
90ecf173
MR
9286 "(unknown extension operand type `+%c'): %s %s"),
9287 *args, insn->name, insn->args);
af7ee8bf
CD
9288 /* Further processing is fruitless. */
9289 return;
9290 }
9291 break;
9292
252b5132
RH
9293 case '<': /* must be at least one digit */
9294 /*
9295 * According to the manual, if the shift amount is greater
b6ff326e
KH
9296 * than 31 or less than 0, then the shift amount should be
9297 * mod 32. In reality the mips assembler issues an error.
252b5132
RH
9298 * We issue a warning and mask out all but the low 5 bits.
9299 */
9300 my_getExpression (&imm_expr, s);
9301 check_absolute_expr (ip, &imm_expr);
9302 if ((unsigned long) imm_expr.X_add_number > 31)
bf12938e
RS
9303 as_warn (_("Improper shift amount (%lu)"),
9304 (unsigned long) imm_expr.X_add_number);
9305 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
252b5132
RH
9306 imm_expr.X_op = O_absent;
9307 s = expr_end;
9308 continue;
9309
9310 case '>': /* shift amount minus 32 */
9311 my_getExpression (&imm_expr, s);
9312 check_absolute_expr (ip, &imm_expr);
9313 if ((unsigned long) imm_expr.X_add_number < 32
9314 || (unsigned long) imm_expr.X_add_number > 63)
9315 break;
bf12938e 9316 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number - 32);
252b5132
RH
9317 imm_expr.X_op = O_absent;
9318 s = expr_end;
9319 continue;
9320
90ecf173
MR
9321 case 'k': /* CACHE code. */
9322 case 'h': /* PREFX code. */
9323 case '1': /* SYNC type. */
252b5132
RH
9324 my_getExpression (&imm_expr, s);
9325 check_absolute_expr (ip, &imm_expr);
9326 if ((unsigned long) imm_expr.X_add_number > 31)
bf12938e
RS
9327 as_warn (_("Invalid value for `%s' (%lu)"),
9328 ip->insn_mo->name,
9329 (unsigned long) imm_expr.X_add_number);
252b5132 9330 if (*args == 'k')
d954098f
DD
9331 {
9332 if (mips_fix_cn63xxp1 && strcmp ("pref", insn->name) == 0)
9333 switch (imm_expr.X_add_number)
9334 {
9335 case 5:
9336 case 25:
9337 case 26:
9338 case 27:
9339 case 28:
9340 case 29:
9341 case 30:
9342 case 31: /* These are ok. */
9343 break;
9344
9345 default: /* The rest must be changed to 28. */
9346 imm_expr.X_add_number = 28;
9347 break;
9348 }
9349 INSERT_OPERAND (CACHE, *ip, imm_expr.X_add_number);
9350 }
620edafd 9351 else if (*args == 'h')
bf12938e 9352 INSERT_OPERAND (PREFX, *ip, imm_expr.X_add_number);
620edafd
CF
9353 else
9354 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
252b5132
RH
9355 imm_expr.X_op = O_absent;
9356 s = expr_end;
9357 continue;
9358
90ecf173 9359 case 'c': /* BREAK code. */
252b5132
RH
9360 my_getExpression (&imm_expr, s);
9361 check_absolute_expr (ip, &imm_expr);
a9e24354
TS
9362 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE)
9363 as_warn (_("Code for %s not in range 0..1023 (%lu)"),
9364 ip->insn_mo->name,
bf12938e
RS
9365 (unsigned long) imm_expr.X_add_number);
9366 INSERT_OPERAND (CODE, *ip, imm_expr.X_add_number);
252b5132
RH
9367 imm_expr.X_op = O_absent;
9368 s = expr_end;
9369 continue;
9370
90ecf173 9371 case 'q': /* Lower BREAK code. */
252b5132
RH
9372 my_getExpression (&imm_expr, s);
9373 check_absolute_expr (ip, &imm_expr);
a9e24354
TS
9374 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE2)
9375 as_warn (_("Lower code for %s not in range 0..1023 (%lu)"),
9376 ip->insn_mo->name,
bf12938e
RS
9377 (unsigned long) imm_expr.X_add_number);
9378 INSERT_OPERAND (CODE2, *ip, imm_expr.X_add_number);
252b5132
RH
9379 imm_expr.X_op = O_absent;
9380 s = expr_end;
9381 continue;
9382
90ecf173 9383 case 'B': /* 20-bit SYSCALL/BREAK code. */
156c2f8b 9384 my_getExpression (&imm_expr, s);
156c2f8b 9385 check_absolute_expr (ip, &imm_expr);
793b27f4 9386 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
a9e24354
TS
9387 as_warn (_("Code for %s not in range 0..1048575 (%lu)"),
9388 ip->insn_mo->name,
793b27f4 9389 (unsigned long) imm_expr.X_add_number);
bf12938e 9390 INSERT_OPERAND (CODE20, *ip, imm_expr.X_add_number);
252b5132
RH
9391 imm_expr.X_op = O_absent;
9392 s = expr_end;
9393 continue;
9394
90ecf173 9395 case 'C': /* Coprocessor code. */
beae10d5 9396 my_getExpression (&imm_expr, s);
252b5132 9397 check_absolute_expr (ip, &imm_expr);
a9e24354 9398 if ((unsigned long) imm_expr.X_add_number > OP_MASK_COPZ)
252b5132 9399 {
793b27f4
TS
9400 as_warn (_("Coproccesor code > 25 bits (%lu)"),
9401 (unsigned long) imm_expr.X_add_number);
a9e24354 9402 imm_expr.X_add_number &= OP_MASK_COPZ;
252b5132 9403 }
a9e24354 9404 INSERT_OPERAND (COPZ, *ip, imm_expr.X_add_number);
beae10d5
KH
9405 imm_expr.X_op = O_absent;
9406 s = expr_end;
9407 continue;
252b5132 9408
90ecf173 9409 case 'J': /* 19-bit WAIT code. */
4372b673
NC
9410 my_getExpression (&imm_expr, s);
9411 check_absolute_expr (ip, &imm_expr);
793b27f4 9412 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
a9e24354
TS
9413 {
9414 as_warn (_("Illegal 19-bit code (%lu)"),
9415 (unsigned long) imm_expr.X_add_number);
9416 imm_expr.X_add_number &= OP_MASK_CODE19;
9417 }
bf12938e 9418 INSERT_OPERAND (CODE19, *ip, imm_expr.X_add_number);
4372b673
NC
9419 imm_expr.X_op = O_absent;
9420 s = expr_end;
9421 continue;
9422
707bfff6 9423 case 'P': /* Performance register. */
beae10d5 9424 my_getExpression (&imm_expr, s);
252b5132 9425 check_absolute_expr (ip, &imm_expr);
beae10d5 9426 if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
bf12938e
RS
9427 as_warn (_("Invalid performance register (%lu)"),
9428 (unsigned long) imm_expr.X_add_number);
9429 INSERT_OPERAND (PERFREG, *ip, imm_expr.X_add_number);
beae10d5
KH
9430 imm_expr.X_op = O_absent;
9431 s = expr_end;
9432 continue;
252b5132 9433
707bfff6
TS
9434 case 'G': /* Coprocessor destination register. */
9435 if (((ip->insn_opcode >> OP_SH_OP) & OP_MASK_OP) == OP_OP_COP0)
9436 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_CP0, &regno);
9437 else
9438 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
a9e24354 9439 INSERT_OPERAND (RD, *ip, regno);
707bfff6
TS
9440 if (ok)
9441 {
9442 lastregno = regno;
9443 continue;
9444 }
9445 else
9446 break;
9447
90ecf173
MR
9448 case 'b': /* Base register. */
9449 case 'd': /* Destination register. */
9450 case 's': /* Source register. */
9451 case 't': /* Target register. */
9452 case 'r': /* Both target and source. */
9453 case 'v': /* Both dest and source. */
9454 case 'w': /* Both dest and target. */
9455 case 'E': /* Coprocessor target register. */
9456 case 'K': /* RDHWR destination register. */
9457 case 'x': /* Ignore register name. */
9458 case 'z': /* Must be zero register. */
9459 case 'U': /* Destination register (CLO/CLZ). */
9460 case 'g': /* Coprocessor destination register. */
9461 s_reset = s;
707bfff6
TS
9462 if (*args == 'E' || *args == 'K')
9463 ok = reg_lookup (&s, RTYPE_NUM, &regno);
9464 else
9465 {
9466 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
741fe287
MR
9467 if (regno == AT && mips_opts.at)
9468 {
9469 if (mips_opts.at == ATREG)
f71d0d44 9470 as_warn (_("Used $at without \".set noat\""));
741fe287 9471 else
f71d0d44 9472 as_warn (_("Used $%u with \".set at=$%u\""),
741fe287
MR
9473 regno, mips_opts.at);
9474 }
707bfff6
TS
9475 }
9476 if (ok)
252b5132 9477 {
252b5132
RH
9478 c = *args;
9479 if (*s == ' ')
f9419b05 9480 ++s;
252b5132
RH
9481 if (args[1] != *s)
9482 {
9483 if (c == 'r' || c == 'v' || c == 'w')
9484 {
9485 regno = lastregno;
9486 s = s_reset;
f9419b05 9487 ++args;
252b5132
RH
9488 }
9489 }
9490 /* 'z' only matches $0. */
9491 if (c == 'z' && regno != 0)
9492 break;
9493
24864476 9494 if (c == 's' && !strncmp (ip->insn_mo->name, "jalr", 4))
e7c604dd
CM
9495 {
9496 if (regno == lastregno)
90ecf173
MR
9497 {
9498 insn_error
f71d0d44 9499 = _("Source and destination must be different");
e7c604dd 9500 continue;
90ecf173 9501 }
24864476 9502 if (regno == 31 && lastregno == 0xffffffff)
90ecf173
MR
9503 {
9504 insn_error
f71d0d44 9505 = _("A destination register must be supplied");
e7c604dd 9506 continue;
90ecf173 9507 }
e7c604dd 9508 }
90ecf173
MR
9509 /* Now that we have assembled one operand, we use the args
9510 string to figure out where it goes in the instruction. */
252b5132
RH
9511 switch (c)
9512 {
9513 case 'r':
9514 case 's':
9515 case 'v':
9516 case 'b':
bf12938e 9517 INSERT_OPERAND (RS, *ip, regno);
252b5132
RH
9518 break;
9519 case 'd':
af7ee8bf 9520 case 'K':
ef2e4d86 9521 case 'g':
bf12938e 9522 INSERT_OPERAND (RD, *ip, regno);
252b5132 9523 break;
4372b673 9524 case 'U':
bf12938e
RS
9525 INSERT_OPERAND (RD, *ip, regno);
9526 INSERT_OPERAND (RT, *ip, regno);
4372b673 9527 break;
252b5132
RH
9528 case 'w':
9529 case 't':
9530 case 'E':
bf12938e 9531 INSERT_OPERAND (RT, *ip, regno);
252b5132
RH
9532 break;
9533 case 'x':
9534 /* This case exists because on the r3000 trunc
9535 expands into a macro which requires a gp
9536 register. On the r6000 or r4000 it is
9537 assembled into a single instruction which
9538 ignores the register. Thus the insn version
9539 is MIPS_ISA2 and uses 'x', and the macro
9540 version is MIPS_ISA1 and uses 't'. */
9541 break;
9542 case 'z':
9543 /* This case is for the div instruction, which
9544 acts differently if the destination argument
9545 is $0. This only matches $0, and is checked
9546 outside the switch. */
9547 break;
252b5132
RH
9548 }
9549 lastregno = regno;
9550 continue;
9551 }
252b5132
RH
9552 switch (*args++)
9553 {
9554 case 'r':
9555 case 'v':
bf12938e 9556 INSERT_OPERAND (RS, *ip, lastregno);
252b5132
RH
9557 continue;
9558 case 'w':
bf12938e 9559 INSERT_OPERAND (RT, *ip, lastregno);
252b5132
RH
9560 continue;
9561 }
9562 break;
9563
deec1734
CD
9564 case 'O': /* MDMX alignment immediate constant. */
9565 my_getExpression (&imm_expr, s);
9566 check_absolute_expr (ip, &imm_expr);
9567 if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
20203fb9 9568 as_warn (_("Improper align amount (%ld), using low bits"),
bf12938e
RS
9569 (long) imm_expr.X_add_number);
9570 INSERT_OPERAND (ALN, *ip, imm_expr.X_add_number);
deec1734
CD
9571 imm_expr.X_op = O_absent;
9572 s = expr_end;
9573 continue;
9574
9575 case 'Q': /* MDMX vector, element sel, or const. */
9576 if (s[0] != '$')
9577 {
9578 /* MDMX Immediate. */
9579 my_getExpression (&imm_expr, s);
9580 check_absolute_expr (ip, &imm_expr);
9581 if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
bf12938e
RS
9582 as_warn (_("Invalid MDMX Immediate (%ld)"),
9583 (long) imm_expr.X_add_number);
9584 INSERT_OPERAND (FT, *ip, imm_expr.X_add_number);
deec1734
CD
9585 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9586 ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
9587 else
9588 ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
deec1734
CD
9589 imm_expr.X_op = O_absent;
9590 s = expr_end;
9591 continue;
9592 }
9593 /* Not MDMX Immediate. Fall through. */
9594 case 'X': /* MDMX destination register. */
9595 case 'Y': /* MDMX source register. */
9596 case 'Z': /* MDMX target register. */
9597 is_mdmx = 1;
90ecf173
MR
9598 case 'D': /* Floating point destination register. */
9599 case 'S': /* Floating point source register. */
9600 case 'T': /* Floating point target register. */
9601 case 'R': /* Floating point source register. */
252b5132
RH
9602 case 'V':
9603 case 'W':
707bfff6
TS
9604 rtype = RTYPE_FPU;
9605 if (is_mdmx
9606 || (mips_opts.ase_mdmx
9607 && (ip->insn_mo->pinfo & FP_D)
9608 && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
9609 | INSN_COPROC_MEMORY_DELAY
9610 | INSN_LOAD_COPROC_DELAY
9611 | INSN_LOAD_MEMORY_DELAY
9612 | INSN_STORE_MEMORY))))
9613 rtype |= RTYPE_VEC;
252b5132 9614 s_reset = s;
707bfff6 9615 if (reg_lookup (&s, rtype, &regno))
252b5132 9616 {
252b5132 9617 if ((regno & 1) != 0
ca4e0257 9618 && HAVE_32BIT_FPRS
90ecf173 9619 && !mips_oddfpreg_ok (ip->insn_mo, argnum))
252b5132
RH
9620 as_warn (_("Float register should be even, was %d"),
9621 regno);
9622
9623 c = *args;
9624 if (*s == ' ')
f9419b05 9625 ++s;
252b5132
RH
9626 if (args[1] != *s)
9627 {
9628 if (c == 'V' || c == 'W')
9629 {
9630 regno = lastregno;
9631 s = s_reset;
f9419b05 9632 ++args;
252b5132
RH
9633 }
9634 }
9635 switch (c)
9636 {
9637 case 'D':
deec1734 9638 case 'X':
bf12938e 9639 INSERT_OPERAND (FD, *ip, regno);
252b5132
RH
9640 break;
9641 case 'V':
9642 case 'S':
deec1734 9643 case 'Y':
bf12938e 9644 INSERT_OPERAND (FS, *ip, regno);
252b5132 9645 break;
deec1734
CD
9646 case 'Q':
9647 /* This is like 'Z', but also needs to fix the MDMX
9648 vector/scalar select bits. Note that the
9649 scalar immediate case is handled above. */
9650 if (*s == '[')
9651 {
9652 int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
9653 int max_el = (is_qh ? 3 : 7);
9654 s++;
9655 my_getExpression(&imm_expr, s);
9656 check_absolute_expr (ip, &imm_expr);
9657 s = expr_end;
9658 if (imm_expr.X_add_number > max_el)
20203fb9
NC
9659 as_bad (_("Bad element selector %ld"),
9660 (long) imm_expr.X_add_number);
deec1734
CD
9661 imm_expr.X_add_number &= max_el;
9662 ip->insn_opcode |= (imm_expr.X_add_number
9663 << (OP_SH_VSEL +
9664 (is_qh ? 2 : 1)));
01a3f561 9665 imm_expr.X_op = O_absent;
deec1734 9666 if (*s != ']')
20203fb9 9667 as_warn (_("Expecting ']' found '%s'"), s);
deec1734
CD
9668 else
9669 s++;
9670 }
9671 else
9672 {
9673 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9674 ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
9675 << OP_SH_VSEL);
9676 else
9677 ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
9678 OP_SH_VSEL);
9679 }
90ecf173 9680 /* Fall through. */
252b5132
RH
9681 case 'W':
9682 case 'T':
deec1734 9683 case 'Z':
bf12938e 9684 INSERT_OPERAND (FT, *ip, regno);
252b5132
RH
9685 break;
9686 case 'R':
bf12938e 9687 INSERT_OPERAND (FR, *ip, regno);
252b5132
RH
9688 break;
9689 }
9690 lastregno = regno;
9691 continue;
9692 }
9693
252b5132
RH
9694 switch (*args++)
9695 {
9696 case 'V':
bf12938e 9697 INSERT_OPERAND (FS, *ip, lastregno);
252b5132
RH
9698 continue;
9699 case 'W':
bf12938e 9700 INSERT_OPERAND (FT, *ip, lastregno);
252b5132
RH
9701 continue;
9702 }
9703 break;
9704
9705 case 'I':
9706 my_getExpression (&imm_expr, s);
9707 if (imm_expr.X_op != O_big
9708 && imm_expr.X_op != O_constant)
9709 insn_error = _("absolute expression required");
9ee2a2d4
MR
9710 if (HAVE_32BIT_GPRS)
9711 normalize_constant_expr (&imm_expr);
252b5132
RH
9712 s = expr_end;
9713 continue;
9714
9715 case 'A':
9716 my_getExpression (&offset_expr, s);
2051e8c4 9717 normalize_address_expr (&offset_expr);
f6688943 9718 *imm_reloc = BFD_RELOC_32;
252b5132
RH
9719 s = expr_end;
9720 continue;
9721
9722 case 'F':
9723 case 'L':
9724 case 'f':
9725 case 'l':
9726 {
9727 int f64;
ca4e0257 9728 int using_gprs;
252b5132
RH
9729 char *save_in;
9730 char *err;
9731 unsigned char temp[8];
9732 int len;
9733 unsigned int length;
9734 segT seg;
9735 subsegT subseg;
9736 char *p;
9737
9738 /* These only appear as the last operand in an
9739 instruction, and every instruction that accepts
9740 them in any variant accepts them in all variants.
9741 This means we don't have to worry about backing out
9742 any changes if the instruction does not match.
9743
9744 The difference between them is the size of the
9745 floating point constant and where it goes. For 'F'
9746 and 'L' the constant is 64 bits; for 'f' and 'l' it
9747 is 32 bits. Where the constant is placed is based
9748 on how the MIPS assembler does things:
9749 F -- .rdata
9750 L -- .lit8
9751 f -- immediate value
9752 l -- .lit4
9753
9754 The .lit4 and .lit8 sections are only used if
9755 permitted by the -G argument.
9756
ca4e0257
RS
9757 The code below needs to know whether the target register
9758 is 32 or 64 bits wide. It relies on the fact 'f' and
9759 'F' are used with GPR-based instructions and 'l' and
9760 'L' are used with FPR-based instructions. */
252b5132
RH
9761
9762 f64 = *args == 'F' || *args == 'L';
ca4e0257 9763 using_gprs = *args == 'F' || *args == 'f';
252b5132
RH
9764
9765 save_in = input_line_pointer;
9766 input_line_pointer = s;
9767 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
9768 length = len;
9769 s = input_line_pointer;
9770 input_line_pointer = save_in;
9771 if (err != NULL && *err != '\0')
9772 {
9773 as_bad (_("Bad floating point constant: %s"), err);
9774 memset (temp, '\0', sizeof temp);
9775 length = f64 ? 8 : 4;
9776 }
9777
9c2799c2 9778 gas_assert (length == (unsigned) (f64 ? 8 : 4));
252b5132
RH
9779
9780 if (*args == 'f'
9781 || (*args == 'l'
3e722fb5 9782 && (g_switch_value < 4
252b5132
RH
9783 || (temp[0] == 0 && temp[1] == 0)
9784 || (temp[2] == 0 && temp[3] == 0))))
9785 {
9786 imm_expr.X_op = O_constant;
90ecf173 9787 if (!target_big_endian)
252b5132
RH
9788 imm_expr.X_add_number = bfd_getl32 (temp);
9789 else
9790 imm_expr.X_add_number = bfd_getb32 (temp);
9791 }
9792 else if (length > 4
90ecf173 9793 && !mips_disable_float_construction
ca4e0257
RS
9794 /* Constants can only be constructed in GPRs and
9795 copied to FPRs if the GPRs are at least as wide
9796 as the FPRs. Force the constant into memory if
9797 we are using 64-bit FPRs but the GPRs are only
9798 32 bits wide. */
9799 && (using_gprs
90ecf173 9800 || !(HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
252b5132
RH
9801 && ((temp[0] == 0 && temp[1] == 0)
9802 || (temp[2] == 0 && temp[3] == 0))
9803 && ((temp[4] == 0 && temp[5] == 0)
9804 || (temp[6] == 0 && temp[7] == 0)))
9805 {
ca4e0257 9806 /* The value is simple enough to load with a couple of
90ecf173
MR
9807 instructions. If using 32-bit registers, set
9808 imm_expr to the high order 32 bits and offset_expr to
9809 the low order 32 bits. Otherwise, set imm_expr to
9810 the entire 64 bit constant. */
ca4e0257 9811 if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
252b5132
RH
9812 {
9813 imm_expr.X_op = O_constant;
9814 offset_expr.X_op = O_constant;
90ecf173 9815 if (!target_big_endian)
252b5132
RH
9816 {
9817 imm_expr.X_add_number = bfd_getl32 (temp + 4);
9818 offset_expr.X_add_number = bfd_getl32 (temp);
9819 }
9820 else
9821 {
9822 imm_expr.X_add_number = bfd_getb32 (temp);
9823 offset_expr.X_add_number = bfd_getb32 (temp + 4);
9824 }
9825 if (offset_expr.X_add_number == 0)
9826 offset_expr.X_op = O_absent;
9827 }
9828 else if (sizeof (imm_expr.X_add_number) > 4)
9829 {
9830 imm_expr.X_op = O_constant;
90ecf173 9831 if (!target_big_endian)
252b5132
RH
9832 imm_expr.X_add_number = bfd_getl64 (temp);
9833 else
9834 imm_expr.X_add_number = bfd_getb64 (temp);
9835 }
9836 else
9837 {
9838 imm_expr.X_op = O_big;
9839 imm_expr.X_add_number = 4;
90ecf173 9840 if (!target_big_endian)
252b5132
RH
9841 {
9842 generic_bignum[0] = bfd_getl16 (temp);
9843 generic_bignum[1] = bfd_getl16 (temp + 2);
9844 generic_bignum[2] = bfd_getl16 (temp + 4);
9845 generic_bignum[3] = bfd_getl16 (temp + 6);
9846 }
9847 else
9848 {
9849 generic_bignum[0] = bfd_getb16 (temp + 6);
9850 generic_bignum[1] = bfd_getb16 (temp + 4);
9851 generic_bignum[2] = bfd_getb16 (temp + 2);
9852 generic_bignum[3] = bfd_getb16 (temp);
9853 }
9854 }
9855 }
9856 else
9857 {
9858 const char *newname;
9859 segT new_seg;
9860
9861 /* Switch to the right section. */
9862 seg = now_seg;
9863 subseg = now_subseg;
9864 switch (*args)
9865 {
9866 default: /* unused default case avoids warnings. */
9867 case 'L':
9868 newname = RDATA_SECTION_NAME;
3e722fb5 9869 if (g_switch_value >= 8)
252b5132
RH
9870 newname = ".lit8";
9871 break;
9872 case 'F':
3e722fb5 9873 newname = RDATA_SECTION_NAME;
252b5132
RH
9874 break;
9875 case 'l':
9c2799c2 9876 gas_assert (g_switch_value >= 4);
252b5132
RH
9877 newname = ".lit4";
9878 break;
9879 }
9880 new_seg = subseg_new (newname, (subsegT) 0);
f43abd2b 9881 if (IS_ELF)
252b5132
RH
9882 bfd_set_section_flags (stdoutput, new_seg,
9883 (SEC_ALLOC
9884 | SEC_LOAD
9885 | SEC_READONLY
9886 | SEC_DATA));
9887 frag_align (*args == 'l' ? 2 : 3, 0, 0);
c41e87e3 9888 if (IS_ELF && strncmp (TARGET_OS, "elf", 3) != 0)
252b5132
RH
9889 record_alignment (new_seg, 4);
9890 else
9891 record_alignment (new_seg, *args == 'l' ? 2 : 3);
9892 if (seg == now_seg)
9893 as_bad (_("Can't use floating point insn in this section"));
9894
9895 /* Set the argument to the current address in the
9896 section. */
9897 offset_expr.X_op = O_symbol;
8680f6e1 9898 offset_expr.X_add_symbol = symbol_temp_new_now ();
252b5132
RH
9899 offset_expr.X_add_number = 0;
9900
9901 /* Put the floating point number into the section. */
9902 p = frag_more ((int) length);
9903 memcpy (p, temp, length);
9904
9905 /* Switch back to the original section. */
9906 subseg_set (seg, subseg);
9907 }
9908 }
9909 continue;
9910
90ecf173
MR
9911 case 'i': /* 16-bit unsigned immediate. */
9912 case 'j': /* 16-bit signed immediate. */
f6688943 9913 *imm_reloc = BFD_RELOC_LO16;
5e0116d5 9914 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
252b5132
RH
9915 {
9916 int more;
5e0116d5
RS
9917 offsetT minval, maxval;
9918
9919 more = (insn + 1 < &mips_opcodes[NUMOPCODES]
9920 && strcmp (insn->name, insn[1].name) == 0);
9921
9922 /* If the expression was written as an unsigned number,
9923 only treat it as signed if there are no more
9924 alternatives. */
9925 if (more
9926 && *args == 'j'
9927 && sizeof (imm_expr.X_add_number) <= 4
9928 && imm_expr.X_op == O_constant
9929 && imm_expr.X_add_number < 0
9930 && imm_expr.X_unsigned
9931 && HAVE_64BIT_GPRS)
9932 break;
9933
9934 /* For compatibility with older assemblers, we accept
9935 0x8000-0xffff as signed 16-bit numbers when only
9936 signed numbers are allowed. */
9937 if (*args == 'i')
9938 minval = 0, maxval = 0xffff;
9939 else if (more)
9940 minval = -0x8000, maxval = 0x7fff;
252b5132 9941 else
5e0116d5
RS
9942 minval = -0x8000, maxval = 0xffff;
9943
9944 if (imm_expr.X_op != O_constant
9945 || imm_expr.X_add_number < minval
9946 || imm_expr.X_add_number > maxval)
252b5132
RH
9947 {
9948 if (more)
9949 break;
2ae7e77b
AH
9950 if (imm_expr.X_op == O_constant
9951 || imm_expr.X_op == O_big)
f71d0d44 9952 as_bad (_("Expression out of range"));
252b5132
RH
9953 }
9954 }
9955 s = expr_end;
9956 continue;
9957
90ecf173 9958 case 'o': /* 16-bit offset. */
4614d845
MR
9959 offset_reloc[0] = BFD_RELOC_LO16;
9960 offset_reloc[1] = BFD_RELOC_UNUSED;
9961 offset_reloc[2] = BFD_RELOC_UNUSED;
9962
5e0116d5
RS
9963 /* Check whether there is only a single bracketed expression
9964 left. If so, it must be the base register and the
9965 constant must be zero. */
e391c024
RS
9966 offset_reloc[0] = BFD_RELOC_LO16;
9967 offset_reloc[1] = BFD_RELOC_UNUSED;
9968 offset_reloc[2] = BFD_RELOC_UNUSED;
5e0116d5
RS
9969 if (*s == '(' && strchr (s + 1, '(') == 0)
9970 {
9971 offset_expr.X_op = O_constant;
9972 offset_expr.X_add_number = 0;
9973 continue;
9974 }
252b5132
RH
9975
9976 /* If this value won't fit into a 16 bit offset, then go
9977 find a macro that will generate the 32 bit offset
afdbd6d0 9978 code pattern. */
5e0116d5 9979 if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
252b5132
RH
9980 && (offset_expr.X_op != O_constant
9981 || offset_expr.X_add_number >= 0x8000
afdbd6d0 9982 || offset_expr.X_add_number < -0x8000))
252b5132
RH
9983 break;
9984
252b5132
RH
9985 s = expr_end;
9986 continue;
9987
90ecf173 9988 case 'p': /* PC-relative offset. */
0b25d3e6 9989 *offset_reloc = BFD_RELOC_16_PCREL_S2;
252b5132
RH
9990 my_getExpression (&offset_expr, s);
9991 s = expr_end;
9992 continue;
9993
90ecf173 9994 case 'u': /* Upper 16 bits. */
5e0116d5
RS
9995 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
9996 && imm_expr.X_op == O_constant
9997 && (imm_expr.X_add_number < 0
9998 || imm_expr.X_add_number >= 0x10000))
88320db2
MR
9999 as_bad (_("lui expression (%lu) not in range 0..65535"),
10000 (unsigned long) imm_expr.X_add_number);
252b5132
RH
10001 s = expr_end;
10002 continue;
10003
90ecf173 10004 case 'a': /* 26-bit address. */
252b5132
RH
10005 my_getExpression (&offset_expr, s);
10006 s = expr_end;
f6688943 10007 *offset_reloc = BFD_RELOC_MIPS_JMP;
252b5132
RH
10008 continue;
10009
90ecf173
MR
10010 case 'N': /* 3-bit branch condition code. */
10011 case 'M': /* 3-bit compare condition code. */
707bfff6 10012 rtype = RTYPE_CCC;
90ecf173 10013 if (ip->insn_mo->pinfo & (FP_D | FP_S))
707bfff6
TS
10014 rtype |= RTYPE_FCC;
10015 if (!reg_lookup (&s, rtype, &regno))
252b5132 10016 break;
90ecf173
MR
10017 if ((strcmp (str + strlen (str) - 3, ".ps") == 0
10018 || strcmp (str + strlen (str) - 5, "any2f") == 0
10019 || strcmp (str + strlen (str) - 5, "any2t") == 0)
30c378fd 10020 && (regno & 1) != 0)
90ecf173
MR
10021 as_warn (_("Condition code register should be even for %s, "
10022 "was %d"),
20203fb9 10023 str, regno);
90ecf173
MR
10024 if ((strcmp (str + strlen (str) - 5, "any4f") == 0
10025 || strcmp (str + strlen (str) - 5, "any4t") == 0)
30c378fd 10026 && (regno & 3) != 0)
90ecf173
MR
10027 as_warn (_("Condition code register should be 0 or 4 for %s, "
10028 "was %d"),
20203fb9 10029 str, regno);
252b5132 10030 if (*args == 'N')
bf12938e 10031 INSERT_OPERAND (BCC, *ip, regno);
252b5132 10032 else
bf12938e 10033 INSERT_OPERAND (CCC, *ip, regno);
beae10d5 10034 continue;
252b5132 10035
156c2f8b
NC
10036 case 'H':
10037 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
10038 s += 2;
3882b010 10039 if (ISDIGIT (*s))
156c2f8b
NC
10040 {
10041 c = 0;
10042 do
10043 {
10044 c *= 10;
10045 c += *s - '0';
10046 ++s;
10047 }
3882b010 10048 while (ISDIGIT (*s));
156c2f8b
NC
10049 }
10050 else
10051 c = 8; /* Invalid sel value. */
10052
10053 if (c > 7)
f71d0d44 10054 as_bad (_("Invalid coprocessor sub-selection value (0-7)"));
156c2f8b
NC
10055 ip->insn_opcode |= c;
10056 continue;
10057
60b63b72
RS
10058 case 'e':
10059 /* Must be at least one digit. */
10060 my_getExpression (&imm_expr, s);
10061 check_absolute_expr (ip, &imm_expr);
10062
10063 if ((unsigned long) imm_expr.X_add_number
10064 > (unsigned long) OP_MASK_VECBYTE)
10065 {
10066 as_bad (_("bad byte vector index (%ld)"),
10067 (long) imm_expr.X_add_number);
10068 imm_expr.X_add_number = 0;
10069 }
10070
bf12938e 10071 INSERT_OPERAND (VECBYTE, *ip, imm_expr.X_add_number);
60b63b72
RS
10072 imm_expr.X_op = O_absent;
10073 s = expr_end;
10074 continue;
10075
10076 case '%':
10077 my_getExpression (&imm_expr, s);
10078 check_absolute_expr (ip, &imm_expr);
10079
10080 if ((unsigned long) imm_expr.X_add_number
10081 > (unsigned long) OP_MASK_VECALIGN)
10082 {
10083 as_bad (_("bad byte vector index (%ld)"),
10084 (long) imm_expr.X_add_number);
10085 imm_expr.X_add_number = 0;
10086 }
10087
bf12938e 10088 INSERT_OPERAND (VECALIGN, *ip, imm_expr.X_add_number);
60b63b72
RS
10089 imm_expr.X_op = O_absent;
10090 s = expr_end;
10091 continue;
10092
252b5132 10093 default:
f71d0d44 10094 as_bad (_("Bad char = '%c'\n"), *args);
252b5132
RH
10095 internalError ();
10096 }
10097 break;
10098 }
10099 /* Args don't match. */
10100 if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
10101 !strcmp (insn->name, insn[1].name))
10102 {
10103 ++insn;
10104 s = argsStart;
f71d0d44 10105 insn_error = _("Illegal operands");
252b5132
RH
10106 continue;
10107 }
268f6bed 10108 if (save_c)
570de991 10109 *(--argsStart) = save_c;
f71d0d44 10110 insn_error = _("Illegal operands");
252b5132
RH
10111 return;
10112 }
10113}
10114
0499d65b
TS
10115#define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
10116
252b5132
RH
10117/* This routine assembles an instruction into its binary format when
10118 assembling for the mips16. As a side effect, it sets one of the
10119 global variables imm_reloc or offset_reloc to the type of
10120 relocation to do if one of the operands is an address expression.
10121 It also sets mips16_small and mips16_ext if the user explicitly
10122 requested a small or extended instruction. */
10123
10124static void
17a2f251 10125mips16_ip (char *str, struct mips_cl_insn *ip)
252b5132
RH
10126{
10127 char *s;
10128 const char *args;
10129 struct mips_opcode *insn;
10130 char *argsstart;
10131 unsigned int regno;
10132 unsigned int lastregno = 0;
10133 char *s_reset;
d6f16593 10134 size_t i;
252b5132
RH
10135
10136 insn_error = NULL;
10137
b34976b6
AM
10138 mips16_small = FALSE;
10139 mips16_ext = FALSE;
252b5132 10140
3882b010 10141 for (s = str; ISLOWER (*s); ++s)
252b5132
RH
10142 ;
10143 switch (*s)
10144 {
10145 case '\0':
10146 break;
10147
10148 case ' ':
10149 *s++ = '\0';
10150 break;
10151
10152 case '.':
10153 if (s[1] == 't' && s[2] == ' ')
10154 {
10155 *s = '\0';
b34976b6 10156 mips16_small = TRUE;
252b5132
RH
10157 s += 3;
10158 break;
10159 }
10160 else if (s[1] == 'e' && s[2] == ' ')
10161 {
10162 *s = '\0';
b34976b6 10163 mips16_ext = TRUE;
252b5132
RH
10164 s += 3;
10165 break;
10166 }
10167 /* Fall through. */
10168 default:
10169 insn_error = _("unknown opcode");
10170 return;
10171 }
10172
10173 if (mips_opts.noautoextend && ! mips16_ext)
b34976b6 10174 mips16_small = TRUE;
252b5132
RH
10175
10176 if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
10177 {
10178 insn_error = _("unrecognized opcode");
10179 return;
10180 }
10181
10182 argsstart = s;
10183 for (;;)
10184 {
9b3f89ee
TS
10185 bfd_boolean ok;
10186
9c2799c2 10187 gas_assert (strcmp (insn->name, str) == 0);
252b5132 10188
037b32b9 10189 ok = is_opcode_valid_16 (insn);
9b3f89ee
TS
10190 if (! ok)
10191 {
10192 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
10193 && strcmp (insn->name, insn[1].name) == 0)
10194 {
10195 ++insn;
10196 continue;
10197 }
10198 else
10199 {
10200 if (!insn_error)
10201 {
10202 static char buf[100];
10203 sprintf (buf,
10204 _("opcode not supported on this processor: %s (%s)"),
10205 mips_cpu_info_from_arch (mips_opts.arch)->name,
10206 mips_cpu_info_from_isa (mips_opts.isa)->name);
10207 insn_error = buf;
10208 }
10209 return;
10210 }
10211 }
10212
1e915849 10213 create_insn (ip, insn);
252b5132 10214 imm_expr.X_op = O_absent;
f6688943
TS
10215 imm_reloc[0] = BFD_RELOC_UNUSED;
10216 imm_reloc[1] = BFD_RELOC_UNUSED;
10217 imm_reloc[2] = BFD_RELOC_UNUSED;
5f74bc13 10218 imm2_expr.X_op = O_absent;
252b5132 10219 offset_expr.X_op = O_absent;
f6688943
TS
10220 offset_reloc[0] = BFD_RELOC_UNUSED;
10221 offset_reloc[1] = BFD_RELOC_UNUSED;
10222 offset_reloc[2] = BFD_RELOC_UNUSED;
252b5132
RH
10223 for (args = insn->args; 1; ++args)
10224 {
10225 int c;
10226
10227 if (*s == ' ')
10228 ++s;
10229
10230 /* In this switch statement we call break if we did not find
10231 a match, continue if we did find a match, or return if we
10232 are done. */
10233
10234 c = *args;
10235 switch (c)
10236 {
10237 case '\0':
10238 if (*s == '\0')
10239 {
10240 /* Stuff the immediate value in now, if we can. */
10241 if (imm_expr.X_op == O_constant
f6688943 10242 && *imm_reloc > BFD_RELOC_UNUSED
738e5348
RS
10243 && *imm_reloc != BFD_RELOC_MIPS16_GOT16
10244 && *imm_reloc != BFD_RELOC_MIPS16_CALL16
252b5132
RH
10245 && insn->pinfo != INSN_MACRO)
10246 {
d6f16593
MR
10247 valueT tmp;
10248
10249 switch (*offset_reloc)
10250 {
10251 case BFD_RELOC_MIPS16_HI16_S:
10252 tmp = (imm_expr.X_add_number + 0x8000) >> 16;
10253 break;
10254
10255 case BFD_RELOC_MIPS16_HI16:
10256 tmp = imm_expr.X_add_number >> 16;
10257 break;
10258
10259 case BFD_RELOC_MIPS16_LO16:
10260 tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
10261 - 0x8000;
10262 break;
10263
10264 case BFD_RELOC_UNUSED:
10265 tmp = imm_expr.X_add_number;
10266 break;
10267
10268 default:
10269 internalError ();
10270 }
10271 *offset_reloc = BFD_RELOC_UNUSED;
10272
c4e7957c 10273 mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
d6f16593 10274 tmp, TRUE, mips16_small,
252b5132
RH
10275 mips16_ext, &ip->insn_opcode,
10276 &ip->use_extend, &ip->extend);
10277 imm_expr.X_op = O_absent;
f6688943 10278 *imm_reloc = BFD_RELOC_UNUSED;
252b5132
RH
10279 }
10280
10281 return;
10282 }
10283 break;
10284
10285 case ',':
10286 if (*s++ == c)
10287 continue;
10288 s--;
10289 switch (*++args)
10290 {
10291 case 'v':
bf12938e 10292 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
252b5132
RH
10293 continue;
10294 case 'w':
bf12938e 10295 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
252b5132
RH
10296 continue;
10297 }
10298 break;
10299
10300 case '(':
10301 case ')':
10302 if (*s++ == c)
10303 continue;
10304 break;
10305
10306 case 'v':
10307 case 'w':
10308 if (s[0] != '$')
10309 {
10310 if (c == 'v')
bf12938e 10311 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
252b5132 10312 else
bf12938e 10313 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
252b5132
RH
10314 ++args;
10315 continue;
10316 }
10317 /* Fall through. */
10318 case 'x':
10319 case 'y':
10320 case 'z':
10321 case 'Z':
10322 case '0':
10323 case 'S':
10324 case 'R':
10325 case 'X':
10326 case 'Y':
707bfff6
TS
10327 s_reset = s;
10328 if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
252b5132 10329 {
707bfff6 10330 if (c == 'v' || c == 'w')
85b51719 10331 {
707bfff6 10332 if (c == 'v')
a9e24354 10333 MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
707bfff6 10334 else
a9e24354 10335 MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
707bfff6
TS
10336 ++args;
10337 continue;
85b51719 10338 }
707bfff6 10339 break;
252b5132
RH
10340 }
10341
10342 if (*s == ' ')
10343 ++s;
10344 if (args[1] != *s)
10345 {
10346 if (c == 'v' || c == 'w')
10347 {
10348 regno = mips16_to_32_reg_map[lastregno];
10349 s = s_reset;
f9419b05 10350 ++args;
252b5132
RH
10351 }
10352 }
10353
10354 switch (c)
10355 {
10356 case 'x':
10357 case 'y':
10358 case 'z':
10359 case 'v':
10360 case 'w':
10361 case 'Z':
10362 regno = mips32_to_16_reg_map[regno];
10363 break;
10364
10365 case '0':
10366 if (regno != 0)
10367 regno = ILLEGAL_REG;
10368 break;
10369
10370 case 'S':
10371 if (regno != SP)
10372 regno = ILLEGAL_REG;
10373 break;
10374
10375 case 'R':
10376 if (regno != RA)
10377 regno = ILLEGAL_REG;
10378 break;
10379
10380 case 'X':
10381 case 'Y':
741fe287
MR
10382 if (regno == AT && mips_opts.at)
10383 {
10384 if (mips_opts.at == ATREG)
10385 as_warn (_("used $at without \".set noat\""));
10386 else
10387 as_warn (_("used $%u with \".set at=$%u\""),
10388 regno, mips_opts.at);
10389 }
252b5132
RH
10390 break;
10391
10392 default:
10393 internalError ();
10394 }
10395
10396 if (regno == ILLEGAL_REG)
10397 break;
10398
10399 switch (c)
10400 {
10401 case 'x':
10402 case 'v':
bf12938e 10403 MIPS16_INSERT_OPERAND (RX, *ip, regno);
252b5132
RH
10404 break;
10405 case 'y':
10406 case 'w':
bf12938e 10407 MIPS16_INSERT_OPERAND (RY, *ip, regno);
252b5132
RH
10408 break;
10409 case 'z':
bf12938e 10410 MIPS16_INSERT_OPERAND (RZ, *ip, regno);
252b5132
RH
10411 break;
10412 case 'Z':
bf12938e 10413 MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
252b5132
RH
10414 case '0':
10415 case 'S':
10416 case 'R':
10417 break;
10418 case 'X':
bf12938e 10419 MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
252b5132
RH
10420 break;
10421 case 'Y':
10422 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
bf12938e 10423 MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
252b5132
RH
10424 break;
10425 default:
10426 internalError ();
10427 }
10428
10429 lastregno = regno;
10430 continue;
10431
10432 case 'P':
10433 if (strncmp (s, "$pc", 3) == 0)
10434 {
10435 s += 3;
10436 continue;
10437 }
10438 break;
10439
252b5132
RH
10440 case '5':
10441 case 'H':
10442 case 'W':
10443 case 'D':
10444 case 'j':
252b5132
RH
10445 case 'V':
10446 case 'C':
10447 case 'U':
10448 case 'k':
10449 case 'K':
d6f16593
MR
10450 i = my_getSmallExpression (&imm_expr, imm_reloc, s);
10451 if (i > 0)
252b5132 10452 {
d6f16593 10453 if (imm_expr.X_op != O_constant)
252b5132 10454 {
b34976b6 10455 mips16_ext = TRUE;
b34976b6 10456 ip->use_extend = TRUE;
252b5132 10457 ip->extend = 0;
252b5132 10458 }
d6f16593
MR
10459 else
10460 {
10461 /* We need to relax this instruction. */
10462 *offset_reloc = *imm_reloc;
10463 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10464 }
10465 s = expr_end;
10466 continue;
252b5132 10467 }
d6f16593
MR
10468 *imm_reloc = BFD_RELOC_UNUSED;
10469 /* Fall through. */
10470 case '<':
10471 case '>':
10472 case '[':
10473 case ']':
10474 case '4':
10475 case '8':
10476 my_getExpression (&imm_expr, s);
252b5132
RH
10477 if (imm_expr.X_op == O_register)
10478 {
10479 /* What we thought was an expression turned out to
10480 be a register. */
10481
10482 if (s[0] == '(' && args[1] == '(')
10483 {
10484 /* It looks like the expression was omitted
10485 before a register indirection, which means
10486 that the expression is implicitly zero. We
10487 still set up imm_expr, so that we handle
10488 explicit extensions correctly. */
10489 imm_expr.X_op = O_constant;
10490 imm_expr.X_add_number = 0;
f6688943 10491 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
252b5132
RH
10492 continue;
10493 }
10494
10495 break;
10496 }
10497
10498 /* We need to relax this instruction. */
f6688943 10499 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
252b5132
RH
10500 s = expr_end;
10501 continue;
10502
10503 case 'p':
10504 case 'q':
10505 case 'A':
10506 case 'B':
10507 case 'E':
10508 /* We use offset_reloc rather than imm_reloc for the PC
10509 relative operands. This lets macros with both
10510 immediate and address operands work correctly. */
10511 my_getExpression (&offset_expr, s);
10512
10513 if (offset_expr.X_op == O_register)
10514 break;
10515
10516 /* We need to relax this instruction. */
f6688943 10517 *offset_reloc = (int) BFD_RELOC_UNUSED + c;
252b5132
RH
10518 s = expr_end;
10519 continue;
10520
10521 case '6': /* break code */
10522 my_getExpression (&imm_expr, s);
10523 check_absolute_expr (ip, &imm_expr);
10524 if ((unsigned long) imm_expr.X_add_number > 63)
bf12938e
RS
10525 as_warn (_("Invalid value for `%s' (%lu)"),
10526 ip->insn_mo->name,
10527 (unsigned long) imm_expr.X_add_number);
10528 MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
252b5132
RH
10529 imm_expr.X_op = O_absent;
10530 s = expr_end;
10531 continue;
10532
10533 case 'a': /* 26 bit address */
10534 my_getExpression (&offset_expr, s);
10535 s = expr_end;
f6688943 10536 *offset_reloc = BFD_RELOC_MIPS16_JMP;
252b5132
RH
10537 ip->insn_opcode <<= 16;
10538 continue;
10539
10540 case 'l': /* register list for entry macro */
10541 case 'L': /* register list for exit macro */
10542 {
10543 int mask;
10544
10545 if (c == 'l')
10546 mask = 0;
10547 else
10548 mask = 7 << 3;
10549 while (*s != '\0')
10550 {
707bfff6 10551 unsigned int freg, reg1, reg2;
252b5132
RH
10552
10553 while (*s == ' ' || *s == ',')
10554 ++s;
707bfff6 10555 if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
252b5132 10556 freg = 0;
707bfff6
TS
10557 else if (reg_lookup (&s, RTYPE_FPU, &reg1))
10558 freg = 1;
252b5132
RH
10559 else
10560 {
707bfff6
TS
10561 as_bad (_("can't parse register list"));
10562 break;
252b5132
RH
10563 }
10564 if (*s == ' ')
10565 ++s;
10566 if (*s != '-')
10567 reg2 = reg1;
10568 else
10569 {
10570 ++s;
707bfff6
TS
10571 if (!reg_lookup (&s, freg ? RTYPE_FPU
10572 : (RTYPE_GP | RTYPE_NUM), &reg2))
252b5132 10573 {
707bfff6
TS
10574 as_bad (_("invalid register list"));
10575 break;
252b5132
RH
10576 }
10577 }
10578 if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10579 {
10580 mask &= ~ (7 << 3);
10581 mask |= 5 << 3;
10582 }
10583 else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10584 {
10585 mask &= ~ (7 << 3);
10586 mask |= 6 << 3;
10587 }
10588 else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
10589 mask |= (reg2 - 3) << 3;
10590 else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
10591 mask |= (reg2 - 15) << 1;
f9419b05 10592 else if (reg1 == RA && reg2 == RA)
252b5132
RH
10593 mask |= 1;
10594 else
10595 {
10596 as_bad (_("invalid register list"));
10597 break;
10598 }
10599 }
10600 /* The mask is filled in in the opcode table for the
10601 benefit of the disassembler. We remove it before
10602 applying the actual mask. */
10603 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
10604 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
10605 }
10606 continue;
10607
0499d65b
TS
10608 case 'm': /* Register list for save insn. */
10609 case 'M': /* Register list for restore insn. */
10610 {
10611 int opcode = 0;
10612 int framesz = 0, seen_framesz = 0;
91d6fa6a 10613 int nargs = 0, statics = 0, sregs = 0;
0499d65b
TS
10614
10615 while (*s != '\0')
10616 {
10617 unsigned int reg1, reg2;
10618
10619 SKIP_SPACE_TABS (s);
10620 while (*s == ',')
10621 ++s;
10622 SKIP_SPACE_TABS (s);
10623
10624 my_getExpression (&imm_expr, s);
10625 if (imm_expr.X_op == O_constant)
10626 {
10627 /* Handle the frame size. */
10628 if (seen_framesz)
10629 {
10630 as_bad (_("more than one frame size in list"));
10631 break;
10632 }
10633 seen_framesz = 1;
10634 framesz = imm_expr.X_add_number;
10635 imm_expr.X_op = O_absent;
10636 s = expr_end;
10637 continue;
10638 }
10639
707bfff6 10640 if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
0499d65b
TS
10641 {
10642 as_bad (_("can't parse register list"));
10643 break;
10644 }
0499d65b 10645
707bfff6
TS
10646 while (*s == ' ')
10647 ++s;
10648
0499d65b
TS
10649 if (*s != '-')
10650 reg2 = reg1;
10651 else
10652 {
10653 ++s;
707bfff6
TS
10654 if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
10655 || reg2 < reg1)
0499d65b
TS
10656 {
10657 as_bad (_("can't parse register list"));
10658 break;
10659 }
0499d65b
TS
10660 }
10661
10662 while (reg1 <= reg2)
10663 {
10664 if (reg1 >= 4 && reg1 <= 7)
10665 {
3a93f742 10666 if (!seen_framesz)
0499d65b 10667 /* args $a0-$a3 */
91d6fa6a 10668 nargs |= 1 << (reg1 - 4);
0499d65b
TS
10669 else
10670 /* statics $a0-$a3 */
10671 statics |= 1 << (reg1 - 4);
10672 }
10673 else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
10674 {
10675 /* $s0-$s8 */
10676 sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
10677 }
10678 else if (reg1 == 31)
10679 {
10680 /* Add $ra to insn. */
10681 opcode |= 0x40;
10682 }
10683 else
10684 {
10685 as_bad (_("unexpected register in list"));
10686 break;
10687 }
10688 if (++reg1 == 24)
10689 reg1 = 30;
10690 }
10691 }
10692
10693 /* Encode args/statics combination. */
91d6fa6a 10694 if (nargs & statics)
0499d65b 10695 as_bad (_("arg/static registers overlap"));
91d6fa6a 10696 else if (nargs == 0xf)
0499d65b
TS
10697 /* All $a0-$a3 are args. */
10698 opcode |= MIPS16_ALL_ARGS << 16;
10699 else if (statics == 0xf)
10700 /* All $a0-$a3 are statics. */
10701 opcode |= MIPS16_ALL_STATICS << 16;
10702 else
10703 {
10704 int narg = 0, nstat = 0;
10705
10706 /* Count arg registers. */
91d6fa6a 10707 while (nargs & 0x1)
0499d65b 10708 {
91d6fa6a 10709 nargs >>= 1;
0499d65b
TS
10710 narg++;
10711 }
91d6fa6a 10712 if (nargs != 0)
0499d65b
TS
10713 as_bad (_("invalid arg register list"));
10714
10715 /* Count static registers. */
10716 while (statics & 0x8)
10717 {
10718 statics = (statics << 1) & 0xf;
10719 nstat++;
10720 }
10721 if (statics != 0)
10722 as_bad (_("invalid static register list"));
10723
10724 /* Encode args/statics. */
10725 opcode |= ((narg << 2) | nstat) << 16;
10726 }
10727
10728 /* Encode $s0/$s1. */
10729 if (sregs & (1 << 0)) /* $s0 */
10730 opcode |= 0x20;
10731 if (sregs & (1 << 1)) /* $s1 */
10732 opcode |= 0x10;
10733 sregs >>= 2;
10734
10735 if (sregs != 0)
10736 {
10737 /* Count regs $s2-$s8. */
10738 int nsreg = 0;
10739 while (sregs & 1)
10740 {
10741 sregs >>= 1;
10742 nsreg++;
10743 }
10744 if (sregs != 0)
10745 as_bad (_("invalid static register list"));
10746 /* Encode $s2-$s8. */
10747 opcode |= nsreg << 24;
10748 }
10749
10750 /* Encode frame size. */
10751 if (!seen_framesz)
10752 as_bad (_("missing frame size"));
10753 else if ((framesz & 7) != 0 || framesz < 0
10754 || framesz > 0xff * 8)
10755 as_bad (_("invalid frame size"));
10756 else if (framesz != 128 || (opcode >> 16) != 0)
10757 {
10758 framesz /= 8;
10759 opcode |= (((framesz & 0xf0) << 16)
10760 | (framesz & 0x0f));
10761 }
10762
10763 /* Finally build the instruction. */
10764 if ((opcode >> 16) != 0 || framesz == 0)
10765 {
10766 ip->use_extend = TRUE;
10767 ip->extend = opcode >> 16;
10768 }
10769 ip->insn_opcode |= opcode & 0x7f;
10770 }
10771 continue;
10772
252b5132
RH
10773 case 'e': /* extend code */
10774 my_getExpression (&imm_expr, s);
10775 check_absolute_expr (ip, &imm_expr);
10776 if ((unsigned long) imm_expr.X_add_number > 0x7ff)
10777 {
10778 as_warn (_("Invalid value for `%s' (%lu)"),
10779 ip->insn_mo->name,
10780 (unsigned long) imm_expr.X_add_number);
10781 imm_expr.X_add_number &= 0x7ff;
10782 }
10783 ip->insn_opcode |= imm_expr.X_add_number;
10784 imm_expr.X_op = O_absent;
10785 s = expr_end;
10786 continue;
10787
10788 default:
10789 internalError ();
10790 }
10791 break;
10792 }
10793
10794 /* Args don't match. */
10795 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
10796 strcmp (insn->name, insn[1].name) == 0)
10797 {
10798 ++insn;
10799 s = argsstart;
10800 continue;
10801 }
10802
10803 insn_error = _("illegal operands");
10804
10805 return;
10806 }
10807}
10808
10809/* This structure holds information we know about a mips16 immediate
10810 argument type. */
10811
e972090a
NC
10812struct mips16_immed_operand
10813{
252b5132
RH
10814 /* The type code used in the argument string in the opcode table. */
10815 int type;
10816 /* The number of bits in the short form of the opcode. */
10817 int nbits;
10818 /* The number of bits in the extended form of the opcode. */
10819 int extbits;
10820 /* The amount by which the short form is shifted when it is used;
10821 for example, the sw instruction has a shift count of 2. */
10822 int shift;
10823 /* The amount by which the short form is shifted when it is stored
10824 into the instruction code. */
10825 int op_shift;
10826 /* Non-zero if the short form is unsigned. */
10827 int unsp;
10828 /* Non-zero if the extended form is unsigned. */
10829 int extu;
10830 /* Non-zero if the value is PC relative. */
10831 int pcrel;
10832};
10833
10834/* The mips16 immediate operand types. */
10835
10836static const struct mips16_immed_operand mips16_immed_operands[] =
10837{
10838 { '<', 3, 5, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
10839 { '>', 3, 5, 0, MIPS16OP_SH_RX, 1, 1, 0 },
10840 { '[', 3, 6, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
10841 { ']', 3, 6, 0, MIPS16OP_SH_RX, 1, 1, 0 },
10842 { '4', 4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
10843 { '5', 5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
10844 { 'H', 5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
10845 { 'W', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
10846 { 'D', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
10847 { 'j', 5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
10848 { '8', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
10849 { 'V', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
10850 { 'C', 8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
10851 { 'U', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
10852 { 'k', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
10853 { 'K', 8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
10854 { 'p', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10855 { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10856 { 'A', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
10857 { 'B', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
10858 { 'E', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
10859};
10860
10861#define MIPS16_NUM_IMMED \
10862 (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
10863
10864/* Handle a mips16 instruction with an immediate value. This or's the
10865 small immediate value into *INSN. It sets *USE_EXTEND to indicate
10866 whether an extended value is needed; if one is needed, it sets
10867 *EXTEND to the value. The argument type is TYPE. The value is VAL.
10868 If SMALL is true, an unextended opcode was explicitly requested.
10869 If EXT is true, an extended opcode was explicitly requested. If
10870 WARN is true, warn if EXT does not match reality. */
10871
10872static void
17a2f251
TS
10873mips16_immed (char *file, unsigned int line, int type, offsetT val,
10874 bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
10875 unsigned long *insn, bfd_boolean *use_extend,
10876 unsigned short *extend)
252b5132 10877{
3994f87e 10878 const struct mips16_immed_operand *op;
252b5132 10879 int mintiny, maxtiny;
b34976b6 10880 bfd_boolean needext;
252b5132
RH
10881
10882 op = mips16_immed_operands;
10883 while (op->type != type)
10884 {
10885 ++op;
9c2799c2 10886 gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
252b5132
RH
10887 }
10888
10889 if (op->unsp)
10890 {
10891 if (type == '<' || type == '>' || type == '[' || type == ']')
10892 {
10893 mintiny = 1;
10894 maxtiny = 1 << op->nbits;
10895 }
10896 else
10897 {
10898 mintiny = 0;
10899 maxtiny = (1 << op->nbits) - 1;
10900 }
10901 }
10902 else
10903 {
10904 mintiny = - (1 << (op->nbits - 1));
10905 maxtiny = (1 << (op->nbits - 1)) - 1;
10906 }
10907
10908 /* Branch offsets have an implicit 0 in the lowest bit. */
10909 if (type == 'p' || type == 'q')
10910 val /= 2;
10911
10912 if ((val & ((1 << op->shift) - 1)) != 0
10913 || val < (mintiny << op->shift)
10914 || val > (maxtiny << op->shift))
b34976b6 10915 needext = TRUE;
252b5132 10916 else
b34976b6 10917 needext = FALSE;
252b5132
RH
10918
10919 if (warn && ext && ! needext)
beae10d5
KH
10920 as_warn_where (file, line,
10921 _("extended operand requested but not required"));
252b5132
RH
10922 if (small && needext)
10923 as_bad_where (file, line, _("invalid unextended operand value"));
10924
10925 if (small || (! ext && ! needext))
10926 {
10927 int insnval;
10928
b34976b6 10929 *use_extend = FALSE;
252b5132
RH
10930 insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
10931 insnval <<= op->op_shift;
10932 *insn |= insnval;
10933 }
10934 else
10935 {
10936 long minext, maxext;
10937 int extval;
10938
10939 if (op->extu)
10940 {
10941 minext = 0;
10942 maxext = (1 << op->extbits) - 1;
10943 }
10944 else
10945 {
10946 minext = - (1 << (op->extbits - 1));
10947 maxext = (1 << (op->extbits - 1)) - 1;
10948 }
10949 if (val < minext || val > maxext)
10950 as_bad_where (file, line,
10951 _("operand value out of range for instruction"));
10952
b34976b6 10953 *use_extend = TRUE;
252b5132
RH
10954 if (op->extbits == 16)
10955 {
10956 extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
10957 val &= 0x1f;
10958 }
10959 else if (op->extbits == 15)
10960 {
10961 extval = ((val >> 11) & 0xf) | (val & 0x7f0);
10962 val &= 0xf;
10963 }
10964 else
10965 {
10966 extval = ((val & 0x1f) << 6) | (val & 0x20);
10967 val = 0;
10968 }
10969
10970 *extend = (unsigned short) extval;
10971 *insn |= val;
10972 }
10973}
10974\f
d6f16593 10975struct percent_op_match
ad8d3bb3 10976{
5e0116d5
RS
10977 const char *str;
10978 bfd_reloc_code_real_type reloc;
d6f16593
MR
10979};
10980
10981static const struct percent_op_match mips_percent_op[] =
ad8d3bb3 10982{
5e0116d5 10983 {"%lo", BFD_RELOC_LO16},
ad8d3bb3 10984#ifdef OBJ_ELF
5e0116d5
RS
10985 {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
10986 {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
10987 {"%call16", BFD_RELOC_MIPS_CALL16},
10988 {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
10989 {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
10990 {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
10991 {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
10992 {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
10993 {"%got", BFD_RELOC_MIPS_GOT16},
10994 {"%gp_rel", BFD_RELOC_GPREL16},
10995 {"%half", BFD_RELOC_16},
10996 {"%highest", BFD_RELOC_MIPS_HIGHEST},
10997 {"%higher", BFD_RELOC_MIPS_HIGHER},
10998 {"%neg", BFD_RELOC_MIPS_SUB},
3f98094e
DJ
10999 {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
11000 {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
11001 {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
11002 {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
11003 {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
11004 {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
11005 {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
ad8d3bb3 11006#endif
5e0116d5 11007 {"%hi", BFD_RELOC_HI16_S}
ad8d3bb3
TS
11008};
11009
d6f16593
MR
11010static const struct percent_op_match mips16_percent_op[] =
11011{
11012 {"%lo", BFD_RELOC_MIPS16_LO16},
11013 {"%gprel", BFD_RELOC_MIPS16_GPREL},
738e5348
RS
11014 {"%got", BFD_RELOC_MIPS16_GOT16},
11015 {"%call16", BFD_RELOC_MIPS16_CALL16},
d6f16593
MR
11016 {"%hi", BFD_RELOC_MIPS16_HI16_S}
11017};
11018
252b5132 11019
5e0116d5
RS
11020/* Return true if *STR points to a relocation operator. When returning true,
11021 move *STR over the operator and store its relocation code in *RELOC.
11022 Leave both *STR and *RELOC alone when returning false. */
11023
11024static bfd_boolean
17a2f251 11025parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
252b5132 11026{
d6f16593
MR
11027 const struct percent_op_match *percent_op;
11028 size_t limit, i;
11029
11030 if (mips_opts.mips16)
11031 {
11032 percent_op = mips16_percent_op;
11033 limit = ARRAY_SIZE (mips16_percent_op);
11034 }
11035 else
11036 {
11037 percent_op = mips_percent_op;
11038 limit = ARRAY_SIZE (mips_percent_op);
11039 }
76b3015f 11040
d6f16593 11041 for (i = 0; i < limit; i++)
5e0116d5 11042 if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
394f9b3a 11043 {
3f98094e
DJ
11044 int len = strlen (percent_op[i].str);
11045
11046 if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
11047 continue;
11048
5e0116d5
RS
11049 *str += strlen (percent_op[i].str);
11050 *reloc = percent_op[i].reloc;
394f9b3a 11051
5e0116d5
RS
11052 /* Check whether the output BFD supports this relocation.
11053 If not, issue an error and fall back on something safe. */
11054 if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
394f9b3a 11055 {
20203fb9 11056 as_bad (_("relocation %s isn't supported by the current ABI"),
5e0116d5 11057 percent_op[i].str);
01a3f561 11058 *reloc = BFD_RELOC_UNUSED;
394f9b3a 11059 }
5e0116d5 11060 return TRUE;
394f9b3a 11061 }
5e0116d5 11062 return FALSE;
394f9b3a 11063}
ad8d3bb3 11064
ad8d3bb3 11065
5e0116d5
RS
11066/* Parse string STR as a 16-bit relocatable operand. Store the
11067 expression in *EP and the relocations in the array starting
11068 at RELOC. Return the number of relocation operators used.
ad8d3bb3 11069
01a3f561 11070 On exit, EXPR_END points to the first character after the expression. */
ad8d3bb3 11071
5e0116d5 11072static size_t
17a2f251
TS
11073my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
11074 char *str)
ad8d3bb3 11075{
5e0116d5
RS
11076 bfd_reloc_code_real_type reversed_reloc[3];
11077 size_t reloc_index, i;
09b8f35a
RS
11078 int crux_depth, str_depth;
11079 char *crux;
5e0116d5
RS
11080
11081 /* Search for the start of the main expression, recoding relocations
09b8f35a
RS
11082 in REVERSED_RELOC. End the loop with CRUX pointing to the start
11083 of the main expression and with CRUX_DEPTH containing the number
11084 of open brackets at that point. */
11085 reloc_index = -1;
11086 str_depth = 0;
11087 do
fb1b3232 11088 {
09b8f35a
RS
11089 reloc_index++;
11090 crux = str;
11091 crux_depth = str_depth;
11092
11093 /* Skip over whitespace and brackets, keeping count of the number
11094 of brackets. */
11095 while (*str == ' ' || *str == '\t' || *str == '(')
11096 if (*str++ == '(')
11097 str_depth++;
5e0116d5 11098 }
09b8f35a
RS
11099 while (*str == '%'
11100 && reloc_index < (HAVE_NEWABI ? 3 : 1)
11101 && parse_relocation (&str, &reversed_reloc[reloc_index]));
ad8d3bb3 11102
09b8f35a 11103 my_getExpression (ep, crux);
5e0116d5 11104 str = expr_end;
394f9b3a 11105
5e0116d5 11106 /* Match every open bracket. */
09b8f35a 11107 while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
5e0116d5 11108 if (*str++ == ')')
09b8f35a 11109 crux_depth--;
394f9b3a 11110
09b8f35a 11111 if (crux_depth > 0)
20203fb9 11112 as_bad (_("unclosed '('"));
394f9b3a 11113
5e0116d5 11114 expr_end = str;
252b5132 11115
01a3f561 11116 if (reloc_index != 0)
64bdfcaf
RS
11117 {
11118 prev_reloc_op_frag = frag_now;
11119 for (i = 0; i < reloc_index; i++)
11120 reloc[i] = reversed_reloc[reloc_index - 1 - i];
11121 }
fb1b3232 11122
5e0116d5 11123 return reloc_index;
252b5132
RH
11124}
11125
11126static void
17a2f251 11127my_getExpression (expressionS *ep, char *str)
252b5132
RH
11128{
11129 char *save_in;
98aa84af 11130 valueT val;
252b5132
RH
11131
11132 save_in = input_line_pointer;
11133 input_line_pointer = str;
11134 expression (ep);
11135 expr_end = input_line_pointer;
11136 input_line_pointer = save_in;
11137
11138 /* If we are in mips16 mode, and this is an expression based on `.',
11139 then we bump the value of the symbol by 1 since that is how other
11140 text symbols are handled. We don't bother to handle complex
11141 expressions, just `.' plus or minus a constant. */
11142 if (mips_opts.mips16
11143 && ep->X_op == O_symbol
11144 && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
11145 && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
49309057
ILT
11146 && symbol_get_frag (ep->X_add_symbol) == frag_now
11147 && symbol_constant_p (ep->X_add_symbol)
98aa84af
AM
11148 && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
11149 S_SET_VALUE (ep->X_add_symbol, val + 1);
252b5132
RH
11150}
11151
252b5132 11152char *
17a2f251 11153md_atof (int type, char *litP, int *sizeP)
252b5132 11154{
499ac353 11155 return ieee_md_atof (type, litP, sizeP, target_big_endian);
252b5132
RH
11156}
11157
11158void
17a2f251 11159md_number_to_chars (char *buf, valueT val, int n)
252b5132
RH
11160{
11161 if (target_big_endian)
11162 number_to_chars_bigendian (buf, val, n);
11163 else
11164 number_to_chars_littleendian (buf, val, n);
11165}
11166\f
ae948b86 11167#ifdef OBJ_ELF
e013f690
TS
11168static int support_64bit_objects(void)
11169{
11170 const char **list, **l;
aa3d8fdf 11171 int yes;
e013f690
TS
11172
11173 list = bfd_target_list ();
11174 for (l = list; *l != NULL; l++)
11175#ifdef TE_TMIPS
11176 /* This is traditional mips */
11177 if (strcmp (*l, "elf64-tradbigmips") == 0
11178 || strcmp (*l, "elf64-tradlittlemips") == 0)
11179#else
11180 if (strcmp (*l, "elf64-bigmips") == 0
11181 || strcmp (*l, "elf64-littlemips") == 0)
11182#endif
11183 break;
aa3d8fdf 11184 yes = (*l != NULL);
e013f690 11185 free (list);
aa3d8fdf 11186 return yes;
e013f690 11187}
ae948b86 11188#endif /* OBJ_ELF */
e013f690 11189
78849248 11190const char *md_shortopts = "O::g::G:";
252b5132 11191
23fce1e3
NC
11192enum options
11193 {
11194 OPTION_MARCH = OPTION_MD_BASE,
11195 OPTION_MTUNE,
11196 OPTION_MIPS1,
11197 OPTION_MIPS2,
11198 OPTION_MIPS3,
11199 OPTION_MIPS4,
11200 OPTION_MIPS5,
11201 OPTION_MIPS32,
11202 OPTION_MIPS64,
11203 OPTION_MIPS32R2,
11204 OPTION_MIPS64R2,
11205 OPTION_MIPS16,
11206 OPTION_NO_MIPS16,
11207 OPTION_MIPS3D,
11208 OPTION_NO_MIPS3D,
11209 OPTION_MDMX,
11210 OPTION_NO_MDMX,
11211 OPTION_DSP,
11212 OPTION_NO_DSP,
11213 OPTION_MT,
11214 OPTION_NO_MT,
11215 OPTION_SMARTMIPS,
11216 OPTION_NO_SMARTMIPS,
11217 OPTION_DSPR2,
11218 OPTION_NO_DSPR2,
11219 OPTION_COMPAT_ARCH_BASE,
11220 OPTION_M4650,
11221 OPTION_NO_M4650,
11222 OPTION_M4010,
11223 OPTION_NO_M4010,
11224 OPTION_M4100,
11225 OPTION_NO_M4100,
11226 OPTION_M3900,
11227 OPTION_NO_M3900,
11228 OPTION_M7000_HILO_FIX,
6a32d874
CM
11229 OPTION_MNO_7000_HILO_FIX,
11230 OPTION_FIX_24K,
11231 OPTION_NO_FIX_24K,
c67a084a
NC
11232 OPTION_FIX_LOONGSON2F_JUMP,
11233 OPTION_NO_FIX_LOONGSON2F_JUMP,
11234 OPTION_FIX_LOONGSON2F_NOP,
11235 OPTION_NO_FIX_LOONGSON2F_NOP,
23fce1e3
NC
11236 OPTION_FIX_VR4120,
11237 OPTION_NO_FIX_VR4120,
11238 OPTION_FIX_VR4130,
11239 OPTION_NO_FIX_VR4130,
d954098f
DD
11240 OPTION_FIX_CN63XXP1,
11241 OPTION_NO_FIX_CN63XXP1,
23fce1e3
NC
11242 OPTION_TRAP,
11243 OPTION_BREAK,
11244 OPTION_EB,
11245 OPTION_EL,
11246 OPTION_FP32,
11247 OPTION_GP32,
11248 OPTION_CONSTRUCT_FLOATS,
11249 OPTION_NO_CONSTRUCT_FLOATS,
11250 OPTION_FP64,
11251 OPTION_GP64,
11252 OPTION_RELAX_BRANCH,
11253 OPTION_NO_RELAX_BRANCH,
11254 OPTION_MSHARED,
11255 OPTION_MNO_SHARED,
11256 OPTION_MSYM32,
11257 OPTION_MNO_SYM32,
11258 OPTION_SOFT_FLOAT,
11259 OPTION_HARD_FLOAT,
11260 OPTION_SINGLE_FLOAT,
11261 OPTION_DOUBLE_FLOAT,
11262 OPTION_32,
11263#ifdef OBJ_ELF
11264 OPTION_CALL_SHARED,
11265 OPTION_CALL_NONPIC,
11266 OPTION_NON_SHARED,
11267 OPTION_XGOT,
11268 OPTION_MABI,
11269 OPTION_N32,
11270 OPTION_64,
11271 OPTION_MDEBUG,
11272 OPTION_NO_MDEBUG,
11273 OPTION_PDR,
11274 OPTION_NO_PDR,
11275 OPTION_MVXWORKS_PIC,
11276#endif /* OBJ_ELF */
11277 OPTION_END_OF_ENUM
11278 };
11279
e972090a
NC
11280struct option md_longopts[] =
11281{
f9b4148d 11282 /* Options which specify architecture. */
f9b4148d 11283 {"march", required_argument, NULL, OPTION_MARCH},
f9b4148d 11284 {"mtune", required_argument, NULL, OPTION_MTUNE},
252b5132
RH
11285 {"mips0", no_argument, NULL, OPTION_MIPS1},
11286 {"mips1", no_argument, NULL, OPTION_MIPS1},
252b5132 11287 {"mips2", no_argument, NULL, OPTION_MIPS2},
252b5132 11288 {"mips3", no_argument, NULL, OPTION_MIPS3},
252b5132 11289 {"mips4", no_argument, NULL, OPTION_MIPS4},
ae948b86 11290 {"mips5", no_argument, NULL, OPTION_MIPS5},
ae948b86 11291 {"mips32", no_argument, NULL, OPTION_MIPS32},
ae948b86 11292 {"mips64", no_argument, NULL, OPTION_MIPS64},
f9b4148d 11293 {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
5f74bc13 11294 {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
f9b4148d
CD
11295
11296 /* Options which specify Application Specific Extensions (ASEs). */
f9b4148d 11297 {"mips16", no_argument, NULL, OPTION_MIPS16},
f9b4148d 11298 {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
f9b4148d 11299 {"mips3d", no_argument, NULL, OPTION_MIPS3D},
f9b4148d 11300 {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
f9b4148d 11301 {"mdmx", no_argument, NULL, OPTION_MDMX},
f9b4148d 11302 {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
74cd071d 11303 {"mdsp", no_argument, NULL, OPTION_DSP},
74cd071d 11304 {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
ef2e4d86 11305 {"mmt", no_argument, NULL, OPTION_MT},
ef2e4d86 11306 {"mno-mt", no_argument, NULL, OPTION_NO_MT},
e16bfa71 11307 {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
e16bfa71 11308 {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
8b082fb1 11309 {"mdspr2", no_argument, NULL, OPTION_DSPR2},
8b082fb1 11310 {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
f9b4148d
CD
11311
11312 /* Old-style architecture options. Don't add more of these. */
f9b4148d 11313 {"m4650", no_argument, NULL, OPTION_M4650},
f9b4148d 11314 {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
f9b4148d 11315 {"m4010", no_argument, NULL, OPTION_M4010},
f9b4148d 11316 {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
f9b4148d 11317 {"m4100", no_argument, NULL, OPTION_M4100},
f9b4148d 11318 {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
f9b4148d 11319 {"m3900", no_argument, NULL, OPTION_M3900},
f9b4148d
CD
11320 {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
11321
11322 /* Options which enable bug fixes. */
f9b4148d 11323 {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
f9b4148d
CD
11324 {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11325 {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
c67a084a
NC
11326 {"mfix-loongson2f-jump", no_argument, NULL, OPTION_FIX_LOONGSON2F_JUMP},
11327 {"mno-fix-loongson2f-jump", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_JUMP},
11328 {"mfix-loongson2f-nop", no_argument, NULL, OPTION_FIX_LOONGSON2F_NOP},
11329 {"mno-fix-loongson2f-nop", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_NOP},
d766e8ec
RS
11330 {"mfix-vr4120", no_argument, NULL, OPTION_FIX_VR4120},
11331 {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
7d8e00cf
RS
11332 {"mfix-vr4130", no_argument, NULL, OPTION_FIX_VR4130},
11333 {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
6a32d874
CM
11334 {"mfix-24k", no_argument, NULL, OPTION_FIX_24K},
11335 {"mno-fix-24k", no_argument, NULL, OPTION_NO_FIX_24K},
d954098f
DD
11336 {"mfix-cn63xxp1", no_argument, NULL, OPTION_FIX_CN63XXP1},
11337 {"mno-fix-cn63xxp1", no_argument, NULL, OPTION_NO_FIX_CN63XXP1},
f9b4148d
CD
11338
11339 /* Miscellaneous options. */
252b5132
RH
11340 {"trap", no_argument, NULL, OPTION_TRAP},
11341 {"no-break", no_argument, NULL, OPTION_TRAP},
252b5132
RH
11342 {"break", no_argument, NULL, OPTION_BREAK},
11343 {"no-trap", no_argument, NULL, OPTION_BREAK},
252b5132 11344 {"EB", no_argument, NULL, OPTION_EB},
252b5132 11345 {"EL", no_argument, NULL, OPTION_EL},
ae948b86 11346 {"mfp32", no_argument, NULL, OPTION_FP32},
c97ef257 11347 {"mgp32", no_argument, NULL, OPTION_GP32},
119d663a 11348 {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
119d663a 11349 {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
316f5878 11350 {"mfp64", no_argument, NULL, OPTION_FP64},
ae948b86 11351 {"mgp64", no_argument, NULL, OPTION_GP64},
4a6a3df4
AO
11352 {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
11353 {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
aa6975fb
ILT
11354 {"mshared", no_argument, NULL, OPTION_MSHARED},
11355 {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
aed1a261
RS
11356 {"msym32", no_argument, NULL, OPTION_MSYM32},
11357 {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
037b32b9
AN
11358 {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
11359 {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
037b32b9
AN
11360 {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
11361 {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
23fce1e3
NC
11362
11363 /* Strictly speaking this next option is ELF specific,
11364 but we allow it for other ports as well in order to
11365 make testing easier. */
11366 {"32", no_argument, NULL, OPTION_32},
037b32b9 11367
f9b4148d 11368 /* ELF-specific options. */
156c2f8b 11369#ifdef OBJ_ELF
156c2f8b
NC
11370 {"KPIC", no_argument, NULL, OPTION_CALL_SHARED},
11371 {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
861fb55a 11372 {"call_nonpic", no_argument, NULL, OPTION_CALL_NONPIC},
156c2f8b
NC
11373 {"non_shared", no_argument, NULL, OPTION_NON_SHARED},
11374 {"xgot", no_argument, NULL, OPTION_XGOT},
ae948b86 11375 {"mabi", required_argument, NULL, OPTION_MABI},
e013f690 11376 {"n32", no_argument, NULL, OPTION_N32},
156c2f8b 11377 {"64", no_argument, NULL, OPTION_64},
ecb4347a 11378 {"mdebug", no_argument, NULL, OPTION_MDEBUG},
ecb4347a 11379 {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
dcd410fe 11380 {"mpdr", no_argument, NULL, OPTION_PDR},
dcd410fe 11381 {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
0a44bf69 11382 {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
ae948b86 11383#endif /* OBJ_ELF */
f9b4148d 11384
252b5132
RH
11385 {NULL, no_argument, NULL, 0}
11386};
156c2f8b 11387size_t md_longopts_size = sizeof (md_longopts);
252b5132 11388
316f5878
RS
11389/* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
11390 NEW_VALUE. Warn if another value was already specified. Note:
11391 we have to defer parsing the -march and -mtune arguments in order
11392 to handle 'from-abi' correctly, since the ABI might be specified
11393 in a later argument. */
11394
11395static void
17a2f251 11396mips_set_option_string (const char **string_ptr, const char *new_value)
316f5878
RS
11397{
11398 if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
11399 as_warn (_("A different %s was already specified, is now %s"),
11400 string_ptr == &mips_arch_string ? "-march" : "-mtune",
11401 new_value);
11402
11403 *string_ptr = new_value;
11404}
11405
252b5132 11406int
17a2f251 11407md_parse_option (int c, char *arg)
252b5132
RH
11408{
11409 switch (c)
11410 {
119d663a
NC
11411 case OPTION_CONSTRUCT_FLOATS:
11412 mips_disable_float_construction = 0;
11413 break;
bdaaa2e1 11414
119d663a
NC
11415 case OPTION_NO_CONSTRUCT_FLOATS:
11416 mips_disable_float_construction = 1;
11417 break;
bdaaa2e1 11418
252b5132
RH
11419 case OPTION_TRAP:
11420 mips_trap = 1;
11421 break;
11422
11423 case OPTION_BREAK:
11424 mips_trap = 0;
11425 break;
11426
11427 case OPTION_EB:
11428 target_big_endian = 1;
11429 break;
11430
11431 case OPTION_EL:
11432 target_big_endian = 0;
11433 break;
11434
11435 case 'O':
4ffff32f
TS
11436 if (arg == NULL)
11437 mips_optimize = 1;
11438 else if (arg[0] == '0')
11439 mips_optimize = 0;
11440 else if (arg[0] == '1')
252b5132
RH
11441 mips_optimize = 1;
11442 else
11443 mips_optimize = 2;
11444 break;
11445
11446 case 'g':
11447 if (arg == NULL)
11448 mips_debug = 2;
11449 else
11450 mips_debug = atoi (arg);
252b5132
RH
11451 break;
11452
11453 case OPTION_MIPS1:
316f5878 11454 file_mips_isa = ISA_MIPS1;
252b5132
RH
11455 break;
11456
11457 case OPTION_MIPS2:
316f5878 11458 file_mips_isa = ISA_MIPS2;
252b5132
RH
11459 break;
11460
11461 case OPTION_MIPS3:
316f5878 11462 file_mips_isa = ISA_MIPS3;
252b5132
RH
11463 break;
11464
11465 case OPTION_MIPS4:
316f5878 11466 file_mips_isa = ISA_MIPS4;
e7af610e
NC
11467 break;
11468
84ea6cf2 11469 case OPTION_MIPS5:
316f5878 11470 file_mips_isa = ISA_MIPS5;
84ea6cf2
NC
11471 break;
11472
e7af610e 11473 case OPTION_MIPS32:
316f5878 11474 file_mips_isa = ISA_MIPS32;
252b5132
RH
11475 break;
11476
af7ee8bf
CD
11477 case OPTION_MIPS32R2:
11478 file_mips_isa = ISA_MIPS32R2;
11479 break;
11480
5f74bc13
CD
11481 case OPTION_MIPS64R2:
11482 file_mips_isa = ISA_MIPS64R2;
11483 break;
11484
84ea6cf2 11485 case OPTION_MIPS64:
316f5878 11486 file_mips_isa = ISA_MIPS64;
84ea6cf2
NC
11487 break;
11488
ec68c924 11489 case OPTION_MTUNE:
316f5878
RS
11490 mips_set_option_string (&mips_tune_string, arg);
11491 break;
ec68c924 11492
316f5878
RS
11493 case OPTION_MARCH:
11494 mips_set_option_string (&mips_arch_string, arg);
252b5132
RH
11495 break;
11496
11497 case OPTION_M4650:
316f5878
RS
11498 mips_set_option_string (&mips_arch_string, "4650");
11499 mips_set_option_string (&mips_tune_string, "4650");
252b5132
RH
11500 break;
11501
11502 case OPTION_NO_M4650:
11503 break;
11504
11505 case OPTION_M4010:
316f5878
RS
11506 mips_set_option_string (&mips_arch_string, "4010");
11507 mips_set_option_string (&mips_tune_string, "4010");
252b5132
RH
11508 break;
11509
11510 case OPTION_NO_M4010:
11511 break;
11512
11513 case OPTION_M4100:
316f5878
RS
11514 mips_set_option_string (&mips_arch_string, "4100");
11515 mips_set_option_string (&mips_tune_string, "4100");
252b5132
RH
11516 break;
11517
11518 case OPTION_NO_M4100:
11519 break;
11520
252b5132 11521 case OPTION_M3900:
316f5878
RS
11522 mips_set_option_string (&mips_arch_string, "3900");
11523 mips_set_option_string (&mips_tune_string, "3900");
252b5132 11524 break;
bdaaa2e1 11525
252b5132
RH
11526 case OPTION_NO_M3900:
11527 break;
11528
deec1734
CD
11529 case OPTION_MDMX:
11530 mips_opts.ase_mdmx = 1;
11531 break;
11532
11533 case OPTION_NO_MDMX:
11534 mips_opts.ase_mdmx = 0;
11535 break;
11536
74cd071d
CF
11537 case OPTION_DSP:
11538 mips_opts.ase_dsp = 1;
8b082fb1 11539 mips_opts.ase_dspr2 = 0;
74cd071d
CF
11540 break;
11541
11542 case OPTION_NO_DSP:
8b082fb1
TS
11543 mips_opts.ase_dsp = 0;
11544 mips_opts.ase_dspr2 = 0;
11545 break;
11546
11547 case OPTION_DSPR2:
11548 mips_opts.ase_dspr2 = 1;
11549 mips_opts.ase_dsp = 1;
11550 break;
11551
11552 case OPTION_NO_DSPR2:
11553 mips_opts.ase_dspr2 = 0;
74cd071d
CF
11554 mips_opts.ase_dsp = 0;
11555 break;
11556
ef2e4d86
CF
11557 case OPTION_MT:
11558 mips_opts.ase_mt = 1;
11559 break;
11560
11561 case OPTION_NO_MT:
11562 mips_opts.ase_mt = 0;
11563 break;
11564
252b5132
RH
11565 case OPTION_MIPS16:
11566 mips_opts.mips16 = 1;
7d10b47d 11567 mips_no_prev_insn ();
252b5132
RH
11568 break;
11569
11570 case OPTION_NO_MIPS16:
11571 mips_opts.mips16 = 0;
7d10b47d 11572 mips_no_prev_insn ();
252b5132
RH
11573 break;
11574
1f25f5d3
CD
11575 case OPTION_MIPS3D:
11576 mips_opts.ase_mips3d = 1;
11577 break;
11578
11579 case OPTION_NO_MIPS3D:
11580 mips_opts.ase_mips3d = 0;
11581 break;
11582
e16bfa71
TS
11583 case OPTION_SMARTMIPS:
11584 mips_opts.ase_smartmips = 1;
11585 break;
11586
11587 case OPTION_NO_SMARTMIPS:
11588 mips_opts.ase_smartmips = 0;
11589 break;
11590
6a32d874
CM
11591 case OPTION_FIX_24K:
11592 mips_fix_24k = 1;
11593 break;
11594
11595 case OPTION_NO_FIX_24K:
11596 mips_fix_24k = 0;
11597 break;
11598
c67a084a
NC
11599 case OPTION_FIX_LOONGSON2F_JUMP:
11600 mips_fix_loongson2f_jump = TRUE;
11601 break;
11602
11603 case OPTION_NO_FIX_LOONGSON2F_JUMP:
11604 mips_fix_loongson2f_jump = FALSE;
11605 break;
11606
11607 case OPTION_FIX_LOONGSON2F_NOP:
11608 mips_fix_loongson2f_nop = TRUE;
11609 break;
11610
11611 case OPTION_NO_FIX_LOONGSON2F_NOP:
11612 mips_fix_loongson2f_nop = FALSE;
11613 break;
11614
d766e8ec
RS
11615 case OPTION_FIX_VR4120:
11616 mips_fix_vr4120 = 1;
60b63b72
RS
11617 break;
11618
d766e8ec
RS
11619 case OPTION_NO_FIX_VR4120:
11620 mips_fix_vr4120 = 0;
60b63b72
RS
11621 break;
11622
7d8e00cf
RS
11623 case OPTION_FIX_VR4130:
11624 mips_fix_vr4130 = 1;
11625 break;
11626
11627 case OPTION_NO_FIX_VR4130:
11628 mips_fix_vr4130 = 0;
11629 break;
11630
d954098f
DD
11631 case OPTION_FIX_CN63XXP1:
11632 mips_fix_cn63xxp1 = TRUE;
11633 break;
11634
11635 case OPTION_NO_FIX_CN63XXP1:
11636 mips_fix_cn63xxp1 = FALSE;
11637 break;
11638
4a6a3df4
AO
11639 case OPTION_RELAX_BRANCH:
11640 mips_relax_branch = 1;
11641 break;
11642
11643 case OPTION_NO_RELAX_BRANCH:
11644 mips_relax_branch = 0;
11645 break;
11646
aa6975fb
ILT
11647 case OPTION_MSHARED:
11648 mips_in_shared = TRUE;
11649 break;
11650
11651 case OPTION_MNO_SHARED:
11652 mips_in_shared = FALSE;
11653 break;
11654
aed1a261
RS
11655 case OPTION_MSYM32:
11656 mips_opts.sym32 = TRUE;
11657 break;
11658
11659 case OPTION_MNO_SYM32:
11660 mips_opts.sym32 = FALSE;
11661 break;
11662
0f074f60 11663#ifdef OBJ_ELF
252b5132
RH
11664 /* When generating ELF code, we permit -KPIC and -call_shared to
11665 select SVR4_PIC, and -non_shared to select no PIC. This is
11666 intended to be compatible with Irix 5. */
11667 case OPTION_CALL_SHARED:
f43abd2b 11668 if (!IS_ELF)
252b5132
RH
11669 {
11670 as_bad (_("-call_shared is supported only for ELF format"));
11671 return 0;
11672 }
11673 mips_pic = SVR4_PIC;
143d77c5 11674 mips_abicalls = TRUE;
252b5132
RH
11675 break;
11676
861fb55a
DJ
11677 case OPTION_CALL_NONPIC:
11678 if (!IS_ELF)
11679 {
11680 as_bad (_("-call_nonpic is supported only for ELF format"));
11681 return 0;
11682 }
11683 mips_pic = NO_PIC;
11684 mips_abicalls = TRUE;
11685 break;
11686
252b5132 11687 case OPTION_NON_SHARED:
f43abd2b 11688 if (!IS_ELF)
252b5132
RH
11689 {
11690 as_bad (_("-non_shared is supported only for ELF format"));
11691 return 0;
11692 }
11693 mips_pic = NO_PIC;
143d77c5 11694 mips_abicalls = FALSE;
252b5132
RH
11695 break;
11696
44075ae2
TS
11697 /* The -xgot option tells the assembler to use 32 bit offsets
11698 when accessing the got in SVR4_PIC mode. It is for Irix
252b5132
RH
11699 compatibility. */
11700 case OPTION_XGOT:
11701 mips_big_got = 1;
11702 break;
0f074f60 11703#endif /* OBJ_ELF */
252b5132
RH
11704
11705 case 'G':
6caf9ef4
TS
11706 g_switch_value = atoi (arg);
11707 g_switch_seen = 1;
252b5132
RH
11708 break;
11709
34ba82a8
TS
11710 /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
11711 and -mabi=64. */
252b5132 11712 case OPTION_32:
23fce1e3
NC
11713 if (IS_ELF)
11714 mips_abi = O32_ABI;
11715 /* We silently ignore -32 for non-ELF targets. This greatly
11716 simplifies the construction of the MIPS GAS test cases. */
252b5132
RH
11717 break;
11718
23fce1e3 11719#ifdef OBJ_ELF
e013f690 11720 case OPTION_N32:
f43abd2b 11721 if (!IS_ELF)
34ba82a8
TS
11722 {
11723 as_bad (_("-n32 is supported for ELF format only"));
11724 return 0;
11725 }
316f5878 11726 mips_abi = N32_ABI;
e013f690 11727 break;
252b5132 11728
e013f690 11729 case OPTION_64:
f43abd2b 11730 if (!IS_ELF)
34ba82a8
TS
11731 {
11732 as_bad (_("-64 is supported for ELF format only"));
11733 return 0;
11734 }
316f5878 11735 mips_abi = N64_ABI;
f43abd2b 11736 if (!support_64bit_objects())
e013f690 11737 as_fatal (_("No compiled in support for 64 bit object file format"));
252b5132 11738 break;
ae948b86 11739#endif /* OBJ_ELF */
252b5132 11740
c97ef257 11741 case OPTION_GP32:
a325df1d 11742 file_mips_gp32 = 1;
c97ef257
AH
11743 break;
11744
11745 case OPTION_GP64:
a325df1d 11746 file_mips_gp32 = 0;
c97ef257 11747 break;
252b5132 11748
ca4e0257 11749 case OPTION_FP32:
a325df1d 11750 file_mips_fp32 = 1;
316f5878
RS
11751 break;
11752
11753 case OPTION_FP64:
11754 file_mips_fp32 = 0;
ca4e0257
RS
11755 break;
11756
037b32b9
AN
11757 case OPTION_SINGLE_FLOAT:
11758 file_mips_single_float = 1;
11759 break;
11760
11761 case OPTION_DOUBLE_FLOAT:
11762 file_mips_single_float = 0;
11763 break;
11764
11765 case OPTION_SOFT_FLOAT:
11766 file_mips_soft_float = 1;
11767 break;
11768
11769 case OPTION_HARD_FLOAT:
11770 file_mips_soft_float = 0;
11771 break;
11772
ae948b86 11773#ifdef OBJ_ELF
252b5132 11774 case OPTION_MABI:
f43abd2b 11775 if (!IS_ELF)
34ba82a8
TS
11776 {
11777 as_bad (_("-mabi is supported for ELF format only"));
11778 return 0;
11779 }
e013f690 11780 if (strcmp (arg, "32") == 0)
316f5878 11781 mips_abi = O32_ABI;
e013f690 11782 else if (strcmp (arg, "o64") == 0)
316f5878 11783 mips_abi = O64_ABI;
e013f690 11784 else if (strcmp (arg, "n32") == 0)
316f5878 11785 mips_abi = N32_ABI;
e013f690
TS
11786 else if (strcmp (arg, "64") == 0)
11787 {
316f5878 11788 mips_abi = N64_ABI;
e013f690
TS
11789 if (! support_64bit_objects())
11790 as_fatal (_("No compiled in support for 64 bit object file "
11791 "format"));
11792 }
11793 else if (strcmp (arg, "eabi") == 0)
316f5878 11794 mips_abi = EABI_ABI;
e013f690 11795 else
da0e507f
TS
11796 {
11797 as_fatal (_("invalid abi -mabi=%s"), arg);
11798 return 0;
11799 }
252b5132 11800 break;
e013f690 11801#endif /* OBJ_ELF */
252b5132 11802
6b76fefe 11803 case OPTION_M7000_HILO_FIX:
b34976b6 11804 mips_7000_hilo_fix = TRUE;
6b76fefe
CM
11805 break;
11806
9ee72ff1 11807 case OPTION_MNO_7000_HILO_FIX:
b34976b6 11808 mips_7000_hilo_fix = FALSE;
6b76fefe
CM
11809 break;
11810
ecb4347a
DJ
11811#ifdef OBJ_ELF
11812 case OPTION_MDEBUG:
b34976b6 11813 mips_flag_mdebug = TRUE;
ecb4347a
DJ
11814 break;
11815
11816 case OPTION_NO_MDEBUG:
b34976b6 11817 mips_flag_mdebug = FALSE;
ecb4347a 11818 break;
dcd410fe
RO
11819
11820 case OPTION_PDR:
11821 mips_flag_pdr = TRUE;
11822 break;
11823
11824 case OPTION_NO_PDR:
11825 mips_flag_pdr = FALSE;
11826 break;
0a44bf69
RS
11827
11828 case OPTION_MVXWORKS_PIC:
11829 mips_pic = VXWORKS_PIC;
11830 break;
ecb4347a
DJ
11831#endif /* OBJ_ELF */
11832
252b5132
RH
11833 default:
11834 return 0;
11835 }
11836
c67a084a
NC
11837 mips_fix_loongson2f = mips_fix_loongson2f_nop || mips_fix_loongson2f_jump;
11838
252b5132
RH
11839 return 1;
11840}
316f5878
RS
11841\f
11842/* Set up globals to generate code for the ISA or processor
11843 described by INFO. */
252b5132 11844
252b5132 11845static void
17a2f251 11846mips_set_architecture (const struct mips_cpu_info *info)
252b5132 11847{
316f5878 11848 if (info != 0)
252b5132 11849 {
fef14a42
TS
11850 file_mips_arch = info->cpu;
11851 mips_opts.arch = info->cpu;
316f5878 11852 mips_opts.isa = info->isa;
252b5132 11853 }
252b5132
RH
11854}
11855
252b5132 11856
316f5878 11857/* Likewise for tuning. */
252b5132 11858
316f5878 11859static void
17a2f251 11860mips_set_tune (const struct mips_cpu_info *info)
316f5878
RS
11861{
11862 if (info != 0)
fef14a42 11863 mips_tune = info->cpu;
316f5878 11864}
80cc45a5 11865
34ba82a8 11866
252b5132 11867void
17a2f251 11868mips_after_parse_args (void)
e9670677 11869{
fef14a42
TS
11870 const struct mips_cpu_info *arch_info = 0;
11871 const struct mips_cpu_info *tune_info = 0;
11872
e9670677 11873 /* GP relative stuff not working for PE */
6caf9ef4 11874 if (strncmp (TARGET_OS, "pe", 2) == 0)
e9670677 11875 {
6caf9ef4 11876 if (g_switch_seen && g_switch_value != 0)
e9670677
MR
11877 as_bad (_("-G not supported in this configuration."));
11878 g_switch_value = 0;
11879 }
11880
cac012d6
AO
11881 if (mips_abi == NO_ABI)
11882 mips_abi = MIPS_DEFAULT_ABI;
11883
22923709
RS
11884 /* The following code determines the architecture and register size.
11885 Similar code was added to GCC 3.3 (see override_options() in
11886 config/mips/mips.c). The GAS and GCC code should be kept in sync
11887 as much as possible. */
e9670677 11888
316f5878 11889 if (mips_arch_string != 0)
fef14a42 11890 arch_info = mips_parse_cpu ("-march", mips_arch_string);
e9670677 11891
316f5878 11892 if (file_mips_isa != ISA_UNKNOWN)
e9670677 11893 {
316f5878 11894 /* Handle -mipsN. At this point, file_mips_isa contains the
fef14a42 11895 ISA level specified by -mipsN, while arch_info->isa contains
316f5878 11896 the -march selection (if any). */
fef14a42 11897 if (arch_info != 0)
e9670677 11898 {
316f5878
RS
11899 /* -march takes precedence over -mipsN, since it is more descriptive.
11900 There's no harm in specifying both as long as the ISA levels
11901 are the same. */
fef14a42 11902 if (file_mips_isa != arch_info->isa)
316f5878
RS
11903 as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
11904 mips_cpu_info_from_isa (file_mips_isa)->name,
fef14a42 11905 mips_cpu_info_from_isa (arch_info->isa)->name);
e9670677 11906 }
316f5878 11907 else
fef14a42 11908 arch_info = mips_cpu_info_from_isa (file_mips_isa);
e9670677
MR
11909 }
11910
fef14a42
TS
11911 if (arch_info == 0)
11912 arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
e9670677 11913
fef14a42 11914 if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
20203fb9 11915 as_bad (_("-march=%s is not compatible with the selected ABI"),
fef14a42
TS
11916 arch_info->name);
11917
11918 mips_set_architecture (arch_info);
11919
11920 /* Optimize for file_mips_arch, unless -mtune selects a different processor. */
11921 if (mips_tune_string != 0)
11922 tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
e9670677 11923
fef14a42
TS
11924 if (tune_info == 0)
11925 mips_set_tune (arch_info);
11926 else
11927 mips_set_tune (tune_info);
e9670677 11928
316f5878 11929 if (file_mips_gp32 >= 0)
e9670677 11930 {
316f5878
RS
11931 /* The user specified the size of the integer registers. Make sure
11932 it agrees with the ABI and ISA. */
11933 if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
11934 as_bad (_("-mgp64 used with a 32-bit processor"));
11935 else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
11936 as_bad (_("-mgp32 used with a 64-bit ABI"));
11937 else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
11938 as_bad (_("-mgp64 used with a 32-bit ABI"));
e9670677
MR
11939 }
11940 else
11941 {
316f5878
RS
11942 /* Infer the integer register size from the ABI and processor.
11943 Restrict ourselves to 32-bit registers if that's all the
11944 processor has, or if the ABI cannot handle 64-bit registers. */
11945 file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
11946 || !ISA_HAS_64BIT_REGS (mips_opts.isa));
e9670677
MR
11947 }
11948
ad3fea08
TS
11949 switch (file_mips_fp32)
11950 {
11951 default:
11952 case -1:
11953 /* No user specified float register size.
11954 ??? GAS treats single-float processors as though they had 64-bit
11955 float registers (although it complains when double-precision
11956 instructions are used). As things stand, saying they have 32-bit
11957 registers would lead to spurious "register must be even" messages.
11958 So here we assume float registers are never smaller than the
11959 integer ones. */
11960 if (file_mips_gp32 == 0)
11961 /* 64-bit integer registers implies 64-bit float registers. */
11962 file_mips_fp32 = 0;
11963 else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
11964 && ISA_HAS_64BIT_FPRS (mips_opts.isa))
11965 /* -mips3d and -mdmx imply 64-bit float registers, if possible. */
11966 file_mips_fp32 = 0;
11967 else
11968 /* 32-bit float registers. */
11969 file_mips_fp32 = 1;
11970 break;
11971
11972 /* The user specified the size of the float registers. Check if it
11973 agrees with the ABI and ISA. */
11974 case 0:
11975 if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
11976 as_bad (_("-mfp64 used with a 32-bit fpu"));
11977 else if (ABI_NEEDS_32BIT_REGS (mips_abi)
11978 && !ISA_HAS_MXHC1 (mips_opts.isa))
11979 as_warn (_("-mfp64 used with a 32-bit ABI"));
11980 break;
11981 case 1:
11982 if (ABI_NEEDS_64BIT_REGS (mips_abi))
11983 as_warn (_("-mfp32 used with a 64-bit ABI"));
11984 break;
11985 }
e9670677 11986
316f5878 11987 /* End of GCC-shared inference code. */
e9670677 11988
17a2f251
TS
11989 /* This flag is set when we have a 64-bit capable CPU but use only
11990 32-bit wide registers. Note that EABI does not use it. */
11991 if (ISA_HAS_64BIT_REGS (mips_opts.isa)
11992 && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
11993 || mips_abi == O32_ABI))
316f5878 11994 mips_32bitmode = 1;
e9670677
MR
11995
11996 if (mips_opts.isa == ISA_MIPS1 && mips_trap)
11997 as_bad (_("trap exception not supported at ISA 1"));
11998
e9670677
MR
11999 /* If the selected architecture includes support for ASEs, enable
12000 generation of code for them. */
a4672219 12001 if (mips_opts.mips16 == -1)
fef14a42 12002 mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
ffdefa66 12003 if (mips_opts.ase_mips3d == -1)
65263ce3 12004 mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
ad3fea08
TS
12005 && file_mips_fp32 == 0) ? 1 : 0;
12006 if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
12007 as_bad (_("-mfp32 used with -mips3d"));
12008
ffdefa66 12009 if (mips_opts.ase_mdmx == -1)
65263ce3 12010 mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
ad3fea08
TS
12011 && file_mips_fp32 == 0) ? 1 : 0;
12012 if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
12013 as_bad (_("-mfp32 used with -mdmx"));
12014
12015 if (mips_opts.ase_smartmips == -1)
12016 mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
12017 if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
20203fb9
NC
12018 as_warn (_("%s ISA does not support SmartMIPS"),
12019 mips_cpu_info_from_isa (mips_opts.isa)->name);
ad3fea08 12020
74cd071d 12021 if (mips_opts.ase_dsp == -1)
ad3fea08
TS
12022 mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
12023 if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
20203fb9
NC
12024 as_warn (_("%s ISA does not support DSP ASE"),
12025 mips_cpu_info_from_isa (mips_opts.isa)->name);
ad3fea08 12026
8b082fb1
TS
12027 if (mips_opts.ase_dspr2 == -1)
12028 {
12029 mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
12030 mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
12031 }
12032 if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
20203fb9
NC
12033 as_warn (_("%s ISA does not support DSP R2 ASE"),
12034 mips_cpu_info_from_isa (mips_opts.isa)->name);
8b082fb1 12035
ef2e4d86 12036 if (mips_opts.ase_mt == -1)
ad3fea08
TS
12037 mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
12038 if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
20203fb9
NC
12039 as_warn (_("%s ISA does not support MT ASE"),
12040 mips_cpu_info_from_isa (mips_opts.isa)->name);
e9670677 12041
e9670677 12042 file_mips_isa = mips_opts.isa;
e9670677
MR
12043 file_ase_mips3d = mips_opts.ase_mips3d;
12044 file_ase_mdmx = mips_opts.ase_mdmx;
e16bfa71 12045 file_ase_smartmips = mips_opts.ase_smartmips;
74cd071d 12046 file_ase_dsp = mips_opts.ase_dsp;
8b082fb1 12047 file_ase_dspr2 = mips_opts.ase_dspr2;
ef2e4d86 12048 file_ase_mt = mips_opts.ase_mt;
e9670677
MR
12049 mips_opts.gp32 = file_mips_gp32;
12050 mips_opts.fp32 = file_mips_fp32;
037b32b9
AN
12051 mips_opts.soft_float = file_mips_soft_float;
12052 mips_opts.single_float = file_mips_single_float;
e9670677 12053
ecb4347a
DJ
12054 if (mips_flag_mdebug < 0)
12055 {
12056#ifdef OBJ_MAYBE_ECOFF
12057 if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
12058 mips_flag_mdebug = 1;
12059 else
12060#endif /* OBJ_MAYBE_ECOFF */
12061 mips_flag_mdebug = 0;
12062 }
e9670677
MR
12063}
12064\f
12065void
17a2f251 12066mips_init_after_args (void)
252b5132
RH
12067{
12068 /* initialize opcodes */
12069 bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
beae10d5 12070 mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
252b5132
RH
12071}
12072
12073long
17a2f251 12074md_pcrel_from (fixS *fixP)
252b5132 12075{
a7ebbfdf
TS
12076 valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
12077 switch (fixP->fx_r_type)
12078 {
12079 case BFD_RELOC_16_PCREL_S2:
12080 case BFD_RELOC_MIPS_JMP:
12081 /* Return the address of the delay slot. */
12082 return addr + 4;
12083 default:
58ea3d6a 12084 /* We have no relocation type for PC relative MIPS16 instructions. */
64817874
TS
12085 if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
12086 as_bad_where (fixP->fx_file, fixP->fx_line,
12087 _("PC relative MIPS16 instruction references a different section"));
a7ebbfdf
TS
12088 return addr;
12089 }
252b5132
RH
12090}
12091
252b5132
RH
12092/* This is called before the symbol table is processed. In order to
12093 work with gcc when using mips-tfile, we must keep all local labels.
12094 However, in other cases, we want to discard them. If we were
12095 called with -g, but we didn't see any debugging information, it may
12096 mean that gcc is smuggling debugging information through to
12097 mips-tfile, in which case we must generate all local labels. */
12098
12099void
17a2f251 12100mips_frob_file_before_adjust (void)
252b5132
RH
12101{
12102#ifndef NO_ECOFF_DEBUGGING
12103 if (ECOFF_DEBUGGING
12104 && mips_debug != 0
12105 && ! ecoff_debugging_seen)
12106 flag_keep_locals = 1;
12107#endif
12108}
12109
3b91255e 12110/* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
55cf6793 12111 the corresponding LO16 reloc. This is called before md_apply_fix and
3b91255e
RS
12112 tc_gen_reloc. Unmatched relocs can only be generated by use of explicit
12113 relocation operators.
12114
12115 For our purposes, a %lo() expression matches a %got() or %hi()
12116 expression if:
12117
12118 (a) it refers to the same symbol; and
12119 (b) the offset applied in the %lo() expression is no lower than
12120 the offset applied in the %got() or %hi().
12121
12122 (b) allows us to cope with code like:
12123
12124 lui $4,%hi(foo)
12125 lh $4,%lo(foo+2)($4)
12126
12127 ...which is legal on RELA targets, and has a well-defined behaviour
12128 if the user knows that adding 2 to "foo" will not induce a carry to
12129 the high 16 bits.
12130
12131 When several %lo()s match a particular %got() or %hi(), we use the
12132 following rules to distinguish them:
12133
12134 (1) %lo()s with smaller offsets are a better match than %lo()s with
12135 higher offsets.
12136
12137 (2) %lo()s with no matching %got() or %hi() are better than those
12138 that already have a matching %got() or %hi().
12139
12140 (3) later %lo()s are better than earlier %lo()s.
12141
12142 These rules are applied in order.
12143
12144 (1) means, among other things, that %lo()s with identical offsets are
12145 chosen if they exist.
12146
12147 (2) means that we won't associate several high-part relocations with
12148 the same low-part relocation unless there's no alternative. Having
12149 several high parts for the same low part is a GNU extension; this rule
12150 allows careful users to avoid it.
12151
12152 (3) is purely cosmetic. mips_hi_fixup_list is is in reverse order,
12153 with the last high-part relocation being at the front of the list.
12154 It therefore makes sense to choose the last matching low-part
12155 relocation, all other things being equal. It's also easier
12156 to code that way. */
252b5132
RH
12157
12158void
17a2f251 12159mips_frob_file (void)
252b5132
RH
12160{
12161 struct mips_hi_fixup *l;
35903be0 12162 bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
252b5132
RH
12163
12164 for (l = mips_hi_fixup_list; l != NULL; l = l->next)
12165 {
12166 segment_info_type *seginfo;
3b91255e
RS
12167 bfd_boolean matched_lo_p;
12168 fixS **hi_pos, **lo_pos, **pos;
252b5132 12169
9c2799c2 12170 gas_assert (reloc_needs_lo_p (l->fixp->fx_r_type));
252b5132 12171
5919d012
RS
12172 /* If a GOT16 relocation turns out to be against a global symbol,
12173 there isn't supposed to be a matching LO. */
738e5348 12174 if (got16_reloc_p (l->fixp->fx_r_type)
5919d012
RS
12175 && !pic_need_relax (l->fixp->fx_addsy, l->seg))
12176 continue;
12177
12178 /* Check quickly whether the next fixup happens to be a matching %lo. */
12179 if (fixup_has_matching_lo_p (l->fixp))
252b5132
RH
12180 continue;
12181
252b5132 12182 seginfo = seg_info (l->seg);
252b5132 12183
3b91255e
RS
12184 /* Set HI_POS to the position of this relocation in the chain.
12185 Set LO_POS to the position of the chosen low-part relocation.
12186 MATCHED_LO_P is true on entry to the loop if *POS is a low-part
12187 relocation that matches an immediately-preceding high-part
12188 relocation. */
12189 hi_pos = NULL;
12190 lo_pos = NULL;
12191 matched_lo_p = FALSE;
738e5348 12192 looking_for_rtype = matching_lo_reloc (l->fixp->fx_r_type);
35903be0 12193
3b91255e
RS
12194 for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
12195 {
12196 if (*pos == l->fixp)
12197 hi_pos = pos;
12198
35903be0 12199 if ((*pos)->fx_r_type == looking_for_rtype
30cfc97a 12200 && symbol_same_p ((*pos)->fx_addsy, l->fixp->fx_addsy)
3b91255e
RS
12201 && (*pos)->fx_offset >= l->fixp->fx_offset
12202 && (lo_pos == NULL
12203 || (*pos)->fx_offset < (*lo_pos)->fx_offset
12204 || (!matched_lo_p
12205 && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
12206 lo_pos = pos;
12207
12208 matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
12209 && fixup_has_matching_lo_p (*pos));
12210 }
12211
12212 /* If we found a match, remove the high-part relocation from its
12213 current position and insert it before the low-part relocation.
12214 Make the offsets match so that fixup_has_matching_lo_p()
12215 will return true.
12216
12217 We don't warn about unmatched high-part relocations since some
12218 versions of gcc have been known to emit dead "lui ...%hi(...)"
12219 instructions. */
12220 if (lo_pos != NULL)
12221 {
12222 l->fixp->fx_offset = (*lo_pos)->fx_offset;
12223 if (l->fixp->fx_next != *lo_pos)
252b5132 12224 {
3b91255e
RS
12225 *hi_pos = l->fixp->fx_next;
12226 l->fixp->fx_next = *lo_pos;
12227 *lo_pos = l->fixp;
252b5132 12228 }
252b5132
RH
12229 }
12230 }
12231}
12232
3e722fb5 12233/* We may have combined relocations without symbols in the N32/N64 ABI.
f6688943 12234 We have to prevent gas from dropping them. */
252b5132 12235
252b5132 12236int
17a2f251 12237mips_force_relocation (fixS *fixp)
252b5132 12238{
ae6063d4 12239 if (generic_force_reloc (fixp))
252b5132
RH
12240 return 1;
12241
f6688943
TS
12242 if (HAVE_NEWABI
12243 && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
12244 && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
738e5348
RS
12245 || hi16_reloc_p (fixp->fx_r_type)
12246 || lo16_reloc_p (fixp->fx_r_type)))
f6688943
TS
12247 return 1;
12248
3e722fb5 12249 return 0;
252b5132
RH
12250}
12251
12252/* Apply a fixup to the object file. */
12253
94f592af 12254void
55cf6793 12255md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
252b5132 12256{
874e8986 12257 bfd_byte *buf;
98aa84af 12258 long insn;
a7ebbfdf 12259 reloc_howto_type *howto;
252b5132 12260
a7ebbfdf
TS
12261 /* We ignore generic BFD relocations we don't know about. */
12262 howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
12263 if (! howto)
12264 return;
65551fa4 12265
9c2799c2 12266 gas_assert (fixP->fx_size == 4
90ecf173
MR
12267 || fixP->fx_r_type == BFD_RELOC_16
12268 || fixP->fx_r_type == BFD_RELOC_64
12269 || fixP->fx_r_type == BFD_RELOC_CTOR
12270 || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
12271 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
12272 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
12273 || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
252b5132 12274
a7ebbfdf 12275 buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
252b5132 12276
9c2799c2 12277 gas_assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2);
b1dca8ee
RS
12278
12279 /* Don't treat parts of a composite relocation as done. There are two
12280 reasons for this:
12281
12282 (1) The second and third parts will be against 0 (RSS_UNDEF) but
12283 should nevertheless be emitted if the first part is.
12284
12285 (2) In normal usage, composite relocations are never assembly-time
12286 constants. The easiest way of dealing with the pathological
12287 exceptions is to generate a relocation against STN_UNDEF and
12288 leave everything up to the linker. */
3994f87e 12289 if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
252b5132
RH
12290 fixP->fx_done = 1;
12291
12292 switch (fixP->fx_r_type)
12293 {
3f98094e
DJ
12294 case BFD_RELOC_MIPS_TLS_GD:
12295 case BFD_RELOC_MIPS_TLS_LDM:
741d6ea8
JM
12296 case BFD_RELOC_MIPS_TLS_DTPREL32:
12297 case BFD_RELOC_MIPS_TLS_DTPREL64:
3f98094e
DJ
12298 case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
12299 case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
12300 case BFD_RELOC_MIPS_TLS_GOTTPREL:
12301 case BFD_RELOC_MIPS_TLS_TPREL_HI16:
12302 case BFD_RELOC_MIPS_TLS_TPREL_LO16:
12303 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12304 /* fall through */
12305
252b5132 12306 case BFD_RELOC_MIPS_JMP:
e369bcce
TS
12307 case BFD_RELOC_MIPS_SHIFT5:
12308 case BFD_RELOC_MIPS_SHIFT6:
12309 case BFD_RELOC_MIPS_GOT_DISP:
12310 case BFD_RELOC_MIPS_GOT_PAGE:
12311 case BFD_RELOC_MIPS_GOT_OFST:
12312 case BFD_RELOC_MIPS_SUB:
12313 case BFD_RELOC_MIPS_INSERT_A:
12314 case BFD_RELOC_MIPS_INSERT_B:
12315 case BFD_RELOC_MIPS_DELETE:
12316 case BFD_RELOC_MIPS_HIGHEST:
12317 case BFD_RELOC_MIPS_HIGHER:
12318 case BFD_RELOC_MIPS_SCN_DISP:
12319 case BFD_RELOC_MIPS_REL16:
12320 case BFD_RELOC_MIPS_RELGOT:
12321 case BFD_RELOC_MIPS_JALR:
252b5132
RH
12322 case BFD_RELOC_HI16:
12323 case BFD_RELOC_HI16_S:
cdf6fd85 12324 case BFD_RELOC_GPREL16:
252b5132
RH
12325 case BFD_RELOC_MIPS_LITERAL:
12326 case BFD_RELOC_MIPS_CALL16:
12327 case BFD_RELOC_MIPS_GOT16:
cdf6fd85 12328 case BFD_RELOC_GPREL32:
252b5132
RH
12329 case BFD_RELOC_MIPS_GOT_HI16:
12330 case BFD_RELOC_MIPS_GOT_LO16:
12331 case BFD_RELOC_MIPS_CALL_HI16:
12332 case BFD_RELOC_MIPS_CALL_LO16:
12333 case BFD_RELOC_MIPS16_GPREL:
738e5348
RS
12334 case BFD_RELOC_MIPS16_GOT16:
12335 case BFD_RELOC_MIPS16_CALL16:
d6f16593
MR
12336 case BFD_RELOC_MIPS16_HI16:
12337 case BFD_RELOC_MIPS16_HI16_S:
252b5132 12338 case BFD_RELOC_MIPS16_JMP:
54f4ddb3 12339 /* Nothing needed to do. The value comes from the reloc entry. */
252b5132
RH
12340 break;
12341
252b5132
RH
12342 case BFD_RELOC_64:
12343 /* This is handled like BFD_RELOC_32, but we output a sign
12344 extended value if we are only 32 bits. */
3e722fb5 12345 if (fixP->fx_done)
252b5132
RH
12346 {
12347 if (8 <= sizeof (valueT))
2132e3a3 12348 md_number_to_chars ((char *) buf, *valP, 8);
252b5132
RH
12349 else
12350 {
a7ebbfdf 12351 valueT hiv;
252b5132 12352
a7ebbfdf 12353 if ((*valP & 0x80000000) != 0)
252b5132
RH
12354 hiv = 0xffffffff;
12355 else
12356 hiv = 0;
b215186b 12357 md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
a7ebbfdf 12358 *valP, 4);
b215186b 12359 md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
a7ebbfdf 12360 hiv, 4);
252b5132
RH
12361 }
12362 }
12363 break;
12364
056350c6 12365 case BFD_RELOC_RVA:
252b5132 12366 case BFD_RELOC_32:
252b5132
RH
12367 case BFD_RELOC_16:
12368 /* If we are deleting this reloc entry, we must fill in the
54f4ddb3
TS
12369 value now. This can happen if we have a .word which is not
12370 resolved when it appears but is later defined. */
252b5132 12371 if (fixP->fx_done)
54f4ddb3 12372 md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
252b5132
RH
12373 break;
12374
12375 case BFD_RELOC_LO16:
d6f16593 12376 case BFD_RELOC_MIPS16_LO16:
3e722fb5
CD
12377 /* FIXME: Now that embedded-PIC is gone, some of this code/comment
12378 may be safe to remove, but if so it's not obvious. */
252b5132
RH
12379 /* When handling an embedded PIC switch statement, we can wind
12380 up deleting a LO16 reloc. See the 'o' case in mips_ip. */
12381 if (fixP->fx_done)
12382 {
a7ebbfdf 12383 if (*valP + 0x8000 > 0xffff)
252b5132
RH
12384 as_bad_where (fixP->fx_file, fixP->fx_line,
12385 _("relocation overflow"));
252b5132
RH
12386 if (target_big_endian)
12387 buf += 2;
2132e3a3 12388 md_number_to_chars ((char *) buf, *valP, 2);
252b5132
RH
12389 }
12390 break;
12391
12392 case BFD_RELOC_16_PCREL_S2:
a7ebbfdf 12393 if ((*valP & 0x3) != 0)
cb56d3d3 12394 as_bad_where (fixP->fx_file, fixP->fx_line,
bad36eac 12395 _("Branch to misaligned address (%lx)"), (long) *valP);
cb56d3d3 12396
54f4ddb3
TS
12397 /* We need to save the bits in the instruction since fixup_segment()
12398 might be deleting the relocation entry (i.e., a branch within
12399 the current segment). */
a7ebbfdf 12400 if (! fixP->fx_done)
bb2d6cd7 12401 break;
252b5132 12402
54f4ddb3 12403 /* Update old instruction data. */
252b5132
RH
12404 if (target_big_endian)
12405 insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
12406 else
12407 insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
12408
a7ebbfdf
TS
12409 if (*valP + 0x20000 <= 0x3ffff)
12410 {
12411 insn |= (*valP >> 2) & 0xffff;
2132e3a3 12412 md_number_to_chars ((char *) buf, insn, 4);
a7ebbfdf
TS
12413 }
12414 else if (mips_pic == NO_PIC
12415 && fixP->fx_done
12416 && fixP->fx_frag->fr_address >= text_section->vma
12417 && (fixP->fx_frag->fr_address
587aac4e 12418 < text_section->vma + bfd_get_section_size (text_section))
a7ebbfdf
TS
12419 && ((insn & 0xffff0000) == 0x10000000 /* beq $0,$0 */
12420 || (insn & 0xffff0000) == 0x04010000 /* bgez $0 */
12421 || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
252b5132
RH
12422 {
12423 /* The branch offset is too large. If this is an
12424 unconditional branch, and we are not generating PIC code,
12425 we can convert it to an absolute jump instruction. */
a7ebbfdf
TS
12426 if ((insn & 0xffff0000) == 0x04110000) /* bgezal $0 */
12427 insn = 0x0c000000; /* jal */
252b5132 12428 else
a7ebbfdf
TS
12429 insn = 0x08000000; /* j */
12430 fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
12431 fixP->fx_done = 0;
12432 fixP->fx_addsy = section_symbol (text_section);
12433 *valP += md_pcrel_from (fixP);
2132e3a3 12434 md_number_to_chars ((char *) buf, insn, 4);
a7ebbfdf
TS
12435 }
12436 else
12437 {
12438 /* If we got here, we have branch-relaxation disabled,
12439 and there's nothing we can do to fix this instruction
12440 without turning it into a longer sequence. */
12441 as_bad_where (fixP->fx_file, fixP->fx_line,
12442 _("Branch out of range"));
252b5132 12443 }
252b5132
RH
12444 break;
12445
12446 case BFD_RELOC_VTABLE_INHERIT:
12447 fixP->fx_done = 0;
12448 if (fixP->fx_addsy
12449 && !S_IS_DEFINED (fixP->fx_addsy)
12450 && !S_IS_WEAK (fixP->fx_addsy))
12451 S_SET_WEAK (fixP->fx_addsy);
12452 break;
12453
12454 case BFD_RELOC_VTABLE_ENTRY:
12455 fixP->fx_done = 0;
12456 break;
12457
12458 default:
12459 internalError ();
12460 }
a7ebbfdf
TS
12461
12462 /* Remember value for tc_gen_reloc. */
12463 fixP->fx_addnumber = *valP;
252b5132
RH
12464}
12465
252b5132 12466static symbolS *
17a2f251 12467get_symbol (void)
252b5132
RH
12468{
12469 int c;
12470 char *name;
12471 symbolS *p;
12472
12473 name = input_line_pointer;
12474 c = get_symbol_end ();
12475 p = (symbolS *) symbol_find_or_make (name);
12476 *input_line_pointer = c;
12477 return p;
12478}
12479
742a56fe
RS
12480/* Align the current frag to a given power of two. If a particular
12481 fill byte should be used, FILL points to an integer that contains
12482 that byte, otherwise FILL is null.
12483
12484 The MIPS assembler also automatically adjusts any preceding
12485 label. */
252b5132
RH
12486
12487static void
742a56fe 12488mips_align (int to, int *fill, symbolS *label)
252b5132 12489{
7d10b47d 12490 mips_emit_delays ();
742a56fe
RS
12491 mips_record_mips16_mode ();
12492 if (fill == NULL && subseg_text_p (now_seg))
12493 frag_align_code (to, 0);
12494 else
12495 frag_align (to, fill ? *fill : 0, 0);
252b5132
RH
12496 record_alignment (now_seg, to);
12497 if (label != NULL)
12498 {
9c2799c2 12499 gas_assert (S_GET_SEGMENT (label) == now_seg);
49309057 12500 symbol_set_frag (label, frag_now);
252b5132
RH
12501 S_SET_VALUE (label, (valueT) frag_now_fix ());
12502 }
12503}
12504
12505/* Align to a given power of two. .align 0 turns off the automatic
12506 alignment used by the data creating pseudo-ops. */
12507
12508static void
17a2f251 12509s_align (int x ATTRIBUTE_UNUSED)
252b5132 12510{
742a56fe 12511 int temp, fill_value, *fill_ptr;
49954fb4 12512 long max_alignment = 28;
252b5132 12513
54f4ddb3 12514 /* o Note that the assembler pulls down any immediately preceding label
252b5132 12515 to the aligned address.
54f4ddb3 12516 o It's not documented but auto alignment is reinstated by
252b5132 12517 a .align pseudo instruction.
54f4ddb3 12518 o Note also that after auto alignment is turned off the mips assembler
252b5132 12519 issues an error on attempt to assemble an improperly aligned data item.
54f4ddb3 12520 We don't. */
252b5132
RH
12521
12522 temp = get_absolute_expression ();
12523 if (temp > max_alignment)
12524 as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
12525 else if (temp < 0)
12526 {
12527 as_warn (_("Alignment negative: 0 assumed."));
12528 temp = 0;
12529 }
12530 if (*input_line_pointer == ',')
12531 {
f9419b05 12532 ++input_line_pointer;
742a56fe
RS
12533 fill_value = get_absolute_expression ();
12534 fill_ptr = &fill_value;
252b5132
RH
12535 }
12536 else
742a56fe 12537 fill_ptr = 0;
252b5132
RH
12538 if (temp)
12539 {
a8dbcb85
TS
12540 segment_info_type *si = seg_info (now_seg);
12541 struct insn_label_list *l = si->label_list;
54f4ddb3 12542 /* Auto alignment should be switched on by next section change. */
252b5132 12543 auto_align = 1;
742a56fe 12544 mips_align (temp, fill_ptr, l != NULL ? l->label : NULL);
252b5132
RH
12545 }
12546 else
12547 {
12548 auto_align = 0;
12549 }
12550
12551 demand_empty_rest_of_line ();
12552}
12553
252b5132 12554static void
17a2f251 12555s_change_sec (int sec)
252b5132
RH
12556{
12557 segT seg;
12558
252b5132
RH
12559#ifdef OBJ_ELF
12560 /* The ELF backend needs to know that we are changing sections, so
12561 that .previous works correctly. We could do something like check
b6ff326e 12562 for an obj_section_change_hook macro, but that might be confusing
252b5132
RH
12563 as it would not be appropriate to use it in the section changing
12564 functions in read.c, since obj-elf.c intercepts those. FIXME:
12565 This should be cleaner, somehow. */
f43abd2b
TS
12566 if (IS_ELF)
12567 obj_elf_section_change_hook ();
252b5132
RH
12568#endif
12569
7d10b47d 12570 mips_emit_delays ();
6a32d874 12571
252b5132
RH
12572 switch (sec)
12573 {
12574 case 't':
12575 s_text (0);
12576 break;
12577 case 'd':
12578 s_data (0);
12579 break;
12580 case 'b':
12581 subseg_set (bss_section, (subsegT) get_absolute_expression ());
12582 demand_empty_rest_of_line ();
12583 break;
12584
12585 case 'r':
4d0d148d
TS
12586 seg = subseg_new (RDATA_SECTION_NAME,
12587 (subsegT) get_absolute_expression ());
f43abd2b 12588 if (IS_ELF)
252b5132 12589 {
4d0d148d
TS
12590 bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
12591 | SEC_READONLY | SEC_RELOC
12592 | SEC_DATA));
c41e87e3 12593 if (strncmp (TARGET_OS, "elf", 3) != 0)
4d0d148d 12594 record_alignment (seg, 4);
252b5132 12595 }
4d0d148d 12596 demand_empty_rest_of_line ();
252b5132
RH
12597 break;
12598
12599 case 's':
4d0d148d 12600 seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
f43abd2b 12601 if (IS_ELF)
252b5132 12602 {
4d0d148d
TS
12603 bfd_set_section_flags (stdoutput, seg,
12604 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
c41e87e3 12605 if (strncmp (TARGET_OS, "elf", 3) != 0)
4d0d148d 12606 record_alignment (seg, 4);
252b5132 12607 }
4d0d148d
TS
12608 demand_empty_rest_of_line ();
12609 break;
998b3c36
MR
12610
12611 case 'B':
12612 seg = subseg_new (".sbss", (subsegT) get_absolute_expression ());
12613 if (IS_ELF)
12614 {
12615 bfd_set_section_flags (stdoutput, seg, SEC_ALLOC);
12616 if (strncmp (TARGET_OS, "elf", 3) != 0)
12617 record_alignment (seg, 4);
12618 }
12619 demand_empty_rest_of_line ();
12620 break;
252b5132
RH
12621 }
12622
12623 auto_align = 1;
12624}
b34976b6 12625
cca86cc8 12626void
17a2f251 12627s_change_section (int ignore ATTRIBUTE_UNUSED)
cca86cc8 12628{
7ed4a06a 12629#ifdef OBJ_ELF
cca86cc8
SC
12630 char *section_name;
12631 char c;
684022ea 12632 char next_c = 0;
cca86cc8
SC
12633 int section_type;
12634 int section_flag;
12635 int section_entry_size;
12636 int section_alignment;
b34976b6 12637
f43abd2b 12638 if (!IS_ELF)
7ed4a06a
TS
12639 return;
12640
cca86cc8
SC
12641 section_name = input_line_pointer;
12642 c = get_symbol_end ();
a816d1ed
AO
12643 if (c)
12644 next_c = *(input_line_pointer + 1);
cca86cc8 12645
4cf0dd0d
TS
12646 /* Do we have .section Name<,"flags">? */
12647 if (c != ',' || (c == ',' && next_c == '"'))
cca86cc8 12648 {
4cf0dd0d
TS
12649 /* just after name is now '\0'. */
12650 *input_line_pointer = c;
cca86cc8
SC
12651 input_line_pointer = section_name;
12652 obj_elf_section (ignore);
12653 return;
12654 }
12655 input_line_pointer++;
12656
12657 /* Do we have .section Name<,type><,flag><,entry_size><,alignment> */
12658 if (c == ',')
12659 section_type = get_absolute_expression ();
12660 else
12661 section_type = 0;
12662 if (*input_line_pointer++ == ',')
12663 section_flag = get_absolute_expression ();
12664 else
12665 section_flag = 0;
12666 if (*input_line_pointer++ == ',')
12667 section_entry_size = get_absolute_expression ();
12668 else
12669 section_entry_size = 0;
12670 if (*input_line_pointer++ == ',')
12671 section_alignment = get_absolute_expression ();
12672 else
12673 section_alignment = 0;
87975d2a
AM
12674 /* FIXME: really ignore? */
12675 (void) section_alignment;
cca86cc8 12676
a816d1ed
AO
12677 section_name = xstrdup (section_name);
12678
8ab8a5c8
RS
12679 /* When using the generic form of .section (as implemented by obj-elf.c),
12680 there's no way to set the section type to SHT_MIPS_DWARF. Users have
12681 traditionally had to fall back on the more common @progbits instead.
12682
12683 There's nothing really harmful in this, since bfd will correct
12684 SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file. But it
708587a4 12685 means that, for backwards compatibility, the special_section entries
8ab8a5c8
RS
12686 for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
12687
12688 Even so, we shouldn't force users of the MIPS .section syntax to
12689 incorrectly label the sections as SHT_PROGBITS. The best compromise
12690 seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
12691 generic type-checking code. */
12692 if (section_type == SHT_MIPS_DWARF)
12693 section_type = SHT_PROGBITS;
12694
cca86cc8
SC
12695 obj_elf_change_section (section_name, section_type, section_flag,
12696 section_entry_size, 0, 0, 0);
a816d1ed
AO
12697
12698 if (now_seg->name != section_name)
12699 free (section_name);
7ed4a06a 12700#endif /* OBJ_ELF */
cca86cc8 12701}
252b5132
RH
12702
12703void
17a2f251 12704mips_enable_auto_align (void)
252b5132
RH
12705{
12706 auto_align = 1;
12707}
12708
12709static void
17a2f251 12710s_cons (int log_size)
252b5132 12711{
a8dbcb85
TS
12712 segment_info_type *si = seg_info (now_seg);
12713 struct insn_label_list *l = si->label_list;
252b5132
RH
12714 symbolS *label;
12715
a8dbcb85 12716 label = l != NULL ? l->label : NULL;
7d10b47d 12717 mips_emit_delays ();
252b5132
RH
12718 if (log_size > 0 && auto_align)
12719 mips_align (log_size, 0, label);
12720 mips_clear_insn_labels ();
12721 cons (1 << log_size);
12722}
12723
12724static void
17a2f251 12725s_float_cons (int type)
252b5132 12726{
a8dbcb85
TS
12727 segment_info_type *si = seg_info (now_seg);
12728 struct insn_label_list *l = si->label_list;
252b5132
RH
12729 symbolS *label;
12730
a8dbcb85 12731 label = l != NULL ? l->label : NULL;
252b5132 12732
7d10b47d 12733 mips_emit_delays ();
252b5132
RH
12734
12735 if (auto_align)
49309057
ILT
12736 {
12737 if (type == 'd')
12738 mips_align (3, 0, label);
12739 else
12740 mips_align (2, 0, label);
12741 }
252b5132
RH
12742
12743 mips_clear_insn_labels ();
12744
12745 float_cons (type);
12746}
12747
12748/* Handle .globl. We need to override it because on Irix 5 you are
12749 permitted to say
12750 .globl foo .text
12751 where foo is an undefined symbol, to mean that foo should be
12752 considered to be the address of a function. */
12753
12754static void
17a2f251 12755s_mips_globl (int x ATTRIBUTE_UNUSED)
252b5132
RH
12756{
12757 char *name;
12758 int c;
12759 symbolS *symbolP;
12760 flagword flag;
12761
8a06b769 12762 do
252b5132 12763 {
8a06b769 12764 name = input_line_pointer;
252b5132 12765 c = get_symbol_end ();
8a06b769
TS
12766 symbolP = symbol_find_or_make (name);
12767 S_SET_EXTERNAL (symbolP);
12768
252b5132 12769 *input_line_pointer = c;
8a06b769 12770 SKIP_WHITESPACE ();
252b5132 12771
8a06b769
TS
12772 /* On Irix 5, every global symbol that is not explicitly labelled as
12773 being a function is apparently labelled as being an object. */
12774 flag = BSF_OBJECT;
252b5132 12775
8a06b769
TS
12776 if (!is_end_of_line[(unsigned char) *input_line_pointer]
12777 && (*input_line_pointer != ','))
12778 {
12779 char *secname;
12780 asection *sec;
12781
12782 secname = input_line_pointer;
12783 c = get_symbol_end ();
12784 sec = bfd_get_section_by_name (stdoutput, secname);
12785 if (sec == NULL)
12786 as_bad (_("%s: no such section"), secname);
12787 *input_line_pointer = c;
12788
12789 if (sec != NULL && (sec->flags & SEC_CODE) != 0)
12790 flag = BSF_FUNCTION;
12791 }
12792
12793 symbol_get_bfdsym (symbolP)->flags |= flag;
12794
12795 c = *input_line_pointer;
12796 if (c == ',')
12797 {
12798 input_line_pointer++;
12799 SKIP_WHITESPACE ();
12800 if (is_end_of_line[(unsigned char) *input_line_pointer])
12801 c = '\n';
12802 }
12803 }
12804 while (c == ',');
252b5132 12805
252b5132
RH
12806 demand_empty_rest_of_line ();
12807}
12808
12809static void
17a2f251 12810s_option (int x ATTRIBUTE_UNUSED)
252b5132
RH
12811{
12812 char *opt;
12813 char c;
12814
12815 opt = input_line_pointer;
12816 c = get_symbol_end ();
12817
12818 if (*opt == 'O')
12819 {
12820 /* FIXME: What does this mean? */
12821 }
12822 else if (strncmp (opt, "pic", 3) == 0)
12823 {
12824 int i;
12825
12826 i = atoi (opt + 3);
12827 if (i == 0)
12828 mips_pic = NO_PIC;
12829 else if (i == 2)
143d77c5 12830 {
252b5132 12831 mips_pic = SVR4_PIC;
143d77c5
EC
12832 mips_abicalls = TRUE;
12833 }
252b5132
RH
12834 else
12835 as_bad (_(".option pic%d not supported"), i);
12836
4d0d148d 12837 if (mips_pic == SVR4_PIC)
252b5132
RH
12838 {
12839 if (g_switch_seen && g_switch_value != 0)
12840 as_warn (_("-G may not be used with SVR4 PIC code"));
12841 g_switch_value = 0;
12842 bfd_set_gp_size (stdoutput, 0);
12843 }
12844 }
12845 else
12846 as_warn (_("Unrecognized option \"%s\""), opt);
12847
12848 *input_line_pointer = c;
12849 demand_empty_rest_of_line ();
12850}
12851
12852/* This structure is used to hold a stack of .set values. */
12853
e972090a
NC
12854struct mips_option_stack
12855{
252b5132
RH
12856 struct mips_option_stack *next;
12857 struct mips_set_options options;
12858};
12859
12860static struct mips_option_stack *mips_opts_stack;
12861
12862/* Handle the .set pseudo-op. */
12863
12864static void
17a2f251 12865s_mipsset (int x ATTRIBUTE_UNUSED)
252b5132
RH
12866{
12867 char *name = input_line_pointer, ch;
12868
12869 while (!is_end_of_line[(unsigned char) *input_line_pointer])
f9419b05 12870 ++input_line_pointer;
252b5132
RH
12871 ch = *input_line_pointer;
12872 *input_line_pointer = '\0';
12873
12874 if (strcmp (name, "reorder") == 0)
12875 {
7d10b47d
RS
12876 if (mips_opts.noreorder)
12877 end_noreorder ();
252b5132
RH
12878 }
12879 else if (strcmp (name, "noreorder") == 0)
12880 {
7d10b47d
RS
12881 if (!mips_opts.noreorder)
12882 start_noreorder ();
252b5132 12883 }
741fe287
MR
12884 else if (strncmp (name, "at=", 3) == 0)
12885 {
12886 char *s = name + 3;
12887
12888 if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
12889 as_bad (_("Unrecognized register name `%s'"), s);
12890 }
252b5132
RH
12891 else if (strcmp (name, "at") == 0)
12892 {
741fe287 12893 mips_opts.at = ATREG;
252b5132
RH
12894 }
12895 else if (strcmp (name, "noat") == 0)
12896 {
741fe287 12897 mips_opts.at = ZERO;
252b5132
RH
12898 }
12899 else if (strcmp (name, "macro") == 0)
12900 {
12901 mips_opts.warn_about_macros = 0;
12902 }
12903 else if (strcmp (name, "nomacro") == 0)
12904 {
12905 if (mips_opts.noreorder == 0)
12906 as_bad (_("`noreorder' must be set before `nomacro'"));
12907 mips_opts.warn_about_macros = 1;
12908 }
12909 else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
12910 {
12911 mips_opts.nomove = 0;
12912 }
12913 else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
12914 {
12915 mips_opts.nomove = 1;
12916 }
12917 else if (strcmp (name, "bopt") == 0)
12918 {
12919 mips_opts.nobopt = 0;
12920 }
12921 else if (strcmp (name, "nobopt") == 0)
12922 {
12923 mips_opts.nobopt = 1;
12924 }
ad3fea08
TS
12925 else if (strcmp (name, "gp=default") == 0)
12926 mips_opts.gp32 = file_mips_gp32;
12927 else if (strcmp (name, "gp=32") == 0)
12928 mips_opts.gp32 = 1;
12929 else if (strcmp (name, "gp=64") == 0)
12930 {
12931 if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
20203fb9 12932 as_warn (_("%s isa does not support 64-bit registers"),
ad3fea08
TS
12933 mips_cpu_info_from_isa (mips_opts.isa)->name);
12934 mips_opts.gp32 = 0;
12935 }
12936 else if (strcmp (name, "fp=default") == 0)
12937 mips_opts.fp32 = file_mips_fp32;
12938 else if (strcmp (name, "fp=32") == 0)
12939 mips_opts.fp32 = 1;
12940 else if (strcmp (name, "fp=64") == 0)
12941 {
12942 if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
20203fb9 12943 as_warn (_("%s isa does not support 64-bit floating point registers"),
ad3fea08
TS
12944 mips_cpu_info_from_isa (mips_opts.isa)->name);
12945 mips_opts.fp32 = 0;
12946 }
037b32b9
AN
12947 else if (strcmp (name, "softfloat") == 0)
12948 mips_opts.soft_float = 1;
12949 else if (strcmp (name, "hardfloat") == 0)
12950 mips_opts.soft_float = 0;
12951 else if (strcmp (name, "singlefloat") == 0)
12952 mips_opts.single_float = 1;
12953 else if (strcmp (name, "doublefloat") == 0)
12954 mips_opts.single_float = 0;
252b5132
RH
12955 else if (strcmp (name, "mips16") == 0
12956 || strcmp (name, "MIPS-16") == 0)
12957 mips_opts.mips16 = 1;
12958 else if (strcmp (name, "nomips16") == 0
12959 || strcmp (name, "noMIPS-16") == 0)
12960 mips_opts.mips16 = 0;
e16bfa71
TS
12961 else if (strcmp (name, "smartmips") == 0)
12962 {
ad3fea08 12963 if (!ISA_SUPPORTS_SMARTMIPS)
20203fb9 12964 as_warn (_("%s ISA does not support SmartMIPS ASE"),
e16bfa71
TS
12965 mips_cpu_info_from_isa (mips_opts.isa)->name);
12966 mips_opts.ase_smartmips = 1;
12967 }
12968 else if (strcmp (name, "nosmartmips") == 0)
12969 mips_opts.ase_smartmips = 0;
1f25f5d3
CD
12970 else if (strcmp (name, "mips3d") == 0)
12971 mips_opts.ase_mips3d = 1;
12972 else if (strcmp (name, "nomips3d") == 0)
12973 mips_opts.ase_mips3d = 0;
a4672219
TS
12974 else if (strcmp (name, "mdmx") == 0)
12975 mips_opts.ase_mdmx = 1;
12976 else if (strcmp (name, "nomdmx") == 0)
12977 mips_opts.ase_mdmx = 0;
74cd071d 12978 else if (strcmp (name, "dsp") == 0)
ad3fea08
TS
12979 {
12980 if (!ISA_SUPPORTS_DSP_ASE)
20203fb9 12981 as_warn (_("%s ISA does not support DSP ASE"),
ad3fea08
TS
12982 mips_cpu_info_from_isa (mips_opts.isa)->name);
12983 mips_opts.ase_dsp = 1;
8b082fb1 12984 mips_opts.ase_dspr2 = 0;
ad3fea08 12985 }
74cd071d 12986 else if (strcmp (name, "nodsp") == 0)
8b082fb1
TS
12987 {
12988 mips_opts.ase_dsp = 0;
12989 mips_opts.ase_dspr2 = 0;
12990 }
12991 else if (strcmp (name, "dspr2") == 0)
12992 {
12993 if (!ISA_SUPPORTS_DSPR2_ASE)
20203fb9 12994 as_warn (_("%s ISA does not support DSP R2 ASE"),
8b082fb1
TS
12995 mips_cpu_info_from_isa (mips_opts.isa)->name);
12996 mips_opts.ase_dspr2 = 1;
12997 mips_opts.ase_dsp = 1;
12998 }
12999 else if (strcmp (name, "nodspr2") == 0)
13000 {
13001 mips_opts.ase_dspr2 = 0;
13002 mips_opts.ase_dsp = 0;
13003 }
ef2e4d86 13004 else if (strcmp (name, "mt") == 0)
ad3fea08
TS
13005 {
13006 if (!ISA_SUPPORTS_MT_ASE)
20203fb9 13007 as_warn (_("%s ISA does not support MT ASE"),
ad3fea08
TS
13008 mips_cpu_info_from_isa (mips_opts.isa)->name);
13009 mips_opts.ase_mt = 1;
13010 }
ef2e4d86
CF
13011 else if (strcmp (name, "nomt") == 0)
13012 mips_opts.ase_mt = 0;
1a2c1fad 13013 else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
252b5132 13014 {
af7ee8bf 13015 int reset = 0;
252b5132 13016
1a2c1fad
CD
13017 /* Permit the user to change the ISA and architecture on the fly.
13018 Needless to say, misuse can cause serious problems. */
81a21e38 13019 if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
af7ee8bf
CD
13020 {
13021 reset = 1;
13022 mips_opts.isa = file_mips_isa;
1a2c1fad 13023 mips_opts.arch = file_mips_arch;
1a2c1fad
CD
13024 }
13025 else if (strncmp (name, "arch=", 5) == 0)
13026 {
13027 const struct mips_cpu_info *p;
13028
13029 p = mips_parse_cpu("internal use", name + 5);
13030 if (!p)
13031 as_bad (_("unknown architecture %s"), name + 5);
13032 else
13033 {
13034 mips_opts.arch = p->cpu;
13035 mips_opts.isa = p->isa;
13036 }
13037 }
81a21e38
TS
13038 else if (strncmp (name, "mips", 4) == 0)
13039 {
13040 const struct mips_cpu_info *p;
13041
13042 p = mips_parse_cpu("internal use", name);
13043 if (!p)
13044 as_bad (_("unknown ISA level %s"), name + 4);
13045 else
13046 {
13047 mips_opts.arch = p->cpu;
13048 mips_opts.isa = p->isa;
13049 }
13050 }
af7ee8bf 13051 else
81a21e38 13052 as_bad (_("unknown ISA or architecture %s"), name);
af7ee8bf
CD
13053
13054 switch (mips_opts.isa)
98d3f06f
KH
13055 {
13056 case 0:
98d3f06f 13057 break;
af7ee8bf
CD
13058 case ISA_MIPS1:
13059 case ISA_MIPS2:
13060 case ISA_MIPS32:
13061 case ISA_MIPS32R2:
98d3f06f
KH
13062 mips_opts.gp32 = 1;
13063 mips_opts.fp32 = 1;
13064 break;
af7ee8bf
CD
13065 case ISA_MIPS3:
13066 case ISA_MIPS4:
13067 case ISA_MIPS5:
13068 case ISA_MIPS64:
5f74bc13 13069 case ISA_MIPS64R2:
98d3f06f
KH
13070 mips_opts.gp32 = 0;
13071 mips_opts.fp32 = 0;
13072 break;
13073 default:
13074 as_bad (_("unknown ISA level %s"), name + 4);
13075 break;
13076 }
af7ee8bf 13077 if (reset)
98d3f06f 13078 {
af7ee8bf
CD
13079 mips_opts.gp32 = file_mips_gp32;
13080 mips_opts.fp32 = file_mips_fp32;
98d3f06f 13081 }
252b5132
RH
13082 }
13083 else if (strcmp (name, "autoextend") == 0)
13084 mips_opts.noautoextend = 0;
13085 else if (strcmp (name, "noautoextend") == 0)
13086 mips_opts.noautoextend = 1;
13087 else if (strcmp (name, "push") == 0)
13088 {
13089 struct mips_option_stack *s;
13090
13091 s = (struct mips_option_stack *) xmalloc (sizeof *s);
13092 s->next = mips_opts_stack;
13093 s->options = mips_opts;
13094 mips_opts_stack = s;
13095 }
13096 else if (strcmp (name, "pop") == 0)
13097 {
13098 struct mips_option_stack *s;
13099
13100 s = mips_opts_stack;
13101 if (s == NULL)
13102 as_bad (_(".set pop with no .set push"));
13103 else
13104 {
13105 /* If we're changing the reorder mode we need to handle
13106 delay slots correctly. */
13107 if (s->options.noreorder && ! mips_opts.noreorder)
7d10b47d 13108 start_noreorder ();
252b5132 13109 else if (! s->options.noreorder && mips_opts.noreorder)
7d10b47d 13110 end_noreorder ();
252b5132
RH
13111
13112 mips_opts = s->options;
13113 mips_opts_stack = s->next;
13114 free (s);
13115 }
13116 }
aed1a261
RS
13117 else if (strcmp (name, "sym32") == 0)
13118 mips_opts.sym32 = TRUE;
13119 else if (strcmp (name, "nosym32") == 0)
13120 mips_opts.sym32 = FALSE;
e6559e01
JM
13121 else if (strchr (name, ','))
13122 {
13123 /* Generic ".set" directive; use the generic handler. */
13124 *input_line_pointer = ch;
13125 input_line_pointer = name;
13126 s_set (0);
13127 return;
13128 }
252b5132
RH
13129 else
13130 {
13131 as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
13132 }
13133 *input_line_pointer = ch;
13134 demand_empty_rest_of_line ();
13135}
13136
13137/* Handle the .abicalls pseudo-op. I believe this is equivalent to
13138 .option pic2. It means to generate SVR4 PIC calls. */
13139
13140static void
17a2f251 13141s_abicalls (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
13142{
13143 mips_pic = SVR4_PIC;
143d77c5 13144 mips_abicalls = TRUE;
4d0d148d
TS
13145
13146 if (g_switch_seen && g_switch_value != 0)
13147 as_warn (_("-G may not be used with SVR4 PIC code"));
13148 g_switch_value = 0;
13149
252b5132
RH
13150 bfd_set_gp_size (stdoutput, 0);
13151 demand_empty_rest_of_line ();
13152}
13153
13154/* Handle the .cpload pseudo-op. This is used when generating SVR4
13155 PIC code. It sets the $gp register for the function based on the
13156 function address, which is in the register named in the argument.
13157 This uses a relocation against _gp_disp, which is handled specially
13158 by the linker. The result is:
13159 lui $gp,%hi(_gp_disp)
13160 addiu $gp,$gp,%lo(_gp_disp)
13161 addu $gp,$gp,.cpload argument
aa6975fb
ILT
13162 The .cpload argument is normally $25 == $t9.
13163
13164 The -mno-shared option changes this to:
bbe506e8
TS
13165 lui $gp,%hi(__gnu_local_gp)
13166 addiu $gp,$gp,%lo(__gnu_local_gp)
aa6975fb
ILT
13167 and the argument is ignored. This saves an instruction, but the
13168 resulting code is not position independent; it uses an absolute
bbe506e8
TS
13169 address for __gnu_local_gp. Thus code assembled with -mno-shared
13170 can go into an ordinary executable, but not into a shared library. */
252b5132
RH
13171
13172static void
17a2f251 13173s_cpload (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
13174{
13175 expressionS ex;
aa6975fb
ILT
13176 int reg;
13177 int in_shared;
252b5132 13178
6478892d
TS
13179 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13180 .cpload is ignored. */
13181 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
252b5132
RH
13182 {
13183 s_ignore (0);
13184 return;
13185 }
13186
d3ecfc59 13187 /* .cpload should be in a .set noreorder section. */
252b5132
RH
13188 if (mips_opts.noreorder == 0)
13189 as_warn (_(".cpload not in noreorder section"));
13190
aa6975fb
ILT
13191 reg = tc_get_register (0);
13192
13193 /* If we need to produce a 64-bit address, we are better off using
13194 the default instruction sequence. */
aed1a261 13195 in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
aa6975fb 13196
252b5132 13197 ex.X_op = O_symbol;
bbe506e8
TS
13198 ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
13199 "__gnu_local_gp");
252b5132
RH
13200 ex.X_op_symbol = NULL;
13201 ex.X_add_number = 0;
13202
13203 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
49309057 13204 symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
252b5132 13205
584892a6 13206 macro_start ();
67c0d1eb
RS
13207 macro_build_lui (&ex, mips_gp_register);
13208 macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
17a2f251 13209 mips_gp_register, BFD_RELOC_LO16);
aa6975fb
ILT
13210 if (in_shared)
13211 macro_build (NULL, "addu", "d,v,t", mips_gp_register,
13212 mips_gp_register, reg);
584892a6 13213 macro_end ();
252b5132
RH
13214
13215 demand_empty_rest_of_line ();
13216}
13217
6478892d
TS
13218/* Handle the .cpsetup pseudo-op defined for NewABI PIC code. The syntax is:
13219 .cpsetup $reg1, offset|$reg2, label
13220
13221 If offset is given, this results in:
13222 sd $gp, offset($sp)
956cd1d6 13223 lui $gp, %hi(%neg(%gp_rel(label)))
698b7d9d
TS
13224 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
13225 daddu $gp, $gp, $reg1
6478892d
TS
13226
13227 If $reg2 is given, this results in:
13228 daddu $reg2, $gp, $0
956cd1d6 13229 lui $gp, %hi(%neg(%gp_rel(label)))
698b7d9d
TS
13230 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
13231 daddu $gp, $gp, $reg1
aa6975fb
ILT
13232 $reg1 is normally $25 == $t9.
13233
13234 The -mno-shared option replaces the last three instructions with
13235 lui $gp,%hi(_gp)
54f4ddb3 13236 addiu $gp,$gp,%lo(_gp) */
aa6975fb 13237
6478892d 13238static void
17a2f251 13239s_cpsetup (int ignore ATTRIBUTE_UNUSED)
6478892d
TS
13240{
13241 expressionS ex_off;
13242 expressionS ex_sym;
13243 int reg1;
6478892d 13244
8586fc66 13245 /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
6478892d
TS
13246 We also need NewABI support. */
13247 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13248 {
13249 s_ignore (0);
13250 return;
13251 }
13252
13253 reg1 = tc_get_register (0);
13254 SKIP_WHITESPACE ();
13255 if (*input_line_pointer != ',')
13256 {
13257 as_bad (_("missing argument separator ',' for .cpsetup"));
13258 return;
13259 }
13260 else
80245285 13261 ++input_line_pointer;
6478892d
TS
13262 SKIP_WHITESPACE ();
13263 if (*input_line_pointer == '$')
80245285
TS
13264 {
13265 mips_cpreturn_register = tc_get_register (0);
13266 mips_cpreturn_offset = -1;
13267 }
6478892d 13268 else
80245285
TS
13269 {
13270 mips_cpreturn_offset = get_absolute_expression ();
13271 mips_cpreturn_register = -1;
13272 }
6478892d
TS
13273 SKIP_WHITESPACE ();
13274 if (*input_line_pointer != ',')
13275 {
13276 as_bad (_("missing argument separator ',' for .cpsetup"));
13277 return;
13278 }
13279 else
f9419b05 13280 ++input_line_pointer;
6478892d 13281 SKIP_WHITESPACE ();
f21f8242 13282 expression (&ex_sym);
6478892d 13283
584892a6 13284 macro_start ();
6478892d
TS
13285 if (mips_cpreturn_register == -1)
13286 {
13287 ex_off.X_op = O_constant;
13288 ex_off.X_add_symbol = NULL;
13289 ex_off.X_op_symbol = NULL;
13290 ex_off.X_add_number = mips_cpreturn_offset;
13291
67c0d1eb 13292 macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
17a2f251 13293 BFD_RELOC_LO16, SP);
6478892d
TS
13294 }
13295 else
67c0d1eb 13296 macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
17a2f251 13297 mips_gp_register, 0);
6478892d 13298
aed1a261 13299 if (mips_in_shared || HAVE_64BIT_SYMBOLS)
aa6975fb
ILT
13300 {
13301 macro_build (&ex_sym, "lui", "t,u", mips_gp_register,
13302 -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
13303 BFD_RELOC_HI16_S);
13304
13305 macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
13306 mips_gp_register, -1, BFD_RELOC_GPREL16,
13307 BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
13308
13309 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
13310 mips_gp_register, reg1);
13311 }
13312 else
13313 {
13314 expressionS ex;
13315
13316 ex.X_op = O_symbol;
4184909a 13317 ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
aa6975fb
ILT
13318 ex.X_op_symbol = NULL;
13319 ex.X_add_number = 0;
6e1304d8 13320
aa6975fb
ILT
13321 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
13322 symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13323
13324 macro_build_lui (&ex, mips_gp_register);
13325 macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13326 mips_gp_register, BFD_RELOC_LO16);
13327 }
f21f8242 13328
584892a6 13329 macro_end ();
6478892d
TS
13330
13331 demand_empty_rest_of_line ();
13332}
13333
13334static void
17a2f251 13335s_cplocal (int ignore ATTRIBUTE_UNUSED)
6478892d
TS
13336{
13337 /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
54f4ddb3 13338 .cplocal is ignored. */
6478892d
TS
13339 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13340 {
13341 s_ignore (0);
13342 return;
13343 }
13344
13345 mips_gp_register = tc_get_register (0);
85b51719 13346 demand_empty_rest_of_line ();
6478892d
TS
13347}
13348
252b5132
RH
13349/* Handle the .cprestore pseudo-op. This stores $gp into a given
13350 offset from $sp. The offset is remembered, and after making a PIC
13351 call $gp is restored from that location. */
13352
13353static void
17a2f251 13354s_cprestore (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
13355{
13356 expressionS ex;
252b5132 13357
6478892d 13358 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
c9914766 13359 .cprestore is ignored. */
6478892d 13360 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
252b5132
RH
13361 {
13362 s_ignore (0);
13363 return;
13364 }
13365
13366 mips_cprestore_offset = get_absolute_expression ();
7a621144 13367 mips_cprestore_valid = 1;
252b5132
RH
13368
13369 ex.X_op = O_constant;
13370 ex.X_add_symbol = NULL;
13371 ex.X_op_symbol = NULL;
13372 ex.X_add_number = mips_cprestore_offset;
13373
584892a6 13374 macro_start ();
67c0d1eb
RS
13375 macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
13376 SP, HAVE_64BIT_ADDRESSES);
584892a6 13377 macro_end ();
252b5132
RH
13378
13379 demand_empty_rest_of_line ();
13380}
13381
6478892d 13382/* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
67c1ffbe 13383 was given in the preceding .cpsetup, it results in:
6478892d 13384 ld $gp, offset($sp)
76b3015f 13385
6478892d 13386 If a register $reg2 was given there, it results in:
54f4ddb3
TS
13387 daddu $gp, $reg2, $0 */
13388
6478892d 13389static void
17a2f251 13390s_cpreturn (int ignore ATTRIBUTE_UNUSED)
6478892d
TS
13391{
13392 expressionS ex;
6478892d
TS
13393
13394 /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
13395 We also need NewABI support. */
13396 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13397 {
13398 s_ignore (0);
13399 return;
13400 }
13401
584892a6 13402 macro_start ();
6478892d
TS
13403 if (mips_cpreturn_register == -1)
13404 {
13405 ex.X_op = O_constant;
13406 ex.X_add_symbol = NULL;
13407 ex.X_op_symbol = NULL;
13408 ex.X_add_number = mips_cpreturn_offset;
13409
67c0d1eb 13410 macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
6478892d
TS
13411 }
13412 else
67c0d1eb 13413 macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
17a2f251 13414 mips_cpreturn_register, 0);
584892a6 13415 macro_end ();
6478892d
TS
13416
13417 demand_empty_rest_of_line ();
13418}
13419
741d6ea8
JM
13420/* Handle the .dtprelword and .dtpreldword pseudo-ops. They generate
13421 a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
13422 use in DWARF debug information. */
13423
13424static void
13425s_dtprel_internal (size_t bytes)
13426{
13427 expressionS ex;
13428 char *p;
13429
13430 expression (&ex);
13431
13432 if (ex.X_op != O_symbol)
13433 {
13434 as_bad (_("Unsupported use of %s"), (bytes == 8
13435 ? ".dtpreldword"
13436 : ".dtprelword"));
13437 ignore_rest_of_line ();
13438 }
13439
13440 p = frag_more (bytes);
13441 md_number_to_chars (p, 0, bytes);
13442 fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
13443 (bytes == 8
13444 ? BFD_RELOC_MIPS_TLS_DTPREL64
13445 : BFD_RELOC_MIPS_TLS_DTPREL32));
13446
13447 demand_empty_rest_of_line ();
13448}
13449
13450/* Handle .dtprelword. */
13451
13452static void
13453s_dtprelword (int ignore ATTRIBUTE_UNUSED)
13454{
13455 s_dtprel_internal (4);
13456}
13457
13458/* Handle .dtpreldword. */
13459
13460static void
13461s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
13462{
13463 s_dtprel_internal (8);
13464}
13465
6478892d
TS
13466/* Handle the .gpvalue pseudo-op. This is used when generating NewABI PIC
13467 code. It sets the offset to use in gp_rel relocations. */
13468
13469static void
17a2f251 13470s_gpvalue (int ignore ATTRIBUTE_UNUSED)
6478892d
TS
13471{
13472 /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
13473 We also need NewABI support. */
13474 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13475 {
13476 s_ignore (0);
13477 return;
13478 }
13479
def2e0dd 13480 mips_gprel_offset = get_absolute_expression ();
6478892d
TS
13481
13482 demand_empty_rest_of_line ();
13483}
13484
252b5132
RH
13485/* Handle the .gpword pseudo-op. This is used when generating PIC
13486 code. It generates a 32 bit GP relative reloc. */
13487
13488static void
17a2f251 13489s_gpword (int ignore ATTRIBUTE_UNUSED)
252b5132 13490{
a8dbcb85
TS
13491 segment_info_type *si;
13492 struct insn_label_list *l;
252b5132
RH
13493 symbolS *label;
13494 expressionS ex;
13495 char *p;
13496
13497 /* When not generating PIC code, this is treated as .word. */
13498 if (mips_pic != SVR4_PIC)
13499 {
13500 s_cons (2);
13501 return;
13502 }
13503
a8dbcb85
TS
13504 si = seg_info (now_seg);
13505 l = si->label_list;
13506 label = l != NULL ? l->label : NULL;
7d10b47d 13507 mips_emit_delays ();
252b5132
RH
13508 if (auto_align)
13509 mips_align (2, 0, label);
13510 mips_clear_insn_labels ();
13511
13512 expression (&ex);
13513
13514 if (ex.X_op != O_symbol || ex.X_add_number != 0)
13515 {
13516 as_bad (_("Unsupported use of .gpword"));
13517 ignore_rest_of_line ();
13518 }
13519
13520 p = frag_more (4);
17a2f251 13521 md_number_to_chars (p, 0, 4);
b34976b6 13522 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
cdf6fd85 13523 BFD_RELOC_GPREL32);
252b5132
RH
13524
13525 demand_empty_rest_of_line ();
13526}
13527
10181a0d 13528static void
17a2f251 13529s_gpdword (int ignore ATTRIBUTE_UNUSED)
10181a0d 13530{
a8dbcb85
TS
13531 segment_info_type *si;
13532 struct insn_label_list *l;
10181a0d
AO
13533 symbolS *label;
13534 expressionS ex;
13535 char *p;
13536
13537 /* When not generating PIC code, this is treated as .dword. */
13538 if (mips_pic != SVR4_PIC)
13539 {
13540 s_cons (3);
13541 return;
13542 }
13543
a8dbcb85
TS
13544 si = seg_info (now_seg);
13545 l = si->label_list;
13546 label = l != NULL ? l->label : NULL;
7d10b47d 13547 mips_emit_delays ();
10181a0d
AO
13548 if (auto_align)
13549 mips_align (3, 0, label);
13550 mips_clear_insn_labels ();
13551
13552 expression (&ex);
13553
13554 if (ex.X_op != O_symbol || ex.X_add_number != 0)
13555 {
13556 as_bad (_("Unsupported use of .gpdword"));
13557 ignore_rest_of_line ();
13558 }
13559
13560 p = frag_more (8);
17a2f251 13561 md_number_to_chars (p, 0, 8);
a105a300 13562 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
6e1304d8 13563 BFD_RELOC_GPREL32)->fx_tcbit = 1;
10181a0d
AO
13564
13565 /* GPREL32 composed with 64 gives a 64-bit GP offset. */
6e1304d8
RS
13566 fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
13567 FALSE, BFD_RELOC_64)->fx_tcbit = 1;
10181a0d
AO
13568
13569 demand_empty_rest_of_line ();
13570}
13571
252b5132
RH
13572/* Handle the .cpadd pseudo-op. This is used when dealing with switch
13573 tables in SVR4 PIC code. */
13574
13575static void
17a2f251 13576s_cpadd (int ignore ATTRIBUTE_UNUSED)
252b5132 13577{
252b5132
RH
13578 int reg;
13579
10181a0d
AO
13580 /* This is ignored when not generating SVR4 PIC code. */
13581 if (mips_pic != SVR4_PIC)
252b5132
RH
13582 {
13583 s_ignore (0);
13584 return;
13585 }
13586
13587 /* Add $gp to the register named as an argument. */
584892a6 13588 macro_start ();
252b5132 13589 reg = tc_get_register (0);
67c0d1eb 13590 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
584892a6 13591 macro_end ();
252b5132 13592
bdaaa2e1 13593 demand_empty_rest_of_line ();
252b5132
RH
13594}
13595
13596/* Handle the .insn pseudo-op. This marks instruction labels in
13597 mips16 mode. This permits the linker to handle them specially,
13598 such as generating jalx instructions when needed. We also make
13599 them odd for the duration of the assembly, in order to generate the
13600 right sort of code. We will make them even in the adjust_symtab
13601 routine, while leaving them marked. This is convenient for the
13602 debugger and the disassembler. The linker knows to make them odd
13603 again. */
13604
13605static void
17a2f251 13606s_insn (int ignore ATTRIBUTE_UNUSED)
252b5132 13607{
f9419b05 13608 mips16_mark_labels ();
252b5132
RH
13609
13610 demand_empty_rest_of_line ();
13611}
13612
13613/* Handle a .stabn directive. We need these in order to mark a label
13614 as being a mips16 text label correctly. Sometimes the compiler
13615 will emit a label, followed by a .stabn, and then switch sections.
13616 If the label and .stabn are in mips16 mode, then the label is
13617 really a mips16 text label. */
13618
13619static void
17a2f251 13620s_mips_stab (int type)
252b5132 13621{
f9419b05 13622 if (type == 'n')
252b5132
RH
13623 mips16_mark_labels ();
13624
13625 s_stab (type);
13626}
13627
54f4ddb3 13628/* Handle the .weakext pseudo-op as defined in Kane and Heinrich. */
252b5132
RH
13629
13630static void
17a2f251 13631s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
13632{
13633 char *name;
13634 int c;
13635 symbolS *symbolP;
13636 expressionS exp;
13637
13638 name = input_line_pointer;
13639 c = get_symbol_end ();
13640 symbolP = symbol_find_or_make (name);
13641 S_SET_WEAK (symbolP);
13642 *input_line_pointer = c;
13643
13644 SKIP_WHITESPACE ();
13645
13646 if (! is_end_of_line[(unsigned char) *input_line_pointer])
13647 {
13648 if (S_IS_DEFINED (symbolP))
13649 {
20203fb9 13650 as_bad (_("ignoring attempt to redefine symbol %s"),
252b5132
RH
13651 S_GET_NAME (symbolP));
13652 ignore_rest_of_line ();
13653 return;
13654 }
bdaaa2e1 13655
252b5132
RH
13656 if (*input_line_pointer == ',')
13657 {
13658 ++input_line_pointer;
13659 SKIP_WHITESPACE ();
13660 }
bdaaa2e1 13661
252b5132
RH
13662 expression (&exp);
13663 if (exp.X_op != O_symbol)
13664 {
20203fb9 13665 as_bad (_("bad .weakext directive"));
98d3f06f 13666 ignore_rest_of_line ();
252b5132
RH
13667 return;
13668 }
49309057 13669 symbol_set_value_expression (symbolP, &exp);
252b5132
RH
13670 }
13671
13672 demand_empty_rest_of_line ();
13673}
13674
13675/* Parse a register string into a number. Called from the ECOFF code
13676 to parse .frame. The argument is non-zero if this is the frame
13677 register, so that we can record it in mips_frame_reg. */
13678
13679int
17a2f251 13680tc_get_register (int frame)
252b5132 13681{
707bfff6 13682 unsigned int reg;
252b5132
RH
13683
13684 SKIP_WHITESPACE ();
707bfff6
TS
13685 if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
13686 reg = 0;
252b5132 13687 if (frame)
7a621144
DJ
13688 {
13689 mips_frame_reg = reg != 0 ? reg : SP;
13690 mips_frame_reg_valid = 1;
13691 mips_cprestore_valid = 0;
13692 }
252b5132
RH
13693 return reg;
13694}
13695
13696valueT
17a2f251 13697md_section_align (asection *seg, valueT addr)
252b5132
RH
13698{
13699 int align = bfd_get_section_alignment (stdoutput, seg);
13700
b4c71f56
TS
13701 if (IS_ELF)
13702 {
13703 /* We don't need to align ELF sections to the full alignment.
13704 However, Irix 5 may prefer that we align them at least to a 16
13705 byte boundary. We don't bother to align the sections if we
13706 are targeted for an embedded system. */
c41e87e3 13707 if (strncmp (TARGET_OS, "elf", 3) == 0)
b4c71f56
TS
13708 return addr;
13709 if (align > 4)
13710 align = 4;
13711 }
252b5132
RH
13712
13713 return ((addr + (1 << align) - 1) & (-1 << align));
13714}
13715
13716/* Utility routine, called from above as well. If called while the
13717 input file is still being read, it's only an approximation. (For
13718 example, a symbol may later become defined which appeared to be
13719 undefined earlier.) */
13720
13721static int
17a2f251 13722nopic_need_relax (symbolS *sym, int before_relaxing)
252b5132
RH
13723{
13724 if (sym == 0)
13725 return 0;
13726
4d0d148d 13727 if (g_switch_value > 0)
252b5132
RH
13728 {
13729 const char *symname;
13730 int change;
13731
c9914766 13732 /* Find out whether this symbol can be referenced off the $gp
252b5132
RH
13733 register. It can be if it is smaller than the -G size or if
13734 it is in the .sdata or .sbss section. Certain symbols can
c9914766 13735 not be referenced off the $gp, although it appears as though
252b5132
RH
13736 they can. */
13737 symname = S_GET_NAME (sym);
13738 if (symname != (const char *) NULL
13739 && (strcmp (symname, "eprol") == 0
13740 || strcmp (symname, "etext") == 0
13741 || strcmp (symname, "_gp") == 0
13742 || strcmp (symname, "edata") == 0
13743 || strcmp (symname, "_fbss") == 0
13744 || strcmp (symname, "_fdata") == 0
13745 || strcmp (symname, "_ftext") == 0
13746 || strcmp (symname, "end") == 0
13747 || strcmp (symname, "_gp_disp") == 0))
13748 change = 1;
13749 else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
13750 && (0
13751#ifndef NO_ECOFF_DEBUGGING
49309057
ILT
13752 || (symbol_get_obj (sym)->ecoff_extern_size != 0
13753 && (symbol_get_obj (sym)->ecoff_extern_size
13754 <= g_switch_value))
252b5132
RH
13755#endif
13756 /* We must defer this decision until after the whole
13757 file has been read, since there might be a .extern
13758 after the first use of this symbol. */
13759 || (before_relaxing
13760#ifndef NO_ECOFF_DEBUGGING
49309057 13761 && symbol_get_obj (sym)->ecoff_extern_size == 0
252b5132
RH
13762#endif
13763 && S_GET_VALUE (sym) == 0)
13764 || (S_GET_VALUE (sym) != 0
13765 && S_GET_VALUE (sym) <= g_switch_value)))
13766 change = 0;
13767 else
13768 {
13769 const char *segname;
13770
13771 segname = segment_name (S_GET_SEGMENT (sym));
9c2799c2 13772 gas_assert (strcmp (segname, ".lit8") != 0
252b5132
RH
13773 && strcmp (segname, ".lit4") != 0);
13774 change = (strcmp (segname, ".sdata") != 0
fba2b7f9
GK
13775 && strcmp (segname, ".sbss") != 0
13776 && strncmp (segname, ".sdata.", 7) != 0
d4dc2f22
TS
13777 && strncmp (segname, ".sbss.", 6) != 0
13778 && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
fba2b7f9 13779 && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
252b5132
RH
13780 }
13781 return change;
13782 }
13783 else
c9914766 13784 /* We are not optimizing for the $gp register. */
252b5132
RH
13785 return 1;
13786}
13787
5919d012
RS
13788
13789/* Return true if the given symbol should be considered local for SVR4 PIC. */
13790
13791static bfd_boolean
17a2f251 13792pic_need_relax (symbolS *sym, asection *segtype)
5919d012
RS
13793{
13794 asection *symsec;
5919d012
RS
13795
13796 /* Handle the case of a symbol equated to another symbol. */
13797 while (symbol_equated_reloc_p (sym))
13798 {
13799 symbolS *n;
13800
5f0fe04b 13801 /* It's possible to get a loop here in a badly written program. */
5919d012
RS
13802 n = symbol_get_value_expression (sym)->X_add_symbol;
13803 if (n == sym)
13804 break;
13805 sym = n;
13806 }
13807
df1f3cda
DD
13808 if (symbol_section_p (sym))
13809 return TRUE;
13810
5919d012
RS
13811 symsec = S_GET_SEGMENT (sym);
13812
5919d012
RS
13813 /* This must duplicate the test in adjust_reloc_syms. */
13814 return (symsec != &bfd_und_section
13815 && symsec != &bfd_abs_section
5f0fe04b
TS
13816 && !bfd_is_com_section (symsec)
13817 && !s_is_linkonce (sym, segtype)
5919d012
RS
13818#ifdef OBJ_ELF
13819 /* A global or weak symbol is treated as external. */
f43abd2b 13820 && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
5919d012
RS
13821#endif
13822 );
13823}
13824
13825
252b5132
RH
13826/* Given a mips16 variant frag FRAGP, return non-zero if it needs an
13827 extended opcode. SEC is the section the frag is in. */
13828
13829static int
17a2f251 13830mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
252b5132
RH
13831{
13832 int type;
3994f87e 13833 const struct mips16_immed_operand *op;
252b5132
RH
13834 offsetT val;
13835 int mintiny, maxtiny;
13836 segT symsec;
98aa84af 13837 fragS *sym_frag;
252b5132
RH
13838
13839 if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
13840 return 0;
13841 if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
13842 return 1;
13843
13844 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13845 op = mips16_immed_operands;
13846 while (op->type != type)
13847 {
13848 ++op;
9c2799c2 13849 gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
252b5132
RH
13850 }
13851
13852 if (op->unsp)
13853 {
13854 if (type == '<' || type == '>' || type == '[' || type == ']')
13855 {
13856 mintiny = 1;
13857 maxtiny = 1 << op->nbits;
13858 }
13859 else
13860 {
13861 mintiny = 0;
13862 maxtiny = (1 << op->nbits) - 1;
13863 }
13864 }
13865 else
13866 {
13867 mintiny = - (1 << (op->nbits - 1));
13868 maxtiny = (1 << (op->nbits - 1)) - 1;
13869 }
13870
98aa84af 13871 sym_frag = symbol_get_frag (fragp->fr_symbol);
ac62c346 13872 val = S_GET_VALUE (fragp->fr_symbol);
98aa84af 13873 symsec = S_GET_SEGMENT (fragp->fr_symbol);
252b5132
RH
13874
13875 if (op->pcrel)
13876 {
13877 addressT addr;
13878
13879 /* We won't have the section when we are called from
13880 mips_relax_frag. However, we will always have been called
13881 from md_estimate_size_before_relax first. If this is a
13882 branch to a different section, we mark it as such. If SEC is
13883 NULL, and the frag is not marked, then it must be a branch to
13884 the same section. */
13885 if (sec == NULL)
13886 {
13887 if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
13888 return 1;
13889 }
13890 else
13891 {
98aa84af 13892 /* Must have been called from md_estimate_size_before_relax. */
252b5132
RH
13893 if (symsec != sec)
13894 {
13895 fragp->fr_subtype =
13896 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13897
13898 /* FIXME: We should support this, and let the linker
13899 catch branches and loads that are out of range. */
13900 as_bad_where (fragp->fr_file, fragp->fr_line,
13901 _("unsupported PC relative reference to different section"));
13902
13903 return 1;
13904 }
98aa84af
AM
13905 if (fragp != sym_frag && sym_frag->fr_address == 0)
13906 /* Assume non-extended on the first relaxation pass.
13907 The address we have calculated will be bogus if this is
13908 a forward branch to another frag, as the forward frag
13909 will have fr_address == 0. */
13910 return 0;
252b5132
RH
13911 }
13912
13913 /* In this case, we know for sure that the symbol fragment is in
98aa84af
AM
13914 the same section. If the relax_marker of the symbol fragment
13915 differs from the relax_marker of this fragment, we have not
13916 yet adjusted the symbol fragment fr_address. We want to add
252b5132
RH
13917 in STRETCH in order to get a better estimate of the address.
13918 This particularly matters because of the shift bits. */
13919 if (stretch != 0
98aa84af 13920 && sym_frag->relax_marker != fragp->relax_marker)
252b5132
RH
13921 {
13922 fragS *f;
13923
13924 /* Adjust stretch for any alignment frag. Note that if have
13925 been expanding the earlier code, the symbol may be
13926 defined in what appears to be an earlier frag. FIXME:
13927 This doesn't handle the fr_subtype field, which specifies
13928 a maximum number of bytes to skip when doing an
13929 alignment. */
98aa84af 13930 for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
252b5132
RH
13931 {
13932 if (f->fr_type == rs_align || f->fr_type == rs_align_code)
13933 {
13934 if (stretch < 0)
13935 stretch = - ((- stretch)
13936 & ~ ((1 << (int) f->fr_offset) - 1));
13937 else
13938 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
13939 if (stretch == 0)
13940 break;
13941 }
13942 }
13943 if (f != NULL)
13944 val += stretch;
13945 }
13946
13947 addr = fragp->fr_address + fragp->fr_fix;
13948
13949 /* The base address rules are complicated. The base address of
13950 a branch is the following instruction. The base address of a
13951 PC relative load or add is the instruction itself, but if it
13952 is in a delay slot (in which case it can not be extended) use
13953 the address of the instruction whose delay slot it is in. */
13954 if (type == 'p' || type == 'q')
13955 {
13956 addr += 2;
13957
13958 /* If we are currently assuming that this frag should be
13959 extended, then, the current address is two bytes
bdaaa2e1 13960 higher. */
252b5132
RH
13961 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13962 addr += 2;
13963
13964 /* Ignore the low bit in the target, since it will be set
13965 for a text label. */
13966 if ((val & 1) != 0)
13967 --val;
13968 }
13969 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13970 addr -= 4;
13971 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13972 addr -= 2;
13973
13974 val -= addr & ~ ((1 << op->shift) - 1);
13975
13976 /* Branch offsets have an implicit 0 in the lowest bit. */
13977 if (type == 'p' || type == 'q')
13978 val /= 2;
13979
13980 /* If any of the shifted bits are set, we must use an extended
13981 opcode. If the address depends on the size of this
13982 instruction, this can lead to a loop, so we arrange to always
13983 use an extended opcode. We only check this when we are in
13984 the main relaxation loop, when SEC is NULL. */
13985 if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
13986 {
13987 fragp->fr_subtype =
13988 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13989 return 1;
13990 }
13991
13992 /* If we are about to mark a frag as extended because the value
13993 is precisely maxtiny + 1, then there is a chance of an
13994 infinite loop as in the following code:
13995 la $4,foo
13996 .skip 1020
13997 .align 2
13998 foo:
13999 In this case when the la is extended, foo is 0x3fc bytes
14000 away, so the la can be shrunk, but then foo is 0x400 away, so
14001 the la must be extended. To avoid this loop, we mark the
14002 frag as extended if it was small, and is about to become
14003 extended with a value of maxtiny + 1. */
14004 if (val == ((maxtiny + 1) << op->shift)
14005 && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
14006 && sec == NULL)
14007 {
14008 fragp->fr_subtype =
14009 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
14010 return 1;
14011 }
14012 }
14013 else if (symsec != absolute_section && sec != NULL)
14014 as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
14015
14016 if ((val & ((1 << op->shift) - 1)) != 0
14017 || val < (mintiny << op->shift)
14018 || val > (maxtiny << op->shift))
14019 return 1;
14020 else
14021 return 0;
14022}
14023
4a6a3df4
AO
14024/* Compute the length of a branch sequence, and adjust the
14025 RELAX_BRANCH_TOOFAR bit accordingly. If FRAGP is NULL, the
14026 worst-case length is computed, with UPDATE being used to indicate
14027 whether an unconditional (-1), branch-likely (+1) or regular (0)
14028 branch is to be computed. */
14029static int
17a2f251 14030relaxed_branch_length (fragS *fragp, asection *sec, int update)
4a6a3df4 14031{
b34976b6 14032 bfd_boolean toofar;
4a6a3df4
AO
14033 int length;
14034
14035 if (fragp
14036 && S_IS_DEFINED (fragp->fr_symbol)
14037 && sec == S_GET_SEGMENT (fragp->fr_symbol))
14038 {
14039 addressT addr;
14040 offsetT val;
14041
14042 val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
14043
14044 addr = fragp->fr_address + fragp->fr_fix + 4;
14045
14046 val -= addr;
14047
14048 toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
14049 }
14050 else if (fragp)
14051 /* If the symbol is not defined or it's in a different segment,
14052 assume the user knows what's going on and emit a short
14053 branch. */
b34976b6 14054 toofar = FALSE;
4a6a3df4 14055 else
b34976b6 14056 toofar = TRUE;
4a6a3df4
AO
14057
14058 if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14059 fragp->fr_subtype
af6ae2ad 14060 = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp->fr_subtype),
4a6a3df4
AO
14061 RELAX_BRANCH_LIKELY (fragp->fr_subtype),
14062 RELAX_BRANCH_LINK (fragp->fr_subtype),
14063 toofar);
14064
14065 length = 4;
14066 if (toofar)
14067 {
14068 if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
14069 length += 8;
14070
14071 if (mips_pic != NO_PIC)
14072 {
14073 /* Additional space for PIC loading of target address. */
14074 length += 8;
14075 if (mips_opts.isa == ISA_MIPS1)
14076 /* Additional space for $at-stabilizing nop. */
14077 length += 4;
14078 }
14079
14080 /* If branch is conditional. */
14081 if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
14082 length += 8;
14083 }
b34976b6 14084
4a6a3df4
AO
14085 return length;
14086}
14087
252b5132
RH
14088/* Estimate the size of a frag before relaxing. Unless this is the
14089 mips16, we are not really relaxing here, and the final size is
14090 encoded in the subtype information. For the mips16, we have to
14091 decide whether we are using an extended opcode or not. */
14092
252b5132 14093int
17a2f251 14094md_estimate_size_before_relax (fragS *fragp, asection *segtype)
252b5132 14095{
5919d012 14096 int change;
252b5132 14097
4a6a3df4
AO
14098 if (RELAX_BRANCH_P (fragp->fr_subtype))
14099 {
14100
b34976b6
AM
14101 fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
14102
4a6a3df4
AO
14103 return fragp->fr_var;
14104 }
14105
252b5132 14106 if (RELAX_MIPS16_P (fragp->fr_subtype))
177b4a6a
AO
14107 /* We don't want to modify the EXTENDED bit here; it might get us
14108 into infinite loops. We change it only in mips_relax_frag(). */
14109 return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
252b5132
RH
14110
14111 if (mips_pic == NO_PIC)
5919d012 14112 change = nopic_need_relax (fragp->fr_symbol, 0);
252b5132 14113 else if (mips_pic == SVR4_PIC)
5919d012 14114 change = pic_need_relax (fragp->fr_symbol, segtype);
0a44bf69
RS
14115 else if (mips_pic == VXWORKS_PIC)
14116 /* For vxworks, GOT16 relocations never have a corresponding LO16. */
14117 change = 0;
252b5132
RH
14118 else
14119 abort ();
14120
14121 if (change)
14122 {
4d7206a2 14123 fragp->fr_subtype |= RELAX_USE_SECOND;
4d7206a2 14124 return -RELAX_FIRST (fragp->fr_subtype);
252b5132 14125 }
4d7206a2
RS
14126 else
14127 return -RELAX_SECOND (fragp->fr_subtype);
252b5132
RH
14128}
14129
14130/* This is called to see whether a reloc against a defined symbol
de7e6852 14131 should be converted into a reloc against a section. */
252b5132
RH
14132
14133int
17a2f251 14134mips_fix_adjustable (fixS *fixp)
252b5132 14135{
252b5132
RH
14136 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
14137 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14138 return 0;
a161fe53 14139
252b5132
RH
14140 if (fixp->fx_addsy == NULL)
14141 return 1;
a161fe53 14142
de7e6852
RS
14143 /* If symbol SYM is in a mergeable section, relocations of the form
14144 SYM + 0 can usually be made section-relative. The mergeable data
14145 is then identified by the section offset rather than by the symbol.
14146
14147 However, if we're generating REL LO16 relocations, the offset is split
14148 between the LO16 and parterning high part relocation. The linker will
14149 need to recalculate the complete offset in order to correctly identify
14150 the merge data.
14151
14152 The linker has traditionally not looked for the parterning high part
14153 relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
14154 placed anywhere. Rather than break backwards compatibility by changing
14155 this, it seems better not to force the issue, and instead keep the
14156 original symbol. This will work with either linker behavior. */
738e5348 14157 if ((lo16_reloc_p (fixp->fx_r_type)
704803a9 14158 || reloc_needs_lo_p (fixp->fx_r_type))
de7e6852
RS
14159 && HAVE_IN_PLACE_ADDENDS
14160 && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
14161 return 0;
14162
1180b5a4
RS
14163 /* There is no place to store an in-place offset for JALR relocations. */
14164 if (fixp->fx_r_type == BFD_RELOC_MIPS_JALR && HAVE_IN_PLACE_ADDENDS)
14165 return 0;
14166
252b5132 14167#ifdef OBJ_ELF
b314ec0e
RS
14168 /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
14169 to a floating-point stub. The same is true for non-R_MIPS16_26
14170 relocations against MIPS16 functions; in this case, the stub becomes
14171 the function's canonical address.
14172
14173 Floating-point stubs are stored in unique .mips16.call.* or
14174 .mips16.fn.* sections. If a stub T for function F is in section S,
14175 the first relocation in section S must be against F; this is how the
14176 linker determines the target function. All relocations that might
14177 resolve to T must also be against F. We therefore have the following
14178 restrictions, which are given in an intentionally-redundant way:
14179
14180 1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
14181 symbols.
14182
14183 2. We cannot reduce a stub's relocations against non-MIPS16 symbols
14184 if that stub might be used.
14185
14186 3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
14187 symbols.
14188
14189 4. We cannot reduce a stub's relocations against MIPS16 symbols if
14190 that stub might be used.
14191
14192 There is a further restriction:
14193
14194 5. We cannot reduce R_MIPS16_26 relocations against MIPS16 symbols
14195 on targets with in-place addends; the relocation field cannot
14196 encode the low bit.
14197
14198 For simplicity, we deal with (3)-(5) by not reducing _any_ relocation
14199 against a MIPS16 symbol.
14200
14201 We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
14202 relocation against some symbol R, no relocation against R may be
14203 reduced. (Note that this deals with (2) as well as (1) because
14204 relocations against global symbols will never be reduced on ELF
14205 targets.) This approach is a little simpler than trying to detect
14206 stub sections, and gives the "all or nothing" per-symbol consistency
14207 that we have for MIPS16 symbols. */
f43abd2b 14208 if (IS_ELF
b314ec0e 14209 && fixp->fx_subsy == NULL
30c09090 14210 && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
b314ec0e 14211 || *symbol_get_tc (fixp->fx_addsy)))
252b5132
RH
14212 return 0;
14213#endif
a161fe53 14214
252b5132
RH
14215 return 1;
14216}
14217
14218/* Translate internal representation of relocation info to BFD target
14219 format. */
14220
14221arelent **
17a2f251 14222tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
252b5132
RH
14223{
14224 static arelent *retval[4];
14225 arelent *reloc;
14226 bfd_reloc_code_real_type code;
14227
4b0cff4e
TS
14228 memset (retval, 0, sizeof(retval));
14229 reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
49309057
ILT
14230 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
14231 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
14232 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
14233
bad36eac
DJ
14234 if (fixp->fx_pcrel)
14235 {
9c2799c2 14236 gas_assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2);
bad36eac
DJ
14237
14238 /* At this point, fx_addnumber is "symbol offset - pcrel address".
14239 Relocations want only the symbol offset. */
14240 reloc->addend = fixp->fx_addnumber + reloc->address;
f43abd2b 14241 if (!IS_ELF)
bad36eac
DJ
14242 {
14243 /* A gruesome hack which is a result of the gruesome gas
14244 reloc handling. What's worse, for COFF (as opposed to
14245 ECOFF), we might need yet another copy of reloc->address.
14246 See bfd_install_relocation. */
14247 reloc->addend += reloc->address;
14248 }
14249 }
14250 else
14251 reloc->addend = fixp->fx_addnumber;
252b5132 14252
438c16b8
TS
14253 /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
14254 entry to be used in the relocation's section offset. */
14255 if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
252b5132
RH
14256 {
14257 reloc->address = reloc->addend;
14258 reloc->addend = 0;
14259 }
14260
252b5132 14261 code = fixp->fx_r_type;
252b5132 14262
bad36eac 14263 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
252b5132
RH
14264 if (reloc->howto == NULL)
14265 {
14266 as_bad_where (fixp->fx_file, fixp->fx_line,
14267 _("Can not represent %s relocation in this object file format"),
14268 bfd_get_reloc_code_name (code));
14269 retval[0] = NULL;
14270 }
14271
14272 return retval;
14273}
14274
14275/* Relax a machine dependent frag. This returns the amount by which
14276 the current size of the frag should change. */
14277
14278int
17a2f251 14279mips_relax_frag (asection *sec, fragS *fragp, long stretch)
252b5132 14280{
4a6a3df4
AO
14281 if (RELAX_BRANCH_P (fragp->fr_subtype))
14282 {
14283 offsetT old_var = fragp->fr_var;
b34976b6
AM
14284
14285 fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
4a6a3df4
AO
14286
14287 return fragp->fr_var - old_var;
14288 }
14289
252b5132
RH
14290 if (! RELAX_MIPS16_P (fragp->fr_subtype))
14291 return 0;
14292
c4e7957c 14293 if (mips16_extended_frag (fragp, NULL, stretch))
252b5132
RH
14294 {
14295 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14296 return 0;
14297 fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
14298 return 2;
14299 }
14300 else
14301 {
14302 if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14303 return 0;
14304 fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
14305 return -2;
14306 }
14307
14308 return 0;
14309}
14310
14311/* Convert a machine dependent frag. */
14312
14313void
17a2f251 14314md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
252b5132 14315{
4a6a3df4
AO
14316 if (RELAX_BRANCH_P (fragp->fr_subtype))
14317 {
14318 bfd_byte *buf;
14319 unsigned long insn;
14320 expressionS exp;
14321 fixS *fixp;
b34976b6 14322
4a6a3df4
AO
14323 buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
14324
14325 if (target_big_endian)
14326 insn = bfd_getb32 (buf);
14327 else
14328 insn = bfd_getl32 (buf);
b34976b6 14329
4a6a3df4
AO
14330 if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14331 {
14332 /* We generate a fixup instead of applying it right now
14333 because, if there are linker relaxations, we're going to
14334 need the relocations. */
14335 exp.X_op = O_symbol;
14336 exp.X_add_symbol = fragp->fr_symbol;
14337 exp.X_add_number = fragp->fr_offset;
14338
14339 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
3994f87e 14340 4, &exp, TRUE, BFD_RELOC_16_PCREL_S2);
4a6a3df4
AO
14341 fixp->fx_file = fragp->fr_file;
14342 fixp->fx_line = fragp->fr_line;
b34976b6 14343
2132e3a3 14344 md_number_to_chars ((char *) buf, insn, 4);
4a6a3df4
AO
14345 buf += 4;
14346 }
14347 else
14348 {
14349 int i;
14350
14351 as_warn_where (fragp->fr_file, fragp->fr_line,
14352 _("relaxed out-of-range branch into a jump"));
14353
14354 if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
14355 goto uncond;
14356
14357 if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14358 {
14359 /* Reverse the branch. */
14360 switch ((insn >> 28) & 0xf)
14361 {
14362 case 4:
14363 /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
14364 have the condition reversed by tweaking a single
14365 bit, and their opcodes all have 0x4???????. */
9c2799c2 14366 gas_assert ((insn & 0xf1000000) == 0x41000000);
4a6a3df4
AO
14367 insn ^= 0x00010000;
14368 break;
14369
14370 case 0:
14371 /* bltz 0x04000000 bgez 0x04010000
54f4ddb3 14372 bltzal 0x04100000 bgezal 0x04110000 */
9c2799c2 14373 gas_assert ((insn & 0xfc0e0000) == 0x04000000);
4a6a3df4
AO
14374 insn ^= 0x00010000;
14375 break;
b34976b6 14376
4a6a3df4
AO
14377 case 1:
14378 /* beq 0x10000000 bne 0x14000000
54f4ddb3 14379 blez 0x18000000 bgtz 0x1c000000 */
4a6a3df4
AO
14380 insn ^= 0x04000000;
14381 break;
14382
14383 default:
14384 abort ();
14385 }
14386 }
14387
14388 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14389 {
14390 /* Clear the and-link bit. */
9c2799c2 14391 gas_assert ((insn & 0xfc1c0000) == 0x04100000);
4a6a3df4 14392
54f4ddb3
TS
14393 /* bltzal 0x04100000 bgezal 0x04110000
14394 bltzall 0x04120000 bgezall 0x04130000 */
4a6a3df4
AO
14395 insn &= ~0x00100000;
14396 }
14397
14398 /* Branch over the branch (if the branch was likely) or the
14399 full jump (not likely case). Compute the offset from the
14400 current instruction to branch to. */
14401 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14402 i = 16;
14403 else
14404 {
14405 /* How many bytes in instructions we've already emitted? */
14406 i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14407 /* How many bytes in instructions from here to the end? */
14408 i = fragp->fr_var - i;
14409 }
14410 /* Convert to instruction count. */
14411 i >>= 2;
14412 /* Branch counts from the next instruction. */
b34976b6 14413 i--;
4a6a3df4
AO
14414 insn |= i;
14415 /* Branch over the jump. */
2132e3a3 14416 md_number_to_chars ((char *) buf, insn, 4);
4a6a3df4
AO
14417 buf += 4;
14418
54f4ddb3 14419 /* nop */
2132e3a3 14420 md_number_to_chars ((char *) buf, 0, 4);
4a6a3df4
AO
14421 buf += 4;
14422
14423 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14424 {
14425 /* beql $0, $0, 2f */
14426 insn = 0x50000000;
14427 /* Compute the PC offset from the current instruction to
14428 the end of the variable frag. */
14429 /* How many bytes in instructions we've already emitted? */
14430 i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14431 /* How many bytes in instructions from here to the end? */
14432 i = fragp->fr_var - i;
14433 /* Convert to instruction count. */
14434 i >>= 2;
14435 /* Don't decrement i, because we want to branch over the
14436 delay slot. */
14437
14438 insn |= i;
2132e3a3 14439 md_number_to_chars ((char *) buf, insn, 4);
4a6a3df4
AO
14440 buf += 4;
14441
2132e3a3 14442 md_number_to_chars ((char *) buf, 0, 4);
4a6a3df4
AO
14443 buf += 4;
14444 }
14445
14446 uncond:
14447 if (mips_pic == NO_PIC)
14448 {
14449 /* j or jal. */
14450 insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
14451 ? 0x0c000000 : 0x08000000);
14452 exp.X_op = O_symbol;
14453 exp.X_add_symbol = fragp->fr_symbol;
14454 exp.X_add_number = fragp->fr_offset;
14455
14456 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
3994f87e 14457 4, &exp, FALSE, BFD_RELOC_MIPS_JMP);
4a6a3df4
AO
14458 fixp->fx_file = fragp->fr_file;
14459 fixp->fx_line = fragp->fr_line;
14460
2132e3a3 14461 md_number_to_chars ((char *) buf, insn, 4);
4a6a3df4
AO
14462 buf += 4;
14463 }
14464 else
14465 {
14466 /* lw/ld $at, <sym>($gp) R_MIPS_GOT16 */
14467 insn = HAVE_64BIT_ADDRESSES ? 0xdf810000 : 0x8f810000;
14468 exp.X_op = O_symbol;
14469 exp.X_add_symbol = fragp->fr_symbol;
14470 exp.X_add_number = fragp->fr_offset;
14471
14472 if (fragp->fr_offset)
14473 {
14474 exp.X_add_symbol = make_expr_symbol (&exp);
14475 exp.X_add_number = 0;
14476 }
14477
14478 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
3994f87e 14479 4, &exp, FALSE, BFD_RELOC_MIPS_GOT16);
4a6a3df4
AO
14480 fixp->fx_file = fragp->fr_file;
14481 fixp->fx_line = fragp->fr_line;
14482
2132e3a3 14483 md_number_to_chars ((char *) buf, insn, 4);
4a6a3df4 14484 buf += 4;
b34976b6 14485
4a6a3df4
AO
14486 if (mips_opts.isa == ISA_MIPS1)
14487 {
14488 /* nop */
2132e3a3 14489 md_number_to_chars ((char *) buf, 0, 4);
4a6a3df4
AO
14490 buf += 4;
14491 }
14492
14493 /* d/addiu $at, $at, <sym> R_MIPS_LO16 */
14494 insn = HAVE_64BIT_ADDRESSES ? 0x64210000 : 0x24210000;
14495
14496 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
3994f87e 14497 4, &exp, FALSE, BFD_RELOC_LO16);
4a6a3df4
AO
14498 fixp->fx_file = fragp->fr_file;
14499 fixp->fx_line = fragp->fr_line;
b34976b6 14500
2132e3a3 14501 md_number_to_chars ((char *) buf, insn, 4);
4a6a3df4
AO
14502 buf += 4;
14503
14504 /* j(al)r $at. */
14505 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14506 insn = 0x0020f809;
14507 else
14508 insn = 0x00200008;
14509
2132e3a3 14510 md_number_to_chars ((char *) buf, insn, 4);
4a6a3df4
AO
14511 buf += 4;
14512 }
14513 }
14514
9c2799c2 14515 gas_assert (buf == (bfd_byte *)fragp->fr_literal
4a6a3df4
AO
14516 + fragp->fr_fix + fragp->fr_var);
14517
14518 fragp->fr_fix += fragp->fr_var;
14519
14520 return;
14521 }
14522
252b5132
RH
14523 if (RELAX_MIPS16_P (fragp->fr_subtype))
14524 {
14525 int type;
3994f87e 14526 const struct mips16_immed_operand *op;
b34976b6 14527 bfd_boolean small, ext;
252b5132
RH
14528 offsetT val;
14529 bfd_byte *buf;
14530 unsigned long insn;
b34976b6 14531 bfd_boolean use_extend;
252b5132
RH
14532 unsigned short extend;
14533
14534 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14535 op = mips16_immed_operands;
14536 while (op->type != type)
14537 ++op;
14538
14539 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14540 {
b34976b6
AM
14541 small = FALSE;
14542 ext = TRUE;
252b5132
RH
14543 }
14544 else
14545 {
b34976b6
AM
14546 small = TRUE;
14547 ext = FALSE;
252b5132
RH
14548 }
14549
5f5f22c0 14550 val = resolve_symbol_value (fragp->fr_symbol);
252b5132
RH
14551 if (op->pcrel)
14552 {
14553 addressT addr;
14554
14555 addr = fragp->fr_address + fragp->fr_fix;
14556
14557 /* The rules for the base address of a PC relative reloc are
14558 complicated; see mips16_extended_frag. */
14559 if (type == 'p' || type == 'q')
14560 {
14561 addr += 2;
14562 if (ext)
14563 addr += 2;
14564 /* Ignore the low bit in the target, since it will be
14565 set for a text label. */
14566 if ((val & 1) != 0)
14567 --val;
14568 }
14569 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14570 addr -= 4;
14571 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14572 addr -= 2;
14573
14574 addr &= ~ (addressT) ((1 << op->shift) - 1);
14575 val -= addr;
14576
14577 /* Make sure the section winds up with the alignment we have
14578 assumed. */
14579 if (op->shift > 0)
14580 record_alignment (asec, op->shift);
14581 }
14582
14583 if (ext
14584 && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
14585 || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
14586 as_warn_where (fragp->fr_file, fragp->fr_line,
14587 _("extended instruction in delay slot"));
14588
14589 buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
14590
14591 if (target_big_endian)
14592 insn = bfd_getb16 (buf);
14593 else
14594 insn = bfd_getl16 (buf);
14595
14596 mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
14597 RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
14598 small, ext, &insn, &use_extend, &extend);
14599
14600 if (use_extend)
14601 {
2132e3a3 14602 md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
252b5132
RH
14603 fragp->fr_fix += 2;
14604 buf += 2;
14605 }
14606
2132e3a3 14607 md_number_to_chars ((char *) buf, insn, 2);
252b5132
RH
14608 fragp->fr_fix += 2;
14609 buf += 2;
14610 }
14611 else
14612 {
4d7206a2
RS
14613 int first, second;
14614 fixS *fixp;
252b5132 14615
4d7206a2
RS
14616 first = RELAX_FIRST (fragp->fr_subtype);
14617 second = RELAX_SECOND (fragp->fr_subtype);
14618 fixp = (fixS *) fragp->fr_opcode;
252b5132 14619
584892a6
RS
14620 /* Possibly emit a warning if we've chosen the longer option. */
14621 if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
14622 == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
14623 {
14624 const char *msg = macro_warning (fragp->fr_subtype);
14625 if (msg != 0)
520725ea 14626 as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
584892a6
RS
14627 }
14628
4d7206a2
RS
14629 /* Go through all the fixups for the first sequence. Disable them
14630 (by marking them as done) if we're going to use the second
14631 sequence instead. */
14632 while (fixp
14633 && fixp->fx_frag == fragp
14634 && fixp->fx_where < fragp->fr_fix - second)
14635 {
14636 if (fragp->fr_subtype & RELAX_USE_SECOND)
14637 fixp->fx_done = 1;
14638 fixp = fixp->fx_next;
14639 }
252b5132 14640
4d7206a2
RS
14641 /* Go through the fixups for the second sequence. Disable them if
14642 we're going to use the first sequence, otherwise adjust their
14643 addresses to account for the relaxation. */
14644 while (fixp && fixp->fx_frag == fragp)
14645 {
14646 if (fragp->fr_subtype & RELAX_USE_SECOND)
14647 fixp->fx_where -= first;
14648 else
14649 fixp->fx_done = 1;
14650 fixp = fixp->fx_next;
14651 }
14652
14653 /* Now modify the frag contents. */
14654 if (fragp->fr_subtype & RELAX_USE_SECOND)
14655 {
14656 char *start;
14657
14658 start = fragp->fr_literal + fragp->fr_fix - first - second;
14659 memmove (start, start + first, second);
14660 fragp->fr_fix -= first;
14661 }
14662 else
14663 fragp->fr_fix -= second;
252b5132
RH
14664 }
14665}
14666
14667#ifdef OBJ_ELF
14668
14669/* This function is called after the relocs have been generated.
14670 We've been storing mips16 text labels as odd. Here we convert them
14671 back to even for the convenience of the debugger. */
14672
14673void
17a2f251 14674mips_frob_file_after_relocs (void)
252b5132
RH
14675{
14676 asymbol **syms;
14677 unsigned int count, i;
14678
f43abd2b 14679 if (!IS_ELF)
252b5132
RH
14680 return;
14681
14682 syms = bfd_get_outsymbols (stdoutput);
14683 count = bfd_get_symcount (stdoutput);
14684 for (i = 0; i < count; i++, syms++)
14685 {
30c09090 14686 if (ELF_ST_IS_MIPS16 (elf_symbol (*syms)->internal_elf_sym.st_other)
252b5132
RH
14687 && ((*syms)->value & 1) != 0)
14688 {
14689 (*syms)->value &= ~1;
14690 /* If the symbol has an odd size, it was probably computed
14691 incorrectly, so adjust that as well. */
14692 if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
14693 ++elf_symbol (*syms)->internal_elf_sym.st_size;
14694 }
14695 }
14696}
14697
14698#endif
14699
14700/* This function is called whenever a label is defined. It is used
14701 when handling branch delays; if a branch has a label, we assume we
14702 can not move it. */
14703
14704void
17a2f251 14705mips_define_label (symbolS *sym)
252b5132 14706{
a8dbcb85 14707 segment_info_type *si = seg_info (now_seg);
252b5132
RH
14708 struct insn_label_list *l;
14709
14710 if (free_insn_labels == NULL)
14711 l = (struct insn_label_list *) xmalloc (sizeof *l);
14712 else
14713 {
14714 l = free_insn_labels;
14715 free_insn_labels = l->next;
14716 }
14717
14718 l->label = sym;
a8dbcb85
TS
14719 l->next = si->label_list;
14720 si->label_list = l;
07a53e5c
RH
14721
14722#ifdef OBJ_ELF
14723 dwarf2_emit_label (sym);
14724#endif
252b5132
RH
14725}
14726\f
14727#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14728
14729/* Some special processing for a MIPS ELF file. */
14730
14731void
17a2f251 14732mips_elf_final_processing (void)
252b5132
RH
14733{
14734 /* Write out the register information. */
316f5878 14735 if (mips_abi != N64_ABI)
252b5132
RH
14736 {
14737 Elf32_RegInfo s;
14738
14739 s.ri_gprmask = mips_gprmask;
14740 s.ri_cprmask[0] = mips_cprmask[0];
14741 s.ri_cprmask[1] = mips_cprmask[1];
14742 s.ri_cprmask[2] = mips_cprmask[2];
14743 s.ri_cprmask[3] = mips_cprmask[3];
14744 /* The gp_value field is set by the MIPS ELF backend. */
14745
14746 bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
14747 ((Elf32_External_RegInfo *)
14748 mips_regmask_frag));
14749 }
14750 else
14751 {
14752 Elf64_Internal_RegInfo s;
14753
14754 s.ri_gprmask = mips_gprmask;
14755 s.ri_pad = 0;
14756 s.ri_cprmask[0] = mips_cprmask[0];
14757 s.ri_cprmask[1] = mips_cprmask[1];
14758 s.ri_cprmask[2] = mips_cprmask[2];
14759 s.ri_cprmask[3] = mips_cprmask[3];
14760 /* The gp_value field is set by the MIPS ELF backend. */
14761
14762 bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
14763 ((Elf64_External_RegInfo *)
14764 mips_regmask_frag));
14765 }
14766
14767 /* Set the MIPS ELF flag bits. FIXME: There should probably be some
14768 sort of BFD interface for this. */
14769 if (mips_any_noreorder)
14770 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
14771 if (mips_pic != NO_PIC)
143d77c5 14772 {
252b5132 14773 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
143d77c5
EC
14774 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14775 }
14776 if (mips_abicalls)
14777 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
252b5132 14778
98d3f06f 14779 /* Set MIPS ELF flags for ASEs. */
74cd071d
CF
14780 /* We may need to define a new flag for DSP ASE, and set this flag when
14781 file_ase_dsp is true. */
8b082fb1 14782 /* Same for DSP R2. */
ef2e4d86
CF
14783 /* We may need to define a new flag for MT ASE, and set this flag when
14784 file_ase_mt is true. */
a4672219
TS
14785 if (file_ase_mips16)
14786 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
1f25f5d3
CD
14787#if 0 /* XXX FIXME */
14788 if (file_ase_mips3d)
14789 elf_elfheader (stdoutput)->e_flags |= ???;
14790#endif
deec1734
CD
14791 if (file_ase_mdmx)
14792 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
1f25f5d3 14793
bdaaa2e1 14794 /* Set the MIPS ELF ABI flags. */
316f5878 14795 if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
252b5132 14796 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
316f5878 14797 else if (mips_abi == O64_ABI)
252b5132 14798 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
316f5878 14799 else if (mips_abi == EABI_ABI)
252b5132 14800 {
316f5878 14801 if (!file_mips_gp32)
252b5132
RH
14802 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
14803 else
14804 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
14805 }
316f5878 14806 else if (mips_abi == N32_ABI)
be00bddd
TS
14807 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
14808
c9914766 14809 /* Nothing to do for N64_ABI. */
252b5132
RH
14810
14811 if (mips_32bitmode)
14812 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
ad3fea08
TS
14813
14814#if 0 /* XXX FIXME */
14815 /* 32 bit code with 64 bit FP registers. */
14816 if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
14817 elf_elfheader (stdoutput)->e_flags |= ???;
14818#endif
252b5132
RH
14819}
14820
14821#endif /* OBJ_ELF || OBJ_MAYBE_ELF */
14822\f
beae10d5 14823typedef struct proc {
9b2f1d35
EC
14824 symbolS *func_sym;
14825 symbolS *func_end_sym;
beae10d5
KH
14826 unsigned long reg_mask;
14827 unsigned long reg_offset;
14828 unsigned long fpreg_mask;
14829 unsigned long fpreg_offset;
14830 unsigned long frame_offset;
14831 unsigned long frame_reg;
14832 unsigned long pc_reg;
14833} procS;
252b5132
RH
14834
14835static procS cur_proc;
14836static procS *cur_proc_ptr;
14837static int numprocs;
14838
742a56fe
RS
14839/* Implement NOP_OPCODE. We encode a MIPS16 nop as "1" and a normal
14840 nop as "0". */
14841
14842char
14843mips_nop_opcode (void)
14844{
14845 return seg_info (now_seg)->tc_segment_info_data.mips16;
14846}
14847
14848/* Fill in an rs_align_code fragment. This only needs to do something
14849 for MIPS16 code, where 0 is not a nop. */
a19d8eb0 14850
0a9ef439 14851void
17a2f251 14852mips_handle_align (fragS *fragp)
a19d8eb0 14853{
742a56fe 14854 char *p;
c67a084a
NC
14855 int bytes, size, excess;
14856 valueT opcode;
742a56fe 14857
0a9ef439
RH
14858 if (fragp->fr_type != rs_align_code)
14859 return;
14860
742a56fe
RS
14861 p = fragp->fr_literal + fragp->fr_fix;
14862 if (*p)
a19d8eb0 14863 {
c67a084a
NC
14864 opcode = mips16_nop_insn.insn_opcode;
14865 size = 2;
14866 }
14867 else
14868 {
14869 opcode = nop_insn.insn_opcode;
14870 size = 4;
14871 }
a19d8eb0 14872
c67a084a
NC
14873 bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
14874 excess = bytes % size;
14875 if (excess != 0)
14876 {
14877 /* If we're not inserting a whole number of instructions,
14878 pad the end of the fixed part of the frag with zeros. */
14879 memset (p, 0, excess);
14880 p += excess;
14881 fragp->fr_fix += excess;
a19d8eb0 14882 }
c67a084a
NC
14883
14884 md_number_to_chars (p, opcode, size);
14885 fragp->fr_var = size;
a19d8eb0
CP
14886}
14887
252b5132 14888static void
17a2f251 14889md_obj_begin (void)
252b5132
RH
14890{
14891}
14892
14893static void
17a2f251 14894md_obj_end (void)
252b5132 14895{
54f4ddb3 14896 /* Check for premature end, nesting errors, etc. */
252b5132 14897 if (cur_proc_ptr)
9a41af64 14898 as_warn (_("missing .end at end of assembly"));
252b5132
RH
14899}
14900
14901static long
17a2f251 14902get_number (void)
252b5132
RH
14903{
14904 int negative = 0;
14905 long val = 0;
14906
14907 if (*input_line_pointer == '-')
14908 {
14909 ++input_line_pointer;
14910 negative = 1;
14911 }
3882b010 14912 if (!ISDIGIT (*input_line_pointer))
956cd1d6 14913 as_bad (_("expected simple number"));
252b5132
RH
14914 if (input_line_pointer[0] == '0')
14915 {
14916 if (input_line_pointer[1] == 'x')
14917 {
14918 input_line_pointer += 2;
3882b010 14919 while (ISXDIGIT (*input_line_pointer))
252b5132
RH
14920 {
14921 val <<= 4;
14922 val |= hex_value (*input_line_pointer++);
14923 }
14924 return negative ? -val : val;
14925 }
14926 else
14927 {
14928 ++input_line_pointer;
3882b010 14929 while (ISDIGIT (*input_line_pointer))
252b5132
RH
14930 {
14931 val <<= 3;
14932 val |= *input_line_pointer++ - '0';
14933 }
14934 return negative ? -val : val;
14935 }
14936 }
3882b010 14937 if (!ISDIGIT (*input_line_pointer))
252b5132
RH
14938 {
14939 printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
14940 *input_line_pointer, *input_line_pointer);
956cd1d6 14941 as_warn (_("invalid number"));
252b5132
RH
14942 return -1;
14943 }
3882b010 14944 while (ISDIGIT (*input_line_pointer))
252b5132
RH
14945 {
14946 val *= 10;
14947 val += *input_line_pointer++ - '0';
14948 }
14949 return negative ? -val : val;
14950}
14951
14952/* The .file directive; just like the usual .file directive, but there
c5dd6aab
DJ
14953 is an initial number which is the ECOFF file index. In the non-ECOFF
14954 case .file implies DWARF-2. */
14955
14956static void
17a2f251 14957s_mips_file (int x ATTRIBUTE_UNUSED)
c5dd6aab 14958{
ecb4347a
DJ
14959 static int first_file_directive = 0;
14960
c5dd6aab
DJ
14961 if (ECOFF_DEBUGGING)
14962 {
14963 get_number ();
14964 s_app_file (0);
14965 }
14966 else
ecb4347a
DJ
14967 {
14968 char *filename;
14969
14970 filename = dwarf2_directive_file (0);
14971
14972 /* Versions of GCC up to 3.1 start files with a ".file"
14973 directive even for stabs output. Make sure that this
14974 ".file" is handled. Note that you need a version of GCC
14975 after 3.1 in order to support DWARF-2 on MIPS. */
14976 if (filename != NULL && ! first_file_directive)
14977 {
14978 (void) new_logical_line (filename, -1);
c04f5787 14979 s_app_file_string (filename, 0);
ecb4347a
DJ
14980 }
14981 first_file_directive = 1;
14982 }
c5dd6aab
DJ
14983}
14984
14985/* The .loc directive, implying DWARF-2. */
252b5132
RH
14986
14987static void
17a2f251 14988s_mips_loc (int x ATTRIBUTE_UNUSED)
252b5132 14989{
c5dd6aab
DJ
14990 if (!ECOFF_DEBUGGING)
14991 dwarf2_directive_loc (0);
252b5132
RH
14992}
14993
252b5132
RH
14994/* The .end directive. */
14995
14996static void
17a2f251 14997s_mips_end (int x ATTRIBUTE_UNUSED)
252b5132
RH
14998{
14999 symbolS *p;
252b5132 15000
7a621144
DJ
15001 /* Following functions need their own .frame and .cprestore directives. */
15002 mips_frame_reg_valid = 0;
15003 mips_cprestore_valid = 0;
15004
252b5132
RH
15005 if (!is_end_of_line[(unsigned char) *input_line_pointer])
15006 {
15007 p = get_symbol ();
15008 demand_empty_rest_of_line ();
15009 }
15010 else
15011 p = NULL;
15012
14949570 15013 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
252b5132
RH
15014 as_warn (_(".end not in text section"));
15015
15016 if (!cur_proc_ptr)
15017 {
15018 as_warn (_(".end directive without a preceding .ent directive."));
15019 demand_empty_rest_of_line ();
15020 return;
15021 }
15022
15023 if (p != NULL)
15024 {
9c2799c2 15025 gas_assert (S_GET_NAME (p));
9b2f1d35 15026 if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
252b5132 15027 as_warn (_(".end symbol does not match .ent symbol."));
ecb4347a
DJ
15028
15029 if (debug_type == DEBUG_STABS)
15030 stabs_generate_asm_endfunc (S_GET_NAME (p),
15031 S_GET_NAME (p));
252b5132
RH
15032 }
15033 else
15034 as_warn (_(".end directive missing or unknown symbol"));
15035
2132e3a3 15036#ifdef OBJ_ELF
9b2f1d35
EC
15037 /* Create an expression to calculate the size of the function. */
15038 if (p && cur_proc_ptr)
15039 {
15040 OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
15041 expressionS *exp = xmalloc (sizeof (expressionS));
15042
15043 obj->size = exp;
15044 exp->X_op = O_subtract;
15045 exp->X_add_symbol = symbol_temp_new_now ();
15046 exp->X_op_symbol = p;
15047 exp->X_add_number = 0;
15048
15049 cur_proc_ptr->func_end_sym = exp->X_add_symbol;
15050 }
15051
ecb4347a 15052 /* Generate a .pdr section. */
f43abd2b 15053 if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
ecb4347a
DJ
15054 {
15055 segT saved_seg = now_seg;
15056 subsegT saved_subseg = now_subseg;
ecb4347a
DJ
15057 expressionS exp;
15058 char *fragp;
252b5132 15059
252b5132 15060#ifdef md_flush_pending_output
ecb4347a 15061 md_flush_pending_output ();
252b5132
RH
15062#endif
15063
9c2799c2 15064 gas_assert (pdr_seg);
ecb4347a 15065 subseg_set (pdr_seg, 0);
252b5132 15066
ecb4347a
DJ
15067 /* Write the symbol. */
15068 exp.X_op = O_symbol;
15069 exp.X_add_symbol = p;
15070 exp.X_add_number = 0;
15071 emit_expr (&exp, 4);
252b5132 15072
ecb4347a 15073 fragp = frag_more (7 * 4);
252b5132 15074
17a2f251
TS
15075 md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
15076 md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
15077 md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
15078 md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
15079 md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
15080 md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
15081 md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
252b5132 15082
ecb4347a
DJ
15083 subseg_set (saved_seg, saved_subseg);
15084 }
15085#endif /* OBJ_ELF */
252b5132
RH
15086
15087 cur_proc_ptr = NULL;
15088}
15089
15090/* The .aent and .ent directives. */
15091
15092static void
17a2f251 15093s_mips_ent (int aent)
252b5132 15094{
252b5132 15095 symbolS *symbolP;
252b5132
RH
15096
15097 symbolP = get_symbol ();
15098 if (*input_line_pointer == ',')
f9419b05 15099 ++input_line_pointer;
252b5132 15100 SKIP_WHITESPACE ();
3882b010 15101 if (ISDIGIT (*input_line_pointer)
d9a62219 15102 || *input_line_pointer == '-')
874e8986 15103 get_number ();
252b5132 15104
14949570 15105 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
252b5132
RH
15106 as_warn (_(".ent or .aent not in text section."));
15107
15108 if (!aent && cur_proc_ptr)
9a41af64 15109 as_warn (_("missing .end"));
252b5132
RH
15110
15111 if (!aent)
15112 {
7a621144
DJ
15113 /* This function needs its own .frame and .cprestore directives. */
15114 mips_frame_reg_valid = 0;
15115 mips_cprestore_valid = 0;
15116
252b5132
RH
15117 cur_proc_ptr = &cur_proc;
15118 memset (cur_proc_ptr, '\0', sizeof (procS));
15119
9b2f1d35 15120 cur_proc_ptr->func_sym = symbolP;
252b5132 15121
f9419b05 15122 ++numprocs;
ecb4347a
DJ
15123
15124 if (debug_type == DEBUG_STABS)
15125 stabs_generate_asm_func (S_GET_NAME (symbolP),
15126 S_GET_NAME (symbolP));
252b5132
RH
15127 }
15128
7c0fc524
MR
15129 symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
15130
252b5132
RH
15131 demand_empty_rest_of_line ();
15132}
15133
15134/* The .frame directive. If the mdebug section is present (IRIX 5 native)
bdaaa2e1 15135 then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
252b5132 15136 s_mips_frame is used so that we can set the PDR information correctly.
bdaaa2e1 15137 We can't use the ecoff routines because they make reference to the ecoff
252b5132
RH
15138 symbol table (in the mdebug section). */
15139
15140static void
17a2f251 15141s_mips_frame (int ignore ATTRIBUTE_UNUSED)
252b5132 15142{
ecb4347a 15143#ifdef OBJ_ELF
f43abd2b 15144 if (IS_ELF && !ECOFF_DEBUGGING)
ecb4347a
DJ
15145 {
15146 long val;
252b5132 15147
ecb4347a
DJ
15148 if (cur_proc_ptr == (procS *) NULL)
15149 {
15150 as_warn (_(".frame outside of .ent"));
15151 demand_empty_rest_of_line ();
15152 return;
15153 }
252b5132 15154
ecb4347a
DJ
15155 cur_proc_ptr->frame_reg = tc_get_register (1);
15156
15157 SKIP_WHITESPACE ();
15158 if (*input_line_pointer++ != ','
15159 || get_absolute_expression_and_terminator (&val) != ',')
15160 {
15161 as_warn (_("Bad .frame directive"));
15162 --input_line_pointer;
15163 demand_empty_rest_of_line ();
15164 return;
15165 }
252b5132 15166
ecb4347a
DJ
15167 cur_proc_ptr->frame_offset = val;
15168 cur_proc_ptr->pc_reg = tc_get_register (0);
252b5132 15169
252b5132 15170 demand_empty_rest_of_line ();
252b5132 15171 }
ecb4347a
DJ
15172 else
15173#endif /* OBJ_ELF */
15174 s_ignore (ignore);
252b5132
RH
15175}
15176
bdaaa2e1
KH
15177/* The .fmask and .mask directives. If the mdebug section is present
15178 (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
252b5132 15179 embedded targets, s_mips_mask is used so that we can set the PDR
bdaaa2e1 15180 information correctly. We can't use the ecoff routines because they
252b5132
RH
15181 make reference to the ecoff symbol table (in the mdebug section). */
15182
15183static void
17a2f251 15184s_mips_mask (int reg_type)
252b5132 15185{
ecb4347a 15186#ifdef OBJ_ELF
f43abd2b 15187 if (IS_ELF && !ECOFF_DEBUGGING)
252b5132 15188 {
ecb4347a 15189 long mask, off;
252b5132 15190
ecb4347a
DJ
15191 if (cur_proc_ptr == (procS *) NULL)
15192 {
15193 as_warn (_(".mask/.fmask outside of .ent"));
15194 demand_empty_rest_of_line ();
15195 return;
15196 }
252b5132 15197
ecb4347a
DJ
15198 if (get_absolute_expression_and_terminator (&mask) != ',')
15199 {
15200 as_warn (_("Bad .mask/.fmask directive"));
15201 --input_line_pointer;
15202 demand_empty_rest_of_line ();
15203 return;
15204 }
252b5132 15205
ecb4347a
DJ
15206 off = get_absolute_expression ();
15207
15208 if (reg_type == 'F')
15209 {
15210 cur_proc_ptr->fpreg_mask = mask;
15211 cur_proc_ptr->fpreg_offset = off;
15212 }
15213 else
15214 {
15215 cur_proc_ptr->reg_mask = mask;
15216 cur_proc_ptr->reg_offset = off;
15217 }
15218
15219 demand_empty_rest_of_line ();
252b5132
RH
15220 }
15221 else
ecb4347a
DJ
15222#endif /* OBJ_ELF */
15223 s_ignore (reg_type);
252b5132
RH
15224}
15225
316f5878
RS
15226/* A table describing all the processors gas knows about. Names are
15227 matched in the order listed.
e7af610e 15228
316f5878
RS
15229 To ease comparison, please keep this table in the same order as
15230 gcc's mips_cpu_info_table[]. */
e972090a
NC
15231static const struct mips_cpu_info mips_cpu_info_table[] =
15232{
316f5878 15233 /* Entries for generic ISAs */
ad3fea08
TS
15234 { "mips1", MIPS_CPU_IS_ISA, ISA_MIPS1, CPU_R3000 },
15235 { "mips2", MIPS_CPU_IS_ISA, ISA_MIPS2, CPU_R6000 },
15236 { "mips3", MIPS_CPU_IS_ISA, ISA_MIPS3, CPU_R4000 },
15237 { "mips4", MIPS_CPU_IS_ISA, ISA_MIPS4, CPU_R8000 },
15238 { "mips5", MIPS_CPU_IS_ISA, ISA_MIPS5, CPU_MIPS5 },
15239 { "mips32", MIPS_CPU_IS_ISA, ISA_MIPS32, CPU_MIPS32 },
15240 { "mips32r2", MIPS_CPU_IS_ISA, ISA_MIPS32R2, CPU_MIPS32R2 },
15241 { "mips64", MIPS_CPU_IS_ISA, ISA_MIPS64, CPU_MIPS64 },
15242 { "mips64r2", MIPS_CPU_IS_ISA, ISA_MIPS64R2, CPU_MIPS64R2 },
316f5878
RS
15243
15244 /* MIPS I */
ad3fea08
TS
15245 { "r3000", 0, ISA_MIPS1, CPU_R3000 },
15246 { "r2000", 0, ISA_MIPS1, CPU_R3000 },
15247 { "r3900", 0, ISA_MIPS1, CPU_R3900 },
316f5878
RS
15248
15249 /* MIPS II */
ad3fea08 15250 { "r6000", 0, ISA_MIPS2, CPU_R6000 },
316f5878
RS
15251
15252 /* MIPS III */
ad3fea08
TS
15253 { "r4000", 0, ISA_MIPS3, CPU_R4000 },
15254 { "r4010", 0, ISA_MIPS2, CPU_R4010 },
15255 { "vr4100", 0, ISA_MIPS3, CPU_VR4100 },
15256 { "vr4111", 0, ISA_MIPS3, CPU_R4111 },
15257 { "vr4120", 0, ISA_MIPS3, CPU_VR4120 },
15258 { "vr4130", 0, ISA_MIPS3, CPU_VR4120 },
15259 { "vr4181", 0, ISA_MIPS3, CPU_R4111 },
15260 { "vr4300", 0, ISA_MIPS3, CPU_R4300 },
15261 { "r4400", 0, ISA_MIPS3, CPU_R4400 },
15262 { "r4600", 0, ISA_MIPS3, CPU_R4600 },
15263 { "orion", 0, ISA_MIPS3, CPU_R4600 },
15264 { "r4650", 0, ISA_MIPS3, CPU_R4650 },
b15591bb
AN
15265 /* ST Microelectronics Loongson 2E and 2F cores */
15266 { "loongson2e", 0, ISA_MIPS3, CPU_LOONGSON_2E },
15267 { "loongson2f", 0, ISA_MIPS3, CPU_LOONGSON_2F },
316f5878
RS
15268
15269 /* MIPS IV */
ad3fea08
TS
15270 { "r8000", 0, ISA_MIPS4, CPU_R8000 },
15271 { "r10000", 0, ISA_MIPS4, CPU_R10000 },
15272 { "r12000", 0, ISA_MIPS4, CPU_R12000 },
3aa3176b
TS
15273 { "r14000", 0, ISA_MIPS4, CPU_R14000 },
15274 { "r16000", 0, ISA_MIPS4, CPU_R16000 },
ad3fea08
TS
15275 { "vr5000", 0, ISA_MIPS4, CPU_R5000 },
15276 { "vr5400", 0, ISA_MIPS4, CPU_VR5400 },
15277 { "vr5500", 0, ISA_MIPS4, CPU_VR5500 },
15278 { "rm5200", 0, ISA_MIPS4, CPU_R5000 },
15279 { "rm5230", 0, ISA_MIPS4, CPU_R5000 },
15280 { "rm5231", 0, ISA_MIPS4, CPU_R5000 },
15281 { "rm5261", 0, ISA_MIPS4, CPU_R5000 },
15282 { "rm5721", 0, ISA_MIPS4, CPU_R5000 },
15283 { "rm7000", 0, ISA_MIPS4, CPU_RM7000 },
15284 { "rm9000", 0, ISA_MIPS4, CPU_RM9000 },
316f5878
RS
15285
15286 /* MIPS 32 */
ad3fea08
TS
15287 { "4kc", 0, ISA_MIPS32, CPU_MIPS32 },
15288 { "4km", 0, ISA_MIPS32, CPU_MIPS32 },
15289 { "4kp", 0, ISA_MIPS32, CPU_MIPS32 },
15290 { "4ksc", MIPS_CPU_ASE_SMARTMIPS, ISA_MIPS32, CPU_MIPS32 },
15291
15292 /* MIPS 32 Release 2 */
15293 { "4kec", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15294 { "4kem", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15295 { "4kep", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15296 { "4ksd", MIPS_CPU_ASE_SMARTMIPS, ISA_MIPS32R2, CPU_MIPS32R2 },
15297 { "m4k", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15298 { "m4kp", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
ad3fea08 15299 { "24kc", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
0fdf1951 15300 { "24kf2_1", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
ad3fea08 15301 { "24kf", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
0fdf1951
RS
15302 { "24kf1_1", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
15303 /* Deprecated forms of the above. */
15304 { "24kfx", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
ad3fea08 15305 { "24kx", 0, ISA_MIPS32R2, CPU_MIPS32R2 },
01fd108f 15306 /* 24KE is a 24K with DSP ASE, other ASEs are optional. */
ad3fea08 15307 { "24kec", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
0fdf1951 15308 { "24kef2_1", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
ad3fea08 15309 { "24kef", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
0fdf1951
RS
15310 { "24kef1_1", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
15311 /* Deprecated forms of the above. */
15312 { "24kefx", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
65263ce3 15313 { "24kex", MIPS_CPU_ASE_DSP, ISA_MIPS32R2, CPU_MIPS32R2 },
01fd108f 15314 /* 34K is a 24K with DSP and MT ASE, other ASEs are optional. */
a360e743
TS
15315 { "34kc", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15316 ISA_MIPS32R2, CPU_MIPS32R2 },
0fdf1951
RS
15317 { "34kf2_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15318 ISA_MIPS32R2, CPU_MIPS32R2 },
a360e743
TS
15319 { "34kf", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15320 ISA_MIPS32R2, CPU_MIPS32R2 },
0fdf1951
RS
15321 { "34kf1_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15322 ISA_MIPS32R2, CPU_MIPS32R2 },
15323 /* Deprecated forms of the above. */
15324 { "34kfx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15325 ISA_MIPS32R2, CPU_MIPS32R2 },
a360e743
TS
15326 { "34kx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15327 ISA_MIPS32R2, CPU_MIPS32R2 },
01fd108f
TS
15328 /* 74K with DSP and DSPR2 ASE, other ASEs are optional. */
15329 { "74kc", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15330 ISA_MIPS32R2, CPU_MIPS32R2 },
0fdf1951
RS
15331 { "74kf2_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15332 ISA_MIPS32R2, CPU_MIPS32R2 },
01fd108f
TS
15333 { "74kf", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15334 ISA_MIPS32R2, CPU_MIPS32R2 },
0fdf1951
RS
15335 { "74kf1_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15336 ISA_MIPS32R2, CPU_MIPS32R2 },
15337 { "74kf3_2", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15338 ISA_MIPS32R2, CPU_MIPS32R2 },
15339 /* Deprecated forms of the above. */
15340 { "74kfx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15341 ISA_MIPS32R2, CPU_MIPS32R2 },
01fd108f
TS
15342 { "74kx", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15343 ISA_MIPS32R2, CPU_MIPS32R2 },
30f8113a
SL
15344 /* 1004K cores are multiprocessor versions of the 34K. */
15345 { "1004kc", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15346 ISA_MIPS32R2, CPU_MIPS32R2 },
15347 { "1004kf2_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15348 ISA_MIPS32R2, CPU_MIPS32R2 },
15349 { "1004kf", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15350 ISA_MIPS32R2, CPU_MIPS32R2 },
15351 { "1004kf1_1", MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15352 ISA_MIPS32R2, CPU_MIPS32R2 },
32b26a03 15353
316f5878 15354 /* MIPS 64 */
ad3fea08
TS
15355 { "5kc", 0, ISA_MIPS64, CPU_MIPS64 },
15356 { "5kf", 0, ISA_MIPS64, CPU_MIPS64 },
15357 { "20kc", MIPS_CPU_ASE_MIPS3D, ISA_MIPS64, CPU_MIPS64 },
7764b395 15358 { "25kf", MIPS_CPU_ASE_MIPS3D, ISA_MIPS64, CPU_MIPS64 },
ad3fea08 15359
c7a23324 15360 /* Broadcom SB-1 CPU core */
65263ce3
TS
15361 { "sb1", MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15362 ISA_MIPS64, CPU_SB1 },
1e85aad8
JW
15363 /* Broadcom SB-1A CPU core */
15364 { "sb1a", MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15365 ISA_MIPS64, CPU_SB1 },
d051516a
NC
15366
15367 { "loongson3a", 0, ISA_MIPS64, CPU_LOONGSON_3A },
e7af610e 15368
ed163775
MR
15369 /* MIPS 64 Release 2 */
15370
967344c6
AN
15371 /* Cavium Networks Octeon CPU core */
15372 { "octeon", 0, ISA_MIPS64R2, CPU_OCTEON },
15373
52b6b6b9
JM
15374 /* RMI Xlr */
15375 { "xlr", 0, ISA_MIPS64, CPU_XLR },
15376
316f5878
RS
15377 /* End marker */
15378 { NULL, 0, 0, 0 }
15379};
e7af610e 15380
84ea6cf2 15381
316f5878
RS
15382/* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
15383 with a final "000" replaced by "k". Ignore case.
e7af610e 15384
316f5878 15385 Note: this function is shared between GCC and GAS. */
c6c98b38 15386
b34976b6 15387static bfd_boolean
17a2f251 15388mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
316f5878
RS
15389{
15390 while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
15391 given++, canonical++;
15392
15393 return ((*given == 0 && *canonical == 0)
15394 || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
15395}
15396
15397
15398/* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
15399 CPU name. We've traditionally allowed a lot of variation here.
15400
15401 Note: this function is shared between GCC and GAS. */
15402
b34976b6 15403static bfd_boolean
17a2f251 15404mips_matching_cpu_name_p (const char *canonical, const char *given)
316f5878
RS
15405{
15406 /* First see if the name matches exactly, or with a final "000"
15407 turned into "k". */
15408 if (mips_strict_matching_cpu_name_p (canonical, given))
b34976b6 15409 return TRUE;
316f5878
RS
15410
15411 /* If not, try comparing based on numerical designation alone.
15412 See if GIVEN is an unadorned number, or 'r' followed by a number. */
15413 if (TOLOWER (*given) == 'r')
15414 given++;
15415 if (!ISDIGIT (*given))
b34976b6 15416 return FALSE;
316f5878
RS
15417
15418 /* Skip over some well-known prefixes in the canonical name,
15419 hoping to find a number there too. */
15420 if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
15421 canonical += 2;
15422 else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
15423 canonical += 2;
15424 else if (TOLOWER (canonical[0]) == 'r')
15425 canonical += 1;
15426
15427 return mips_strict_matching_cpu_name_p (canonical, given);
15428}
15429
15430
15431/* Parse an option that takes the name of a processor as its argument.
15432 OPTION is the name of the option and CPU_STRING is the argument.
15433 Return the corresponding processor enumeration if the CPU_STRING is
15434 recognized, otherwise report an error and return null.
15435
15436 A similar function exists in GCC. */
e7af610e
NC
15437
15438static const struct mips_cpu_info *
17a2f251 15439mips_parse_cpu (const char *option, const char *cpu_string)
e7af610e 15440{
316f5878 15441 const struct mips_cpu_info *p;
e7af610e 15442
316f5878
RS
15443 /* 'from-abi' selects the most compatible architecture for the given
15444 ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs. For the
15445 EABIs, we have to decide whether we're using the 32-bit or 64-bit
15446 version. Look first at the -mgp options, if given, otherwise base
15447 the choice on MIPS_DEFAULT_64BIT.
e7af610e 15448
316f5878
RS
15449 Treat NO_ABI like the EABIs. One reason to do this is that the
15450 plain 'mips' and 'mips64' configs have 'from-abi' as their default
15451 architecture. This code picks MIPS I for 'mips' and MIPS III for
15452 'mips64', just as we did in the days before 'from-abi'. */
15453 if (strcasecmp (cpu_string, "from-abi") == 0)
15454 {
15455 if (ABI_NEEDS_32BIT_REGS (mips_abi))
15456 return mips_cpu_info_from_isa (ISA_MIPS1);
15457
15458 if (ABI_NEEDS_64BIT_REGS (mips_abi))
15459 return mips_cpu_info_from_isa (ISA_MIPS3);
15460
15461 if (file_mips_gp32 >= 0)
15462 return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
15463
15464 return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
15465 ? ISA_MIPS3
15466 : ISA_MIPS1);
15467 }
15468
15469 /* 'default' has traditionally been a no-op. Probably not very useful. */
15470 if (strcasecmp (cpu_string, "default") == 0)
15471 return 0;
15472
15473 for (p = mips_cpu_info_table; p->name != 0; p++)
15474 if (mips_matching_cpu_name_p (p->name, cpu_string))
15475 return p;
15476
20203fb9 15477 as_bad (_("Bad value (%s) for %s"), cpu_string, option);
316f5878 15478 return 0;
e7af610e
NC
15479}
15480
316f5878
RS
15481/* Return the canonical processor information for ISA (a member of the
15482 ISA_MIPS* enumeration). */
15483
e7af610e 15484static const struct mips_cpu_info *
17a2f251 15485mips_cpu_info_from_isa (int isa)
e7af610e
NC
15486{
15487 int i;
15488
15489 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
ad3fea08 15490 if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
316f5878 15491 && isa == mips_cpu_info_table[i].isa)
e7af610e
NC
15492 return (&mips_cpu_info_table[i]);
15493
e972090a 15494 return NULL;
e7af610e 15495}
fef14a42
TS
15496
15497static const struct mips_cpu_info *
17a2f251 15498mips_cpu_info_from_arch (int arch)
fef14a42
TS
15499{
15500 int i;
15501
15502 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15503 if (arch == mips_cpu_info_table[i].cpu)
15504 return (&mips_cpu_info_table[i]);
15505
15506 return NULL;
15507}
316f5878
RS
15508\f
15509static void
17a2f251 15510show (FILE *stream, const char *string, int *col_p, int *first_p)
316f5878
RS
15511{
15512 if (*first_p)
15513 {
15514 fprintf (stream, "%24s", "");
15515 *col_p = 24;
15516 }
15517 else
15518 {
15519 fprintf (stream, ", ");
15520 *col_p += 2;
15521 }
e7af610e 15522
316f5878
RS
15523 if (*col_p + strlen (string) > 72)
15524 {
15525 fprintf (stream, "\n%24s", "");
15526 *col_p = 24;
15527 }
15528
15529 fprintf (stream, "%s", string);
15530 *col_p += strlen (string);
15531
15532 *first_p = 0;
15533}
15534
15535void
17a2f251 15536md_show_usage (FILE *stream)
e7af610e 15537{
316f5878
RS
15538 int column, first;
15539 size_t i;
15540
15541 fprintf (stream, _("\
15542MIPS options:\n\
316f5878
RS
15543-EB generate big endian output\n\
15544-EL generate little endian output\n\
15545-g, -g2 do not remove unneeded NOPs or swap branches\n\
15546-G NUM allow referencing objects up to NUM bytes\n\
15547 implicitly with the gp register [default 8]\n"));
15548 fprintf (stream, _("\
15549-mips1 generate MIPS ISA I instructions\n\
15550-mips2 generate MIPS ISA II instructions\n\
15551-mips3 generate MIPS ISA III instructions\n\
15552-mips4 generate MIPS ISA IV instructions\n\
15553-mips5 generate MIPS ISA V instructions\n\
15554-mips32 generate MIPS32 ISA instructions\n\
af7ee8bf 15555-mips32r2 generate MIPS32 release 2 ISA instructions\n\
316f5878 15556-mips64 generate MIPS64 ISA instructions\n\
5f74bc13 15557-mips64r2 generate MIPS64 release 2 ISA instructions\n\
316f5878
RS
15558-march=CPU/-mtune=CPU generate code/schedule for CPU, where CPU is one of:\n"));
15559
15560 first = 1;
e7af610e
NC
15561
15562 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
316f5878
RS
15563 show (stream, mips_cpu_info_table[i].name, &column, &first);
15564 show (stream, "from-abi", &column, &first);
15565 fputc ('\n', stream);
e7af610e 15566
316f5878
RS
15567 fprintf (stream, _("\
15568-mCPU equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
15569-no-mCPU don't generate code specific to CPU.\n\
15570 For -mCPU and -no-mCPU, CPU must be one of:\n"));
15571
15572 first = 1;
15573
15574 show (stream, "3900", &column, &first);
15575 show (stream, "4010", &column, &first);
15576 show (stream, "4100", &column, &first);
15577 show (stream, "4650", &column, &first);
15578 fputc ('\n', stream);
15579
15580 fprintf (stream, _("\
15581-mips16 generate mips16 instructions\n\
15582-no-mips16 do not generate mips16 instructions\n"));
15583 fprintf (stream, _("\
e16bfa71
TS
15584-msmartmips generate smartmips instructions\n\
15585-mno-smartmips do not generate smartmips instructions\n"));
15586 fprintf (stream, _("\
74cd071d
CF
15587-mdsp generate DSP instructions\n\
15588-mno-dsp do not generate DSP instructions\n"));
15589 fprintf (stream, _("\
8b082fb1
TS
15590-mdspr2 generate DSP R2 instructions\n\
15591-mno-dspr2 do not generate DSP R2 instructions\n"));
15592 fprintf (stream, _("\
ef2e4d86
CF
15593-mmt generate MT instructions\n\
15594-mno-mt do not generate MT instructions\n"));
15595 fprintf (stream, _("\
c67a084a
NC
15596-mfix-loongson2f-jump work around Loongson2F JUMP instructions\n\
15597-mfix-loongson2f-nop work around Loongson2F NOP errata\n\
d766e8ec 15598-mfix-vr4120 work around certain VR4120 errata\n\
7d8e00cf 15599-mfix-vr4130 work around VR4130 mflo/mfhi errata\n\
6a32d874 15600-mfix-24k insert a nop after ERET and DERET instructions\n\
d954098f 15601-mfix-cn63xxp1 work around CN63XXP1 PREF errata\n\
316f5878
RS
15602-mgp32 use 32-bit GPRs, regardless of the chosen ISA\n\
15603-mfp32 use 32-bit FPRs, regardless of the chosen ISA\n\
aed1a261 15604-msym32 assume all symbols have 32-bit values\n\
316f5878
RS
15605-O0 remove unneeded NOPs, do not swap branches\n\
15606-O remove unneeded NOPs and swap branches\n\
316f5878
RS
15607--trap, --no-break trap exception on div by 0 and mult overflow\n\
15608--break, --no-trap break exception on div by 0 and mult overflow\n"));
037b32b9
AN
15609 fprintf (stream, _("\
15610-mhard-float allow floating-point instructions\n\
15611-msoft-float do not allow floating-point instructions\n\
15612-msingle-float only allow 32-bit floating-point operations\n\
15613-mdouble-float allow 32-bit and 64-bit floating-point operations\n\
15614--[no-]construct-floats [dis]allow floating point values to be constructed\n"
15615 ));
316f5878
RS
15616#ifdef OBJ_ELF
15617 fprintf (stream, _("\
15618-KPIC, -call_shared generate SVR4 position independent code\n\
861fb55a 15619-call_nonpic generate non-PIC code that can operate with DSOs\n\
0c000745 15620-mvxworks-pic generate VxWorks position independent code\n\
861fb55a 15621-non_shared do not generate code that can operate with DSOs\n\
316f5878 15622-xgot assume a 32 bit GOT\n\
dcd410fe 15623-mpdr, -mno-pdr enable/disable creation of .pdr sections\n\
bbe506e8 15624-mshared, -mno-shared disable/enable .cpload optimization for\n\
d821e36b 15625 position dependent (non shared) code\n\
316f5878
RS
15626-mabi=ABI create ABI conformant object file for:\n"));
15627
15628 first = 1;
15629
15630 show (stream, "32", &column, &first);
15631 show (stream, "o64", &column, &first);
15632 show (stream, "n32", &column, &first);
15633 show (stream, "64", &column, &first);
15634 show (stream, "eabi", &column, &first);
15635
15636 fputc ('\n', stream);
15637
15638 fprintf (stream, _("\
15639-32 create o32 ABI object file (default)\n\
15640-n32 create n32 ABI object file\n\
15641-64 create 64 ABI object file\n"));
15642#endif
e7af610e 15643}
14e777e0 15644
1575952e 15645#ifdef TE_IRIX
14e777e0 15646enum dwarf2_format
413a266c 15647mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
14e777e0 15648{
369943fe 15649 if (HAVE_64BIT_SYMBOLS)
1575952e 15650 return dwarf2_format_64bit_irix;
14e777e0
KB
15651 else
15652 return dwarf2_format_32bit;
15653}
1575952e 15654#endif
73369e65
EC
15655
15656int
15657mips_dwarf2_addr_size (void)
15658{
6b6b3450 15659 if (HAVE_64BIT_OBJECTS)
73369e65 15660 return 8;
73369e65
EC
15661 else
15662 return 4;
15663}
5862107c
EC
15664
15665/* Standard calling conventions leave the CFA at SP on entry. */
15666void
15667mips_cfi_frame_initial_instructions (void)
15668{
15669 cfi_add_CFA_def_cfa_register (SP);
15670}
15671
707bfff6
TS
15672int
15673tc_mips_regname_to_dw2regnum (char *regname)
15674{
15675 unsigned int regnum = -1;
15676 unsigned int reg;
15677
15678 if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
15679 regnum = reg;
15680
15681 return regnum;
15682}
This page took 2.492538 seconds and 4 git commands to generate.