gas/
[deliverable/binutils-gdb.git] / gas / config / tc-mips.c
CommitLineData
252b5132 1/* tc-mips.c -- assemble code for a MIPS chip.
071742cf 2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
82efde3a 3 Free Software Foundation, Inc.
252b5132
RH
4 Contributed by the OSF and Ralph Campbell.
5 Written by Keith Knowles and Ralph Campbell, working independently.
6 Modified for ECOFF and R4000 support by Ian Lance Taylor of Cygnus
7 Support.
8
9 This file is part of GAS.
10
11 GAS is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 2, or (at your option)
14 any later version.
15
16 GAS is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with GAS; see the file COPYING. If not, write to the Free
23 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
24 02111-1307, USA. */
25
26#include "as.h"
27#include "config.h"
28#include "subsegs.h"
3882b010 29#include "safe-ctype.h"
252b5132
RH
30
31#ifdef USE_STDARG
32#include <stdarg.h>
33#endif
34#ifdef USE_VARARGS
35#include <varargs.h>
36#endif
37
38#include "opcode/mips.h"
39#include "itbl-ops.h"
c5dd6aab 40#include "dwarf2dbg.h"
252b5132
RH
41
42#ifdef DEBUG
43#define DBG(x) printf x
44#else
45#define DBG(x)
46#endif
47
48#ifdef OBJ_MAYBE_ELF
49/* Clean up namespace so we can include obj-elf.h too. */
50static int mips_output_flavor PARAMS ((void));
51static int mips_output_flavor () { return OUTPUT_FLAVOR; }
52#undef OBJ_PROCESS_STAB
53#undef OUTPUT_FLAVOR
54#undef S_GET_ALIGN
55#undef S_GET_SIZE
56#undef S_SET_ALIGN
57#undef S_SET_SIZE
252b5132
RH
58#undef obj_frob_file
59#undef obj_frob_file_after_relocs
60#undef obj_frob_symbol
61#undef obj_pop_insert
62#undef obj_sec_sym_ok_for_reloc
63#undef OBJ_COPY_SYMBOL_ATTRIBUTES
64
65#include "obj-elf.h"
66/* Fix any of them that we actually care about. */
67#undef OUTPUT_FLAVOR
68#define OUTPUT_FLAVOR mips_output_flavor()
69#endif
70
71#if defined (OBJ_ELF)
72#include "elf/mips.h"
73#endif
74
75#ifndef ECOFF_DEBUGGING
76#define NO_ECOFF_DEBUGGING
77#define ECOFF_DEBUGGING 0
78#endif
79
ecb4347a
DJ
80int mips_flag_mdebug = -1;
81
252b5132
RH
82#include "ecoff.h"
83
84#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
85static char *mips_regmask_frag;
86#endif
87
85b51719 88#define ZERO 0
252b5132
RH
89#define AT 1
90#define TREG 24
91#define PIC_CALL_REG 25
92#define KT0 26
93#define KT1 27
94#define GP 28
95#define SP 29
96#define FP 30
97#define RA 31
98
99#define ILLEGAL_REG (32)
100
101/* Allow override of standard little-endian ECOFF format. */
102
103#ifndef ECOFF_LITTLE_FORMAT
104#define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
105#endif
106
107extern int target_big_endian;
108
252b5132
RH
109/* The name of the readonly data section. */
110#define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_aout_flavour \
111 ? ".data" \
112 : OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
113 ? ".rdata" \
056350c6
NC
114 : OUTPUT_FLAVOR == bfd_target_coff_flavour \
115 ? ".rdata" \
252b5132
RH
116 : OUTPUT_FLAVOR == bfd_target_elf_flavour \
117 ? ".rodata" \
118 : (abort (), ""))
119
a325df1d
TS
120/* The ABI to use. */
121enum mips_abi_level
122{
123 NO_ABI = 0,
124 O32_ABI,
125 O64_ABI,
126 N32_ABI,
127 N64_ABI,
128 EABI_ABI
129};
130
131/* MIPS ABI we are using for this output file. */
316f5878 132static enum mips_abi_level mips_abi = NO_ABI;
a325df1d 133
252b5132
RH
134/* This is the set of options which may be modified by the .set
135 pseudo-op. We use a struct so that .set push and .set pop are more
136 reliable. */
137
e972090a
NC
138struct mips_set_options
139{
252b5132
RH
140 /* MIPS ISA (Instruction Set Architecture) level. This is set to -1
141 if it has not been initialized. Changed by `.set mipsN', and the
142 -mipsN command line option, and the default CPU. */
143 int isa;
1f25f5d3
CD
144 /* Enabled Application Specific Extensions (ASEs). These are set to -1
145 if they have not been initialized. Changed by `.set <asename>', by
146 command line options, and based on the default architecture. */
147 int ase_mips3d;
deec1734 148 int ase_mdmx;
252b5132
RH
149 /* Whether we are assembling for the mips16 processor. 0 if we are
150 not, 1 if we are, and -1 if the value has not been initialized.
151 Changed by `.set mips16' and `.set nomips16', and the -mips16 and
152 -nomips16 command line options, and the default CPU. */
153 int mips16;
154 /* Non-zero if we should not reorder instructions. Changed by `.set
155 reorder' and `.set noreorder'. */
156 int noreorder;
157 /* Non-zero if we should not permit the $at ($1) register to be used
158 in instructions. Changed by `.set at' and `.set noat'. */
159 int noat;
160 /* Non-zero if we should warn when a macro instruction expands into
161 more than one machine instruction. Changed by `.set nomacro' and
162 `.set macro'. */
163 int warn_about_macros;
164 /* Non-zero if we should not move instructions. Changed by `.set
165 move', `.set volatile', `.set nomove', and `.set novolatile'. */
166 int nomove;
167 /* Non-zero if we should not optimize branches by moving the target
168 of the branch into the delay slot. Actually, we don't perform
169 this optimization anyhow. Changed by `.set bopt' and `.set
170 nobopt'. */
171 int nobopt;
172 /* Non-zero if we should not autoextend mips16 instructions.
173 Changed by `.set autoextend' and `.set noautoextend'. */
174 int noautoextend;
a325df1d
TS
175 /* Restrict general purpose registers and floating point registers
176 to 32 bit. This is initially determined when -mgp32 or -mfp32
177 is passed but can changed if the assembler code uses .set mipsN. */
178 int gp32;
179 int fp32;
252b5132
RH
180};
181
a325df1d 182/* True if -mgp32 was passed. */
a8e8e863 183static int file_mips_gp32 = -1;
a325df1d
TS
184
185/* True if -mfp32 was passed. */
a8e8e863 186static int file_mips_fp32 = -1;
a325df1d 187
252b5132 188/* This is the struct we use to hold the current set of options. Note
a4672219 189 that we must set the isa field to ISA_UNKNOWN and the ASE fields to
e7af610e 190 -1 to indicate that they have not been initialized. */
252b5132 191
e972090a
NC
192static struct mips_set_options mips_opts =
193{
316f5878 194 ISA_UNKNOWN, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0
e7af610e 195};
252b5132
RH
196
197/* These variables are filled in with the masks of registers used.
198 The object format code reads them and puts them in the appropriate
199 place. */
200unsigned long mips_gprmask;
201unsigned long mips_cprmask[4];
202
203/* MIPS ISA we are using for this output file. */
e7af610e 204static int file_mips_isa = ISA_UNKNOWN;
252b5132 205
a4672219
TS
206/* True if -mips16 was passed or implied by arguments passed on the
207 command line (e.g., by -march). */
208static int file_ase_mips16;
209
1f25f5d3
CD
210/* True if -mips3d was passed or implied by arguments passed on the
211 command line (e.g., by -march). */
212static int file_ase_mips3d;
213
deec1734
CD
214/* True if -mdmx was passed or implied by arguments passed on the
215 command line (e.g., by -march). */
216static int file_ase_mdmx;
217
ec68c924
EC
218/* The argument of the -march= flag. The architecture we are assembling. */
219static int mips_arch = CPU_UNKNOWN;
316f5878
RS
220static const char *mips_arch_string;
221static const struct mips_cpu_info *mips_arch_info;
ec68c924
EC
222
223/* The argument of the -mtune= flag. The architecture for which we
224 are optimizing. */
225static int mips_tune = CPU_UNKNOWN;
316f5878
RS
226static const char *mips_tune_string;
227static const struct mips_cpu_info *mips_tune_info;
ec68c924 228
316f5878 229/* True when generating 32-bit code for a 64-bit processor. */
252b5132
RH
230static int mips_32bitmode = 0;
231
9ce8a5dd
GRK
232/* Some ISA's have delay slots for instructions which read or write
233 from a coprocessor (eg. mips1-mips3); some don't (eg mips4).
bdaaa2e1 234 Return true if instructions marked INSN_LOAD_COPROC_DELAY,
9ce8a5dd
GRK
235 INSN_COPROC_MOVE_DELAY, or INSN_WRITE_COND_CODE actually have a
236 delay slot in this ISA. The uses of this macro assume that any
237 ISA that has delay slots for one of these, has them for all. They
238 also assume that ISAs which don't have delays for these insns, don't
bdaaa2e1 239 have delays for the INSN_LOAD_MEMORY_DELAY instructions either. */
9ce8a5dd 240#define ISA_HAS_COPROC_DELAYS(ISA) ( \
e7af610e
NC
241 (ISA) == ISA_MIPS1 \
242 || (ISA) == ISA_MIPS2 \
243 || (ISA) == ISA_MIPS3 \
9ce8a5dd
GRK
244 )
245
316f5878
RS
246/* True if the given ABI requires 32-bit registers. */
247#define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
248
249/* Likewise 64-bit registers. */
250#define ABI_NEEDS_64BIT_REGS(ABI) \
251 ((ABI) == N32_ABI \
252 || (ABI) == N64_ABI \
253 || (ABI) == O64_ABI)
254
bdaaa2e1 255/* Return true if ISA supports 64 bit gp register instructions. */
9ce8a5dd 256#define ISA_HAS_64BIT_REGS(ISA) ( \
e7af610e
NC
257 (ISA) == ISA_MIPS3 \
258 || (ISA) == ISA_MIPS4 \
84ea6cf2 259 || (ISA) == ISA_MIPS5 \
d1cf510e 260 || (ISA) == ISA_MIPS64 \
9ce8a5dd
GRK
261 )
262
af7ee8bf
CD
263/* Return true if ISA supports 64-bit right rotate (dror et al.)
264 instructions. */
265#define ISA_HAS_DROR(ISA) ( \
266 0 \
267 )
268
269/* Return true if ISA supports 32-bit right rotate (ror et al.)
270 instructions. */
271#define ISA_HAS_ROR(ISA) ( \
272 (ISA) == ISA_MIPS32R2 \
273 )
274
e013f690 275#define HAVE_32BIT_GPRS \
316f5878 276 (mips_opts.gp32 || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
ca4e0257 277
e013f690 278#define HAVE_32BIT_FPRS \
316f5878 279 (mips_opts.fp32 || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
ca4e0257
RS
280
281#define HAVE_64BIT_GPRS (! HAVE_32BIT_GPRS)
282#define HAVE_64BIT_FPRS (! HAVE_32BIT_FPRS)
283
316f5878 284#define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
e013f690 285
316f5878 286#define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
e013f690
TS
287
288/* We can only have 64bit addresses if the object file format
289 supports it. */
afdbd6d0
CD
290#define HAVE_32BIT_ADDRESSES \
291 (HAVE_32BIT_GPRS \
292 || ((bfd_arch_bits_per_address (stdoutput) == 32 \
293 || ! HAVE_64BIT_OBJECTS) \
294 && mips_pic != EMBEDDED_PIC))
e013f690
TS
295
296#define HAVE_64BIT_ADDRESSES (! HAVE_32BIT_ADDRESSES)
ca4e0257 297
a4672219 298/* Return true if the given CPU supports the MIPS16 ASE. */
3396de36
TS
299#define CPU_HAS_MIPS16(cpu) \
300 (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0 \
301 || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
a4672219 302
1f25f5d3
CD
303/* Return true if the given CPU supports the MIPS3D ASE. */
304#define CPU_HAS_MIPS3D(cpu) ((cpu) == CPU_SB1 \
305 )
306
deec1734 307/* Return true if the given CPU supports the MDMX ASE. */
b34976b6 308#define CPU_HAS_MDMX(cpu) (FALSE \
deec1734
CD
309 )
310
60b63b72
RS
311/* True if CPU has a dror instruction. */
312#define CPU_HAS_DROR(CPU) ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
313
314/* True if CPU has a ror instruction. */
315#define CPU_HAS_ROR(CPU) CPU_HAS_DROR (CPU)
316
bdaaa2e1 317/* Whether the processor uses hardware interlocks to protect
252b5132 318 reads from the HI and LO registers, and thus does not
ec68c924 319 require nops to be inserted. */
252b5132 320
ec68c924 321#define hilo_interlocks (mips_arch == CPU_R4010 \
60b63b72 322 || mips_arch == CPU_VR5500 \
0a758a12 323 || mips_arch == CPU_SB1 \
252b5132
RH
324 )
325
326/* Whether the processor uses hardware interlocks to protect reads
327 from the GPRs, and thus does not require nops to be inserted. */
328#define gpr_interlocks \
e7af610e 329 (mips_opts.isa != ISA_MIPS1 \
60b63b72
RS
330 || mips_arch == CPU_VR5400 \
331 || mips_arch == CPU_VR5500 \
ec68c924 332 || mips_arch == CPU_R3900)
252b5132
RH
333
334/* As with other "interlocks" this is used by hardware that has FP
335 (co-processor) interlocks. */
bdaaa2e1 336/* Itbl support may require additional care here. */
ec68c924 337#define cop_interlocks (mips_arch == CPU_R4300 \
60b63b72
RS
338 || mips_arch == CPU_VR5400 \
339 || mips_arch == CPU_VR5500 \
0a758a12 340 || mips_arch == CPU_SB1 \
252b5132
RH
341 )
342
6b76fefe
CM
343/* Is this a mfhi or mflo instruction? */
344#define MF_HILO_INSN(PINFO) \
345 ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
346
252b5132
RH
347/* MIPS PIC level. */
348
a161fe53 349enum mips_pic_level mips_pic;
252b5132 350
39c0a331
L
351/* Warn about all NOPS that the assembler generates. */
352static int warn_nops = 0;
353
c9914766 354/* 1 if we should generate 32 bit offsets from the $gp register in
252b5132 355 SVR4_PIC mode. Currently has no meaning in other modes. */
c9914766 356static int mips_big_got = 0;
252b5132
RH
357
358/* 1 if trap instructions should used for overflow rather than break
359 instructions. */
c9914766 360static int mips_trap = 0;
252b5132 361
119d663a 362/* 1 if double width floating point constants should not be constructed
b6ff326e 363 by assembling two single width halves into two single width floating
119d663a
NC
364 point registers which just happen to alias the double width destination
365 register. On some architectures this aliasing can be disabled by a bit
d547a75e 366 in the status register, and the setting of this bit cannot be determined
119d663a
NC
367 automatically at assemble time. */
368static int mips_disable_float_construction;
369
252b5132
RH
370/* Non-zero if any .set noreorder directives were used. */
371
372static int mips_any_noreorder;
373
6b76fefe
CM
374/* Non-zero if nops should be inserted when the register referenced in
375 an mfhi/mflo instruction is read in the next two instructions. */
376static int mips_7000_hilo_fix;
377
252b5132 378/* The size of the small data section. */
156c2f8b 379static unsigned int g_switch_value = 8;
252b5132
RH
380/* Whether the -G option was used. */
381static int g_switch_seen = 0;
382
383#define N_RMASK 0xc4
384#define N_VFP 0xd4
385
386/* If we can determine in advance that GP optimization won't be
387 possible, we can skip the relaxation stuff that tries to produce
388 GP-relative references. This makes delay slot optimization work
389 better.
390
391 This function can only provide a guess, but it seems to work for
fba2b7f9
GK
392 gcc output. It needs to guess right for gcc, otherwise gcc
393 will put what it thinks is a GP-relative instruction in a branch
394 delay slot.
252b5132
RH
395
396 I don't know if a fix is needed for the SVR4_PIC mode. I've only
397 fixed it for the non-PIC mode. KR 95/04/07 */
398static int nopic_need_relax PARAMS ((symbolS *, int));
399
400/* handle of the OPCODE hash table */
401static struct hash_control *op_hash = NULL;
402
403/* The opcode hash table we use for the mips16. */
404static struct hash_control *mips16_op_hash = NULL;
405
406/* This array holds the chars that always start a comment. If the
407 pre-processor is disabled, these aren't very useful */
408const char comment_chars[] = "#";
409
410/* This array holds the chars that only start a comment at the beginning of
411 a line. If the line seems to have the form '# 123 filename'
412 .line and .file directives will appear in the pre-processed output */
413/* Note that input_file.c hand checks for '#' at the beginning of the
414 first line of the input file. This is because the compiler outputs
bdaaa2e1 415 #NO_APP at the beginning of its output. */
252b5132
RH
416/* Also note that C style comments are always supported. */
417const char line_comment_chars[] = "#";
418
bdaaa2e1 419/* This array holds machine specific line separator characters. */
63a0b638 420const char line_separator_chars[] = ";";
252b5132
RH
421
422/* Chars that can be used to separate mant from exp in floating point nums */
423const char EXP_CHARS[] = "eE";
424
425/* Chars that mean this number is a floating point constant */
426/* As in 0f12.456 */
427/* or 0d1.2345e12 */
428const char FLT_CHARS[] = "rRsSfFdDxXpP";
429
430/* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
431 changed in read.c . Ideally it shouldn't have to know about it at all,
432 but nothing is ideal around here.
433 */
434
435static char *insn_error;
436
437static int auto_align = 1;
438
439/* When outputting SVR4 PIC code, the assembler needs to know the
440 offset in the stack frame from which to restore the $gp register.
441 This is set by the .cprestore pseudo-op, and saved in this
442 variable. */
443static offsetT mips_cprestore_offset = -1;
444
6478892d
TS
445/* Similiar for NewABI PIC code, where $gp is callee-saved. NewABI has some
446 more optimizations, it can use a register value instead of a memory-saved
956cd1d6 447 offset and even an other register than $gp as global pointer. */
6478892d
TS
448static offsetT mips_cpreturn_offset = -1;
449static int mips_cpreturn_register = -1;
450static int mips_gp_register = GP;
def2e0dd 451static int mips_gprel_offset = 0;
6478892d 452
7a621144
DJ
453/* Whether mips_cprestore_offset has been set in the current function
454 (or whether it has already been warned about, if not). */
455static int mips_cprestore_valid = 0;
456
252b5132
RH
457/* This is the register which holds the stack frame, as set by the
458 .frame pseudo-op. This is needed to implement .cprestore. */
459static int mips_frame_reg = SP;
460
7a621144
DJ
461/* Whether mips_frame_reg has been set in the current function
462 (or whether it has already been warned about, if not). */
463static int mips_frame_reg_valid = 0;
464
252b5132
RH
465/* To output NOP instructions correctly, we need to keep information
466 about the previous two instructions. */
467
468/* Whether we are optimizing. The default value of 2 means to remove
469 unneeded NOPs and swap branch instructions when possible. A value
470 of 1 means to not swap branches. A value of 0 means to always
471 insert NOPs. */
472static int mips_optimize = 2;
473
474/* Debugging level. -g sets this to 2. -gN sets this to N. -g0 is
475 equivalent to seeing no -g option at all. */
476static int mips_debug = 0;
477
478/* The previous instruction. */
479static struct mips_cl_insn prev_insn;
480
481/* The instruction before prev_insn. */
482static struct mips_cl_insn prev_prev_insn;
483
484/* If we don't want information for prev_insn or prev_prev_insn, we
485 point the insn_mo field at this dummy integer. */
43841e91 486static const struct mips_opcode dummy_opcode = { NULL, NULL, 0, 0, 0, 0 };
252b5132
RH
487
488/* Non-zero if prev_insn is valid. */
489static int prev_insn_valid;
490
491/* The frag for the previous instruction. */
492static struct frag *prev_insn_frag;
493
494/* The offset into prev_insn_frag for the previous instruction. */
495static long prev_insn_where;
496
497/* The reloc type for the previous instruction, if any. */
f6688943 498static bfd_reloc_code_real_type prev_insn_reloc_type[3];
252b5132
RH
499
500/* The reloc for the previous instruction, if any. */
f6688943 501static fixS *prev_insn_fixp[3];
252b5132
RH
502
503/* Non-zero if the previous instruction was in a delay slot. */
504static int prev_insn_is_delay_slot;
505
506/* Non-zero if the previous instruction was in a .set noreorder. */
507static int prev_insn_unreordered;
508
509/* Non-zero if the previous instruction uses an extend opcode (if
510 mips16). */
511static int prev_insn_extended;
512
513/* Non-zero if the previous previous instruction was in a .set
514 noreorder. */
515static int prev_prev_insn_unreordered;
516
517/* If this is set, it points to a frag holding nop instructions which
518 were inserted before the start of a noreorder section. If those
519 nops turn out to be unnecessary, the size of the frag can be
520 decreased. */
521static fragS *prev_nop_frag;
522
523/* The number of nop instructions we created in prev_nop_frag. */
524static int prev_nop_frag_holds;
525
526/* The number of nop instructions that we know we need in
bdaaa2e1 527 prev_nop_frag. */
252b5132
RH
528static int prev_nop_frag_required;
529
530/* The number of instructions we've seen since prev_nop_frag. */
531static int prev_nop_frag_since;
532
533/* For ECOFF and ELF, relocations against symbols are done in two
534 parts, with a HI relocation and a LO relocation. Each relocation
535 has only 16 bits of space to store an addend. This means that in
536 order for the linker to handle carries correctly, it must be able
537 to locate both the HI and the LO relocation. This means that the
538 relocations must appear in order in the relocation table.
539
540 In order to implement this, we keep track of each unmatched HI
541 relocation. We then sort them so that they immediately precede the
bdaaa2e1 542 corresponding LO relocation. */
252b5132 543
e972090a
NC
544struct mips_hi_fixup
545{
252b5132
RH
546 /* Next HI fixup. */
547 struct mips_hi_fixup *next;
548 /* This fixup. */
549 fixS *fixp;
550 /* The section this fixup is in. */
551 segT seg;
552};
553
554/* The list of unmatched HI relocs. */
555
556static struct mips_hi_fixup *mips_hi_fixup_list;
557
558/* Map normal MIPS register numbers to mips16 register numbers. */
559
560#define X ILLEGAL_REG
e972090a
NC
561static const int mips32_to_16_reg_map[] =
562{
252b5132
RH
563 X, X, 2, 3, 4, 5, 6, 7,
564 X, X, X, X, X, X, X, X,
565 0, 1, X, X, X, X, X, X,
566 X, X, X, X, X, X, X, X
567};
568#undef X
569
570/* Map mips16 register numbers to normal MIPS register numbers. */
571
e972090a
NC
572static const unsigned int mips16_to_32_reg_map[] =
573{
252b5132
RH
574 16, 17, 2, 3, 4, 5, 6, 7
575};
60b63b72
RS
576
577static int mips_fix_4122_bugs;
4a6a3df4
AO
578
579/* We don't relax branches by default, since this causes us to expand
580 `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
581 fail to compute the offset before expanding the macro to the most
582 efficient expansion. */
583
584static int mips_relax_branch;
252b5132
RH
585\f
586/* Since the MIPS does not have multiple forms of PC relative
587 instructions, we do not have to do relaxing as is done on other
588 platforms. However, we do have to handle GP relative addressing
589 correctly, which turns out to be a similar problem.
590
591 Every macro that refers to a symbol can occur in (at least) two
592 forms, one with GP relative addressing and one without. For
593 example, loading a global variable into a register generally uses
594 a macro instruction like this:
595 lw $4,i
596 If i can be addressed off the GP register (this is true if it is in
597 the .sbss or .sdata section, or if it is known to be smaller than
598 the -G argument) this will generate the following instruction:
599 lw $4,i($gp)
600 This instruction will use a GPREL reloc. If i can not be addressed
601 off the GP register, the following instruction sequence will be used:
602 lui $at,i
603 lw $4,i($at)
604 In this case the first instruction will have a HI16 reloc, and the
605 second reloc will have a LO16 reloc. Both relocs will be against
606 the symbol i.
607
608 The issue here is that we may not know whether i is GP addressable
609 until after we see the instruction that uses it. Therefore, we
610 want to be able to choose the final instruction sequence only at
611 the end of the assembly. This is similar to the way other
612 platforms choose the size of a PC relative instruction only at the
613 end of assembly.
614
615 When generating position independent code we do not use GP
616 addressing in quite the same way, but the issue still arises as
617 external symbols and local symbols must be handled differently.
618
619 We handle these issues by actually generating both possible
620 instruction sequences. The longer one is put in a frag_var with
621 type rs_machine_dependent. We encode what to do with the frag in
622 the subtype field. We encode (1) the number of existing bytes to
623 replace, (2) the number of new bytes to use, (3) the offset from
624 the start of the existing bytes to the first reloc we must generate
625 (that is, the offset is applied from the start of the existing
626 bytes after they are replaced by the new bytes, if any), (4) the
627 offset from the start of the existing bytes to the second reloc,
628 (5) whether a third reloc is needed (the third reloc is always four
629 bytes after the second reloc), and (6) whether to warn if this
630 variant is used (this is sometimes needed if .set nomacro or .set
631 noat is in effect). All these numbers are reasonably small.
632
633 Generating two instruction sequences must be handled carefully to
634 ensure that delay slots are handled correctly. Fortunately, there
635 are a limited number of cases. When the second instruction
636 sequence is generated, append_insn is directed to maintain the
637 existing delay slot information, so it continues to apply to any
638 code after the second instruction sequence. This means that the
639 second instruction sequence must not impose any requirements not
640 required by the first instruction sequence.
641
642 These variant frags are then handled in functions called by the
643 machine independent code. md_estimate_size_before_relax returns
644 the final size of the frag. md_convert_frag sets up the final form
645 of the frag. tc_gen_reloc adjust the first reloc and adds a second
646 one if needed. */
647#define RELAX_ENCODE(old, new, reloc1, reloc2, reloc3, warn) \
648 ((relax_substateT) \
649 (((old) << 23) \
650 | ((new) << 16) \
651 | (((reloc1) + 64) << 9) \
652 | (((reloc2) + 64) << 2) \
653 | ((reloc3) ? (1 << 1) : 0) \
654 | ((warn) ? 1 : 0)))
655#define RELAX_OLD(i) (((i) >> 23) & 0x7f)
656#define RELAX_NEW(i) (((i) >> 16) & 0x7f)
9a41af64
TS
657#define RELAX_RELOC1(i) ((valueT) (((i) >> 9) & 0x7f) - 64)
658#define RELAX_RELOC2(i) ((valueT) (((i) >> 2) & 0x7f) - 64)
252b5132
RH
659#define RELAX_RELOC3(i) (((i) >> 1) & 1)
660#define RELAX_WARN(i) ((i) & 1)
661
4a6a3df4
AO
662/* Branch without likely bit. If label is out of range, we turn:
663
664 beq reg1, reg2, label
665 delay slot
666
667 into
668
669 bne reg1, reg2, 0f
670 nop
671 j label
672 0: delay slot
673
674 with the following opcode replacements:
675
676 beq <-> bne
677 blez <-> bgtz
678 bltz <-> bgez
679 bc1f <-> bc1t
680
681 bltzal <-> bgezal (with jal label instead of j label)
682
683 Even though keeping the delay slot instruction in the delay slot of
684 the branch would be more efficient, it would be very tricky to do
685 correctly, because we'd have to introduce a variable frag *after*
686 the delay slot instruction, and expand that instead. Let's do it
687 the easy way for now, even if the branch-not-taken case now costs
688 one additional instruction. Out-of-range branches are not supposed
689 to be common, anyway.
690
691 Branch likely. If label is out of range, we turn:
692
693 beql reg1, reg2, label
694 delay slot (annulled if branch not taken)
695
696 into
697
698 beql reg1, reg2, 1f
699 nop
700 beql $0, $0, 2f
701 nop
702 1: j[al] label
703 delay slot (executed only if branch taken)
704 2:
705
706 It would be possible to generate a shorter sequence by losing the
707 likely bit, generating something like:
b34976b6 708
4a6a3df4
AO
709 bne reg1, reg2, 0f
710 nop
711 j[al] label
712 delay slot (executed only if branch taken)
713 0:
714
715 beql -> bne
716 bnel -> beq
717 blezl -> bgtz
718 bgtzl -> blez
719 bltzl -> bgez
720 bgezl -> bltz
721 bc1fl -> bc1t
722 bc1tl -> bc1f
723
724 bltzall -> bgezal (with jal label instead of j label)
725 bgezall -> bltzal (ditto)
726
727
728 but it's not clear that it would actually improve performance. */
af6ae2ad 729#define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
4a6a3df4
AO
730 ((relax_substateT) \
731 (0xc0000000 \
732 | ((toofar) ? 1 : 0) \
733 | ((link) ? 2 : 0) \
734 | ((likely) ? 4 : 0) \
af6ae2ad 735 | ((uncond) ? 8 : 0)))
4a6a3df4 736#define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
4a6a3df4
AO
737#define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
738#define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
739#define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
ae6063d4 740#define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
4a6a3df4 741
252b5132
RH
742/* For mips16 code, we use an entirely different form of relaxation.
743 mips16 supports two versions of most instructions which take
744 immediate values: a small one which takes some small value, and a
745 larger one which takes a 16 bit value. Since branches also follow
746 this pattern, relaxing these values is required.
747
748 We can assemble both mips16 and normal MIPS code in a single
749 object. Therefore, we need to support this type of relaxation at
750 the same time that we support the relaxation described above. We
751 use the high bit of the subtype field to distinguish these cases.
752
753 The information we store for this type of relaxation is the
754 argument code found in the opcode file for this relocation, whether
755 the user explicitly requested a small or extended form, and whether
756 the relocation is in a jump or jal delay slot. That tells us the
757 size of the value, and how it should be stored. We also store
758 whether the fragment is considered to be extended or not. We also
759 store whether this is known to be a branch to a different section,
760 whether we have tried to relax this frag yet, and whether we have
761 ever extended a PC relative fragment because of a shift count. */
762#define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
763 (0x80000000 \
764 | ((type) & 0xff) \
765 | ((small) ? 0x100 : 0) \
766 | ((ext) ? 0x200 : 0) \
767 | ((dslot) ? 0x400 : 0) \
768 | ((jal_dslot) ? 0x800 : 0))
4a6a3df4 769#define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
252b5132
RH
770#define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
771#define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
772#define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
773#define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
774#define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
775#define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
776#define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
777#define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
778#define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
779#define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
780#define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
885add95
CD
781
782/* Is the given value a sign-extended 32-bit value? */
783#define IS_SEXT_32BIT_NUM(x) \
784 (((x) &~ (offsetT) 0x7fffffff) == 0 \
785 || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
786
787/* Is the given value a sign-extended 16-bit value? */
788#define IS_SEXT_16BIT_NUM(x) \
789 (((x) &~ (offsetT) 0x7fff) == 0 \
790 || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
791
252b5132
RH
792\f
793/* Prototypes for static functions. */
794
795#ifdef __STDC__
796#define internalError() \
797 as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
798#else
799#define internalError() as_fatal (_("MIPS internal Error"));
800#endif
801
802enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
803
5919d012
RS
804static inline bfd_boolean reloc_needs_lo_p
805 PARAMS ((bfd_reloc_code_real_type));
806static inline bfd_boolean fixup_has_matching_lo_p
807 PARAMS ((fixS *));
b34976b6
AM
808static int insn_uses_reg
809 PARAMS ((struct mips_cl_insn *ip, unsigned int reg,
810 enum mips_regclass class));
811static int reg_needs_delay
812 PARAMS ((unsigned int));
813static void mips16_mark_labels
814 PARAMS ((void));
815static void append_insn
816 PARAMS ((char *place, struct mips_cl_insn * ip, expressionS * p,
5e0116d5 817 bfd_reloc_code_real_type *r));
b34976b6
AM
818static void mips_no_prev_insn
819 PARAMS ((int));
820static void mips_emit_delays
821 PARAMS ((bfd_boolean));
252b5132 822#ifdef USE_STDARG
b34976b6
AM
823static void macro_build
824 PARAMS ((char *place, int *counter, expressionS * ep, const char *name,
825 const char *fmt, ...));
252b5132
RH
826#else
827static void macro_build ();
828#endif
b34976b6
AM
829static void mips16_macro_build
830 PARAMS ((char *, int *, expressionS *, const char *, const char *, va_list));
831static void macro_build_jalr
832 PARAMS ((int, expressionS *));
833static void macro_build_lui
834 PARAMS ((char *place, int *counter, expressionS * ep, int regnum));
835static void macro_build_ldst_constoffset
836 PARAMS ((char *place, int *counter, expressionS * ep, const char *op,
837 int valreg, int breg));
838static void set_at
839 PARAMS ((int *counter, int reg, int unsignedp));
840static void check_absolute_expr
841 PARAMS ((struct mips_cl_insn * ip, expressionS *));
842static void load_register
843 PARAMS ((int *, int, expressionS *, int));
844static void load_address
845 PARAMS ((int *, int, expressionS *, int *));
846static void move_register
847 PARAMS ((int *, int, int));
848static void macro
849 PARAMS ((struct mips_cl_insn * ip));
850static void mips16_macro
851 PARAMS ((struct mips_cl_insn * ip));
252b5132 852#ifdef LOSING_COMPILER
b34976b6
AM
853static void macro2
854 PARAMS ((struct mips_cl_insn * ip));
252b5132 855#endif
b34976b6
AM
856static void mips_ip
857 PARAMS ((char *str, struct mips_cl_insn * ip));
858static void mips16_ip
859 PARAMS ((char *str, struct mips_cl_insn * ip));
860static void mips16_immed
861 PARAMS ((char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean,
862 bfd_boolean, unsigned long *, bfd_boolean *, unsigned short *));
5e0116d5
RS
863static bfd_boolean parse_relocation
864 PARAMS ((char **, bfd_reloc_code_real_type *));
865static size_t my_getSmallExpression
866 PARAMS ((expressionS *, bfd_reloc_code_real_type *, char *));
b34976b6
AM
867static void my_getExpression
868 PARAMS ((expressionS *, char *));
ae948b86 869#ifdef OBJ_ELF
b34976b6
AM
870static int support_64bit_objects
871 PARAMS((void));
ae948b86 872#endif
b34976b6
AM
873static void mips_set_option_string
874 PARAMS ((const char **, const char *));
875static symbolS *get_symbol
876 PARAMS ((void));
877static void mips_align
878 PARAMS ((int to, int fill, symbolS *label));
879static void s_align
880 PARAMS ((int));
881static void s_change_sec
882 PARAMS ((int));
883static void s_change_section
884 PARAMS ((int));
885static void s_cons
886 PARAMS ((int));
887static void s_float_cons
888 PARAMS ((int));
889static void s_mips_globl
890 PARAMS ((int));
891static void s_option
892 PARAMS ((int));
893static void s_mipsset
894 PARAMS ((int));
895static void s_abicalls
896 PARAMS ((int));
897static void s_cpload
898 PARAMS ((int));
899static void s_cpsetup
900 PARAMS ((int));
901static void s_cplocal
902 PARAMS ((int));
903static void s_cprestore
904 PARAMS ((int));
905static void s_cpreturn
906 PARAMS ((int));
907static void s_gpvalue
908 PARAMS ((int));
909static void s_gpword
910 PARAMS ((int));
911static void s_gpdword
912 PARAMS ((int));
913static void s_cpadd
914 PARAMS ((int));
915static void s_insn
916 PARAMS ((int));
917static void md_obj_begin
918 PARAMS ((void));
919static void md_obj_end
920 PARAMS ((void));
921static long get_number
922 PARAMS ((void));
923static void s_mips_ent
924 PARAMS ((int));
925static void s_mips_end
926 PARAMS ((int));
927static void s_mips_frame
928 PARAMS ((int));
929static void s_mips_mask
930 PARAMS ((int));
931static void s_mips_stab
932 PARAMS ((int));
933static void s_mips_weakext
934 PARAMS ((int));
935static void s_mips_file
936 PARAMS ((int));
937static void s_mips_loc
938 PARAMS ((int));
5919d012
RS
939static bfd_boolean pic_need_relax
940 PARAMS ((symbolS *, asection *));
b34976b6
AM
941static int mips16_extended_frag
942 PARAMS ((fragS *, asection *, long));
4a6a3df4 943static int relaxed_branch_length (fragS *, asection *, int);
b34976b6
AM
944static int validate_mips_insn
945 PARAMS ((const struct mips_opcode *));
946static void show
947 PARAMS ((FILE *, const char *, int *, int *));
add55e1f 948#ifdef OBJ_ELF
b34976b6
AM
949static int mips_need_elf_addend_fixup
950 PARAMS ((fixS *));
add55e1f 951#endif
e7af610e
NC
952
953/* Table and functions used to map between CPU/ISA names, and
954 ISA levels, and CPU numbers. */
955
e972090a
NC
956struct mips_cpu_info
957{
e7af610e
NC
958 const char *name; /* CPU or ISA name. */
959 int is_isa; /* Is this an ISA? (If 0, a CPU.) */
960 int isa; /* ISA level. */
961 int cpu; /* CPU number (default CPU if ISA). */
962};
963
b34976b6
AM
964static void mips_set_architecture
965 PARAMS ((const struct mips_cpu_info *));
966static void mips_set_tune
967 PARAMS ((const struct mips_cpu_info *));
968static bfd_boolean mips_strict_matching_cpu_name_p
969 PARAMS ((const char *, const char *));
970static bfd_boolean mips_matching_cpu_name_p
971 PARAMS ((const char *, const char *));
972static const struct mips_cpu_info *mips_parse_cpu
973 PARAMS ((const char *, const char *));
974static const struct mips_cpu_info *mips_cpu_info_from_isa
975 PARAMS ((int));
252b5132
RH
976\f
977/* Pseudo-op table.
978
979 The following pseudo-ops from the Kane and Heinrich MIPS book
980 should be defined here, but are currently unsupported: .alias,
981 .galive, .gjaldef, .gjrlive, .livereg, .noalias.
982
983 The following pseudo-ops from the Kane and Heinrich MIPS book are
984 specific to the type of debugging information being generated, and
985 should be defined by the object format: .aent, .begin, .bend,
986 .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
987 .vreg.
988
989 The following pseudo-ops from the Kane and Heinrich MIPS book are
990 not MIPS CPU specific, but are also not specific to the object file
991 format. This file is probably the best place to define them, but
992 they are not currently supported: .asm0, .endr, .lab, .repeat,
993 .struct. */
994
e972090a
NC
995static const pseudo_typeS mips_pseudo_table[] =
996{
beae10d5 997 /* MIPS specific pseudo-ops. */
252b5132
RH
998 {"option", s_option, 0},
999 {"set", s_mipsset, 0},
1000 {"rdata", s_change_sec, 'r'},
1001 {"sdata", s_change_sec, 's'},
1002 {"livereg", s_ignore, 0},
1003 {"abicalls", s_abicalls, 0},
1004 {"cpload", s_cpload, 0},
6478892d
TS
1005 {"cpsetup", s_cpsetup, 0},
1006 {"cplocal", s_cplocal, 0},
252b5132 1007 {"cprestore", s_cprestore, 0},
6478892d
TS
1008 {"cpreturn", s_cpreturn, 0},
1009 {"gpvalue", s_gpvalue, 0},
252b5132 1010 {"gpword", s_gpword, 0},
10181a0d 1011 {"gpdword", s_gpdword, 0},
252b5132
RH
1012 {"cpadd", s_cpadd, 0},
1013 {"insn", s_insn, 0},
1014
beae10d5 1015 /* Relatively generic pseudo-ops that happen to be used on MIPS
252b5132
RH
1016 chips. */
1017 {"asciiz", stringer, 1},
1018 {"bss", s_change_sec, 'b'},
1019 {"err", s_err, 0},
1020 {"half", s_cons, 1},
1021 {"dword", s_cons, 3},
1022 {"weakext", s_mips_weakext, 0},
1023
beae10d5 1024 /* These pseudo-ops are defined in read.c, but must be overridden
252b5132
RH
1025 here for one reason or another. */
1026 {"align", s_align, 0},
1027 {"byte", s_cons, 0},
1028 {"data", s_change_sec, 'd'},
1029 {"double", s_float_cons, 'd'},
1030 {"float", s_float_cons, 'f'},
1031 {"globl", s_mips_globl, 0},
1032 {"global", s_mips_globl, 0},
1033 {"hword", s_cons, 1},
1034 {"int", s_cons, 2},
1035 {"long", s_cons, 2},
1036 {"octa", s_cons, 4},
1037 {"quad", s_cons, 3},
cca86cc8 1038 {"section", s_change_section, 0},
252b5132
RH
1039 {"short", s_cons, 1},
1040 {"single", s_float_cons, 'f'},
1041 {"stabn", s_mips_stab, 'n'},
1042 {"text", s_change_sec, 't'},
1043 {"word", s_cons, 2},
add56521 1044
add56521 1045 { "extern", ecoff_directive_extern, 0},
add56521 1046
43841e91 1047 { NULL, NULL, 0 },
252b5132
RH
1048};
1049
e972090a
NC
1050static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1051{
beae10d5
KH
1052 /* These pseudo-ops should be defined by the object file format.
1053 However, a.out doesn't support them, so we have versions here. */
252b5132
RH
1054 {"aent", s_mips_ent, 1},
1055 {"bgnb", s_ignore, 0},
1056 {"end", s_mips_end, 0},
1057 {"endb", s_ignore, 0},
1058 {"ent", s_mips_ent, 0},
c5dd6aab 1059 {"file", s_mips_file, 0},
252b5132
RH
1060 {"fmask", s_mips_mask, 'F'},
1061 {"frame", s_mips_frame, 0},
c5dd6aab 1062 {"loc", s_mips_loc, 0},
252b5132
RH
1063 {"mask", s_mips_mask, 'R'},
1064 {"verstamp", s_ignore, 0},
43841e91 1065 { NULL, NULL, 0 },
252b5132
RH
1066};
1067
1068extern void pop_insert PARAMS ((const pseudo_typeS *));
1069
1070void
1071mips_pop_insert ()
1072{
1073 pop_insert (mips_pseudo_table);
1074 if (! ECOFF_DEBUGGING)
1075 pop_insert (mips_nonecoff_pseudo_table);
1076}
1077\f
1078/* Symbols labelling the current insn. */
1079
e972090a
NC
1080struct insn_label_list
1081{
252b5132
RH
1082 struct insn_label_list *next;
1083 symbolS *label;
1084};
1085
1086static struct insn_label_list *insn_labels;
1087static struct insn_label_list *free_insn_labels;
1088
1089static void mips_clear_insn_labels PARAMS ((void));
1090
1091static inline void
1092mips_clear_insn_labels ()
1093{
1094 register struct insn_label_list **pl;
1095
1096 for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1097 ;
1098 *pl = insn_labels;
1099 insn_labels = NULL;
1100}
1101\f
1102static char *expr_end;
1103
1104/* Expressions which appear in instructions. These are set by
1105 mips_ip. */
1106
1107static expressionS imm_expr;
1108static expressionS offset_expr;
1109
1110/* Relocs associated with imm_expr and offset_expr. */
1111
f6688943
TS
1112static bfd_reloc_code_real_type imm_reloc[3]
1113 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1114static bfd_reloc_code_real_type offset_reloc[3]
1115 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
252b5132 1116
252b5132
RH
1117/* These are set by mips16_ip if an explicit extension is used. */
1118
b34976b6 1119static bfd_boolean mips16_small, mips16_ext;
252b5132 1120
7ed4a06a 1121#ifdef OBJ_ELF
ecb4347a
DJ
1122/* The pdr segment for per procedure frame/regmask info. Not used for
1123 ECOFF debugging. */
252b5132
RH
1124
1125static segT pdr_seg;
7ed4a06a 1126#endif
252b5132 1127
e013f690
TS
1128/* The default target format to use. */
1129
1130const char *
1131mips_target_format ()
1132{
1133 switch (OUTPUT_FLAVOR)
1134 {
1135 case bfd_target_aout_flavour:
1136 return target_big_endian ? "a.out-mips-big" : "a.out-mips-little";
1137 case bfd_target_ecoff_flavour:
1138 return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1139 case bfd_target_coff_flavour:
1140 return "pe-mips";
1141 case bfd_target_elf_flavour:
1142#ifdef TE_TMIPS
cfe86eaa 1143 /* This is traditional mips. */
e013f690 1144 return (target_big_endian
cfe86eaa
TS
1145 ? (HAVE_64BIT_OBJECTS
1146 ? "elf64-tradbigmips"
1147 : (HAVE_NEWABI
1148 ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1149 : (HAVE_64BIT_OBJECTS
1150 ? "elf64-tradlittlemips"
1151 : (HAVE_NEWABI
1152 ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
e013f690
TS
1153#else
1154 return (target_big_endian
cfe86eaa
TS
1155 ? (HAVE_64BIT_OBJECTS
1156 ? "elf64-bigmips"
1157 : (HAVE_NEWABI
1158 ? "elf32-nbigmips" : "elf32-bigmips"))
1159 : (HAVE_64BIT_OBJECTS
1160 ? "elf64-littlemips"
1161 : (HAVE_NEWABI
1162 ? "elf32-nlittlemips" : "elf32-littlemips")));
e013f690
TS
1163#endif
1164 default:
1165 abort ();
1166 return NULL;
1167 }
1168}
1169
156c2f8b
NC
1170/* This function is called once, at assembler startup time. It should
1171 set up all the tables, etc. that the MD part of the assembler will need. */
1172
252b5132
RH
1173void
1174md_begin ()
1175{
252b5132 1176 register const char *retval = NULL;
156c2f8b 1177 int i = 0;
252b5132 1178 int broken = 0;
1f25f5d3 1179
ec68c924 1180 if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, mips_arch))
252b5132
RH
1181 as_warn (_("Could not set architecture and machine"));
1182
252b5132
RH
1183 op_hash = hash_new ();
1184
1185 for (i = 0; i < NUMOPCODES;)
1186 {
1187 const char *name = mips_opcodes[i].name;
1188
1189 retval = hash_insert (op_hash, name, (PTR) &mips_opcodes[i]);
1190 if (retval != NULL)
1191 {
1192 fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1193 mips_opcodes[i].name, retval);
1194 /* Probably a memory allocation problem? Give up now. */
1195 as_fatal (_("Broken assembler. No assembly attempted."));
1196 }
1197 do
1198 {
1199 if (mips_opcodes[i].pinfo != INSN_MACRO)
1200 {
1201 if (!validate_mips_insn (&mips_opcodes[i]))
1202 broken = 1;
1203 }
1204 ++i;
1205 }
1206 while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1207 }
1208
1209 mips16_op_hash = hash_new ();
1210
1211 i = 0;
1212 while (i < bfd_mips16_num_opcodes)
1213 {
1214 const char *name = mips16_opcodes[i].name;
1215
1216 retval = hash_insert (mips16_op_hash, name, (PTR) &mips16_opcodes[i]);
1217 if (retval != NULL)
1218 as_fatal (_("internal: can't hash `%s': %s"),
1219 mips16_opcodes[i].name, retval);
1220 do
1221 {
1222 if (mips16_opcodes[i].pinfo != INSN_MACRO
1223 && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1224 != mips16_opcodes[i].match))
1225 {
1226 fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1227 mips16_opcodes[i].name, mips16_opcodes[i].args);
1228 broken = 1;
1229 }
1230 ++i;
1231 }
1232 while (i < bfd_mips16_num_opcodes
1233 && strcmp (mips16_opcodes[i].name, name) == 0);
1234 }
1235
1236 if (broken)
1237 as_fatal (_("Broken assembler. No assembly attempted."));
1238
1239 /* We add all the general register names to the symbol table. This
1240 helps us detect invalid uses of them. */
1241 for (i = 0; i < 32; i++)
1242 {
1243 char buf[5];
1244
1245 sprintf (buf, "$%d", i);
1246 symbol_table_insert (symbol_new (buf, reg_section, i,
1247 &zero_address_frag));
1248 }
76db943d
TS
1249 symbol_table_insert (symbol_new ("$ra", reg_section, RA,
1250 &zero_address_frag));
252b5132
RH
1251 symbol_table_insert (symbol_new ("$fp", reg_section, FP,
1252 &zero_address_frag));
1253 symbol_table_insert (symbol_new ("$sp", reg_section, SP,
1254 &zero_address_frag));
1255 symbol_table_insert (symbol_new ("$gp", reg_section, GP,
1256 &zero_address_frag));
1257 symbol_table_insert (symbol_new ("$at", reg_section, AT,
1258 &zero_address_frag));
1259 symbol_table_insert (symbol_new ("$kt0", reg_section, KT0,
1260 &zero_address_frag));
1261 symbol_table_insert (symbol_new ("$kt1", reg_section, KT1,
1262 &zero_address_frag));
85b51719
TS
1263 symbol_table_insert (symbol_new ("$zero", reg_section, ZERO,
1264 &zero_address_frag));
252b5132
RH
1265 symbol_table_insert (symbol_new ("$pc", reg_section, -1,
1266 &zero_address_frag));
1267
6047c971
AO
1268 /* If we don't add these register names to the symbol table, they
1269 may end up being added as regular symbols by operand(), and then
1270 make it to the object file as undefined in case they're not
1271 regarded as local symbols. They're local in o32, since `$' is a
1272 local symbol prefix, but not in n32 or n64. */
1273 for (i = 0; i < 8; i++)
1274 {
1275 char buf[6];
1276
1277 sprintf (buf, "$fcc%i", i);
1278 symbol_table_insert (symbol_new (buf, reg_section, -1,
1279 &zero_address_frag));
1280 }
1281
b34976b6 1282 mips_no_prev_insn (FALSE);
252b5132
RH
1283
1284 mips_gprmask = 0;
1285 mips_cprmask[0] = 0;
1286 mips_cprmask[1] = 0;
1287 mips_cprmask[2] = 0;
1288 mips_cprmask[3] = 0;
1289
1290 /* set the default alignment for the text section (2**2) */
1291 record_alignment (text_section, 2);
1292
1293 if (USE_GLOBAL_POINTER_OPT)
1294 bfd_set_gp_size (stdoutput, g_switch_value);
1295
1296 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1297 {
1298 /* On a native system, sections must be aligned to 16 byte
1299 boundaries. When configured for an embedded ELF target, we
1300 don't bother. */
1301 if (strcmp (TARGET_OS, "elf") != 0)
1302 {
1303 (void) bfd_set_section_alignment (stdoutput, text_section, 4);
1304 (void) bfd_set_section_alignment (stdoutput, data_section, 4);
1305 (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
1306 }
1307
1308 /* Create a .reginfo section for register masks and a .mdebug
1309 section for debugging information. */
1310 {
1311 segT seg;
1312 subsegT subseg;
1313 flagword flags;
1314 segT sec;
1315
1316 seg = now_seg;
1317 subseg = now_subseg;
1318
1319 /* The ABI says this section should be loaded so that the
1320 running program can access it. However, we don't load it
1321 if we are configured for an embedded target */
1322 flags = SEC_READONLY | SEC_DATA;
1323 if (strcmp (TARGET_OS, "elf") != 0)
1324 flags |= SEC_ALLOC | SEC_LOAD;
1325
316f5878 1326 if (mips_abi != N64_ABI)
252b5132
RH
1327 {
1328 sec = subseg_new (".reginfo", (subsegT) 0);
1329
195325d2
TS
1330 bfd_set_section_flags (stdoutput, sec, flags);
1331 bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
bdaaa2e1 1332
252b5132
RH
1333#ifdef OBJ_ELF
1334 mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
1335#endif
1336 }
1337 else
1338 {
1339 /* The 64-bit ABI uses a .MIPS.options section rather than
1340 .reginfo section. */
1341 sec = subseg_new (".MIPS.options", (subsegT) 0);
195325d2
TS
1342 bfd_set_section_flags (stdoutput, sec, flags);
1343 bfd_set_section_alignment (stdoutput, sec, 3);
252b5132
RH
1344
1345#ifdef OBJ_ELF
1346 /* Set up the option header. */
1347 {
1348 Elf_Internal_Options opthdr;
1349 char *f;
1350
1351 opthdr.kind = ODK_REGINFO;
1352 opthdr.size = (sizeof (Elf_External_Options)
1353 + sizeof (Elf64_External_RegInfo));
1354 opthdr.section = 0;
1355 opthdr.info = 0;
1356 f = frag_more (sizeof (Elf_External_Options));
1357 bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
1358 (Elf_External_Options *) f);
1359
1360 mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
1361 }
1362#endif
1363 }
1364
1365 if (ECOFF_DEBUGGING)
1366 {
1367 sec = subseg_new (".mdebug", (subsegT) 0);
1368 (void) bfd_set_section_flags (stdoutput, sec,
1369 SEC_HAS_CONTENTS | SEC_READONLY);
1370 (void) bfd_set_section_alignment (stdoutput, sec, 2);
1371 }
ecb4347a
DJ
1372#ifdef OBJ_ELF
1373 else if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1374 {
1375 pdr_seg = subseg_new (".pdr", (subsegT) 0);
1376 (void) bfd_set_section_flags (stdoutput, pdr_seg,
1377 SEC_READONLY | SEC_RELOC
1378 | SEC_DEBUGGING);
1379 (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
1380 }
252b5132
RH
1381#endif
1382
1383 subseg_set (seg, subseg);
1384 }
1385 }
1386
1387 if (! ECOFF_DEBUGGING)
1388 md_obj_begin ();
1389}
1390
1391void
1392md_mips_end ()
1393{
1394 if (! ECOFF_DEBUGGING)
1395 md_obj_end ();
1396}
1397
1398void
1399md_assemble (str)
1400 char *str;
1401{
1402 struct mips_cl_insn insn;
f6688943
TS
1403 bfd_reloc_code_real_type unused_reloc[3]
1404 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
252b5132
RH
1405
1406 imm_expr.X_op = O_absent;
252b5132 1407 offset_expr.X_op = O_absent;
f6688943
TS
1408 imm_reloc[0] = BFD_RELOC_UNUSED;
1409 imm_reloc[1] = BFD_RELOC_UNUSED;
1410 imm_reloc[2] = BFD_RELOC_UNUSED;
1411 offset_reloc[0] = BFD_RELOC_UNUSED;
1412 offset_reloc[1] = BFD_RELOC_UNUSED;
1413 offset_reloc[2] = BFD_RELOC_UNUSED;
252b5132
RH
1414
1415 if (mips_opts.mips16)
1416 mips16_ip (str, &insn);
1417 else
1418 {
1419 mips_ip (str, &insn);
beae10d5
KH
1420 DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
1421 str, insn.insn_opcode));
252b5132
RH
1422 }
1423
1424 if (insn_error)
1425 {
1426 as_bad ("%s `%s'", insn_error, str);
1427 return;
1428 }
1429
1430 if (insn.insn_mo->pinfo == INSN_MACRO)
1431 {
1432 if (mips_opts.mips16)
1433 mips16_macro (&insn);
1434 else
1435 macro (&insn);
1436 }
1437 else
1438 {
1439 if (imm_expr.X_op != O_absent)
5e0116d5 1440 append_insn (NULL, &insn, &imm_expr, imm_reloc);
252b5132 1441 else if (offset_expr.X_op != O_absent)
5e0116d5 1442 append_insn (NULL, &insn, &offset_expr, offset_reloc);
252b5132 1443 else
5e0116d5 1444 append_insn (NULL, &insn, NULL, unused_reloc);
252b5132
RH
1445 }
1446}
1447
5919d012
RS
1448/* Return true if the given relocation might need a matching %lo().
1449 Note that R_MIPS_GOT16 relocations only need a matching %lo() when
1450 applied to local symbols. */
1451
1452static inline bfd_boolean
1453reloc_needs_lo_p (reloc)
1454 bfd_reloc_code_real_type reloc;
1455{
1456 return (reloc == BFD_RELOC_HI16_S
1457 || reloc == BFD_RELOC_MIPS_GOT16);
1458}
1459
1460/* Return true if the given fixup is followed by a matching R_MIPS_LO16
1461 relocation. */
1462
1463static inline bfd_boolean
1464fixup_has_matching_lo_p (fixp)
1465 fixS *fixp;
1466{
1467 return (fixp->fx_next != NULL
1468 && fixp->fx_next->fx_r_type == BFD_RELOC_LO16
1469 && fixp->fx_addsy == fixp->fx_next->fx_addsy
1470 && fixp->fx_offset == fixp->fx_next->fx_offset);
1471}
1472
252b5132
RH
1473/* See whether instruction IP reads register REG. CLASS is the type
1474 of register. */
1475
1476static int
1477insn_uses_reg (ip, reg, class)
1478 struct mips_cl_insn *ip;
1479 unsigned int reg;
1480 enum mips_regclass class;
1481{
1482 if (class == MIPS16_REG)
1483 {
1484 assert (mips_opts.mips16);
1485 reg = mips16_to_32_reg_map[reg];
1486 class = MIPS_GR_REG;
1487 }
1488
85b51719
TS
1489 /* Don't report on general register ZERO, since it never changes. */
1490 if (class == MIPS_GR_REG && reg == ZERO)
252b5132
RH
1491 return 0;
1492
1493 if (class == MIPS_FP_REG)
1494 {
1495 assert (! mips_opts.mips16);
1496 /* If we are called with either $f0 or $f1, we must check $f0.
1497 This is not optimal, because it will introduce an unnecessary
1498 NOP between "lwc1 $f0" and "swc1 $f1". To fix this we would
1499 need to distinguish reading both $f0 and $f1 or just one of
1500 them. Note that we don't have to check the other way,
1501 because there is no instruction that sets both $f0 and $f1
1502 and requires a delay. */
1503 if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
1504 && ((((ip->insn_opcode >> OP_SH_FS) & OP_MASK_FS) &~(unsigned)1)
1505 == (reg &~ (unsigned) 1)))
1506 return 1;
1507 if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
1508 && ((((ip->insn_opcode >> OP_SH_FT) & OP_MASK_FT) &~(unsigned)1)
1509 == (reg &~ (unsigned) 1)))
1510 return 1;
1511 }
1512 else if (! mips_opts.mips16)
1513 {
1514 if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
1515 && ((ip->insn_opcode >> OP_SH_RS) & OP_MASK_RS) == reg)
1516 return 1;
1517 if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
1518 && ((ip->insn_opcode >> OP_SH_RT) & OP_MASK_RT) == reg)
1519 return 1;
1520 }
1521 else
1522 {
1523 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
1524 && (mips16_to_32_reg_map[((ip->insn_opcode >> MIPS16OP_SH_RX)
1525 & MIPS16OP_MASK_RX)]
1526 == reg))
1527 return 1;
1528 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
1529 && (mips16_to_32_reg_map[((ip->insn_opcode >> MIPS16OP_SH_RY)
1530 & MIPS16OP_MASK_RY)]
1531 == reg))
1532 return 1;
1533 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
1534 && (mips16_to_32_reg_map[((ip->insn_opcode >> MIPS16OP_SH_MOVE32Z)
1535 & MIPS16OP_MASK_MOVE32Z)]
1536 == reg))
1537 return 1;
1538 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
1539 return 1;
1540 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
1541 return 1;
1542 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
1543 return 1;
1544 if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
1545 && ((ip->insn_opcode >> MIPS16OP_SH_REGR32)
1546 & MIPS16OP_MASK_REGR32) == reg)
1547 return 1;
1548 }
1549
1550 return 0;
1551}
1552
1553/* This function returns true if modifying a register requires a
1554 delay. */
1555
1556static int
1557reg_needs_delay (reg)
156c2f8b 1558 unsigned int reg;
252b5132
RH
1559{
1560 unsigned long prev_pinfo;
1561
1562 prev_pinfo = prev_insn.insn_mo->pinfo;
1563 if (! mips_opts.noreorder
9ce8a5dd 1564 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
252b5132
RH
1565 && ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
1566 || (! gpr_interlocks
1567 && (prev_pinfo & INSN_LOAD_MEMORY_DELAY))))
1568 {
1569 /* A load from a coprocessor or from memory. All load
1570 delays delay the use of general register rt for one
1571 instruction on the r3000. The r6000 and r4000 use
1572 interlocks. */
bdaaa2e1 1573 /* Itbl support may require additional care here. */
252b5132
RH
1574 know (prev_pinfo & INSN_WRITE_GPR_T);
1575 if (reg == ((prev_insn.insn_opcode >> OP_SH_RT) & OP_MASK_RT))
1576 return 1;
1577 }
1578
1579 return 0;
1580}
1581
1582/* Mark instruction labels in mips16 mode. This permits the linker to
1583 handle them specially, such as generating jalx instructions when
1584 needed. We also make them odd for the duration of the assembly, in
1585 order to generate the right sort of code. We will make them even
1586 in the adjust_symtab routine, while leaving them marked. This is
1587 convenient for the debugger and the disassembler. The linker knows
1588 to make them odd again. */
1589
1590static void
1591mips16_mark_labels ()
1592{
1593 if (mips_opts.mips16)
1594 {
1595 struct insn_label_list *l;
98aa84af 1596 valueT val;
252b5132
RH
1597
1598 for (l = insn_labels; l != NULL; l = l->next)
1599 {
1600#ifdef OBJ_ELF
1601 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1602 S_SET_OTHER (l->label, STO_MIPS16);
1603#endif
98aa84af
AM
1604 val = S_GET_VALUE (l->label);
1605 if ((val & 1) == 0)
1606 S_SET_VALUE (l->label, val + 1);
252b5132
RH
1607 }
1608 }
1609}
1610
1611/* Output an instruction. PLACE is where to put the instruction; if
1612 it is NULL, this uses frag_more to get room. IP is the instruction
1613 information. ADDRESS_EXPR is an operand of the instruction to be
1614 used with RELOC_TYPE. */
1615
1616static void
5e0116d5 1617append_insn (place, ip, address_expr, reloc_type)
252b5132
RH
1618 char *place;
1619 struct mips_cl_insn *ip;
1620 expressionS *address_expr;
f6688943 1621 bfd_reloc_code_real_type *reloc_type;
252b5132
RH
1622{
1623 register unsigned long prev_pinfo, pinfo;
1624 char *f;
f6688943 1625 fixS *fixp[3];
252b5132
RH
1626 int nops = 0;
1627
1628 /* Mark instruction labels in mips16 mode. */
f9419b05 1629 mips16_mark_labels ();
252b5132
RH
1630
1631 prev_pinfo = prev_insn.insn_mo->pinfo;
1632 pinfo = ip->insn_mo->pinfo;
1633
1634 if (place == NULL && (! mips_opts.noreorder || prev_nop_frag != NULL))
1635 {
1636 int prev_prev_nop;
1637
1638 /* If the previous insn required any delay slots, see if we need
1639 to insert a NOP or two. There are eight kinds of possible
1640 hazards, of which an instruction can have at most one type.
1641 (1) a load from memory delay
1642 (2) a load from a coprocessor delay
1643 (3) an unconditional branch delay
1644 (4) a conditional branch delay
1645 (5) a move to coprocessor register delay
1646 (6) a load coprocessor register from memory delay
1647 (7) a coprocessor condition code delay
1648 (8) a HI/LO special register delay
1649
1650 There are a lot of optimizations we could do that we don't.
1651 In particular, we do not, in general, reorder instructions.
1652 If you use gcc with optimization, it will reorder
1653 instructions and generally do much more optimization then we
1654 do here; repeating all that work in the assembler would only
1655 benefit hand written assembly code, and does not seem worth
1656 it. */
1657
1658 /* This is how a NOP is emitted. */
1659#define emit_nop() \
1660 (mips_opts.mips16 \
1661 ? md_number_to_chars (frag_more (2), 0x6500, 2) \
1662 : md_number_to_chars (frag_more (4), 0, 4))
1663
1664 /* The previous insn might require a delay slot, depending upon
1665 the contents of the current insn. */
1666 if (! mips_opts.mips16
9ce8a5dd 1667 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
252b5132
RH
1668 && (((prev_pinfo & INSN_LOAD_COPROC_DELAY)
1669 && ! cop_interlocks)
1670 || (! gpr_interlocks
1671 && (prev_pinfo & INSN_LOAD_MEMORY_DELAY))))
1672 {
1673 /* A load from a coprocessor or from memory. All load
1674 delays delay the use of general register rt for one
1675 instruction on the r3000. The r6000 and r4000 use
1676 interlocks. */
beae10d5 1677 /* Itbl support may require additional care here. */
252b5132
RH
1678 know (prev_pinfo & INSN_WRITE_GPR_T);
1679 if (mips_optimize == 0
1680 || insn_uses_reg (ip,
1681 ((prev_insn.insn_opcode >> OP_SH_RT)
1682 & OP_MASK_RT),
1683 MIPS_GR_REG))
1684 ++nops;
1685 }
1686 else if (! mips_opts.mips16
9ce8a5dd 1687 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
252b5132 1688 && (((prev_pinfo & INSN_COPROC_MOVE_DELAY)
beae10d5 1689 && ! cop_interlocks)
e7af610e 1690 || (mips_opts.isa == ISA_MIPS1
252b5132
RH
1691 && (prev_pinfo & INSN_COPROC_MEMORY_DELAY))))
1692 {
1693 /* A generic coprocessor delay. The previous instruction
1694 modified a coprocessor general or control register. If
1695 it modified a control register, we need to avoid any
1696 coprocessor instruction (this is probably not always
1697 required, but it sometimes is). If it modified a general
1698 register, we avoid using that register.
1699
1700 On the r6000 and r4000 loading a coprocessor register
1701 from memory is interlocked, and does not require a delay.
1702
1703 This case is not handled very well. There is no special
1704 knowledge of CP0 handling, and the coprocessors other
1705 than the floating point unit are not distinguished at
1706 all. */
1707 /* Itbl support may require additional care here. FIXME!
bdaaa2e1 1708 Need to modify this to include knowledge about
252b5132
RH
1709 user specified delays! */
1710 if (prev_pinfo & INSN_WRITE_FPR_T)
1711 {
1712 if (mips_optimize == 0
1713 || insn_uses_reg (ip,
1714 ((prev_insn.insn_opcode >> OP_SH_FT)
1715 & OP_MASK_FT),
1716 MIPS_FP_REG))
1717 ++nops;
1718 }
1719 else if (prev_pinfo & INSN_WRITE_FPR_S)
1720 {
1721 if (mips_optimize == 0
1722 || insn_uses_reg (ip,
1723 ((prev_insn.insn_opcode >> OP_SH_FS)
1724 & OP_MASK_FS),
1725 MIPS_FP_REG))
1726 ++nops;
1727 }
1728 else
1729 {
1730 /* We don't know exactly what the previous instruction
1731 does. If the current instruction uses a coprocessor
1732 register, we must insert a NOP. If previous
1733 instruction may set the condition codes, and the
1734 current instruction uses them, we must insert two
1735 NOPS. */
bdaaa2e1 1736 /* Itbl support may require additional care here. */
252b5132
RH
1737 if (mips_optimize == 0
1738 || ((prev_pinfo & INSN_WRITE_COND_CODE)
1739 && (pinfo & INSN_READ_COND_CODE)))
1740 nops += 2;
1741 else if (pinfo & INSN_COP)
1742 ++nops;
1743 }
1744 }
1745 else if (! mips_opts.mips16
9ce8a5dd 1746 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
252b5132
RH
1747 && (prev_pinfo & INSN_WRITE_COND_CODE)
1748 && ! cop_interlocks)
1749 {
1750 /* The previous instruction sets the coprocessor condition
1751 codes, but does not require a general coprocessor delay
1752 (this means it is a floating point comparison
1753 instruction). If this instruction uses the condition
1754 codes, we need to insert a single NOP. */
beae10d5 1755 /* Itbl support may require additional care here. */
252b5132
RH
1756 if (mips_optimize == 0
1757 || (pinfo & INSN_READ_COND_CODE))
1758 ++nops;
1759 }
6b76fefe
CM
1760
1761 /* If we're fixing up mfhi/mflo for the r7000 and the
1762 previous insn was an mfhi/mflo and the current insn
1763 reads the register that the mfhi/mflo wrote to, then
1764 insert two nops. */
1765
1766 else if (mips_7000_hilo_fix
1767 && MF_HILO_INSN (prev_pinfo)
1768 && insn_uses_reg (ip, ((prev_insn.insn_opcode >> OP_SH_RD)
beae10d5
KH
1769 & OP_MASK_RD),
1770 MIPS_GR_REG))
6b76fefe
CM
1771 {
1772 nops += 2;
1773 }
1774
1775 /* If we're fixing up mfhi/mflo for the r7000 and the
1776 2nd previous insn was an mfhi/mflo and the current insn
1777 reads the register that the mfhi/mflo wrote to, then
1778 insert one nop. */
1779
1780 else if (mips_7000_hilo_fix
1781 && MF_HILO_INSN (prev_prev_insn.insn_opcode)
1782 && insn_uses_reg (ip, ((prev_prev_insn.insn_opcode >> OP_SH_RD)
1783 & OP_MASK_RD),
1784 MIPS_GR_REG))
bdaaa2e1 1785
6b76fefe 1786 {
f9419b05 1787 ++nops;
6b76fefe 1788 }
bdaaa2e1 1789
252b5132
RH
1790 else if (prev_pinfo & INSN_READ_LO)
1791 {
1792 /* The previous instruction reads the LO register; if the
1793 current instruction writes to the LO register, we must
bdaaa2e1
KH
1794 insert two NOPS. Some newer processors have interlocks.
1795 Also the tx39's multiply instructions can be exectuted
252b5132 1796 immediatly after a read from HI/LO (without the delay),
bdaaa2e1
KH
1797 though the tx39's divide insns still do require the
1798 delay. */
252b5132 1799 if (! (hilo_interlocks
ec68c924 1800 || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT)))
252b5132
RH
1801 && (mips_optimize == 0
1802 || (pinfo & INSN_WRITE_LO)))
1803 nops += 2;
1804 /* Most mips16 branch insns don't have a delay slot.
1805 If a read from LO is immediately followed by a branch
1806 to a write to LO we have a read followed by a write
1807 less than 2 insns away. We assume the target of
1808 a branch might be a write to LO, and insert a nop
bdaaa2e1 1809 between a read and an immediately following branch. */
252b5132
RH
1810 else if (mips_opts.mips16
1811 && (mips_optimize == 0
1812 || (pinfo & MIPS16_INSN_BRANCH)))
f9419b05 1813 ++nops;
252b5132
RH
1814 }
1815 else if (prev_insn.insn_mo->pinfo & INSN_READ_HI)
1816 {
1817 /* The previous instruction reads the HI register; if the
1818 current instruction writes to the HI register, we must
1819 insert a NOP. Some newer processors have interlocks.
bdaaa2e1 1820 Also the note tx39's multiply above. */
252b5132 1821 if (! (hilo_interlocks
ec68c924 1822 || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT)))
252b5132
RH
1823 && (mips_optimize == 0
1824 || (pinfo & INSN_WRITE_HI)))
1825 nops += 2;
1826 /* Most mips16 branch insns don't have a delay slot.
1827 If a read from HI is immediately followed by a branch
1828 to a write to HI we have a read followed by a write
1829 less than 2 insns away. We assume the target of
1830 a branch might be a write to HI, and insert a nop
bdaaa2e1 1831 between a read and an immediately following branch. */
252b5132
RH
1832 else if (mips_opts.mips16
1833 && (mips_optimize == 0
1834 || (pinfo & MIPS16_INSN_BRANCH)))
f9419b05 1835 ++nops;
252b5132
RH
1836 }
1837
1838 /* If the previous instruction was in a noreorder section, then
1839 we don't want to insert the nop after all. */
bdaaa2e1 1840 /* Itbl support may require additional care here. */
252b5132
RH
1841 if (prev_insn_unreordered)
1842 nops = 0;
1843
1844 /* There are two cases which require two intervening
1845 instructions: 1) setting the condition codes using a move to
1846 coprocessor instruction which requires a general coprocessor
1847 delay and then reading the condition codes 2) reading the HI
1848 or LO register and then writing to it (except on processors
1849 which have interlocks). If we are not already emitting a NOP
1850 instruction, we must check for these cases compared to the
1851 instruction previous to the previous instruction. */
1852 if ((! mips_opts.mips16
9ce8a5dd 1853 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
252b5132
RH
1854 && (prev_prev_insn.insn_mo->pinfo & INSN_COPROC_MOVE_DELAY)
1855 && (prev_prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE)
1856 && (pinfo & INSN_READ_COND_CODE)
1857 && ! cop_interlocks)
1858 || ((prev_prev_insn.insn_mo->pinfo & INSN_READ_LO)
1859 && (pinfo & INSN_WRITE_LO)
1860 && ! (hilo_interlocks
ec68c924 1861 || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT))))
252b5132
RH
1862 || ((prev_prev_insn.insn_mo->pinfo & INSN_READ_HI)
1863 && (pinfo & INSN_WRITE_HI)
1864 && ! (hilo_interlocks
ec68c924 1865 || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT)))))
252b5132
RH
1866 prev_prev_nop = 1;
1867 else
1868 prev_prev_nop = 0;
1869
1870 if (prev_prev_insn_unreordered)
1871 prev_prev_nop = 0;
1872
1873 if (prev_prev_nop && nops == 0)
1874 ++nops;
1875
60b63b72
RS
1876 if (mips_fix_4122_bugs && prev_insn.insn_mo->name)
1877 {
1878 /* We're out of bits in pinfo, so we must resort to string
1879 ops here. Shortcuts are selected based on opcodes being
1880 limited to the VR4122 instruction set. */
1881 int min_nops = 0;
1882 const char *pn = prev_insn.insn_mo->name;
1883 const char *tn = ip->insn_mo->name;
1884 if (strncmp(pn, "macc", 4) == 0
1885 || strncmp(pn, "dmacc", 5) == 0)
1886 {
1887 /* Errata 21 - [D]DIV[U] after [D]MACC */
1888 if (strstr (tn, "div"))
1889 {
1890 min_nops = 1;
1891 }
1892
1893 /* Errata 23 - Continuous DMULT[U]/DMACC instructions */
1894 if (pn[0] == 'd' /* dmacc */
1895 && (strncmp(tn, "dmult", 5) == 0
1896 || strncmp(tn, "dmacc", 5) == 0))
1897 {
1898 min_nops = 1;
1899 }
1900
1901 /* Errata 24 - MT{LO,HI} after [D]MACC */
1902 if (strcmp (tn, "mtlo") == 0
1903 || strcmp (tn, "mthi") == 0)
1904 {
1905 min_nops = 1;
1906 }
1907
1908 }
1909 else if (strncmp(pn, "dmult", 5) == 0
1910 && (strncmp(tn, "dmult", 5) == 0
1911 || strncmp(tn, "dmacc", 5) == 0))
1912 {
1913 /* Here is the rest of errata 23. */
1914 min_nops = 1;
1915 }
1916 if (nops < min_nops)
1917 nops = min_nops;
1918 }
1919
252b5132
RH
1920 /* If we are being given a nop instruction, don't bother with
1921 one of the nops we would otherwise output. This will only
1922 happen when a nop instruction is used with mips_optimize set
1923 to 0. */
1924 if (nops > 0
1925 && ! mips_opts.noreorder
156c2f8b 1926 && ip->insn_opcode == (unsigned) (mips_opts.mips16 ? 0x6500 : 0))
252b5132
RH
1927 --nops;
1928
1929 /* Now emit the right number of NOP instructions. */
1930 if (nops > 0 && ! mips_opts.noreorder)
1931 {
1932 fragS *old_frag;
1933 unsigned long old_frag_offset;
1934 int i;
1935 struct insn_label_list *l;
1936
1937 old_frag = frag_now;
1938 old_frag_offset = frag_now_fix ();
1939
1940 for (i = 0; i < nops; i++)
1941 emit_nop ();
1942
1943 if (listing)
1944 {
1945 listing_prev_line ();
1946 /* We may be at the start of a variant frag. In case we
1947 are, make sure there is enough space for the frag
1948 after the frags created by listing_prev_line. The
1949 argument to frag_grow here must be at least as large
1950 as the argument to all other calls to frag_grow in
1951 this file. We don't have to worry about being in the
1952 middle of a variant frag, because the variants insert
1953 all needed nop instructions themselves. */
1954 frag_grow (40);
1955 }
1956
1957 for (l = insn_labels; l != NULL; l = l->next)
1958 {
98aa84af
AM
1959 valueT val;
1960
252b5132 1961 assert (S_GET_SEGMENT (l->label) == now_seg);
49309057 1962 symbol_set_frag (l->label, frag_now);
98aa84af 1963 val = (valueT) frag_now_fix ();
252b5132
RH
1964 /* mips16 text labels are stored as odd. */
1965 if (mips_opts.mips16)
f9419b05 1966 ++val;
98aa84af 1967 S_SET_VALUE (l->label, val);
252b5132
RH
1968 }
1969
1970#ifndef NO_ECOFF_DEBUGGING
1971 if (ECOFF_DEBUGGING)
1972 ecoff_fix_loc (old_frag, old_frag_offset);
1973#endif
1974 }
1975 else if (prev_nop_frag != NULL)
1976 {
1977 /* We have a frag holding nops we may be able to remove. If
1978 we don't need any nops, we can decrease the size of
1979 prev_nop_frag by the size of one instruction. If we do
bdaaa2e1 1980 need some nops, we count them in prev_nops_required. */
252b5132
RH
1981 if (prev_nop_frag_since == 0)
1982 {
1983 if (nops == 0)
1984 {
1985 prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
1986 --prev_nop_frag_holds;
1987 }
1988 else
1989 prev_nop_frag_required += nops;
1990 }
1991 else
1992 {
1993 if (prev_prev_nop == 0)
1994 {
1995 prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
1996 --prev_nop_frag_holds;
1997 }
1998 else
1999 ++prev_nop_frag_required;
2000 }
2001
2002 if (prev_nop_frag_holds <= prev_nop_frag_required)
2003 prev_nop_frag = NULL;
2004
2005 ++prev_nop_frag_since;
2006
2007 /* Sanity check: by the time we reach the second instruction
2008 after prev_nop_frag, we should have used up all the nops
2009 one way or another. */
2010 assert (prev_nop_frag_since <= 1 || prev_nop_frag == NULL);
2011 }
2012 }
2013
4a6a3df4
AO
2014 if (place == NULL
2015 && address_expr
af6ae2ad 2016 && *reloc_type == BFD_RELOC_16_PCREL_S2
4a6a3df4
AO
2017 && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
2018 || pinfo & INSN_COND_BRANCH_LIKELY)
2019 && mips_relax_branch
2020 /* Don't try branch relaxation within .set nomacro, or within
2021 .set noat if we use $at for PIC computations. If it turns
2022 out that the branch was out-of-range, we'll get an error. */
2023 && !mips_opts.warn_about_macros
2024 && !(mips_opts.noat && mips_pic != NO_PIC)
2025 && !mips_opts.mips16)
2026 {
2027 f = frag_var (rs_machine_dependent,
2028 relaxed_branch_length
2029 (NULL, NULL,
2030 (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2031 : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1 : 0), 4,
2032 RELAX_BRANCH_ENCODE
af6ae2ad 2033 (pinfo & INSN_UNCOND_BRANCH_DELAY,
4a6a3df4
AO
2034 pinfo & INSN_COND_BRANCH_LIKELY,
2035 pinfo & INSN_WRITE_GPR_31,
2036 0),
2037 address_expr->X_add_symbol,
2038 address_expr->X_add_number,
2039 0);
2040 *reloc_type = BFD_RELOC_UNUSED;
2041 }
2042 else if (*reloc_type > BFD_RELOC_UNUSED)
252b5132
RH
2043 {
2044 /* We need to set up a variant frag. */
2045 assert (mips_opts.mips16 && address_expr != NULL);
2046 f = frag_var (rs_machine_dependent, 4, 0,
f6688943 2047 RELAX_MIPS16_ENCODE (*reloc_type - BFD_RELOC_UNUSED,
252b5132
RH
2048 mips16_small, mips16_ext,
2049 (prev_pinfo
2050 & INSN_UNCOND_BRANCH_DELAY),
f6688943 2051 (*prev_insn_reloc_type
252b5132 2052 == BFD_RELOC_MIPS16_JMP)),
c4e7957c 2053 make_expr_symbol (address_expr), 0, NULL);
252b5132
RH
2054 }
2055 else if (place != NULL)
2056 f = place;
2057 else if (mips_opts.mips16
2058 && ! ip->use_extend
f6688943 2059 && *reloc_type != BFD_RELOC_MIPS16_JMP)
252b5132
RH
2060 {
2061 /* Make sure there is enough room to swap this instruction with
2062 a following jump instruction. */
2063 frag_grow (6);
2064 f = frag_more (2);
2065 }
2066 else
2067 {
2068 if (mips_opts.mips16
2069 && mips_opts.noreorder
2070 && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2071 as_warn (_("extended instruction in delay slot"));
2072
2073 f = frag_more (4);
2074 }
2075
f6688943
TS
2076 fixp[0] = fixp[1] = fixp[2] = NULL;
2077 if (address_expr != NULL && *reloc_type < BFD_RELOC_UNUSED)
252b5132
RH
2078 {
2079 if (address_expr->X_op == O_constant)
2080 {
4db1a35d 2081 valueT tmp;
f6688943
TS
2082
2083 switch (*reloc_type)
252b5132
RH
2084 {
2085 case BFD_RELOC_32:
2086 ip->insn_opcode |= address_expr->X_add_number;
2087 break;
2088
f6688943
TS
2089 case BFD_RELOC_MIPS_HIGHEST:
2090 tmp = (address_expr->X_add_number + 0x800080008000) >> 16;
2091 tmp >>= 16;
2092 ip->insn_opcode |= (tmp >> 16) & 0xffff;
2093 break;
2094
2095 case BFD_RELOC_MIPS_HIGHER:
2096 tmp = (address_expr->X_add_number + 0x80008000) >> 16;
2097 ip->insn_opcode |= (tmp >> 16) & 0xffff;
2098 break;
2099
2100 case BFD_RELOC_HI16_S:
2101 ip->insn_opcode |= ((address_expr->X_add_number + 0x8000)
2102 >> 16) & 0xffff;
2103 break;
2104
2105 case BFD_RELOC_HI16:
2106 ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
2107 break;
2108
252b5132 2109 case BFD_RELOC_LO16:
ed6fb7bd 2110 case BFD_RELOC_MIPS_GOT_DISP:
252b5132
RH
2111 ip->insn_opcode |= address_expr->X_add_number & 0xffff;
2112 break;
2113
2114 case BFD_RELOC_MIPS_JMP:
2115 if ((address_expr->X_add_number & 3) != 0)
2116 as_bad (_("jump to misaligned address (0x%lx)"),
2117 (unsigned long) address_expr->X_add_number);
f3c0ec86 2118 if (address_expr->X_add_number & ~0xfffffff)
7496292d
TS
2119 as_bad (_("jump address range overflow (0x%lx)"),
2120 (unsigned long) address_expr->X_add_number);
252b5132
RH
2121 ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
2122 break;
2123
2124 case BFD_RELOC_MIPS16_JMP:
2125 if ((address_expr->X_add_number & 3) != 0)
2126 as_bad (_("jump to misaligned address (0x%lx)"),
2127 (unsigned long) address_expr->X_add_number);
f3c0ec86 2128 if (address_expr->X_add_number & ~0xfffffff)
7496292d
TS
2129 as_bad (_("jump address range overflow (0x%lx)"),
2130 (unsigned long) address_expr->X_add_number);
252b5132
RH
2131 ip->insn_opcode |=
2132 (((address_expr->X_add_number & 0x7c0000) << 3)
2133 | ((address_expr->X_add_number & 0xf800000) >> 7)
2134 | ((address_expr->X_add_number & 0x3fffc) >> 2));
2135 break;
2136
252b5132
RH
2137 case BFD_RELOC_16_PCREL_S2:
2138 goto need_reloc;
2139
2140 default:
2141 internalError ();
2142 }
2143 }
2144 else
2145 {
2146 need_reloc:
f6688943 2147 /* Don't generate a reloc if we are writing into a variant frag. */
252b5132
RH
2148 if (place == NULL)
2149 {
f6688943
TS
2150 fixp[0] = fix_new_exp (frag_now, f - frag_now->fr_literal, 4,
2151 address_expr,
af6ae2ad 2152 *reloc_type == BFD_RELOC_16_PCREL_S2,
f6688943
TS
2153 reloc_type[0]);
2154
b6ff326e 2155 /* These relocations can have an addend that won't fit in
f6688943
TS
2156 4 octets for 64bit assembly. */
2157 if (HAVE_64BIT_GPRS &&
2158 (*reloc_type == BFD_RELOC_16
98d3f06f
KH
2159 || *reloc_type == BFD_RELOC_32
2160 || *reloc_type == BFD_RELOC_MIPS_JMP
2161 || *reloc_type == BFD_RELOC_HI16_S
2162 || *reloc_type == BFD_RELOC_LO16
2163 || *reloc_type == BFD_RELOC_GPREL16
2164 || *reloc_type == BFD_RELOC_MIPS_LITERAL
2165 || *reloc_type == BFD_RELOC_GPREL32
2166 || *reloc_type == BFD_RELOC_64
2167 || *reloc_type == BFD_RELOC_CTOR
2168 || *reloc_type == BFD_RELOC_MIPS_SUB
2169 || *reloc_type == BFD_RELOC_MIPS_HIGHEST
2170 || *reloc_type == BFD_RELOC_MIPS_HIGHER
2171 || *reloc_type == BFD_RELOC_MIPS_SCN_DISP
2172 || *reloc_type == BFD_RELOC_MIPS_REL16
2173 || *reloc_type == BFD_RELOC_MIPS_RELGOT))
f6688943
TS
2174 fixp[0]->fx_no_overflow = 1;
2175
5919d012 2176 if (reloc_needs_lo_p (*reloc_type))
252b5132
RH
2177 {
2178 struct mips_hi_fixup *hi_fixup;
2179
5919d012
RS
2180 /* Reuse the last entry if it already has a matching %lo. */
2181 hi_fixup = mips_hi_fixup_list;
2182 if (hi_fixup == 0
2183 || !fixup_has_matching_lo_p (hi_fixup->fixp))
2184 {
2185 hi_fixup = ((struct mips_hi_fixup *)
2186 xmalloc (sizeof (struct mips_hi_fixup)));
2187 hi_fixup->next = mips_hi_fixup_list;
2188 mips_hi_fixup_list = hi_fixup;
2189 }
f6688943 2190 hi_fixup->fixp = fixp[0];
252b5132 2191 hi_fixup->seg = now_seg;
252b5132 2192 }
f6688943
TS
2193
2194 if (reloc_type[1] != BFD_RELOC_UNUSED)
2195 {
2196 /* FIXME: This symbol can be one of
2197 RSS_UNDEF, RSS_GP, RSS_GP0, RSS_LOC. */
2198 address_expr->X_op = O_absent;
2199 address_expr->X_add_symbol = 0;
2200 address_expr->X_add_number = 0;
2201
2202 fixp[1] = fix_new_exp (frag_now, f - frag_now->fr_literal,
b34976b6 2203 4, address_expr, FALSE,
f6688943
TS
2204 reloc_type[1]);
2205
b6ff326e 2206 /* These relocations can have an addend that won't fit in
f6688943
TS
2207 4 octets for 64bit assembly. */
2208 if (HAVE_64BIT_GPRS &&
2209 (*reloc_type == BFD_RELOC_16
2210 || *reloc_type == BFD_RELOC_32
2211 || *reloc_type == BFD_RELOC_MIPS_JMP
2212 || *reloc_type == BFD_RELOC_HI16_S
2213 || *reloc_type == BFD_RELOC_LO16
2214 || *reloc_type == BFD_RELOC_GPREL16
2215 || *reloc_type == BFD_RELOC_MIPS_LITERAL
2216 || *reloc_type == BFD_RELOC_GPREL32
2217 || *reloc_type == BFD_RELOC_64
2218 || *reloc_type == BFD_RELOC_CTOR
2219 || *reloc_type == BFD_RELOC_MIPS_SUB
2220 || *reloc_type == BFD_RELOC_MIPS_HIGHEST
2221 || *reloc_type == BFD_RELOC_MIPS_HIGHER
2222 || *reloc_type == BFD_RELOC_MIPS_SCN_DISP
2223 || *reloc_type == BFD_RELOC_MIPS_REL16
2224 || *reloc_type == BFD_RELOC_MIPS_RELGOT))
98d3f06f 2225 fixp[1]->fx_no_overflow = 1;
f6688943
TS
2226
2227 if (reloc_type[2] != BFD_RELOC_UNUSED)
2228 {
2229 address_expr->X_op = O_absent;
2230 address_expr->X_add_symbol = 0;
2231 address_expr->X_add_number = 0;
2232
2233 fixp[2] = fix_new_exp (frag_now,
2234 f - frag_now->fr_literal, 4,
b34976b6 2235 address_expr, FALSE,
f6688943
TS
2236 reloc_type[2]);
2237
b6ff326e 2238 /* These relocations can have an addend that won't fit in
f6688943
TS
2239 4 octets for 64bit assembly. */
2240 if (HAVE_64BIT_GPRS &&
2241 (*reloc_type == BFD_RELOC_16
2242 || *reloc_type == BFD_RELOC_32
2243 || *reloc_type == BFD_RELOC_MIPS_JMP
2244 || *reloc_type == BFD_RELOC_HI16_S
2245 || *reloc_type == BFD_RELOC_LO16
2246 || *reloc_type == BFD_RELOC_GPREL16
2247 || *reloc_type == BFD_RELOC_MIPS_LITERAL
2248 || *reloc_type == BFD_RELOC_GPREL32
2249 || *reloc_type == BFD_RELOC_64
2250 || *reloc_type == BFD_RELOC_CTOR
2251 || *reloc_type == BFD_RELOC_MIPS_SUB
2252 || *reloc_type == BFD_RELOC_MIPS_HIGHEST
2253 || *reloc_type == BFD_RELOC_MIPS_HIGHER
2254 || *reloc_type == BFD_RELOC_MIPS_SCN_DISP
2255 || *reloc_type == BFD_RELOC_MIPS_REL16
2256 || *reloc_type == BFD_RELOC_MIPS_RELGOT))
98d3f06f 2257 fixp[2]->fx_no_overflow = 1;
f6688943
TS
2258 }
2259 }
252b5132
RH
2260 }
2261 }
2262 }
2263
2264 if (! mips_opts.mips16)
c5dd6aab
DJ
2265 {
2266 md_number_to_chars (f, ip->insn_opcode, 4);
2267#ifdef OBJ_ELF
2268 dwarf2_emit_insn (4);
2269#endif
2270 }
f6688943 2271 else if (*reloc_type == BFD_RELOC_MIPS16_JMP)
252b5132
RH
2272 {
2273 md_number_to_chars (f, ip->insn_opcode >> 16, 2);
2274 md_number_to_chars (f + 2, ip->insn_opcode & 0xffff, 2);
c5dd6aab
DJ
2275#ifdef OBJ_ELF
2276 dwarf2_emit_insn (4);
2277#endif
252b5132
RH
2278 }
2279 else
2280 {
2281 if (ip->use_extend)
2282 {
2283 md_number_to_chars (f, 0xf000 | ip->extend, 2);
2284 f += 2;
2285 }
2286 md_number_to_chars (f, ip->insn_opcode, 2);
c5dd6aab
DJ
2287#ifdef OBJ_ELF
2288 dwarf2_emit_insn (ip->use_extend ? 4 : 2);
2289#endif
252b5132
RH
2290 }
2291
2292 /* Update the register mask information. */
2293 if (! mips_opts.mips16)
2294 {
2295 if (pinfo & INSN_WRITE_GPR_D)
2296 mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD);
2297 if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
2298 mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RT) & OP_MASK_RT);
2299 if (pinfo & INSN_READ_GPR_S)
2300 mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RS) & OP_MASK_RS);
2301 if (pinfo & INSN_WRITE_GPR_31)
f9419b05 2302 mips_gprmask |= 1 << RA;
252b5132
RH
2303 if (pinfo & INSN_WRITE_FPR_D)
2304 mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FD) & OP_MASK_FD);
2305 if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
2306 mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FS) & OP_MASK_FS);
2307 if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
2308 mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FT) & OP_MASK_FT);
2309 if ((pinfo & INSN_READ_FPR_R) != 0)
2310 mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FR) & OP_MASK_FR);
2311 if (pinfo & INSN_COP)
2312 {
bdaaa2e1
KH
2313 /* We don't keep enough information to sort these cases out.
2314 The itbl support does keep this information however, although
2315 we currently don't support itbl fprmats as part of the cop
2316 instruction. May want to add this support in the future. */
252b5132
RH
2317 }
2318 /* Never set the bit for $0, which is always zero. */
beae10d5 2319 mips_gprmask &= ~1 << 0;
252b5132
RH
2320 }
2321 else
2322 {
2323 if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
2324 mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_RX)
2325 & MIPS16OP_MASK_RX);
2326 if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
2327 mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_RY)
2328 & MIPS16OP_MASK_RY);
2329 if (pinfo & MIPS16_INSN_WRITE_Z)
2330 mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_RZ)
2331 & MIPS16OP_MASK_RZ);
2332 if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
2333 mips_gprmask |= 1 << TREG;
2334 if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
2335 mips_gprmask |= 1 << SP;
2336 if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
2337 mips_gprmask |= 1 << RA;
2338 if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
2339 mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
2340 if (pinfo & MIPS16_INSN_READ_Z)
2341 mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_MOVE32Z)
2342 & MIPS16OP_MASK_MOVE32Z);
2343 if (pinfo & MIPS16_INSN_READ_GPR_X)
2344 mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_REGR32)
2345 & MIPS16OP_MASK_REGR32);
2346 }
2347
2348 if (place == NULL && ! mips_opts.noreorder)
2349 {
2350 /* Filling the branch delay slot is more complex. We try to
2351 switch the branch with the previous instruction, which we can
2352 do if the previous instruction does not set up a condition
2353 that the branch tests and if the branch is not itself the
2354 target of any branch. */
2355 if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
2356 || (pinfo & INSN_COND_BRANCH_DELAY))
2357 {
2358 if (mips_optimize < 2
2359 /* If we have seen .set volatile or .set nomove, don't
2360 optimize. */
2361 || mips_opts.nomove != 0
2362 /* If we had to emit any NOP instructions, then we
2363 already know we can not swap. */
2364 || nops != 0
2365 /* If we don't even know the previous insn, we can not
bdaaa2e1 2366 swap. */
252b5132
RH
2367 || ! prev_insn_valid
2368 /* If the previous insn is already in a branch delay
2369 slot, then we can not swap. */
2370 || prev_insn_is_delay_slot
2371 /* If the previous previous insn was in a .set
2372 noreorder, we can't swap. Actually, the MIPS
2373 assembler will swap in this situation. However, gcc
2374 configured -with-gnu-as will generate code like
2375 .set noreorder
2376 lw $4,XXX
2377 .set reorder
2378 INSN
2379 bne $4,$0,foo
2380 in which we can not swap the bne and INSN. If gcc is
2381 not configured -with-gnu-as, it does not output the
2382 .set pseudo-ops. We don't have to check
2383 prev_insn_unreordered, because prev_insn_valid will
2384 be 0 in that case. We don't want to use
2385 prev_prev_insn_valid, because we do want to be able
2386 to swap at the start of a function. */
2387 || prev_prev_insn_unreordered
2388 /* If the branch is itself the target of a branch, we
2389 can not swap. We cheat on this; all we check for is
2390 whether there is a label on this instruction. If
2391 there are any branches to anything other than a
2392 label, users must use .set noreorder. */
2393 || insn_labels != NULL
2394 /* If the previous instruction is in a variant frag, we
2395 can not do the swap. This does not apply to the
2396 mips16, which uses variant frags for different
2397 purposes. */
2398 || (! mips_opts.mips16
2399 && prev_insn_frag->fr_type == rs_machine_dependent)
2400 /* If the branch reads the condition codes, we don't
2401 even try to swap, because in the sequence
2402 ctc1 $X,$31
2403 INSN
2404 INSN
2405 bc1t LABEL
2406 we can not swap, and I don't feel like handling that
2407 case. */
2408 || (! mips_opts.mips16
9ce8a5dd 2409 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
252b5132
RH
2410 && (pinfo & INSN_READ_COND_CODE))
2411 /* We can not swap with an instruction that requires a
2412 delay slot, becase the target of the branch might
2413 interfere with that instruction. */
2414 || (! mips_opts.mips16
9ce8a5dd 2415 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
252b5132 2416 && (prev_pinfo
bdaaa2e1 2417 /* Itbl support may require additional care here. */
252b5132
RH
2418 & (INSN_LOAD_COPROC_DELAY
2419 | INSN_COPROC_MOVE_DELAY
2420 | INSN_WRITE_COND_CODE)))
2421 || (! (hilo_interlocks
ec68c924 2422 || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT)))
252b5132
RH
2423 && (prev_pinfo
2424 & (INSN_READ_LO
2425 | INSN_READ_HI)))
2426 || (! mips_opts.mips16
2427 && ! gpr_interlocks
2428 && (prev_pinfo & INSN_LOAD_MEMORY_DELAY))
2429 || (! mips_opts.mips16
e7af610e 2430 && mips_opts.isa == ISA_MIPS1
bdaaa2e1 2431 /* Itbl support may require additional care here. */
252b5132
RH
2432 && (prev_pinfo & INSN_COPROC_MEMORY_DELAY))
2433 /* We can not swap with a branch instruction. */
2434 || (prev_pinfo
2435 & (INSN_UNCOND_BRANCH_DELAY
2436 | INSN_COND_BRANCH_DELAY
2437 | INSN_COND_BRANCH_LIKELY))
2438 /* We do not swap with a trap instruction, since it
2439 complicates trap handlers to have the trap
2440 instruction be in a delay slot. */
2441 || (prev_pinfo & INSN_TRAP)
2442 /* If the branch reads a register that the previous
2443 instruction sets, we can not swap. */
2444 || (! mips_opts.mips16
2445 && (prev_pinfo & INSN_WRITE_GPR_T)
2446 && insn_uses_reg (ip,
2447 ((prev_insn.insn_opcode >> OP_SH_RT)
2448 & OP_MASK_RT),
2449 MIPS_GR_REG))
2450 || (! mips_opts.mips16
2451 && (prev_pinfo & INSN_WRITE_GPR_D)
2452 && insn_uses_reg (ip,
2453 ((prev_insn.insn_opcode >> OP_SH_RD)
2454 & OP_MASK_RD),
2455 MIPS_GR_REG))
2456 || (mips_opts.mips16
2457 && (((prev_pinfo & MIPS16_INSN_WRITE_X)
2458 && insn_uses_reg (ip,
2459 ((prev_insn.insn_opcode
2460 >> MIPS16OP_SH_RX)
2461 & MIPS16OP_MASK_RX),
2462 MIPS16_REG))
2463 || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
2464 && insn_uses_reg (ip,
2465 ((prev_insn.insn_opcode
2466 >> MIPS16OP_SH_RY)
2467 & MIPS16OP_MASK_RY),
2468 MIPS16_REG))
2469 || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
2470 && insn_uses_reg (ip,
2471 ((prev_insn.insn_opcode
2472 >> MIPS16OP_SH_RZ)
2473 & MIPS16OP_MASK_RZ),
2474 MIPS16_REG))
2475 || ((prev_pinfo & MIPS16_INSN_WRITE_T)
2476 && insn_uses_reg (ip, TREG, MIPS_GR_REG))
2477 || ((prev_pinfo & MIPS16_INSN_WRITE_31)
2478 && insn_uses_reg (ip, RA, MIPS_GR_REG))
2479 || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
2480 && insn_uses_reg (ip,
2481 MIPS16OP_EXTRACT_REG32R (prev_insn.
2482 insn_opcode),
2483 MIPS_GR_REG))))
2484 /* If the branch writes a register that the previous
2485 instruction sets, we can not swap (we know that
2486 branches write only to RD or to $31). */
2487 || (! mips_opts.mips16
2488 && (prev_pinfo & INSN_WRITE_GPR_T)
2489 && (((pinfo & INSN_WRITE_GPR_D)
2490 && (((prev_insn.insn_opcode >> OP_SH_RT) & OP_MASK_RT)
2491 == ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD)))
2492 || ((pinfo & INSN_WRITE_GPR_31)
2493 && (((prev_insn.insn_opcode >> OP_SH_RT)
2494 & OP_MASK_RT)
f9419b05 2495 == RA))))
252b5132
RH
2496 || (! mips_opts.mips16
2497 && (prev_pinfo & INSN_WRITE_GPR_D)
2498 && (((pinfo & INSN_WRITE_GPR_D)
2499 && (((prev_insn.insn_opcode >> OP_SH_RD) & OP_MASK_RD)
2500 == ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD)))
2501 || ((pinfo & INSN_WRITE_GPR_31)
2502 && (((prev_insn.insn_opcode >> OP_SH_RD)
2503 & OP_MASK_RD)
f9419b05 2504 == RA))))
252b5132
RH
2505 || (mips_opts.mips16
2506 && (pinfo & MIPS16_INSN_WRITE_31)
2507 && ((prev_pinfo & MIPS16_INSN_WRITE_31)
2508 || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
2509 && (MIPS16OP_EXTRACT_REG32R (prev_insn.insn_opcode)
2510 == RA))))
2511 /* If the branch writes a register that the previous
2512 instruction reads, we can not swap (we know that
2513 branches only write to RD or to $31). */
2514 || (! mips_opts.mips16
2515 && (pinfo & INSN_WRITE_GPR_D)
2516 && insn_uses_reg (&prev_insn,
2517 ((ip->insn_opcode >> OP_SH_RD)
2518 & OP_MASK_RD),
2519 MIPS_GR_REG))
2520 || (! mips_opts.mips16
2521 && (pinfo & INSN_WRITE_GPR_31)
f9419b05 2522 && insn_uses_reg (&prev_insn, RA, MIPS_GR_REG))
252b5132
RH
2523 || (mips_opts.mips16
2524 && (pinfo & MIPS16_INSN_WRITE_31)
2525 && insn_uses_reg (&prev_insn, RA, MIPS_GR_REG))
2526 /* If we are generating embedded PIC code, the branch
2527 might be expanded into a sequence which uses $at, so
2528 we can't swap with an instruction which reads it. */
2529 || (mips_pic == EMBEDDED_PIC
2530 && insn_uses_reg (&prev_insn, AT, MIPS_GR_REG))
2531 /* If the previous previous instruction has a load
2532 delay, and sets a register that the branch reads, we
2533 can not swap. */
2534 || (! mips_opts.mips16
9ce8a5dd 2535 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
bdaaa2e1 2536 /* Itbl support may require additional care here. */
252b5132
RH
2537 && ((prev_prev_insn.insn_mo->pinfo & INSN_LOAD_COPROC_DELAY)
2538 || (! gpr_interlocks
2539 && (prev_prev_insn.insn_mo->pinfo
2540 & INSN_LOAD_MEMORY_DELAY)))
2541 && insn_uses_reg (ip,
2542 ((prev_prev_insn.insn_opcode >> OP_SH_RT)
2543 & OP_MASK_RT),
2544 MIPS_GR_REG))
2545 /* If one instruction sets a condition code and the
2546 other one uses a condition code, we can not swap. */
2547 || ((pinfo & INSN_READ_COND_CODE)
2548 && (prev_pinfo & INSN_WRITE_COND_CODE))
2549 || ((pinfo & INSN_WRITE_COND_CODE)
2550 && (prev_pinfo & INSN_READ_COND_CODE))
2551 /* If the previous instruction uses the PC, we can not
2552 swap. */
2553 || (mips_opts.mips16
2554 && (prev_pinfo & MIPS16_INSN_READ_PC))
2555 /* If the previous instruction was extended, we can not
2556 swap. */
2557 || (mips_opts.mips16 && prev_insn_extended)
2558 /* If the previous instruction had a fixup in mips16
2559 mode, we can not swap. This normally means that the
2560 previous instruction was a 4 byte branch anyhow. */
f6688943 2561 || (mips_opts.mips16 && prev_insn_fixp[0])
bdaaa2e1
KH
2562 /* If the previous instruction is a sync, sync.l, or
2563 sync.p, we can not swap. */
f173e82e 2564 || (prev_pinfo & INSN_SYNC))
252b5132
RH
2565 {
2566 /* We could do even better for unconditional branches to
2567 portions of this object file; we could pick up the
2568 instruction at the destination, put it in the delay
2569 slot, and bump the destination address. */
2570 emit_nop ();
2571 /* Update the previous insn information. */
2572 prev_prev_insn = *ip;
2573 prev_insn.insn_mo = &dummy_opcode;
2574 }
2575 else
2576 {
2577 /* It looks like we can actually do the swap. */
2578 if (! mips_opts.mips16)
2579 {
2580 char *prev_f;
2581 char temp[4];
2582
2583 prev_f = prev_insn_frag->fr_literal + prev_insn_where;
2584 memcpy (temp, prev_f, 4);
2585 memcpy (prev_f, f, 4);
2586 memcpy (f, temp, 4);
f6688943
TS
2587 if (prev_insn_fixp[0])
2588 {
2589 prev_insn_fixp[0]->fx_frag = frag_now;
2590 prev_insn_fixp[0]->fx_where = f - frag_now->fr_literal;
2591 }
2592 if (prev_insn_fixp[1])
2593 {
2594 prev_insn_fixp[1]->fx_frag = frag_now;
2595 prev_insn_fixp[1]->fx_where = f - frag_now->fr_literal;
2596 }
2597 if (prev_insn_fixp[2])
252b5132 2598 {
f6688943
TS
2599 prev_insn_fixp[2]->fx_frag = frag_now;
2600 prev_insn_fixp[2]->fx_where = f - frag_now->fr_literal;
252b5132 2601 }
f6688943 2602 if (fixp[0])
252b5132 2603 {
f6688943
TS
2604 fixp[0]->fx_frag = prev_insn_frag;
2605 fixp[0]->fx_where = prev_insn_where;
2606 }
2607 if (fixp[1])
2608 {
2609 fixp[1]->fx_frag = prev_insn_frag;
2610 fixp[1]->fx_where = prev_insn_where;
2611 }
2612 if (fixp[2])
2613 {
2614 fixp[2]->fx_frag = prev_insn_frag;
2615 fixp[2]->fx_where = prev_insn_where;
252b5132
RH
2616 }
2617 }
2618 else
2619 {
2620 char *prev_f;
2621 char temp[2];
2622
f6688943
TS
2623 assert (prev_insn_fixp[0] == NULL);
2624 assert (prev_insn_fixp[1] == NULL);
2625 assert (prev_insn_fixp[2] == NULL);
252b5132
RH
2626 prev_f = prev_insn_frag->fr_literal + prev_insn_where;
2627 memcpy (temp, prev_f, 2);
2628 memcpy (prev_f, f, 2);
f6688943 2629 if (*reloc_type != BFD_RELOC_MIPS16_JMP)
252b5132 2630 {
f6688943 2631 assert (*reloc_type == BFD_RELOC_UNUSED);
252b5132
RH
2632 memcpy (f, temp, 2);
2633 }
2634 else
2635 {
2636 memcpy (f, f + 2, 2);
2637 memcpy (f + 2, temp, 2);
2638 }
f6688943
TS
2639 if (fixp[0])
2640 {
2641 fixp[0]->fx_frag = prev_insn_frag;
2642 fixp[0]->fx_where = prev_insn_where;
2643 }
2644 if (fixp[1])
2645 {
2646 fixp[1]->fx_frag = prev_insn_frag;
2647 fixp[1]->fx_where = prev_insn_where;
2648 }
2649 if (fixp[2])
252b5132 2650 {
f6688943
TS
2651 fixp[2]->fx_frag = prev_insn_frag;
2652 fixp[2]->fx_where = prev_insn_where;
252b5132
RH
2653 }
2654 }
2655
2656 /* Update the previous insn information; leave prev_insn
2657 unchanged. */
2658 prev_prev_insn = *ip;
2659 }
2660 prev_insn_is_delay_slot = 1;
2661
2662 /* If that was an unconditional branch, forget the previous
2663 insn information. */
2664 if (pinfo & INSN_UNCOND_BRANCH_DELAY)
2665 {
2666 prev_prev_insn.insn_mo = &dummy_opcode;
2667 prev_insn.insn_mo = &dummy_opcode;
2668 }
2669
f6688943
TS
2670 prev_insn_fixp[0] = NULL;
2671 prev_insn_fixp[1] = NULL;
2672 prev_insn_fixp[2] = NULL;
2673 prev_insn_reloc_type[0] = BFD_RELOC_UNUSED;
2674 prev_insn_reloc_type[1] = BFD_RELOC_UNUSED;
2675 prev_insn_reloc_type[2] = BFD_RELOC_UNUSED;
252b5132
RH
2676 prev_insn_extended = 0;
2677 }
2678 else if (pinfo & INSN_COND_BRANCH_LIKELY)
2679 {
2680 /* We don't yet optimize a branch likely. What we should do
2681 is look at the target, copy the instruction found there
2682 into the delay slot, and increment the branch to jump to
2683 the next instruction. */
2684 emit_nop ();
2685 /* Update the previous insn information. */
2686 prev_prev_insn = *ip;
2687 prev_insn.insn_mo = &dummy_opcode;
f6688943
TS
2688 prev_insn_fixp[0] = NULL;
2689 prev_insn_fixp[1] = NULL;
2690 prev_insn_fixp[2] = NULL;
2691 prev_insn_reloc_type[0] = BFD_RELOC_UNUSED;
2692 prev_insn_reloc_type[1] = BFD_RELOC_UNUSED;
2693 prev_insn_reloc_type[2] = BFD_RELOC_UNUSED;
252b5132
RH
2694 prev_insn_extended = 0;
2695 }
2696 else
2697 {
2698 /* Update the previous insn information. */
2699 if (nops > 0)
2700 prev_prev_insn.insn_mo = &dummy_opcode;
2701 else
2702 prev_prev_insn = prev_insn;
2703 prev_insn = *ip;
2704
2705 /* Any time we see a branch, we always fill the delay slot
2706 immediately; since this insn is not a branch, we know it
2707 is not in a delay slot. */
2708 prev_insn_is_delay_slot = 0;
2709
f6688943
TS
2710 prev_insn_fixp[0] = fixp[0];
2711 prev_insn_fixp[1] = fixp[1];
2712 prev_insn_fixp[2] = fixp[2];
2713 prev_insn_reloc_type[0] = reloc_type[0];
2714 prev_insn_reloc_type[1] = reloc_type[1];
2715 prev_insn_reloc_type[2] = reloc_type[2];
252b5132
RH
2716 if (mips_opts.mips16)
2717 prev_insn_extended = (ip->use_extend
f6688943 2718 || *reloc_type > BFD_RELOC_UNUSED);
252b5132
RH
2719 }
2720
2721 prev_prev_insn_unreordered = prev_insn_unreordered;
2722 prev_insn_unreordered = 0;
2723 prev_insn_frag = frag_now;
2724 prev_insn_where = f - frag_now->fr_literal;
2725 prev_insn_valid = 1;
2726 }
2727 else if (place == NULL)
2728 {
2729 /* We need to record a bit of information even when we are not
2730 reordering, in order to determine the base address for mips16
2731 PC relative relocs. */
2732 prev_prev_insn = prev_insn;
2733 prev_insn = *ip;
f6688943
TS
2734 prev_insn_reloc_type[0] = reloc_type[0];
2735 prev_insn_reloc_type[1] = reloc_type[1];
2736 prev_insn_reloc_type[2] = reloc_type[2];
252b5132
RH
2737 prev_prev_insn_unreordered = prev_insn_unreordered;
2738 prev_insn_unreordered = 1;
2739 }
2740
2741 /* We just output an insn, so the next one doesn't have a label. */
2742 mips_clear_insn_labels ();
252b5132
RH
2743}
2744
2745/* This function forgets that there was any previous instruction or
2746 label. If PRESERVE is non-zero, it remembers enough information to
bdaaa2e1 2747 know whether nops are needed before a noreorder section. */
252b5132
RH
2748
2749static void
2750mips_no_prev_insn (preserve)
2751 int preserve;
2752{
2753 if (! preserve)
2754 {
2755 prev_insn.insn_mo = &dummy_opcode;
2756 prev_prev_insn.insn_mo = &dummy_opcode;
2757 prev_nop_frag = NULL;
2758 prev_nop_frag_holds = 0;
2759 prev_nop_frag_required = 0;
2760 prev_nop_frag_since = 0;
2761 }
2762 prev_insn_valid = 0;
2763 prev_insn_is_delay_slot = 0;
2764 prev_insn_unreordered = 0;
2765 prev_insn_extended = 0;
f6688943
TS
2766 prev_insn_reloc_type[0] = BFD_RELOC_UNUSED;
2767 prev_insn_reloc_type[1] = BFD_RELOC_UNUSED;
2768 prev_insn_reloc_type[2] = BFD_RELOC_UNUSED;
252b5132
RH
2769 prev_prev_insn_unreordered = 0;
2770 mips_clear_insn_labels ();
2771}
2772
2773/* This function must be called whenever we turn on noreorder or emit
2774 something other than instructions. It inserts any NOPS which might
2775 be needed by the previous instruction, and clears the information
2776 kept for the previous instructions. The INSNS parameter is true if
bdaaa2e1 2777 instructions are to follow. */
252b5132
RH
2778
2779static void
2780mips_emit_delays (insns)
b34976b6 2781 bfd_boolean insns;
252b5132
RH
2782{
2783 if (! mips_opts.noreorder)
2784 {
2785 int nops;
2786
2787 nops = 0;
2788 if ((! mips_opts.mips16
9ce8a5dd 2789 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
252b5132
RH
2790 && (! cop_interlocks
2791 && (prev_insn.insn_mo->pinfo
2792 & (INSN_LOAD_COPROC_DELAY
2793 | INSN_COPROC_MOVE_DELAY
2794 | INSN_WRITE_COND_CODE))))
2795 || (! hilo_interlocks
2796 && (prev_insn.insn_mo->pinfo
2797 & (INSN_READ_LO
2798 | INSN_READ_HI)))
2799 || (! mips_opts.mips16
2800 && ! gpr_interlocks
bdaaa2e1 2801 && (prev_insn.insn_mo->pinfo
252b5132
RH
2802 & INSN_LOAD_MEMORY_DELAY))
2803 || (! mips_opts.mips16
e7af610e 2804 && mips_opts.isa == ISA_MIPS1
252b5132
RH
2805 && (prev_insn.insn_mo->pinfo
2806 & INSN_COPROC_MEMORY_DELAY)))
2807 {
beae10d5 2808 /* Itbl support may require additional care here. */
252b5132
RH
2809 ++nops;
2810 if ((! mips_opts.mips16
9ce8a5dd 2811 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
252b5132
RH
2812 && (! cop_interlocks
2813 && prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE))
2814 || (! hilo_interlocks
2815 && ((prev_insn.insn_mo->pinfo & INSN_READ_HI)
2816 || (prev_insn.insn_mo->pinfo & INSN_READ_LO))))
2817 ++nops;
2818
2819 if (prev_insn_unreordered)
2820 nops = 0;
2821 }
2822 else if ((! mips_opts.mips16
9ce8a5dd 2823 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
252b5132
RH
2824 && (! cop_interlocks
2825 && prev_prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE))
2826 || (! hilo_interlocks
2827 && ((prev_prev_insn.insn_mo->pinfo & INSN_READ_HI)
2828 || (prev_prev_insn.insn_mo->pinfo & INSN_READ_LO))))
2829 {
beae10d5 2830 /* Itbl support may require additional care here. */
252b5132
RH
2831 if (! prev_prev_insn_unreordered)
2832 ++nops;
2833 }
2834
60b63b72
RS
2835 if (mips_fix_4122_bugs && prev_insn.insn_mo->name)
2836 {
2837 int min_nops = 0;
2838 const char *pn = prev_insn.insn_mo->name;
2839 if (strncmp(pn, "macc", 4) == 0
2840 || strncmp(pn, "dmacc", 5) == 0
2841 || strncmp(pn, "dmult", 5) == 0)
2842 {
2843 min_nops = 1;
2844 }
2845 if (nops < min_nops)
2846 nops = min_nops;
2847 }
2848
252b5132
RH
2849 if (nops > 0)
2850 {
2851 struct insn_label_list *l;
2852
2853 if (insns)
2854 {
2855 /* Record the frag which holds the nop instructions, so
2856 that we can remove them if we don't need them. */
2857 frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
2858 prev_nop_frag = frag_now;
2859 prev_nop_frag_holds = nops;
2860 prev_nop_frag_required = 0;
2861 prev_nop_frag_since = 0;
2862 }
2863
2864 for (; nops > 0; --nops)
2865 emit_nop ();
2866
2867 if (insns)
2868 {
2869 /* Move on to a new frag, so that it is safe to simply
bdaaa2e1 2870 decrease the size of prev_nop_frag. */
252b5132
RH
2871 frag_wane (frag_now);
2872 frag_new (0);
2873 }
2874
2875 for (l = insn_labels; l != NULL; l = l->next)
2876 {
98aa84af
AM
2877 valueT val;
2878
252b5132 2879 assert (S_GET_SEGMENT (l->label) == now_seg);
49309057 2880 symbol_set_frag (l->label, frag_now);
98aa84af 2881 val = (valueT) frag_now_fix ();
252b5132
RH
2882 /* mips16 text labels are stored as odd. */
2883 if (mips_opts.mips16)
f9419b05 2884 ++val;
98aa84af 2885 S_SET_VALUE (l->label, val);
252b5132
RH
2886 }
2887 }
2888 }
2889
2890 /* Mark instruction labels in mips16 mode. */
f9419b05 2891 if (insns)
252b5132
RH
2892 mips16_mark_labels ();
2893
2894 mips_no_prev_insn (insns);
2895}
2896
2897/* Build an instruction created by a macro expansion. This is passed
2898 a pointer to the count of instructions created so far, an
2899 expression, the name of the instruction to build, an operand format
2900 string, and corresponding arguments. */
2901
2902#ifdef USE_STDARG
2903static void
2904macro_build (char *place,
2905 int *counter,
2906 expressionS * ep,
2907 const char *name,
2908 const char *fmt,
2909 ...)
2910#else
2911static void
2912macro_build (place, counter, ep, name, fmt, va_alist)
2913 char *place;
2914 int *counter;
2915 expressionS *ep;
2916 const char *name;
2917 const char *fmt;
2918 va_dcl
2919#endif
2920{
2921 struct mips_cl_insn insn;
f6688943 2922 bfd_reloc_code_real_type r[3];
252b5132 2923 va_list args;
252b5132
RH
2924
2925#ifdef USE_STDARG
2926 va_start (args, fmt);
2927#else
2928 va_start (args);
2929#endif
2930
2931 /*
2932 * If the macro is about to expand into a second instruction,
2933 * print a warning if needed. We need to pass ip as a parameter
2934 * to generate a better warning message here...
2935 */
2936 if (mips_opts.warn_about_macros && place == NULL && *counter == 1)
2937 as_warn (_("Macro instruction expanded into multiple instructions"));
2938
80cc45a5
EC
2939 /*
2940 * If the macro is about to expand into a second instruction,
2941 * and it is in a delay slot, print a warning.
2942 */
2943 if (place == NULL
2944 && *counter == 1
2945 && mips_opts.noreorder
2946 && (prev_prev_insn.insn_mo->pinfo
2947 & (INSN_UNCOND_BRANCH_DELAY | INSN_COND_BRANCH_DELAY
2b2e39bf 2948 | INSN_COND_BRANCH_LIKELY)) != 0)
80cc45a5
EC
2949 as_warn (_("Macro instruction expanded into multiple instructions in a branch delay slot"));
2950
252b5132 2951 if (place == NULL)
f9419b05 2952 ++*counter; /* bump instruction counter */
252b5132
RH
2953
2954 if (mips_opts.mips16)
2955 {
2956 mips16_macro_build (place, counter, ep, name, fmt, args);
2957 va_end (args);
2958 return;
2959 }
2960
f6688943
TS
2961 r[0] = BFD_RELOC_UNUSED;
2962 r[1] = BFD_RELOC_UNUSED;
2963 r[2] = BFD_RELOC_UNUSED;
252b5132
RH
2964 insn.insn_mo = (struct mips_opcode *) hash_find (op_hash, name);
2965 assert (insn.insn_mo);
2966 assert (strcmp (name, insn.insn_mo->name) == 0);
2967
2968 /* Search until we get a match for NAME. */
2969 while (1)
2970 {
b34976b6 2971 /* It is assumed here that macros will never generate
deec1734 2972 MDMX or MIPS-3D instructions. */
252b5132
RH
2973 if (strcmp (fmt, insn.insn_mo->args) == 0
2974 && insn.insn_mo->pinfo != INSN_MACRO
aec421e0
TS
2975 && OPCODE_IS_MEMBER (insn.insn_mo,
2976 (mips_opts.isa
3396de36 2977 | (file_ase_mips16 ? INSN_MIPS16 : 0)),
aec421e0 2978 mips_arch)
ec68c924 2979 && (mips_arch != CPU_R4650 || (insn.insn_mo->pinfo & FP_D) == 0))
252b5132
RH
2980 break;
2981
2982 ++insn.insn_mo;
2983 assert (insn.insn_mo->name);
2984 assert (strcmp (name, insn.insn_mo->name) == 0);
2985 }
2986
2987 insn.insn_opcode = insn.insn_mo->match;
2988 for (;;)
2989 {
2990 switch (*fmt++)
2991 {
2992 case '\0':
2993 break;
2994
2995 case ',':
2996 case '(':
2997 case ')':
2998 continue;
2999
3000 case 't':
3001 case 'w':
3002 case 'E':
38487616 3003 insn.insn_opcode |= va_arg (args, int) << OP_SH_RT;
252b5132
RH
3004 continue;
3005
3006 case 'c':
38487616
TS
3007 insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE;
3008 continue;
3009
252b5132
RH
3010 case 'T':
3011 case 'W':
38487616 3012 insn.insn_opcode |= va_arg (args, int) << OP_SH_FT;
252b5132
RH
3013 continue;
3014
3015 case 'd':
3016 case 'G':
af7ee8bf 3017 case 'K':
38487616 3018 insn.insn_opcode |= va_arg (args, int) << OP_SH_RD;
252b5132
RH
3019 continue;
3020
4372b673
NC
3021 case 'U':
3022 {
3023 int tmp = va_arg (args, int);
3024
38487616
TS
3025 insn.insn_opcode |= tmp << OP_SH_RT;
3026 insn.insn_opcode |= tmp << OP_SH_RD;
beae10d5 3027 continue;
4372b673
NC
3028 }
3029
252b5132
RH
3030 case 'V':
3031 case 'S':
38487616 3032 insn.insn_opcode |= va_arg (args, int) << OP_SH_FS;
252b5132
RH
3033 continue;
3034
3035 case 'z':
3036 continue;
3037
3038 case '<':
38487616 3039 insn.insn_opcode |= va_arg (args, int) << OP_SH_SHAMT;
252b5132
RH
3040 continue;
3041
3042 case 'D':
38487616 3043 insn.insn_opcode |= va_arg (args, int) << OP_SH_FD;
252b5132
RH
3044 continue;
3045
3046 case 'B':
38487616 3047 insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE20;
252b5132
RH
3048 continue;
3049
4372b673 3050 case 'J':
38487616 3051 insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE19;
4372b673
NC
3052 continue;
3053
252b5132 3054 case 'q':
38487616 3055 insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE2;
252b5132
RH
3056 continue;
3057
3058 case 'b':
3059 case 's':
3060 case 'r':
3061 case 'v':
38487616 3062 insn.insn_opcode |= va_arg (args, int) << OP_SH_RS;
252b5132
RH
3063 continue;
3064
3065 case 'i':
3066 case 'j':
3067 case 'o':
f6688943 3068 *r = (bfd_reloc_code_real_type) va_arg (args, int);
cdf6fd85 3069 assert (*r == BFD_RELOC_GPREL16
f6688943
TS
3070 || *r == BFD_RELOC_MIPS_LITERAL
3071 || *r == BFD_RELOC_MIPS_HIGHER
3072 || *r == BFD_RELOC_HI16_S
3073 || *r == BFD_RELOC_LO16
3074 || *r == BFD_RELOC_MIPS_GOT16
3075 || *r == BFD_RELOC_MIPS_CALL16
438c16b8
TS
3076 || *r == BFD_RELOC_MIPS_GOT_DISP
3077 || *r == BFD_RELOC_MIPS_GOT_PAGE
3078 || *r == BFD_RELOC_MIPS_GOT_OFST
f6688943
TS
3079 || *r == BFD_RELOC_MIPS_GOT_LO16
3080 || *r == BFD_RELOC_MIPS_CALL_LO16
252b5132 3081 || (ep->X_op == O_subtract
f6688943 3082 && *r == BFD_RELOC_PCREL_LO16));
252b5132
RH
3083 continue;
3084
3085 case 'u':
f6688943 3086 *r = (bfd_reloc_code_real_type) va_arg (args, int);
252b5132
RH
3087 assert (ep != NULL
3088 && (ep->X_op == O_constant
3089 || (ep->X_op == O_symbol
f6688943
TS
3090 && (*r == BFD_RELOC_MIPS_HIGHEST
3091 || *r == BFD_RELOC_HI16_S
3092 || *r == BFD_RELOC_HI16
3093 || *r == BFD_RELOC_GPREL16
3094 || *r == BFD_RELOC_MIPS_GOT_HI16
3095 || *r == BFD_RELOC_MIPS_CALL_HI16))
252b5132 3096 || (ep->X_op == O_subtract
f6688943 3097 && *r == BFD_RELOC_PCREL_HI16_S)));
252b5132
RH
3098 continue;
3099
3100 case 'p':
3101 assert (ep != NULL);
3102 /*
3103 * This allows macro() to pass an immediate expression for
3104 * creating short branches without creating a symbol.
3105 * Note that the expression still might come from the assembly
3106 * input, in which case the value is not checked for range nor
3107 * is a relocation entry generated (yuck).
3108 */
3109 if (ep->X_op == O_constant)
3110 {
3111 insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3112 ep = NULL;
3113 }
3114 else
af6ae2ad 3115 *r = BFD_RELOC_16_PCREL_S2;
252b5132
RH
3116 continue;
3117
3118 case 'a':
3119 assert (ep != NULL);
f6688943 3120 *r = BFD_RELOC_MIPS_JMP;
252b5132
RH
3121 continue;
3122
3123 case 'C':
3124 insn.insn_opcode |= va_arg (args, unsigned long);
3125 continue;
3126
3127 default:
3128 internalError ();
3129 }
3130 break;
3131 }
3132 va_end (args);
f6688943 3133 assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
252b5132 3134
5e0116d5 3135 append_insn (place, &insn, ep, r);
252b5132
RH
3136}
3137
3138static void
3139mips16_macro_build (place, counter, ep, name, fmt, args)
3140 char *place;
43841e91 3141 int *counter ATTRIBUTE_UNUSED;
252b5132
RH
3142 expressionS *ep;
3143 const char *name;
3144 const char *fmt;
3145 va_list args;
3146{
3147 struct mips_cl_insn insn;
f6688943
TS
3148 bfd_reloc_code_real_type r[3]
3149 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
252b5132 3150
252b5132
RH
3151 insn.insn_mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
3152 assert (insn.insn_mo);
3153 assert (strcmp (name, insn.insn_mo->name) == 0);
3154
3155 while (strcmp (fmt, insn.insn_mo->args) != 0
3156 || insn.insn_mo->pinfo == INSN_MACRO)
3157 {
3158 ++insn.insn_mo;
3159 assert (insn.insn_mo->name);
3160 assert (strcmp (name, insn.insn_mo->name) == 0);
3161 }
3162
3163 insn.insn_opcode = insn.insn_mo->match;
b34976b6 3164 insn.use_extend = FALSE;
252b5132
RH
3165
3166 for (;;)
3167 {
3168 int c;
3169
3170 c = *fmt++;
3171 switch (c)
3172 {
3173 case '\0':
3174 break;
3175
3176 case ',':
3177 case '(':
3178 case ')':
3179 continue;
3180
3181 case 'y':
3182 case 'w':
3183 insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_RY;
3184 continue;
3185
3186 case 'x':
3187 case 'v':
3188 insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_RX;
3189 continue;
3190
3191 case 'z':
3192 insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_RZ;
3193 continue;
3194
3195 case 'Z':
3196 insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_MOVE32Z;
3197 continue;
3198
3199 case '0':
3200 case 'S':
3201 case 'P':
3202 case 'R':
3203 continue;
3204
3205 case 'X':
3206 insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_REGR32;
3207 continue;
3208
3209 case 'Y':
3210 {
3211 int regno;
3212
3213 regno = va_arg (args, int);
3214 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
3215 insn.insn_opcode |= regno << MIPS16OP_SH_REG32R;
3216 }
3217 continue;
3218
3219 case '<':
3220 case '>':
3221 case '4':
3222 case '5':
3223 case 'H':
3224 case 'W':
3225 case 'D':
3226 case 'j':
3227 case '8':
3228 case 'V':
3229 case 'C':
3230 case 'U':
3231 case 'k':
3232 case 'K':
3233 case 'p':
3234 case 'q':
3235 {
3236 assert (ep != NULL);
3237
3238 if (ep->X_op != O_constant)
874e8986 3239 *r = (int) BFD_RELOC_UNUSED + c;
252b5132
RH
3240 else
3241 {
b34976b6
AM
3242 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3243 FALSE, &insn.insn_opcode, &insn.use_extend,
c4e7957c 3244 &insn.extend);
252b5132 3245 ep = NULL;
f6688943 3246 *r = BFD_RELOC_UNUSED;
252b5132
RH
3247 }
3248 }
3249 continue;
3250
3251 case '6':
3252 insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_IMM6;
3253 continue;
3254 }
3255
3256 break;
3257 }
3258
f6688943 3259 assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
252b5132 3260
5e0116d5 3261 append_insn (place, &insn, ep, r);
252b5132
RH
3262}
3263
438c16b8
TS
3264/*
3265 * Generate a "jalr" instruction with a relocation hint to the called
3266 * function. This occurs in NewABI PIC code.
3267 */
3268static void
3269macro_build_jalr (icnt, ep)
3270 int icnt;
3271 expressionS *ep;
3272{
f21f8242 3273 char *f;
b34976b6 3274
438c16b8 3275 if (HAVE_NEWABI)
f21f8242
AO
3276 {
3277 frag_grow (4);
3278 f = frag_more (0);
3279 }
438c16b8
TS
3280 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "jalr", "d,s",
3281 RA, PIC_CALL_REG);
3282 if (HAVE_NEWABI)
f21f8242 3283 fix_new_exp (frag_now, f - frag_now->fr_literal,
b34976b6 3284 0, ep, FALSE, BFD_RELOC_MIPS_JALR);
438c16b8
TS
3285}
3286
252b5132
RH
3287/*
3288 * Generate a "lui" instruction.
3289 */
3290static void
3291macro_build_lui (place, counter, ep, regnum)
3292 char *place;
3293 int *counter;
3294 expressionS *ep;
3295 int regnum;
3296{
3297 expressionS high_expr;
3298 struct mips_cl_insn insn;
f6688943
TS
3299 bfd_reloc_code_real_type r[3]
3300 = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
5a38dc70
AM
3301 const char *name = "lui";
3302 const char *fmt = "t,u";
252b5132
RH
3303
3304 assert (! mips_opts.mips16);
3305
3306 if (place == NULL)
3307 high_expr = *ep;
3308 else
3309 {
3310 high_expr.X_op = O_constant;
3311 high_expr.X_add_number = ep->X_add_number;
3312 }
3313
3314 if (high_expr.X_op == O_constant)
3315 {
3316 /* we can compute the instruction now without a relocation entry */
e7d556df
TS
3317 high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
3318 >> 16) & 0xffff;
f6688943 3319 *r = BFD_RELOC_UNUSED;
252b5132 3320 }
78e1bb40 3321 else
252b5132
RH
3322 {
3323 assert (ep->X_op == O_symbol);
3324 /* _gp_disp is a special case, used from s_cpload. */
3325 assert (mips_pic == NO_PIC
78e1bb40
AO
3326 || (! HAVE_NEWABI
3327 && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0));
f6688943 3328 *r = BFD_RELOC_HI16_S;
252b5132
RH
3329 }
3330
3331 /*
3332 * If the macro is about to expand into a second instruction,
3333 * print a warning if needed. We need to pass ip as a parameter
3334 * to generate a better warning message here...
3335 */
3336 if (mips_opts.warn_about_macros && place == NULL && *counter == 1)
3337 as_warn (_("Macro instruction expanded into multiple instructions"));
3338
3339 if (place == NULL)
f9419b05 3340 ++*counter; /* bump instruction counter */
252b5132
RH
3341
3342 insn.insn_mo = (struct mips_opcode *) hash_find (op_hash, name);
3343 assert (insn.insn_mo);
3344 assert (strcmp (name, insn.insn_mo->name) == 0);
3345 assert (strcmp (fmt, insn.insn_mo->args) == 0);
3346
3347 insn.insn_opcode = insn.insn_mo->match | (regnum << OP_SH_RT);
f6688943 3348 if (*r == BFD_RELOC_UNUSED)
252b5132
RH
3349 {
3350 insn.insn_opcode |= high_expr.X_add_number;
5e0116d5 3351 append_insn (place, &insn, NULL, r);
252b5132
RH
3352 }
3353 else
5e0116d5 3354 append_insn (place, &insn, &high_expr, r);
252b5132
RH
3355}
3356
885add95
CD
3357/* Generate a sequence of instructions to do a load or store from a constant
3358 offset off of a base register (breg) into/from a target register (treg),
3359 using AT if necessary. */
3360static void
3361macro_build_ldst_constoffset (place, counter, ep, op, treg, breg)
3362 char *place;
3363 int *counter;
3364 expressionS *ep;
3365 const char *op;
3366 int treg, breg;
3367{
3368 assert (ep->X_op == O_constant);
3369
3370 /* Right now, this routine can only handle signed 32-bit contants. */
3371 if (! IS_SEXT_32BIT_NUM(ep->X_add_number))
3372 as_warn (_("operand overflow"));
3373
3374 if (IS_SEXT_16BIT_NUM(ep->X_add_number))
3375 {
3376 /* Signed 16-bit offset will fit in the op. Easy! */
3377 macro_build (place, counter, ep, op, "t,o(b)", treg,
3378 (int) BFD_RELOC_LO16, breg);
3379 }
3380 else
3381 {
3382 /* 32-bit offset, need multiple instructions and AT, like:
3383 lui $tempreg,const_hi (BFD_RELOC_HI16_S)
3384 addu $tempreg,$tempreg,$breg
3385 <op> $treg,const_lo($tempreg) (BFD_RELOC_LO16)
3386 to handle the complete offset. */
3387 macro_build_lui (place, counter, ep, AT);
3388 if (place != NULL)
3389 place += 4;
3390 macro_build (place, counter, (expressionS *) NULL,
3391 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
3392 "d,v,t", AT, AT, breg);
3393 if (place != NULL)
3394 place += 4;
3395 macro_build (place, counter, ep, op, "t,o(b)", treg,
3396 (int) BFD_RELOC_LO16, AT);
3397
3398 if (mips_opts.noat)
3399 as_warn (_("Macro used $at after \".set noat\""));
3400 }
3401}
3402
252b5132
RH
3403/* set_at()
3404 * Generates code to set the $at register to true (one)
3405 * if reg is less than the immediate expression.
3406 */
3407static void
3408set_at (counter, reg, unsignedp)
3409 int *counter;
3410 int reg;
3411 int unsignedp;
3412{
3413 if (imm_expr.X_op == O_constant
3414 && imm_expr.X_add_number >= -0x8000
3415 && imm_expr.X_add_number < 0x8000)
3416 macro_build ((char *) NULL, counter, &imm_expr,
3417 unsignedp ? "sltiu" : "slti",
3418 "t,r,j", AT, reg, (int) BFD_RELOC_LO16);
3419 else
3420 {
4d34fb5f 3421 load_register (counter, AT, &imm_expr, HAVE_64BIT_GPRS);
2396cfb9 3422 macro_build ((char *) NULL, counter, (expressionS *) NULL,
252b5132
RH
3423 unsignedp ? "sltu" : "slt",
3424 "d,v,t", AT, reg, AT);
3425 }
3426}
3427
3428/* Warn if an expression is not a constant. */
3429
3430static void
3431check_absolute_expr (ip, ex)
3432 struct mips_cl_insn *ip;
3433 expressionS *ex;
3434{
3435 if (ex->X_op == O_big)
3436 as_bad (_("unsupported large constant"));
3437 else if (ex->X_op != O_constant)
3438 as_bad (_("Instruction %s requires absolute expression"), ip->insn_mo->name);
3439}
3440
3441/* Count the leading zeroes by performing a binary chop. This is a
3442 bulky bit of source, but performance is a LOT better for the
3443 majority of values than a simple loop to count the bits:
3444 for (lcnt = 0; (lcnt < 32); lcnt++)
3445 if ((v) & (1 << (31 - lcnt)))
3446 break;
3447 However it is not code size friendly, and the gain will drop a bit
3448 on certain cached systems.
3449*/
3450#define COUNT_TOP_ZEROES(v) \
3451 (((v) & ~0xffff) == 0 \
3452 ? ((v) & ~0xff) == 0 \
3453 ? ((v) & ~0xf) == 0 \
3454 ? ((v) & ~0x3) == 0 \
3455 ? ((v) & ~0x1) == 0 \
3456 ? !(v) \
3457 ? 32 \
3458 : 31 \
3459 : 30 \
3460 : ((v) & ~0x7) == 0 \
3461 ? 29 \
3462 : 28 \
3463 : ((v) & ~0x3f) == 0 \
3464 ? ((v) & ~0x1f) == 0 \
3465 ? 27 \
3466 : 26 \
3467 : ((v) & ~0x7f) == 0 \
3468 ? 25 \
3469 : 24 \
3470 : ((v) & ~0xfff) == 0 \
3471 ? ((v) & ~0x3ff) == 0 \
3472 ? ((v) & ~0x1ff) == 0 \
3473 ? 23 \
3474 : 22 \
3475 : ((v) & ~0x7ff) == 0 \
3476 ? 21 \
3477 : 20 \
3478 : ((v) & ~0x3fff) == 0 \
3479 ? ((v) & ~0x1fff) == 0 \
3480 ? 19 \
3481 : 18 \
3482 : ((v) & ~0x7fff) == 0 \
3483 ? 17 \
3484 : 16 \
3485 : ((v) & ~0xffffff) == 0 \
3486 ? ((v) & ~0xfffff) == 0 \
3487 ? ((v) & ~0x3ffff) == 0 \
3488 ? ((v) & ~0x1ffff) == 0 \
3489 ? 15 \
3490 : 14 \
3491 : ((v) & ~0x7ffff) == 0 \
3492 ? 13 \
3493 : 12 \
3494 : ((v) & ~0x3fffff) == 0 \
3495 ? ((v) & ~0x1fffff) == 0 \
3496 ? 11 \
3497 : 10 \
3498 : ((v) & ~0x7fffff) == 0 \
3499 ? 9 \
3500 : 8 \
3501 : ((v) & ~0xfffffff) == 0 \
3502 ? ((v) & ~0x3ffffff) == 0 \
3503 ? ((v) & ~0x1ffffff) == 0 \
3504 ? 7 \
3505 : 6 \
3506 : ((v) & ~0x7ffffff) == 0 \
3507 ? 5 \
3508 : 4 \
3509 : ((v) & ~0x3fffffff) == 0 \
3510 ? ((v) & ~0x1fffffff) == 0 \
3511 ? 3 \
3512 : 2 \
3513 : ((v) & ~0x7fffffff) == 0 \
3514 ? 1 \
3515 : 0)
3516
3517/* load_register()
3518 * This routine generates the least number of instructions neccessary to load
3519 * an absolute expression value into a register.
3520 */
3521static void
3522load_register (counter, reg, ep, dbl)
3523 int *counter;
3524 int reg;
3525 expressionS *ep;
3526 int dbl;
3527{
3528 int freg;
3529 expressionS hi32, lo32;
3530
3531 if (ep->X_op != O_big)
3532 {
3533 assert (ep->X_op == O_constant);
3534 if (ep->X_add_number < 0x8000
3535 && (ep->X_add_number >= 0
3536 || (ep->X_add_number >= -0x8000
3537 && (! dbl
3538 || ! ep->X_unsigned
3539 || sizeof (ep->X_add_number) > 4))))
3540 {
3541 /* We can handle 16 bit signed values with an addiu to
3542 $zero. No need to ever use daddiu here, since $zero and
3543 the result are always correct in 32 bit mode. */
3544 macro_build ((char *) NULL, counter, ep, "addiu", "t,r,j", reg, 0,
3545 (int) BFD_RELOC_LO16);
3546 return;
3547 }
3548 else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
3549 {
3550 /* We can handle 16 bit unsigned values with an ori to
3551 $zero. */
3552 macro_build ((char *) NULL, counter, ep, "ori", "t,r,i", reg, 0,
3553 (int) BFD_RELOC_LO16);
3554 return;
3555 }
6373ee54 3556 else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)
252b5132
RH
3557 && (! dbl
3558 || ! ep->X_unsigned
3559 || sizeof (ep->X_add_number) > 4
3560 || (ep->X_add_number & 0x80000000) == 0))
ca4e0257 3561 || ((HAVE_32BIT_GPRS || ! dbl)
252b5132 3562 && (ep->X_add_number &~ (offsetT) 0xffffffff) == 0)
ca4e0257 3563 || (HAVE_32BIT_GPRS
252b5132
RH
3564 && ! dbl
3565 && ((ep->X_add_number &~ (offsetT) 0xffffffff)
3566 == ~ (offsetT) 0xffffffff)))
3567 {
3568 /* 32 bit values require an lui. */
3569 macro_build ((char *) NULL, counter, ep, "lui", "t,u", reg,
3570 (int) BFD_RELOC_HI16);
3571 if ((ep->X_add_number & 0xffff) != 0)
3572 macro_build ((char *) NULL, counter, ep, "ori", "t,r,i", reg, reg,
3573 (int) BFD_RELOC_LO16);
3574 return;
3575 }
3576 }
3577
3578 /* The value is larger than 32 bits. */
3579
ca4e0257 3580 if (HAVE_32BIT_GPRS)
252b5132 3581 {
956cd1d6
TS
3582 as_bad (_("Number (0x%lx) larger than 32 bits"),
3583 (unsigned long) ep->X_add_number);
252b5132
RH
3584 macro_build ((char *) NULL, counter, ep, "addiu", "t,r,j", reg, 0,
3585 (int) BFD_RELOC_LO16);
3586 return;
3587 }
3588
3589 if (ep->X_op != O_big)
3590 {
3591 hi32 = *ep;
3592 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
3593 hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
3594 hi32.X_add_number &= 0xffffffff;
3595 lo32 = *ep;
3596 lo32.X_add_number &= 0xffffffff;
3597 }
3598 else
3599 {
3600 assert (ep->X_add_number > 2);
3601 if (ep->X_add_number == 3)
3602 generic_bignum[3] = 0;
3603 else if (ep->X_add_number > 4)
3604 as_bad (_("Number larger than 64 bits"));
3605 lo32.X_op = O_constant;
3606 lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
3607 hi32.X_op = O_constant;
3608 hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
3609 }
3610
3611 if (hi32.X_add_number == 0)
3612 freg = 0;
3613 else
3614 {
3615 int shift, bit;
3616 unsigned long hi, lo;
3617
956cd1d6 3618 if (hi32.X_add_number == (offsetT) 0xffffffff)
beae10d5
KH
3619 {
3620 if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
3621 {
3622 macro_build ((char *) NULL, counter, &lo32, "addiu", "t,r,j",
252b5132 3623 reg, 0, (int) BFD_RELOC_LO16);
beae10d5
KH
3624 return;
3625 }
3626 if (lo32.X_add_number & 0x80000000)
3627 {
3628 macro_build ((char *) NULL, counter, &lo32, "lui", "t,u", reg,
3629 (int) BFD_RELOC_HI16);
252b5132
RH
3630 if (lo32.X_add_number & 0xffff)
3631 macro_build ((char *) NULL, counter, &lo32, "ori", "t,r,i",
3632 reg, reg, (int) BFD_RELOC_LO16);
beae10d5
KH
3633 return;
3634 }
3635 }
252b5132
RH
3636
3637 /* Check for 16bit shifted constant. We know that hi32 is
3638 non-zero, so start the mask on the first bit of the hi32
3639 value. */
3640 shift = 17;
3641 do
beae10d5
KH
3642 {
3643 unsigned long himask, lomask;
3644
3645 if (shift < 32)
3646 {
3647 himask = 0xffff >> (32 - shift);
3648 lomask = (0xffff << shift) & 0xffffffff;
3649 }
3650 else
3651 {
3652 himask = 0xffff << (shift - 32);
3653 lomask = 0;
3654 }
3655 if ((hi32.X_add_number & ~(offsetT) himask) == 0
3656 && (lo32.X_add_number & ~(offsetT) lomask) == 0)
3657 {
3658 expressionS tmp;
3659
3660 tmp.X_op = O_constant;
3661 if (shift < 32)
3662 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
3663 | (lo32.X_add_number >> shift));
3664 else
3665 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
3666 macro_build ((char *) NULL, counter, &tmp,
3667 "ori", "t,r,i", reg, 0,
3668 (int) BFD_RELOC_LO16);
2396cfb9 3669 macro_build ((char *) NULL, counter, (expressionS *) NULL,
beae10d5
KH
3670 (shift >= 32) ? "dsll32" : "dsll",
3671 "d,w,<", reg, reg,
3672 (shift >= 32) ? shift - 32 : shift);
3673 return;
3674 }
f9419b05 3675 ++shift;
beae10d5
KH
3676 }
3677 while (shift <= (64 - 16));
252b5132
RH
3678
3679 /* Find the bit number of the lowest one bit, and store the
3680 shifted value in hi/lo. */
3681 hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
3682 lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
3683 if (lo != 0)
3684 {
3685 bit = 0;
3686 while ((lo & 1) == 0)
3687 {
3688 lo >>= 1;
3689 ++bit;
3690 }
3691 lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
3692 hi >>= bit;
3693 }
3694 else
3695 {
3696 bit = 32;
3697 while ((hi & 1) == 0)
3698 {
3699 hi >>= 1;
3700 ++bit;
3701 }
3702 lo = hi;
3703 hi = 0;
3704 }
3705
3706 /* Optimize if the shifted value is a (power of 2) - 1. */
3707 if ((hi == 0 && ((lo + 1) & lo) == 0)
3708 || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
beae10d5
KH
3709 {
3710 shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
252b5132 3711 if (shift != 0)
beae10d5 3712 {
252b5132
RH
3713 expressionS tmp;
3714
3715 /* This instruction will set the register to be all
3716 ones. */
beae10d5
KH
3717 tmp.X_op = O_constant;
3718 tmp.X_add_number = (offsetT) -1;
3719 macro_build ((char *) NULL, counter, &tmp, "addiu", "t,r,j",
252b5132 3720 reg, 0, (int) BFD_RELOC_LO16);
beae10d5
KH
3721 if (bit != 0)
3722 {
3723 bit += shift;
2396cfb9 3724 macro_build ((char *) NULL, counter, (expressionS *) NULL,
beae10d5
KH
3725 (bit >= 32) ? "dsll32" : "dsll",
3726 "d,w,<", reg, reg,
3727 (bit >= 32) ? bit - 32 : bit);
3728 }
2396cfb9 3729 macro_build ((char *) NULL, counter, (expressionS *) NULL,
252b5132 3730 (shift >= 32) ? "dsrl32" : "dsrl",
beae10d5 3731 "d,w,<", reg, reg,
252b5132 3732 (shift >= 32) ? shift - 32 : shift);
beae10d5
KH
3733 return;
3734 }
3735 }
252b5132
RH
3736
3737 /* Sign extend hi32 before calling load_register, because we can
3738 generally get better code when we load a sign extended value. */
3739 if ((hi32.X_add_number & 0x80000000) != 0)
beae10d5 3740 hi32.X_add_number |= ~(offsetT) 0xffffffff;
252b5132
RH
3741 load_register (counter, reg, &hi32, 0);
3742 freg = reg;
3743 }
3744 if ((lo32.X_add_number & 0xffff0000) == 0)
3745 {
3746 if (freg != 0)
3747 {
2396cfb9
TS
3748 macro_build ((char *) NULL, counter, (expressionS *) NULL,
3749 "dsll32", "d,w,<", reg, freg, 0);
252b5132
RH
3750 freg = reg;
3751 }
3752 }
3753 else
3754 {
3755 expressionS mid16;
3756
956cd1d6 3757 if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
beae10d5 3758 {
252b5132
RH
3759 macro_build ((char *) NULL, counter, &lo32, "lui", "t,u", reg,
3760 (int) BFD_RELOC_HI16);
956cd1d6
TS
3761 macro_build ((char *) NULL, counter, (expressionS *) NULL,
3762 "dsrl32", "d,w,<", reg, reg, 0);
beae10d5
KH
3763 return;
3764 }
252b5132
RH
3765
3766 if (freg != 0)
3767 {
956cd1d6
TS
3768 macro_build ((char *) NULL, counter, (expressionS *) NULL, "dsll",
3769 "d,w,<", reg, freg, 16);
252b5132
RH
3770 freg = reg;
3771 }
3772 mid16 = lo32;
3773 mid16.X_add_number >>= 16;
3774 macro_build ((char *) NULL, counter, &mid16, "ori", "t,r,i", reg,
3775 freg, (int) BFD_RELOC_LO16);
956cd1d6
TS
3776 macro_build ((char *) NULL, counter, (expressionS *) NULL, "dsll",
3777 "d,w,<", reg, reg, 16);
252b5132
RH
3778 freg = reg;
3779 }
3780 if ((lo32.X_add_number & 0xffff) != 0)
3781 macro_build ((char *) NULL, counter, &lo32, "ori", "t,r,i", reg, freg,
3782 (int) BFD_RELOC_LO16);
3783}
3784
3785/* Load an address into a register. */
3786
3787static void
c9914766 3788load_address (counter, reg, ep, used_at)
252b5132
RH
3789 int *counter;
3790 int reg;
3791 expressionS *ep;
d6bc6245 3792 int *used_at;
252b5132 3793{
f9419b05 3794 char *p = NULL;
252b5132
RH
3795
3796 if (ep->X_op != O_constant
3797 && ep->X_op != O_symbol)
3798 {
3799 as_bad (_("expression too complex"));
3800 ep->X_op = O_constant;
3801 }
3802
3803 if (ep->X_op == O_constant)
3804 {
c9914766 3805 load_register (counter, reg, ep, HAVE_64BIT_ADDRESSES);
252b5132
RH
3806 return;
3807 }
3808
3809 if (mips_pic == NO_PIC)
3810 {
3811 /* If this is a reference to a GP relative symbol, we want
cdf6fd85 3812 addiu $reg,$gp,<sym> (BFD_RELOC_GPREL16)
252b5132
RH
3813 Otherwise we want
3814 lui $reg,<sym> (BFD_RELOC_HI16_S)
3815 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
d6bc6245 3816 If we have an addend, we always use the latter form.
76b3015f 3817
d6bc6245
TS
3818 With 64bit address space and a usable $at we want
3819 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
3820 lui $at,<sym> (BFD_RELOC_HI16_S)
3821 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
3822 daddiu $at,<sym> (BFD_RELOC_LO16)
3823 dsll32 $reg,0
3a482fd5 3824 daddu $reg,$reg,$at
76b3015f 3825
c03099e6 3826 If $at is already in use, we use a path which is suboptimal
d6bc6245
TS
3827 on superscalar processors.
3828 lui $reg,<sym> (BFD_RELOC_MIPS_HIGHEST)
3829 daddiu $reg,<sym> (BFD_RELOC_MIPS_HIGHER)
3830 dsll $reg,16
3831 daddiu $reg,<sym> (BFD_RELOC_HI16_S)
3832 dsll $reg,16
3833 daddiu $reg,<sym> (BFD_RELOC_LO16)
3834 */
c9914766 3835 if (HAVE_64BIT_ADDRESSES)
d6bc6245 3836 {
d6bc6245
TS
3837 /* We don't do GP optimization for now because RELAX_ENCODE can't
3838 hold the data for such large chunks. */
3839
460597ba 3840 if (*used_at == 0 && ! mips_opts.noat)
d6bc6245
TS
3841 {
3842 macro_build (p, counter, ep, "lui", "t,u",
3843 reg, (int) BFD_RELOC_MIPS_HIGHEST);
3844 macro_build (p, counter, ep, "lui", "t,u",
3845 AT, (int) BFD_RELOC_HI16_S);
3846 macro_build (p, counter, ep, "daddiu", "t,r,j",
3847 reg, reg, (int) BFD_RELOC_MIPS_HIGHER);
3848 macro_build (p, counter, ep, "daddiu", "t,r,j",
3849 AT, AT, (int) BFD_RELOC_LO16);
2396cfb9
TS
3850 macro_build (p, counter, (expressionS *) NULL, "dsll32",
3851 "d,w,<", reg, reg, 0);
3a482fd5 3852 macro_build (p, counter, (expressionS *) NULL, "daddu",
2396cfb9 3853 "d,v,t", reg, reg, AT);
d6bc6245
TS
3854 *used_at = 1;
3855 }
3856 else
3857 {
3858 macro_build (p, counter, ep, "lui", "t,u",
3859 reg, (int) BFD_RELOC_MIPS_HIGHEST);
3860 macro_build (p, counter, ep, "daddiu", "t,r,j",
3861 reg, reg, (int) BFD_RELOC_MIPS_HIGHER);
2396cfb9
TS
3862 macro_build (p, counter, (expressionS *) NULL, "dsll",
3863 "d,w,<", reg, reg, 16);
d6bc6245
TS
3864 macro_build (p, counter, ep, "daddiu", "t,r,j",
3865 reg, reg, (int) BFD_RELOC_HI16_S);
2396cfb9
TS
3866 macro_build (p, counter, (expressionS *) NULL, "dsll",
3867 "d,w,<", reg, reg, 16);
d6bc6245
TS
3868 macro_build (p, counter, ep, "daddiu", "t,r,j",
3869 reg, reg, (int) BFD_RELOC_LO16);
3870 }
3871 }
252b5132
RH
3872 else
3873 {
d6bc6245
TS
3874 if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
3875 && ! nopic_need_relax (ep->X_add_symbol, 1))
3876 {
3877 frag_grow (20);
3878 macro_build ((char *) NULL, counter, ep,
c9914766
TS
3879 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu", "t,r,j",
3880 reg, mips_gp_register, (int) BFD_RELOC_GPREL16);
d6bc6245
TS
3881 p = frag_var (rs_machine_dependent, 8, 0,
3882 RELAX_ENCODE (4, 8, 0, 4, 0,
3883 mips_opts.warn_about_macros),
956cd1d6 3884 ep->X_add_symbol, 0, NULL);
d6bc6245
TS
3885 }
3886 macro_build_lui (p, counter, ep, reg);
3887 if (p != NULL)
3888 p += 4;
c9914766
TS
3889 macro_build (p, counter, ep,
3890 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
d6bc6245
TS
3891 "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
3892 }
252b5132
RH
3893 }
3894 else if (mips_pic == SVR4_PIC && ! mips_big_got)
3895 {
3896 expressionS ex;
3897
3898 /* If this is a reference to an external symbol, we want
3899 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
3900 Otherwise we want
3901 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
3902 nop
3903 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
ed6fb7bd
SC
3904 If we have NewABI, we want
3905 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
252b5132
RH
3906 If there is a constant, it must be added in after. */
3907 ex.X_add_number = ep->X_add_number;
3908 ep->X_add_number = 0;
3909 frag_grow (20);
ed6fb7bd
SC
3910 if (HAVE_NEWABI)
3911 {
3912 macro_build ((char *) NULL, counter, ep,
3913 HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", reg,
3914 (int) BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
3915 }
3916 else
3917 {
3918 macro_build ((char *) NULL, counter, ep,
3919 HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)",
3920 reg, (int) BFD_RELOC_MIPS_GOT16, mips_gp_register);
3921 macro_build ((char *) NULL, counter, (expressionS *) NULL, "nop", "");
3922 p = frag_var (rs_machine_dependent, 4, 0,
3923 RELAX_ENCODE (0, 4, -8, 0, 0, mips_opts.warn_about_macros),
3924 ep->X_add_symbol, (offsetT) 0, (char *) NULL);
3925 macro_build (p, counter, ep,
3926 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
3927 "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
3928 }
3929
252b5132
RH
3930 if (ex.X_add_number != 0)
3931 {
3932 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
3933 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
3934 ex.X_op = O_constant;
3935 macro_build ((char *) NULL, counter, &ex,
ca4e0257 3936 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
3937 "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
3938 }
3939 }
3940 else if (mips_pic == SVR4_PIC)
3941 {
3942 expressionS ex;
3943 int off;
3944
3945 /* This is the large GOT case. If this is a reference to an
3946 external symbol, we want
3947 lui $reg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
3948 addu $reg,$reg,$gp
3949 lw $reg,<sym>($reg) (BFD_RELOC_MIPS_GOT_LO16)
3950 Otherwise, for a reference to a local symbol, we want
3951 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
3952 nop
3953 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
438c16b8
TS
3954 If we have NewABI, we want
3955 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
3956 addiu $reg,$reg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
252b5132
RH
3957 If there is a constant, it must be added in after. */
3958 ex.X_add_number = ep->X_add_number;
3959 ep->X_add_number = 0;
438c16b8
TS
3960 if (HAVE_NEWABI)
3961 {
3962 macro_build ((char *) NULL, counter, ep,
3963 HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", reg,
3964 (int) BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
3965 macro_build (p, counter, ep,
3966 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu", "t,r,j",
3967 reg, reg, (int) BFD_RELOC_MIPS_GOT_OFST);
3968 }
252b5132 3969 else
438c16b8
TS
3970 {
3971 if (reg_needs_delay (mips_gp_register))
3972 off = 4;
3973 else
3974 off = 0;
3975 frag_grow (32);
3976 macro_build ((char *) NULL, counter, ep, "lui", "t,u", reg,
3977 (int) BFD_RELOC_MIPS_GOT_HI16);
3978 macro_build ((char *) NULL, counter, (expressionS *) NULL,
3979 HAVE_32BIT_ADDRESSES ? "addu" : "daddu", "d,v,t", reg,
3980 reg, mips_gp_register);
3981 macro_build ((char *) NULL, counter, ep,
3982 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
3983 "t,o(b)", reg, (int) BFD_RELOC_MIPS_GOT_LO16, reg);
3984 p = frag_var (rs_machine_dependent, 12 + off, 0,
3985 RELAX_ENCODE (12, 12 + off, off, 8 + off, 0,
3986 mips_opts.warn_about_macros),
3987 ep->X_add_symbol, 0, NULL);
3988 if (off > 0)
3989 {
3990 /* We need a nop before loading from $gp. This special
3991 check is required because the lui which starts the main
3992 instruction stream does not refer to $gp, and so will not
3993 insert the nop which may be required. */
3994 macro_build (p, counter, (expressionS *) NULL, "nop", "");
3995 p += 4;
3996 }
3997 macro_build (p, counter, ep,
3998 HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", reg,
3999 (int) BFD_RELOC_MIPS_GOT16, mips_gp_register);
4000 p += 4;
252b5132
RH
4001 macro_build (p, counter, (expressionS *) NULL, "nop", "");
4002 p += 4;
438c16b8
TS
4003 macro_build (p, counter, ep,
4004 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
4005 "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
252b5132 4006 }
438c16b8 4007
252b5132
RH
4008 if (ex.X_add_number != 0)
4009 {
4010 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4011 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4012 ex.X_op = O_constant;
f7ea7ef2
TS
4013 macro_build ((char *) NULL, counter, &ex,
4014 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
4015 "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
4016 }
4017 }
4018 else if (mips_pic == EMBEDDED_PIC)
4019 {
4020 /* We always do
cdf6fd85 4021 addiu $reg,$gp,<sym> (BFD_RELOC_GPREL16)
c9914766
TS
4022 */
4023 macro_build ((char *) NULL, counter, ep,
4024 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
4025 "t,r,j", reg, mips_gp_register, (int) BFD_RELOC_GPREL16);
252b5132
RH
4026 }
4027 else
4028 abort ();
4029}
4030
ea1fb5dc
RS
4031/* Move the contents of register SOURCE into register DEST. */
4032
4033static void
4034move_register (counter, dest, source)
4035 int *counter;
4036 int dest;
4037 int source;
4038{
4039 macro_build ((char *) NULL, counter, (expressionS *) NULL,
4040 HAVE_32BIT_GPRS ? "addu" : "daddu",
4041 "d,v,t", dest, source, 0);
4042}
4043
252b5132
RH
4044/*
4045 * Build macros
4046 * This routine implements the seemingly endless macro or synthesized
4047 * instructions and addressing modes in the mips assembly language. Many
4048 * of these macros are simple and are similar to each other. These could
4049 * probably be handled by some kind of table or grammer aproach instead of
4050 * this verbose method. Others are not simple macros but are more like
4051 * optimizing code generation.
4052 * One interesting optimization is when several store macros appear
4053 * consecutivly that would load AT with the upper half of the same address.
4054 * The ensuing load upper instructions are ommited. This implies some kind
4055 * of global optimization. We currently only optimize within a single macro.
4056 * For many of the load and store macros if the address is specified as a
4057 * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4058 * first load register 'at' with zero and use it as the base register. The
4059 * mips assembler simply uses register $zero. Just one tiny optimization
4060 * we're missing.
4061 */
4062static void
4063macro (ip)
4064 struct mips_cl_insn *ip;
4065{
4066 register int treg, sreg, dreg, breg;
4067 int tempreg;
4068 int mask;
4069 int icnt = 0;
43841e91 4070 int used_at = 0;
252b5132
RH
4071 expressionS expr1;
4072 const char *s;
4073 const char *s2;
4074 const char *fmt;
4075 int likely = 0;
4076 int dbl = 0;
4077 int coproc = 0;
4078 int lr = 0;
4079 int imm = 0;
4080 offsetT maxnum;
4081 int off;
4082 bfd_reloc_code_real_type r;
252b5132
RH
4083 int hold_mips_optimize;
4084
4085 assert (! mips_opts.mips16);
4086
4087 treg = (ip->insn_opcode >> 16) & 0x1f;
4088 dreg = (ip->insn_opcode >> 11) & 0x1f;
4089 sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
4090 mask = ip->insn_mo->mask;
4091
4092 expr1.X_op = O_constant;
4093 expr1.X_op_symbol = NULL;
4094 expr1.X_add_symbol = NULL;
4095 expr1.X_add_number = 1;
4096
5919d012
RS
4097 /* Umatched fixups should not be put in the same frag as a relaxable
4098 macro. For example, suppose we have:
4099
4100 lui $4,%hi(l1) # 1
4101 la $5,l2 # 2
4102 addiu $4,$4,%lo(l1) # 3
4103
4104 If instructions 1 and 2 were put in the same frag, md_frob_file would
4105 move the fixup for #1 after the fixups for the "unrelaxed" version of
4106 #2. This would confuse tc_gen_reloc, which expects the relocations
4107 for #2 to be the last for that frag.
4108
4109 If it looks like this situation could happen, put the macro
4110 in a new frag. */
4111 if (mips_hi_fixup_list != 0
4112 && mips_hi_fixup_list->fixp->fx_frag == frag_now)
4113 {
4114 frag_wane (frag_now);
4115 frag_new (0);
4116 }
4117
252b5132
RH
4118 switch (mask)
4119 {
4120 case M_DABS:
4121 dbl = 1;
4122 case M_ABS:
4123 /* bgez $a0,.+12
4124 move v0,$a0
4125 sub v0,$zero,$a0
4126 */
4127
b34976b6 4128 mips_emit_delays (TRUE);
252b5132
RH
4129 ++mips_opts.noreorder;
4130 mips_any_noreorder = 1;
4131
4132 expr1.X_add_number = 8;
4133 macro_build ((char *) NULL, &icnt, &expr1, "bgez", "s,p", sreg);
4134 if (dreg == sreg)
2396cfb9
TS
4135 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "",
4136 0);
252b5132 4137 else
ea1fb5dc 4138 move_register (&icnt, dreg, sreg);
2396cfb9 4139 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
9a41af64 4140 dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
252b5132
RH
4141
4142 --mips_opts.noreorder;
4143 return;
4144
4145 case M_ADD_I:
4146 s = "addi";
4147 s2 = "add";
4148 goto do_addi;
4149 case M_ADDU_I:
4150 s = "addiu";
4151 s2 = "addu";
4152 goto do_addi;
4153 case M_DADD_I:
4154 dbl = 1;
4155 s = "daddi";
4156 s2 = "dadd";
4157 goto do_addi;
4158 case M_DADDU_I:
4159 dbl = 1;
4160 s = "daddiu";
4161 s2 = "daddu";
4162 do_addi:
4163 if (imm_expr.X_op == O_constant
4164 && imm_expr.X_add_number >= -0x8000
4165 && imm_expr.X_add_number < 0x8000)
4166 {
4167 macro_build ((char *) NULL, &icnt, &imm_expr, s, "t,r,j", treg, sreg,
4168 (int) BFD_RELOC_LO16);
4169 return;
4170 }
4171 load_register (&icnt, AT, &imm_expr, dbl);
2396cfb9
TS
4172 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s2, "d,v,t",
4173 treg, sreg, AT);
252b5132
RH
4174 break;
4175
4176 case M_AND_I:
4177 s = "andi";
4178 s2 = "and";
4179 goto do_bit;
4180 case M_OR_I:
4181 s = "ori";
4182 s2 = "or";
4183 goto do_bit;
4184 case M_NOR_I:
4185 s = "";
4186 s2 = "nor";
4187 goto do_bit;
4188 case M_XOR_I:
4189 s = "xori";
4190 s2 = "xor";
4191 do_bit:
4192 if (imm_expr.X_op == O_constant
4193 && imm_expr.X_add_number >= 0
4194 && imm_expr.X_add_number < 0x10000)
4195 {
4196 if (mask != M_NOR_I)
4197 macro_build ((char *) NULL, &icnt, &imm_expr, s, "t,r,i", treg,
4198 sreg, (int) BFD_RELOC_LO16);
4199 else
4200 {
4201 macro_build ((char *) NULL, &icnt, &imm_expr, "ori", "t,r,i",
4202 treg, sreg, (int) BFD_RELOC_LO16);
2396cfb9
TS
4203 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nor",
4204 "d,v,t", treg, treg, 0);
252b5132
RH
4205 }
4206 return;
4207 }
4208
d6bc6245 4209 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
2396cfb9
TS
4210 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s2, "d,v,t",
4211 treg, sreg, AT);
252b5132
RH
4212 break;
4213
4214 case M_BEQ_I:
4215 s = "beq";
4216 goto beq_i;
4217 case M_BEQL_I:
4218 s = "beql";
4219 likely = 1;
4220 goto beq_i;
4221 case M_BNE_I:
4222 s = "bne";
4223 goto beq_i;
4224 case M_BNEL_I:
4225 s = "bnel";
4226 likely = 1;
4227 beq_i:
4228 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4229 {
4230 macro_build ((char *) NULL, &icnt, &offset_expr, s, "s,t,p", sreg,
4231 0);
4232 return;
4233 }
4d34fb5f 4234 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
252b5132
RH
4235 macro_build ((char *) NULL, &icnt, &offset_expr, s, "s,t,p", sreg, AT);
4236 break;
4237
4238 case M_BGEL:
4239 likely = 1;
4240 case M_BGE:
4241 if (treg == 0)
4242 {
4243 macro_build ((char *) NULL, &icnt, &offset_expr,
2396cfb9 4244 likely ? "bgezl" : "bgez", "s,p", sreg);
252b5132
RH
4245 return;
4246 }
4247 if (sreg == 0)
4248 {
4249 macro_build ((char *) NULL, &icnt, &offset_expr,
2396cfb9 4250 likely ? "blezl" : "blez", "s,p", treg);
252b5132
RH
4251 return;
4252 }
2396cfb9
TS
4253 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "slt", "d,v,t",
4254 AT, sreg, treg);
252b5132 4255 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 4256 likely ? "beql" : "beq", "s,t,p", AT, 0);
252b5132
RH
4257 break;
4258
4259 case M_BGTL_I:
4260 likely = 1;
4261 case M_BGT_I:
4262 /* check for > max integer */
4263 maxnum = 0x7fffffff;
ca4e0257 4264 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
252b5132
RH
4265 {
4266 maxnum <<= 16;
4267 maxnum |= 0xffff;
4268 maxnum <<= 16;
4269 maxnum |= 0xffff;
4270 }
4271 if (imm_expr.X_op == O_constant
4272 && imm_expr.X_add_number >= maxnum
ca4e0257 4273 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
252b5132
RH
4274 {
4275 do_false:
4276 /* result is always false */
4277 if (! likely)
4278 {
39c0a331
L
4279 if (warn_nops)
4280 as_warn (_("Branch %s is always false (nop)"),
4281 ip->insn_mo->name);
2396cfb9
TS
4282 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop",
4283 "", 0);
252b5132
RH
4284 }
4285 else
4286 {
39c0a331
L
4287 if (warn_nops)
4288 as_warn (_("Branch likely %s is always false"),
4289 ip->insn_mo->name);
252b5132
RH
4290 macro_build ((char *) NULL, &icnt, &offset_expr, "bnel",
4291 "s,t,p", 0, 0);
4292 }
4293 return;
4294 }
4295 if (imm_expr.X_op != O_constant)
4296 as_bad (_("Unsupported large constant"));
f9419b05 4297 ++imm_expr.X_add_number;
252b5132
RH
4298 /* FALLTHROUGH */
4299 case M_BGE_I:
4300 case M_BGEL_I:
4301 if (mask == M_BGEL_I)
4302 likely = 1;
4303 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4304 {
4305 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 4306 likely ? "bgezl" : "bgez", "s,p", sreg);
252b5132
RH
4307 return;
4308 }
4309 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4310 {
4311 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 4312 likely ? "bgtzl" : "bgtz", "s,p", sreg);
252b5132
RH
4313 return;
4314 }
4315 maxnum = 0x7fffffff;
ca4e0257 4316 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
252b5132
RH
4317 {
4318 maxnum <<= 16;
4319 maxnum |= 0xffff;
4320 maxnum <<= 16;
4321 maxnum |= 0xffff;
4322 }
4323 maxnum = - maxnum - 1;
4324 if (imm_expr.X_op == O_constant
4325 && imm_expr.X_add_number <= maxnum
ca4e0257 4326 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
252b5132
RH
4327 {
4328 do_true:
4329 /* result is always true */
4330 as_warn (_("Branch %s is always true"), ip->insn_mo->name);
4331 macro_build ((char *) NULL, &icnt, &offset_expr, "b", "p");
4332 return;
4333 }
4334 set_at (&icnt, sreg, 0);
4335 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 4336 likely ? "beql" : "beq", "s,t,p", AT, 0);
252b5132
RH
4337 break;
4338
4339 case M_BGEUL:
4340 likely = 1;
4341 case M_BGEU:
4342 if (treg == 0)
4343 goto do_true;
4344 if (sreg == 0)
4345 {
4346 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 4347 likely ? "beql" : "beq", "s,t,p", 0, treg);
252b5132
RH
4348 return;
4349 }
2396cfb9
TS
4350 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
4351 "d,v,t", AT, sreg, treg);
252b5132 4352 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 4353 likely ? "beql" : "beq", "s,t,p", AT, 0);
252b5132
RH
4354 break;
4355
4356 case M_BGTUL_I:
4357 likely = 1;
4358 case M_BGTU_I:
4359 if (sreg == 0
ca4e0257 4360 || (HAVE_32BIT_GPRS
252b5132 4361 && imm_expr.X_op == O_constant
956cd1d6 4362 && imm_expr.X_add_number == (offsetT) 0xffffffff))
252b5132
RH
4363 goto do_false;
4364 if (imm_expr.X_op != O_constant)
4365 as_bad (_("Unsupported large constant"));
f9419b05 4366 ++imm_expr.X_add_number;
252b5132
RH
4367 /* FALLTHROUGH */
4368 case M_BGEU_I:
4369 case M_BGEUL_I:
4370 if (mask == M_BGEUL_I)
4371 likely = 1;
4372 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4373 goto do_true;
4374 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4375 {
4376 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 4377 likely ? "bnel" : "bne", "s,t,p", sreg, 0);
252b5132
RH
4378 return;
4379 }
4380 set_at (&icnt, sreg, 1);
4381 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 4382 likely ? "beql" : "beq", "s,t,p", AT, 0);
252b5132
RH
4383 break;
4384
4385 case M_BGTL:
4386 likely = 1;
4387 case M_BGT:
4388 if (treg == 0)
4389 {
4390 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 4391 likely ? "bgtzl" : "bgtz", "s,p", sreg);
252b5132
RH
4392 return;
4393 }
4394 if (sreg == 0)
4395 {
4396 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 4397 likely ? "bltzl" : "bltz", "s,p", treg);
252b5132
RH
4398 return;
4399 }
2396cfb9
TS
4400 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "slt", "d,v,t",
4401 AT, treg, sreg);
252b5132 4402 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 4403 likely ? "bnel" : "bne", "s,t,p", AT, 0);
252b5132
RH
4404 break;
4405
4406 case M_BGTUL:
4407 likely = 1;
4408 case M_BGTU:
4409 if (treg == 0)
4410 {
4411 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 4412 likely ? "bnel" : "bne", "s,t,p", sreg, 0);
252b5132
RH
4413 return;
4414 }
4415 if (sreg == 0)
4416 goto do_false;
2396cfb9
TS
4417 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
4418 "d,v,t", AT, treg, sreg);
252b5132 4419 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 4420 likely ? "bnel" : "bne", "s,t,p", AT, 0);
252b5132
RH
4421 break;
4422
4423 case M_BLEL:
4424 likely = 1;
4425 case M_BLE:
4426 if (treg == 0)
4427 {
4428 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 4429 likely ? "blezl" : "blez", "s,p", sreg);
252b5132
RH
4430 return;
4431 }
4432 if (sreg == 0)
4433 {
4434 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 4435 likely ? "bgezl" : "bgez", "s,p", treg);
252b5132
RH
4436 return;
4437 }
2396cfb9
TS
4438 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "slt", "d,v,t",
4439 AT, treg, sreg);
252b5132 4440 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 4441 likely ? "beql" : "beq", "s,t,p", AT, 0);
252b5132
RH
4442 break;
4443
4444 case M_BLEL_I:
4445 likely = 1;
4446 case M_BLE_I:
4447 maxnum = 0x7fffffff;
ca4e0257 4448 if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
252b5132
RH
4449 {
4450 maxnum <<= 16;
4451 maxnum |= 0xffff;
4452 maxnum <<= 16;
4453 maxnum |= 0xffff;
4454 }
4455 if (imm_expr.X_op == O_constant
4456 && imm_expr.X_add_number >= maxnum
ca4e0257 4457 && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
252b5132
RH
4458 goto do_true;
4459 if (imm_expr.X_op != O_constant)
4460 as_bad (_("Unsupported large constant"));
f9419b05 4461 ++imm_expr.X_add_number;
252b5132
RH
4462 /* FALLTHROUGH */
4463 case M_BLT_I:
4464 case M_BLTL_I:
4465 if (mask == M_BLTL_I)
4466 likely = 1;
4467 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4468 {
4469 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 4470 likely ? "bltzl" : "bltz", "s,p", sreg);
252b5132
RH
4471 return;
4472 }
4473 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4474 {
4475 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 4476 likely ? "blezl" : "blez", "s,p", sreg);
252b5132
RH
4477 return;
4478 }
4479 set_at (&icnt, sreg, 0);
4480 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 4481 likely ? "bnel" : "bne", "s,t,p", AT, 0);
252b5132
RH
4482 break;
4483
4484 case M_BLEUL:
4485 likely = 1;
4486 case M_BLEU:
4487 if (treg == 0)
4488 {
4489 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 4490 likely ? "beql" : "beq", "s,t,p", sreg, 0);
252b5132
RH
4491 return;
4492 }
4493 if (sreg == 0)
4494 goto do_true;
2396cfb9
TS
4495 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
4496 "d,v,t", AT, treg, sreg);
252b5132 4497 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 4498 likely ? "beql" : "beq", "s,t,p", AT, 0);
252b5132
RH
4499 break;
4500
4501 case M_BLEUL_I:
4502 likely = 1;
4503 case M_BLEU_I:
4504 if (sreg == 0
ca4e0257 4505 || (HAVE_32BIT_GPRS
252b5132 4506 && imm_expr.X_op == O_constant
956cd1d6 4507 && imm_expr.X_add_number == (offsetT) 0xffffffff))
252b5132
RH
4508 goto do_true;
4509 if (imm_expr.X_op != O_constant)
4510 as_bad (_("Unsupported large constant"));
f9419b05 4511 ++imm_expr.X_add_number;
252b5132
RH
4512 /* FALLTHROUGH */
4513 case M_BLTU_I:
4514 case M_BLTUL_I:
4515 if (mask == M_BLTUL_I)
4516 likely = 1;
4517 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4518 goto do_false;
4519 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4520 {
4521 macro_build ((char *) NULL, &icnt, &offset_expr,
4522 likely ? "beql" : "beq",
4523 "s,t,p", sreg, 0);
4524 return;
4525 }
4526 set_at (&icnt, sreg, 1);
4527 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 4528 likely ? "bnel" : "bne", "s,t,p", AT, 0);
252b5132
RH
4529 break;
4530
4531 case M_BLTL:
4532 likely = 1;
4533 case M_BLT:
4534 if (treg == 0)
4535 {
4536 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 4537 likely ? "bltzl" : "bltz", "s,p", sreg);
252b5132
RH
4538 return;
4539 }
4540 if (sreg == 0)
4541 {
4542 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 4543 likely ? "bgtzl" : "bgtz", "s,p", treg);
252b5132
RH
4544 return;
4545 }
2396cfb9
TS
4546 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "slt", "d,v,t",
4547 AT, sreg, treg);
252b5132 4548 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 4549 likely ? "bnel" : "bne", "s,t,p", AT, 0);
252b5132
RH
4550 break;
4551
4552 case M_BLTUL:
4553 likely = 1;
4554 case M_BLTU:
4555 if (treg == 0)
4556 goto do_false;
4557 if (sreg == 0)
4558 {
4559 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 4560 likely ? "bnel" : "bne", "s,t,p", 0, treg);
252b5132
RH
4561 return;
4562 }
2396cfb9
TS
4563 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
4564 "d,v,t", AT, sreg,
252b5132
RH
4565 treg);
4566 macro_build ((char *) NULL, &icnt, &offset_expr,
9a41af64 4567 likely ? "bnel" : "bne", "s,t,p", AT, 0);
252b5132
RH
4568 break;
4569
4570 case M_DDIV_3:
4571 dbl = 1;
4572 case M_DIV_3:
4573 s = "mflo";
4574 goto do_div3;
4575 case M_DREM_3:
4576 dbl = 1;
4577 case M_REM_3:
4578 s = "mfhi";
4579 do_div3:
4580 if (treg == 0)
4581 {
4582 as_warn (_("Divide by zero."));
4583 if (mips_trap)
2396cfb9 4584 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "teq",
9bd7d936 4585 "s,t,q", 0, 0, 7);
252b5132 4586 else
2396cfb9
TS
4587 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
4588 "c", 7);
252b5132
RH
4589 return;
4590 }
4591
b34976b6 4592 mips_emit_delays (TRUE);
252b5132
RH
4593 ++mips_opts.noreorder;
4594 mips_any_noreorder = 1;
4595 if (mips_trap)
4596 {
2396cfb9 4597 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "teq",
9bd7d936 4598 "s,t,q", treg, 0, 7);
2396cfb9 4599 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
9a41af64 4600 dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
252b5132
RH
4601 }
4602 else
4603 {
4604 expr1.X_add_number = 8;
4605 macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", treg, 0);
2396cfb9 4606 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
9a41af64 4607 dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
2396cfb9
TS
4608 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
4609 "c", 7);
252b5132
RH
4610 }
4611 expr1.X_add_number = -1;
4612 macro_build ((char *) NULL, &icnt, &expr1,
4613 dbl ? "daddiu" : "addiu",
4614 "t,r,j", AT, 0, (int) BFD_RELOC_LO16);
4615 expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
4616 macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", treg, AT);
4617 if (dbl)
4618 {
4619 expr1.X_add_number = 1;
4620 macro_build ((char *) NULL, &icnt, &expr1, "daddiu", "t,r,j", AT, 0,
4621 (int) BFD_RELOC_LO16);
2396cfb9
TS
4622 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsll32",
4623 "d,w,<", AT, AT, 31);
252b5132
RH
4624 }
4625 else
4626 {
4627 expr1.X_add_number = 0x80000000;
4628 macro_build ((char *) NULL, &icnt, &expr1, "lui", "t,u", AT,
4629 (int) BFD_RELOC_HI16);
4630 }
4631 if (mips_trap)
4632 {
2396cfb9 4633 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "teq",
9bd7d936 4634 "s,t,q", sreg, AT, 6);
252b5132
RH
4635 /* We want to close the noreorder block as soon as possible, so
4636 that later insns are available for delay slot filling. */
4637 --mips_opts.noreorder;
4638 }
4639 else
4640 {
4641 expr1.X_add_number = 8;
4642 macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", sreg, AT);
2396cfb9
TS
4643 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "",
4644 0);
252b5132
RH
4645
4646 /* We want to close the noreorder block as soon as possible, so
4647 that later insns are available for delay slot filling. */
4648 --mips_opts.noreorder;
4649
2396cfb9
TS
4650 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
4651 "c", 6);
252b5132 4652 }
2396cfb9 4653 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d", dreg);
252b5132
RH
4654 break;
4655
4656 case M_DIV_3I:
4657 s = "div";
4658 s2 = "mflo";
4659 goto do_divi;
4660 case M_DIVU_3I:
4661 s = "divu";
4662 s2 = "mflo";
4663 goto do_divi;
4664 case M_REM_3I:
4665 s = "div";
4666 s2 = "mfhi";
4667 goto do_divi;
4668 case M_REMU_3I:
4669 s = "divu";
4670 s2 = "mfhi";
4671 goto do_divi;
4672 case M_DDIV_3I:
4673 dbl = 1;
4674 s = "ddiv";
4675 s2 = "mflo";
4676 goto do_divi;
4677 case M_DDIVU_3I:
4678 dbl = 1;
4679 s = "ddivu";
4680 s2 = "mflo";
4681 goto do_divi;
4682 case M_DREM_3I:
4683 dbl = 1;
4684 s = "ddiv";
4685 s2 = "mfhi";
4686 goto do_divi;
4687 case M_DREMU_3I:
4688 dbl = 1;
4689 s = "ddivu";
4690 s2 = "mfhi";
4691 do_divi:
4692 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4693 {
4694 as_warn (_("Divide by zero."));
4695 if (mips_trap)
2396cfb9 4696 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "teq",
9bd7d936 4697 "s,t,q", 0, 0, 7);
252b5132 4698 else
2396cfb9
TS
4699 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
4700 "c", 7);
252b5132
RH
4701 return;
4702 }
4703 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4704 {
4705 if (strcmp (s2, "mflo") == 0)
ea1fb5dc 4706 move_register (&icnt, dreg, sreg);
252b5132 4707 else
ea1fb5dc 4708 move_register (&icnt, dreg, 0);
252b5132
RH
4709 return;
4710 }
4711 if (imm_expr.X_op == O_constant
4712 && imm_expr.X_add_number == -1
4713 && s[strlen (s) - 1] != 'u')
4714 {
4715 if (strcmp (s2, "mflo") == 0)
4716 {
2396cfb9
TS
4717 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4718 dbl ? "dneg" : "neg", "d,w", dreg, sreg);
252b5132
RH
4719 }
4720 else
ea1fb5dc 4721 move_register (&icnt, dreg, 0);
252b5132
RH
4722 return;
4723 }
4724
4725 load_register (&icnt, AT, &imm_expr, dbl);
2396cfb9
TS
4726 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "z,s,t",
4727 sreg, AT);
4728 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s2, "d", dreg);
252b5132
RH
4729 break;
4730
4731 case M_DIVU_3:
4732 s = "divu";
4733 s2 = "mflo";
4734 goto do_divu3;
4735 case M_REMU_3:
4736 s = "divu";
4737 s2 = "mfhi";
4738 goto do_divu3;
4739 case M_DDIVU_3:
4740 s = "ddivu";
4741 s2 = "mflo";
4742 goto do_divu3;
4743 case M_DREMU_3:
4744 s = "ddivu";
4745 s2 = "mfhi";
4746 do_divu3:
b34976b6 4747 mips_emit_delays (TRUE);
252b5132
RH
4748 ++mips_opts.noreorder;
4749 mips_any_noreorder = 1;
4750 if (mips_trap)
4751 {
2396cfb9 4752 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "teq",
9bd7d936 4753 "s,t,q", treg, 0, 7);
2396cfb9
TS
4754 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "z,s,t",
4755 sreg, treg);
252b5132
RH
4756 /* We want to close the noreorder block as soon as possible, so
4757 that later insns are available for delay slot filling. */
4758 --mips_opts.noreorder;
4759 }
4760 else
4761 {
4762 expr1.X_add_number = 8;
4763 macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", treg, 0);
2396cfb9
TS
4764 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "z,s,t",
4765 sreg, treg);
252b5132
RH
4766
4767 /* We want to close the noreorder block as soon as possible, so
4768 that later insns are available for delay slot filling. */
4769 --mips_opts.noreorder;
2396cfb9
TS
4770 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
4771 "c", 7);
252b5132 4772 }
2396cfb9 4773 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s2, "d", dreg);
252b5132
RH
4774 return;
4775
4776 case M_DLA_AB:
4777 dbl = 1;
4778 case M_LA_AB:
4779 /* Load the address of a symbol into a register. If breg is not
4780 zero, we then add a base register to it. */
4781
3bec30a8
TS
4782 if (dbl && HAVE_32BIT_GPRS)
4783 as_warn (_("dla used to load 32-bit register"));
4784
c90bbe5b 4785 if (! dbl && HAVE_64BIT_OBJECTS)
3bec30a8
TS
4786 as_warn (_("la used to load 64-bit address"));
4787
0c11417f
MR
4788 if (offset_expr.X_op == O_constant
4789 && offset_expr.X_add_number >= -0x8000
4790 && offset_expr.X_add_number < 0x8000)
4791 {
4792 macro_build ((char *) NULL, &icnt, &offset_expr,
4793 (dbl || HAVE_64BIT_ADDRESSES) ? "daddiu" : "addiu",
4794 "t,r,j", treg, sreg, (int) BFD_RELOC_LO16);
4795 return;
4796 }
4797
afdbd6d0
CD
4798 if (treg == breg)
4799 {
4800 tempreg = AT;
4801 used_at = 1;
4802 }
4803 else
4804 {
4805 tempreg = treg;
4806 used_at = 0;
4807 }
4808
252b5132
RH
4809 /* When generating embedded PIC code, we permit expressions of
4810 the form
afdbd6d0
CD
4811 la $treg,foo-bar
4812 la $treg,foo-bar($breg)
bb2d6cd7 4813 where bar is an address in the current section. These are used
252b5132
RH
4814 when getting the addresses of functions. We don't permit
4815 X_add_number to be non-zero, because if the symbol is
4816 external the relaxing code needs to know that any addend is
4817 purely the offset to X_op_symbol. */
4818 if (mips_pic == EMBEDDED_PIC
4819 && offset_expr.X_op == O_subtract
49309057 4820 && (symbol_constant_p (offset_expr.X_op_symbol)
bb2d6cd7 4821 ? S_GET_SEGMENT (offset_expr.X_op_symbol) == now_seg
49309057
ILT
4822 : (symbol_equated_p (offset_expr.X_op_symbol)
4823 && (S_GET_SEGMENT
4824 (symbol_get_value_expression (offset_expr.X_op_symbol)
4825 ->X_add_symbol)
bb2d6cd7 4826 == now_seg)))
bb2d6cd7
GK
4827 && (offset_expr.X_add_number == 0
4828 || OUTPUT_FLAVOR == bfd_target_elf_flavour))
252b5132 4829 {
afdbd6d0
CD
4830 if (breg == 0)
4831 {
4832 tempreg = treg;
4833 used_at = 0;
4834 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
4835 tempreg, (int) BFD_RELOC_PCREL_HI16_S);
4836 }
4837 else
4838 {
4839 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
4840 tempreg, (int) BFD_RELOC_PCREL_HI16_S);
4841 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4d34fb5f 4842 (dbl || HAVE_64BIT_ADDRESSES) ? "daddu" : "addu",
afdbd6d0
CD
4843 "d,v,t", tempreg, tempreg, breg);
4844 }
252b5132 4845 macro_build ((char *) NULL, &icnt, &offset_expr,
4d34fb5f 4846 (dbl || HAVE_64BIT_ADDRESSES) ? "daddiu" : "addiu",
afdbd6d0
CD
4847 "t,r,j", treg, tempreg, (int) BFD_RELOC_PCREL_LO16);
4848 if (! used_at)
4849 return;
4850 break;
252b5132
RH
4851 }
4852
4853 if (offset_expr.X_op != O_symbol
4854 && offset_expr.X_op != O_constant)
4855 {
4856 as_bad (_("expression too complex"));
4857 offset_expr.X_op = O_constant;
4858 }
4859
252b5132 4860 if (offset_expr.X_op == O_constant)
4d34fb5f
TS
4861 load_register (&icnt, tempreg, &offset_expr,
4862 ((mips_pic == EMBEDDED_PIC || mips_pic == NO_PIC)
4863 ? (dbl || HAVE_64BIT_ADDRESSES)
4864 : HAVE_64BIT_ADDRESSES));
252b5132
RH
4865 else if (mips_pic == NO_PIC)
4866 {
d6bc6245 4867 /* If this is a reference to a GP relative symbol, we want
cdf6fd85 4868 addiu $tempreg,$gp,<sym> (BFD_RELOC_GPREL16)
252b5132
RH
4869 Otherwise we want
4870 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
4871 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
4872 If we have a constant, we need two instructions anyhow,
d6bc6245 4873 so we may as well always use the latter form.
76b3015f 4874
d6bc6245
TS
4875 With 64bit address space and a usable $at we want
4876 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
4877 lui $at,<sym> (BFD_RELOC_HI16_S)
4878 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
4879 daddiu $at,<sym> (BFD_RELOC_LO16)
4880 dsll32 $tempreg,0
3a482fd5 4881 daddu $tempreg,$tempreg,$at
76b3015f 4882
c03099e6 4883 If $at is already in use, we use a path which is suboptimal
d6bc6245
TS
4884 on superscalar processors.
4885 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
4886 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
4887 dsll $tempreg,16
4888 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
4889 dsll $tempreg,16
4890 daddiu $tempreg,<sym> (BFD_RELOC_LO16)
4891 */
f9419b05 4892 char *p = NULL;
d6bc6245 4893 if (HAVE_64BIT_ADDRESSES)
252b5132 4894 {
d6bc6245
TS
4895 /* We don't do GP optimization for now because RELAX_ENCODE can't
4896 hold the data for such large chunks. */
4897
460597ba 4898 if (used_at == 0 && ! mips_opts.noat)
98d3f06f
KH
4899 {
4900 macro_build (p, &icnt, &offset_expr, "lui", "t,u",
4901 tempreg, (int) BFD_RELOC_MIPS_HIGHEST);
4902 macro_build (p, &icnt, &offset_expr, "lui", "t,u",
4903 AT, (int) BFD_RELOC_HI16_S);
4904 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
4905 tempreg, tempreg, (int) BFD_RELOC_MIPS_HIGHER);
4906 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
4907 AT, AT, (int) BFD_RELOC_LO16);
4908 macro_build (p, &icnt, (expressionS *) NULL, "dsll32",
4909 "d,w,<", tempreg, tempreg, 0);
3a482fd5
MR
4910 macro_build (p, &icnt, (expressionS *) NULL, "daddu",
4911 "d,v,t", tempreg, tempreg, AT);
98d3f06f
KH
4912 used_at = 1;
4913 }
4914 else
4915 {
4916 macro_build (p, &icnt, &offset_expr, "lui", "t,u",
4917 tempreg, (int) BFD_RELOC_MIPS_HIGHEST);
4918 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
4919 tempreg, tempreg, (int) BFD_RELOC_MIPS_HIGHER);
4920 macro_build (p, &icnt, (expressionS *) NULL, "dsll", "d,w,<",
4921 tempreg, tempreg, 16);
4922 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
4923 tempreg, tempreg, (int) BFD_RELOC_HI16_S);
4924 macro_build (p, &icnt, (expressionS *) NULL, "dsll", "d,w,<",
4925 tempreg, tempreg, 16);
4926 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
4927 tempreg, tempreg, (int) BFD_RELOC_LO16);
4928 }
4929 }
4930 else
4931 {
4932 if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
4933 && ! nopic_need_relax (offset_expr.X_add_symbol, 1))
4934 {
4935 frag_grow (20);
4936 macro_build ((char *) NULL, &icnt, &offset_expr, "addiu",
c9914766
TS
4937 "t,r,j", tempreg, mips_gp_register,
4938 (int) BFD_RELOC_GPREL16);
98d3f06f
KH
4939 p = frag_var (rs_machine_dependent, 8, 0,
4940 RELAX_ENCODE (4, 8, 0, 4, 0,
4941 mips_opts.warn_about_macros),
4942 offset_expr.X_add_symbol, 0, NULL);
4943 }
4944 macro_build_lui (p, &icnt, &offset_expr, tempreg);
4945 if (p != NULL)
4946 p += 4;
4947 macro_build (p, &icnt, &offset_expr, "addiu",
4948 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
4949 }
252b5132
RH
4950 }
4951 else if (mips_pic == SVR4_PIC && ! mips_big_got)
4952 {
9117d219
NC
4953 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
4954
252b5132
RH
4955 /* If this is a reference to an external symbol, and there
4956 is no constant, we want
4957 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
9117d219
NC
4958 or if tempreg is PIC_CALL_REG
4959 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
252b5132
RH
4960 For a local symbol, we want
4961 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4962 nop
4963 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
4964
4965 If we have a small constant, and this is a reference to
4966 an external symbol, we want
4967 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4968 nop
4969 addiu $tempreg,$tempreg,<constant>
4970 For a local symbol, we want the same instruction
4971 sequence, but we output a BFD_RELOC_LO16 reloc on the
4972 addiu instruction.
4973
4974 If we have a large constant, and this is a reference to
4975 an external symbol, we want
4976 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
4977 lui $at,<hiconstant>
4978 addiu $at,$at,<loconstant>
4979 addu $tempreg,$tempreg,$at
4980 For a local symbol, we want the same instruction
4981 sequence, but we output a BFD_RELOC_LO16 reloc on the
ed6fb7bd
SC
4982 addiu instruction.
4983
4984 For NewABI, we want for local or external data addresses
4985 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
4986 For a local function symbol, we want
4987 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
4988 nop
4989 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
4990 */
4991
252b5132
RH
4992 expr1.X_add_number = offset_expr.X_add_number;
4993 offset_expr.X_add_number = 0;
4994 frag_grow (32);
9117d219
NC
4995 if (expr1.X_add_number == 0 && tempreg == PIC_CALL_REG)
4996 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
ed6fb7bd
SC
4997 else if (HAVE_NEWABI)
4998 lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_DISP;
4d34fb5f
TS
4999 macro_build ((char *) NULL, &icnt, &offset_expr,
5000 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
c9914766 5001 "t,o(b)", tempreg, lw_reloc_type, mips_gp_register);
252b5132
RH
5002 if (expr1.X_add_number == 0)
5003 {
5004 int off;
f9419b05 5005 char *p;
252b5132
RH
5006
5007 if (breg == 0)
5008 off = 0;
5009 else
5010 {
5011 /* We're going to put in an addu instruction using
5012 tempreg, so we may as well insert the nop right
5013 now. */
5014 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5015 "nop", "");
5016 off = 4;
5017 }
5018 p = frag_var (rs_machine_dependent, 8 - off, 0,
5019 RELAX_ENCODE (0, 8 - off, -4 - off, 4 - off, 0,
5020 (breg == 0
5021 ? mips_opts.warn_about_macros
5022 : 0)),
c4e7957c 5023 offset_expr.X_add_symbol, 0, NULL);
252b5132
RH
5024 if (breg == 0)
5025 {
5026 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5027 p += 4;
5028 }
5029 macro_build (p, &icnt, &expr1,
ca4e0257 5030 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
5031 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
5032 /* FIXME: If breg == 0, and the next instruction uses
5033 $tempreg, then if this variant case is used an extra
5034 nop will be generated. */
5035 }
5036 else if (expr1.X_add_number >= -0x8000
5037 && expr1.X_add_number < 0x8000)
5038 {
5039 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5040 "nop", "");
5041 macro_build ((char *) NULL, &icnt, &expr1,
ca4e0257 5042 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132 5043 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
c4e7957c
TS
5044 frag_var (rs_machine_dependent, 0, 0,
5045 RELAX_ENCODE (0, 0, -12, -4, 0, 0),
5046 offset_expr.X_add_symbol, 0, NULL);
252b5132
RH
5047 }
5048 else
5049 {
5050 int off1;
5051
5052 /* If we are going to add in a base register, and the
5053 target register and the base register are the same,
5054 then we are using AT as a temporary register. Since
5055 we want to load the constant into AT, we add our
5056 current AT (from the global offset table) and the
5057 register into the register now, and pretend we were
5058 not using a base register. */
5059 if (breg != treg)
5060 off1 = 0;
5061 else
5062 {
5063 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5064 "nop", "");
5065 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 5066 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
5067 "d,v,t", treg, AT, breg);
5068 breg = 0;
5069 tempreg = treg;
5070 off1 = -8;
5071 }
5072
5073 /* Set mips_optimize around the lui instruction to avoid
5074 inserting an unnecessary nop after the lw. */
5075 hold_mips_optimize = mips_optimize;
5076 mips_optimize = 2;
c4e7957c 5077 macro_build_lui (NULL, &icnt, &expr1, AT);
252b5132
RH
5078 mips_optimize = hold_mips_optimize;
5079
5080 macro_build ((char *) NULL, &icnt, &expr1,
ca4e0257 5081 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
5082 "t,r,j", AT, AT, (int) BFD_RELOC_LO16);
5083 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 5084 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132 5085 "d,v,t", tempreg, tempreg, AT);
c4e7957c
TS
5086 frag_var (rs_machine_dependent, 0, 0,
5087 RELAX_ENCODE (0, 0, -16 + off1, -8, 0, 0),
5088 offset_expr.X_add_symbol, 0, NULL);
252b5132
RH
5089 used_at = 1;
5090 }
5091 }
5092 else if (mips_pic == SVR4_PIC)
5093 {
5094 int gpdel;
f9419b05 5095 char *p;
9117d219
NC
5096 int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5097 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
ed6fb7bd 5098 int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
252b5132
RH
5099
5100 /* This is the large GOT case. If this is a reference to an
5101 external symbol, and there is no constant, we want
5102 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5103 addu $tempreg,$tempreg,$gp
5104 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
9117d219
NC
5105 or if tempreg is PIC_CALL_REG
5106 lui $tempreg,<sym> (BFD_RELOC_MIPS_CALL_HI16)
5107 addu $tempreg,$tempreg,$gp
5108 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
252b5132
RH
5109 For a local symbol, we want
5110 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5111 nop
5112 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5113
5114 If we have a small constant, and this is a reference to
5115 an external symbol, we want
5116 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5117 addu $tempreg,$tempreg,$gp
5118 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5119 nop
5120 addiu $tempreg,$tempreg,<constant>
5121 For a local symbol, we want
5122 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5123 nop
5124 addiu $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5125
5126 If we have a large constant, and this is a reference to
5127 an external symbol, we want
5128 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5129 addu $tempreg,$tempreg,$gp
5130 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5131 lui $at,<hiconstant>
5132 addiu $at,$at,<loconstant>
5133 addu $tempreg,$tempreg,$at
5134 For a local symbol, we want
5135 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5136 lui $at,<hiconstant>
5137 addiu $at,$at,<loconstant> (BFD_RELOC_LO16)
5138 addu $tempreg,$tempreg,$at
438c16b8 5139
ed6fb7bd
SC
5140 For NewABI, we want for local data addresses
5141 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
438c16b8 5142 */
438c16b8 5143
252b5132
RH
5144 expr1.X_add_number = offset_expr.X_add_number;
5145 offset_expr.X_add_number = 0;
5146 frag_grow (52);
f7ea7ef2 5147 if (reg_needs_delay (mips_gp_register))
252b5132
RH
5148 gpdel = 4;
5149 else
5150 gpdel = 0;
9117d219
NC
5151 if (expr1.X_add_number == 0 && tempreg == PIC_CALL_REG)
5152 {
5153 lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5154 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5155 }
252b5132 5156 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
9117d219 5157 tempreg, lui_reloc_type);
252b5132 5158 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 5159 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
c9914766 5160 "d,v,t", tempreg, tempreg, mips_gp_register);
252b5132 5161 macro_build ((char *) NULL, &icnt, &offset_expr,
4d34fb5f 5162 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
9117d219 5163 "t,o(b)", tempreg, lw_reloc_type, tempreg);
252b5132
RH
5164 if (expr1.X_add_number == 0)
5165 {
5166 int off;
5167
5168 if (breg == 0)
5169 off = 0;
5170 else
5171 {
5172 /* We're going to put in an addu instruction using
5173 tempreg, so we may as well insert the nop right
5174 now. */
5175 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5176 "nop", "");
5177 off = 4;
5178 }
5179
5180 p = frag_var (rs_machine_dependent, 12 + gpdel, 0,
5181 RELAX_ENCODE (12 + off, 12 + gpdel, gpdel,
5182 8 + gpdel, 0,
5183 (breg == 0
5184 ? mips_opts.warn_about_macros
5185 : 0)),
c4e7957c 5186 offset_expr.X_add_symbol, 0, NULL);
252b5132
RH
5187 }
5188 else if (expr1.X_add_number >= -0x8000
5189 && expr1.X_add_number < 0x8000)
5190 {
5191 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5192 "nop", "");
5193 macro_build ((char *) NULL, &icnt, &expr1,
ca4e0257 5194 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
5195 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
5196
5197 p = frag_var (rs_machine_dependent, 12 + gpdel, 0,
5198 RELAX_ENCODE (20, 12 + gpdel, gpdel, 8 + gpdel, 0,
5199 (breg == 0
5200 ? mips_opts.warn_about_macros
5201 : 0)),
c4e7957c 5202 offset_expr.X_add_symbol, 0, NULL);
252b5132
RH
5203 }
5204 else
5205 {
5206 int adj, dreg;
5207
5208 /* If we are going to add in a base register, and the
5209 target register and the base register are the same,
5210 then we are using AT as a temporary register. Since
5211 we want to load the constant into AT, we add our
5212 current AT (from the global offset table) and the
5213 register into the register now, and pretend we were
5214 not using a base register. */
5215 if (breg != treg)
5216 {
5217 adj = 0;
5218 dreg = tempreg;
5219 }
5220 else
5221 {
5222 assert (tempreg == AT);
5223 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5224 "nop", "");
5225 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 5226 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
5227 "d,v,t", treg, AT, breg);
5228 dreg = treg;
5229 adj = 8;
5230 }
5231
5232 /* Set mips_optimize around the lui instruction to avoid
5233 inserting an unnecessary nop after the lw. */
5234 hold_mips_optimize = mips_optimize;
5235 mips_optimize = 2;
c4e7957c 5236 macro_build_lui (NULL, &icnt, &expr1, AT);
252b5132
RH
5237 mips_optimize = hold_mips_optimize;
5238
5239 macro_build ((char *) NULL, &icnt, &expr1,
ca4e0257 5240 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
5241 "t,r,j", AT, AT, (int) BFD_RELOC_LO16);
5242 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 5243 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
5244 "d,v,t", dreg, dreg, AT);
5245
5246 p = frag_var (rs_machine_dependent, 16 + gpdel + adj, 0,
5247 RELAX_ENCODE (24 + adj, 16 + gpdel + adj, gpdel,
5248 8 + gpdel, 0,
5249 (breg == 0
5250 ? mips_opts.warn_about_macros
5251 : 0)),
c4e7957c 5252 offset_expr.X_add_symbol, 0, NULL);
252b5132
RH
5253
5254 used_at = 1;
5255 }
5256
5257 if (gpdel > 0)
5258 {
5259 /* This is needed because this instruction uses $gp, but
5260 the first instruction on the main stream does not. */
5261 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5262 p += 4;
5263 }
ed6fb7bd
SC
5264
5265 if (HAVE_NEWABI)
5266 local_reloc_type = (int) BFD_RELOC_MIPS_GOT_DISP;
252b5132 5267 macro_build (p, &icnt, &offset_expr,
4d34fb5f 5268 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
ed6fb7bd
SC
5269 "t,o(b)", tempreg,
5270 local_reloc_type,
c9914766 5271 mips_gp_register);
252b5132 5272 p += 4;
ed6fb7bd
SC
5273 if (expr1.X_add_number == 0 && HAVE_NEWABI)
5274 {
5275 /* BFD_RELOC_MIPS_GOT_DISP is sufficient for newabi */
5276 }
5277 else
5278 if (expr1.X_add_number >= -0x8000
252b5132
RH
5279 && expr1.X_add_number < 0x8000)
5280 {
5281 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5282 p += 4;
5283 macro_build (p, &icnt, &expr1,
ca4e0257 5284 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
5285 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
5286 /* FIXME: If add_number is 0, and there was no base
5287 register, the external symbol case ended with a load,
5288 so if the symbol turns out to not be external, and
5289 the next instruction uses tempreg, an unnecessary nop
5290 will be inserted. */
5291 }
5292 else
5293 {
5294 if (breg == treg)
5295 {
5296 /* We must add in the base register now, as in the
5297 external symbol case. */
5298 assert (tempreg == AT);
5299 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5300 p += 4;
5301 macro_build (p, &icnt, (expressionS *) NULL,
ca4e0257 5302 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
5303 "d,v,t", treg, AT, breg);
5304 p += 4;
5305 tempreg = treg;
5306 /* We set breg to 0 because we have arranged to add
5307 it in in both cases. */
5308 breg = 0;
5309 }
5310
5311 macro_build_lui (p, &icnt, &expr1, AT);
5312 p += 4;
5313 macro_build (p, &icnt, &expr1,
ca4e0257 5314 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
5315 "t,r,j", AT, AT, (int) BFD_RELOC_LO16);
5316 p += 4;
5317 macro_build (p, &icnt, (expressionS *) NULL,
ca4e0257 5318 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
5319 "d,v,t", tempreg, tempreg, AT);
5320 p += 4;
5321 }
5322 }
5323 else if (mips_pic == EMBEDDED_PIC)
5324 {
5325 /* We use
cdf6fd85 5326 addiu $tempreg,$gp,<sym> (BFD_RELOC_GPREL16)
252b5132
RH
5327 */
5328 macro_build ((char *) NULL, &icnt, &offset_expr,
c9914766
TS
5329 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu", "t,r,j",
5330 tempreg, mips_gp_register, (int) BFD_RELOC_GPREL16);
252b5132
RH
5331 }
5332 else
5333 abort ();
5334
5335 if (breg != 0)
4d34fb5f
TS
5336 {
5337 char *s;
5338
5339 if (mips_pic == EMBEDDED_PIC || mips_pic == NO_PIC)
5340 s = (dbl || HAVE_64BIT_ADDRESSES) ? "daddu" : "addu";
5341 else
5342 s = HAVE_64BIT_ADDRESSES ? "daddu" : "addu";
5343
5344 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s,
5345 "d,v,t", treg, tempreg, breg);
5346 }
252b5132
RH
5347
5348 if (! used_at)
5349 return;
5350
5351 break;
5352
5353 case M_J_A:
5354 /* The j instruction may not be used in PIC code, since it
5355 requires an absolute address. We convert it to a b
5356 instruction. */
5357 if (mips_pic == NO_PIC)
5358 macro_build ((char *) NULL, &icnt, &offset_expr, "j", "a");
5359 else
5360 macro_build ((char *) NULL, &icnt, &offset_expr, "b", "p");
5361 return;
5362
5363 /* The jal instructions must be handled as macros because when
5364 generating PIC code they expand to multi-instruction
5365 sequences. Normally they are simple instructions. */
5366 case M_JAL_1:
5367 dreg = RA;
5368 /* Fall through. */
5369 case M_JAL_2:
5370 if (mips_pic == NO_PIC
5371 || mips_pic == EMBEDDED_PIC)
5372 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "jalr",
5373 "d,s", dreg, sreg);
5374 else if (mips_pic == SVR4_PIC)
5375 {
5376 if (sreg != PIC_CALL_REG)
5377 as_warn (_("MIPS PIC call to register other than $25"));
bdaaa2e1 5378
252b5132
RH
5379 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "jalr",
5380 "d,s", dreg, sreg);
6478892d 5381 if (! HAVE_NEWABI)
252b5132 5382 {
6478892d
TS
5383 if (mips_cprestore_offset < 0)
5384 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5385 else
5386 {
7a621144
DJ
5387 if (! mips_frame_reg_valid)
5388 {
5389 as_warn (_("No .frame pseudo-op used in PIC code"));
5390 /* Quiet this warning. */
5391 mips_frame_reg_valid = 1;
5392 }
5393 if (! mips_cprestore_valid)
5394 {
5395 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5396 /* Quiet this warning. */
5397 mips_cprestore_valid = 1;
5398 }
6478892d 5399 expr1.X_add_number = mips_cprestore_offset;
885add95
CD
5400 macro_build_ldst_constoffset ((char *) NULL, &icnt, &expr1,
5401 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5402 mips_gp_register, mips_frame_reg);
6478892d 5403 }
252b5132
RH
5404 }
5405 }
5406 else
5407 abort ();
5408
5409 return;
5410
5411 case M_JAL_A:
5412 if (mips_pic == NO_PIC)
5413 macro_build ((char *) NULL, &icnt, &offset_expr, "jal", "a");
5414 else if (mips_pic == SVR4_PIC)
5415 {
f9419b05
TS
5416 char *p;
5417
252b5132
RH
5418 /* If this is a reference to an external symbol, and we are
5419 using a small GOT, we want
5420 lw $25,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
5421 nop
f9419b05 5422 jalr $ra,$25
252b5132
RH
5423 nop
5424 lw $gp,cprestore($sp)
5425 The cprestore value is set using the .cprestore
5426 pseudo-op. If we are using a big GOT, we want
5427 lui $25,<sym> (BFD_RELOC_MIPS_CALL_HI16)
5428 addu $25,$25,$gp
5429 lw $25,<sym>($25) (BFD_RELOC_MIPS_CALL_LO16)
5430 nop
f9419b05 5431 jalr $ra,$25
252b5132
RH
5432 nop
5433 lw $gp,cprestore($sp)
5434 If the symbol is not external, we want
5435 lw $25,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5436 nop
5437 addiu $25,$25,<sym> (BFD_RELOC_LO16)
f9419b05 5438 jalr $ra,$25
252b5132 5439 nop
438c16b8
TS
5440 lw $gp,cprestore($sp)
5441 For NewABI, we want
5442 lw $25,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
5443 jalr $ra,$25 (BFD_RELOC_MIPS_JALR)
5444 */
5445 if (HAVE_NEWABI)
252b5132
RH
5446 {
5447 macro_build ((char *) NULL, &icnt, &offset_expr,
ca4e0257 5448 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
252b5132 5449 "t,o(b)", PIC_CALL_REG,
438c16b8
TS
5450 (int) BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5451 macro_build_jalr (icnt, &offset_expr);
252b5132
RH
5452 }
5453 else
5454 {
438c16b8
TS
5455 frag_grow (40);
5456 if (! mips_big_got)
5457 {
5458 macro_build ((char *) NULL, &icnt, &offset_expr,
5459 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5460 "t,o(b)", PIC_CALL_REG,
5461 (int) BFD_RELOC_MIPS_CALL16, mips_gp_register);
5462 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5463 "nop", "");
5464 p = frag_var (rs_machine_dependent, 4, 0,
5465 RELAX_ENCODE (0, 4, -8, 0, 0, 0),
5466 offset_expr.X_add_symbol, 0, NULL);
5467 }
252b5132 5468 else
252b5132 5469 {
438c16b8
TS
5470 int gpdel;
5471
5472 if (reg_needs_delay (mips_gp_register))
5473 gpdel = 4;
5474 else
5475 gpdel = 0;
5476 macro_build ((char *) NULL, &icnt, &offset_expr, "lui",
5477 "t,u", PIC_CALL_REG,
5478 (int) BFD_RELOC_MIPS_CALL_HI16);
5479 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5480 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5481 "d,v,t", PIC_CALL_REG, PIC_CALL_REG,
5482 mips_gp_register);
5483 macro_build ((char *) NULL, &icnt, &offset_expr,
5484 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5485 "t,o(b)", PIC_CALL_REG,
5486 (int) BFD_RELOC_MIPS_CALL_LO16, PIC_CALL_REG);
5487 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5488 "nop", "");
5489 p = frag_var (rs_machine_dependent, 12 + gpdel, 0,
5490 RELAX_ENCODE (16, 12 + gpdel, gpdel,
5491 8 + gpdel, 0, 0),
5492 offset_expr.X_add_symbol, 0, NULL);
5493 if (gpdel > 0)
5494 {
5495 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5496 p += 4;
5497 }
5498 macro_build (p, &icnt, &offset_expr,
5499 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5500 "t,o(b)", PIC_CALL_REG,
5501 (int) BFD_RELOC_MIPS_GOT16, mips_gp_register);
5502 p += 4;
252b5132
RH
5503 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5504 p += 4;
5505 }
5506 macro_build (p, &icnt, &offset_expr,
438c16b8
TS
5507 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5508 "t,r,j", PIC_CALL_REG, PIC_CALL_REG,
5509 (int) BFD_RELOC_LO16);
5510 macro_build_jalr (icnt, &offset_expr);
5511
6478892d
TS
5512 if (mips_cprestore_offset < 0)
5513 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5514 else
5515 {
7a621144
DJ
5516 if (! mips_frame_reg_valid)
5517 {
5518 as_warn (_("No .frame pseudo-op used in PIC code"));
5519 /* Quiet this warning. */
5520 mips_frame_reg_valid = 1;
5521 }
5522 if (! mips_cprestore_valid)
5523 {
5524 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5525 /* Quiet this warning. */
5526 mips_cprestore_valid = 1;
5527 }
6478892d
TS
5528 if (mips_opts.noreorder)
5529 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
98d3f06f 5530 "nop", "");
6478892d 5531 expr1.X_add_number = mips_cprestore_offset;
885add95
CD
5532 macro_build_ldst_constoffset ((char *) NULL, &icnt, &expr1,
5533 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5534 mips_gp_register, mips_frame_reg);
6478892d 5535 }
252b5132
RH
5536 }
5537 }
5538 else if (mips_pic == EMBEDDED_PIC)
5539 {
5540 macro_build ((char *) NULL, &icnt, &offset_expr, "bal", "p");
5541 /* The linker may expand the call to a longer sequence which
5542 uses $at, so we must break rather than return. */
5543 break;
5544 }
5545 else
5546 abort ();
5547
5548 return;
5549
5550 case M_LB_AB:
5551 s = "lb";
5552 goto ld;
5553 case M_LBU_AB:
5554 s = "lbu";
5555 goto ld;
5556 case M_LH_AB:
5557 s = "lh";
5558 goto ld;
5559 case M_LHU_AB:
5560 s = "lhu";
5561 goto ld;
5562 case M_LW_AB:
5563 s = "lw";
5564 goto ld;
5565 case M_LWC0_AB:
5566 s = "lwc0";
bdaaa2e1 5567 /* Itbl support may require additional care here. */
252b5132
RH
5568 coproc = 1;
5569 goto ld;
5570 case M_LWC1_AB:
5571 s = "lwc1";
bdaaa2e1 5572 /* Itbl support may require additional care here. */
252b5132
RH
5573 coproc = 1;
5574 goto ld;
5575 case M_LWC2_AB:
5576 s = "lwc2";
bdaaa2e1 5577 /* Itbl support may require additional care here. */
252b5132
RH
5578 coproc = 1;
5579 goto ld;
5580 case M_LWC3_AB:
5581 s = "lwc3";
bdaaa2e1 5582 /* Itbl support may require additional care here. */
252b5132
RH
5583 coproc = 1;
5584 goto ld;
5585 case M_LWL_AB:
5586 s = "lwl";
5587 lr = 1;
5588 goto ld;
5589 case M_LWR_AB:
5590 s = "lwr";
5591 lr = 1;
5592 goto ld;
5593 case M_LDC1_AB:
ec68c924 5594 if (mips_arch == CPU_R4650)
252b5132
RH
5595 {
5596 as_bad (_("opcode not supported on this processor"));
5597 return;
5598 }
5599 s = "ldc1";
bdaaa2e1 5600 /* Itbl support may require additional care here. */
252b5132
RH
5601 coproc = 1;
5602 goto ld;
5603 case M_LDC2_AB:
5604 s = "ldc2";
bdaaa2e1 5605 /* Itbl support may require additional care here. */
252b5132
RH
5606 coproc = 1;
5607 goto ld;
5608 case M_LDC3_AB:
5609 s = "ldc3";
bdaaa2e1 5610 /* Itbl support may require additional care here. */
252b5132
RH
5611 coproc = 1;
5612 goto ld;
5613 case M_LDL_AB:
5614 s = "ldl";
5615 lr = 1;
5616 goto ld;
5617 case M_LDR_AB:
5618 s = "ldr";
5619 lr = 1;
5620 goto ld;
5621 case M_LL_AB:
5622 s = "ll";
5623 goto ld;
5624 case M_LLD_AB:
5625 s = "lld";
5626 goto ld;
5627 case M_LWU_AB:
5628 s = "lwu";
5629 ld:
5630 if (breg == treg || coproc || lr)
5631 {
5632 tempreg = AT;
5633 used_at = 1;
5634 }
5635 else
5636 {
5637 tempreg = treg;
5638 used_at = 0;
5639 }
5640 goto ld_st;
5641 case M_SB_AB:
5642 s = "sb";
5643 goto st;
5644 case M_SH_AB:
5645 s = "sh";
5646 goto st;
5647 case M_SW_AB:
5648 s = "sw";
5649 goto st;
5650 case M_SWC0_AB:
5651 s = "swc0";
bdaaa2e1 5652 /* Itbl support may require additional care here. */
252b5132
RH
5653 coproc = 1;
5654 goto st;
5655 case M_SWC1_AB:
5656 s = "swc1";
bdaaa2e1 5657 /* Itbl support may require additional care here. */
252b5132
RH
5658 coproc = 1;
5659 goto st;
5660 case M_SWC2_AB:
5661 s = "swc2";
bdaaa2e1 5662 /* Itbl support may require additional care here. */
252b5132
RH
5663 coproc = 1;
5664 goto st;
5665 case M_SWC3_AB:
5666 s = "swc3";
bdaaa2e1 5667 /* Itbl support may require additional care here. */
252b5132
RH
5668 coproc = 1;
5669 goto st;
5670 case M_SWL_AB:
5671 s = "swl";
5672 goto st;
5673 case M_SWR_AB:
5674 s = "swr";
5675 goto st;
5676 case M_SC_AB:
5677 s = "sc";
5678 goto st;
5679 case M_SCD_AB:
5680 s = "scd";
5681 goto st;
5682 case M_SDC1_AB:
ec68c924 5683 if (mips_arch == CPU_R4650)
252b5132
RH
5684 {
5685 as_bad (_("opcode not supported on this processor"));
5686 return;
5687 }
5688 s = "sdc1";
5689 coproc = 1;
bdaaa2e1 5690 /* Itbl support may require additional care here. */
252b5132
RH
5691 goto st;
5692 case M_SDC2_AB:
5693 s = "sdc2";
bdaaa2e1 5694 /* Itbl support may require additional care here. */
252b5132
RH
5695 coproc = 1;
5696 goto st;
5697 case M_SDC3_AB:
5698 s = "sdc3";
bdaaa2e1 5699 /* Itbl support may require additional care here. */
252b5132
RH
5700 coproc = 1;
5701 goto st;
5702 case M_SDL_AB:
5703 s = "sdl";
5704 goto st;
5705 case M_SDR_AB:
5706 s = "sdr";
5707 st:
5708 tempreg = AT;
5709 used_at = 1;
5710 ld_st:
bdaaa2e1 5711 /* Itbl support may require additional care here. */
252b5132
RH
5712 if (mask == M_LWC1_AB
5713 || mask == M_SWC1_AB
5714 || mask == M_LDC1_AB
5715 || mask == M_SDC1_AB
5716 || mask == M_L_DAB
5717 || mask == M_S_DAB)
5718 fmt = "T,o(b)";
5719 else if (coproc)
5720 fmt = "E,o(b)";
5721 else
5722 fmt = "t,o(b)";
5723
afdbd6d0
CD
5724 /* For embedded PIC, we allow loads where the offset is calculated
5725 by subtracting a symbol in the current segment from an unknown
5726 symbol, relative to a base register, e.g.:
5727 <op> $treg, <sym>-<localsym>($breg)
5728 This is used by the compiler for switch statements. */
76b3015f 5729 if (mips_pic == EMBEDDED_PIC
afdbd6d0
CD
5730 && offset_expr.X_op == O_subtract
5731 && (symbol_constant_p (offset_expr.X_op_symbol)
5732 ? S_GET_SEGMENT (offset_expr.X_op_symbol) == now_seg
5733 : (symbol_equated_p (offset_expr.X_op_symbol)
5734 && (S_GET_SEGMENT
5735 (symbol_get_value_expression (offset_expr.X_op_symbol)
5736 ->X_add_symbol)
5737 == now_seg)))
5738 && breg != 0
5739 && (offset_expr.X_add_number == 0
5740 || OUTPUT_FLAVOR == bfd_target_elf_flavour))
5741 {
5742 /* For this case, we output the instructions:
5743 lui $tempreg,<sym> (BFD_RELOC_PCREL_HI16_S)
5744 addiu $tempreg,$tempreg,$breg
5745 <op> $treg,<sym>($tempreg) (BFD_RELOC_PCREL_LO16)
5746 If the relocation would fit entirely in 16 bits, it would be
5747 nice to emit:
5748 <op> $treg,<sym>($breg) (BFD_RELOC_PCREL_LO16)
5749 instead, but that seems quite difficult. */
5750 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
5751 tempreg, (int) BFD_RELOC_PCREL_HI16_S);
5752 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5753 ((bfd_arch_bits_per_address (stdoutput) == 32
5754 || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
5755 ? "addu" : "daddu"),
5756 "d,v,t", tempreg, tempreg, breg);
5757 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt, treg,
5758 (int) BFD_RELOC_PCREL_LO16, tempreg);
5759 if (! used_at)
5760 return;
5761 break;
5762 }
5763
252b5132
RH
5764 if (offset_expr.X_op != O_constant
5765 && offset_expr.X_op != O_symbol)
5766 {
5767 as_bad (_("expression too complex"));
5768 offset_expr.X_op = O_constant;
5769 }
5770
5771 /* A constant expression in PIC code can be handled just as it
5772 is in non PIC code. */
5773 if (mips_pic == NO_PIC
5774 || offset_expr.X_op == O_constant)
5775 {
f9419b05
TS
5776 char *p;
5777
252b5132
RH
5778 /* If this is a reference to a GP relative symbol, and there
5779 is no base register, we want
cdf6fd85 5780 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
252b5132
RH
5781 Otherwise, if there is no base register, we want
5782 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
5783 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
5784 If we have a constant, we need two instructions anyhow,
5785 so we always use the latter form.
5786
5787 If we have a base register, and this is a reference to a
5788 GP relative symbol, we want
5789 addu $tempreg,$breg,$gp
cdf6fd85 5790 <op> $treg,<sym>($tempreg) (BFD_RELOC_GPREL16)
252b5132
RH
5791 Otherwise we want
5792 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
5793 addu $tempreg,$tempreg,$breg
5794 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
d6bc6245 5795 With a constant we always use the latter case.
76b3015f 5796
d6bc6245
TS
5797 With 64bit address space and no base register and $at usable,
5798 we want
5799 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
5800 lui $at,<sym> (BFD_RELOC_HI16_S)
5801 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
5802 dsll32 $tempreg,0
5803 daddu $tempreg,$at
5804 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
5805 If we have a base register, we want
5806 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
5807 lui $at,<sym> (BFD_RELOC_HI16_S)
5808 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
5809 daddu $at,$breg
5810 dsll32 $tempreg,0
5811 daddu $tempreg,$at
5812 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
5813
5814 Without $at we can't generate the optimal path for superscalar
5815 processors here since this would require two temporary registers.
5816 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
5817 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
5818 dsll $tempreg,16
5819 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
5820 dsll $tempreg,16
5821 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
5822 If we have a base register, we want
5823 lui $tempreg,<sym> (BFD_RELOC_MIPS_HIGHEST)
5824 daddiu $tempreg,<sym> (BFD_RELOC_MIPS_HIGHER)
5825 dsll $tempreg,16
5826 daddiu $tempreg,<sym> (BFD_RELOC_HI16_S)
5827 dsll $tempreg,16
5828 daddu $tempreg,$tempreg,$breg
5829 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
6373ee54
CD
5830
5831 If we have 64-bit addresses, as an optimization, for
5832 addresses which are 32-bit constants (e.g. kseg0/kseg1
5833 addresses) we fall back to the 32-bit address generation
78d32a17
MR
5834 mechanism since it is more efficient. Note that due to
5835 the signed offset used by memory operations, the 32-bit
5836 range is shifted down by 32768 here. This code should
6373ee54
CD
5837 probably attempt to generate 64-bit constants more
5838 efficiently in general.
d6bc6245 5839 */
6373ee54
CD
5840 if (HAVE_64BIT_ADDRESSES
5841 && !(offset_expr.X_op == O_constant
78d32a17 5842 && IS_SEXT_32BIT_NUM (offset_expr.X_add_number + 0x8000)))
d6bc6245
TS
5843 {
5844 p = NULL;
5845
5846 /* We don't do GP optimization for now because RELAX_ENCODE can't
5847 hold the data for such large chunks. */
5848
460597ba 5849 if (used_at == 0 && ! mips_opts.noat)
d6bc6245
TS
5850 {
5851 macro_build (p, &icnt, &offset_expr, "lui", "t,u",
5852 tempreg, (int) BFD_RELOC_MIPS_HIGHEST);
5853 macro_build (p, &icnt, &offset_expr, "lui", "t,u",
5854 AT, (int) BFD_RELOC_HI16_S);
5855 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
5856 tempreg, tempreg, (int) BFD_RELOC_MIPS_HIGHER);
5857 if (breg != 0)
2396cfb9
TS
5858 macro_build (p, &icnt, (expressionS *) NULL, "daddu",
5859 "d,v,t", AT, AT, breg);
5860 macro_build (p, &icnt, (expressionS *) NULL, "dsll32",
5861 "d,w,<", tempreg, tempreg, 0);
5862 macro_build (p, &icnt, (expressionS *) NULL, "daddu",
5863 "d,v,t", tempreg, tempreg, AT);
d6bc6245
TS
5864 macro_build (p, &icnt, &offset_expr, s,
5865 fmt, treg, (int) BFD_RELOC_LO16, tempreg);
5866 used_at = 1;
5867 }
5868 else
5869 {
5870 macro_build (p, &icnt, &offset_expr, "lui", "t,u",
5871 tempreg, (int) BFD_RELOC_MIPS_HIGHEST);
5872 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
5873 tempreg, tempreg, (int) BFD_RELOC_MIPS_HIGHER);
2396cfb9
TS
5874 macro_build (p, &icnt, (expressionS *) NULL, "dsll",
5875 "d,w,<", tempreg, tempreg, 16);
d6bc6245
TS
5876 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
5877 tempreg, tempreg, (int) BFD_RELOC_HI16_S);
2396cfb9
TS
5878 macro_build (p, &icnt, (expressionS *) NULL, "dsll",
5879 "d,w,<", tempreg, tempreg, 16);
d6bc6245 5880 if (breg != 0)
2396cfb9
TS
5881 macro_build (p, &icnt, (expressionS *) NULL, "daddu",
5882 "d,v,t", tempreg, tempreg, breg);
d6bc6245
TS
5883 macro_build (p, &icnt, &offset_expr, s,
5884 fmt, treg, (int) BFD_RELOC_LO16, tempreg);
5885 }
5886
5887 return;
5888 }
76b3015f 5889
252b5132
RH
5890 if (breg == 0)
5891 {
e7d556df 5892 if ((valueT) offset_expr.X_add_number > MAX_GPREL_OFFSET
252b5132
RH
5893 || nopic_need_relax (offset_expr.X_add_symbol, 1))
5894 p = NULL;
5895 else
5896 {
5897 frag_grow (20);
5898 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
c9914766
TS
5899 treg, (int) BFD_RELOC_GPREL16,
5900 mips_gp_register);
252b5132
RH
5901 p = frag_var (rs_machine_dependent, 8, 0,
5902 RELAX_ENCODE (4, 8, 0, 4, 0,
5903 (mips_opts.warn_about_macros
5904 || (used_at
5905 && mips_opts.noat))),
956cd1d6 5906 offset_expr.X_add_symbol, 0, NULL);
252b5132
RH
5907 used_at = 0;
5908 }
5909 macro_build_lui (p, &icnt, &offset_expr, tempreg);
5910 if (p != NULL)
5911 p += 4;
5912 macro_build (p, &icnt, &offset_expr, s, fmt, treg,
5913 (int) BFD_RELOC_LO16, tempreg);
5914 }
5915 else
5916 {
e7d556df 5917 if ((valueT) offset_expr.X_add_number > MAX_GPREL_OFFSET
252b5132
RH
5918 || nopic_need_relax (offset_expr.X_add_symbol, 1))
5919 p = NULL;
5920 else
5921 {
5922 frag_grow (28);
5923 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 5924 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
c9914766 5925 "d,v,t", tempreg, breg, mips_gp_register);
252b5132 5926 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
cdf6fd85 5927 treg, (int) BFD_RELOC_GPREL16, tempreg);
252b5132
RH
5928 p = frag_var (rs_machine_dependent, 12, 0,
5929 RELAX_ENCODE (8, 12, 0, 8, 0, 0),
956cd1d6 5930 offset_expr.X_add_symbol, 0, NULL);
252b5132
RH
5931 }
5932 macro_build_lui (p, &icnt, &offset_expr, tempreg);
5933 if (p != NULL)
5934 p += 4;
5935 macro_build (p, &icnt, (expressionS *) NULL,
ca4e0257 5936 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
5937 "d,v,t", tempreg, tempreg, breg);
5938 if (p != NULL)
5939 p += 4;
5940 macro_build (p, &icnt, &offset_expr, s, fmt, treg,
5941 (int) BFD_RELOC_LO16, tempreg);
5942 }
5943 }
5944 else if (mips_pic == SVR4_PIC && ! mips_big_got)
5945 {
f9419b05 5946 char *p;
ed6fb7bd 5947 int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
f9419b05 5948
252b5132
RH
5949 /* If this is a reference to an external symbol, we want
5950 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5951 nop
5952 <op> $treg,0($tempreg)
5953 Otherwise we want
5954 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
5955 nop
5956 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5957 <op> $treg,0($tempreg)
ed6fb7bd
SC
5958 If we have NewABI, we want
5959 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT_DISP)
252b5132
RH
5960 If there is a base register, we add it to $tempreg before
5961 the <op>. If there is a constant, we stick it in the
5962 <op> instruction. We don't handle constants larger than
5963 16 bits, because we have no way to load the upper 16 bits
5964 (actually, we could handle them for the subset of cases
5965 in which we are not using $at). */
5966 assert (offset_expr.X_op == O_symbol);
5967 expr1.X_add_number = offset_expr.X_add_number;
5968 offset_expr.X_add_number = 0;
ed6fb7bd
SC
5969 if (HAVE_NEWABI)
5970 lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_DISP;
252b5132
RH
5971 if (expr1.X_add_number < -0x8000
5972 || expr1.X_add_number >= 0x8000)
5973 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
5974 frag_grow (20);
5975 macro_build ((char *) NULL, &icnt, &offset_expr,
c9914766 5976 HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", tempreg,
ed6fb7bd 5977 (int) lw_reloc_type, mips_gp_register);
252b5132 5978 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
bdaaa2e1 5979 p = frag_var (rs_machine_dependent, 4, 0,
252b5132 5980 RELAX_ENCODE (0, 4, -8, 0, 0, 0),
c4e7957c 5981 offset_expr.X_add_symbol, 0, NULL);
252b5132 5982 macro_build (p, &icnt, &offset_expr,
ca4e0257 5983 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
5984 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
5985 if (breg != 0)
5986 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 5987 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
5988 "d,v,t", tempreg, tempreg, breg);
5989 macro_build ((char *) NULL, &icnt, &expr1, s, fmt, treg,
5990 (int) BFD_RELOC_LO16, tempreg);
5991 }
5992 else if (mips_pic == SVR4_PIC)
5993 {
5994 int gpdel;
f9419b05 5995 char *p;
252b5132
RH
5996
5997 /* If this is a reference to an external symbol, we want
5998 lui $tempreg,<sym> (BFD_RELOC_MIPS_GOT_HI16)
5999 addu $tempreg,$tempreg,$gp
6000 lw $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6001 <op> $treg,0($tempreg)
6002 Otherwise we want
6003 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6004 nop
6005 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6006 <op> $treg,0($tempreg)
6007 If there is a base register, we add it to $tempreg before
6008 the <op>. If there is a constant, we stick it in the
6009 <op> instruction. We don't handle constants larger than
6010 16 bits, because we have no way to load the upper 16 bits
6011 (actually, we could handle them for the subset of cases
438c16b8
TS
6012 in which we are not using $at).
6013
6014 For NewABI, we want
6015 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT_PAGE)
6016 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
6017 <op> $treg,0($tempreg)
6018 */
252b5132
RH
6019 assert (offset_expr.X_op == O_symbol);
6020 expr1.X_add_number = offset_expr.X_add_number;
6021 offset_expr.X_add_number = 0;
6022 if (expr1.X_add_number < -0x8000
6023 || expr1.X_add_number >= 0x8000)
6024 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
438c16b8
TS
6025 if (HAVE_NEWABI)
6026 {
6027 macro_build ((char *) NULL, &icnt, &offset_expr,
6028 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
6029 "t,o(b)", tempreg, BFD_RELOC_MIPS_GOT_PAGE,
6030 mips_gp_register);
6031 macro_build ((char *) NULL, &icnt, &offset_expr,
6032 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
6033 "t,r,j", tempreg, tempreg,
6034 BFD_RELOC_MIPS_GOT_OFST);
6035 if (breg != 0)
6036 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6037 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6038 "d,v,t", tempreg, tempreg, breg);
6039 macro_build ((char *) NULL, &icnt, &expr1, s, fmt, treg,
6040 (int) BFD_RELOC_LO16, tempreg);
6041
6042 if (! used_at)
6043 return;
6044
6045 break;
6046 }
f7ea7ef2 6047 if (reg_needs_delay (mips_gp_register))
252b5132
RH
6048 gpdel = 4;
6049 else
6050 gpdel = 0;
6051 frag_grow (36);
6052 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
6053 tempreg, (int) BFD_RELOC_MIPS_GOT_HI16);
6054 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 6055 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
c9914766 6056 "d,v,t", tempreg, tempreg, mips_gp_register);
252b5132 6057 macro_build ((char *) NULL, &icnt, &offset_expr,
ca4e0257 6058 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
252b5132
RH
6059 "t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT_LO16,
6060 tempreg);
6061 p = frag_var (rs_machine_dependent, 12 + gpdel, 0,
6062 RELAX_ENCODE (12, 12 + gpdel, gpdel, 8 + gpdel, 0, 0),
c4e7957c 6063 offset_expr.X_add_symbol, 0, NULL);
252b5132
RH
6064 if (gpdel > 0)
6065 {
6066 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
6067 p += 4;
6068 }
6069 macro_build (p, &icnt, &offset_expr,
ca4e0257 6070 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
c9914766
TS
6071 "t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT16,
6072 mips_gp_register);
252b5132
RH
6073 p += 4;
6074 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
6075 p += 4;
6076 macro_build (p, &icnt, &offset_expr,
ca4e0257 6077 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
252b5132
RH
6078 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
6079 if (breg != 0)
6080 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 6081 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
6082 "d,v,t", tempreg, tempreg, breg);
6083 macro_build ((char *) NULL, &icnt, &expr1, s, fmt, treg,
6084 (int) BFD_RELOC_LO16, tempreg);
6085 }
6086 else if (mips_pic == EMBEDDED_PIC)
6087 {
6088 /* If there is no base register, we want
cdf6fd85 6089 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
252b5132
RH
6090 If there is a base register, we want
6091 addu $tempreg,$breg,$gp
cdf6fd85 6092 <op> $treg,<sym>($tempreg) (BFD_RELOC_GPREL16)
252b5132
RH
6093 */
6094 assert (offset_expr.X_op == O_symbol);
6095 if (breg == 0)
6096 {
6097 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
c9914766 6098 treg, (int) BFD_RELOC_GPREL16, mips_gp_register);
252b5132
RH
6099 used_at = 0;
6100 }
6101 else
6102 {
6103 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 6104 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
c9914766 6105 "d,v,t", tempreg, breg, mips_gp_register);
252b5132 6106 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
cdf6fd85 6107 treg, (int) BFD_RELOC_GPREL16, tempreg);
252b5132
RH
6108 }
6109 }
6110 else
6111 abort ();
6112
6113 if (! used_at)
6114 return;
6115
6116 break;
6117
6118 case M_LI:
6119 case M_LI_S:
6120 load_register (&icnt, treg, &imm_expr, 0);
6121 return;
6122
6123 case M_DLI:
6124 load_register (&icnt, treg, &imm_expr, 1);
6125 return;
6126
6127 case M_LI_SS:
6128 if (imm_expr.X_op == O_constant)
6129 {
6130 load_register (&icnt, AT, &imm_expr, 0);
6131 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6132 "mtc1", "t,G", AT, treg);
6133 break;
6134 }
6135 else
6136 {
6137 assert (offset_expr.X_op == O_symbol
6138 && strcmp (segment_name (S_GET_SEGMENT
6139 (offset_expr.X_add_symbol)),
6140 ".lit4") == 0
6141 && offset_expr.X_add_number == 0);
6142 macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
c9914766 6143 treg, (int) BFD_RELOC_MIPS_LITERAL, mips_gp_register);
252b5132
RH
6144 return;
6145 }
6146
6147 case M_LI_D:
ca4e0257
RS
6148 /* Check if we have a constant in IMM_EXPR. If the GPRs are 64 bits
6149 wide, IMM_EXPR is the entire value. Otherwise IMM_EXPR is the high
6150 order 32 bits of the value and the low order 32 bits are either
6151 zero or in OFFSET_EXPR. */
252b5132
RH
6152 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6153 {
ca4e0257 6154 if (HAVE_64BIT_GPRS)
252b5132
RH
6155 load_register (&icnt, treg, &imm_expr, 1);
6156 else
6157 {
6158 int hreg, lreg;
6159
6160 if (target_big_endian)
6161 {
6162 hreg = treg;
6163 lreg = treg + 1;
6164 }
6165 else
6166 {
6167 hreg = treg + 1;
6168 lreg = treg;
6169 }
6170
6171 if (hreg <= 31)
6172 load_register (&icnt, hreg, &imm_expr, 0);
6173 if (lreg <= 31)
6174 {
6175 if (offset_expr.X_op == O_absent)
ea1fb5dc 6176 move_register (&icnt, lreg, 0);
252b5132
RH
6177 else
6178 {
6179 assert (offset_expr.X_op == O_constant);
6180 load_register (&icnt, lreg, &offset_expr, 0);
6181 }
6182 }
6183 }
6184 return;
6185 }
6186
6187 /* We know that sym is in the .rdata section. First we get the
6188 upper 16 bits of the address. */
6189 if (mips_pic == NO_PIC)
6190 {
956cd1d6 6191 macro_build_lui (NULL, &icnt, &offset_expr, AT);
252b5132
RH
6192 }
6193 else if (mips_pic == SVR4_PIC)
6194 {
6195 macro_build ((char *) NULL, &icnt, &offset_expr,
ca4e0257 6196 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
c9914766
TS
6197 "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16,
6198 mips_gp_register);
252b5132
RH
6199 }
6200 else if (mips_pic == EMBEDDED_PIC)
6201 {
6202 /* For embedded PIC we pick up the entire address off $gp in
6203 a single instruction. */
6204 macro_build ((char *) NULL, &icnt, &offset_expr,
c9914766
TS
6205 HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu", "t,r,j", AT,
6206 mips_gp_register, (int) BFD_RELOC_GPREL16);
252b5132
RH
6207 offset_expr.X_op = O_constant;
6208 offset_expr.X_add_number = 0;
6209 }
6210 else
6211 abort ();
bdaaa2e1 6212
252b5132 6213 /* Now we load the register(s). */
ca4e0257 6214 if (HAVE_64BIT_GPRS)
252b5132
RH
6215 macro_build ((char *) NULL, &icnt, &offset_expr, "ld", "t,o(b)",
6216 treg, (int) BFD_RELOC_LO16, AT);
6217 else
6218 {
6219 macro_build ((char *) NULL, &icnt, &offset_expr, "lw", "t,o(b)",
6220 treg, (int) BFD_RELOC_LO16, AT);
f9419b05 6221 if (treg != RA)
252b5132
RH
6222 {
6223 /* FIXME: How in the world do we deal with the possible
6224 overflow here? */
6225 offset_expr.X_add_number += 4;
6226 macro_build ((char *) NULL, &icnt, &offset_expr, "lw", "t,o(b)",
6227 treg + 1, (int) BFD_RELOC_LO16, AT);
6228 }
6229 }
6230
6231 /* To avoid confusion in tc_gen_reloc, we must ensure that this
6232 does not become a variant frag. */
6233 frag_wane (frag_now);
6234 frag_new (0);
6235
6236 break;
6237
6238 case M_LI_DD:
ca4e0257
RS
6239 /* Check if we have a constant in IMM_EXPR. If the FPRs are 64 bits
6240 wide, IMM_EXPR is the entire value and the GPRs are known to be 64
6241 bits wide as well. Otherwise IMM_EXPR is the high order 32 bits of
6242 the value and the low order 32 bits are either zero or in
6243 OFFSET_EXPR. */
252b5132
RH
6244 if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6245 {
ca4e0257
RS
6246 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_FPRS);
6247 if (HAVE_64BIT_FPRS)
6248 {
6249 assert (HAVE_64BIT_GPRS);
6250 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6251 "dmtc1", "t,S", AT, treg);
6252 }
252b5132
RH
6253 else
6254 {
6255 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6256 "mtc1", "t,G", AT, treg + 1);
6257 if (offset_expr.X_op == O_absent)
6258 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6259 "mtc1", "t,G", 0, treg);
6260 else
6261 {
6262 assert (offset_expr.X_op == O_constant);
6263 load_register (&icnt, AT, &offset_expr, 0);
6264 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6265 "mtc1", "t,G", AT, treg);
6266 }
6267 }
6268 break;
6269 }
6270
6271 assert (offset_expr.X_op == O_symbol
6272 && offset_expr.X_add_number == 0);
6273 s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
6274 if (strcmp (s, ".lit8") == 0)
6275 {
e7af610e 6276 if (mips_opts.isa != ISA_MIPS1)
252b5132
RH
6277 {
6278 macro_build ((char *) NULL, &icnt, &offset_expr, "ldc1",
c9914766
TS
6279 "T,o(b)", treg, (int) BFD_RELOC_MIPS_LITERAL,
6280 mips_gp_register);
252b5132
RH
6281 return;
6282 }
c9914766 6283 breg = mips_gp_register;
252b5132
RH
6284 r = BFD_RELOC_MIPS_LITERAL;
6285 goto dob;
6286 }
6287 else
6288 {
6289 assert (strcmp (s, RDATA_SECTION_NAME) == 0);
6290 if (mips_pic == SVR4_PIC)
6291 macro_build ((char *) NULL, &icnt, &offset_expr,
ca4e0257 6292 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
c9914766
TS
6293 "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16,
6294 mips_gp_register);
252b5132
RH
6295 else
6296 {
6297 /* FIXME: This won't work for a 64 bit address. */
956cd1d6 6298 macro_build_lui (NULL, &icnt, &offset_expr, AT);
252b5132 6299 }
bdaaa2e1 6300
e7af610e 6301 if (mips_opts.isa != ISA_MIPS1)
252b5132
RH
6302 {
6303 macro_build ((char *) NULL, &icnt, &offset_expr, "ldc1",
6304 "T,o(b)", treg, (int) BFD_RELOC_LO16, AT);
6305
6306 /* To avoid confusion in tc_gen_reloc, we must ensure
6307 that this does not become a variant frag. */
6308 frag_wane (frag_now);
6309 frag_new (0);
6310
6311 break;
6312 }
6313 breg = AT;
6314 r = BFD_RELOC_LO16;
6315 goto dob;
6316 }
6317
6318 case M_L_DOB:
ec68c924 6319 if (mips_arch == CPU_R4650)
252b5132
RH
6320 {
6321 as_bad (_("opcode not supported on this processor"));
6322 return;
6323 }
6324 /* Even on a big endian machine $fn comes before $fn+1. We have
6325 to adjust when loading from memory. */
6326 r = BFD_RELOC_LO16;
6327 dob:
e7af610e 6328 assert (mips_opts.isa == ISA_MIPS1);
252b5132
RH
6329 macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
6330 target_big_endian ? treg + 1 : treg,
6331 (int) r, breg);
6332 /* FIXME: A possible overflow which I don't know how to deal
6333 with. */
6334 offset_expr.X_add_number += 4;
6335 macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
6336 target_big_endian ? treg : treg + 1,
6337 (int) r, breg);
6338
6339 /* To avoid confusion in tc_gen_reloc, we must ensure that this
6340 does not become a variant frag. */
6341 frag_wane (frag_now);
6342 frag_new (0);
6343
6344 if (breg != AT)
6345 return;
6346 break;
6347
6348 case M_L_DAB:
6349 /*
6350 * The MIPS assembler seems to check for X_add_number not
6351 * being double aligned and generating:
6352 * lui at,%hi(foo+1)
6353 * addu at,at,v1
6354 * addiu at,at,%lo(foo+1)
6355 * lwc1 f2,0(at)
6356 * lwc1 f3,4(at)
6357 * But, the resulting address is the same after relocation so why
6358 * generate the extra instruction?
6359 */
ec68c924 6360 if (mips_arch == CPU_R4650)
252b5132
RH
6361 {
6362 as_bad (_("opcode not supported on this processor"));
6363 return;
6364 }
bdaaa2e1 6365 /* Itbl support may require additional care here. */
252b5132 6366 coproc = 1;
e7af610e 6367 if (mips_opts.isa != ISA_MIPS1)
252b5132
RH
6368 {
6369 s = "ldc1";
6370 goto ld;
6371 }
6372
6373 s = "lwc1";
6374 fmt = "T,o(b)";
6375 goto ldd_std;
6376
6377 case M_S_DAB:
ec68c924 6378 if (mips_arch == CPU_R4650)
252b5132
RH
6379 {
6380 as_bad (_("opcode not supported on this processor"));
6381 return;
6382 }
6383
e7af610e 6384 if (mips_opts.isa != ISA_MIPS1)
252b5132
RH
6385 {
6386 s = "sdc1";
6387 goto st;
6388 }
6389
6390 s = "swc1";
6391 fmt = "T,o(b)";
bdaaa2e1 6392 /* Itbl support may require additional care here. */
252b5132
RH
6393 coproc = 1;
6394 goto ldd_std;
6395
6396 case M_LD_AB:
ca4e0257 6397 if (HAVE_64BIT_GPRS)
252b5132
RH
6398 {
6399 s = "ld";
6400 goto ld;
6401 }
6402
6403 s = "lw";
6404 fmt = "t,o(b)";
6405 goto ldd_std;
6406
6407 case M_SD_AB:
ca4e0257 6408 if (HAVE_64BIT_GPRS)
252b5132
RH
6409 {
6410 s = "sd";
6411 goto st;
6412 }
6413
6414 s = "sw";
6415 fmt = "t,o(b)";
6416
6417 ldd_std:
afdbd6d0
CD
6418 /* We do _not_ bother to allow embedded PIC (symbol-local_symbol)
6419 loads for the case of doing a pair of loads to simulate an 'ld'.
6420 This is not currently done by the compiler, and assembly coders
6421 writing embedded-pic code can cope. */
6422
252b5132
RH
6423 if (offset_expr.X_op != O_symbol
6424 && offset_expr.X_op != O_constant)
6425 {
6426 as_bad (_("expression too complex"));
6427 offset_expr.X_op = O_constant;
6428 }
6429
6430 /* Even on a big endian machine $fn comes before $fn+1. We have
6431 to adjust when loading from memory. We set coproc if we must
6432 load $fn+1 first. */
bdaaa2e1 6433 /* Itbl support may require additional care here. */
252b5132
RH
6434 if (! target_big_endian)
6435 coproc = 0;
6436
6437 if (mips_pic == NO_PIC
6438 || offset_expr.X_op == O_constant)
6439 {
f9419b05
TS
6440 char *p;
6441
252b5132 6442 /* If this is a reference to a GP relative symbol, we want
cdf6fd85
TS
6443 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
6444 <op> $treg+1,<sym>+4($gp) (BFD_RELOC_GPREL16)
252b5132
RH
6445 If we have a base register, we use this
6446 addu $at,$breg,$gp
cdf6fd85
TS
6447 <op> $treg,<sym>($at) (BFD_RELOC_GPREL16)
6448 <op> $treg+1,<sym>+4($at) (BFD_RELOC_GPREL16)
252b5132
RH
6449 If this is not a GP relative symbol, we want
6450 lui $at,<sym> (BFD_RELOC_HI16_S)
6451 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
6452 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
6453 If there is a base register, we add it to $at after the
6454 lui instruction. If there is a constant, we always use
6455 the last case. */
e7d556df 6456 if ((valueT) offset_expr.X_add_number > MAX_GPREL_OFFSET
252b5132
RH
6457 || nopic_need_relax (offset_expr.X_add_symbol, 1))
6458 {
6459 p = NULL;
6460 used_at = 1;
6461 }
6462 else
6463 {
6464 int off;
6465
6466 if (breg == 0)
6467 {
6468 frag_grow (28);
c9914766 6469 tempreg = mips_gp_register;
252b5132
RH
6470 off = 0;
6471 used_at = 0;
6472 }
6473 else
6474 {
6475 frag_grow (36);
6476 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 6477 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
c9914766 6478 "d,v,t", AT, breg, mips_gp_register);
252b5132
RH
6479 tempreg = AT;
6480 off = 4;
6481 used_at = 1;
6482 }
6483
beae10d5 6484 /* Itbl support may require additional care here. */
252b5132
RH
6485 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
6486 coproc ? treg + 1 : treg,
cdf6fd85 6487 (int) BFD_RELOC_GPREL16, tempreg);
252b5132
RH
6488 offset_expr.X_add_number += 4;
6489
6490 /* Set mips_optimize to 2 to avoid inserting an
6491 undesired nop. */
6492 hold_mips_optimize = mips_optimize;
6493 mips_optimize = 2;
beae10d5 6494 /* Itbl support may require additional care here. */
252b5132
RH
6495 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
6496 coproc ? treg : treg + 1,
cdf6fd85 6497 (int) BFD_RELOC_GPREL16, tempreg);
252b5132
RH
6498 mips_optimize = hold_mips_optimize;
6499
6500 p = frag_var (rs_machine_dependent, 12 + off, 0,
6501 RELAX_ENCODE (8 + off, 12 + off, 0, 4 + off, 1,
6502 used_at && mips_opts.noat),
956cd1d6 6503 offset_expr.X_add_symbol, 0, NULL);
252b5132
RH
6504
6505 /* We just generated two relocs. When tc_gen_reloc
6506 handles this case, it will skip the first reloc and
6507 handle the second. The second reloc already has an
6508 extra addend of 4, which we added above. We must
6509 subtract it out, and then subtract another 4 to make
6510 the first reloc come out right. The second reloc
6511 will come out right because we are going to add 4 to
6512 offset_expr when we build its instruction below.
6513
6514 If we have a symbol, then we don't want to include
6515 the offset, because it will wind up being included
6516 when we generate the reloc. */
6517
6518 if (offset_expr.X_op == O_constant)
6519 offset_expr.X_add_number -= 8;
6520 else
6521 {
6522 offset_expr.X_add_number = -4;
6523 offset_expr.X_op = O_constant;
6524 }
6525 }
6526 macro_build_lui (p, &icnt, &offset_expr, AT);
6527 if (p != NULL)
6528 p += 4;
6529 if (breg != 0)
6530 {
6531 macro_build (p, &icnt, (expressionS *) NULL,
ca4e0257 6532 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
6533 "d,v,t", AT, breg, AT);
6534 if (p != NULL)
6535 p += 4;
6536 }
beae10d5 6537 /* Itbl support may require additional care here. */
252b5132
RH
6538 macro_build (p, &icnt, &offset_expr, s, fmt,
6539 coproc ? treg + 1 : treg,
6540 (int) BFD_RELOC_LO16, AT);
6541 if (p != NULL)
6542 p += 4;
6543 /* FIXME: How do we handle overflow here? */
6544 offset_expr.X_add_number += 4;
beae10d5 6545 /* Itbl support may require additional care here. */
252b5132
RH
6546 macro_build (p, &icnt, &offset_expr, s, fmt,
6547 coproc ? treg : treg + 1,
6548 (int) BFD_RELOC_LO16, AT);
bdaaa2e1 6549 }
252b5132
RH
6550 else if (mips_pic == SVR4_PIC && ! mips_big_got)
6551 {
6552 int off;
6553
6554 /* If this is a reference to an external symbol, we want
6555 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6556 nop
6557 <op> $treg,0($at)
6558 <op> $treg+1,4($at)
6559 Otherwise we want
6560 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6561 nop
6562 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
6563 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
6564 If there is a base register we add it to $at before the
6565 lwc1 instructions. If there is a constant we include it
6566 in the lwc1 instructions. */
6567 used_at = 1;
6568 expr1.X_add_number = offset_expr.X_add_number;
6569 offset_expr.X_add_number = 0;
6570 if (expr1.X_add_number < -0x8000
6571 || expr1.X_add_number >= 0x8000 - 4)
6572 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6573 if (breg == 0)
6574 off = 0;
6575 else
6576 off = 4;
6577 frag_grow (24 + off);
6578 macro_build ((char *) NULL, &icnt, &offset_expr,
c9914766
TS
6579 HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", AT,
6580 (int) BFD_RELOC_MIPS_GOT16, mips_gp_register);
252b5132
RH
6581 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
6582 if (breg != 0)
6583 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 6584 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132 6585 "d,v,t", AT, breg, AT);
beae10d5 6586 /* Itbl support may require additional care here. */
252b5132
RH
6587 macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
6588 coproc ? treg + 1 : treg,
6589 (int) BFD_RELOC_LO16, AT);
6590 expr1.X_add_number += 4;
6591
6592 /* Set mips_optimize to 2 to avoid inserting an undesired
6593 nop. */
6594 hold_mips_optimize = mips_optimize;
6595 mips_optimize = 2;
beae10d5 6596 /* Itbl support may require additional care here. */
252b5132
RH
6597 macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
6598 coproc ? treg : treg + 1,
6599 (int) BFD_RELOC_LO16, AT);
6600 mips_optimize = hold_mips_optimize;
6601
6602 (void) frag_var (rs_machine_dependent, 0, 0,
6603 RELAX_ENCODE (0, 0, -16 - off, -8, 1, 0),
c4e7957c 6604 offset_expr.X_add_symbol, 0, NULL);
252b5132
RH
6605 }
6606 else if (mips_pic == SVR4_PIC)
6607 {
6608 int gpdel, off;
f9419b05 6609 char *p;
252b5132
RH
6610
6611 /* If this is a reference to an external symbol, we want
6612 lui $at,<sym> (BFD_RELOC_MIPS_GOT_HI16)
6613 addu $at,$at,$gp
6614 lw $at,<sym>($at) (BFD_RELOC_MIPS_GOT_LO16)
6615 nop
6616 <op> $treg,0($at)
6617 <op> $treg+1,4($at)
6618 Otherwise we want
6619 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
6620 nop
6621 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
6622 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
6623 If there is a base register we add it to $at before the
6624 lwc1 instructions. If there is a constant we include it
6625 in the lwc1 instructions. */
6626 used_at = 1;
6627 expr1.X_add_number = offset_expr.X_add_number;
6628 offset_expr.X_add_number = 0;
6629 if (expr1.X_add_number < -0x8000
6630 || expr1.X_add_number >= 0x8000 - 4)
6631 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
c9914766 6632 if (reg_needs_delay (mips_gp_register))
252b5132
RH
6633 gpdel = 4;
6634 else
6635 gpdel = 0;
6636 if (breg == 0)
6637 off = 0;
6638 else
6639 off = 4;
6640 frag_grow (56);
6641 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
6642 AT, (int) BFD_RELOC_MIPS_GOT_HI16);
6643 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 6644 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
c9914766 6645 "d,v,t", AT, AT, mips_gp_register);
252b5132 6646 macro_build ((char *) NULL, &icnt, &offset_expr,
ca4e0257 6647 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
252b5132
RH
6648 "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT_LO16, AT);
6649 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
6650 if (breg != 0)
6651 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 6652 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132 6653 "d,v,t", AT, breg, AT);
beae10d5 6654 /* Itbl support may require additional care here. */
252b5132
RH
6655 macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
6656 coproc ? treg + 1 : treg,
6657 (int) BFD_RELOC_LO16, AT);
6658 expr1.X_add_number += 4;
6659
6660 /* Set mips_optimize to 2 to avoid inserting an undesired
6661 nop. */
6662 hold_mips_optimize = mips_optimize;
6663 mips_optimize = 2;
beae10d5 6664 /* Itbl support may require additional care here. */
252b5132
RH
6665 macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
6666 coproc ? treg : treg + 1,
6667 (int) BFD_RELOC_LO16, AT);
6668 mips_optimize = hold_mips_optimize;
6669 expr1.X_add_number -= 4;
6670
6671 p = frag_var (rs_machine_dependent, 16 + gpdel + off, 0,
6672 RELAX_ENCODE (24 + off, 16 + gpdel + off, gpdel,
6673 8 + gpdel + off, 1, 0),
c4e7957c 6674 offset_expr.X_add_symbol, 0, NULL);
252b5132
RH
6675 if (gpdel > 0)
6676 {
6677 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
6678 p += 4;
6679 }
6680 macro_build (p, &icnt, &offset_expr,
ca4e0257 6681 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
c9914766
TS
6682 "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16,
6683 mips_gp_register);
252b5132
RH
6684 p += 4;
6685 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
6686 p += 4;
6687 if (breg != 0)
6688 {
6689 macro_build (p, &icnt, (expressionS *) NULL,
ca4e0257 6690 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
6691 "d,v,t", AT, breg, AT);
6692 p += 4;
6693 }
beae10d5 6694 /* Itbl support may require additional care here. */
252b5132
RH
6695 macro_build (p, &icnt, &expr1, s, fmt,
6696 coproc ? treg + 1 : treg,
6697 (int) BFD_RELOC_LO16, AT);
6698 p += 4;
6699 expr1.X_add_number += 4;
6700
6701 /* Set mips_optimize to 2 to avoid inserting an undesired
6702 nop. */
6703 hold_mips_optimize = mips_optimize;
6704 mips_optimize = 2;
beae10d5 6705 /* Itbl support may require additional care here. */
252b5132
RH
6706 macro_build (p, &icnt, &expr1, s, fmt,
6707 coproc ? treg : treg + 1,
6708 (int) BFD_RELOC_LO16, AT);
6709 mips_optimize = hold_mips_optimize;
6710 }
6711 else if (mips_pic == EMBEDDED_PIC)
6712 {
6713 /* If there is no base register, we use
cdf6fd85
TS
6714 <op> $treg,<sym>($gp) (BFD_RELOC_GPREL16)
6715 <op> $treg+1,<sym>+4($gp) (BFD_RELOC_GPREL16)
252b5132
RH
6716 If we have a base register, we use
6717 addu $at,$breg,$gp
cdf6fd85
TS
6718 <op> $treg,<sym>($at) (BFD_RELOC_GPREL16)
6719 <op> $treg+1,<sym>+4($at) (BFD_RELOC_GPREL16)
252b5132
RH
6720 */
6721 if (breg == 0)
6722 {
c9914766 6723 tempreg = mips_gp_register;
252b5132
RH
6724 used_at = 0;
6725 }
6726 else
6727 {
6728 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 6729 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
c9914766 6730 "d,v,t", AT, breg, mips_gp_register);
252b5132
RH
6731 tempreg = AT;
6732 used_at = 1;
6733 }
6734
beae10d5 6735 /* Itbl support may require additional care here. */
252b5132
RH
6736 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
6737 coproc ? treg + 1 : treg,
cdf6fd85 6738 (int) BFD_RELOC_GPREL16, tempreg);
252b5132 6739 offset_expr.X_add_number += 4;
beae10d5 6740 /* Itbl support may require additional care here. */
252b5132
RH
6741 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
6742 coproc ? treg : treg + 1,
cdf6fd85 6743 (int) BFD_RELOC_GPREL16, tempreg);
252b5132
RH
6744 }
6745 else
6746 abort ();
6747
6748 if (! used_at)
6749 return;
6750
6751 break;
6752
6753 case M_LD_OB:
6754 s = "lw";
6755 goto sd_ob;
6756 case M_SD_OB:
6757 s = "sw";
6758 sd_ob:
ca4e0257 6759 assert (HAVE_32BIT_ADDRESSES);
252b5132
RH
6760 macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg,
6761 (int) BFD_RELOC_LO16, breg);
6762 offset_expr.X_add_number += 4;
6763 macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg + 1,
6764 (int) BFD_RELOC_LO16, breg);
6765 return;
6766
6767 /* New code added to support COPZ instructions.
6768 This code builds table entries out of the macros in mip_opcodes.
6769 R4000 uses interlocks to handle coproc delays.
6770 Other chips (like the R3000) require nops to be inserted for delays.
6771
f72c8c98 6772 FIXME: Currently, we require that the user handle delays.
252b5132
RH
6773 In order to fill delay slots for non-interlocked chips,
6774 we must have a way to specify delays based on the coprocessor.
6775 Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
6776 What are the side-effects of the cop instruction?
6777 What cache support might we have and what are its effects?
6778 Both coprocessor & memory require delays. how long???
bdaaa2e1 6779 What registers are read/set/modified?
252b5132
RH
6780
6781 If an itbl is provided to interpret cop instructions,
bdaaa2e1 6782 this knowledge can be encoded in the itbl spec. */
252b5132
RH
6783
6784 case M_COP0:
6785 s = "c0";
6786 goto copz;
6787 case M_COP1:
6788 s = "c1";
6789 goto copz;
6790 case M_COP2:
6791 s = "c2";
6792 goto copz;
6793 case M_COP3:
6794 s = "c3";
6795 copz:
6796 /* For now we just do C (same as Cz). The parameter will be
6797 stored in insn_opcode by mips_ip. */
6798 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "C",
6799 ip->insn_opcode);
6800 return;
6801
ea1fb5dc
RS
6802 case M_MOVE:
6803 move_register (&icnt, dreg, sreg);
6804 return;
6805
252b5132
RH
6806#ifdef LOSING_COMPILER
6807 default:
6808 /* Try and see if this is a new itbl instruction.
6809 This code builds table entries out of the macros in mip_opcodes.
6810 FIXME: For now we just assemble the expression and pass it's
6811 value along as a 32-bit immediate.
bdaaa2e1 6812 We may want to have the assembler assemble this value,
252b5132
RH
6813 so that we gain the assembler's knowledge of delay slots,
6814 symbols, etc.
6815 Would it be more efficient to use mask (id) here? */
bdaaa2e1 6816 if (itbl_have_entries
252b5132 6817 && (immed_expr = itbl_assemble (ip->insn_mo->name, "")))
beae10d5 6818 {
252b5132
RH
6819 s = ip->insn_mo->name;
6820 s2 = "cop3";
6821 coproc = ITBL_DECODE_PNUM (immed_expr);;
6822 macro_build ((char *) NULL, &icnt, &immed_expr, s, "C");
6823 return;
beae10d5 6824 }
252b5132
RH
6825 macro2 (ip);
6826 return;
6827 }
6828 if (mips_opts.noat)
6829 as_warn (_("Macro used $at after \".set noat\""));
6830}
bdaaa2e1 6831
252b5132
RH
6832static void
6833macro2 (ip)
6834 struct mips_cl_insn *ip;
6835{
6836 register int treg, sreg, dreg, breg;
6837 int tempreg;
6838 int mask;
6839 int icnt = 0;
6840 int used_at;
6841 expressionS expr1;
6842 const char *s;
6843 const char *s2;
6844 const char *fmt;
6845 int likely = 0;
6846 int dbl = 0;
6847 int coproc = 0;
6848 int lr = 0;
6849 int imm = 0;
6850 int off;
6851 offsetT maxnum;
6852 bfd_reloc_code_real_type r;
6853 char *p;
bdaaa2e1 6854
252b5132
RH
6855 treg = (ip->insn_opcode >> 16) & 0x1f;
6856 dreg = (ip->insn_opcode >> 11) & 0x1f;
6857 sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
6858 mask = ip->insn_mo->mask;
bdaaa2e1 6859
252b5132
RH
6860 expr1.X_op = O_constant;
6861 expr1.X_op_symbol = NULL;
6862 expr1.X_add_symbol = NULL;
6863 expr1.X_add_number = 1;
bdaaa2e1 6864
252b5132
RH
6865 switch (mask)
6866 {
6867#endif /* LOSING_COMPILER */
6868
6869 case M_DMUL:
6870 dbl = 1;
6871 case M_MUL:
2396cfb9
TS
6872 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6873 dbl ? "dmultu" : "multu", "s,t", sreg, treg);
6874 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "d",
6875 dreg);
252b5132
RH
6876 return;
6877
6878 case M_DMUL_I:
6879 dbl = 1;
6880 case M_MUL_I:
6881 /* The MIPS assembler some times generates shifts and adds. I'm
6882 not trying to be that fancy. GCC should do this for us
6883 anyway. */
6884 load_register (&icnt, AT, &imm_expr, dbl);
2396cfb9 6885 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
9a41af64 6886 dbl ? "dmult" : "mult", "s,t", sreg, AT);
2396cfb9
TS
6887 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "d",
6888 dreg);
252b5132
RH
6889 break;
6890
6891 case M_DMULO_I:
6892 dbl = 1;
6893 case M_MULO_I:
6894 imm = 1;
6895 goto do_mulo;
6896
6897 case M_DMULO:
6898 dbl = 1;
6899 case M_MULO:
6900 do_mulo:
b34976b6 6901 mips_emit_delays (TRUE);
252b5132
RH
6902 ++mips_opts.noreorder;
6903 mips_any_noreorder = 1;
6904 if (imm)
6905 load_register (&icnt, AT, &imm_expr, dbl);
2396cfb9 6906 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
9a41af64 6907 dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
2396cfb9
TS
6908 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "d",
6909 dreg);
6910 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
f9419b05 6911 dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
2396cfb9
TS
6912 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mfhi", "d",
6913 AT);
252b5132 6914 if (mips_trap)
9bd7d936
MR
6915 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "tne",
6916 "s,t,q", dreg, AT, 6);
252b5132
RH
6917 else
6918 {
6919 expr1.X_add_number = 8;
2396cfb9
TS
6920 macro_build ((char *) NULL, &icnt, &expr1, "beq", "s,t,p", dreg,
6921 AT);
6922 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "",
6923 0);
6924 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
6925 "c", 6);
252b5132
RH
6926 }
6927 --mips_opts.noreorder;
2396cfb9 6928 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "d", dreg);
252b5132
RH
6929 break;
6930
6931 case M_DMULOU_I:
6932 dbl = 1;
6933 case M_MULOU_I:
6934 imm = 1;
6935 goto do_mulou;
6936
6937 case M_DMULOU:
6938 dbl = 1;
6939 case M_MULOU:
6940 do_mulou:
b34976b6 6941 mips_emit_delays (TRUE);
252b5132
RH
6942 ++mips_opts.noreorder;
6943 mips_any_noreorder = 1;
6944 if (imm)
6945 load_register (&icnt, AT, &imm_expr, dbl);
2396cfb9 6946 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
252b5132
RH
6947 dbl ? "dmultu" : "multu",
6948 "s,t", sreg, imm ? AT : treg);
2396cfb9
TS
6949 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mfhi", "d",
6950 AT);
6951 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "d",
6952 dreg);
252b5132 6953 if (mips_trap)
9bd7d936
MR
6954 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "tne",
6955 "s,t,q", AT, 0, 6);
252b5132
RH
6956 else
6957 {
6958 expr1.X_add_number = 8;
6959 macro_build ((char *) NULL, &icnt, &expr1, "beq", "s,t,p", AT, 0);
2396cfb9
TS
6960 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "",
6961 0);
6962 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
6963 "c", 6);
252b5132
RH
6964 }
6965 --mips_opts.noreorder;
6966 break;
6967
771c7ce4 6968 case M_DROL:
af7ee8bf 6969 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_arch))
82dd0097
CD
6970 {
6971 if (dreg == sreg)
6972 {
6973 tempreg = AT;
6974 used_at = 1;
6975 }
6976 else
6977 {
6978 tempreg = dreg;
6979 used_at = 0;
6980 }
6981 macro_build ((char *) NULL, &icnt, NULL, "dnegu",
6982 "d,w", tempreg, treg);
6983 macro_build ((char *) NULL, &icnt, NULL, "drorv",
6984 "d,t,s", dreg, sreg, tempreg);
6985 if (used_at)
6986 break;
6987 return;
6988 }
771c7ce4
TS
6989 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsubu",
6990 "d,v,t", AT, 0, treg);
6991 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsrlv",
6992 "d,t,s", AT, sreg, AT);
6993 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsllv",
6994 "d,t,s", dreg, sreg, treg);
6995 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
6996 "d,v,t", dreg, dreg, AT);
6997 break;
6998
252b5132 6999 case M_ROL:
af7ee8bf 7000 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_arch))
82dd0097
CD
7001 {
7002 if (dreg == sreg)
7003 {
7004 tempreg = AT;
7005 used_at = 1;
7006 }
7007 else
7008 {
7009 tempreg = dreg;
7010 used_at = 0;
7011 }
7012 macro_build ((char *) NULL, &icnt, NULL, "negu",
7013 "d,w", tempreg, treg);
7014 macro_build ((char *) NULL, &icnt, NULL, "rorv",
7015 "d,t,s", dreg, sreg, tempreg);
7016 if (used_at)
7017 break;
7018 return;
7019 }
2396cfb9
TS
7020 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "subu",
7021 "d,v,t", AT, 0, treg);
7022 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srlv",
7023 "d,t,s", AT, sreg, AT);
7024 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sllv",
7025 "d,t,s", dreg, sreg, treg);
7026 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7027 "d,v,t", dreg, dreg, AT);
252b5132
RH
7028 break;
7029
771c7ce4
TS
7030 case M_DROL_I:
7031 {
7032 unsigned int rot;
82dd0097 7033 char *l, *r;
771c7ce4
TS
7034
7035 if (imm_expr.X_op != O_constant)
82dd0097 7036 as_bad (_("Improper rotate count"));
771c7ce4 7037 rot = imm_expr.X_add_number & 0x3f;
af7ee8bf 7038 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_arch))
60b63b72
RS
7039 {
7040 rot = (64 - rot) & 0x3f;
7041 if (rot >= 32)
7042 macro_build ((char *) NULL, &icnt, NULL, "dror32",
7043 "d,w,<", dreg, sreg, rot - 32);
7044 else
7045 macro_build ((char *) NULL, &icnt, NULL, "dror",
7046 "d,w,<", dreg, sreg, rot);
82dd0097 7047 return;
60b63b72 7048 }
483fc7cd 7049 if (rot == 0)
483fc7cd 7050 {
82dd0097
CD
7051 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsrl",
7052 "d,w,<", dreg, sreg, 0);
7053 return;
483fc7cd 7054 }
82dd0097
CD
7055 l = (rot < 0x20) ? "dsll" : "dsll32";
7056 r = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7057 rot &= 0x1f;
7058 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, l,
7059 "d,w,<", AT, sreg, rot);
7060 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, r,
7061 "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7062 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7063 "d,v,t", dreg, dreg, AT);
771c7ce4
TS
7064 }
7065 break;
7066
252b5132 7067 case M_ROL_I:
771c7ce4
TS
7068 {
7069 unsigned int rot;
7070
7071 if (imm_expr.X_op != O_constant)
82dd0097 7072 as_bad (_("Improper rotate count"));
771c7ce4 7073 rot = imm_expr.X_add_number & 0x1f;
af7ee8bf 7074 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_arch))
60b63b72
RS
7075 {
7076 macro_build ((char *) NULL, &icnt, NULL, "ror",
7077 "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
82dd0097 7078 return;
60b63b72 7079 }
483fc7cd 7080 if (rot == 0)
483fc7cd 7081 {
483fc7cd 7082 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl",
82dd0097
CD
7083 "d,w,<", dreg, sreg, 0);
7084 return;
483fc7cd 7085 }
82dd0097
CD
7086 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll",
7087 "d,w,<", AT, sreg, rot);
7088 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl",
7089 "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7090 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7091 "d,v,t", dreg, dreg, AT);
771c7ce4
TS
7092 }
7093 break;
7094
7095 case M_DROR:
af7ee8bf 7096 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_arch))
82dd0097
CD
7097 {
7098 macro_build ((char *) NULL, &icnt, NULL, "drorv",
7099 "d,t,s", dreg, sreg, treg);
7100 return;
7101 }
771c7ce4
TS
7102 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsubu",
7103 "d,v,t", AT, 0, treg);
7104 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsllv",
7105 "d,t,s", AT, sreg, AT);
7106 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsrlv",
7107 "d,t,s", dreg, sreg, treg);
7108 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7109 "d,v,t", dreg, dreg, AT);
252b5132
RH
7110 break;
7111
7112 case M_ROR:
af7ee8bf 7113 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_arch))
82dd0097
CD
7114 {
7115 macro_build ((char *) NULL, &icnt, NULL, "rorv",
7116 "d,t,s", dreg, sreg, treg);
7117 return;
7118 }
2396cfb9
TS
7119 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "subu",
7120 "d,v,t", AT, 0, treg);
7121 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sllv",
7122 "d,t,s", AT, sreg, AT);
7123 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srlv",
7124 "d,t,s", dreg, sreg, treg);
7125 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7126 "d,v,t", dreg, dreg, AT);
252b5132
RH
7127 break;
7128
771c7ce4
TS
7129 case M_DROR_I:
7130 {
7131 unsigned int rot;
82dd0097 7132 char *l, *r;
771c7ce4
TS
7133
7134 if (imm_expr.X_op != O_constant)
82dd0097 7135 as_bad (_("Improper rotate count"));
771c7ce4 7136 rot = imm_expr.X_add_number & 0x3f;
af7ee8bf 7137 if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_arch))
82dd0097
CD
7138 {
7139 if (rot >= 32)
7140 macro_build ((char *) NULL, &icnt, NULL, "dror32",
7141 "d,w,<", dreg, sreg, rot - 32);
7142 else
7143 macro_build ((char *) NULL, &icnt, NULL, "dror",
7144 "d,w,<", dreg, sreg, rot);
7145 return;
7146 }
483fc7cd 7147 if (rot == 0)
483fc7cd 7148 {
82dd0097
CD
7149 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsrl",
7150 "d,w,<", dreg, sreg, 0);
7151 return;
483fc7cd 7152 }
82dd0097
CD
7153 r = (rot < 0x20) ? "dsrl" : "dsrl32";
7154 l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7155 rot &= 0x1f;
7156 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, r,
7157 "d,w,<", AT, sreg, rot);
7158 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, l,
7159 "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7160 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7161 "d,v,t", dreg, dreg, AT);
771c7ce4
TS
7162 }
7163 break;
7164
252b5132 7165 case M_ROR_I:
771c7ce4
TS
7166 {
7167 unsigned int rot;
7168
7169 if (imm_expr.X_op != O_constant)
82dd0097 7170 as_bad (_("Improper rotate count"));
771c7ce4 7171 rot = imm_expr.X_add_number & 0x1f;
af7ee8bf 7172 if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_arch))
82dd0097
CD
7173 {
7174 macro_build ((char *) NULL, &icnt, NULL, "ror",
7175 "d,w,<", dreg, sreg, rot);
7176 return;
7177 }
483fc7cd 7178 if (rot == 0)
483fc7cd
RS
7179 {
7180 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl",
82dd0097
CD
7181 "d,w,<", dreg, sreg, 0);
7182 return;
483fc7cd 7183 }
82dd0097
CD
7184 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl",
7185 "d,w,<", AT, sreg, rot);
7186 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll",
7187 "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7188 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7189 "d,v,t", dreg, dreg, AT);
771c7ce4 7190 }
252b5132
RH
7191 break;
7192
7193 case M_S_DOB:
ec68c924 7194 if (mips_arch == CPU_R4650)
252b5132
RH
7195 {
7196 as_bad (_("opcode not supported on this processor"));
7197 return;
7198 }
e7af610e 7199 assert (mips_opts.isa == ISA_MIPS1);
252b5132
RH
7200 /* Even on a big endian machine $fn comes before $fn+1. We have
7201 to adjust when storing to memory. */
7202 macro_build ((char *) NULL, &icnt, &offset_expr, "swc1", "T,o(b)",
7203 target_big_endian ? treg + 1 : treg,
7204 (int) BFD_RELOC_LO16, breg);
7205 offset_expr.X_add_number += 4;
7206 macro_build ((char *) NULL, &icnt, &offset_expr, "swc1", "T,o(b)",
7207 target_big_endian ? treg : treg + 1,
7208 (int) BFD_RELOC_LO16, breg);
7209 return;
7210
7211 case M_SEQ:
7212 if (sreg == 0)
7213 macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
7214 treg, (int) BFD_RELOC_LO16);
7215 else if (treg == 0)
7216 macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
7217 sreg, (int) BFD_RELOC_LO16);
7218 else
7219 {
2396cfb9
TS
7220 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "xor",
7221 "d,v,t", dreg, sreg, treg);
252b5132
RH
7222 macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
7223 dreg, (int) BFD_RELOC_LO16);
7224 }
7225 return;
7226
7227 case M_SEQ_I:
7228 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7229 {
7230 macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
7231 sreg, (int) BFD_RELOC_LO16);
7232 return;
7233 }
7234 if (sreg == 0)
7235 {
7236 as_warn (_("Instruction %s: result is always false"),
7237 ip->insn_mo->name);
ea1fb5dc 7238 move_register (&icnt, dreg, 0);
252b5132
RH
7239 return;
7240 }
7241 if (imm_expr.X_op == O_constant
7242 && imm_expr.X_add_number >= 0
7243 && imm_expr.X_add_number < 0x10000)
7244 {
7245 macro_build ((char *) NULL, &icnt, &imm_expr, "xori", "t,r,i", dreg,
7246 sreg, (int) BFD_RELOC_LO16);
7247 used_at = 0;
7248 }
7249 else if (imm_expr.X_op == O_constant
7250 && imm_expr.X_add_number > -0x8000
7251 && imm_expr.X_add_number < 0)
7252 {
7253 imm_expr.X_add_number = -imm_expr.X_add_number;
7254 macro_build ((char *) NULL, &icnt, &imm_expr,
ca4e0257 7255 HAVE_32BIT_GPRS ? "addiu" : "daddiu",
252b5132
RH
7256 "t,r,j", dreg, sreg,
7257 (int) BFD_RELOC_LO16);
7258 used_at = 0;
7259 }
7260 else
7261 {
4d34fb5f 7262 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
2396cfb9
TS
7263 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "xor",
7264 "d,v,t", dreg, sreg, AT);
252b5132
RH
7265 used_at = 1;
7266 }
7267 macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg, dreg,
7268 (int) BFD_RELOC_LO16);
7269 if (used_at)
7270 break;
7271 return;
7272
7273 case M_SGE: /* sreg >= treg <==> not (sreg < treg) */
7274 s = "slt";
7275 goto sge;
7276 case M_SGEU:
7277 s = "sltu";
7278 sge:
2396cfb9
TS
7279 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d,v,t",
7280 dreg, sreg, treg);
252b5132
RH
7281 macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
7282 (int) BFD_RELOC_LO16);
7283 return;
7284
7285 case M_SGE_I: /* sreg >= I <==> not (sreg < I) */
7286 case M_SGEU_I:
7287 if (imm_expr.X_op == O_constant
7288 && imm_expr.X_add_number >= -0x8000
7289 && imm_expr.X_add_number < 0x8000)
7290 {
7291 macro_build ((char *) NULL, &icnt, &imm_expr,
7292 mask == M_SGE_I ? "slti" : "sltiu",
7293 "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
7294 used_at = 0;
7295 }
7296 else
7297 {
4d34fb5f 7298 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
2396cfb9
TS
7299 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7300 mask == M_SGE_I ? "slt" : "sltu", "d,v,t", dreg, sreg,
7301 AT);
252b5132
RH
7302 used_at = 1;
7303 }
7304 macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
7305 (int) BFD_RELOC_LO16);
7306 if (used_at)
7307 break;
7308 return;
7309
7310 case M_SGT: /* sreg > treg <==> treg < sreg */
7311 s = "slt";
7312 goto sgt;
7313 case M_SGTU:
7314 s = "sltu";
7315 sgt:
2396cfb9
TS
7316 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d,v,t",
7317 dreg, treg, sreg);
252b5132
RH
7318 return;
7319
7320 case M_SGT_I: /* sreg > I <==> I < sreg */
7321 s = "slt";
7322 goto sgti;
7323 case M_SGTU_I:
7324 s = "sltu";
7325 sgti:
4d34fb5f 7326 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
2396cfb9
TS
7327 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d,v,t",
7328 dreg, AT, sreg);
252b5132
RH
7329 break;
7330
2396cfb9 7331 case M_SLE: /* sreg <= treg <==> treg >= sreg <==> not (treg < sreg) */
252b5132
RH
7332 s = "slt";
7333 goto sle;
7334 case M_SLEU:
7335 s = "sltu";
7336 sle:
2396cfb9
TS
7337 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d,v,t",
7338 dreg, treg, sreg);
252b5132
RH
7339 macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
7340 (int) BFD_RELOC_LO16);
7341 return;
7342
2396cfb9 7343 case M_SLE_I: /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
252b5132
RH
7344 s = "slt";
7345 goto slei;
7346 case M_SLEU_I:
7347 s = "sltu";
7348 slei:
4d34fb5f 7349 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
2396cfb9
TS
7350 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d,v,t",
7351 dreg, AT, sreg);
252b5132
RH
7352 macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
7353 (int) BFD_RELOC_LO16);
7354 break;
7355
7356 case M_SLT_I:
7357 if (imm_expr.X_op == O_constant
7358 && imm_expr.X_add_number >= -0x8000
7359 && imm_expr.X_add_number < 0x8000)
7360 {
7361 macro_build ((char *) NULL, &icnt, &imm_expr, "slti", "t,r,j",
7362 dreg, sreg, (int) BFD_RELOC_LO16);
7363 return;
7364 }
4d34fb5f 7365 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
2396cfb9
TS
7366 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "slt", "d,v,t",
7367 dreg, sreg, AT);
252b5132
RH
7368 break;
7369
7370 case M_SLTU_I:
7371 if (imm_expr.X_op == O_constant
7372 && imm_expr.X_add_number >= -0x8000
7373 && imm_expr.X_add_number < 0x8000)
7374 {
7375 macro_build ((char *) NULL, &icnt, &imm_expr, "sltiu", "t,r,j",
7376 dreg, sreg, (int) BFD_RELOC_LO16);
7377 return;
7378 }
4d34fb5f 7379 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
2396cfb9
TS
7380 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
7381 "d,v,t", dreg, sreg, AT);
252b5132
RH
7382 break;
7383
7384 case M_SNE:
7385 if (sreg == 0)
2396cfb9
TS
7386 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
7387 "d,v,t", dreg, 0, treg);
252b5132 7388 else if (treg == 0)
2396cfb9
TS
7389 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
7390 "d,v,t", dreg, 0, sreg);
252b5132
RH
7391 else
7392 {
2396cfb9
TS
7393 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "xor",
7394 "d,v,t", dreg, sreg, treg);
7395 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
7396 "d,v,t", dreg, 0, dreg);
252b5132
RH
7397 }
7398 return;
7399
7400 case M_SNE_I:
7401 if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7402 {
2396cfb9
TS
7403 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
7404 "d,v,t", dreg, 0, sreg);
252b5132
RH
7405 return;
7406 }
7407 if (sreg == 0)
7408 {
7409 as_warn (_("Instruction %s: result is always true"),
7410 ip->insn_mo->name);
7411 macro_build ((char *) NULL, &icnt, &expr1,
ca4e0257 7412 HAVE_32BIT_GPRS ? "addiu" : "daddiu",
252b5132
RH
7413 "t,r,j", dreg, 0, (int) BFD_RELOC_LO16);
7414 return;
7415 }
7416 if (imm_expr.X_op == O_constant
7417 && imm_expr.X_add_number >= 0
7418 && imm_expr.X_add_number < 0x10000)
7419 {
7420 macro_build ((char *) NULL, &icnt, &imm_expr, "xori", "t,r,i",
7421 dreg, sreg, (int) BFD_RELOC_LO16);
7422 used_at = 0;
7423 }
7424 else if (imm_expr.X_op == O_constant
7425 && imm_expr.X_add_number > -0x8000
7426 && imm_expr.X_add_number < 0)
7427 {
7428 imm_expr.X_add_number = -imm_expr.X_add_number;
7429 macro_build ((char *) NULL, &icnt, &imm_expr,
ca4e0257 7430 HAVE_32BIT_GPRS ? "addiu" : "daddiu",
252b5132
RH
7431 "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
7432 used_at = 0;
7433 }
7434 else
7435 {
4d34fb5f 7436 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
2396cfb9
TS
7437 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "xor",
7438 "d,v,t", dreg, sreg, AT);
252b5132
RH
7439 used_at = 1;
7440 }
2396cfb9
TS
7441 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
7442 "d,v,t", dreg, 0, dreg);
252b5132
RH
7443 if (used_at)
7444 break;
7445 return;
7446
7447 case M_DSUB_I:
7448 dbl = 1;
7449 case M_SUB_I:
7450 if (imm_expr.X_op == O_constant
7451 && imm_expr.X_add_number > -0x8000
7452 && imm_expr.X_add_number <= 0x8000)
7453 {
7454 imm_expr.X_add_number = -imm_expr.X_add_number;
7455 macro_build ((char *) NULL, &icnt, &imm_expr,
7456 dbl ? "daddi" : "addi",
7457 "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
7458 return;
7459 }
7460 load_register (&icnt, AT, &imm_expr, dbl);
2396cfb9 7461 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
9a41af64 7462 dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
252b5132
RH
7463 break;
7464
7465 case M_DSUBU_I:
7466 dbl = 1;
7467 case M_SUBU_I:
7468 if (imm_expr.X_op == O_constant
7469 && imm_expr.X_add_number > -0x8000
7470 && imm_expr.X_add_number <= 0x8000)
7471 {
7472 imm_expr.X_add_number = -imm_expr.X_add_number;
7473 macro_build ((char *) NULL, &icnt, &imm_expr,
7474 dbl ? "daddiu" : "addiu",
7475 "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
7476 return;
7477 }
7478 load_register (&icnt, AT, &imm_expr, dbl);
2396cfb9 7479 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
9a41af64 7480 dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
252b5132
RH
7481 break;
7482
7483 case M_TEQ_I:
7484 s = "teq";
7485 goto trap;
7486 case M_TGE_I:
7487 s = "tge";
7488 goto trap;
7489 case M_TGEU_I:
7490 s = "tgeu";
7491 goto trap;
7492 case M_TLT_I:
7493 s = "tlt";
7494 goto trap;
7495 case M_TLTU_I:
7496 s = "tltu";
7497 goto trap;
7498 case M_TNE_I:
7499 s = "tne";
7500 trap:
4d34fb5f 7501 load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
2396cfb9
TS
7502 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "s,t", sreg,
7503 AT);
252b5132
RH
7504 break;
7505
252b5132 7506 case M_TRUNCWS:
43841e91 7507 case M_TRUNCWD:
e7af610e 7508 assert (mips_opts.isa == ISA_MIPS1);
252b5132
RH
7509 sreg = (ip->insn_opcode >> 11) & 0x1f; /* floating reg */
7510 dreg = (ip->insn_opcode >> 06) & 0x1f; /* floating reg */
7511
7512 /*
7513 * Is the double cfc1 instruction a bug in the mips assembler;
7514 * or is there a reason for it?
7515 */
b34976b6 7516 mips_emit_delays (TRUE);
252b5132
RH
7517 ++mips_opts.noreorder;
7518 mips_any_noreorder = 1;
2396cfb9 7519 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "cfc1", "t,G",
f9419b05 7520 treg, RA);
2396cfb9 7521 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "cfc1", "t,G",
f9419b05 7522 treg, RA);
2396cfb9 7523 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
252b5132
RH
7524 expr1.X_add_number = 3;
7525 macro_build ((char *) NULL, &icnt, &expr1, "ori", "t,r,i", AT, treg,
7526 (int) BFD_RELOC_LO16);
7527 expr1.X_add_number = 2;
7528 macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", AT, AT,
7529 (int) BFD_RELOC_LO16);
2396cfb9 7530 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "ctc1", "t,G",
f9419b05 7531 AT, RA);
2396cfb9
TS
7532 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
7533 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
252b5132 7534 mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S", dreg, sreg);
2396cfb9 7535 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "ctc1", "t,G",
f9419b05 7536 treg, RA);
2396cfb9 7537 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
252b5132
RH
7538 --mips_opts.noreorder;
7539 break;
7540
7541 case M_ULH:
7542 s = "lb";
7543 goto ulh;
7544 case M_ULHU:
7545 s = "lbu";
7546 ulh:
7547 if (offset_expr.X_add_number >= 0x7fff)
7548 as_bad (_("operand overflow"));
7549 /* avoid load delay */
7550 if (! target_big_endian)
f9419b05 7551 ++offset_expr.X_add_number;
252b5132
RH
7552 macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg,
7553 (int) BFD_RELOC_LO16, breg);
7554 if (! target_big_endian)
f9419b05 7555 --offset_expr.X_add_number;
252b5132 7556 else
f9419b05 7557 ++offset_expr.X_add_number;
252b5132
RH
7558 macro_build ((char *) NULL, &icnt, &offset_expr, "lbu", "t,o(b)", AT,
7559 (int) BFD_RELOC_LO16, breg);
2396cfb9
TS
7560 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll", "d,w,<",
7561 treg, treg, 8);
7562 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or", "d,v,t",
7563 treg, treg, AT);
252b5132
RH
7564 break;
7565
7566 case M_ULD:
7567 s = "ldl";
7568 s2 = "ldr";
7569 off = 7;
7570 goto ulw;
7571 case M_ULW:
7572 s = "lwl";
7573 s2 = "lwr";
7574 off = 3;
7575 ulw:
7576 if (offset_expr.X_add_number >= 0x8000 - off)
7577 as_bad (_("operand overflow"));
7578 if (! target_big_endian)
7579 offset_expr.X_add_number += off;
7580 macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg,
7581 (int) BFD_RELOC_LO16, breg);
7582 if (! target_big_endian)
7583 offset_expr.X_add_number -= off;
7584 else
7585 offset_expr.X_add_number += off;
7586 macro_build ((char *) NULL, &icnt, &offset_expr, s2, "t,o(b)", treg,
7587 (int) BFD_RELOC_LO16, breg);
7588 return;
7589
7590 case M_ULD_A:
7591 s = "ldl";
7592 s2 = "ldr";
7593 off = 7;
7594 goto ulwa;
7595 case M_ULW_A:
7596 s = "lwl";
7597 s2 = "lwr";
7598 off = 3;
7599 ulwa:
d6bc6245 7600 used_at = 1;
c9914766 7601 load_address (&icnt, AT, &offset_expr, &used_at);
252b5132
RH
7602 if (breg != 0)
7603 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 7604 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
7605 "d,v,t", AT, AT, breg);
7606 if (! target_big_endian)
7607 expr1.X_add_number = off;
7608 else
7609 expr1.X_add_number = 0;
7610 macro_build ((char *) NULL, &icnt, &expr1, s, "t,o(b)", treg,
7611 (int) BFD_RELOC_LO16, AT);
7612 if (! target_big_endian)
7613 expr1.X_add_number = 0;
7614 else
7615 expr1.X_add_number = off;
7616 macro_build ((char *) NULL, &icnt, &expr1, s2, "t,o(b)", treg,
7617 (int) BFD_RELOC_LO16, AT);
7618 break;
7619
7620 case M_ULH_A:
7621 case M_ULHU_A:
d6bc6245 7622 used_at = 1;
c9914766 7623 load_address (&icnt, AT, &offset_expr, &used_at);
252b5132
RH
7624 if (breg != 0)
7625 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 7626 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
7627 "d,v,t", AT, AT, breg);
7628 if (target_big_endian)
7629 expr1.X_add_number = 0;
7630 macro_build ((char *) NULL, &icnt, &expr1,
7631 mask == M_ULH_A ? "lb" : "lbu", "t,o(b)", treg,
7632 (int) BFD_RELOC_LO16, AT);
7633 if (target_big_endian)
7634 expr1.X_add_number = 1;
7635 else
7636 expr1.X_add_number = 0;
7637 macro_build ((char *) NULL, &icnt, &expr1, "lbu", "t,o(b)", AT,
7638 (int) BFD_RELOC_LO16, AT);
2396cfb9
TS
7639 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll", "d,w,<",
7640 treg, treg, 8);
7641 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or", "d,v,t",
7642 treg, treg, AT);
252b5132
RH
7643 break;
7644
7645 case M_USH:
7646 if (offset_expr.X_add_number >= 0x7fff)
7647 as_bad (_("operand overflow"));
7648 if (target_big_endian)
f9419b05 7649 ++offset_expr.X_add_number;
252b5132
RH
7650 macro_build ((char *) NULL, &icnt, &offset_expr, "sb", "t,o(b)", treg,
7651 (int) BFD_RELOC_LO16, breg);
2396cfb9
TS
7652 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl", "d,w,<",
7653 AT, treg, 8);
252b5132 7654 if (target_big_endian)
f9419b05 7655 --offset_expr.X_add_number;
252b5132 7656 else
f9419b05 7657 ++offset_expr.X_add_number;
252b5132
RH
7658 macro_build ((char *) NULL, &icnt, &offset_expr, "sb", "t,o(b)", AT,
7659 (int) BFD_RELOC_LO16, breg);
7660 break;
7661
7662 case M_USD:
7663 s = "sdl";
7664 s2 = "sdr";
7665 off = 7;
7666 goto usw;
7667 case M_USW:
7668 s = "swl";
7669 s2 = "swr";
7670 off = 3;
7671 usw:
7672 if (offset_expr.X_add_number >= 0x8000 - off)
7673 as_bad (_("operand overflow"));
7674 if (! target_big_endian)
7675 offset_expr.X_add_number += off;
7676 macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg,
7677 (int) BFD_RELOC_LO16, breg);
7678 if (! target_big_endian)
7679 offset_expr.X_add_number -= off;
7680 else
7681 offset_expr.X_add_number += off;
7682 macro_build ((char *) NULL, &icnt, &offset_expr, s2, "t,o(b)", treg,
7683 (int) BFD_RELOC_LO16, breg);
7684 return;
7685
7686 case M_USD_A:
7687 s = "sdl";
7688 s2 = "sdr";
7689 off = 7;
7690 goto uswa;
7691 case M_USW_A:
7692 s = "swl";
7693 s2 = "swr";
7694 off = 3;
7695 uswa:
d6bc6245 7696 used_at = 1;
c9914766 7697 load_address (&icnt, AT, &offset_expr, &used_at);
252b5132
RH
7698 if (breg != 0)
7699 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 7700 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
7701 "d,v,t", AT, AT, breg);
7702 if (! target_big_endian)
7703 expr1.X_add_number = off;
7704 else
7705 expr1.X_add_number = 0;
7706 macro_build ((char *) NULL, &icnt, &expr1, s, "t,o(b)", treg,
7707 (int) BFD_RELOC_LO16, AT);
7708 if (! target_big_endian)
7709 expr1.X_add_number = 0;
7710 else
7711 expr1.X_add_number = off;
7712 macro_build ((char *) NULL, &icnt, &expr1, s2, "t,o(b)", treg,
7713 (int) BFD_RELOC_LO16, AT);
7714 break;
7715
7716 case M_USH_A:
d6bc6245 7717 used_at = 1;
c9914766 7718 load_address (&icnt, AT, &offset_expr, &used_at);
252b5132
RH
7719 if (breg != 0)
7720 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 7721 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
252b5132
RH
7722 "d,v,t", AT, AT, breg);
7723 if (! target_big_endian)
7724 expr1.X_add_number = 0;
7725 macro_build ((char *) NULL, &icnt, &expr1, "sb", "t,o(b)", treg,
7726 (int) BFD_RELOC_LO16, AT);
2396cfb9
TS
7727 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl", "d,w,<",
7728 treg, treg, 8);
252b5132
RH
7729 if (! target_big_endian)
7730 expr1.X_add_number = 1;
7731 else
7732 expr1.X_add_number = 0;
7733 macro_build ((char *) NULL, &icnt, &expr1, "sb", "t,o(b)", treg,
7734 (int) BFD_RELOC_LO16, AT);
7735 if (! target_big_endian)
7736 expr1.X_add_number = 0;
7737 else
7738 expr1.X_add_number = 1;
7739 macro_build ((char *) NULL, &icnt, &expr1, "lbu", "t,o(b)", AT,
7740 (int) BFD_RELOC_LO16, AT);
2396cfb9
TS
7741 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll", "d,w,<",
7742 treg, treg, 8);
7743 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or", "d,v,t",
7744 treg, treg, AT);
252b5132
RH
7745 break;
7746
7747 default:
7748 /* FIXME: Check if this is one of the itbl macros, since they
bdaaa2e1 7749 are added dynamically. */
252b5132
RH
7750 as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
7751 break;
7752 }
7753 if (mips_opts.noat)
7754 as_warn (_("Macro used $at after \".set noat\""));
7755}
7756
7757/* Implement macros in mips16 mode. */
7758
7759static void
7760mips16_macro (ip)
7761 struct mips_cl_insn *ip;
7762{
7763 int mask;
7764 int xreg, yreg, zreg, tmp;
7765 int icnt;
7766 expressionS expr1;
7767 int dbl;
7768 const char *s, *s2, *s3;
7769
7770 mask = ip->insn_mo->mask;
7771
7772 xreg = (ip->insn_opcode >> MIPS16OP_SH_RX) & MIPS16OP_MASK_RX;
7773 yreg = (ip->insn_opcode >> MIPS16OP_SH_RY) & MIPS16OP_MASK_RY;
7774 zreg = (ip->insn_opcode >> MIPS16OP_SH_RZ) & MIPS16OP_MASK_RZ;
7775
7776 icnt = 0;
7777
7778 expr1.X_op = O_constant;
7779 expr1.X_op_symbol = NULL;
7780 expr1.X_add_symbol = NULL;
7781 expr1.X_add_number = 1;
7782
7783 dbl = 0;
7784
7785 switch (mask)
7786 {
7787 default:
7788 internalError ();
7789
7790 case M_DDIV_3:
7791 dbl = 1;
7792 case M_DIV_3:
7793 s = "mflo";
7794 goto do_div3;
7795 case M_DREM_3:
7796 dbl = 1;
7797 case M_REM_3:
7798 s = "mfhi";
7799 do_div3:
b34976b6 7800 mips_emit_delays (TRUE);
252b5132
RH
7801 ++mips_opts.noreorder;
7802 mips_any_noreorder = 1;
2396cfb9 7803 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
252b5132
RH
7804 dbl ? "ddiv" : "div",
7805 "0,x,y", xreg, yreg);
7806 expr1.X_add_number = 2;
7807 macro_build ((char *) NULL, &icnt, &expr1, "bnez", "x,p", yreg);
2396cfb9
TS
7808 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break", "6",
7809 7);
bdaaa2e1 7810
252b5132
RH
7811 /* FIXME: The normal code checks for of -1 / -0x80000000 here,
7812 since that causes an overflow. We should do that as well,
7813 but I don't see how to do the comparisons without a temporary
7814 register. */
7815 --mips_opts.noreorder;
2396cfb9 7816 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "x", zreg);
252b5132
RH
7817 break;
7818
7819 case M_DIVU_3:
7820 s = "divu";
7821 s2 = "mflo";
7822 goto do_divu3;
7823 case M_REMU_3:
7824 s = "divu";
7825 s2 = "mfhi";
7826 goto do_divu3;
7827 case M_DDIVU_3:
7828 s = "ddivu";
7829 s2 = "mflo";
7830 goto do_divu3;
7831 case M_DREMU_3:
7832 s = "ddivu";
7833 s2 = "mfhi";
7834 do_divu3:
b34976b6 7835 mips_emit_delays (TRUE);
252b5132
RH
7836 ++mips_opts.noreorder;
7837 mips_any_noreorder = 1;
2396cfb9
TS
7838 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "0,x,y",
7839 xreg, yreg);
252b5132
RH
7840 expr1.X_add_number = 2;
7841 macro_build ((char *) NULL, &icnt, &expr1, "bnez", "x,p", yreg);
98d3f06f
KH
7842 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
7843 "6", 7);
252b5132 7844 --mips_opts.noreorder;
2396cfb9 7845 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s2, "x", zreg);
252b5132
RH
7846 break;
7847
7848 case M_DMUL:
7849 dbl = 1;
7850 case M_MUL:
2396cfb9 7851 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
9a41af64 7852 dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
2396cfb9
TS
7853 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "x",
7854 zreg);
252b5132
RH
7855 return;
7856
7857 case M_DSUBU_I:
7858 dbl = 1;
7859 goto do_subu;
7860 case M_SUBU_I:
7861 do_subu:
7862 if (imm_expr.X_op != O_constant)
7863 as_bad (_("Unsupported large constant"));
7864 imm_expr.X_add_number = -imm_expr.X_add_number;
7865 macro_build ((char *) NULL, &icnt, &imm_expr,
9a41af64 7866 dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
252b5132
RH
7867 break;
7868
7869 case M_SUBU_I_2:
7870 if (imm_expr.X_op != O_constant)
7871 as_bad (_("Unsupported large constant"));
7872 imm_expr.X_add_number = -imm_expr.X_add_number;
7873 macro_build ((char *) NULL, &icnt, &imm_expr, "addiu",
7874 "x,k", xreg);
7875 break;
7876
7877 case M_DSUBU_I_2:
7878 if (imm_expr.X_op != O_constant)
7879 as_bad (_("Unsupported large constant"));
7880 imm_expr.X_add_number = -imm_expr.X_add_number;
7881 macro_build ((char *) NULL, &icnt, &imm_expr, "daddiu",
7882 "y,j", yreg);
7883 break;
7884
7885 case M_BEQ:
7886 s = "cmp";
7887 s2 = "bteqz";
7888 goto do_branch;
7889 case M_BNE:
7890 s = "cmp";
7891 s2 = "btnez";
7892 goto do_branch;
7893 case M_BLT:
7894 s = "slt";
7895 s2 = "btnez";
7896 goto do_branch;
7897 case M_BLTU:
7898 s = "sltu";
7899 s2 = "btnez";
7900 goto do_branch;
7901 case M_BLE:
7902 s = "slt";
7903 s2 = "bteqz";
7904 goto do_reverse_branch;
7905 case M_BLEU:
7906 s = "sltu";
7907 s2 = "bteqz";
7908 goto do_reverse_branch;
7909 case M_BGE:
7910 s = "slt";
7911 s2 = "bteqz";
7912 goto do_branch;
7913 case M_BGEU:
7914 s = "sltu";
7915 s2 = "bteqz";
7916 goto do_branch;
7917 case M_BGT:
7918 s = "slt";
7919 s2 = "btnez";
7920 goto do_reverse_branch;
7921 case M_BGTU:
7922 s = "sltu";
7923 s2 = "btnez";
7924
7925 do_reverse_branch:
7926 tmp = xreg;
7927 xreg = yreg;
7928 yreg = tmp;
7929
7930 do_branch:
7931 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "x,y",
7932 xreg, yreg);
7933 macro_build ((char *) NULL, &icnt, &offset_expr, s2, "p");
7934 break;
7935
7936 case M_BEQ_I:
7937 s = "cmpi";
7938 s2 = "bteqz";
7939 s3 = "x,U";
7940 goto do_branch_i;
7941 case M_BNE_I:
7942 s = "cmpi";
7943 s2 = "btnez";
7944 s3 = "x,U";
7945 goto do_branch_i;
7946 case M_BLT_I:
7947 s = "slti";
7948 s2 = "btnez";
7949 s3 = "x,8";
7950 goto do_branch_i;
7951 case M_BLTU_I:
7952 s = "sltiu";
7953 s2 = "btnez";
7954 s3 = "x,8";
7955 goto do_branch_i;
7956 case M_BLE_I:
7957 s = "slti";
7958 s2 = "btnez";
7959 s3 = "x,8";
7960 goto do_addone_branch_i;
7961 case M_BLEU_I:
7962 s = "sltiu";
7963 s2 = "btnez";
7964 s3 = "x,8";
7965 goto do_addone_branch_i;
7966 case M_BGE_I:
7967 s = "slti";
7968 s2 = "bteqz";
7969 s3 = "x,8";
7970 goto do_branch_i;
7971 case M_BGEU_I:
7972 s = "sltiu";
7973 s2 = "bteqz";
7974 s3 = "x,8";
7975 goto do_branch_i;
7976 case M_BGT_I:
7977 s = "slti";
7978 s2 = "bteqz";
7979 s3 = "x,8";
7980 goto do_addone_branch_i;
7981 case M_BGTU_I:
7982 s = "sltiu";
7983 s2 = "bteqz";
7984 s3 = "x,8";
7985
7986 do_addone_branch_i:
7987 if (imm_expr.X_op != O_constant)
7988 as_bad (_("Unsupported large constant"));
7989 ++imm_expr.X_add_number;
7990
7991 do_branch_i:
7992 macro_build ((char *) NULL, &icnt, &imm_expr, s, s3, xreg);
7993 macro_build ((char *) NULL, &icnt, &offset_expr, s2, "p");
7994 break;
7995
7996 case M_ABS:
7997 expr1.X_add_number = 0;
98d3f06f 7998 macro_build ((char *) NULL, &icnt, &expr1, "slti", "x,8", yreg);
252b5132 7999 if (xreg != yreg)
ea1fb5dc 8000 move_register (&icnt, xreg, yreg);
252b5132
RH
8001 expr1.X_add_number = 2;
8002 macro_build ((char *) NULL, &icnt, &expr1, "bteqz", "p");
8003 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
8004 "neg", "x,w", xreg, xreg);
8005 }
8006}
8007
8008/* For consistency checking, verify that all bits are specified either
8009 by the match/mask part of the instruction definition, or by the
8010 operand list. */
8011static int
8012validate_mips_insn (opc)
8013 const struct mips_opcode *opc;
8014{
8015 const char *p = opc->args;
8016 char c;
8017 unsigned long used_bits = opc->mask;
8018
8019 if ((used_bits & opc->match) != opc->match)
8020 {
8021 as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8022 opc->name, opc->args);
8023 return 0;
8024 }
8025#define USE_BITS(mask,shift) (used_bits |= ((mask) << (shift)))
8026 while (*p)
8027 switch (c = *p++)
8028 {
8029 case ',': break;
8030 case '(': break;
8031 case ')': break;
af7ee8bf
CD
8032 case '+':
8033 switch (c = *p++)
8034 {
8035 case 'A': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8036 case 'B': USE_BITS (OP_MASK_INSMSB, OP_SH_INSMSB); break;
8037 case 'C': USE_BITS (OP_MASK_EXTMSBD, OP_SH_EXTMSBD); break;
bbcc0807
CD
8038 case 'D': USE_BITS (OP_MASK_RD, OP_SH_RD);
8039 USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
af7ee8bf
CD
8040 default:
8041 as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8042 c, opc->name, opc->args);
8043 return 0;
8044 }
8045 break;
252b5132
RH
8046 case '<': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8047 case '>': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
8048 case 'A': break;
4372b673 8049 case 'B': USE_BITS (OP_MASK_CODE20, OP_SH_CODE20); break;
252b5132
RH
8050 case 'C': USE_BITS (OP_MASK_COPZ, OP_SH_COPZ); break;
8051 case 'D': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
8052 case 'E': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8053 case 'F': break;
8054 case 'G': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
156c2f8b 8055 case 'H': USE_BITS (OP_MASK_SEL, OP_SH_SEL); break;
252b5132 8056 case 'I': break;
e972090a 8057 case 'J': USE_BITS (OP_MASK_CODE19, OP_SH_CODE19); break;
af7ee8bf 8058 case 'K': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
252b5132
RH
8059 case 'L': break;
8060 case 'M': USE_BITS (OP_MASK_CCC, OP_SH_CCC); break;
8061 case 'N': USE_BITS (OP_MASK_BCC, OP_SH_BCC); break;
deec1734
CD
8062 case 'O': USE_BITS (OP_MASK_ALN, OP_SH_ALN); break;
8063 case 'Q': USE_BITS (OP_MASK_VSEL, OP_SH_VSEL);
8064 USE_BITS (OP_MASK_FT, OP_SH_FT); break;
252b5132
RH
8065 case 'R': USE_BITS (OP_MASK_FR, OP_SH_FR); break;
8066 case 'S': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8067 case 'T': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
8068 case 'V': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8069 case 'W': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
deec1734
CD
8070 case 'X': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
8071 case 'Y': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
8072 case 'Z': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
252b5132
RH
8073 case 'a': USE_BITS (OP_MASK_TARGET, OP_SH_TARGET); break;
8074 case 'b': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8075 case 'c': USE_BITS (OP_MASK_CODE, OP_SH_CODE); break;
8076 case 'd': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
8077 case 'f': break;
8078 case 'h': USE_BITS (OP_MASK_PREFX, OP_SH_PREFX); break;
8079 case 'i': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
8080 case 'j': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8081 case 'k': USE_BITS (OP_MASK_CACHE, OP_SH_CACHE); break;
8082 case 'l': break;
8083 case 'o': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8084 case 'p': USE_BITS (OP_MASK_DELTA, OP_SH_DELTA); break;
8085 case 'q': USE_BITS (OP_MASK_CODE2, OP_SH_CODE2); break;
8086 case 'r': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8087 case 's': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8088 case 't': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8089 case 'u': USE_BITS (OP_MASK_IMMEDIATE, OP_SH_IMMEDIATE); break;
8090 case 'v': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
8091 case 'w': USE_BITS (OP_MASK_RT, OP_SH_RT); break;
8092 case 'x': break;
8093 case 'z': break;
8094 case 'P': USE_BITS (OP_MASK_PERFREG, OP_SH_PERFREG); break;
4372b673
NC
8095 case 'U': USE_BITS (OP_MASK_RD, OP_SH_RD);
8096 USE_BITS (OP_MASK_RT, OP_SH_RT); break;
60b63b72
RS
8097 case 'e': USE_BITS (OP_MASK_VECBYTE, OP_SH_VECBYTE); break;
8098 case '%': USE_BITS (OP_MASK_VECALIGN, OP_SH_VECALIGN); break;
8099 case '[': break;
8100 case ']': break;
252b5132
RH
8101 default:
8102 as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8103 c, opc->name, opc->args);
8104 return 0;
8105 }
8106#undef USE_BITS
8107 if (used_bits != 0xffffffff)
8108 {
8109 as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8110 ~used_bits & 0xffffffff, opc->name, opc->args);
8111 return 0;
8112 }
8113 return 1;
8114}
8115
8116/* This routine assembles an instruction into its binary format. As a
8117 side effect, it sets one of the global variables imm_reloc or
8118 offset_reloc to the type of relocation to do if one of the operands
8119 is an address expression. */
8120
8121static void
8122mips_ip (str, ip)
8123 char *str;
8124 struct mips_cl_insn *ip;
8125{
8126 char *s;
8127 const char *args;
43841e91 8128 char c = 0;
252b5132
RH
8129 struct mips_opcode *insn;
8130 char *argsStart;
8131 unsigned int regno;
8132 unsigned int lastregno = 0;
af7ee8bf 8133 unsigned int lastpos = 0;
071742cf 8134 unsigned int limlo, limhi;
252b5132
RH
8135 char *s_reset;
8136 char save_c = 0;
252b5132
RH
8137
8138 insn_error = NULL;
8139
8140 /* If the instruction contains a '.', we first try to match an instruction
8141 including the '.'. Then we try again without the '.'. */
8142 insn = NULL;
3882b010 8143 for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
252b5132
RH
8144 continue;
8145
8146 /* If we stopped on whitespace, then replace the whitespace with null for
8147 the call to hash_find. Save the character we replaced just in case we
8148 have to re-parse the instruction. */
3882b010 8149 if (ISSPACE (*s))
252b5132
RH
8150 {
8151 save_c = *s;
8152 *s++ = '\0';
8153 }
bdaaa2e1 8154
252b5132
RH
8155 insn = (struct mips_opcode *) hash_find (op_hash, str);
8156
8157 /* If we didn't find the instruction in the opcode table, try again, but
8158 this time with just the instruction up to, but not including the
8159 first '.'. */
8160 if (insn == NULL)
8161 {
bdaaa2e1 8162 /* Restore the character we overwrite above (if any). */
252b5132
RH
8163 if (save_c)
8164 *(--s) = save_c;
8165
8166 /* Scan up to the first '.' or whitespace. */
3882b010
L
8167 for (s = str;
8168 *s != '\0' && *s != '.' && !ISSPACE (*s);
8169 ++s)
252b5132
RH
8170 continue;
8171
8172 /* If we did not find a '.', then we can quit now. */
8173 if (*s != '.')
8174 {
8175 insn_error = "unrecognized opcode";
8176 return;
8177 }
8178
8179 /* Lookup the instruction in the hash table. */
8180 *s++ = '\0';
8181 if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8182 {
8183 insn_error = "unrecognized opcode";
8184 return;
8185 }
252b5132
RH
8186 }
8187
8188 argsStart = s;
8189 for (;;)
8190 {
b34976b6 8191 bfd_boolean ok;
252b5132
RH
8192
8193 assert (strcmp (insn->name, str) == 0);
8194
1f25f5d3
CD
8195 if (OPCODE_IS_MEMBER (insn,
8196 (mips_opts.isa
3396de36 8197 | (file_ase_mips16 ? INSN_MIPS16 : 0)
deec1734 8198 | (mips_opts.ase_mdmx ? INSN_MDMX : 0)
98d3f06f 8199 | (mips_opts.ase_mips3d ? INSN_MIPS3D : 0)),
1f25f5d3 8200 mips_arch))
b34976b6 8201 ok = TRUE;
bdaaa2e1 8202 else
b34976b6 8203 ok = FALSE;
bdaaa2e1 8204
252b5132
RH
8205 if (insn->pinfo != INSN_MACRO)
8206 {
ec68c924 8207 if (mips_arch == CPU_R4650 && (insn->pinfo & FP_D) != 0)
b34976b6 8208 ok = FALSE;
252b5132
RH
8209 }
8210
8211 if (! ok)
8212 {
8213 if (insn + 1 < &mips_opcodes[NUMOPCODES]
8214 && strcmp (insn->name, insn[1].name) == 0)
8215 {
8216 ++insn;
8217 continue;
8218 }
252b5132 8219 else
beae10d5 8220 {
268f6bed
L
8221 if (!insn_error)
8222 {
8223 static char buf[100];
316f5878
RS
8224 if (mips_arch_info->is_isa)
8225 sprintf (buf,
8226 _("opcode not supported at this ISA level (%s)"),
8227 mips_cpu_info_from_isa (mips_opts.isa)->name);
8228 else
8229 sprintf (buf,
8230 _("opcode not supported on this processor: %s (%s)"),
8231 mips_arch_info->name,
8232 mips_cpu_info_from_isa (mips_opts.isa)->name);
268f6bed
L
8233 insn_error = buf;
8234 }
8235 if (save_c)
8236 *(--s) = save_c;
2bd7f1f3 8237 return;
252b5132 8238 }
252b5132
RH
8239 }
8240
8241 ip->insn_mo = insn;
8242 ip->insn_opcode = insn->match;
268f6bed 8243 insn_error = NULL;
252b5132
RH
8244 for (args = insn->args;; ++args)
8245 {
deec1734
CD
8246 int is_mdmx;
8247
ad8d3bb3 8248 s += strspn (s, " \t");
deec1734 8249 is_mdmx = 0;
252b5132
RH
8250 switch (*args)
8251 {
8252 case '\0': /* end of args */
8253 if (*s == '\0')
8254 return;
8255 break;
8256
8257 case ',':
8258 if (*s++ == *args)
8259 continue;
8260 s--;
8261 switch (*++args)
8262 {
8263 case 'r':
8264 case 'v':
38487616 8265 ip->insn_opcode |= lastregno << OP_SH_RS;
252b5132
RH
8266 continue;
8267
8268 case 'w':
38487616
TS
8269 ip->insn_opcode |= lastregno << OP_SH_RT;
8270 continue;
8271
252b5132 8272 case 'W':
38487616 8273 ip->insn_opcode |= lastregno << OP_SH_FT;
252b5132
RH
8274 continue;
8275
8276 case 'V':
38487616 8277 ip->insn_opcode |= lastregno << OP_SH_FS;
252b5132
RH
8278 continue;
8279 }
8280 break;
8281
8282 case '(':
8283 /* Handle optional base register.
8284 Either the base register is omitted or
bdaaa2e1 8285 we must have a left paren. */
252b5132
RH
8286 /* This is dependent on the next operand specifier
8287 is a base register specification. */
8288 assert (args[1] == 'b' || args[1] == '5'
8289 || args[1] == '-' || args[1] == '4');
8290 if (*s == '\0')
8291 return;
8292
8293 case ')': /* these must match exactly */
60b63b72
RS
8294 case '[':
8295 case ']':
252b5132
RH
8296 if (*s++ == *args)
8297 continue;
8298 break;
8299
af7ee8bf
CD
8300 case '+': /* Opcode extension character. */
8301 switch (*++args)
8302 {
071742cf
CD
8303 case 'A': /* ins/ext position, becomes LSB. */
8304 limlo = 0;
8305 limhi = 31;
8306 my_getExpression (&imm_expr, s);
8307 check_absolute_expr (ip, &imm_expr);
8308 if ((unsigned long) imm_expr.X_add_number < limlo
8309 || (unsigned long) imm_expr.X_add_number > limhi)
8310 {
8311 as_bad (_("Improper position (%lu)"),
8312 (unsigned long) imm_expr.X_add_number);
8313 imm_expr.X_add_number = limlo;
8314 }
8315 lastpos = imm_expr.X_add_number;
8316 ip->insn_opcode |= (imm_expr.X_add_number
8317 & OP_MASK_SHAMT) << OP_SH_SHAMT;
8318 imm_expr.X_op = O_absent;
8319 s = expr_end;
8320 continue;
8321
8322 case 'B': /* ins size, becomes MSB. */
8323 limlo = 1;
8324 limhi = 32;
8325 my_getExpression (&imm_expr, s);
8326 check_absolute_expr (ip, &imm_expr);
8327 /* Check for negative input so that small negative numbers
8328 will not succeed incorrectly. The checks against
8329 (pos+size) transitively check "size" itself,
8330 assuming that "pos" is reasonable. */
8331 if ((long) imm_expr.X_add_number < 0
8332 || ((unsigned long) imm_expr.X_add_number
8333 + lastpos) < limlo
8334 || ((unsigned long) imm_expr.X_add_number
8335 + lastpos) > limhi)
8336 {
8337 as_bad (_("Improper insert size (%lu, position %lu)"),
8338 (unsigned long) imm_expr.X_add_number,
8339 (unsigned long) lastpos);
8340 imm_expr.X_add_number = limlo - lastpos;
8341 }
8342 ip->insn_opcode |= ((lastpos + imm_expr.X_add_number - 1)
8343 & OP_MASK_INSMSB) << OP_SH_INSMSB;
8344 imm_expr.X_op = O_absent;
8345 s = expr_end;
8346 continue;
8347
8348 case 'C': /* ext size, becomes MSBD. */
8349 limlo = 1;
8350 limhi = 32;
8351 my_getExpression (&imm_expr, s);
8352 check_absolute_expr (ip, &imm_expr);
8353 /* Check for negative input so that small negative numbers
8354 will not succeed incorrectly. The checks against
8355 (pos+size) transitively check "size" itself,
8356 assuming that "pos" is reasonable. */
8357 if ((long) imm_expr.X_add_number < 0
8358 || ((unsigned long) imm_expr.X_add_number
8359 + lastpos) < limlo
8360 || ((unsigned long) imm_expr.X_add_number
8361 + lastpos) > limhi)
8362 {
8363 as_bad (_("Improper extract size (%lu, position %lu)"),
8364 (unsigned long) imm_expr.X_add_number,
8365 (unsigned long) lastpos);
8366 imm_expr.X_add_number = limlo - lastpos;
8367 }
8368 ip->insn_opcode |= ((imm_expr.X_add_number - 1)
8369 & OP_MASK_EXTMSBD) << OP_SH_EXTMSBD;
8370 imm_expr.X_op = O_absent;
8371 s = expr_end;
8372 continue;
af7ee8bf 8373
bbcc0807
CD
8374 case 'D':
8375 /* +D is for disassembly only; never match. */
8376 break;
8377
af7ee8bf
CD
8378 default:
8379 as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8380 *args, insn->name, insn->args);
8381 /* Further processing is fruitless. */
8382 return;
8383 }
8384 break;
8385
252b5132
RH
8386 case '<': /* must be at least one digit */
8387 /*
8388 * According to the manual, if the shift amount is greater
b6ff326e
KH
8389 * than 31 or less than 0, then the shift amount should be
8390 * mod 32. In reality the mips assembler issues an error.
252b5132
RH
8391 * We issue a warning and mask out all but the low 5 bits.
8392 */
8393 my_getExpression (&imm_expr, s);
8394 check_absolute_expr (ip, &imm_expr);
8395 if ((unsigned long) imm_expr.X_add_number > 31)
8396 {
793b27f4
TS
8397 as_warn (_("Improper shift amount (%lu)"),
8398 (unsigned long) imm_expr.X_add_number);
38487616 8399 imm_expr.X_add_number &= OP_MASK_SHAMT;
252b5132 8400 }
38487616 8401 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_SHAMT;
252b5132
RH
8402 imm_expr.X_op = O_absent;
8403 s = expr_end;
8404 continue;
8405
8406 case '>': /* shift amount minus 32 */
8407 my_getExpression (&imm_expr, s);
8408 check_absolute_expr (ip, &imm_expr);
8409 if ((unsigned long) imm_expr.X_add_number < 32
8410 || (unsigned long) imm_expr.X_add_number > 63)
8411 break;
38487616 8412 ip->insn_opcode |= (imm_expr.X_add_number - 32) << OP_SH_SHAMT;
252b5132
RH
8413 imm_expr.X_op = O_absent;
8414 s = expr_end;
8415 continue;
8416
252b5132
RH
8417 case 'k': /* cache code */
8418 case 'h': /* prefx code */
8419 my_getExpression (&imm_expr, s);
8420 check_absolute_expr (ip, &imm_expr);
8421 if ((unsigned long) imm_expr.X_add_number > 31)
8422 {
8423 as_warn (_("Invalid value for `%s' (%lu)"),
8424 ip->insn_mo->name,
8425 (unsigned long) imm_expr.X_add_number);
8426 imm_expr.X_add_number &= 0x1f;
8427 }
8428 if (*args == 'k')
8429 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CACHE;
8430 else
8431 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_PREFX;
8432 imm_expr.X_op = O_absent;
8433 s = expr_end;
8434 continue;
8435
8436 case 'c': /* break code */
8437 my_getExpression (&imm_expr, s);
8438 check_absolute_expr (ip, &imm_expr);
793b27f4 8439 if ((unsigned long) imm_expr.X_add_number > 1023)
252b5132 8440 {
793b27f4
TS
8441 as_warn (_("Illegal break code (%lu)"),
8442 (unsigned long) imm_expr.X_add_number);
38487616 8443 imm_expr.X_add_number &= OP_MASK_CODE;
252b5132 8444 }
38487616 8445 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE;
252b5132
RH
8446 imm_expr.X_op = O_absent;
8447 s = expr_end;
8448 continue;
8449
8450 case 'q': /* lower break code */
8451 my_getExpression (&imm_expr, s);
8452 check_absolute_expr (ip, &imm_expr);
793b27f4 8453 if ((unsigned long) imm_expr.X_add_number > 1023)
252b5132 8454 {
793b27f4
TS
8455 as_warn (_("Illegal lower break code (%lu)"),
8456 (unsigned long) imm_expr.X_add_number);
38487616 8457 imm_expr.X_add_number &= OP_MASK_CODE2;
252b5132 8458 }
38487616 8459 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE2;
252b5132
RH
8460 imm_expr.X_op = O_absent;
8461 s = expr_end;
8462 continue;
8463
4372b673 8464 case 'B': /* 20-bit syscall/break code. */
156c2f8b 8465 my_getExpression (&imm_expr, s);
156c2f8b 8466 check_absolute_expr (ip, &imm_expr);
793b27f4
TS
8467 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
8468 as_warn (_("Illegal 20-bit code (%lu)"),
8469 (unsigned long) imm_expr.X_add_number);
38487616 8470 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE20;
252b5132
RH
8471 imm_expr.X_op = O_absent;
8472 s = expr_end;
8473 continue;
8474
98d3f06f 8475 case 'C': /* Coprocessor code */
beae10d5 8476 my_getExpression (&imm_expr, s);
252b5132 8477 check_absolute_expr (ip, &imm_expr);
98d3f06f 8478 if ((unsigned long) imm_expr.X_add_number >= (1 << 25))
252b5132 8479 {
793b27f4
TS
8480 as_warn (_("Coproccesor code > 25 bits (%lu)"),
8481 (unsigned long) imm_expr.X_add_number);
98d3f06f 8482 imm_expr.X_add_number &= ((1 << 25) - 1);
252b5132 8483 }
beae10d5
KH
8484 ip->insn_opcode |= imm_expr.X_add_number;
8485 imm_expr.X_op = O_absent;
8486 s = expr_end;
8487 continue;
252b5132 8488
4372b673
NC
8489 case 'J': /* 19-bit wait code. */
8490 my_getExpression (&imm_expr, s);
8491 check_absolute_expr (ip, &imm_expr);
793b27f4
TS
8492 if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
8493 as_warn (_("Illegal 19-bit code (%lu)"),
8494 (unsigned long) imm_expr.X_add_number);
38487616 8495 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE19;
4372b673
NC
8496 imm_expr.X_op = O_absent;
8497 s = expr_end;
8498 continue;
8499
252b5132 8500 case 'P': /* Performance register */
beae10d5 8501 my_getExpression (&imm_expr, s);
252b5132 8502 check_absolute_expr (ip, &imm_expr);
beae10d5 8503 if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
252b5132 8504 {
793b27f4
TS
8505 as_warn (_("Invalid performance register (%lu)"),
8506 (unsigned long) imm_expr.X_add_number);
38487616 8507 imm_expr.X_add_number &= OP_MASK_PERFREG;
252b5132 8508 }
38487616 8509 ip->insn_opcode |= (imm_expr.X_add_number << OP_SH_PERFREG);
beae10d5
KH
8510 imm_expr.X_op = O_absent;
8511 s = expr_end;
8512 continue;
252b5132
RH
8513
8514 case 'b': /* base register */
8515 case 'd': /* destination register */
8516 case 's': /* source register */
8517 case 't': /* target register */
8518 case 'r': /* both target and source */
8519 case 'v': /* both dest and source */
8520 case 'w': /* both dest and target */
8521 case 'E': /* coprocessor target register */
8522 case 'G': /* coprocessor destination register */
af7ee8bf 8523 case 'K': /* 'rdhwr' destination register */
252b5132
RH
8524 case 'x': /* ignore register name */
8525 case 'z': /* must be zero register */
4372b673 8526 case 'U': /* destination register (clo/clz). */
252b5132
RH
8527 s_reset = s;
8528 if (s[0] == '$')
8529 {
8530
3882b010 8531 if (ISDIGIT (s[1]))
252b5132
RH
8532 {
8533 ++s;
8534 regno = 0;
8535 do
8536 {
8537 regno *= 10;
8538 regno += *s - '0';
8539 ++s;
8540 }
3882b010 8541 while (ISDIGIT (*s));
252b5132
RH
8542 if (regno > 31)
8543 as_bad (_("Invalid register number (%d)"), regno);
8544 }
af7ee8bf 8545 else if (*args == 'E' || *args == 'G' || *args == 'K')
252b5132
RH
8546 goto notreg;
8547 else
8548 {
76db943d
TS
8549 if (s[1] == 'r' && s[2] == 'a')
8550 {
8551 s += 3;
8552 regno = RA;
8553 }
8554 else if (s[1] == 'f' && s[2] == 'p')
252b5132
RH
8555 {
8556 s += 3;
8557 regno = FP;
8558 }
8559 else if (s[1] == 's' && s[2] == 'p')
8560 {
8561 s += 3;
8562 regno = SP;
8563 }
8564 else if (s[1] == 'g' && s[2] == 'p')
8565 {
8566 s += 3;
8567 regno = GP;
8568 }
8569 else if (s[1] == 'a' && s[2] == 't')
8570 {
8571 s += 3;
8572 regno = AT;
8573 }
8574 else if (s[1] == 'k' && s[2] == 't' && s[3] == '0')
8575 {
8576 s += 4;
8577 regno = KT0;
8578 }
8579 else if (s[1] == 'k' && s[2] == 't' && s[3] == '1')
8580 {
8581 s += 4;
8582 regno = KT1;
8583 }
85b51719
TS
8584 else if (s[1] == 'z' && s[2] == 'e' && s[3] == 'r' && s[4] == 'o')
8585 {
8586 s += 5;
8587 regno = ZERO;
8588 }
252b5132
RH
8589 else if (itbl_have_entries)
8590 {
8591 char *p, *n;
d7ba4a77 8592 unsigned long r;
252b5132 8593
d7ba4a77 8594 p = s + 1; /* advance past '$' */
252b5132
RH
8595 n = itbl_get_field (&p); /* n is name */
8596
d7ba4a77
ILT
8597 /* See if this is a register defined in an
8598 itbl entry. */
8599 if (itbl_get_reg_val (n, &r))
252b5132
RH
8600 {
8601 /* Get_field advances to the start of
8602 the next field, so we need to back
d7ba4a77 8603 rack to the end of the last field. */
bdaaa2e1 8604 if (p)
252b5132 8605 s = p - 1;
bdaaa2e1 8606 else
d7ba4a77 8607 s = strchr (s, '\0');
252b5132
RH
8608 regno = r;
8609 }
8610 else
8611 goto notreg;
beae10d5 8612 }
252b5132
RH
8613 else
8614 goto notreg;
8615 }
8616 if (regno == AT
8617 && ! mips_opts.noat
8618 && *args != 'E'
af7ee8bf
CD
8619 && *args != 'G'
8620 && *args != 'K')
252b5132
RH
8621 as_warn (_("Used $at without \".set noat\""));
8622 c = *args;
8623 if (*s == ' ')
f9419b05 8624 ++s;
252b5132
RH
8625 if (args[1] != *s)
8626 {
8627 if (c == 'r' || c == 'v' || c == 'w')
8628 {
8629 regno = lastregno;
8630 s = s_reset;
f9419b05 8631 ++args;
252b5132
RH
8632 }
8633 }
8634 /* 'z' only matches $0. */
8635 if (c == 'z' && regno != 0)
8636 break;
8637
bdaaa2e1
KH
8638 /* Now that we have assembled one operand, we use the args string
8639 * to figure out where it goes in the instruction. */
252b5132
RH
8640 switch (c)
8641 {
8642 case 'r':
8643 case 's':
8644 case 'v':
8645 case 'b':
38487616 8646 ip->insn_opcode |= regno << OP_SH_RS;
252b5132
RH
8647 break;
8648 case 'd':
8649 case 'G':
af7ee8bf 8650 case 'K':
38487616 8651 ip->insn_opcode |= regno << OP_SH_RD;
252b5132 8652 break;
4372b673 8653 case 'U':
38487616
TS
8654 ip->insn_opcode |= regno << OP_SH_RD;
8655 ip->insn_opcode |= regno << OP_SH_RT;
4372b673 8656 break;
252b5132
RH
8657 case 'w':
8658 case 't':
8659 case 'E':
38487616 8660 ip->insn_opcode |= regno << OP_SH_RT;
252b5132
RH
8661 break;
8662 case 'x':
8663 /* This case exists because on the r3000 trunc
8664 expands into a macro which requires a gp
8665 register. On the r6000 or r4000 it is
8666 assembled into a single instruction which
8667 ignores the register. Thus the insn version
8668 is MIPS_ISA2 and uses 'x', and the macro
8669 version is MIPS_ISA1 and uses 't'. */
8670 break;
8671 case 'z':
8672 /* This case is for the div instruction, which
8673 acts differently if the destination argument
8674 is $0. This only matches $0, and is checked
8675 outside the switch. */
8676 break;
8677 case 'D':
8678 /* Itbl operand; not yet implemented. FIXME ?? */
8679 break;
8680 /* What about all other operands like 'i', which
8681 can be specified in the opcode table? */
8682 }
8683 lastregno = regno;
8684 continue;
8685 }
8686 notreg:
8687 switch (*args++)
8688 {
8689 case 'r':
8690 case 'v':
38487616 8691 ip->insn_opcode |= lastregno << OP_SH_RS;
252b5132
RH
8692 continue;
8693 case 'w':
38487616 8694 ip->insn_opcode |= lastregno << OP_SH_RT;
252b5132
RH
8695 continue;
8696 }
8697 break;
8698
deec1734
CD
8699 case 'O': /* MDMX alignment immediate constant. */
8700 my_getExpression (&imm_expr, s);
8701 check_absolute_expr (ip, &imm_expr);
8702 if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
8703 {
8704 as_warn ("Improper align amount (%ld), using low bits",
8705 (long) imm_expr.X_add_number);
8706 imm_expr.X_add_number &= OP_MASK_ALN;
8707 }
8708 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_ALN;
8709 imm_expr.X_op = O_absent;
8710 s = expr_end;
8711 continue;
8712
8713 case 'Q': /* MDMX vector, element sel, or const. */
8714 if (s[0] != '$')
8715 {
8716 /* MDMX Immediate. */
8717 my_getExpression (&imm_expr, s);
8718 check_absolute_expr (ip, &imm_expr);
8719 if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
8720 {
8721 as_warn (_("Invalid MDMX Immediate (%ld)"),
8722 (long) imm_expr.X_add_number);
8723 imm_expr.X_add_number &= OP_MASK_FT;
8724 }
8725 imm_expr.X_add_number &= OP_MASK_FT;
8726 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
8727 ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
8728 else
8729 ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
8730 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_FT;
8731 imm_expr.X_op = O_absent;
8732 s = expr_end;
8733 continue;
8734 }
8735 /* Not MDMX Immediate. Fall through. */
8736 case 'X': /* MDMX destination register. */
8737 case 'Y': /* MDMX source register. */
8738 case 'Z': /* MDMX target register. */
8739 is_mdmx = 1;
252b5132
RH
8740 case 'D': /* floating point destination register */
8741 case 'S': /* floating point source register */
8742 case 'T': /* floating point target register */
8743 case 'R': /* floating point source register */
8744 case 'V':
8745 case 'W':
8746 s_reset = s;
deec1734
CD
8747 /* Accept $fN for FP and MDMX register numbers, and in
8748 addition accept $vN for MDMX register numbers. */
8749 if ((s[0] == '$' && s[1] == 'f' && ISDIGIT (s[2]))
8750 || (is_mdmx != 0 && s[0] == '$' && s[1] == 'v'
8751 && ISDIGIT (s[2])))
252b5132
RH
8752 {
8753 s += 2;
8754 regno = 0;
8755 do
8756 {
8757 regno *= 10;
8758 regno += *s - '0';
8759 ++s;
8760 }
3882b010 8761 while (ISDIGIT (*s));
252b5132
RH
8762
8763 if (regno > 31)
8764 as_bad (_("Invalid float register number (%d)"), regno);
8765
8766 if ((regno & 1) != 0
ca4e0257 8767 && HAVE_32BIT_FPRS
252b5132
RH
8768 && ! (strcmp (str, "mtc1") == 0
8769 || strcmp (str, "mfc1") == 0
8770 || strcmp (str, "lwc1") == 0
8771 || strcmp (str, "swc1") == 0
8772 || strcmp (str, "l.s") == 0
8773 || strcmp (str, "s.s") == 0))
8774 as_warn (_("Float register should be even, was %d"),
8775 regno);
8776
8777 c = *args;
8778 if (*s == ' ')
f9419b05 8779 ++s;
252b5132
RH
8780 if (args[1] != *s)
8781 {
8782 if (c == 'V' || c == 'W')
8783 {
8784 regno = lastregno;
8785 s = s_reset;
f9419b05 8786 ++args;
252b5132
RH
8787 }
8788 }
8789 switch (c)
8790 {
8791 case 'D':
deec1734 8792 case 'X':
38487616 8793 ip->insn_opcode |= regno << OP_SH_FD;
252b5132
RH
8794 break;
8795 case 'V':
8796 case 'S':
deec1734 8797 case 'Y':
38487616 8798 ip->insn_opcode |= regno << OP_SH_FS;
252b5132 8799 break;
deec1734
CD
8800 case 'Q':
8801 /* This is like 'Z', but also needs to fix the MDMX
8802 vector/scalar select bits. Note that the
8803 scalar immediate case is handled above. */
8804 if (*s == '[')
8805 {
8806 int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
8807 int max_el = (is_qh ? 3 : 7);
8808 s++;
8809 my_getExpression(&imm_expr, s);
8810 check_absolute_expr (ip, &imm_expr);
8811 s = expr_end;
8812 if (imm_expr.X_add_number > max_el)
8813 as_bad(_("Bad element selector %ld"),
8814 (long) imm_expr.X_add_number);
8815 imm_expr.X_add_number &= max_el;
8816 ip->insn_opcode |= (imm_expr.X_add_number
8817 << (OP_SH_VSEL +
8818 (is_qh ? 2 : 1)));
8819 if (*s != ']')
8820 as_warn(_("Expecting ']' found '%s'"), s);
8821 else
8822 s++;
8823 }
8824 else
8825 {
8826 if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
8827 ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
8828 << OP_SH_VSEL);
8829 else
8830 ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
8831 OP_SH_VSEL);
8832 }
8833 /* Fall through */
252b5132
RH
8834 case 'W':
8835 case 'T':
deec1734 8836 case 'Z':
38487616 8837 ip->insn_opcode |= regno << OP_SH_FT;
252b5132
RH
8838 break;
8839 case 'R':
38487616 8840 ip->insn_opcode |= regno << OP_SH_FR;
252b5132
RH
8841 break;
8842 }
8843 lastregno = regno;
8844 continue;
8845 }
8846
252b5132
RH
8847 switch (*args++)
8848 {
8849 case 'V':
38487616 8850 ip->insn_opcode |= lastregno << OP_SH_FS;
252b5132
RH
8851 continue;
8852 case 'W':
38487616 8853 ip->insn_opcode |= lastregno << OP_SH_FT;
252b5132
RH
8854 continue;
8855 }
8856 break;
8857
8858 case 'I':
8859 my_getExpression (&imm_expr, s);
8860 if (imm_expr.X_op != O_big
8861 && imm_expr.X_op != O_constant)
8862 insn_error = _("absolute expression required");
8863 s = expr_end;
8864 continue;
8865
8866 case 'A':
8867 my_getExpression (&offset_expr, s);
f6688943 8868 *imm_reloc = BFD_RELOC_32;
252b5132
RH
8869 s = expr_end;
8870 continue;
8871
8872 case 'F':
8873 case 'L':
8874 case 'f':
8875 case 'l':
8876 {
8877 int f64;
ca4e0257 8878 int using_gprs;
252b5132
RH
8879 char *save_in;
8880 char *err;
8881 unsigned char temp[8];
8882 int len;
8883 unsigned int length;
8884 segT seg;
8885 subsegT subseg;
8886 char *p;
8887
8888 /* These only appear as the last operand in an
8889 instruction, and every instruction that accepts
8890 them in any variant accepts them in all variants.
8891 This means we don't have to worry about backing out
8892 any changes if the instruction does not match.
8893
8894 The difference between them is the size of the
8895 floating point constant and where it goes. For 'F'
8896 and 'L' the constant is 64 bits; for 'f' and 'l' it
8897 is 32 bits. Where the constant is placed is based
8898 on how the MIPS assembler does things:
8899 F -- .rdata
8900 L -- .lit8
8901 f -- immediate value
8902 l -- .lit4
8903
8904 The .lit4 and .lit8 sections are only used if
8905 permitted by the -G argument.
8906
8907 When generating embedded PIC code, we use the
8908 .lit8 section but not the .lit4 section (we can do
8909 .lit4 inline easily; we need to put .lit8
8910 somewhere in the data segment, and using .lit8
8911 permits the linker to eventually combine identical
ca4e0257
RS
8912 .lit8 entries).
8913
8914 The code below needs to know whether the target register
8915 is 32 or 64 bits wide. It relies on the fact 'f' and
8916 'F' are used with GPR-based instructions and 'l' and
8917 'L' are used with FPR-based instructions. */
252b5132
RH
8918
8919 f64 = *args == 'F' || *args == 'L';
ca4e0257 8920 using_gprs = *args == 'F' || *args == 'f';
252b5132
RH
8921
8922 save_in = input_line_pointer;
8923 input_line_pointer = s;
8924 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
8925 length = len;
8926 s = input_line_pointer;
8927 input_line_pointer = save_in;
8928 if (err != NULL && *err != '\0')
8929 {
8930 as_bad (_("Bad floating point constant: %s"), err);
8931 memset (temp, '\0', sizeof temp);
8932 length = f64 ? 8 : 4;
8933 }
8934
156c2f8b 8935 assert (length == (unsigned) (f64 ? 8 : 4));
252b5132
RH
8936
8937 if (*args == 'f'
8938 || (*args == 'l'
8939 && (! USE_GLOBAL_POINTER_OPT
8940 || mips_pic == EMBEDDED_PIC
8941 || g_switch_value < 4
8942 || (temp[0] == 0 && temp[1] == 0)
8943 || (temp[2] == 0 && temp[3] == 0))))
8944 {
8945 imm_expr.X_op = O_constant;
8946 if (! target_big_endian)
8947 imm_expr.X_add_number = bfd_getl32 (temp);
8948 else
8949 imm_expr.X_add_number = bfd_getb32 (temp);
8950 }
8951 else if (length > 4
119d663a 8952 && ! mips_disable_float_construction
ca4e0257
RS
8953 /* Constants can only be constructed in GPRs and
8954 copied to FPRs if the GPRs are at least as wide
8955 as the FPRs. Force the constant into memory if
8956 we are using 64-bit FPRs but the GPRs are only
8957 32 bits wide. */
8958 && (using_gprs
8959 || ! (HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
252b5132
RH
8960 && ((temp[0] == 0 && temp[1] == 0)
8961 || (temp[2] == 0 && temp[3] == 0))
8962 && ((temp[4] == 0 && temp[5] == 0)
8963 || (temp[6] == 0 && temp[7] == 0)))
8964 {
ca4e0257
RS
8965 /* The value is simple enough to load with a couple of
8966 instructions. If using 32-bit registers, set
8967 imm_expr to the high order 32 bits and offset_expr to
8968 the low order 32 bits. Otherwise, set imm_expr to
8969 the entire 64 bit constant. */
8970 if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
252b5132
RH
8971 {
8972 imm_expr.X_op = O_constant;
8973 offset_expr.X_op = O_constant;
8974 if (! target_big_endian)
8975 {
8976 imm_expr.X_add_number = bfd_getl32 (temp + 4);
8977 offset_expr.X_add_number = bfd_getl32 (temp);
8978 }
8979 else
8980 {
8981 imm_expr.X_add_number = bfd_getb32 (temp);
8982 offset_expr.X_add_number = bfd_getb32 (temp + 4);
8983 }
8984 if (offset_expr.X_add_number == 0)
8985 offset_expr.X_op = O_absent;
8986 }
8987 else if (sizeof (imm_expr.X_add_number) > 4)
8988 {
8989 imm_expr.X_op = O_constant;
8990 if (! target_big_endian)
8991 imm_expr.X_add_number = bfd_getl64 (temp);
8992 else
8993 imm_expr.X_add_number = bfd_getb64 (temp);
8994 }
8995 else
8996 {
8997 imm_expr.X_op = O_big;
8998 imm_expr.X_add_number = 4;
8999 if (! target_big_endian)
9000 {
9001 generic_bignum[0] = bfd_getl16 (temp);
9002 generic_bignum[1] = bfd_getl16 (temp + 2);
9003 generic_bignum[2] = bfd_getl16 (temp + 4);
9004 generic_bignum[3] = bfd_getl16 (temp + 6);
9005 }
9006 else
9007 {
9008 generic_bignum[0] = bfd_getb16 (temp + 6);
9009 generic_bignum[1] = bfd_getb16 (temp + 4);
9010 generic_bignum[2] = bfd_getb16 (temp + 2);
9011 generic_bignum[3] = bfd_getb16 (temp);
9012 }
9013 }
9014 }
9015 else
9016 {
9017 const char *newname;
9018 segT new_seg;
9019
9020 /* Switch to the right section. */
9021 seg = now_seg;
9022 subseg = now_subseg;
9023 switch (*args)
9024 {
9025 default: /* unused default case avoids warnings. */
9026 case 'L':
9027 newname = RDATA_SECTION_NAME;
bb2d6cd7
GK
9028 if ((USE_GLOBAL_POINTER_OPT && g_switch_value >= 8)
9029 || mips_pic == EMBEDDED_PIC)
252b5132
RH
9030 newname = ".lit8";
9031 break;
9032 case 'F':
bb2d6cd7
GK
9033 if (mips_pic == EMBEDDED_PIC)
9034 newname = ".lit8";
9035 else
9036 newname = RDATA_SECTION_NAME;
252b5132
RH
9037 break;
9038 case 'l':
9039 assert (!USE_GLOBAL_POINTER_OPT
9040 || g_switch_value >= 4);
9041 newname = ".lit4";
9042 break;
9043 }
9044 new_seg = subseg_new (newname, (subsegT) 0);
9045 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
9046 bfd_set_section_flags (stdoutput, new_seg,
9047 (SEC_ALLOC
9048 | SEC_LOAD
9049 | SEC_READONLY
9050 | SEC_DATA));
9051 frag_align (*args == 'l' ? 2 : 3, 0, 0);
9052 if (OUTPUT_FLAVOR == bfd_target_elf_flavour
9053 && strcmp (TARGET_OS, "elf") != 0)
9054 record_alignment (new_seg, 4);
9055 else
9056 record_alignment (new_seg, *args == 'l' ? 2 : 3);
9057 if (seg == now_seg)
9058 as_bad (_("Can't use floating point insn in this section"));
9059
9060 /* Set the argument to the current address in the
9061 section. */
9062 offset_expr.X_op = O_symbol;
9063 offset_expr.X_add_symbol =
9064 symbol_new ("L0\001", now_seg,
9065 (valueT) frag_now_fix (), frag_now);
9066 offset_expr.X_add_number = 0;
9067
9068 /* Put the floating point number into the section. */
9069 p = frag_more ((int) length);
9070 memcpy (p, temp, length);
9071
9072 /* Switch back to the original section. */
9073 subseg_set (seg, subseg);
9074 }
9075 }
9076 continue;
9077
9078 case 'i': /* 16 bit unsigned immediate */
9079 case 'j': /* 16 bit signed immediate */
f6688943 9080 *imm_reloc = BFD_RELOC_LO16;
5e0116d5 9081 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
252b5132
RH
9082 {
9083 int more;
5e0116d5
RS
9084 offsetT minval, maxval;
9085
9086 more = (insn + 1 < &mips_opcodes[NUMOPCODES]
9087 && strcmp (insn->name, insn[1].name) == 0);
9088
9089 /* If the expression was written as an unsigned number,
9090 only treat it as signed if there are no more
9091 alternatives. */
9092 if (more
9093 && *args == 'j'
9094 && sizeof (imm_expr.X_add_number) <= 4
9095 && imm_expr.X_op == O_constant
9096 && imm_expr.X_add_number < 0
9097 && imm_expr.X_unsigned
9098 && HAVE_64BIT_GPRS)
9099 break;
9100
9101 /* For compatibility with older assemblers, we accept
9102 0x8000-0xffff as signed 16-bit numbers when only
9103 signed numbers are allowed. */
9104 if (*args == 'i')
9105 minval = 0, maxval = 0xffff;
9106 else if (more)
9107 minval = -0x8000, maxval = 0x7fff;
252b5132 9108 else
5e0116d5
RS
9109 minval = -0x8000, maxval = 0xffff;
9110
9111 if (imm_expr.X_op != O_constant
9112 || imm_expr.X_add_number < minval
9113 || imm_expr.X_add_number > maxval)
252b5132
RH
9114 {
9115 if (more)
9116 break;
2ae7e77b
AH
9117 if (imm_expr.X_op == O_constant
9118 || imm_expr.X_op == O_big)
5e0116d5 9119 as_bad (_("expression out of range"));
252b5132
RH
9120 }
9121 }
9122 s = expr_end;
9123 continue;
9124
9125 case 'o': /* 16 bit offset */
5e0116d5
RS
9126 /* Check whether there is only a single bracketed expression
9127 left. If so, it must be the base register and the
9128 constant must be zero. */
9129 if (*s == '(' && strchr (s + 1, '(') == 0)
9130 {
9131 offset_expr.X_op = O_constant;
9132 offset_expr.X_add_number = 0;
9133 continue;
9134 }
252b5132
RH
9135
9136 /* If this value won't fit into a 16 bit offset, then go
9137 find a macro that will generate the 32 bit offset
afdbd6d0 9138 code pattern. */
5e0116d5 9139 if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
252b5132
RH
9140 && (offset_expr.X_op != O_constant
9141 || offset_expr.X_add_number >= 0x8000
afdbd6d0 9142 || offset_expr.X_add_number < -0x8000))
252b5132
RH
9143 break;
9144
252b5132
RH
9145 s = expr_end;
9146 continue;
9147
9148 case 'p': /* pc relative offset */
af6ae2ad 9149 *offset_reloc = BFD_RELOC_16_PCREL_S2;
252b5132
RH
9150 my_getExpression (&offset_expr, s);
9151 s = expr_end;
9152 continue;
9153
9154 case 'u': /* upper 16 bits */
5e0116d5
RS
9155 if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
9156 && imm_expr.X_op == O_constant
9157 && (imm_expr.X_add_number < 0
9158 || imm_expr.X_add_number >= 0x10000))
252b5132
RH
9159 as_bad (_("lui expression not in range 0..65535"));
9160 s = expr_end;
9161 continue;
9162
9163 case 'a': /* 26 bit address */
9164 my_getExpression (&offset_expr, s);
9165 s = expr_end;
f6688943 9166 *offset_reloc = BFD_RELOC_MIPS_JMP;
252b5132
RH
9167 continue;
9168
9169 case 'N': /* 3 bit branch condition code */
9170 case 'M': /* 3 bit compare condition code */
9171 if (strncmp (s, "$fcc", 4) != 0)
9172 break;
9173 s += 4;
9174 regno = 0;
9175 do
9176 {
9177 regno *= 10;
9178 regno += *s - '0';
9179 ++s;
9180 }
3882b010 9181 while (ISDIGIT (*s));
252b5132
RH
9182 if (regno > 7)
9183 as_bad (_("invalid condition code register $fcc%d"), regno);
9184 if (*args == 'N')
9185 ip->insn_opcode |= regno << OP_SH_BCC;
9186 else
9187 ip->insn_opcode |= regno << OP_SH_CCC;
beae10d5 9188 continue;
252b5132 9189
156c2f8b
NC
9190 case 'H':
9191 if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
9192 s += 2;
3882b010 9193 if (ISDIGIT (*s))
156c2f8b
NC
9194 {
9195 c = 0;
9196 do
9197 {
9198 c *= 10;
9199 c += *s - '0';
9200 ++s;
9201 }
3882b010 9202 while (ISDIGIT (*s));
156c2f8b
NC
9203 }
9204 else
9205 c = 8; /* Invalid sel value. */
9206
9207 if (c > 7)
9208 as_bad (_("invalid coprocessor sub-selection value (0-7)"));
9209 ip->insn_opcode |= c;
9210 continue;
9211
60b63b72
RS
9212 case 'e':
9213 /* Must be at least one digit. */
9214 my_getExpression (&imm_expr, s);
9215 check_absolute_expr (ip, &imm_expr);
9216
9217 if ((unsigned long) imm_expr.X_add_number
9218 > (unsigned long) OP_MASK_VECBYTE)
9219 {
9220 as_bad (_("bad byte vector index (%ld)"),
9221 (long) imm_expr.X_add_number);
9222 imm_expr.X_add_number = 0;
9223 }
9224
9225 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_VECBYTE;
9226 imm_expr.X_op = O_absent;
9227 s = expr_end;
9228 continue;
9229
9230 case '%':
9231 my_getExpression (&imm_expr, s);
9232 check_absolute_expr (ip, &imm_expr);
9233
9234 if ((unsigned long) imm_expr.X_add_number
9235 > (unsigned long) OP_MASK_VECALIGN)
9236 {
9237 as_bad (_("bad byte vector index (%ld)"),
9238 (long) imm_expr.X_add_number);
9239 imm_expr.X_add_number = 0;
9240 }
9241
9242 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_VECALIGN;
9243 imm_expr.X_op = O_absent;
9244 s = expr_end;
9245 continue;
9246
252b5132
RH
9247 default:
9248 as_bad (_("bad char = '%c'\n"), *args);
9249 internalError ();
9250 }
9251 break;
9252 }
9253 /* Args don't match. */
9254 if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
9255 !strcmp (insn->name, insn[1].name))
9256 {
9257 ++insn;
9258 s = argsStart;
268f6bed 9259 insn_error = _("illegal operands");
252b5132
RH
9260 continue;
9261 }
268f6bed
L
9262 if (save_c)
9263 *(--s) = save_c;
252b5132
RH
9264 insn_error = _("illegal operands");
9265 return;
9266 }
9267}
9268
9269/* This routine assembles an instruction into its binary format when
9270 assembling for the mips16. As a side effect, it sets one of the
9271 global variables imm_reloc or offset_reloc to the type of
9272 relocation to do if one of the operands is an address expression.
9273 It also sets mips16_small and mips16_ext if the user explicitly
9274 requested a small or extended instruction. */
9275
9276static void
9277mips16_ip (str, ip)
9278 char *str;
9279 struct mips_cl_insn *ip;
9280{
9281 char *s;
9282 const char *args;
9283 struct mips_opcode *insn;
9284 char *argsstart;
9285 unsigned int regno;
9286 unsigned int lastregno = 0;
9287 char *s_reset;
9288
9289 insn_error = NULL;
9290
b34976b6
AM
9291 mips16_small = FALSE;
9292 mips16_ext = FALSE;
252b5132 9293
3882b010 9294 for (s = str; ISLOWER (*s); ++s)
252b5132
RH
9295 ;
9296 switch (*s)
9297 {
9298 case '\0':
9299 break;
9300
9301 case ' ':
9302 *s++ = '\0';
9303 break;
9304
9305 case '.':
9306 if (s[1] == 't' && s[2] == ' ')
9307 {
9308 *s = '\0';
b34976b6 9309 mips16_small = TRUE;
252b5132
RH
9310 s += 3;
9311 break;
9312 }
9313 else if (s[1] == 'e' && s[2] == ' ')
9314 {
9315 *s = '\0';
b34976b6 9316 mips16_ext = TRUE;
252b5132
RH
9317 s += 3;
9318 break;
9319 }
9320 /* Fall through. */
9321 default:
9322 insn_error = _("unknown opcode");
9323 return;
9324 }
9325
9326 if (mips_opts.noautoextend && ! mips16_ext)
b34976b6 9327 mips16_small = TRUE;
252b5132
RH
9328
9329 if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
9330 {
9331 insn_error = _("unrecognized opcode");
9332 return;
9333 }
9334
9335 argsstart = s;
9336 for (;;)
9337 {
9338 assert (strcmp (insn->name, str) == 0);
9339
9340 ip->insn_mo = insn;
9341 ip->insn_opcode = insn->match;
b34976b6 9342 ip->use_extend = FALSE;
252b5132 9343 imm_expr.X_op = O_absent;
f6688943
TS
9344 imm_reloc[0] = BFD_RELOC_UNUSED;
9345 imm_reloc[1] = BFD_RELOC_UNUSED;
9346 imm_reloc[2] = BFD_RELOC_UNUSED;
252b5132 9347 offset_expr.X_op = O_absent;
f6688943
TS
9348 offset_reloc[0] = BFD_RELOC_UNUSED;
9349 offset_reloc[1] = BFD_RELOC_UNUSED;
9350 offset_reloc[2] = BFD_RELOC_UNUSED;
252b5132
RH
9351 for (args = insn->args; 1; ++args)
9352 {
9353 int c;
9354
9355 if (*s == ' ')
9356 ++s;
9357
9358 /* In this switch statement we call break if we did not find
9359 a match, continue if we did find a match, or return if we
9360 are done. */
9361
9362 c = *args;
9363 switch (c)
9364 {
9365 case '\0':
9366 if (*s == '\0')
9367 {
9368 /* Stuff the immediate value in now, if we can. */
9369 if (imm_expr.X_op == O_constant
f6688943 9370 && *imm_reloc > BFD_RELOC_UNUSED
252b5132
RH
9371 && insn->pinfo != INSN_MACRO)
9372 {
c4e7957c 9373 mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
b34976b6 9374 imm_expr.X_add_number, TRUE, mips16_small,
252b5132
RH
9375 mips16_ext, &ip->insn_opcode,
9376 &ip->use_extend, &ip->extend);
9377 imm_expr.X_op = O_absent;
f6688943 9378 *imm_reloc = BFD_RELOC_UNUSED;
252b5132
RH
9379 }
9380
9381 return;
9382 }
9383 break;
9384
9385 case ',':
9386 if (*s++ == c)
9387 continue;
9388 s--;
9389 switch (*++args)
9390 {
9391 case 'v':
9392 ip->insn_opcode |= lastregno << MIPS16OP_SH_RX;
9393 continue;
9394 case 'w':
9395 ip->insn_opcode |= lastregno << MIPS16OP_SH_RY;
9396 continue;
9397 }
9398 break;
9399
9400 case '(':
9401 case ')':
9402 if (*s++ == c)
9403 continue;
9404 break;
9405
9406 case 'v':
9407 case 'w':
9408 if (s[0] != '$')
9409 {
9410 if (c == 'v')
9411 ip->insn_opcode |= lastregno << MIPS16OP_SH_RX;
9412 else
9413 ip->insn_opcode |= lastregno << MIPS16OP_SH_RY;
9414 ++args;
9415 continue;
9416 }
9417 /* Fall through. */
9418 case 'x':
9419 case 'y':
9420 case 'z':
9421 case 'Z':
9422 case '0':
9423 case 'S':
9424 case 'R':
9425 case 'X':
9426 case 'Y':
9427 if (s[0] != '$')
9428 break;
9429 s_reset = s;
3882b010 9430 if (ISDIGIT (s[1]))
252b5132
RH
9431 {
9432 ++s;
9433 regno = 0;
9434 do
9435 {
9436 regno *= 10;
9437 regno += *s - '0';
9438 ++s;
9439 }
3882b010 9440 while (ISDIGIT (*s));
252b5132
RH
9441 if (regno > 31)
9442 {
9443 as_bad (_("invalid register number (%d)"), regno);
9444 regno = 2;
9445 }
9446 }
9447 else
9448 {
76db943d
TS
9449 if (s[1] == 'r' && s[2] == 'a')
9450 {
9451 s += 3;
9452 regno = RA;
9453 }
9454 else if (s[1] == 'f' && s[2] == 'p')
252b5132
RH
9455 {
9456 s += 3;
9457 regno = FP;
9458 }
9459 else if (s[1] == 's' && s[2] == 'p')
9460 {
9461 s += 3;
9462 regno = SP;
9463 }
9464 else if (s[1] == 'g' && s[2] == 'p')
9465 {
9466 s += 3;
9467 regno = GP;
9468 }
9469 else if (s[1] == 'a' && s[2] == 't')
9470 {
9471 s += 3;
9472 regno = AT;
9473 }
9474 else if (s[1] == 'k' && s[2] == 't' && s[3] == '0')
9475 {
9476 s += 4;
9477 regno = KT0;
9478 }
9479 else if (s[1] == 'k' && s[2] == 't' && s[3] == '1')
9480 {
9481 s += 4;
9482 regno = KT1;
9483 }
85b51719
TS
9484 else if (s[1] == 'z' && s[2] == 'e' && s[3] == 'r' && s[4] == 'o')
9485 {
9486 s += 5;
9487 regno = ZERO;
9488 }
252b5132
RH
9489 else
9490 break;
9491 }
9492
9493 if (*s == ' ')
9494 ++s;
9495 if (args[1] != *s)
9496 {
9497 if (c == 'v' || c == 'w')
9498 {
9499 regno = mips16_to_32_reg_map[lastregno];
9500 s = s_reset;
f9419b05 9501 ++args;
252b5132
RH
9502 }
9503 }
9504
9505 switch (c)
9506 {
9507 case 'x':
9508 case 'y':
9509 case 'z':
9510 case 'v':
9511 case 'w':
9512 case 'Z':
9513 regno = mips32_to_16_reg_map[regno];
9514 break;
9515
9516 case '0':
9517 if (regno != 0)
9518 regno = ILLEGAL_REG;
9519 break;
9520
9521 case 'S':
9522 if (regno != SP)
9523 regno = ILLEGAL_REG;
9524 break;
9525
9526 case 'R':
9527 if (regno != RA)
9528 regno = ILLEGAL_REG;
9529 break;
9530
9531 case 'X':
9532 case 'Y':
9533 if (regno == AT && ! mips_opts.noat)
9534 as_warn (_("used $at without \".set noat\""));
9535 break;
9536
9537 default:
9538 internalError ();
9539 }
9540
9541 if (regno == ILLEGAL_REG)
9542 break;
9543
9544 switch (c)
9545 {
9546 case 'x':
9547 case 'v':
9548 ip->insn_opcode |= regno << MIPS16OP_SH_RX;
9549 break;
9550 case 'y':
9551 case 'w':
9552 ip->insn_opcode |= regno << MIPS16OP_SH_RY;
9553 break;
9554 case 'z':
9555 ip->insn_opcode |= regno << MIPS16OP_SH_RZ;
9556 break;
9557 case 'Z':
9558 ip->insn_opcode |= regno << MIPS16OP_SH_MOVE32Z;
9559 case '0':
9560 case 'S':
9561 case 'R':
9562 break;
9563 case 'X':
9564 ip->insn_opcode |= regno << MIPS16OP_SH_REGR32;
9565 break;
9566 case 'Y':
9567 regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
9568 ip->insn_opcode |= regno << MIPS16OP_SH_REG32R;
9569 break;
9570 default:
9571 internalError ();
9572 }
9573
9574 lastregno = regno;
9575 continue;
9576
9577 case 'P':
9578 if (strncmp (s, "$pc", 3) == 0)
9579 {
9580 s += 3;
9581 continue;
9582 }
9583 break;
9584
9585 case '<':
9586 case '>':
9587 case '[':
9588 case ']':
9589 case '4':
9590 case '5':
9591 case 'H':
9592 case 'W':
9593 case 'D':
9594 case 'j':
9595 case '8':
9596 case 'V':
9597 case 'C':
9598 case 'U':
9599 case 'k':
9600 case 'K':
9601 if (s[0] == '%'
9602 && strncmp (s + 1, "gprel(", sizeof "gprel(" - 1) == 0)
9603 {
9604 /* This is %gprel(SYMBOL). We need to read SYMBOL,
9605 and generate the appropriate reloc. If the text
9606 inside %gprel is not a symbol name with an
9607 optional offset, then we generate a normal reloc
9608 and will probably fail later. */
9609 my_getExpression (&imm_expr, s + sizeof "%gprel" - 1);
9610 if (imm_expr.X_op == O_symbol)
9611 {
b34976b6 9612 mips16_ext = TRUE;
f6688943 9613 *imm_reloc = BFD_RELOC_MIPS16_GPREL;
252b5132 9614 s = expr_end;
b34976b6 9615 ip->use_extend = TRUE;
252b5132
RH
9616 ip->extend = 0;
9617 continue;
9618 }
9619 }
9620 else
9621 {
9622 /* Just pick up a normal expression. */
9623 my_getExpression (&imm_expr, s);
9624 }
9625
9626 if (imm_expr.X_op == O_register)
9627 {
9628 /* What we thought was an expression turned out to
9629 be a register. */
9630
9631 if (s[0] == '(' && args[1] == '(')
9632 {
9633 /* It looks like the expression was omitted
9634 before a register indirection, which means
9635 that the expression is implicitly zero. We
9636 still set up imm_expr, so that we handle
9637 explicit extensions correctly. */
9638 imm_expr.X_op = O_constant;
9639 imm_expr.X_add_number = 0;
f6688943 9640 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
252b5132
RH
9641 continue;
9642 }
9643
9644 break;
9645 }
9646
9647 /* We need to relax this instruction. */
f6688943 9648 *imm_reloc = (int) BFD_RELOC_UNUSED + c;
252b5132
RH
9649 s = expr_end;
9650 continue;
9651
9652 case 'p':
9653 case 'q':
9654 case 'A':
9655 case 'B':
9656 case 'E':
9657 /* We use offset_reloc rather than imm_reloc for the PC
9658 relative operands. This lets macros with both
9659 immediate and address operands work correctly. */
9660 my_getExpression (&offset_expr, s);
9661
9662 if (offset_expr.X_op == O_register)
9663 break;
9664
9665 /* We need to relax this instruction. */
f6688943 9666 *offset_reloc = (int) BFD_RELOC_UNUSED + c;
252b5132
RH
9667 s = expr_end;
9668 continue;
9669
9670 case '6': /* break code */
9671 my_getExpression (&imm_expr, s);
9672 check_absolute_expr (ip, &imm_expr);
9673 if ((unsigned long) imm_expr.X_add_number > 63)
9674 {
9675 as_warn (_("Invalid value for `%s' (%lu)"),
9676 ip->insn_mo->name,
9677 (unsigned long) imm_expr.X_add_number);
9678 imm_expr.X_add_number &= 0x3f;
9679 }
9680 ip->insn_opcode |= imm_expr.X_add_number << MIPS16OP_SH_IMM6;
9681 imm_expr.X_op = O_absent;
9682 s = expr_end;
9683 continue;
9684
9685 case 'a': /* 26 bit address */
9686 my_getExpression (&offset_expr, s);
9687 s = expr_end;
f6688943 9688 *offset_reloc = BFD_RELOC_MIPS16_JMP;
252b5132
RH
9689 ip->insn_opcode <<= 16;
9690 continue;
9691
9692 case 'l': /* register list for entry macro */
9693 case 'L': /* register list for exit macro */
9694 {
9695 int mask;
9696
9697 if (c == 'l')
9698 mask = 0;
9699 else
9700 mask = 7 << 3;
9701 while (*s != '\0')
9702 {
9703 int freg, reg1, reg2;
9704
9705 while (*s == ' ' || *s == ',')
9706 ++s;
9707 if (*s != '$')
9708 {
9709 as_bad (_("can't parse register list"));
9710 break;
9711 }
9712 ++s;
9713 if (*s != 'f')
9714 freg = 0;
9715 else
9716 {
9717 freg = 1;
9718 ++s;
9719 }
9720 reg1 = 0;
3882b010 9721 while (ISDIGIT (*s))
252b5132
RH
9722 {
9723 reg1 *= 10;
9724 reg1 += *s - '0';
9725 ++s;
9726 }
9727 if (*s == ' ')
9728 ++s;
9729 if (*s != '-')
9730 reg2 = reg1;
9731 else
9732 {
9733 ++s;
9734 if (*s != '$')
9735 break;
9736 ++s;
9737 if (freg)
9738 {
9739 if (*s == 'f')
9740 ++s;
9741 else
9742 {
9743 as_bad (_("invalid register list"));
9744 break;
9745 }
9746 }
9747 reg2 = 0;
3882b010 9748 while (ISDIGIT (*s))
252b5132
RH
9749 {
9750 reg2 *= 10;
9751 reg2 += *s - '0';
9752 ++s;
9753 }
9754 }
9755 if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
9756 {
9757 mask &= ~ (7 << 3);
9758 mask |= 5 << 3;
9759 }
9760 else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
9761 {
9762 mask &= ~ (7 << 3);
9763 mask |= 6 << 3;
9764 }
9765 else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
9766 mask |= (reg2 - 3) << 3;
9767 else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
9768 mask |= (reg2 - 15) << 1;
f9419b05 9769 else if (reg1 == RA && reg2 == RA)
252b5132
RH
9770 mask |= 1;
9771 else
9772 {
9773 as_bad (_("invalid register list"));
9774 break;
9775 }
9776 }
9777 /* The mask is filled in in the opcode table for the
9778 benefit of the disassembler. We remove it before
9779 applying the actual mask. */
9780 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
9781 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
9782 }
9783 continue;
9784
9785 case 'e': /* extend code */
9786 my_getExpression (&imm_expr, s);
9787 check_absolute_expr (ip, &imm_expr);
9788 if ((unsigned long) imm_expr.X_add_number > 0x7ff)
9789 {
9790 as_warn (_("Invalid value for `%s' (%lu)"),
9791 ip->insn_mo->name,
9792 (unsigned long) imm_expr.X_add_number);
9793 imm_expr.X_add_number &= 0x7ff;
9794 }
9795 ip->insn_opcode |= imm_expr.X_add_number;
9796 imm_expr.X_op = O_absent;
9797 s = expr_end;
9798 continue;
9799
9800 default:
9801 internalError ();
9802 }
9803 break;
9804 }
9805
9806 /* Args don't match. */
9807 if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
9808 strcmp (insn->name, insn[1].name) == 0)
9809 {
9810 ++insn;
9811 s = argsstart;
9812 continue;
9813 }
9814
9815 insn_error = _("illegal operands");
9816
9817 return;
9818 }
9819}
9820
9821/* This structure holds information we know about a mips16 immediate
9822 argument type. */
9823
e972090a
NC
9824struct mips16_immed_operand
9825{
252b5132
RH
9826 /* The type code used in the argument string in the opcode table. */
9827 int type;
9828 /* The number of bits in the short form of the opcode. */
9829 int nbits;
9830 /* The number of bits in the extended form of the opcode. */
9831 int extbits;
9832 /* The amount by which the short form is shifted when it is used;
9833 for example, the sw instruction has a shift count of 2. */
9834 int shift;
9835 /* The amount by which the short form is shifted when it is stored
9836 into the instruction code. */
9837 int op_shift;
9838 /* Non-zero if the short form is unsigned. */
9839 int unsp;
9840 /* Non-zero if the extended form is unsigned. */
9841 int extu;
9842 /* Non-zero if the value is PC relative. */
9843 int pcrel;
9844};
9845
9846/* The mips16 immediate operand types. */
9847
9848static const struct mips16_immed_operand mips16_immed_operands[] =
9849{
9850 { '<', 3, 5, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
9851 { '>', 3, 5, 0, MIPS16OP_SH_RX, 1, 1, 0 },
9852 { '[', 3, 6, 0, MIPS16OP_SH_RZ, 1, 1, 0 },
9853 { ']', 3, 6, 0, MIPS16OP_SH_RX, 1, 1, 0 },
9854 { '4', 4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
9855 { '5', 5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
9856 { 'H', 5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
9857 { 'W', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
9858 { 'D', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
9859 { 'j', 5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
9860 { '8', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
9861 { 'V', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
9862 { 'C', 8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
9863 { 'U', 8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
9864 { 'k', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
9865 { 'K', 8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
9866 { 'p', 8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
9867 { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
9868 { 'A', 8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
9869 { 'B', 5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
9870 { 'E', 5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
9871};
9872
9873#define MIPS16_NUM_IMMED \
9874 (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
9875
9876/* Handle a mips16 instruction with an immediate value. This or's the
9877 small immediate value into *INSN. It sets *USE_EXTEND to indicate
9878 whether an extended value is needed; if one is needed, it sets
9879 *EXTEND to the value. The argument type is TYPE. The value is VAL.
9880 If SMALL is true, an unextended opcode was explicitly requested.
9881 If EXT is true, an extended opcode was explicitly requested. If
9882 WARN is true, warn if EXT does not match reality. */
9883
9884static void
9885mips16_immed (file, line, type, val, warn, small, ext, insn, use_extend,
9886 extend)
9887 char *file;
9888 unsigned int line;
9889 int type;
9890 offsetT val;
b34976b6
AM
9891 bfd_boolean warn;
9892 bfd_boolean small;
9893 bfd_boolean ext;
252b5132 9894 unsigned long *insn;
b34976b6 9895 bfd_boolean *use_extend;
252b5132
RH
9896 unsigned short *extend;
9897{
9898 register const struct mips16_immed_operand *op;
9899 int mintiny, maxtiny;
b34976b6 9900 bfd_boolean needext;
252b5132
RH
9901
9902 op = mips16_immed_operands;
9903 while (op->type != type)
9904 {
9905 ++op;
9906 assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
9907 }
9908
9909 if (op->unsp)
9910 {
9911 if (type == '<' || type == '>' || type == '[' || type == ']')
9912 {
9913 mintiny = 1;
9914 maxtiny = 1 << op->nbits;
9915 }
9916 else
9917 {
9918 mintiny = 0;
9919 maxtiny = (1 << op->nbits) - 1;
9920 }
9921 }
9922 else
9923 {
9924 mintiny = - (1 << (op->nbits - 1));
9925 maxtiny = (1 << (op->nbits - 1)) - 1;
9926 }
9927
9928 /* Branch offsets have an implicit 0 in the lowest bit. */
9929 if (type == 'p' || type == 'q')
9930 val /= 2;
9931
9932 if ((val & ((1 << op->shift) - 1)) != 0
9933 || val < (mintiny << op->shift)
9934 || val > (maxtiny << op->shift))
b34976b6 9935 needext = TRUE;
252b5132 9936 else
b34976b6 9937 needext = FALSE;
252b5132
RH
9938
9939 if (warn && ext && ! needext)
beae10d5
KH
9940 as_warn_where (file, line,
9941 _("extended operand requested but not required"));
252b5132
RH
9942 if (small && needext)
9943 as_bad_where (file, line, _("invalid unextended operand value"));
9944
9945 if (small || (! ext && ! needext))
9946 {
9947 int insnval;
9948
b34976b6 9949 *use_extend = FALSE;
252b5132
RH
9950 insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
9951 insnval <<= op->op_shift;
9952 *insn |= insnval;
9953 }
9954 else
9955 {
9956 long minext, maxext;
9957 int extval;
9958
9959 if (op->extu)
9960 {
9961 minext = 0;
9962 maxext = (1 << op->extbits) - 1;
9963 }
9964 else
9965 {
9966 minext = - (1 << (op->extbits - 1));
9967 maxext = (1 << (op->extbits - 1)) - 1;
9968 }
9969 if (val < minext || val > maxext)
9970 as_bad_where (file, line,
9971 _("operand value out of range for instruction"));
9972
b34976b6 9973 *use_extend = TRUE;
252b5132
RH
9974 if (op->extbits == 16)
9975 {
9976 extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
9977 val &= 0x1f;
9978 }
9979 else if (op->extbits == 15)
9980 {
9981 extval = ((val >> 11) & 0xf) | (val & 0x7f0);
9982 val &= 0xf;
9983 }
9984 else
9985 {
9986 extval = ((val & 0x1f) << 6) | (val & 0x20);
9987 val = 0;
9988 }
9989
9990 *extend = (unsigned short) extval;
9991 *insn |= val;
9992 }
9993}
9994\f
5e0116d5 9995static const struct percent_op_match
ad8d3bb3 9996{
5e0116d5
RS
9997 const char *str;
9998 bfd_reloc_code_real_type reloc;
ad8d3bb3
TS
9999} percent_op[] =
10000{
5e0116d5 10001 {"%lo", BFD_RELOC_LO16},
ad8d3bb3 10002#ifdef OBJ_ELF
5e0116d5
RS
10003 {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
10004 {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
10005 {"%call16", BFD_RELOC_MIPS_CALL16},
10006 {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
10007 {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
10008 {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
10009 {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
10010 {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
10011 {"%got", BFD_RELOC_MIPS_GOT16},
10012 {"%gp_rel", BFD_RELOC_GPREL16},
10013 {"%half", BFD_RELOC_16},
10014 {"%highest", BFD_RELOC_MIPS_HIGHEST},
10015 {"%higher", BFD_RELOC_MIPS_HIGHER},
10016 {"%neg", BFD_RELOC_MIPS_SUB},
ad8d3bb3 10017#endif
5e0116d5 10018 {"%hi", BFD_RELOC_HI16_S}
ad8d3bb3
TS
10019};
10020
252b5132 10021
5e0116d5
RS
10022/* Return true if *STR points to a relocation operator. When returning true,
10023 move *STR over the operator and store its relocation code in *RELOC.
10024 Leave both *STR and *RELOC alone when returning false. */
10025
10026static bfd_boolean
10027parse_relocation (str, reloc)
ad8d3bb3 10028 char **str;
5e0116d5 10029 bfd_reloc_code_real_type *reloc;
252b5132 10030{
5e0116d5 10031 size_t i;
76b3015f 10032
5e0116d5
RS
10033 for (i = 0; i < ARRAY_SIZE (percent_op); i++)
10034 if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
394f9b3a 10035 {
5e0116d5
RS
10036 *str += strlen (percent_op[i].str);
10037 *reloc = percent_op[i].reloc;
394f9b3a 10038
5e0116d5
RS
10039 /* Check whether the output BFD supports this relocation.
10040 If not, issue an error and fall back on something safe. */
10041 if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
394f9b3a 10042 {
5e0116d5
RS
10043 as_bad ("relocation %s isn't supported by the current ABI",
10044 percent_op[i].str);
10045 *reloc = BFD_RELOC_LO16;
394f9b3a 10046 }
5e0116d5 10047 return TRUE;
394f9b3a 10048 }
5e0116d5 10049 return FALSE;
394f9b3a 10050}
ad8d3bb3 10051
ad8d3bb3 10052
5e0116d5
RS
10053/* Parse string STR as a 16-bit relocatable operand. Store the
10054 expression in *EP and the relocations in the array starting
10055 at RELOC. Return the number of relocation operators used.
ad8d3bb3 10056
5e0116d5
RS
10057 On exit, EXPR_END points to the first character after the expression.
10058 If no relocation operators are used, RELOC[0] is set to BFD_RELOC_LO16. */
ad8d3bb3 10059
5e0116d5
RS
10060static size_t
10061my_getSmallExpression (ep, reloc, str)
ad8d3bb3 10062 expressionS *ep;
5e0116d5 10063 bfd_reloc_code_real_type *reloc;
ad8d3bb3
TS
10064 char *str;
10065{
5e0116d5
RS
10066 bfd_reloc_code_real_type reversed_reloc[3];
10067 size_t reloc_index, i;
09b8f35a
RS
10068 int crux_depth, str_depth;
10069 char *crux;
5e0116d5
RS
10070
10071 /* Search for the start of the main expression, recoding relocations
09b8f35a
RS
10072 in REVERSED_RELOC. End the loop with CRUX pointing to the start
10073 of the main expression and with CRUX_DEPTH containing the number
10074 of open brackets at that point. */
10075 reloc_index = -1;
10076 str_depth = 0;
10077 do
fb1b3232 10078 {
09b8f35a
RS
10079 reloc_index++;
10080 crux = str;
10081 crux_depth = str_depth;
10082
10083 /* Skip over whitespace and brackets, keeping count of the number
10084 of brackets. */
10085 while (*str == ' ' || *str == '\t' || *str == '(')
10086 if (*str++ == '(')
10087 str_depth++;
5e0116d5 10088 }
09b8f35a
RS
10089 while (*str == '%'
10090 && reloc_index < (HAVE_NEWABI ? 3 : 1)
10091 && parse_relocation (&str, &reversed_reloc[reloc_index]));
ad8d3bb3 10092
09b8f35a 10093 my_getExpression (ep, crux);
5e0116d5 10094 str = expr_end;
394f9b3a 10095
5e0116d5 10096 /* Match every open bracket. */
09b8f35a 10097 while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
5e0116d5 10098 if (*str++ == ')')
09b8f35a 10099 crux_depth--;
394f9b3a 10100
09b8f35a 10101 if (crux_depth > 0)
5e0116d5 10102 as_bad ("unclosed '('");
394f9b3a 10103
5e0116d5 10104 expr_end = str;
252b5132 10105
5e0116d5
RS
10106 reloc[0] = BFD_RELOC_LO16;
10107 for (i = 0; i < reloc_index; i++)
10108 reloc[i] = reversed_reloc[reloc_index - 1 - i];
fb1b3232 10109
5e0116d5 10110 return reloc_index;
252b5132
RH
10111}
10112
10113static void
10114my_getExpression (ep, str)
10115 expressionS *ep;
10116 char *str;
10117{
10118 char *save_in;
98aa84af 10119 valueT val;
252b5132
RH
10120
10121 save_in = input_line_pointer;
10122 input_line_pointer = str;
10123 expression (ep);
10124 expr_end = input_line_pointer;
10125 input_line_pointer = save_in;
10126
10127 /* If we are in mips16 mode, and this is an expression based on `.',
10128 then we bump the value of the symbol by 1 since that is how other
10129 text symbols are handled. We don't bother to handle complex
10130 expressions, just `.' plus or minus a constant. */
10131 if (mips_opts.mips16
10132 && ep->X_op == O_symbol
10133 && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
10134 && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
49309057
ILT
10135 && symbol_get_frag (ep->X_add_symbol) == frag_now
10136 && symbol_constant_p (ep->X_add_symbol)
98aa84af
AM
10137 && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
10138 S_SET_VALUE (ep->X_add_symbol, val + 1);
252b5132
RH
10139}
10140
10141/* Turn a string in input_line_pointer into a floating point constant
bc0d738a
NC
10142 of type TYPE, and store the appropriate bytes in *LITP. The number
10143 of LITTLENUMS emitted is stored in *SIZEP. An error message is
252b5132
RH
10144 returned, or NULL on OK. */
10145
10146char *
10147md_atof (type, litP, sizeP)
10148 int type;
10149 char *litP;
10150 int *sizeP;
10151{
10152 int prec;
10153 LITTLENUM_TYPE words[4];
10154 char *t;
10155 int i;
10156
10157 switch (type)
10158 {
10159 case 'f':
10160 prec = 2;
10161 break;
10162
10163 case 'd':
10164 prec = 4;
10165 break;
10166
10167 default:
10168 *sizeP = 0;
10169 return _("bad call to md_atof");
10170 }
10171
10172 t = atof_ieee (input_line_pointer, type, words);
10173 if (t)
10174 input_line_pointer = t;
10175
10176 *sizeP = prec * 2;
10177
10178 if (! target_big_endian)
10179 {
10180 for (i = prec - 1; i >= 0; i--)
10181 {
10182 md_number_to_chars (litP, (valueT) words[i], 2);
10183 litP += 2;
10184 }
10185 }
10186 else
10187 {
10188 for (i = 0; i < prec; i++)
10189 {
10190 md_number_to_chars (litP, (valueT) words[i], 2);
10191 litP += 2;
10192 }
10193 }
bdaaa2e1 10194
252b5132
RH
10195 return NULL;
10196}
10197
10198void
10199md_number_to_chars (buf, val, n)
10200 char *buf;
10201 valueT val;
10202 int n;
10203{
10204 if (target_big_endian)
10205 number_to_chars_bigendian (buf, val, n);
10206 else
10207 number_to_chars_littleendian (buf, val, n);
10208}
10209\f
ae948b86 10210#ifdef OBJ_ELF
e013f690
TS
10211static int support_64bit_objects(void)
10212{
10213 const char **list, **l;
aa3d8fdf 10214 int yes;
e013f690
TS
10215
10216 list = bfd_target_list ();
10217 for (l = list; *l != NULL; l++)
10218#ifdef TE_TMIPS
10219 /* This is traditional mips */
10220 if (strcmp (*l, "elf64-tradbigmips") == 0
10221 || strcmp (*l, "elf64-tradlittlemips") == 0)
10222#else
10223 if (strcmp (*l, "elf64-bigmips") == 0
10224 || strcmp (*l, "elf64-littlemips") == 0)
10225#endif
10226 break;
aa3d8fdf 10227 yes = (*l != NULL);
e013f690 10228 free (list);
aa3d8fdf 10229 return yes;
e013f690 10230}
ae948b86 10231#endif /* OBJ_ELF */
e013f690 10232
5a38dc70 10233const char *md_shortopts = "nO::g::G:";
252b5132 10234
e972090a
NC
10235struct option md_longopts[] =
10236{
252b5132
RH
10237#define OPTION_MIPS1 (OPTION_MD_BASE + 1)
10238 {"mips0", no_argument, NULL, OPTION_MIPS1},
10239 {"mips1", no_argument, NULL, OPTION_MIPS1},
10240#define OPTION_MIPS2 (OPTION_MD_BASE + 2)
10241 {"mips2", no_argument, NULL, OPTION_MIPS2},
10242#define OPTION_MIPS3 (OPTION_MD_BASE + 3)
10243 {"mips3", no_argument, NULL, OPTION_MIPS3},
10244#define OPTION_MIPS4 (OPTION_MD_BASE + 4)
10245 {"mips4", no_argument, NULL, OPTION_MIPS4},
ae948b86
TS
10246#define OPTION_MIPS5 (OPTION_MD_BASE + 5)
10247 {"mips5", no_argument, NULL, OPTION_MIPS5},
10248#define OPTION_MIPS32 (OPTION_MD_BASE + 6)
10249 {"mips32", no_argument, NULL, OPTION_MIPS32},
10250#define OPTION_MIPS64 (OPTION_MD_BASE + 7)
10251 {"mips64", no_argument, NULL, OPTION_MIPS64},
10252#define OPTION_MEMBEDDED_PIC (OPTION_MD_BASE + 8)
252b5132 10253 {"membedded-pic", no_argument, NULL, OPTION_MEMBEDDED_PIC},
ae948b86 10254#define OPTION_TRAP (OPTION_MD_BASE + 9)
252b5132
RH
10255 {"trap", no_argument, NULL, OPTION_TRAP},
10256 {"no-break", no_argument, NULL, OPTION_TRAP},
ae948b86 10257#define OPTION_BREAK (OPTION_MD_BASE + 10)
252b5132
RH
10258 {"break", no_argument, NULL, OPTION_BREAK},
10259 {"no-trap", no_argument, NULL, OPTION_BREAK},
ae948b86 10260#define OPTION_EB (OPTION_MD_BASE + 11)
252b5132 10261 {"EB", no_argument, NULL, OPTION_EB},
ae948b86 10262#define OPTION_EL (OPTION_MD_BASE + 12)
252b5132 10263 {"EL", no_argument, NULL, OPTION_EL},
ae948b86 10264#define OPTION_MIPS16 (OPTION_MD_BASE + 13)
252b5132 10265 {"mips16", no_argument, NULL, OPTION_MIPS16},
ae948b86 10266#define OPTION_NO_MIPS16 (OPTION_MD_BASE + 14)
252b5132 10267 {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
ae948b86 10268#define OPTION_M7000_HILO_FIX (OPTION_MD_BASE + 15)
6b76fefe 10269 {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
9ee72ff1
TS
10270#define OPTION_MNO_7000_HILO_FIX (OPTION_MD_BASE + 16)
10271 {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
10272 {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
ae948b86
TS
10273#define OPTION_FP32 (OPTION_MD_BASE + 17)
10274 {"mfp32", no_argument, NULL, OPTION_FP32},
10275#define OPTION_GP32 (OPTION_MD_BASE + 18)
c97ef257 10276 {"mgp32", no_argument, NULL, OPTION_GP32},
ae948b86 10277#define OPTION_CONSTRUCT_FLOATS (OPTION_MD_BASE + 19)
119d663a 10278 {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
ae948b86 10279#define OPTION_NO_CONSTRUCT_FLOATS (OPTION_MD_BASE + 20)
119d663a 10280 {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
ae948b86 10281#define OPTION_MARCH (OPTION_MD_BASE + 21)
ec68c924 10282 {"march", required_argument, NULL, OPTION_MARCH},
ae948b86 10283#define OPTION_MTUNE (OPTION_MD_BASE + 22)
ec68c924 10284 {"mtune", required_argument, NULL, OPTION_MTUNE},
316f5878
RS
10285#define OPTION_FP64 (OPTION_MD_BASE + 23)
10286 {"mfp64", no_argument, NULL, OPTION_FP64},
ae948b86
TS
10287#define OPTION_M4650 (OPTION_MD_BASE + 24)
10288 {"m4650", no_argument, NULL, OPTION_M4650},
10289#define OPTION_NO_M4650 (OPTION_MD_BASE + 25)
10290 {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
10291#define OPTION_M4010 (OPTION_MD_BASE + 26)
10292 {"m4010", no_argument, NULL, OPTION_M4010},
10293#define OPTION_NO_M4010 (OPTION_MD_BASE + 27)
10294 {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
10295#define OPTION_M4100 (OPTION_MD_BASE + 28)
10296 {"m4100", no_argument, NULL, OPTION_M4100},
10297#define OPTION_NO_M4100 (OPTION_MD_BASE + 29)
10298 {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
10299#define OPTION_M3900 (OPTION_MD_BASE + 30)
10300 {"m3900", no_argument, NULL, OPTION_M3900},
10301#define OPTION_NO_M3900 (OPTION_MD_BASE + 31)
10302 {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
10303#define OPTION_GP64 (OPTION_MD_BASE + 32)
10304 {"mgp64", no_argument, NULL, OPTION_GP64},
1f25f5d3
CD
10305#define OPTION_MIPS3D (OPTION_MD_BASE + 33)
10306 {"mips3d", no_argument, NULL, OPTION_MIPS3D},
10307#define OPTION_NO_MIPS3D (OPTION_MD_BASE + 34)
10308 {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
deec1734
CD
10309#define OPTION_MDMX (OPTION_MD_BASE + 35)
10310 {"mdmx", no_argument, NULL, OPTION_MDMX},
10311#define OPTION_NO_MDMX (OPTION_MD_BASE + 36)
10312 {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
60b63b72
RS
10313#define OPTION_FIX_VR4122 (OPTION_MD_BASE + 37)
10314#define OPTION_NO_FIX_VR4122 (OPTION_MD_BASE + 38)
10315 {"mfix-vr4122-bugs", no_argument, NULL, OPTION_FIX_VR4122},
10316 {"no-mfix-vr4122-bugs", no_argument, NULL, OPTION_NO_FIX_VR4122},
4a6a3df4
AO
10317#define OPTION_RELAX_BRANCH (OPTION_MD_BASE + 39)
10318#define OPTION_NO_RELAX_BRANCH (OPTION_MD_BASE + 40)
10319 {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
10320 {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
af7ee8bf
CD
10321#define OPTION_MIPS32R2 (OPTION_MD_BASE + 41)
10322 {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
156c2f8b 10323#ifdef OBJ_ELF
af7ee8bf 10324#define OPTION_ELF_BASE (OPTION_MD_BASE + 42)
156c2f8b 10325#define OPTION_CALL_SHARED (OPTION_ELF_BASE + 0)
156c2f8b
NC
10326 {"KPIC", no_argument, NULL, OPTION_CALL_SHARED},
10327 {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
ae948b86 10328#define OPTION_NON_SHARED (OPTION_ELF_BASE + 1)
156c2f8b 10329 {"non_shared", no_argument, NULL, OPTION_NON_SHARED},
ae948b86 10330#define OPTION_XGOT (OPTION_ELF_BASE + 2)
156c2f8b 10331 {"xgot", no_argument, NULL, OPTION_XGOT},
ae948b86
TS
10332#define OPTION_MABI (OPTION_ELF_BASE + 3)
10333 {"mabi", required_argument, NULL, OPTION_MABI},
10334#define OPTION_32 (OPTION_ELF_BASE + 4)
156c2f8b 10335 {"32", no_argument, NULL, OPTION_32},
ae948b86 10336#define OPTION_N32 (OPTION_ELF_BASE + 5)
e013f690 10337 {"n32", no_argument, NULL, OPTION_N32},
ae948b86 10338#define OPTION_64 (OPTION_ELF_BASE + 6)
156c2f8b 10339 {"64", no_argument, NULL, OPTION_64},
ecb4347a
DJ
10340#define OPTION_MDEBUG (OPTION_ELF_BASE + 7)
10341 {"mdebug", no_argument, NULL, OPTION_MDEBUG},
10342#define OPTION_NO_MDEBUG (OPTION_ELF_BASE + 8)
10343 {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
ae948b86 10344#endif /* OBJ_ELF */
252b5132
RH
10345 {NULL, no_argument, NULL, 0}
10346};
156c2f8b 10347size_t md_longopts_size = sizeof (md_longopts);
252b5132 10348
316f5878
RS
10349/* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
10350 NEW_VALUE. Warn if another value was already specified. Note:
10351 we have to defer parsing the -march and -mtune arguments in order
10352 to handle 'from-abi' correctly, since the ABI might be specified
10353 in a later argument. */
10354
10355static void
10356mips_set_option_string (string_ptr, new_value)
10357 const char **string_ptr, *new_value;
10358{
10359 if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
10360 as_warn (_("A different %s was already specified, is now %s"),
10361 string_ptr == &mips_arch_string ? "-march" : "-mtune",
10362 new_value);
10363
10364 *string_ptr = new_value;
10365}
10366
252b5132
RH
10367int
10368md_parse_option (c, arg)
10369 int c;
10370 char *arg;
10371{
10372 switch (c)
10373 {
119d663a
NC
10374 case OPTION_CONSTRUCT_FLOATS:
10375 mips_disable_float_construction = 0;
10376 break;
bdaaa2e1 10377
119d663a
NC
10378 case OPTION_NO_CONSTRUCT_FLOATS:
10379 mips_disable_float_construction = 1;
10380 break;
bdaaa2e1 10381
252b5132
RH
10382 case OPTION_TRAP:
10383 mips_trap = 1;
10384 break;
10385
10386 case OPTION_BREAK:
10387 mips_trap = 0;
10388 break;
10389
10390 case OPTION_EB:
10391 target_big_endian = 1;
10392 break;
10393
10394 case OPTION_EL:
10395 target_big_endian = 0;
10396 break;
10397
39c0a331
L
10398 case 'n':
10399 warn_nops = 1;
10400 break;
10401
252b5132
RH
10402 case 'O':
10403 if (arg && arg[1] == '0')
10404 mips_optimize = 1;
10405 else
10406 mips_optimize = 2;
10407 break;
10408
10409 case 'g':
10410 if (arg == NULL)
10411 mips_debug = 2;
10412 else
10413 mips_debug = atoi (arg);
10414 /* When the MIPS assembler sees -g or -g2, it does not do
10415 optimizations which limit full symbolic debugging. We take
10416 that to be equivalent to -O0. */
10417 if (mips_debug == 2)
10418 mips_optimize = 1;
10419 break;
10420
10421 case OPTION_MIPS1:
316f5878 10422 file_mips_isa = ISA_MIPS1;
252b5132
RH
10423 break;
10424
10425 case OPTION_MIPS2:
316f5878 10426 file_mips_isa = ISA_MIPS2;
252b5132
RH
10427 break;
10428
10429 case OPTION_MIPS3:
316f5878 10430 file_mips_isa = ISA_MIPS3;
252b5132
RH
10431 break;
10432
10433 case OPTION_MIPS4:
316f5878 10434 file_mips_isa = ISA_MIPS4;
e7af610e
NC
10435 break;
10436
84ea6cf2 10437 case OPTION_MIPS5:
316f5878 10438 file_mips_isa = ISA_MIPS5;
84ea6cf2
NC
10439 break;
10440
e7af610e 10441 case OPTION_MIPS32:
316f5878 10442 file_mips_isa = ISA_MIPS32;
252b5132
RH
10443 break;
10444
af7ee8bf
CD
10445 case OPTION_MIPS32R2:
10446 file_mips_isa = ISA_MIPS32R2;
10447 break;
10448
84ea6cf2 10449 case OPTION_MIPS64:
316f5878 10450 file_mips_isa = ISA_MIPS64;
84ea6cf2
NC
10451 break;
10452
ec68c924 10453 case OPTION_MTUNE:
316f5878
RS
10454 mips_set_option_string (&mips_tune_string, arg);
10455 break;
ec68c924 10456
316f5878
RS
10457 case OPTION_MARCH:
10458 mips_set_option_string (&mips_arch_string, arg);
252b5132
RH
10459 break;
10460
10461 case OPTION_M4650:
316f5878
RS
10462 mips_set_option_string (&mips_arch_string, "4650");
10463 mips_set_option_string (&mips_tune_string, "4650");
252b5132
RH
10464 break;
10465
10466 case OPTION_NO_M4650:
10467 break;
10468
10469 case OPTION_M4010:
316f5878
RS
10470 mips_set_option_string (&mips_arch_string, "4010");
10471 mips_set_option_string (&mips_tune_string, "4010");
252b5132
RH
10472 break;
10473
10474 case OPTION_NO_M4010:
10475 break;
10476
10477 case OPTION_M4100:
316f5878
RS
10478 mips_set_option_string (&mips_arch_string, "4100");
10479 mips_set_option_string (&mips_tune_string, "4100");
252b5132
RH
10480 break;
10481
10482 case OPTION_NO_M4100:
10483 break;
10484
252b5132 10485 case OPTION_M3900:
316f5878
RS
10486 mips_set_option_string (&mips_arch_string, "3900");
10487 mips_set_option_string (&mips_tune_string, "3900");
252b5132 10488 break;
bdaaa2e1 10489
252b5132
RH
10490 case OPTION_NO_M3900:
10491 break;
10492
deec1734
CD
10493 case OPTION_MDMX:
10494 mips_opts.ase_mdmx = 1;
10495 break;
10496
10497 case OPTION_NO_MDMX:
10498 mips_opts.ase_mdmx = 0;
10499 break;
10500
252b5132
RH
10501 case OPTION_MIPS16:
10502 mips_opts.mips16 = 1;
b34976b6 10503 mips_no_prev_insn (FALSE);
252b5132
RH
10504 break;
10505
10506 case OPTION_NO_MIPS16:
10507 mips_opts.mips16 = 0;
b34976b6 10508 mips_no_prev_insn (FALSE);
252b5132
RH
10509 break;
10510
1f25f5d3
CD
10511 case OPTION_MIPS3D:
10512 mips_opts.ase_mips3d = 1;
10513 break;
10514
10515 case OPTION_NO_MIPS3D:
10516 mips_opts.ase_mips3d = 0;
10517 break;
10518
252b5132
RH
10519 case OPTION_MEMBEDDED_PIC:
10520 mips_pic = EMBEDDED_PIC;
10521 if (USE_GLOBAL_POINTER_OPT && g_switch_seen)
10522 {
10523 as_bad (_("-G may not be used with embedded PIC code"));
10524 return 0;
10525 }
10526 g_switch_value = 0x7fffffff;
10527 break;
10528
60b63b72
RS
10529 case OPTION_FIX_VR4122:
10530 mips_fix_4122_bugs = 1;
10531 break;
10532
10533 case OPTION_NO_FIX_VR4122:
10534 mips_fix_4122_bugs = 0;
10535 break;
10536
4a6a3df4
AO
10537 case OPTION_RELAX_BRANCH:
10538 mips_relax_branch = 1;
10539 break;
10540
10541 case OPTION_NO_RELAX_BRANCH:
10542 mips_relax_branch = 0;
10543 break;
10544
0f074f60 10545#ifdef OBJ_ELF
252b5132
RH
10546 /* When generating ELF code, we permit -KPIC and -call_shared to
10547 select SVR4_PIC, and -non_shared to select no PIC. This is
10548 intended to be compatible with Irix 5. */
10549 case OPTION_CALL_SHARED:
10550 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10551 {
10552 as_bad (_("-call_shared is supported only for ELF format"));
10553 return 0;
10554 }
10555 mips_pic = SVR4_PIC;
10556 if (g_switch_seen && g_switch_value != 0)
10557 {
10558 as_bad (_("-G may not be used with SVR4 PIC code"));
10559 return 0;
10560 }
10561 g_switch_value = 0;
10562 break;
10563
10564 case OPTION_NON_SHARED:
10565 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10566 {
10567 as_bad (_("-non_shared is supported only for ELF format"));
10568 return 0;
10569 }
10570 mips_pic = NO_PIC;
10571 break;
10572
10573 /* The -xgot option tells the assembler to use 32 offsets when
10574 accessing the got in SVR4_PIC mode. It is for Irix
10575 compatibility. */
10576 case OPTION_XGOT:
10577 mips_big_got = 1;
10578 break;
0f074f60 10579#endif /* OBJ_ELF */
252b5132
RH
10580
10581 case 'G':
10582 if (! USE_GLOBAL_POINTER_OPT)
10583 {
10584 as_bad (_("-G is not supported for this configuration"));
10585 return 0;
10586 }
10587 else if (mips_pic == SVR4_PIC || mips_pic == EMBEDDED_PIC)
10588 {
10589 as_bad (_("-G may not be used with SVR4 or embedded PIC code"));
10590 return 0;
10591 }
10592 else
10593 g_switch_value = atoi (arg);
10594 g_switch_seen = 1;
10595 break;
10596
0f074f60 10597#ifdef OBJ_ELF
34ba82a8
TS
10598 /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
10599 and -mabi=64. */
252b5132 10600 case OPTION_32:
34ba82a8
TS
10601 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10602 {
10603 as_bad (_("-32 is supported for ELF format only"));
10604 return 0;
10605 }
316f5878 10606 mips_abi = O32_ABI;
252b5132
RH
10607 break;
10608
e013f690 10609 case OPTION_N32:
34ba82a8
TS
10610 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10611 {
10612 as_bad (_("-n32 is supported for ELF format only"));
10613 return 0;
10614 }
316f5878 10615 mips_abi = N32_ABI;
e013f690 10616 break;
252b5132 10617
e013f690 10618 case OPTION_64:
34ba82a8
TS
10619 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10620 {
10621 as_bad (_("-64 is supported for ELF format only"));
10622 return 0;
10623 }
316f5878 10624 mips_abi = N64_ABI;
e013f690
TS
10625 if (! support_64bit_objects())
10626 as_fatal (_("No compiled in support for 64 bit object file format"));
252b5132 10627 break;
ae948b86 10628#endif /* OBJ_ELF */
252b5132 10629
c97ef257 10630 case OPTION_GP32:
a325df1d 10631 file_mips_gp32 = 1;
c97ef257
AH
10632 break;
10633
10634 case OPTION_GP64:
a325df1d 10635 file_mips_gp32 = 0;
c97ef257 10636 break;
252b5132 10637
ca4e0257 10638 case OPTION_FP32:
a325df1d 10639 file_mips_fp32 = 1;
316f5878
RS
10640 break;
10641
10642 case OPTION_FP64:
10643 file_mips_fp32 = 0;
ca4e0257
RS
10644 break;
10645
ae948b86 10646#ifdef OBJ_ELF
252b5132 10647 case OPTION_MABI:
34ba82a8
TS
10648 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10649 {
10650 as_bad (_("-mabi is supported for ELF format only"));
10651 return 0;
10652 }
e013f690 10653 if (strcmp (arg, "32") == 0)
316f5878 10654 mips_abi = O32_ABI;
e013f690 10655 else if (strcmp (arg, "o64") == 0)
316f5878 10656 mips_abi = O64_ABI;
e013f690 10657 else if (strcmp (arg, "n32") == 0)
316f5878 10658 mips_abi = N32_ABI;
e013f690
TS
10659 else if (strcmp (arg, "64") == 0)
10660 {
316f5878 10661 mips_abi = N64_ABI;
e013f690
TS
10662 if (! support_64bit_objects())
10663 as_fatal (_("No compiled in support for 64 bit object file "
10664 "format"));
10665 }
10666 else if (strcmp (arg, "eabi") == 0)
316f5878 10667 mips_abi = EABI_ABI;
e013f690 10668 else
da0e507f
TS
10669 {
10670 as_fatal (_("invalid abi -mabi=%s"), arg);
10671 return 0;
10672 }
252b5132 10673 break;
e013f690 10674#endif /* OBJ_ELF */
252b5132 10675
6b76fefe 10676 case OPTION_M7000_HILO_FIX:
b34976b6 10677 mips_7000_hilo_fix = TRUE;
6b76fefe
CM
10678 break;
10679
9ee72ff1 10680 case OPTION_MNO_7000_HILO_FIX:
b34976b6 10681 mips_7000_hilo_fix = FALSE;
6b76fefe
CM
10682 break;
10683
ecb4347a
DJ
10684#ifdef OBJ_ELF
10685 case OPTION_MDEBUG:
b34976b6 10686 mips_flag_mdebug = TRUE;
ecb4347a
DJ
10687 break;
10688
10689 case OPTION_NO_MDEBUG:
b34976b6 10690 mips_flag_mdebug = FALSE;
ecb4347a
DJ
10691 break;
10692#endif /* OBJ_ELF */
10693
252b5132
RH
10694 default:
10695 return 0;
10696 }
10697
10698 return 1;
10699}
316f5878
RS
10700\f
10701/* Set up globals to generate code for the ISA or processor
10702 described by INFO. */
252b5132 10703
252b5132 10704static void
316f5878
RS
10705mips_set_architecture (info)
10706 const struct mips_cpu_info *info;
252b5132 10707{
316f5878 10708 if (info != 0)
252b5132 10709 {
316f5878
RS
10710 mips_arch_info = info;
10711 mips_arch = info->cpu;
10712 mips_opts.isa = info->isa;
252b5132 10713 }
252b5132
RH
10714}
10715
252b5132 10716
316f5878 10717/* Likewise for tuning. */
252b5132 10718
316f5878
RS
10719static void
10720mips_set_tune (info)
10721 const struct mips_cpu_info *info;
10722{
10723 if (info != 0)
10724 {
10725 mips_tune_info = info;
10726 mips_tune = info->cpu;
10727 }
10728}
80cc45a5 10729
34ba82a8 10730
252b5132 10731void
e9670677
MR
10732mips_after_parse_args ()
10733{
e9670677
MR
10734 /* GP relative stuff not working for PE */
10735 if (strncmp (TARGET_OS, "pe", 2) == 0
10736 && g_switch_value != 0)
10737 {
10738 if (g_switch_seen)
10739 as_bad (_("-G not supported in this configuration."));
10740 g_switch_value = 0;
10741 }
10742
22923709
RS
10743 /* The following code determines the architecture and register size.
10744 Similar code was added to GCC 3.3 (see override_options() in
10745 config/mips/mips.c). The GAS and GCC code should be kept in sync
10746 as much as possible. */
e9670677 10747
316f5878
RS
10748 if (mips_arch_string != 0)
10749 mips_set_architecture (mips_parse_cpu ("-march", mips_arch_string));
e9670677 10750
316f5878
RS
10751 if (mips_tune_string != 0)
10752 mips_set_tune (mips_parse_cpu ("-mtune", mips_tune_string));
e9670677 10753
316f5878 10754 if (file_mips_isa != ISA_UNKNOWN)
e9670677 10755 {
316f5878
RS
10756 /* Handle -mipsN. At this point, file_mips_isa contains the
10757 ISA level specified by -mipsN, while mips_opts.isa contains
10758 the -march selection (if any). */
10759 if (mips_arch_info != 0)
e9670677 10760 {
316f5878
RS
10761 /* -march takes precedence over -mipsN, since it is more descriptive.
10762 There's no harm in specifying both as long as the ISA levels
10763 are the same. */
10764 if (file_mips_isa != mips_opts.isa)
10765 as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
10766 mips_cpu_info_from_isa (file_mips_isa)->name,
10767 mips_cpu_info_from_isa (mips_opts.isa)->name);
e9670677 10768 }
316f5878
RS
10769 else
10770 mips_set_architecture (mips_cpu_info_from_isa (file_mips_isa));
e9670677
MR
10771 }
10772
316f5878
RS
10773 if (mips_arch_info == 0)
10774 mips_set_architecture (mips_parse_cpu ("default CPU",
10775 MIPS_CPU_STRING_DEFAULT));
e9670677 10776
316f5878
RS
10777 if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (mips_opts.isa))
10778 as_bad ("-march=%s is not compatible with the selected ABI",
10779 mips_arch_info->name);
e9670677 10780
316f5878
RS
10781 /* Optimize for mips_arch, unless -mtune selects a different processor. */
10782 if (mips_tune_info == 0)
10783 mips_set_tune (mips_arch_info);
e9670677 10784
316f5878 10785 if (file_mips_gp32 >= 0)
e9670677 10786 {
316f5878
RS
10787 /* The user specified the size of the integer registers. Make sure
10788 it agrees with the ABI and ISA. */
10789 if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
10790 as_bad (_("-mgp64 used with a 32-bit processor"));
10791 else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
10792 as_bad (_("-mgp32 used with a 64-bit ABI"));
10793 else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
10794 as_bad (_("-mgp64 used with a 32-bit ABI"));
e9670677
MR
10795 }
10796 else
10797 {
316f5878
RS
10798 /* Infer the integer register size from the ABI and processor.
10799 Restrict ourselves to 32-bit registers if that's all the
10800 processor has, or if the ABI cannot handle 64-bit registers. */
10801 file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
10802 || !ISA_HAS_64BIT_REGS (mips_opts.isa));
e9670677
MR
10803 }
10804
316f5878
RS
10805 /* ??? GAS treats single-float processors as though they had 64-bit
10806 float registers (although it complains when double-precision
10807 instructions are used). As things stand, saying they have 32-bit
10808 registers would lead to spurious "register must be even" messages.
10809 So here we assume float registers are always the same size as
10810 integer ones, unless the user says otherwise. */
10811 if (file_mips_fp32 < 0)
10812 file_mips_fp32 = file_mips_gp32;
e9670677 10813
316f5878 10814 /* End of GCC-shared inference code. */
e9670677 10815
316f5878
RS
10816 /* ??? When do we want this flag to be set? Who uses it? */
10817 if (file_mips_gp32 == 1
10818 && mips_abi == NO_ABI
10819 && ISA_HAS_64BIT_REGS (mips_opts.isa))
10820 mips_32bitmode = 1;
e9670677
MR
10821
10822 if (mips_opts.isa == ISA_MIPS1 && mips_trap)
10823 as_bad (_("trap exception not supported at ISA 1"));
10824
e9670677
MR
10825 /* If the selected architecture includes support for ASEs, enable
10826 generation of code for them. */
a4672219
TS
10827 if (mips_opts.mips16 == -1)
10828 mips_opts.mips16 = (CPU_HAS_MIPS16 (mips_arch)) ? 1 : 0;
ffdefa66 10829 if (mips_opts.ase_mips3d == -1)
a4672219 10830 mips_opts.ase_mips3d = (CPU_HAS_MIPS3D (mips_arch)) ? 1 : 0;
ffdefa66 10831 if (mips_opts.ase_mdmx == -1)
a4672219 10832 mips_opts.ase_mdmx = (CPU_HAS_MDMX (mips_arch)) ? 1 : 0;
e9670677 10833
e9670677 10834 file_mips_isa = mips_opts.isa;
a4672219 10835 file_ase_mips16 = mips_opts.mips16;
e9670677
MR
10836 file_ase_mips3d = mips_opts.ase_mips3d;
10837 file_ase_mdmx = mips_opts.ase_mdmx;
10838 mips_opts.gp32 = file_mips_gp32;
10839 mips_opts.fp32 = file_mips_fp32;
10840
ecb4347a
DJ
10841 if (mips_flag_mdebug < 0)
10842 {
10843#ifdef OBJ_MAYBE_ECOFF
10844 if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
10845 mips_flag_mdebug = 1;
10846 else
10847#endif /* OBJ_MAYBE_ECOFF */
10848 mips_flag_mdebug = 0;
10849 }
e9670677
MR
10850}
10851\f
10852void
252b5132
RH
10853mips_init_after_args ()
10854{
10855 /* initialize opcodes */
10856 bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
beae10d5 10857 mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
252b5132
RH
10858}
10859
10860long
10861md_pcrel_from (fixP)
10862 fixS *fixP;
10863{
10864 if (OUTPUT_FLAVOR != bfd_target_aout_flavour
10865 && fixP->fx_addsy != (symbolS *) NULL
10866 && ! S_IS_DEFINED (fixP->fx_addsy))
af6ae2ad 10867 return 4;
252b5132 10868
c9914766 10869 /* Return the address of the delay slot. */
252b5132
RH
10870 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
10871}
10872
252b5132
RH
10873/* This is called before the symbol table is processed. In order to
10874 work with gcc when using mips-tfile, we must keep all local labels.
10875 However, in other cases, we want to discard them. If we were
10876 called with -g, but we didn't see any debugging information, it may
10877 mean that gcc is smuggling debugging information through to
10878 mips-tfile, in which case we must generate all local labels. */
10879
10880void
10881mips_frob_file_before_adjust ()
10882{
10883#ifndef NO_ECOFF_DEBUGGING
10884 if (ECOFF_DEBUGGING
10885 && mips_debug != 0
10886 && ! ecoff_debugging_seen)
10887 flag_keep_locals = 1;
10888#endif
10889}
10890
10891/* Sort any unmatched HI16_S relocs so that they immediately precede
94f592af 10892 the corresponding LO reloc. This is called before md_apply_fix3 and
252b5132
RH
10893 tc_gen_reloc. Unmatched HI16_S relocs can only be generated by
10894 explicit use of the %hi modifier. */
10895
10896void
10897mips_frob_file ()
10898{
10899 struct mips_hi_fixup *l;
10900
10901 for (l = mips_hi_fixup_list; l != NULL; l = l->next)
10902 {
10903 segment_info_type *seginfo;
10904 int pass;
10905
5919d012 10906 assert (reloc_needs_lo_p (l->fixp->fx_r_type));
252b5132 10907
5919d012
RS
10908 /* If a GOT16 relocation turns out to be against a global symbol,
10909 there isn't supposed to be a matching LO. */
10910 if (l->fixp->fx_r_type == BFD_RELOC_MIPS_GOT16
10911 && !pic_need_relax (l->fixp->fx_addsy, l->seg))
10912 continue;
10913
10914 /* Check quickly whether the next fixup happens to be a matching %lo. */
10915 if (fixup_has_matching_lo_p (l->fixp))
252b5132
RH
10916 continue;
10917
10918 /* Look through the fixups for this segment for a matching %lo.
10919 When we find one, move the %hi just in front of it. We do
10920 this in two passes. In the first pass, we try to find a
10921 unique %lo. In the second pass, we permit multiple %hi
10922 relocs for a single %lo (this is a GNU extension). */
10923 seginfo = seg_info (l->seg);
10924 for (pass = 0; pass < 2; pass++)
10925 {
10926 fixS *f, *prev;
10927
10928 prev = NULL;
10929 for (f = seginfo->fix_root; f != NULL; f = f->fx_next)
10930 {
10931 /* Check whether this is a %lo fixup which matches l->fixp. */
10932 if (f->fx_r_type == BFD_RELOC_LO16
10933 && f->fx_addsy == l->fixp->fx_addsy
10934 && f->fx_offset == l->fixp->fx_offset
10935 && (pass == 1
10936 || prev == NULL
5919d012
RS
10937 || !reloc_needs_lo_p (prev->fx_r_type)
10938 || !fixup_has_matching_lo_p (prev)))
252b5132
RH
10939 {
10940 fixS **pf;
10941
10942 /* Move l->fixp before f. */
10943 for (pf = &seginfo->fix_root;
10944 *pf != l->fixp;
10945 pf = &(*pf)->fx_next)
10946 assert (*pf != NULL);
10947
10948 *pf = l->fixp->fx_next;
10949
10950 l->fixp->fx_next = f;
10951 if (prev == NULL)
10952 seginfo->fix_root = l->fixp;
10953 else
10954 prev->fx_next = l->fixp;
10955
10956 break;
10957 }
10958
10959 prev = f;
10960 }
10961
10962 if (f != NULL)
10963 break;
10964
10965#if 0 /* GCC code motion plus incomplete dead code elimination
10966 can leave a %hi without a %lo. */
10967 if (pass == 1)
10968 as_warn_where (l->fixp->fx_file, l->fixp->fx_line,
10969 _("Unmatched %%hi reloc"));
10970#endif
10971 }
10972 }
10973}
10974
10975/* When generating embedded PIC code we need to use a special
10976 relocation to represent the difference of two symbols in the .text
10977 section (switch tables use a difference of this sort). See
10978 include/coff/mips.h for details. This macro checks whether this
10979 fixup requires the special reloc. */
10980#define SWITCH_TABLE(fixp) \
10981 ((fixp)->fx_r_type == BFD_RELOC_32 \
bb2d6cd7 10982 && OUTPUT_FLAVOR != bfd_target_elf_flavour \
252b5132
RH
10983 && (fixp)->fx_addsy != NULL \
10984 && (fixp)->fx_subsy != NULL \
10985 && S_GET_SEGMENT ((fixp)->fx_addsy) == text_section \
10986 && S_GET_SEGMENT ((fixp)->fx_subsy) == text_section)
10987
10988/* When generating embedded PIC code we must keep all PC relative
10989 relocations, in case the linker has to relax a call. We also need
f6688943
TS
10990 to keep relocations for switch table entries.
10991
10992 We may have combined relocations without symbols in the N32/N64 ABI.
10993 We have to prevent gas from dropping them. */
252b5132 10994
252b5132
RH
10995int
10996mips_force_relocation (fixp)
10997 fixS *fixp;
10998{
ae6063d4 10999 if (generic_force_reloc (fixp))
252b5132
RH
11000 return 1;
11001
f6688943
TS
11002 if (HAVE_NEWABI
11003 && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
11004 && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
11005 || fixp->fx_r_type == BFD_RELOC_HI16_S
11006 || fixp->fx_r_type == BFD_RELOC_LO16))
11007 return 1;
11008
252b5132
RH
11009 return (mips_pic == EMBEDDED_PIC
11010 && (fixp->fx_pcrel
11011 || SWITCH_TABLE (fixp)
11012 || fixp->fx_r_type == BFD_RELOC_PCREL_HI16_S
11013 || fixp->fx_r_type == BFD_RELOC_PCREL_LO16));
11014}
11015
add55e1f
RS
11016#ifdef OBJ_ELF
11017static int
11018mips_need_elf_addend_fixup (fixP)
11019 fixS *fixP;
11020{
2d2bf3e0
CD
11021 if (S_GET_OTHER (fixP->fx_addsy) == STO_MIPS16)
11022 return 1;
b25a253c
CD
11023 if (mips_pic == EMBEDDED_PIC
11024 && S_IS_WEAK (fixP->fx_addsy))
11025 return 1;
11026 if (mips_pic != EMBEDDED_PIC
11027 && (S_IS_WEAK (fixP->fx_addsy)
bad9ca53 11028 || S_IS_EXTERNAL (fixP->fx_addsy))
2d2bf3e0
CD
11029 && !S_IS_COMMON (fixP->fx_addsy))
11030 return 1;
11031 if (symbol_used_in_reloc_p (fixP->fx_addsy)
11032 && (((bfd_get_section_flags (stdoutput,
11033 S_GET_SEGMENT (fixP->fx_addsy))
631cb423 11034 & (SEC_LINK_ONCE | SEC_MERGE)) != 0)
2d2bf3e0
CD
11035 || !strncmp (segment_name (S_GET_SEGMENT (fixP->fx_addsy)),
11036 ".gnu.linkonce",
11037 sizeof (".gnu.linkonce") - 1)))
11038 return 1;
11039 return 0;
add55e1f
RS
11040}
11041#endif
11042
252b5132
RH
11043/* Apply a fixup to the object file. */
11044
94f592af
NC
11045void
11046md_apply_fix3 (fixP, valP, seg)
252b5132 11047 fixS *fixP;
98d3f06f 11048 valueT *valP;
94f592af 11049 segT seg ATTRIBUTE_UNUSED;
252b5132 11050{
874e8986 11051 bfd_byte *buf;
98aa84af
AM
11052 long insn;
11053 valueT value;
ed6fb7bd 11054 static int previous_fx_r_type = 0;
252b5132 11055
65551fa4
CD
11056 /* FIXME: Maybe just return for all reloc types not listed below?
11057 Eric Christopher says: "This is stupid, please rewrite md_apply_fix3. */
11058 if (fixP->fx_r_type == BFD_RELOC_8)
11059 return;
11060
252b5132
RH
11061 assert (fixP->fx_size == 4
11062 || fixP->fx_r_type == BFD_RELOC_16
f6688943
TS
11063 || fixP->fx_r_type == BFD_RELOC_32
11064 || fixP->fx_r_type == BFD_RELOC_MIPS_JMP
11065 || fixP->fx_r_type == BFD_RELOC_HI16_S
11066 || fixP->fx_r_type == BFD_RELOC_LO16
11067 || fixP->fx_r_type == BFD_RELOC_GPREL16
76b3015f 11068 || fixP->fx_r_type == BFD_RELOC_MIPS_LITERAL
f6688943 11069 || fixP->fx_r_type == BFD_RELOC_GPREL32
252b5132 11070 || fixP->fx_r_type == BFD_RELOC_64
f6688943
TS
11071 || fixP->fx_r_type == BFD_RELOC_CTOR
11072 || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
11073 || fixP->fx_r_type == BFD_RELOC_MIPS_HIGHEST
11074 || fixP->fx_r_type == BFD_RELOC_MIPS_HIGHER
11075 || fixP->fx_r_type == BFD_RELOC_MIPS_SCN_DISP
11076 || fixP->fx_r_type == BFD_RELOC_MIPS_REL16
11077 || fixP->fx_r_type == BFD_RELOC_MIPS_RELGOT
252b5132 11078 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
438c16b8
TS
11079 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
11080 || fixP->fx_r_type == BFD_RELOC_MIPS_JALR);
252b5132 11081
98d3f06f 11082 value = *valP;
252b5132
RH
11083
11084 /* If we aren't adjusting this fixup to be against the section
11085 symbol, we need to adjust the value. */
11086#ifdef OBJ_ELF
11087 if (fixP->fx_addsy != NULL && OUTPUT_FLAVOR == bfd_target_elf_flavour)
bb2d6cd7 11088 {
add55e1f 11089 if (mips_need_elf_addend_fixup (fixP))
98aa84af 11090 {
d6e9d61a 11091 reloc_howto_type *howto;
98aa84af 11092 valueT symval = S_GET_VALUE (fixP->fx_addsy);
94f592af 11093
98aa84af 11094 value -= symval;
d6e9d61a
MR
11095
11096 howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
af6ae2ad 11097 if (value != 0 && howto && howto->partial_inplace
7a49a8c2 11098 && (! fixP->fx_pcrel || howto->pcrel_offset))
98aa84af
AM
11099 {
11100 /* In this case, the bfd_install_relocation routine will
11101 incorrectly add the symbol value back in. We just want
7a49a8c2 11102 the addend to appear in the object file.
b34976b6 11103
7a49a8c2
L
11104 howto->pcrel_offset is added for R_MIPS_PC16, which is
11105 generated for code like
b34976b6 11106
7a49a8c2
L
11107 globl g1 .text
11108 .text
11109 .space 20
11110 g1:
11111 x:
11112 bal g1
11113 */
98aa84af 11114 value -= symval;
7461da6e
RS
11115
11116 /* Make sure the addend is still non-zero. If it became zero
11117 after the last operation, set it to a spurious value and
11118 subtract the same value from the object file's contents. */
11119 if (value == 0)
11120 {
11121 value = 8;
11122
11123 /* The in-place addends for LO16 relocations are signed;
11124 leave the matching HI16 in-place addends as zero. */
11125 if (fixP->fx_r_type != BFD_RELOC_HI16_S)
11126 {
7461da6e
RS
11127 bfd_vma contents, mask, field;
11128
7461da6e
RS
11129 contents = bfd_get_bits (fixP->fx_frag->fr_literal
11130 + fixP->fx_where,
11131 fixP->fx_size * 8,
11132 target_big_endian);
11133
11134 /* MASK has bits set where the relocation should go.
11135 FIELD is -value, shifted into the appropriate place
11136 for this relocation. */
11137 mask = 1 << (howto->bitsize - 1);
11138 mask = (((mask - 1) << 1) | 1) << howto->bitpos;
11139 field = (-value >> howto->rightshift) << howto->bitpos;
11140
11141 bfd_put_bits ((field & mask) | (contents & ~mask),
11142 fixP->fx_frag->fr_literal + fixP->fx_where,
11143 fixP->fx_size * 8,
11144 target_big_endian);
11145 }
11146 }
98aa84af
AM
11147 }
11148 }
252b5132 11149
bb2d6cd7
GK
11150 /* This code was generated using trial and error and so is
11151 fragile and not trustworthy. If you change it, you should
11152 rerun the elf-rel, elf-rel2, and empic testcases and ensure
11153 they still pass. */
11154 if (fixP->fx_pcrel || fixP->fx_subsy != NULL)
11155 {
11156 value += fixP->fx_frag->fr_address + fixP->fx_where;
11157
11158 /* BFD's REL handling, for MIPS, is _very_ weird.
11159 This gives the right results, but it can't possibly
11160 be the way things are supposed to work. */
af6ae2ad 11161 if (fixP->fx_r_type != BFD_RELOC_16_PCREL_S2
bb2d6cd7
GK
11162 || S_GET_SEGMENT (fixP->fx_addsy) != undefined_section)
11163 value += fixP->fx_frag->fr_address + fixP->fx_where;
11164 }
11165 }
11166#endif
252b5132 11167
94f592af 11168 fixP->fx_addnumber = value; /* Remember value for tc_gen_reloc. */
252b5132 11169
ed6fb7bd
SC
11170 /* We are not done if this is a composite relocation to set up gp. */
11171 if (fixP->fx_addsy == NULL && ! fixP->fx_pcrel
11172 && !(fixP->fx_r_type == BFD_RELOC_MIPS_SUB
10181a0d
AO
11173 || (fixP->fx_r_type == BFD_RELOC_64
11174 && (previous_fx_r_type == BFD_RELOC_GPREL32
11175 || previous_fx_r_type == BFD_RELOC_GPREL16))
ed6fb7bd
SC
11176 || (previous_fx_r_type == BFD_RELOC_MIPS_SUB
11177 && (fixP->fx_r_type == BFD_RELOC_HI16_S
11178 || fixP->fx_r_type == BFD_RELOC_LO16))))
252b5132 11179 fixP->fx_done = 1;
ed6fb7bd 11180 previous_fx_r_type = fixP->fx_r_type;
252b5132
RH
11181
11182 switch (fixP->fx_r_type)
11183 {
11184 case BFD_RELOC_MIPS_JMP:
e369bcce
TS
11185 case BFD_RELOC_MIPS_SHIFT5:
11186 case BFD_RELOC_MIPS_SHIFT6:
11187 case BFD_RELOC_MIPS_GOT_DISP:
11188 case BFD_RELOC_MIPS_GOT_PAGE:
11189 case BFD_RELOC_MIPS_GOT_OFST:
11190 case BFD_RELOC_MIPS_SUB:
11191 case BFD_RELOC_MIPS_INSERT_A:
11192 case BFD_RELOC_MIPS_INSERT_B:
11193 case BFD_RELOC_MIPS_DELETE:
11194 case BFD_RELOC_MIPS_HIGHEST:
11195 case BFD_RELOC_MIPS_HIGHER:
11196 case BFD_RELOC_MIPS_SCN_DISP:
11197 case BFD_RELOC_MIPS_REL16:
11198 case BFD_RELOC_MIPS_RELGOT:
11199 case BFD_RELOC_MIPS_JALR:
252b5132
RH
11200 case BFD_RELOC_HI16:
11201 case BFD_RELOC_HI16_S:
cdf6fd85 11202 case BFD_RELOC_GPREL16:
252b5132
RH
11203 case BFD_RELOC_MIPS_LITERAL:
11204 case BFD_RELOC_MIPS_CALL16:
11205 case BFD_RELOC_MIPS_GOT16:
cdf6fd85 11206 case BFD_RELOC_GPREL32:
252b5132
RH
11207 case BFD_RELOC_MIPS_GOT_HI16:
11208 case BFD_RELOC_MIPS_GOT_LO16:
11209 case BFD_RELOC_MIPS_CALL_HI16:
11210 case BFD_RELOC_MIPS_CALL_LO16:
11211 case BFD_RELOC_MIPS16_GPREL:
11212 if (fixP->fx_pcrel)
11213 as_bad_where (fixP->fx_file, fixP->fx_line,
11214 _("Invalid PC relative reloc"));
11215 /* Nothing needed to do. The value comes from the reloc entry */
11216 break;
11217
11218 case BFD_RELOC_MIPS16_JMP:
11219 /* We currently always generate a reloc against a symbol, which
11220 means that we don't want an addend even if the symbol is
11221 defined. */
11222 fixP->fx_addnumber = 0;
11223 break;
11224
11225 case BFD_RELOC_PCREL_HI16_S:
11226 /* The addend for this is tricky if it is internal, so we just
11227 do everything here rather than in bfd_install_relocation. */
bdaaa2e1 11228 if (OUTPUT_FLAVOR == bfd_target_elf_flavour
bb2d6cd7
GK
11229 && !fixP->fx_done
11230 && value != 0)
11231 break;
11232 if (fixP->fx_addsy
11233 && (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_SECTION_SYM) == 0)
252b5132
RH
11234 {
11235 /* For an external symbol adjust by the address to make it
11236 pcrel_offset. We use the address of the RELLO reloc
11237 which follows this one. */
11238 value += (fixP->fx_next->fx_frag->fr_address
11239 + fixP->fx_next->fx_where);
11240 }
e7d556df 11241 value = ((value + 0x8000) >> 16) & 0xffff;
874e8986 11242 buf = (bfd_byte *) fixP->fx_frag->fr_literal + fixP->fx_where;
252b5132
RH
11243 if (target_big_endian)
11244 buf += 2;
874e8986 11245 md_number_to_chars ((char *) buf, value, 2);
252b5132
RH
11246 break;
11247
11248 case BFD_RELOC_PCREL_LO16:
11249 /* The addend for this is tricky if it is internal, so we just
11250 do everything here rather than in bfd_install_relocation. */
bdaaa2e1 11251 if (OUTPUT_FLAVOR == bfd_target_elf_flavour
bb2d6cd7
GK
11252 && !fixP->fx_done
11253 && value != 0)
11254 break;
11255 if (fixP->fx_addsy
11256 && (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_SECTION_SYM) == 0)
252b5132 11257 value += fixP->fx_frag->fr_address + fixP->fx_where;
874e8986 11258 buf = (bfd_byte *) fixP->fx_frag->fr_literal + fixP->fx_where;
252b5132
RH
11259 if (target_big_endian)
11260 buf += 2;
874e8986 11261 md_number_to_chars ((char *) buf, value, 2);
252b5132
RH
11262 break;
11263
11264 case BFD_RELOC_64:
11265 /* This is handled like BFD_RELOC_32, but we output a sign
11266 extended value if we are only 32 bits. */
11267 if (fixP->fx_done
11268 || (mips_pic == EMBEDDED_PIC && SWITCH_TABLE (fixP)))
11269 {
11270 if (8 <= sizeof (valueT))
11271 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
11272 value, 8);
11273 else
11274 {
11275 long w1, w2;
11276 long hiv;
11277
11278 w1 = w2 = fixP->fx_where;
11279 if (target_big_endian)
11280 w1 += 4;
11281 else
11282 w2 += 4;
11283 md_number_to_chars (fixP->fx_frag->fr_literal + w1, value, 4);
11284 if ((value & 0x80000000) != 0)
11285 hiv = 0xffffffff;
11286 else
11287 hiv = 0;
11288 md_number_to_chars (fixP->fx_frag->fr_literal + w2, hiv, 4);
11289 }
11290 }
11291 break;
11292
056350c6 11293 case BFD_RELOC_RVA:
252b5132
RH
11294 case BFD_RELOC_32:
11295 /* If we are deleting this reloc entry, we must fill in the
11296 value now. This can happen if we have a .word which is not
11297 resolved when it appears but is later defined. We also need
11298 to fill in the value if this is an embedded PIC switch table
11299 entry. */
11300 if (fixP->fx_done
11301 || (mips_pic == EMBEDDED_PIC && SWITCH_TABLE (fixP)))
11302 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
11303 value, 4);
11304 break;
11305
11306 case BFD_RELOC_16:
11307 /* If we are deleting this reloc entry, we must fill in the
11308 value now. */
11309 assert (fixP->fx_size == 2);
11310 if (fixP->fx_done)
11311 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
11312 value, 2);
11313 break;
11314
11315 case BFD_RELOC_LO16:
11316 /* When handling an embedded PIC switch statement, we can wind
11317 up deleting a LO16 reloc. See the 'o' case in mips_ip. */
11318 if (fixP->fx_done)
11319 {
98aa84af 11320 if (value + 0x8000 > 0xffff)
252b5132
RH
11321 as_bad_where (fixP->fx_file, fixP->fx_line,
11322 _("relocation overflow"));
874e8986 11323 buf = (bfd_byte *) fixP->fx_frag->fr_literal + fixP->fx_where;
252b5132
RH
11324 if (target_big_endian)
11325 buf += 2;
874e8986 11326 md_number_to_chars ((char *) buf, value, 2);
252b5132
RH
11327 }
11328 break;
11329
11330 case BFD_RELOC_16_PCREL_S2:
cb56d3d3
TS
11331 if ((value & 0x3) != 0)
11332 as_bad_where (fixP->fx_file, fixP->fx_line,
11333 _("Branch to odd address (%lx)"), (long) value);
11334
252b5132
RH
11335 /*
11336 * We need to save the bits in the instruction since fixup_segment()
11337 * might be deleting the relocation entry (i.e., a branch within
11338 * the current segment).
11339 */
af6ae2ad 11340 if (!fixP->fx_done && (value != 0 || HAVE_NEWABI))
bb2d6cd7
GK
11341 break;
11342 /* If 'value' is zero, the remaining reloc code won't actually
11343 do the store, so it must be done here. This is probably
11344 a bug somewhere. */
b25a253c
CD
11345 if (!fixP->fx_done
11346 && (fixP->fx_r_type != BFD_RELOC_16_PCREL_S2
11347 || fixP->fx_addsy == NULL /* ??? */
11348 || ! S_IS_DEFINED (fixP->fx_addsy)))
bb2d6cd7 11349 value -= fixP->fx_frag->fr_address + fixP->fx_where;
bdaaa2e1 11350
98aa84af 11351 value = (offsetT) value >> 2;
252b5132
RH
11352
11353 /* update old instruction data */
874e8986 11354 buf = (bfd_byte *) (fixP->fx_where + fixP->fx_frag->fr_literal);
252b5132
RH
11355 if (target_big_endian)
11356 insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
11357 else
11358 insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
11359
98aa84af 11360 if (value + 0x8000 <= 0xffff)
252b5132
RH
11361 insn |= value & 0xffff;
11362 else
11363 {
11364 /* The branch offset is too large. If this is an
11365 unconditional branch, and we are not generating PIC code,
11366 we can convert it to an absolute jump instruction. */
11367 if (mips_pic == NO_PIC
11368 && fixP->fx_done
11369 && fixP->fx_frag->fr_address >= text_section->vma
11370 && (fixP->fx_frag->fr_address
11371 < text_section->vma + text_section->_raw_size)
11372 && ((insn & 0xffff0000) == 0x10000000 /* beq $0,$0 */
11373 || (insn & 0xffff0000) == 0x04010000 /* bgez $0 */
11374 || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
11375 {
11376 if ((insn & 0xffff0000) == 0x04110000) /* bgezal $0 */
11377 insn = 0x0c000000; /* jal */
11378 else
11379 insn = 0x08000000; /* j */
11380 fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
11381 fixP->fx_done = 0;
11382 fixP->fx_addsy = section_symbol (text_section);
11383 fixP->fx_addnumber = (value << 2) + md_pcrel_from (fixP);
11384 }
11385 else
11386 {
4a6a3df4
AO
11387 /* If we got here, we have branch-relaxation disabled,
11388 and there's nothing we can do to fix this instruction
11389 without turning it into a longer sequence. */
252b5132
RH
11390 as_bad_where (fixP->fx_file, fixP->fx_line,
11391 _("Branch out of range"));
11392 }
11393 }
11394
11395 md_number_to_chars ((char *) buf, (valueT) insn, 4);
11396 break;
11397
11398 case BFD_RELOC_VTABLE_INHERIT:
11399 fixP->fx_done = 0;
11400 if (fixP->fx_addsy
11401 && !S_IS_DEFINED (fixP->fx_addsy)
11402 && !S_IS_WEAK (fixP->fx_addsy))
11403 S_SET_WEAK (fixP->fx_addsy);
11404 break;
11405
11406 case BFD_RELOC_VTABLE_ENTRY:
11407 fixP->fx_done = 0;
11408 break;
11409
11410 default:
11411 internalError ();
11412 }
252b5132
RH
11413}
11414
11415#if 0
11416void
11417printInsn (oc)
11418 unsigned long oc;
11419{
11420 const struct mips_opcode *p;
11421 int treg, sreg, dreg, shamt;
11422 short imm;
11423 const char *args;
11424 int i;
11425
11426 for (i = 0; i < NUMOPCODES; ++i)
11427 {
11428 p = &mips_opcodes[i];
11429 if (((oc & p->mask) == p->match) && (p->pinfo != INSN_MACRO))
11430 {
11431 printf ("%08lx %s\t", oc, p->name);
11432 treg = (oc >> 16) & 0x1f;
11433 sreg = (oc >> 21) & 0x1f;
11434 dreg = (oc >> 11) & 0x1f;
11435 shamt = (oc >> 6) & 0x1f;
11436 imm = oc;
11437 for (args = p->args;; ++args)
11438 {
11439 switch (*args)
11440 {
11441 case '\0':
11442 printf ("\n");
11443 break;
11444
11445 case ',':
11446 case '(':
11447 case ')':
11448 printf ("%c", *args);
11449 continue;
11450
11451 case 'r':
11452 assert (treg == sreg);
11453 printf ("$%d,$%d", treg, sreg);
11454 continue;
11455
11456 case 'd':
11457 case 'G':
11458 printf ("$%d", dreg);
11459 continue;
11460
11461 case 't':
11462 case 'E':
11463 printf ("$%d", treg);
11464 continue;
11465
11466 case 'k':
11467 printf ("0x%x", treg);
11468 continue;
11469
11470 case 'b':
11471 case 's':
11472 printf ("$%d", sreg);
11473 continue;
11474
11475 case 'a':
11476 printf ("0x%08lx", oc & 0x1ffffff);
11477 continue;
11478
11479 case 'i':
11480 case 'j':
11481 case 'o':
11482 case 'u':
11483 printf ("%d", imm);
11484 continue;
11485
11486 case '<':
11487 case '>':
11488 printf ("$%d", shamt);
11489 continue;
11490
11491 default:
11492 internalError ();
11493 }
11494 break;
11495 }
11496 return;
11497 }
11498 }
11499 printf (_("%08lx UNDEFINED\n"), oc);
11500}
11501#endif
11502
11503static symbolS *
11504get_symbol ()
11505{
11506 int c;
11507 char *name;
11508 symbolS *p;
11509
11510 name = input_line_pointer;
11511 c = get_symbol_end ();
11512 p = (symbolS *) symbol_find_or_make (name);
11513 *input_line_pointer = c;
11514 return p;
11515}
11516
11517/* Align the current frag to a given power of two. The MIPS assembler
11518 also automatically adjusts any preceding label. */
11519
11520static void
11521mips_align (to, fill, label)
11522 int to;
11523 int fill;
11524 symbolS *label;
11525{
b34976b6 11526 mips_emit_delays (FALSE);
252b5132
RH
11527 frag_align (to, fill, 0);
11528 record_alignment (now_seg, to);
11529 if (label != NULL)
11530 {
11531 assert (S_GET_SEGMENT (label) == now_seg);
49309057 11532 symbol_set_frag (label, frag_now);
252b5132
RH
11533 S_SET_VALUE (label, (valueT) frag_now_fix ());
11534 }
11535}
11536
11537/* Align to a given power of two. .align 0 turns off the automatic
11538 alignment used by the data creating pseudo-ops. */
11539
11540static void
11541s_align (x)
43841e91 11542 int x ATTRIBUTE_UNUSED;
252b5132
RH
11543{
11544 register int temp;
11545 register long temp_fill;
11546 long max_alignment = 15;
11547
11548 /*
11549
11550 o Note that the assembler pulls down any immediately preceeding label
11551 to the aligned address.
11552 o It's not documented but auto alignment is reinstated by
11553 a .align pseudo instruction.
11554 o Note also that after auto alignment is turned off the mips assembler
11555 issues an error on attempt to assemble an improperly aligned data item.
11556 We don't.
11557
11558 */
11559
11560 temp = get_absolute_expression ();
11561 if (temp > max_alignment)
11562 as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
11563 else if (temp < 0)
11564 {
11565 as_warn (_("Alignment negative: 0 assumed."));
11566 temp = 0;
11567 }
11568 if (*input_line_pointer == ',')
11569 {
f9419b05 11570 ++input_line_pointer;
252b5132
RH
11571 temp_fill = get_absolute_expression ();
11572 }
11573 else
11574 temp_fill = 0;
11575 if (temp)
11576 {
11577 auto_align = 1;
11578 mips_align (temp, (int) temp_fill,
11579 insn_labels != NULL ? insn_labels->label : NULL);
11580 }
11581 else
11582 {
11583 auto_align = 0;
11584 }
11585
11586 demand_empty_rest_of_line ();
11587}
11588
11589void
11590mips_flush_pending_output ()
11591{
b34976b6 11592 mips_emit_delays (FALSE);
252b5132
RH
11593 mips_clear_insn_labels ();
11594}
11595
11596static void
11597s_change_sec (sec)
11598 int sec;
11599{
11600 segT seg;
11601
11602 /* When generating embedded PIC code, we only use the .text, .lit8,
11603 .sdata and .sbss sections. We change the .data and .rdata
11604 pseudo-ops to use .sdata. */
11605 if (mips_pic == EMBEDDED_PIC
11606 && (sec == 'd' || sec == 'r'))
11607 sec = 's';
11608
11609#ifdef OBJ_ELF
11610 /* The ELF backend needs to know that we are changing sections, so
11611 that .previous works correctly. We could do something like check
b6ff326e 11612 for an obj_section_change_hook macro, but that might be confusing
252b5132
RH
11613 as it would not be appropriate to use it in the section changing
11614 functions in read.c, since obj-elf.c intercepts those. FIXME:
11615 This should be cleaner, somehow. */
11616 obj_elf_section_change_hook ();
11617#endif
11618
b34976b6 11619 mips_emit_delays (FALSE);
252b5132
RH
11620 switch (sec)
11621 {
11622 case 't':
11623 s_text (0);
11624 break;
11625 case 'd':
11626 s_data (0);
11627 break;
11628 case 'b':
11629 subseg_set (bss_section, (subsegT) get_absolute_expression ());
11630 demand_empty_rest_of_line ();
11631 break;
11632
11633 case 'r':
11634 if (USE_GLOBAL_POINTER_OPT)
11635 {
11636 seg = subseg_new (RDATA_SECTION_NAME,
11637 (subsegT) get_absolute_expression ());
11638 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
11639 {
11640 bfd_set_section_flags (stdoutput, seg,
11641 (SEC_ALLOC
11642 | SEC_LOAD
11643 | SEC_READONLY
11644 | SEC_RELOC
11645 | SEC_DATA));
11646 if (strcmp (TARGET_OS, "elf") != 0)
e799a695 11647 record_alignment (seg, 4);
252b5132
RH
11648 }
11649 demand_empty_rest_of_line ();
11650 }
11651 else
11652 {
11653 as_bad (_("No read only data section in this object file format"));
11654 demand_empty_rest_of_line ();
11655 return;
11656 }
11657 break;
11658
11659 case 's':
11660 if (USE_GLOBAL_POINTER_OPT)
11661 {
11662 seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
11663 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
11664 {
11665 bfd_set_section_flags (stdoutput, seg,
11666 SEC_ALLOC | SEC_LOAD | SEC_RELOC
11667 | SEC_DATA);
11668 if (strcmp (TARGET_OS, "elf") != 0)
e799a695 11669 record_alignment (seg, 4);
252b5132
RH
11670 }
11671 demand_empty_rest_of_line ();
11672 break;
11673 }
11674 else
11675 {
11676 as_bad (_("Global pointers not supported; recompile -G 0"));
11677 demand_empty_rest_of_line ();
11678 return;
11679 }
11680 }
11681
11682 auto_align = 1;
11683}
b34976b6 11684
cca86cc8
SC
11685void
11686s_change_section (ignore)
11687 int ignore ATTRIBUTE_UNUSED;
11688{
7ed4a06a 11689#ifdef OBJ_ELF
cca86cc8
SC
11690 char *section_name;
11691 char c;
4cf0dd0d 11692 char next_c;
cca86cc8
SC
11693 int section_type;
11694 int section_flag;
11695 int section_entry_size;
11696 int section_alignment;
b34976b6 11697
7ed4a06a
TS
11698 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11699 return;
11700
cca86cc8
SC
11701 section_name = input_line_pointer;
11702 c = get_symbol_end ();
a816d1ed
AO
11703 if (c)
11704 next_c = *(input_line_pointer + 1);
cca86cc8 11705
4cf0dd0d
TS
11706 /* Do we have .section Name<,"flags">? */
11707 if (c != ',' || (c == ',' && next_c == '"'))
cca86cc8 11708 {
4cf0dd0d
TS
11709 /* just after name is now '\0'. */
11710 *input_line_pointer = c;
cca86cc8
SC
11711 input_line_pointer = section_name;
11712 obj_elf_section (ignore);
11713 return;
11714 }
11715 input_line_pointer++;
11716
11717 /* Do we have .section Name<,type><,flag><,entry_size><,alignment> */
11718 if (c == ',')
11719 section_type = get_absolute_expression ();
11720 else
11721 section_type = 0;
11722 if (*input_line_pointer++ == ',')
11723 section_flag = get_absolute_expression ();
11724 else
11725 section_flag = 0;
11726 if (*input_line_pointer++ == ',')
11727 section_entry_size = get_absolute_expression ();
11728 else
11729 section_entry_size = 0;
11730 if (*input_line_pointer++ == ',')
11731 section_alignment = get_absolute_expression ();
11732 else
11733 section_alignment = 0;
11734
a816d1ed
AO
11735 section_name = xstrdup (section_name);
11736
cca86cc8
SC
11737 obj_elf_change_section (section_name, section_type, section_flag,
11738 section_entry_size, 0, 0, 0);
a816d1ed
AO
11739
11740 if (now_seg->name != section_name)
11741 free (section_name);
7ed4a06a 11742#endif /* OBJ_ELF */
cca86cc8 11743}
252b5132
RH
11744
11745void
11746mips_enable_auto_align ()
11747{
11748 auto_align = 1;
11749}
11750
11751static void
11752s_cons (log_size)
11753 int log_size;
11754{
11755 symbolS *label;
11756
11757 label = insn_labels != NULL ? insn_labels->label : NULL;
b34976b6 11758 mips_emit_delays (FALSE);
252b5132
RH
11759 if (log_size > 0 && auto_align)
11760 mips_align (log_size, 0, label);
11761 mips_clear_insn_labels ();
11762 cons (1 << log_size);
11763}
11764
11765static void
11766s_float_cons (type)
11767 int type;
11768{
11769 symbolS *label;
11770
11771 label = insn_labels != NULL ? insn_labels->label : NULL;
11772
b34976b6 11773 mips_emit_delays (FALSE);
252b5132
RH
11774
11775 if (auto_align)
49309057
ILT
11776 {
11777 if (type == 'd')
11778 mips_align (3, 0, label);
11779 else
11780 mips_align (2, 0, label);
11781 }
252b5132
RH
11782
11783 mips_clear_insn_labels ();
11784
11785 float_cons (type);
11786}
11787
11788/* Handle .globl. We need to override it because on Irix 5 you are
11789 permitted to say
11790 .globl foo .text
11791 where foo is an undefined symbol, to mean that foo should be
11792 considered to be the address of a function. */
11793
11794static void
11795s_mips_globl (x)
43841e91 11796 int x ATTRIBUTE_UNUSED;
252b5132
RH
11797{
11798 char *name;
11799 int c;
11800 symbolS *symbolP;
11801 flagword flag;
11802
11803 name = input_line_pointer;
11804 c = get_symbol_end ();
11805 symbolP = symbol_find_or_make (name);
11806 *input_line_pointer = c;
11807 SKIP_WHITESPACE ();
11808
11809 /* On Irix 5, every global symbol that is not explicitly labelled as
11810 being a function is apparently labelled as being an object. */
11811 flag = BSF_OBJECT;
11812
11813 if (! is_end_of_line[(unsigned char) *input_line_pointer])
11814 {
11815 char *secname;
11816 asection *sec;
11817
11818 secname = input_line_pointer;
11819 c = get_symbol_end ();
11820 sec = bfd_get_section_by_name (stdoutput, secname);
11821 if (sec == NULL)
11822 as_bad (_("%s: no such section"), secname);
11823 *input_line_pointer = c;
11824
11825 if (sec != NULL && (sec->flags & SEC_CODE) != 0)
11826 flag = BSF_FUNCTION;
11827 }
11828
49309057 11829 symbol_get_bfdsym (symbolP)->flags |= flag;
252b5132
RH
11830
11831 S_SET_EXTERNAL (symbolP);
11832 demand_empty_rest_of_line ();
11833}
11834
11835static void
11836s_option (x)
43841e91 11837 int x ATTRIBUTE_UNUSED;
252b5132
RH
11838{
11839 char *opt;
11840 char c;
11841
11842 opt = input_line_pointer;
11843 c = get_symbol_end ();
11844
11845 if (*opt == 'O')
11846 {
11847 /* FIXME: What does this mean? */
11848 }
11849 else if (strncmp (opt, "pic", 3) == 0)
11850 {
11851 int i;
11852
11853 i = atoi (opt + 3);
11854 if (i == 0)
11855 mips_pic = NO_PIC;
11856 else if (i == 2)
11857 mips_pic = SVR4_PIC;
11858 else
11859 as_bad (_(".option pic%d not supported"), i);
11860
11861 if (USE_GLOBAL_POINTER_OPT && mips_pic == SVR4_PIC)
11862 {
11863 if (g_switch_seen && g_switch_value != 0)
11864 as_warn (_("-G may not be used with SVR4 PIC code"));
11865 g_switch_value = 0;
11866 bfd_set_gp_size (stdoutput, 0);
11867 }
11868 }
11869 else
11870 as_warn (_("Unrecognized option \"%s\""), opt);
11871
11872 *input_line_pointer = c;
11873 demand_empty_rest_of_line ();
11874}
11875
11876/* This structure is used to hold a stack of .set values. */
11877
e972090a
NC
11878struct mips_option_stack
11879{
252b5132
RH
11880 struct mips_option_stack *next;
11881 struct mips_set_options options;
11882};
11883
11884static struct mips_option_stack *mips_opts_stack;
11885
11886/* Handle the .set pseudo-op. */
11887
11888static void
11889s_mipsset (x)
43841e91 11890 int x ATTRIBUTE_UNUSED;
252b5132
RH
11891{
11892 char *name = input_line_pointer, ch;
11893
11894 while (!is_end_of_line[(unsigned char) *input_line_pointer])
f9419b05 11895 ++input_line_pointer;
252b5132
RH
11896 ch = *input_line_pointer;
11897 *input_line_pointer = '\0';
11898
11899 if (strcmp (name, "reorder") == 0)
11900 {
11901 if (mips_opts.noreorder && prev_nop_frag != NULL)
11902 {
11903 /* If we still have pending nops, we can discard them. The
11904 usual nop handling will insert any that are still
bdaaa2e1 11905 needed. */
252b5132
RH
11906 prev_nop_frag->fr_fix -= (prev_nop_frag_holds
11907 * (mips_opts.mips16 ? 2 : 4));
11908 prev_nop_frag = NULL;
11909 }
11910 mips_opts.noreorder = 0;
11911 }
11912 else if (strcmp (name, "noreorder") == 0)
11913 {
b34976b6 11914 mips_emit_delays (TRUE);
252b5132
RH
11915 mips_opts.noreorder = 1;
11916 mips_any_noreorder = 1;
11917 }
11918 else if (strcmp (name, "at") == 0)
11919 {
11920 mips_opts.noat = 0;
11921 }
11922 else if (strcmp (name, "noat") == 0)
11923 {
11924 mips_opts.noat = 1;
11925 }
11926 else if (strcmp (name, "macro") == 0)
11927 {
11928 mips_opts.warn_about_macros = 0;
11929 }
11930 else if (strcmp (name, "nomacro") == 0)
11931 {
11932 if (mips_opts.noreorder == 0)
11933 as_bad (_("`noreorder' must be set before `nomacro'"));
11934 mips_opts.warn_about_macros = 1;
11935 }
11936 else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
11937 {
11938 mips_opts.nomove = 0;
11939 }
11940 else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
11941 {
11942 mips_opts.nomove = 1;
11943 }
11944 else if (strcmp (name, "bopt") == 0)
11945 {
11946 mips_opts.nobopt = 0;
11947 }
11948 else if (strcmp (name, "nobopt") == 0)
11949 {
11950 mips_opts.nobopt = 1;
11951 }
11952 else if (strcmp (name, "mips16") == 0
11953 || strcmp (name, "MIPS-16") == 0)
11954 mips_opts.mips16 = 1;
11955 else if (strcmp (name, "nomips16") == 0
11956 || strcmp (name, "noMIPS-16") == 0)
11957 mips_opts.mips16 = 0;
1f25f5d3
CD
11958 else if (strcmp (name, "mips3d") == 0)
11959 mips_opts.ase_mips3d = 1;
11960 else if (strcmp (name, "nomips3d") == 0)
11961 mips_opts.ase_mips3d = 0;
a4672219
TS
11962 else if (strcmp (name, "mdmx") == 0)
11963 mips_opts.ase_mdmx = 1;
11964 else if (strcmp (name, "nomdmx") == 0)
11965 mips_opts.ase_mdmx = 0;
252b5132
RH
11966 else if (strncmp (name, "mips", 4) == 0)
11967 {
af7ee8bf 11968 int reset = 0;
252b5132
RH
11969
11970 /* Permit the user to change the ISA on the fly. Needless to
11971 say, misuse can cause serious problems. */
af7ee8bf
CD
11972 if (strcmp (name, "mips0") == 0)
11973 {
11974 reset = 1;
11975 mips_opts.isa = file_mips_isa;
11976 }
11977 else if (strcmp (name, "mips1") == 0)
11978 mips_opts.isa = ISA_MIPS1;
11979 else if (strcmp (name, "mips2") == 0)
11980 mips_opts.isa = ISA_MIPS2;
11981 else if (strcmp (name, "mips3") == 0)
11982 mips_opts.isa = ISA_MIPS3;
11983 else if (strcmp (name, "mips4") == 0)
11984 mips_opts.isa = ISA_MIPS4;
11985 else if (strcmp (name, "mips5") == 0)
11986 mips_opts.isa = ISA_MIPS5;
11987 else if (strcmp (name, "mips32") == 0)
11988 mips_opts.isa = ISA_MIPS32;
11989 else if (strcmp (name, "mips32r2") == 0)
11990 mips_opts.isa = ISA_MIPS32R2;
11991 else if (strcmp (name, "mips64") == 0)
11992 mips_opts.isa = ISA_MIPS64;
11993 else
11994 as_bad (_("unknown ISA level %s"), name + 4);
11995
11996 switch (mips_opts.isa)
98d3f06f
KH
11997 {
11998 case 0:
98d3f06f 11999 break;
af7ee8bf
CD
12000 case ISA_MIPS1:
12001 case ISA_MIPS2:
12002 case ISA_MIPS32:
12003 case ISA_MIPS32R2:
98d3f06f
KH
12004 mips_opts.gp32 = 1;
12005 mips_opts.fp32 = 1;
12006 break;
af7ee8bf
CD
12007 case ISA_MIPS3:
12008 case ISA_MIPS4:
12009 case ISA_MIPS5:
12010 case ISA_MIPS64:
98d3f06f
KH
12011 mips_opts.gp32 = 0;
12012 mips_opts.fp32 = 0;
12013 break;
12014 default:
12015 as_bad (_("unknown ISA level %s"), name + 4);
12016 break;
12017 }
af7ee8bf 12018 if (reset)
98d3f06f 12019 {
af7ee8bf
CD
12020 mips_opts.gp32 = file_mips_gp32;
12021 mips_opts.fp32 = file_mips_fp32;
98d3f06f 12022 }
252b5132
RH
12023 }
12024 else if (strcmp (name, "autoextend") == 0)
12025 mips_opts.noautoextend = 0;
12026 else if (strcmp (name, "noautoextend") == 0)
12027 mips_opts.noautoextend = 1;
12028 else if (strcmp (name, "push") == 0)
12029 {
12030 struct mips_option_stack *s;
12031
12032 s = (struct mips_option_stack *) xmalloc (sizeof *s);
12033 s->next = mips_opts_stack;
12034 s->options = mips_opts;
12035 mips_opts_stack = s;
12036 }
12037 else if (strcmp (name, "pop") == 0)
12038 {
12039 struct mips_option_stack *s;
12040
12041 s = mips_opts_stack;
12042 if (s == NULL)
12043 as_bad (_(".set pop with no .set push"));
12044 else
12045 {
12046 /* If we're changing the reorder mode we need to handle
12047 delay slots correctly. */
12048 if (s->options.noreorder && ! mips_opts.noreorder)
b34976b6 12049 mips_emit_delays (TRUE);
252b5132
RH
12050 else if (! s->options.noreorder && mips_opts.noreorder)
12051 {
12052 if (prev_nop_frag != NULL)
12053 {
12054 prev_nop_frag->fr_fix -= (prev_nop_frag_holds
12055 * (mips_opts.mips16 ? 2 : 4));
12056 prev_nop_frag = NULL;
12057 }
12058 }
12059
12060 mips_opts = s->options;
12061 mips_opts_stack = s->next;
12062 free (s);
12063 }
12064 }
12065 else
12066 {
12067 as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
12068 }
12069 *input_line_pointer = ch;
12070 demand_empty_rest_of_line ();
12071}
12072
12073/* Handle the .abicalls pseudo-op. I believe this is equivalent to
12074 .option pic2. It means to generate SVR4 PIC calls. */
12075
12076static void
12077s_abicalls (ignore)
43841e91 12078 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
12079{
12080 mips_pic = SVR4_PIC;
12081 if (USE_GLOBAL_POINTER_OPT)
12082 {
12083 if (g_switch_seen && g_switch_value != 0)
12084 as_warn (_("-G may not be used with SVR4 PIC code"));
12085 g_switch_value = 0;
12086 }
12087 bfd_set_gp_size (stdoutput, 0);
12088 demand_empty_rest_of_line ();
12089}
12090
12091/* Handle the .cpload pseudo-op. This is used when generating SVR4
12092 PIC code. It sets the $gp register for the function based on the
12093 function address, which is in the register named in the argument.
12094 This uses a relocation against _gp_disp, which is handled specially
12095 by the linker. The result is:
12096 lui $gp,%hi(_gp_disp)
12097 addiu $gp,$gp,%lo(_gp_disp)
12098 addu $gp,$gp,.cpload argument
12099 The .cpload argument is normally $25 == $t9. */
12100
12101static void
12102s_cpload (ignore)
43841e91 12103 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
12104{
12105 expressionS ex;
12106 int icnt = 0;
12107
6478892d
TS
12108 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
12109 .cpload is ignored. */
12110 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
252b5132
RH
12111 {
12112 s_ignore (0);
12113 return;
12114 }
12115
d3ecfc59 12116 /* .cpload should be in a .set noreorder section. */
252b5132
RH
12117 if (mips_opts.noreorder == 0)
12118 as_warn (_(".cpload not in noreorder section"));
12119
12120 ex.X_op = O_symbol;
12121 ex.X_add_symbol = symbol_find_or_make ("_gp_disp");
12122 ex.X_op_symbol = NULL;
12123 ex.X_add_number = 0;
12124
12125 /* In ELF, this symbol is implicitly an STT_OBJECT symbol. */
49309057 12126 symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
252b5132 12127
c9914766
TS
12128 macro_build_lui (NULL, &icnt, &ex, mips_gp_register);
12129 macro_build ((char *) NULL, &icnt, &ex, "addiu", "t,r,j",
12130 mips_gp_register, mips_gp_register, (int) BFD_RELOC_LO16);
252b5132
RH
12131
12132 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "addu", "d,v,t",
c9914766 12133 mips_gp_register, mips_gp_register, tc_get_register (0));
252b5132
RH
12134
12135 demand_empty_rest_of_line ();
12136}
12137
6478892d
TS
12138/* Handle the .cpsetup pseudo-op defined for NewABI PIC code. The syntax is:
12139 .cpsetup $reg1, offset|$reg2, label
12140
12141 If offset is given, this results in:
12142 sd $gp, offset($sp)
956cd1d6 12143 lui $gp, %hi(%neg(%gp_rel(label)))
698b7d9d
TS
12144 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
12145 daddu $gp, $gp, $reg1
6478892d
TS
12146
12147 If $reg2 is given, this results in:
12148 daddu $reg2, $gp, $0
956cd1d6 12149 lui $gp, %hi(%neg(%gp_rel(label)))
698b7d9d
TS
12150 addiu $gp, $gp, %lo(%neg(%gp_rel(label)))
12151 daddu $gp, $gp, $reg1
12152 $reg1 is normally $25 == $t9. */
6478892d
TS
12153static void
12154s_cpsetup (ignore)
12155 int ignore ATTRIBUTE_UNUSED;
12156{
12157 expressionS ex_off;
12158 expressionS ex_sym;
12159 int reg1;
12160 int icnt = 0;
f21f8242 12161 char *f;
6478892d 12162
8586fc66 12163 /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
6478892d
TS
12164 We also need NewABI support. */
12165 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12166 {
12167 s_ignore (0);
12168 return;
12169 }
12170
12171 reg1 = tc_get_register (0);
12172 SKIP_WHITESPACE ();
12173 if (*input_line_pointer != ',')
12174 {
12175 as_bad (_("missing argument separator ',' for .cpsetup"));
12176 return;
12177 }
12178 else
80245285 12179 ++input_line_pointer;
6478892d
TS
12180 SKIP_WHITESPACE ();
12181 if (*input_line_pointer == '$')
80245285
TS
12182 {
12183 mips_cpreturn_register = tc_get_register (0);
12184 mips_cpreturn_offset = -1;
12185 }
6478892d 12186 else
80245285
TS
12187 {
12188 mips_cpreturn_offset = get_absolute_expression ();
12189 mips_cpreturn_register = -1;
12190 }
6478892d
TS
12191 SKIP_WHITESPACE ();
12192 if (*input_line_pointer != ',')
12193 {
12194 as_bad (_("missing argument separator ',' for .cpsetup"));
12195 return;
12196 }
12197 else
f9419b05 12198 ++input_line_pointer;
6478892d 12199 SKIP_WHITESPACE ();
f21f8242 12200 expression (&ex_sym);
6478892d
TS
12201
12202 if (mips_cpreturn_register == -1)
12203 {
12204 ex_off.X_op = O_constant;
12205 ex_off.X_add_symbol = NULL;
12206 ex_off.X_op_symbol = NULL;
12207 ex_off.X_add_number = mips_cpreturn_offset;
12208
12209 macro_build ((char *) NULL, &icnt, &ex_off, "sd", "t,o(b)",
12210 mips_gp_register, (int) BFD_RELOC_LO16, SP);
12211 }
12212 else
12213 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "daddu",
12214 "d,v,t", mips_cpreturn_register, mips_gp_register, 0);
12215
f21f8242
AO
12216 /* Ensure there's room for the next two instructions, so that `f'
12217 doesn't end up with an address in the wrong frag. */
12218 frag_grow (8);
12219 f = frag_more (0);
6478892d
TS
12220 macro_build ((char *) NULL, &icnt, &ex_sym, "lui", "t,u", mips_gp_register,
12221 (int) BFD_RELOC_GPREL16);
f21f8242
AO
12222 fix_new (frag_now, f - frag_now->fr_literal,
12223 0, NULL, 0, 0, BFD_RELOC_MIPS_SUB);
12224 fix_new (frag_now, f - frag_now->fr_literal,
12225 0, NULL, 0, 0, BFD_RELOC_HI16_S);
12226
12227 f = frag_more (0);
6478892d
TS
12228 macro_build ((char *) NULL, &icnt, &ex_sym, "addiu", "t,r,j",
12229 mips_gp_register, mips_gp_register, (int) BFD_RELOC_GPREL16);
f21f8242
AO
12230 fix_new (frag_now, f - frag_now->fr_literal,
12231 0, NULL, 0, 0, BFD_RELOC_MIPS_SUB);
12232 fix_new (frag_now, f - frag_now->fr_literal,
12233 0, NULL, 0, 0, BFD_RELOC_LO16);
12234
8586fc66
TS
12235 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
12236 HAVE_64BIT_ADDRESSES ? "daddu" : "addu", "d,v,t",
12237 mips_gp_register, mips_gp_register, reg1);
6478892d
TS
12238
12239 demand_empty_rest_of_line ();
12240}
12241
12242static void
12243s_cplocal (ignore)
12244 int ignore ATTRIBUTE_UNUSED;
12245{
12246 /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
12247 .cplocal is ignored. */
12248 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12249 {
12250 s_ignore (0);
12251 return;
12252 }
12253
12254 mips_gp_register = tc_get_register (0);
85b51719 12255 demand_empty_rest_of_line ();
6478892d
TS
12256}
12257
252b5132
RH
12258/* Handle the .cprestore pseudo-op. This stores $gp into a given
12259 offset from $sp. The offset is remembered, and after making a PIC
12260 call $gp is restored from that location. */
12261
12262static void
12263s_cprestore (ignore)
43841e91 12264 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
12265{
12266 expressionS ex;
12267 int icnt = 0;
12268
6478892d 12269 /* If we are not generating SVR4 PIC code, or if this is NewABI code,
c9914766 12270 .cprestore is ignored. */
6478892d 12271 if (mips_pic != SVR4_PIC || HAVE_NEWABI)
252b5132
RH
12272 {
12273 s_ignore (0);
12274 return;
12275 }
12276
12277 mips_cprestore_offset = get_absolute_expression ();
7a621144 12278 mips_cprestore_valid = 1;
252b5132
RH
12279
12280 ex.X_op = O_constant;
12281 ex.X_add_symbol = NULL;
12282 ex.X_op_symbol = NULL;
12283 ex.X_add_number = mips_cprestore_offset;
12284
885add95
CD
12285 macro_build_ldst_constoffset ((char *) NULL, &icnt, &ex,
12286 HAVE_32BIT_ADDRESSES ? "sw" : "sd",
12287 mips_gp_register, SP);
252b5132
RH
12288
12289 demand_empty_rest_of_line ();
12290}
12291
6478892d
TS
12292/* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
12293 was given in the preceeding .gpsetup, it results in:
12294 ld $gp, offset($sp)
76b3015f 12295
6478892d
TS
12296 If a register $reg2 was given there, it results in:
12297 daddiu $gp, $gp, $reg2
12298 */
12299static void
12300s_cpreturn (ignore)
12301 int ignore ATTRIBUTE_UNUSED;
12302{
12303 expressionS ex;
12304 int icnt = 0;
12305
12306 /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
12307 We also need NewABI support. */
12308 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12309 {
12310 s_ignore (0);
12311 return;
12312 }
12313
12314 if (mips_cpreturn_register == -1)
12315 {
12316 ex.X_op = O_constant;
12317 ex.X_add_symbol = NULL;
12318 ex.X_op_symbol = NULL;
12319 ex.X_add_number = mips_cpreturn_offset;
12320
12321 macro_build ((char *) NULL, &icnt, &ex, "ld", "t,o(b)",
12322 mips_gp_register, (int) BFD_RELOC_LO16, SP);
12323 }
12324 else
12325 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "daddu",
12326 "d,v,t", mips_gp_register, mips_cpreturn_register, 0);
12327
12328 demand_empty_rest_of_line ();
12329}
12330
12331/* Handle the .gpvalue pseudo-op. This is used when generating NewABI PIC
12332 code. It sets the offset to use in gp_rel relocations. */
12333
12334static void
12335s_gpvalue (ignore)
12336 int ignore ATTRIBUTE_UNUSED;
12337{
12338 /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
12339 We also need NewABI support. */
12340 if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12341 {
12342 s_ignore (0);
12343 return;
12344 }
12345
def2e0dd 12346 mips_gprel_offset = get_absolute_expression ();
6478892d
TS
12347
12348 demand_empty_rest_of_line ();
12349}
12350
252b5132
RH
12351/* Handle the .gpword pseudo-op. This is used when generating PIC
12352 code. It generates a 32 bit GP relative reloc. */
12353
12354static void
12355s_gpword (ignore)
43841e91 12356 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
12357{
12358 symbolS *label;
12359 expressionS ex;
12360 char *p;
12361
12362 /* When not generating PIC code, this is treated as .word. */
12363 if (mips_pic != SVR4_PIC)
12364 {
12365 s_cons (2);
12366 return;
12367 }
12368
12369 label = insn_labels != NULL ? insn_labels->label : NULL;
b34976b6 12370 mips_emit_delays (TRUE);
252b5132
RH
12371 if (auto_align)
12372 mips_align (2, 0, label);
12373 mips_clear_insn_labels ();
12374
12375 expression (&ex);
12376
12377 if (ex.X_op != O_symbol || ex.X_add_number != 0)
12378 {
12379 as_bad (_("Unsupported use of .gpword"));
12380 ignore_rest_of_line ();
12381 }
12382
12383 p = frag_more (4);
12384 md_number_to_chars (p, (valueT) 0, 4);
b34976b6 12385 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
cdf6fd85 12386 BFD_RELOC_GPREL32);
252b5132
RH
12387
12388 demand_empty_rest_of_line ();
12389}
12390
10181a0d
AO
12391static void
12392s_gpdword (ignore)
12393 int ignore ATTRIBUTE_UNUSED;
12394{
12395 symbolS *label;
12396 expressionS ex;
12397 char *p;
12398
12399 /* When not generating PIC code, this is treated as .dword. */
12400 if (mips_pic != SVR4_PIC)
12401 {
12402 s_cons (3);
12403 return;
12404 }
12405
12406 label = insn_labels != NULL ? insn_labels->label : NULL;
b34976b6 12407 mips_emit_delays (TRUE);
10181a0d
AO
12408 if (auto_align)
12409 mips_align (3, 0, label);
12410 mips_clear_insn_labels ();
12411
12412 expression (&ex);
12413
12414 if (ex.X_op != O_symbol || ex.X_add_number != 0)
12415 {
12416 as_bad (_("Unsupported use of .gpdword"));
12417 ignore_rest_of_line ();
12418 }
12419
12420 p = frag_more (8);
12421 md_number_to_chars (p, (valueT) 0, 8);
b34976b6 12422 fix_new_exp (frag_now, p - frag_now->fr_literal, 8, &ex, FALSE,
10181a0d
AO
12423 BFD_RELOC_GPREL32);
12424
12425 /* GPREL32 composed with 64 gives a 64-bit GP offset. */
12426 ex.X_op = O_absent;
12427 ex.X_add_symbol = 0;
12428 ex.X_add_number = 0;
b34976b6 12429 fix_new_exp (frag_now, p - frag_now->fr_literal, 8, &ex, FALSE,
10181a0d
AO
12430 BFD_RELOC_64);
12431
12432 demand_empty_rest_of_line ();
12433}
12434
252b5132
RH
12435/* Handle the .cpadd pseudo-op. This is used when dealing with switch
12436 tables in SVR4 PIC code. */
12437
12438static void
12439s_cpadd (ignore)
43841e91 12440 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
12441{
12442 int icnt = 0;
12443 int reg;
12444
10181a0d
AO
12445 /* This is ignored when not generating SVR4 PIC code. */
12446 if (mips_pic != SVR4_PIC)
252b5132
RH
12447 {
12448 s_ignore (0);
12449 return;
12450 }
12451
12452 /* Add $gp to the register named as an argument. */
12453 reg = tc_get_register (0);
12454 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
ca4e0257 12455 HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
c9914766 12456 "d,v,t", reg, reg, mips_gp_register);
252b5132 12457
bdaaa2e1 12458 demand_empty_rest_of_line ();
252b5132
RH
12459}
12460
12461/* Handle the .insn pseudo-op. This marks instruction labels in
12462 mips16 mode. This permits the linker to handle them specially,
12463 such as generating jalx instructions when needed. We also make
12464 them odd for the duration of the assembly, in order to generate the
12465 right sort of code. We will make them even in the adjust_symtab
12466 routine, while leaving them marked. This is convenient for the
12467 debugger and the disassembler. The linker knows to make them odd
12468 again. */
12469
12470static void
12471s_insn (ignore)
43841e91 12472 int ignore ATTRIBUTE_UNUSED;
252b5132 12473{
f9419b05 12474 mips16_mark_labels ();
252b5132
RH
12475
12476 demand_empty_rest_of_line ();
12477}
12478
12479/* Handle a .stabn directive. We need these in order to mark a label
12480 as being a mips16 text label correctly. Sometimes the compiler
12481 will emit a label, followed by a .stabn, and then switch sections.
12482 If the label and .stabn are in mips16 mode, then the label is
12483 really a mips16 text label. */
12484
12485static void
12486s_mips_stab (type)
12487 int type;
12488{
f9419b05 12489 if (type == 'n')
252b5132
RH
12490 mips16_mark_labels ();
12491
12492 s_stab (type);
12493}
12494
12495/* Handle the .weakext pseudo-op as defined in Kane and Heinrich.
12496 */
12497
12498static void
12499s_mips_weakext (ignore)
43841e91 12500 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
12501{
12502 char *name;
12503 int c;
12504 symbolS *symbolP;
12505 expressionS exp;
12506
12507 name = input_line_pointer;
12508 c = get_symbol_end ();
12509 symbolP = symbol_find_or_make (name);
12510 S_SET_WEAK (symbolP);
12511 *input_line_pointer = c;
12512
12513 SKIP_WHITESPACE ();
12514
12515 if (! is_end_of_line[(unsigned char) *input_line_pointer])
12516 {
12517 if (S_IS_DEFINED (symbolP))
12518 {
956cd1d6 12519 as_bad ("ignoring attempt to redefine symbol %s",
252b5132
RH
12520 S_GET_NAME (symbolP));
12521 ignore_rest_of_line ();
12522 return;
12523 }
bdaaa2e1 12524
252b5132
RH
12525 if (*input_line_pointer == ',')
12526 {
12527 ++input_line_pointer;
12528 SKIP_WHITESPACE ();
12529 }
bdaaa2e1 12530
252b5132
RH
12531 expression (&exp);
12532 if (exp.X_op != O_symbol)
12533 {
12534 as_bad ("bad .weakext directive");
98d3f06f 12535 ignore_rest_of_line ();
252b5132
RH
12536 return;
12537 }
49309057 12538 symbol_set_value_expression (symbolP, &exp);
252b5132
RH
12539 }
12540
12541 demand_empty_rest_of_line ();
12542}
12543
12544/* Parse a register string into a number. Called from the ECOFF code
12545 to parse .frame. The argument is non-zero if this is the frame
12546 register, so that we can record it in mips_frame_reg. */
12547
12548int
12549tc_get_register (frame)
12550 int frame;
12551{
12552 int reg;
12553
12554 SKIP_WHITESPACE ();
12555 if (*input_line_pointer++ != '$')
12556 {
12557 as_warn (_("expected `$'"));
85b51719 12558 reg = ZERO;
252b5132 12559 }
3882b010 12560 else if (ISDIGIT (*input_line_pointer))
252b5132
RH
12561 {
12562 reg = get_absolute_expression ();
12563 if (reg < 0 || reg >= 32)
12564 {
12565 as_warn (_("Bad register number"));
85b51719 12566 reg = ZERO;
252b5132
RH
12567 }
12568 }
12569 else
12570 {
76db943d 12571 if (strncmp (input_line_pointer, "ra", 2) == 0)
85b51719
TS
12572 {
12573 reg = RA;
12574 input_line_pointer += 2;
12575 }
76db943d 12576 else if (strncmp (input_line_pointer, "fp", 2) == 0)
85b51719
TS
12577 {
12578 reg = FP;
12579 input_line_pointer += 2;
12580 }
252b5132 12581 else if (strncmp (input_line_pointer, "sp", 2) == 0)
85b51719
TS
12582 {
12583 reg = SP;
12584 input_line_pointer += 2;
12585 }
252b5132 12586 else if (strncmp (input_line_pointer, "gp", 2) == 0)
85b51719
TS
12587 {
12588 reg = GP;
12589 input_line_pointer += 2;
12590 }
252b5132 12591 else if (strncmp (input_line_pointer, "at", 2) == 0)
85b51719
TS
12592 {
12593 reg = AT;
12594 input_line_pointer += 2;
12595 }
12596 else if (strncmp (input_line_pointer, "kt0", 3) == 0)
12597 {
12598 reg = KT0;
12599 input_line_pointer += 3;
12600 }
12601 else if (strncmp (input_line_pointer, "kt1", 3) == 0)
12602 {
12603 reg = KT1;
12604 input_line_pointer += 3;
12605 }
12606 else if (strncmp (input_line_pointer, "zero", 4) == 0)
12607 {
12608 reg = ZERO;
12609 input_line_pointer += 4;
12610 }
252b5132
RH
12611 else
12612 {
12613 as_warn (_("Unrecognized register name"));
85b51719
TS
12614 reg = ZERO;
12615 while (ISALNUM(*input_line_pointer))
12616 input_line_pointer++;
252b5132 12617 }
252b5132
RH
12618 }
12619 if (frame)
7a621144
DJ
12620 {
12621 mips_frame_reg = reg != 0 ? reg : SP;
12622 mips_frame_reg_valid = 1;
12623 mips_cprestore_valid = 0;
12624 }
252b5132
RH
12625 return reg;
12626}
12627
12628valueT
12629md_section_align (seg, addr)
12630 asection *seg;
12631 valueT addr;
12632{
12633 int align = bfd_get_section_alignment (stdoutput, seg);
12634
12635#ifdef OBJ_ELF
12636 /* We don't need to align ELF sections to the full alignment.
12637 However, Irix 5 may prefer that we align them at least to a 16
12638 byte boundary. We don't bother to align the sections if we are
12639 targeted for an embedded system. */
12640 if (strcmp (TARGET_OS, "elf") == 0)
12641 return addr;
12642 if (align > 4)
12643 align = 4;
12644#endif
12645
12646 return ((addr + (1 << align) - 1) & (-1 << align));
12647}
12648
12649/* Utility routine, called from above as well. If called while the
12650 input file is still being read, it's only an approximation. (For
12651 example, a symbol may later become defined which appeared to be
12652 undefined earlier.) */
12653
12654static int
12655nopic_need_relax (sym, before_relaxing)
12656 symbolS *sym;
12657 int before_relaxing;
12658{
12659 if (sym == 0)
12660 return 0;
12661
6478892d 12662 if (USE_GLOBAL_POINTER_OPT && g_switch_value > 0)
252b5132
RH
12663 {
12664 const char *symname;
12665 int change;
12666
c9914766 12667 /* Find out whether this symbol can be referenced off the $gp
252b5132
RH
12668 register. It can be if it is smaller than the -G size or if
12669 it is in the .sdata or .sbss section. Certain symbols can
c9914766 12670 not be referenced off the $gp, although it appears as though
252b5132
RH
12671 they can. */
12672 symname = S_GET_NAME (sym);
12673 if (symname != (const char *) NULL
12674 && (strcmp (symname, "eprol") == 0
12675 || strcmp (symname, "etext") == 0
12676 || strcmp (symname, "_gp") == 0
12677 || strcmp (symname, "edata") == 0
12678 || strcmp (symname, "_fbss") == 0
12679 || strcmp (symname, "_fdata") == 0
12680 || strcmp (symname, "_ftext") == 0
12681 || strcmp (symname, "end") == 0
12682 || strcmp (symname, "_gp_disp") == 0))
12683 change = 1;
12684 else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
12685 && (0
12686#ifndef NO_ECOFF_DEBUGGING
49309057
ILT
12687 || (symbol_get_obj (sym)->ecoff_extern_size != 0
12688 && (symbol_get_obj (sym)->ecoff_extern_size
12689 <= g_switch_value))
252b5132
RH
12690#endif
12691 /* We must defer this decision until after the whole
12692 file has been read, since there might be a .extern
12693 after the first use of this symbol. */
12694 || (before_relaxing
12695#ifndef NO_ECOFF_DEBUGGING
49309057 12696 && symbol_get_obj (sym)->ecoff_extern_size == 0
252b5132
RH
12697#endif
12698 && S_GET_VALUE (sym) == 0)
12699 || (S_GET_VALUE (sym) != 0
12700 && S_GET_VALUE (sym) <= g_switch_value)))
12701 change = 0;
12702 else
12703 {
12704 const char *segname;
12705
12706 segname = segment_name (S_GET_SEGMENT (sym));
12707 assert (strcmp (segname, ".lit8") != 0
12708 && strcmp (segname, ".lit4") != 0);
12709 change = (strcmp (segname, ".sdata") != 0
fba2b7f9
GK
12710 && strcmp (segname, ".sbss") != 0
12711 && strncmp (segname, ".sdata.", 7) != 0
12712 && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
252b5132
RH
12713 }
12714 return change;
12715 }
12716 else
c9914766 12717 /* We are not optimizing for the $gp register. */
252b5132
RH
12718 return 1;
12719}
12720
5919d012
RS
12721
12722/* Return true if the given symbol should be considered local for SVR4 PIC. */
12723
12724static bfd_boolean
12725pic_need_relax (sym, segtype)
12726 symbolS *sym;
12727 asection *segtype;
12728{
12729 asection *symsec;
12730 bfd_boolean linkonce;
12731
12732 /* Handle the case of a symbol equated to another symbol. */
12733 while (symbol_equated_reloc_p (sym))
12734 {
12735 symbolS *n;
12736
12737 /* It's possible to get a loop here in a badly written
12738 program. */
12739 n = symbol_get_value_expression (sym)->X_add_symbol;
12740 if (n == sym)
12741 break;
12742 sym = n;
12743 }
12744
12745 symsec = S_GET_SEGMENT (sym);
12746
12747 /* duplicate the test for LINK_ONCE sections as in adjust_reloc_syms */
12748 linkonce = FALSE;
12749 if (symsec != segtype && ! S_IS_LOCAL (sym))
12750 {
12751 if ((bfd_get_section_flags (stdoutput, symsec) & SEC_LINK_ONCE)
12752 != 0)
12753 linkonce = TRUE;
12754
12755 /* The GNU toolchain uses an extension for ELF: a section
12756 beginning with the magic string .gnu.linkonce is a linkonce
12757 section. */
12758 if (strncmp (segment_name (symsec), ".gnu.linkonce",
12759 sizeof ".gnu.linkonce" - 1) == 0)
12760 linkonce = TRUE;
12761 }
12762
12763 /* This must duplicate the test in adjust_reloc_syms. */
12764 return (symsec != &bfd_und_section
12765 && symsec != &bfd_abs_section
12766 && ! bfd_is_com_section (symsec)
12767 && !linkonce
12768#ifdef OBJ_ELF
12769 /* A global or weak symbol is treated as external. */
12770 && (OUTPUT_FLAVOR != bfd_target_elf_flavour
12771 || (! S_IS_WEAK (sym)
12772 && (! S_IS_EXTERNAL (sym)
12773 || mips_pic == EMBEDDED_PIC)))
12774#endif
12775 );
12776}
12777
12778
252b5132
RH
12779/* Given a mips16 variant frag FRAGP, return non-zero if it needs an
12780 extended opcode. SEC is the section the frag is in. */
12781
12782static int
12783mips16_extended_frag (fragp, sec, stretch)
12784 fragS *fragp;
12785 asection *sec;
12786 long stretch;
12787{
12788 int type;
12789 register const struct mips16_immed_operand *op;
12790 offsetT val;
12791 int mintiny, maxtiny;
12792 segT symsec;
98aa84af 12793 fragS *sym_frag;
252b5132
RH
12794
12795 if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
12796 return 0;
12797 if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
12798 return 1;
12799
12800 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
12801 op = mips16_immed_operands;
12802 while (op->type != type)
12803 {
12804 ++op;
12805 assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
12806 }
12807
12808 if (op->unsp)
12809 {
12810 if (type == '<' || type == '>' || type == '[' || type == ']')
12811 {
12812 mintiny = 1;
12813 maxtiny = 1 << op->nbits;
12814 }
12815 else
12816 {
12817 mintiny = 0;
12818 maxtiny = (1 << op->nbits) - 1;
12819 }
12820 }
12821 else
12822 {
12823 mintiny = - (1 << (op->nbits - 1));
12824 maxtiny = (1 << (op->nbits - 1)) - 1;
12825 }
12826
98aa84af 12827 sym_frag = symbol_get_frag (fragp->fr_symbol);
ac62c346 12828 val = S_GET_VALUE (fragp->fr_symbol);
98aa84af 12829 symsec = S_GET_SEGMENT (fragp->fr_symbol);
252b5132
RH
12830
12831 if (op->pcrel)
12832 {
12833 addressT addr;
12834
12835 /* We won't have the section when we are called from
12836 mips_relax_frag. However, we will always have been called
12837 from md_estimate_size_before_relax first. If this is a
12838 branch to a different section, we mark it as such. If SEC is
12839 NULL, and the frag is not marked, then it must be a branch to
12840 the same section. */
12841 if (sec == NULL)
12842 {
12843 if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
12844 return 1;
12845 }
12846 else
12847 {
98aa84af 12848 /* Must have been called from md_estimate_size_before_relax. */
252b5132
RH
12849 if (symsec != sec)
12850 {
12851 fragp->fr_subtype =
12852 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
12853
12854 /* FIXME: We should support this, and let the linker
12855 catch branches and loads that are out of range. */
12856 as_bad_where (fragp->fr_file, fragp->fr_line,
12857 _("unsupported PC relative reference to different section"));
12858
12859 return 1;
12860 }
98aa84af
AM
12861 if (fragp != sym_frag && sym_frag->fr_address == 0)
12862 /* Assume non-extended on the first relaxation pass.
12863 The address we have calculated will be bogus if this is
12864 a forward branch to another frag, as the forward frag
12865 will have fr_address == 0. */
12866 return 0;
252b5132
RH
12867 }
12868
12869 /* In this case, we know for sure that the symbol fragment is in
98aa84af
AM
12870 the same section. If the relax_marker of the symbol fragment
12871 differs from the relax_marker of this fragment, we have not
12872 yet adjusted the symbol fragment fr_address. We want to add
252b5132
RH
12873 in STRETCH in order to get a better estimate of the address.
12874 This particularly matters because of the shift bits. */
12875 if (stretch != 0
98aa84af 12876 && sym_frag->relax_marker != fragp->relax_marker)
252b5132
RH
12877 {
12878 fragS *f;
12879
12880 /* Adjust stretch for any alignment frag. Note that if have
12881 been expanding the earlier code, the symbol may be
12882 defined in what appears to be an earlier frag. FIXME:
12883 This doesn't handle the fr_subtype field, which specifies
12884 a maximum number of bytes to skip when doing an
12885 alignment. */
98aa84af 12886 for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
252b5132
RH
12887 {
12888 if (f->fr_type == rs_align || f->fr_type == rs_align_code)
12889 {
12890 if (stretch < 0)
12891 stretch = - ((- stretch)
12892 & ~ ((1 << (int) f->fr_offset) - 1));
12893 else
12894 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
12895 if (stretch == 0)
12896 break;
12897 }
12898 }
12899 if (f != NULL)
12900 val += stretch;
12901 }
12902
12903 addr = fragp->fr_address + fragp->fr_fix;
12904
12905 /* The base address rules are complicated. The base address of
12906 a branch is the following instruction. The base address of a
12907 PC relative load or add is the instruction itself, but if it
12908 is in a delay slot (in which case it can not be extended) use
12909 the address of the instruction whose delay slot it is in. */
12910 if (type == 'p' || type == 'q')
12911 {
12912 addr += 2;
12913
12914 /* If we are currently assuming that this frag should be
12915 extended, then, the current address is two bytes
bdaaa2e1 12916 higher. */
252b5132
RH
12917 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
12918 addr += 2;
12919
12920 /* Ignore the low bit in the target, since it will be set
12921 for a text label. */
12922 if ((val & 1) != 0)
12923 --val;
12924 }
12925 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
12926 addr -= 4;
12927 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
12928 addr -= 2;
12929
12930 val -= addr & ~ ((1 << op->shift) - 1);
12931
12932 /* Branch offsets have an implicit 0 in the lowest bit. */
12933 if (type == 'p' || type == 'q')
12934 val /= 2;
12935
12936 /* If any of the shifted bits are set, we must use an extended
12937 opcode. If the address depends on the size of this
12938 instruction, this can lead to a loop, so we arrange to always
12939 use an extended opcode. We only check this when we are in
12940 the main relaxation loop, when SEC is NULL. */
12941 if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
12942 {
12943 fragp->fr_subtype =
12944 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
12945 return 1;
12946 }
12947
12948 /* If we are about to mark a frag as extended because the value
12949 is precisely maxtiny + 1, then there is a chance of an
12950 infinite loop as in the following code:
12951 la $4,foo
12952 .skip 1020
12953 .align 2
12954 foo:
12955 In this case when the la is extended, foo is 0x3fc bytes
12956 away, so the la can be shrunk, but then foo is 0x400 away, so
12957 the la must be extended. To avoid this loop, we mark the
12958 frag as extended if it was small, and is about to become
12959 extended with a value of maxtiny + 1. */
12960 if (val == ((maxtiny + 1) << op->shift)
12961 && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
12962 && sec == NULL)
12963 {
12964 fragp->fr_subtype =
12965 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
12966 return 1;
12967 }
12968 }
12969 else if (symsec != absolute_section && sec != NULL)
12970 as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
12971
12972 if ((val & ((1 << op->shift) - 1)) != 0
12973 || val < (mintiny << op->shift)
12974 || val > (maxtiny << op->shift))
12975 return 1;
12976 else
12977 return 0;
12978}
12979
4a6a3df4
AO
12980/* Compute the length of a branch sequence, and adjust the
12981 RELAX_BRANCH_TOOFAR bit accordingly. If FRAGP is NULL, the
12982 worst-case length is computed, with UPDATE being used to indicate
12983 whether an unconditional (-1), branch-likely (+1) or regular (0)
12984 branch is to be computed. */
12985static int
12986relaxed_branch_length (fragp, sec, update)
12987 fragS *fragp;
12988 asection *sec;
12989 int update;
12990{
b34976b6 12991 bfd_boolean toofar;
4a6a3df4
AO
12992 int length;
12993
12994 if (fragp
12995 && S_IS_DEFINED (fragp->fr_symbol)
12996 && sec == S_GET_SEGMENT (fragp->fr_symbol))
12997 {
12998 addressT addr;
12999 offsetT val;
13000
13001 val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
13002
13003 addr = fragp->fr_address + fragp->fr_fix + 4;
13004
13005 val -= addr;
13006
13007 toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
13008 }
13009 else if (fragp)
13010 /* If the symbol is not defined or it's in a different segment,
13011 assume the user knows what's going on and emit a short
13012 branch. */
b34976b6 13013 toofar = FALSE;
4a6a3df4 13014 else
b34976b6 13015 toofar = TRUE;
4a6a3df4
AO
13016
13017 if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
13018 fragp->fr_subtype
af6ae2ad 13019 = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp->fr_subtype),
4a6a3df4
AO
13020 RELAX_BRANCH_LIKELY (fragp->fr_subtype),
13021 RELAX_BRANCH_LINK (fragp->fr_subtype),
13022 toofar);
13023
13024 length = 4;
13025 if (toofar)
13026 {
13027 if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
13028 length += 8;
13029
13030 if (mips_pic != NO_PIC)
13031 {
13032 /* Additional space for PIC loading of target address. */
13033 length += 8;
13034 if (mips_opts.isa == ISA_MIPS1)
13035 /* Additional space for $at-stabilizing nop. */
13036 length += 4;
13037 }
13038
13039 /* If branch is conditional. */
13040 if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
13041 length += 8;
13042 }
b34976b6 13043
4a6a3df4
AO
13044 return length;
13045}
13046
252b5132
RH
13047/* Estimate the size of a frag before relaxing. Unless this is the
13048 mips16, we are not really relaxing here, and the final size is
13049 encoded in the subtype information. For the mips16, we have to
13050 decide whether we are using an extended opcode or not. */
13051
252b5132
RH
13052int
13053md_estimate_size_before_relax (fragp, segtype)
13054 fragS *fragp;
13055 asection *segtype;
13056{
5919d012 13057 int change;
252b5132 13058
4a6a3df4
AO
13059 if (RELAX_BRANCH_P (fragp->fr_subtype))
13060 {
13061
b34976b6
AM
13062 fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
13063
4a6a3df4
AO
13064 return fragp->fr_var;
13065 }
13066
252b5132 13067 if (RELAX_MIPS16_P (fragp->fr_subtype))
177b4a6a
AO
13068 /* We don't want to modify the EXTENDED bit here; it might get us
13069 into infinite loops. We change it only in mips_relax_frag(). */
13070 return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
252b5132
RH
13071
13072 if (mips_pic == NO_PIC)
5919d012 13073 change = nopic_need_relax (fragp->fr_symbol, 0);
252b5132 13074 else if (mips_pic == SVR4_PIC)
5919d012 13075 change = pic_need_relax (fragp->fr_symbol, segtype);
252b5132
RH
13076 else
13077 abort ();
13078
13079 if (change)
13080 {
13081 /* Record the offset to the first reloc in the fr_opcode field.
13082 This lets md_convert_frag and tc_gen_reloc know that the code
13083 must be expanded. */
13084 fragp->fr_opcode = (fragp->fr_literal
13085 + fragp->fr_fix
13086 - RELAX_OLD (fragp->fr_subtype)
13087 + RELAX_RELOC1 (fragp->fr_subtype));
13088 /* FIXME: This really needs as_warn_where. */
13089 if (RELAX_WARN (fragp->fr_subtype))
9a41af64
TS
13090 as_warn (_("AT used after \".set noat\" or macro used after "
13091 "\".set nomacro\""));
13092
13093 return RELAX_NEW (fragp->fr_subtype) - RELAX_OLD (fragp->fr_subtype);
252b5132
RH
13094 }
13095
9a41af64 13096 return 0;
252b5132
RH
13097}
13098
13099/* This is called to see whether a reloc against a defined symbol
13100 should be converted into a reloc against a section. Don't adjust
13101 MIPS16 jump relocations, so we don't have to worry about the format
13102 of the offset in the .o file. Don't adjust relocations against
13103 mips16 symbols, so that the linker can find them if it needs to set
13104 up a stub. */
13105
13106int
13107mips_fix_adjustable (fixp)
13108 fixS *fixp;
13109{
13110 if (fixp->fx_r_type == BFD_RELOC_MIPS16_JMP)
13111 return 0;
a161fe53 13112
252b5132
RH
13113 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
13114 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13115 return 0;
a161fe53 13116
252b5132
RH
13117 if (fixp->fx_addsy == NULL)
13118 return 1;
a161fe53 13119
252b5132
RH
13120#ifdef OBJ_ELF
13121 if (OUTPUT_FLAVOR == bfd_target_elf_flavour
13122 && S_GET_OTHER (fixp->fx_addsy) == STO_MIPS16
13123 && fixp->fx_subsy == NULL)
13124 return 0;
13125#endif
a161fe53 13126
252b5132
RH
13127 return 1;
13128}
13129
13130/* Translate internal representation of relocation info to BFD target
13131 format. */
13132
13133arelent **
13134tc_gen_reloc (section, fixp)
43841e91 13135 asection *section ATTRIBUTE_UNUSED;
252b5132
RH
13136 fixS *fixp;
13137{
13138 static arelent *retval[4];
13139 arelent *reloc;
13140 bfd_reloc_code_real_type code;
13141
13142 reloc = retval[0] = (arelent *) xmalloc (sizeof (arelent));
13143 retval[1] = NULL;
13144
49309057
ILT
13145 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
13146 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
13147 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
13148
13149 if (mips_pic == EMBEDDED_PIC
13150 && SWITCH_TABLE (fixp))
13151 {
13152 /* For a switch table entry we use a special reloc. The addend
13153 is actually the difference between the reloc address and the
13154 subtrahend. */
13155 reloc->addend = reloc->address - S_GET_VALUE (fixp->fx_subsy);
13156 if (OUTPUT_FLAVOR != bfd_target_ecoff_flavour)
13157 as_fatal (_("Double check fx_r_type in tc-mips.c:tc_gen_reloc"));
13158 fixp->fx_r_type = BFD_RELOC_GPREL32;
13159 }
13160 else if (fixp->fx_r_type == BFD_RELOC_PCREL_LO16)
13161 {
4514d474
CD
13162 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
13163 reloc->addend = fixp->fx_addnumber;
252b5132 13164 else
4514d474
CD
13165 {
13166 /* We use a special addend for an internal RELLO reloc. */
13167 if (symbol_section_p (fixp->fx_addsy))
13168 reloc->addend = reloc->address - S_GET_VALUE (fixp->fx_subsy);
13169 else
13170 reloc->addend = fixp->fx_addnumber + reloc->address;
13171 }
252b5132
RH
13172 }
13173 else if (fixp->fx_r_type == BFD_RELOC_PCREL_HI16_S)
13174 {
13175 assert (fixp->fx_next != NULL
13176 && fixp->fx_next->fx_r_type == BFD_RELOC_PCREL_LO16);
4514d474
CD
13177
13178 /* The reloc is relative to the RELLO; adjust the addend
252b5132 13179 accordingly. */
4514d474
CD
13180 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
13181 reloc->addend = fixp->fx_next->fx_addnumber;
252b5132 13182 else
4514d474
CD
13183 {
13184 /* We use a special addend for an internal RELHI reloc. */
13185 if (symbol_section_p (fixp->fx_addsy))
13186 reloc->addend = (fixp->fx_next->fx_frag->fr_address
13187 + fixp->fx_next->fx_where
13188 - S_GET_VALUE (fixp->fx_subsy));
13189 else
13190 reloc->addend = (fixp->fx_addnumber
13191 + fixp->fx_next->fx_frag->fr_address
13192 + fixp->fx_next->fx_where);
13193 }
252b5132 13194 }
4514d474
CD
13195 else if (fixp->fx_pcrel == 0 || OUTPUT_FLAVOR == bfd_target_elf_flavour)
13196 reloc->addend = fixp->fx_addnumber;
252b5132
RH
13197 else
13198 {
13199 if (OUTPUT_FLAVOR != bfd_target_aout_flavour)
13200 /* A gruesome hack which is a result of the gruesome gas reloc
13201 handling. */
13202 reloc->addend = reloc->address;
13203 else
13204 reloc->addend = -reloc->address;
13205 }
13206
13207 /* If this is a variant frag, we may need to adjust the existing
13208 reloc and generate a new one. */
13209 if (fixp->fx_frag->fr_opcode != NULL
ed6fb7bd
SC
13210 && ((fixp->fx_r_type == BFD_RELOC_GPREL16
13211 && ! HAVE_NEWABI)
252b5132
RH
13212 || fixp->fx_r_type == BFD_RELOC_MIPS_GOT16
13213 || fixp->fx_r_type == BFD_RELOC_MIPS_CALL16
13214 || fixp->fx_r_type == BFD_RELOC_MIPS_GOT_HI16
13215 || fixp->fx_r_type == BFD_RELOC_MIPS_GOT_LO16
13216 || fixp->fx_r_type == BFD_RELOC_MIPS_CALL_HI16
6478892d 13217 || fixp->fx_r_type == BFD_RELOC_MIPS_CALL_LO16)
ed6fb7bd 13218 )
252b5132
RH
13219 {
13220 arelent *reloc2;
13221
13222 assert (! RELAX_MIPS16_P (fixp->fx_frag->fr_subtype));
13223
13224 /* If this is not the last reloc in this frag, then we have two
13225 GPREL relocs, or a GOT_HI16/GOT_LO16 pair, or a
13226 CALL_HI16/CALL_LO16, both of which are being replaced. Let
13227 the second one handle all of them. */
13228 if (fixp->fx_next != NULL
13229 && fixp->fx_frag == fixp->fx_next->fx_frag)
13230 {
cdf6fd85
TS
13231 assert ((fixp->fx_r_type == BFD_RELOC_GPREL16
13232 && fixp->fx_next->fx_r_type == BFD_RELOC_GPREL16)
252b5132
RH
13233 || (fixp->fx_r_type == BFD_RELOC_MIPS_GOT_HI16
13234 && (fixp->fx_next->fx_r_type
13235 == BFD_RELOC_MIPS_GOT_LO16))
13236 || (fixp->fx_r_type == BFD_RELOC_MIPS_CALL_HI16
13237 && (fixp->fx_next->fx_r_type
13238 == BFD_RELOC_MIPS_CALL_LO16)));
13239 retval[0] = NULL;
13240 return retval;
13241 }
13242
13243 fixp->fx_where = fixp->fx_frag->fr_opcode - fixp->fx_frag->fr_literal;
13244 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
13245 reloc2 = retval[1] = (arelent *) xmalloc (sizeof (arelent));
13246 retval[2] = NULL;
49309057
ILT
13247 reloc2->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
13248 *reloc2->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
13249 reloc2->address = (reloc->address
13250 + (RELAX_RELOC2 (fixp->fx_frag->fr_subtype)
13251 - RELAX_RELOC1 (fixp->fx_frag->fr_subtype)));
13252 reloc2->addend = fixp->fx_addnumber;
13253 reloc2->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_LO16);
13254 assert (reloc2->howto != NULL);
13255
13256 if (RELAX_RELOC3 (fixp->fx_frag->fr_subtype))
13257 {
13258 arelent *reloc3;
13259
13260 reloc3 = retval[2] = (arelent *) xmalloc (sizeof (arelent));
13261 retval[3] = NULL;
13262 *reloc3 = *reloc2;
13263 reloc3->address += 4;
13264 }
13265
13266 if (mips_pic == NO_PIC)
13267 {
cdf6fd85 13268 assert (fixp->fx_r_type == BFD_RELOC_GPREL16);
252b5132
RH
13269 fixp->fx_r_type = BFD_RELOC_HI16_S;
13270 }
13271 else if (mips_pic == SVR4_PIC)
13272 {
13273 switch (fixp->fx_r_type)
13274 {
13275 default:
13276 abort ();
13277 case BFD_RELOC_MIPS_GOT16:
13278 break;
252b5132
RH
13279 case BFD_RELOC_MIPS_GOT_LO16:
13280 case BFD_RELOC_MIPS_CALL_LO16:
13281 fixp->fx_r_type = BFD_RELOC_MIPS_GOT16;
13282 break;
ed6fb7bd
SC
13283 case BFD_RELOC_MIPS_CALL16:
13284 if (HAVE_NEWABI)
13285 {
13286 /* BFD_RELOC_MIPS_GOT16;*/
13287 fixp->fx_r_type = BFD_RELOC_MIPS_GOT_PAGE;
13288 reloc2->howto = bfd_reloc_type_lookup
13289 (stdoutput, BFD_RELOC_MIPS_GOT_OFST);
13290 }
13291 else
13292 fixp->fx_r_type = BFD_RELOC_MIPS_GOT16;
13293 break;
252b5132
RH
13294 }
13295 }
13296 else
13297 abort ();
ed6fb7bd
SC
13298
13299 /* newabi uses R_MIPS_GOT_DISP for local symbols */
6b70243f 13300 if (HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_MIPS_GOT_LO16)
ed6fb7bd
SC
13301 {
13302 fixp->fx_r_type = BFD_RELOC_MIPS_GOT_DISP;
13303 retval[1] = NULL;
13304 }
252b5132
RH
13305 }
13306
438c16b8
TS
13307 /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
13308 entry to be used in the relocation's section offset. */
13309 if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
252b5132
RH
13310 {
13311 reloc->address = reloc->addend;
13312 reloc->addend = 0;
13313 }
13314
13315 /* Since DIFF_EXPR_OK is defined in tc-mips.h, it is possible that
13316 fixup_segment converted a non-PC relative reloc into a PC
13317 relative reloc. In such a case, we need to convert the reloc
13318 code. */
13319 code = fixp->fx_r_type;
13320 if (fixp->fx_pcrel)
13321 {
13322 switch (code)
13323 {
13324 case BFD_RELOC_8:
13325 code = BFD_RELOC_8_PCREL;
13326 break;
13327 case BFD_RELOC_16:
13328 code = BFD_RELOC_16_PCREL;
13329 break;
13330 case BFD_RELOC_32:
13331 code = BFD_RELOC_32_PCREL;
13332 break;
13333 case BFD_RELOC_64:
13334 code = BFD_RELOC_64_PCREL;
13335 break;
13336 case BFD_RELOC_8_PCREL:
13337 case BFD_RELOC_16_PCREL:
13338 case BFD_RELOC_32_PCREL:
13339 case BFD_RELOC_64_PCREL:
13340 case BFD_RELOC_16_PCREL_S2:
13341 case BFD_RELOC_PCREL_HI16_S:
13342 case BFD_RELOC_PCREL_LO16:
13343 break;
13344 default:
13345 as_bad_where (fixp->fx_file, fixp->fx_line,
13346 _("Cannot make %s relocation PC relative"),
13347 bfd_get_reloc_code_name (code));
13348 }
13349 }
13350
add55e1f
RS
13351#ifdef OBJ_ELF
13352 /* md_apply_fix3 has a double-subtraction hack to get
13353 bfd_install_relocation to behave nicely. GPREL relocations are
13354 handled correctly without this hack, so undo it here. We can't
13355 stop md_apply_fix3 from subtracting twice in the first place since
13356 the fake addend is required for variant frags above. */
13357 if (fixp->fx_addsy != NULL && OUTPUT_FLAVOR == bfd_target_elf_flavour
98605598 13358 && (code == BFD_RELOC_GPREL16 || code == BFD_RELOC_MIPS16_GPREL)
add55e1f
RS
13359 && reloc->addend != 0
13360 && mips_need_elf_addend_fixup (fixp))
13361 reloc->addend += S_GET_VALUE (fixp->fx_addsy);
13362#endif
13363
252b5132
RH
13364 /* To support a PC relative reloc when generating embedded PIC code
13365 for ECOFF, we use a Cygnus extension. We check for that here to
13366 make sure that we don't let such a reloc escape normally. */
bb2d6cd7
GK
13367 if ((OUTPUT_FLAVOR == bfd_target_ecoff_flavour
13368 || OUTPUT_FLAVOR == bfd_target_elf_flavour)
252b5132
RH
13369 && code == BFD_RELOC_16_PCREL_S2
13370 && mips_pic != EMBEDDED_PIC)
13371 reloc->howto = NULL;
13372 else
13373 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
13374
13375 if (reloc->howto == NULL)
13376 {
13377 as_bad_where (fixp->fx_file, fixp->fx_line,
13378 _("Can not represent %s relocation in this object file format"),
13379 bfd_get_reloc_code_name (code));
13380 retval[0] = NULL;
13381 }
13382
13383 return retval;
13384}
13385
13386/* Relax a machine dependent frag. This returns the amount by which
13387 the current size of the frag should change. */
13388
13389int
4a6a3df4
AO
13390mips_relax_frag (sec, fragp, stretch)
13391 asection *sec;
252b5132
RH
13392 fragS *fragp;
13393 long stretch;
13394{
4a6a3df4
AO
13395 if (RELAX_BRANCH_P (fragp->fr_subtype))
13396 {
13397 offsetT old_var = fragp->fr_var;
b34976b6
AM
13398
13399 fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
4a6a3df4
AO
13400
13401 return fragp->fr_var - old_var;
13402 }
13403
252b5132
RH
13404 if (! RELAX_MIPS16_P (fragp->fr_subtype))
13405 return 0;
13406
c4e7957c 13407 if (mips16_extended_frag (fragp, NULL, stretch))
252b5132
RH
13408 {
13409 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13410 return 0;
13411 fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
13412 return 2;
13413 }
13414 else
13415 {
13416 if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13417 return 0;
13418 fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
13419 return -2;
13420 }
13421
13422 return 0;
13423}
13424
13425/* Convert a machine dependent frag. */
13426
13427void
13428md_convert_frag (abfd, asec, fragp)
43841e91 13429 bfd *abfd ATTRIBUTE_UNUSED;
252b5132
RH
13430 segT asec;
13431 fragS *fragp;
13432{
13433 int old, new;
13434 char *fixptr;
13435
4a6a3df4
AO
13436 if (RELAX_BRANCH_P (fragp->fr_subtype))
13437 {
13438 bfd_byte *buf;
13439 unsigned long insn;
13440 expressionS exp;
13441 fixS *fixp;
b34976b6 13442
4a6a3df4
AO
13443 buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
13444
13445 if (target_big_endian)
13446 insn = bfd_getb32 (buf);
13447 else
13448 insn = bfd_getl32 (buf);
b34976b6 13449
4a6a3df4
AO
13450 if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
13451 {
13452 /* We generate a fixup instead of applying it right now
13453 because, if there are linker relaxations, we're going to
13454 need the relocations. */
13455 exp.X_op = O_symbol;
13456 exp.X_add_symbol = fragp->fr_symbol;
13457 exp.X_add_number = fragp->fr_offset;
13458
13459 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13460 4, &exp, 1,
af6ae2ad 13461 BFD_RELOC_16_PCREL_S2);
4a6a3df4
AO
13462 fixp->fx_file = fragp->fr_file;
13463 fixp->fx_line = fragp->fr_line;
b34976b6 13464
4a6a3df4
AO
13465 md_number_to_chars ((char *)buf, insn, 4);
13466 buf += 4;
13467 }
13468 else
13469 {
13470 int i;
13471
13472 as_warn_where (fragp->fr_file, fragp->fr_line,
13473 _("relaxed out-of-range branch into a jump"));
13474
13475 if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
13476 goto uncond;
13477
13478 if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13479 {
13480 /* Reverse the branch. */
13481 switch ((insn >> 28) & 0xf)
13482 {
13483 case 4:
13484 /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
13485 have the condition reversed by tweaking a single
13486 bit, and their opcodes all have 0x4???????. */
13487 assert ((insn & 0xf1000000) == 0x41000000);
13488 insn ^= 0x00010000;
13489 break;
13490
13491 case 0:
13492 /* bltz 0x04000000 bgez 0x04010000
13493 bltzal 0x04100000 bgezal 0x04110000 */
13494 assert ((insn & 0xfc0e0000) == 0x04000000);
13495 insn ^= 0x00010000;
13496 break;
b34976b6 13497
4a6a3df4
AO
13498 case 1:
13499 /* beq 0x10000000 bne 0x14000000
13500 blez 0x18000000 bgtz 0x1c000000 */
13501 insn ^= 0x04000000;
13502 break;
13503
13504 default:
13505 abort ();
13506 }
13507 }
13508
13509 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
13510 {
13511 /* Clear the and-link bit. */
13512 assert ((insn & 0xfc1c0000) == 0x04100000);
13513
13514 /* bltzal 0x04100000 bgezal 0x04110000
13515 bltzall 0x04120000 bgezall 0x04130000 */
13516 insn &= ~0x00100000;
13517 }
13518
13519 /* Branch over the branch (if the branch was likely) or the
13520 full jump (not likely case). Compute the offset from the
13521 current instruction to branch to. */
13522 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13523 i = 16;
13524 else
13525 {
13526 /* How many bytes in instructions we've already emitted? */
13527 i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
13528 /* How many bytes in instructions from here to the end? */
13529 i = fragp->fr_var - i;
13530 }
13531 /* Convert to instruction count. */
13532 i >>= 2;
13533 /* Branch counts from the next instruction. */
b34976b6 13534 i--;
4a6a3df4
AO
13535 insn |= i;
13536 /* Branch over the jump. */
13537 md_number_to_chars ((char *)buf, insn, 4);
13538 buf += 4;
13539
13540 /* Nop */
13541 md_number_to_chars ((char*)buf, 0, 4);
13542 buf += 4;
13543
13544 if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13545 {
13546 /* beql $0, $0, 2f */
13547 insn = 0x50000000;
13548 /* Compute the PC offset from the current instruction to
13549 the end of the variable frag. */
13550 /* How many bytes in instructions we've already emitted? */
13551 i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
13552 /* How many bytes in instructions from here to the end? */
13553 i = fragp->fr_var - i;
13554 /* Convert to instruction count. */
13555 i >>= 2;
13556 /* Don't decrement i, because we want to branch over the
13557 delay slot. */
13558
13559 insn |= i;
13560 md_number_to_chars ((char *)buf, insn, 4);
13561 buf += 4;
13562
13563 md_number_to_chars ((char *)buf, 0, 4);
13564 buf += 4;
13565 }
13566
13567 uncond:
13568 if (mips_pic == NO_PIC)
13569 {
13570 /* j or jal. */
13571 insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
13572 ? 0x0c000000 : 0x08000000);
13573 exp.X_op = O_symbol;
13574 exp.X_add_symbol = fragp->fr_symbol;
13575 exp.X_add_number = fragp->fr_offset;
13576
13577 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13578 4, &exp, 0, BFD_RELOC_MIPS_JMP);
13579 fixp->fx_file = fragp->fr_file;
13580 fixp->fx_line = fragp->fr_line;
13581
13582 md_number_to_chars ((char*)buf, insn, 4);
13583 buf += 4;
13584 }
13585 else
13586 {
13587 /* lw/ld $at, <sym>($gp) R_MIPS_GOT16 */
13588 insn = HAVE_64BIT_ADDRESSES ? 0xdf810000 : 0x8f810000;
13589 exp.X_op = O_symbol;
13590 exp.X_add_symbol = fragp->fr_symbol;
13591 exp.X_add_number = fragp->fr_offset;
13592
13593 if (fragp->fr_offset)
13594 {
13595 exp.X_add_symbol = make_expr_symbol (&exp);
13596 exp.X_add_number = 0;
13597 }
13598
13599 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13600 4, &exp, 0, BFD_RELOC_MIPS_GOT16);
13601 fixp->fx_file = fragp->fr_file;
13602 fixp->fx_line = fragp->fr_line;
13603
13604 md_number_to_chars ((char*)buf, insn, 4);
13605 buf += 4;
b34976b6 13606
4a6a3df4
AO
13607 if (mips_opts.isa == ISA_MIPS1)
13608 {
13609 /* nop */
13610 md_number_to_chars ((char*)buf, 0, 4);
13611 buf += 4;
13612 }
13613
13614 /* d/addiu $at, $at, <sym> R_MIPS_LO16 */
13615 insn = HAVE_64BIT_ADDRESSES ? 0x64210000 : 0x24210000;
13616
13617 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13618 4, &exp, 0, BFD_RELOC_LO16);
13619 fixp->fx_file = fragp->fr_file;
13620 fixp->fx_line = fragp->fr_line;
b34976b6 13621
4a6a3df4
AO
13622 md_number_to_chars ((char*)buf, insn, 4);
13623 buf += 4;
13624
13625 /* j(al)r $at. */
13626 if (RELAX_BRANCH_LINK (fragp->fr_subtype))
13627 insn = 0x0020f809;
13628 else
13629 insn = 0x00200008;
13630
13631 md_number_to_chars ((char*)buf, insn, 4);
13632 buf += 4;
13633 }
13634 }
13635
13636 assert (buf == (bfd_byte *)fragp->fr_literal
13637 + fragp->fr_fix + fragp->fr_var);
13638
13639 fragp->fr_fix += fragp->fr_var;
13640
13641 return;
13642 }
13643
252b5132
RH
13644 if (RELAX_MIPS16_P (fragp->fr_subtype))
13645 {
13646 int type;
13647 register const struct mips16_immed_operand *op;
b34976b6 13648 bfd_boolean small, ext;
252b5132
RH
13649 offsetT val;
13650 bfd_byte *buf;
13651 unsigned long insn;
b34976b6 13652 bfd_boolean use_extend;
252b5132
RH
13653 unsigned short extend;
13654
13655 type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13656 op = mips16_immed_operands;
13657 while (op->type != type)
13658 ++op;
13659
13660 if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13661 {
b34976b6
AM
13662 small = FALSE;
13663 ext = TRUE;
252b5132
RH
13664 }
13665 else
13666 {
b34976b6
AM
13667 small = TRUE;
13668 ext = FALSE;
252b5132
RH
13669 }
13670
6386f3a7 13671 resolve_symbol_value (fragp->fr_symbol);
252b5132
RH
13672 val = S_GET_VALUE (fragp->fr_symbol);
13673 if (op->pcrel)
13674 {
13675 addressT addr;
13676
13677 addr = fragp->fr_address + fragp->fr_fix;
13678
13679 /* The rules for the base address of a PC relative reloc are
13680 complicated; see mips16_extended_frag. */
13681 if (type == 'p' || type == 'q')
13682 {
13683 addr += 2;
13684 if (ext)
13685 addr += 2;
13686 /* Ignore the low bit in the target, since it will be
13687 set for a text label. */
13688 if ((val & 1) != 0)
13689 --val;
13690 }
13691 else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13692 addr -= 4;
13693 else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13694 addr -= 2;
13695
13696 addr &= ~ (addressT) ((1 << op->shift) - 1);
13697 val -= addr;
13698
13699 /* Make sure the section winds up with the alignment we have
13700 assumed. */
13701 if (op->shift > 0)
13702 record_alignment (asec, op->shift);
13703 }
13704
13705 if (ext
13706 && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
13707 || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
13708 as_warn_where (fragp->fr_file, fragp->fr_line,
13709 _("extended instruction in delay slot"));
13710
13711 buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
13712
13713 if (target_big_endian)
13714 insn = bfd_getb16 (buf);
13715 else
13716 insn = bfd_getl16 (buf);
13717
13718 mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
13719 RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
13720 small, ext, &insn, &use_extend, &extend);
13721
13722 if (use_extend)
13723 {
874e8986 13724 md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
252b5132
RH
13725 fragp->fr_fix += 2;
13726 buf += 2;
13727 }
13728
874e8986 13729 md_number_to_chars ((char *) buf, insn, 2);
252b5132
RH
13730 fragp->fr_fix += 2;
13731 buf += 2;
13732 }
13733 else
13734 {
13735 if (fragp->fr_opcode == NULL)
13736 return;
13737
13738 old = RELAX_OLD (fragp->fr_subtype);
13739 new = RELAX_NEW (fragp->fr_subtype);
13740 fixptr = fragp->fr_literal + fragp->fr_fix;
13741
13742 if (new > 0)
13743 memcpy (fixptr - old, fixptr, new);
13744
13745 fragp->fr_fix += new - old;
13746 }
13747}
13748
13749#ifdef OBJ_ELF
13750
13751/* This function is called after the relocs have been generated.
13752 We've been storing mips16 text labels as odd. Here we convert them
13753 back to even for the convenience of the debugger. */
13754
13755void
13756mips_frob_file_after_relocs ()
13757{
13758 asymbol **syms;
13759 unsigned int count, i;
13760
13761 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
13762 return;
13763
13764 syms = bfd_get_outsymbols (stdoutput);
13765 count = bfd_get_symcount (stdoutput);
13766 for (i = 0; i < count; i++, syms++)
13767 {
13768 if (elf_symbol (*syms)->internal_elf_sym.st_other == STO_MIPS16
13769 && ((*syms)->value & 1) != 0)
13770 {
13771 (*syms)->value &= ~1;
13772 /* If the symbol has an odd size, it was probably computed
13773 incorrectly, so adjust that as well. */
13774 if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
13775 ++elf_symbol (*syms)->internal_elf_sym.st_size;
13776 }
13777 }
13778}
13779
13780#endif
13781
13782/* This function is called whenever a label is defined. It is used
13783 when handling branch delays; if a branch has a label, we assume we
13784 can not move it. */
13785
13786void
13787mips_define_label (sym)
13788 symbolS *sym;
13789{
13790 struct insn_label_list *l;
13791
13792 if (free_insn_labels == NULL)
13793 l = (struct insn_label_list *) xmalloc (sizeof *l);
13794 else
13795 {
13796 l = free_insn_labels;
13797 free_insn_labels = l->next;
13798 }
13799
13800 l->label = sym;
13801 l->next = insn_labels;
13802 insn_labels = l;
13803}
13804\f
13805#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13806
13807/* Some special processing for a MIPS ELF file. */
13808
13809void
13810mips_elf_final_processing ()
13811{
13812 /* Write out the register information. */
316f5878 13813 if (mips_abi != N64_ABI)
252b5132
RH
13814 {
13815 Elf32_RegInfo s;
13816
13817 s.ri_gprmask = mips_gprmask;
13818 s.ri_cprmask[0] = mips_cprmask[0];
13819 s.ri_cprmask[1] = mips_cprmask[1];
13820 s.ri_cprmask[2] = mips_cprmask[2];
13821 s.ri_cprmask[3] = mips_cprmask[3];
13822 /* The gp_value field is set by the MIPS ELF backend. */
13823
13824 bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
13825 ((Elf32_External_RegInfo *)
13826 mips_regmask_frag));
13827 }
13828 else
13829 {
13830 Elf64_Internal_RegInfo s;
13831
13832 s.ri_gprmask = mips_gprmask;
13833 s.ri_pad = 0;
13834 s.ri_cprmask[0] = mips_cprmask[0];
13835 s.ri_cprmask[1] = mips_cprmask[1];
13836 s.ri_cprmask[2] = mips_cprmask[2];
13837 s.ri_cprmask[3] = mips_cprmask[3];
13838 /* The gp_value field is set by the MIPS ELF backend. */
13839
13840 bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
13841 ((Elf64_External_RegInfo *)
13842 mips_regmask_frag));
13843 }
13844
13845 /* Set the MIPS ELF flag bits. FIXME: There should probably be some
13846 sort of BFD interface for this. */
13847 if (mips_any_noreorder)
13848 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
13849 if (mips_pic != NO_PIC)
13850 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
13851
98d3f06f 13852 /* Set MIPS ELF flags for ASEs. */
a4672219
TS
13853 if (file_ase_mips16)
13854 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
1f25f5d3
CD
13855#if 0 /* XXX FIXME */
13856 if (file_ase_mips3d)
13857 elf_elfheader (stdoutput)->e_flags |= ???;
13858#endif
deec1734
CD
13859 if (file_ase_mdmx)
13860 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
1f25f5d3 13861
bdaaa2e1 13862 /* Set the MIPS ELF ABI flags. */
316f5878 13863 if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
252b5132 13864 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
316f5878 13865 else if (mips_abi == O64_ABI)
252b5132 13866 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
316f5878 13867 else if (mips_abi == EABI_ABI)
252b5132 13868 {
316f5878 13869 if (!file_mips_gp32)
252b5132
RH
13870 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
13871 else
13872 elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
13873 }
316f5878 13874 else if (mips_abi == N32_ABI)
be00bddd
TS
13875 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
13876
c9914766 13877 /* Nothing to do for N64_ABI. */
252b5132
RH
13878
13879 if (mips_32bitmode)
13880 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
13881}
13882
13883#endif /* OBJ_ELF || OBJ_MAYBE_ELF */
13884\f
beae10d5
KH
13885typedef struct proc {
13886 symbolS *isym;
13887 unsigned long reg_mask;
13888 unsigned long reg_offset;
13889 unsigned long fpreg_mask;
13890 unsigned long fpreg_offset;
13891 unsigned long frame_offset;
13892 unsigned long frame_reg;
13893 unsigned long pc_reg;
13894} procS;
252b5132
RH
13895
13896static procS cur_proc;
13897static procS *cur_proc_ptr;
13898static int numprocs;
13899
0a9ef439 13900/* Fill in an rs_align_code fragment. */
a19d8eb0 13901
0a9ef439
RH
13902void
13903mips_handle_align (fragp)
13904 fragS *fragp;
a19d8eb0 13905{
0a9ef439
RH
13906 if (fragp->fr_type != rs_align_code)
13907 return;
13908
13909 if (mips_opts.mips16)
a19d8eb0
CP
13910 {
13911 static const unsigned char be_nop[] = { 0x65, 0x00 };
13912 static const unsigned char le_nop[] = { 0x00, 0x65 };
13913
0a9ef439
RH
13914 int bytes;
13915 char *p;
a19d8eb0 13916
0a9ef439
RH
13917 bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
13918 p = fragp->fr_literal + fragp->fr_fix;
13919
13920 if (bytes & 1)
13921 {
13922 *p++ = 0;
f9419b05 13923 fragp->fr_fix++;
0a9ef439
RH
13924 }
13925
13926 memcpy (p, (target_big_endian ? be_nop : le_nop), 2);
13927 fragp->fr_var = 2;
a19d8eb0
CP
13928 }
13929
0a9ef439 13930 /* For mips32, a nop is a zero, which we trivially get by doing nothing. */
a19d8eb0
CP
13931}
13932
252b5132
RH
13933static void
13934md_obj_begin ()
13935{
13936}
13937
13938static void
13939md_obj_end ()
13940{
13941 /* check for premature end, nesting errors, etc */
13942 if (cur_proc_ptr)
9a41af64 13943 as_warn (_("missing .end at end of assembly"));
252b5132
RH
13944}
13945
13946static long
13947get_number ()
13948{
13949 int negative = 0;
13950 long val = 0;
13951
13952 if (*input_line_pointer == '-')
13953 {
13954 ++input_line_pointer;
13955 negative = 1;
13956 }
3882b010 13957 if (!ISDIGIT (*input_line_pointer))
956cd1d6 13958 as_bad (_("expected simple number"));
252b5132
RH
13959 if (input_line_pointer[0] == '0')
13960 {
13961 if (input_line_pointer[1] == 'x')
13962 {
13963 input_line_pointer += 2;
3882b010 13964 while (ISXDIGIT (*input_line_pointer))
252b5132
RH
13965 {
13966 val <<= 4;
13967 val |= hex_value (*input_line_pointer++);
13968 }
13969 return negative ? -val : val;
13970 }
13971 else
13972 {
13973 ++input_line_pointer;
3882b010 13974 while (ISDIGIT (*input_line_pointer))
252b5132
RH
13975 {
13976 val <<= 3;
13977 val |= *input_line_pointer++ - '0';
13978 }
13979 return negative ? -val : val;
13980 }
13981 }
3882b010 13982 if (!ISDIGIT (*input_line_pointer))
252b5132
RH
13983 {
13984 printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
13985 *input_line_pointer, *input_line_pointer);
956cd1d6 13986 as_warn (_("invalid number"));
252b5132
RH
13987 return -1;
13988 }
3882b010 13989 while (ISDIGIT (*input_line_pointer))
252b5132
RH
13990 {
13991 val *= 10;
13992 val += *input_line_pointer++ - '0';
13993 }
13994 return negative ? -val : val;
13995}
13996
13997/* The .file directive; just like the usual .file directive, but there
c5dd6aab
DJ
13998 is an initial number which is the ECOFF file index. In the non-ECOFF
13999 case .file implies DWARF-2. */
14000
14001static void
14002s_mips_file (x)
14003 int x ATTRIBUTE_UNUSED;
14004{
ecb4347a
DJ
14005 static int first_file_directive = 0;
14006
c5dd6aab
DJ
14007 if (ECOFF_DEBUGGING)
14008 {
14009 get_number ();
14010 s_app_file (0);
14011 }
14012 else
ecb4347a
DJ
14013 {
14014 char *filename;
14015
14016 filename = dwarf2_directive_file (0);
14017
14018 /* Versions of GCC up to 3.1 start files with a ".file"
14019 directive even for stabs output. Make sure that this
14020 ".file" is handled. Note that you need a version of GCC
14021 after 3.1 in order to support DWARF-2 on MIPS. */
14022 if (filename != NULL && ! first_file_directive)
14023 {
14024 (void) new_logical_line (filename, -1);
14025 s_app_file_string (filename);
14026 }
14027 first_file_directive = 1;
14028 }
c5dd6aab
DJ
14029}
14030
14031/* The .loc directive, implying DWARF-2. */
252b5132
RH
14032
14033static void
c5dd6aab 14034s_mips_loc (x)
43841e91 14035 int x ATTRIBUTE_UNUSED;
252b5132 14036{
c5dd6aab
DJ
14037 if (!ECOFF_DEBUGGING)
14038 dwarf2_directive_loc (0);
252b5132
RH
14039}
14040
252b5132
RH
14041/* The .end directive. */
14042
14043static void
14044s_mips_end (x)
43841e91 14045 int x ATTRIBUTE_UNUSED;
252b5132
RH
14046{
14047 symbolS *p;
14048 int maybe_text;
14049
7a621144
DJ
14050 /* Following functions need their own .frame and .cprestore directives. */
14051 mips_frame_reg_valid = 0;
14052 mips_cprestore_valid = 0;
14053
252b5132
RH
14054 if (!is_end_of_line[(unsigned char) *input_line_pointer])
14055 {
14056 p = get_symbol ();
14057 demand_empty_rest_of_line ();
14058 }
14059 else
14060 p = NULL;
14061
14062#ifdef BFD_ASSEMBLER
14063 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
14064 maybe_text = 1;
14065 else
14066 maybe_text = 0;
14067#else
14068 if (now_seg != data_section && now_seg != bss_section)
14069 maybe_text = 1;
14070 else
14071 maybe_text = 0;
14072#endif
14073
14074 if (!maybe_text)
14075 as_warn (_(".end not in text section"));
14076
14077 if (!cur_proc_ptr)
14078 {
14079 as_warn (_(".end directive without a preceding .ent directive."));
14080 demand_empty_rest_of_line ();
14081 return;
14082 }
14083
14084 if (p != NULL)
14085 {
14086 assert (S_GET_NAME (p));
14087 if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->isym)))
14088 as_warn (_(".end symbol does not match .ent symbol."));
ecb4347a
DJ
14089
14090 if (debug_type == DEBUG_STABS)
14091 stabs_generate_asm_endfunc (S_GET_NAME (p),
14092 S_GET_NAME (p));
252b5132
RH
14093 }
14094 else
14095 as_warn (_(".end directive missing or unknown symbol"));
14096
ecb4347a
DJ
14097#ifdef OBJ_ELF
14098 /* Generate a .pdr section. */
14099 if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING)
14100 {
14101 segT saved_seg = now_seg;
14102 subsegT saved_subseg = now_subseg;
14103 valueT dot;
14104 expressionS exp;
14105 char *fragp;
252b5132 14106
ecb4347a 14107 dot = frag_now_fix ();
252b5132
RH
14108
14109#ifdef md_flush_pending_output
ecb4347a 14110 md_flush_pending_output ();
252b5132
RH
14111#endif
14112
ecb4347a
DJ
14113 assert (pdr_seg);
14114 subseg_set (pdr_seg, 0);
252b5132 14115
ecb4347a
DJ
14116 /* Write the symbol. */
14117 exp.X_op = O_symbol;
14118 exp.X_add_symbol = p;
14119 exp.X_add_number = 0;
14120 emit_expr (&exp, 4);
252b5132 14121
ecb4347a 14122 fragp = frag_more (7 * 4);
252b5132 14123
ecb4347a
DJ
14124 md_number_to_chars (fragp, (valueT) cur_proc_ptr->reg_mask, 4);
14125 md_number_to_chars (fragp + 4, (valueT) cur_proc_ptr->reg_offset, 4);
14126 md_number_to_chars (fragp + 8, (valueT) cur_proc_ptr->fpreg_mask, 4);
14127 md_number_to_chars (fragp + 12, (valueT) cur_proc_ptr->fpreg_offset, 4);
14128 md_number_to_chars (fragp + 16, (valueT) cur_proc_ptr->frame_offset, 4);
14129 md_number_to_chars (fragp + 20, (valueT) cur_proc_ptr->frame_reg, 4);
14130 md_number_to_chars (fragp + 24, (valueT) cur_proc_ptr->pc_reg, 4);
252b5132 14131
ecb4347a
DJ
14132 subseg_set (saved_seg, saved_subseg);
14133 }
14134#endif /* OBJ_ELF */
252b5132
RH
14135
14136 cur_proc_ptr = NULL;
14137}
14138
14139/* The .aent and .ent directives. */
14140
14141static void
14142s_mips_ent (aent)
14143 int aent;
14144{
252b5132
RH
14145 symbolS *symbolP;
14146 int maybe_text;
14147
14148 symbolP = get_symbol ();
14149 if (*input_line_pointer == ',')
f9419b05 14150 ++input_line_pointer;
252b5132 14151 SKIP_WHITESPACE ();
3882b010 14152 if (ISDIGIT (*input_line_pointer)
d9a62219 14153 || *input_line_pointer == '-')
874e8986 14154 get_number ();
252b5132
RH
14155
14156#ifdef BFD_ASSEMBLER
14157 if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
14158 maybe_text = 1;
14159 else
14160 maybe_text = 0;
14161#else
14162 if (now_seg != data_section && now_seg != bss_section)
14163 maybe_text = 1;
14164 else
14165 maybe_text = 0;
14166#endif
14167
14168 if (!maybe_text)
14169 as_warn (_(".ent or .aent not in text section."));
14170
14171 if (!aent && cur_proc_ptr)
9a41af64 14172 as_warn (_("missing .end"));
252b5132
RH
14173
14174 if (!aent)
14175 {
7a621144
DJ
14176 /* This function needs its own .frame and .cprestore directives. */
14177 mips_frame_reg_valid = 0;
14178 mips_cprestore_valid = 0;
14179
252b5132
RH
14180 cur_proc_ptr = &cur_proc;
14181 memset (cur_proc_ptr, '\0', sizeof (procS));
14182
14183 cur_proc_ptr->isym = symbolP;
14184
49309057 14185 symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
252b5132 14186
f9419b05 14187 ++numprocs;
ecb4347a
DJ
14188
14189 if (debug_type == DEBUG_STABS)
14190 stabs_generate_asm_func (S_GET_NAME (symbolP),
14191 S_GET_NAME (symbolP));
252b5132
RH
14192 }
14193
14194 demand_empty_rest_of_line ();
14195}
14196
14197/* The .frame directive. If the mdebug section is present (IRIX 5 native)
bdaaa2e1 14198 then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
252b5132 14199 s_mips_frame is used so that we can set the PDR information correctly.
bdaaa2e1 14200 We can't use the ecoff routines because they make reference to the ecoff
252b5132
RH
14201 symbol table (in the mdebug section). */
14202
14203static void
14204s_mips_frame (ignore)
2b3c5a5d 14205 int ignore ATTRIBUTE_UNUSED;
252b5132 14206{
ecb4347a
DJ
14207#ifdef OBJ_ELF
14208 if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING)
14209 {
14210 long val;
252b5132 14211
ecb4347a
DJ
14212 if (cur_proc_ptr == (procS *) NULL)
14213 {
14214 as_warn (_(".frame outside of .ent"));
14215 demand_empty_rest_of_line ();
14216 return;
14217 }
252b5132 14218
ecb4347a
DJ
14219 cur_proc_ptr->frame_reg = tc_get_register (1);
14220
14221 SKIP_WHITESPACE ();
14222 if (*input_line_pointer++ != ','
14223 || get_absolute_expression_and_terminator (&val) != ',')
14224 {
14225 as_warn (_("Bad .frame directive"));
14226 --input_line_pointer;
14227 demand_empty_rest_of_line ();
14228 return;
14229 }
252b5132 14230
ecb4347a
DJ
14231 cur_proc_ptr->frame_offset = val;
14232 cur_proc_ptr->pc_reg = tc_get_register (0);
252b5132 14233
252b5132 14234 demand_empty_rest_of_line ();
252b5132 14235 }
ecb4347a
DJ
14236 else
14237#endif /* OBJ_ELF */
14238 s_ignore (ignore);
252b5132
RH
14239}
14240
bdaaa2e1
KH
14241/* The .fmask and .mask directives. If the mdebug section is present
14242 (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
252b5132 14243 embedded targets, s_mips_mask is used so that we can set the PDR
bdaaa2e1 14244 information correctly. We can't use the ecoff routines because they
252b5132
RH
14245 make reference to the ecoff symbol table (in the mdebug section). */
14246
14247static void
14248s_mips_mask (reg_type)
14249 char reg_type;
14250{
ecb4347a
DJ
14251#ifdef OBJ_ELF
14252 if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING)
252b5132 14253 {
ecb4347a 14254 long mask, off;
252b5132 14255
ecb4347a
DJ
14256 if (cur_proc_ptr == (procS *) NULL)
14257 {
14258 as_warn (_(".mask/.fmask outside of .ent"));
14259 demand_empty_rest_of_line ();
14260 return;
14261 }
252b5132 14262
ecb4347a
DJ
14263 if (get_absolute_expression_and_terminator (&mask) != ',')
14264 {
14265 as_warn (_("Bad .mask/.fmask directive"));
14266 --input_line_pointer;
14267 demand_empty_rest_of_line ();
14268 return;
14269 }
252b5132 14270
ecb4347a
DJ
14271 off = get_absolute_expression ();
14272
14273 if (reg_type == 'F')
14274 {
14275 cur_proc_ptr->fpreg_mask = mask;
14276 cur_proc_ptr->fpreg_offset = off;
14277 }
14278 else
14279 {
14280 cur_proc_ptr->reg_mask = mask;
14281 cur_proc_ptr->reg_offset = off;
14282 }
14283
14284 demand_empty_rest_of_line ();
252b5132
RH
14285 }
14286 else
ecb4347a
DJ
14287#endif /* OBJ_ELF */
14288 s_ignore (reg_type);
252b5132
RH
14289}
14290
14291/* The .loc directive. */
14292
14293#if 0
14294static void
14295s_loc (x)
14296 int x;
14297{
14298 symbolS *symbolP;
14299 int lineno;
14300 int addroff;
14301
14302 assert (now_seg == text_section);
14303
14304 lineno = get_number ();
14305 addroff = frag_now_fix ();
14306
14307 symbolP = symbol_new ("", N_SLINE, addroff, frag_now);
14308 S_SET_TYPE (symbolP, N_SLINE);
14309 S_SET_OTHER (symbolP, 0);
14310 S_SET_DESC (symbolP, lineno);
14311 symbolP->sy_segment = now_seg;
14312}
14313#endif
e7af610e 14314
316f5878
RS
14315/* A table describing all the processors gas knows about. Names are
14316 matched in the order listed.
e7af610e 14317
316f5878
RS
14318 To ease comparison, please keep this table in the same order as
14319 gcc's mips_cpu_info_table[]. */
e972090a
NC
14320static const struct mips_cpu_info mips_cpu_info_table[] =
14321{
316f5878
RS
14322 /* Entries for generic ISAs */
14323 { "mips1", 1, ISA_MIPS1, CPU_R3000 },
14324 { "mips2", 1, ISA_MIPS2, CPU_R6000 },
14325 { "mips3", 1, ISA_MIPS3, CPU_R4000 },
14326 { "mips4", 1, ISA_MIPS4, CPU_R8000 },
14327 { "mips5", 1, ISA_MIPS5, CPU_MIPS5 },
14328 { "mips32", 1, ISA_MIPS32, CPU_MIPS32 },
af7ee8bf 14329 { "mips32r2", 1, ISA_MIPS32R2, CPU_MIPS32R2 },
316f5878
RS
14330 { "mips64", 1, ISA_MIPS64, CPU_MIPS64 },
14331
14332 /* MIPS I */
14333 { "r3000", 0, ISA_MIPS1, CPU_R3000 },
14334 { "r2000", 0, ISA_MIPS1, CPU_R3000 },
14335 { "r3900", 0, ISA_MIPS1, CPU_R3900 },
14336
14337 /* MIPS II */
14338 { "r6000", 0, ISA_MIPS2, CPU_R6000 },
14339
14340 /* MIPS III */
14341 { "r4000", 0, ISA_MIPS3, CPU_R4000 },
14342 { "r4010", 0, ISA_MIPS2, CPU_R4010 },
14343 { "vr4100", 0, ISA_MIPS3, CPU_VR4100 },
14344 { "vr4111", 0, ISA_MIPS3, CPU_R4111 },
60b63b72
RS
14345 { "vr4120", 0, ISA_MIPS3, CPU_VR4120 },
14346 { "vr4130", 0, ISA_MIPS3, CPU_VR4120 },
14347 { "vr4181", 0, ISA_MIPS3, CPU_R4111 },
316f5878
RS
14348 { "vr4300", 0, ISA_MIPS3, CPU_R4300 },
14349 { "r4400", 0, ISA_MIPS3, CPU_R4400 },
14350 { "r4600", 0, ISA_MIPS3, CPU_R4600 },
14351 { "orion", 0, ISA_MIPS3, CPU_R4600 },
14352 { "r4650", 0, ISA_MIPS3, CPU_R4650 },
14353
14354 /* MIPS IV */
14355 { "r8000", 0, ISA_MIPS4, CPU_R8000 },
14356 { "r10000", 0, ISA_MIPS4, CPU_R10000 },
14357 { "r12000", 0, ISA_MIPS4, CPU_R12000 },
14358 { "vr5000", 0, ISA_MIPS4, CPU_R5000 },
60b63b72
RS
14359 { "vr5400", 0, ISA_MIPS4, CPU_VR5400 },
14360 { "vr5500", 0, ISA_MIPS4, CPU_VR5500 },
316f5878
RS
14361 { "rm5200", 0, ISA_MIPS4, CPU_R5000 },
14362 { "rm5230", 0, ISA_MIPS4, CPU_R5000 },
14363 { "rm5231", 0, ISA_MIPS4, CPU_R5000 },
14364 { "rm5261", 0, ISA_MIPS4, CPU_R5000 },
14365 { "rm5721", 0, ISA_MIPS4, CPU_R5000 },
14366 { "r7000", 0, ISA_MIPS4, CPU_R5000 },
14367
14368 /* MIPS 32 */
14369 { "4kc", 0, ISA_MIPS32, CPU_MIPS32, },
14370 { "4km", 0, ISA_MIPS32, CPU_MIPS32 },
14371 { "4kp", 0, ISA_MIPS32, CPU_MIPS32 },
e7af610e 14372
316f5878
RS
14373 /* MIPS 64 */
14374 { "5kc", 0, ISA_MIPS64, CPU_MIPS64 },
14375 { "20kc", 0, ISA_MIPS64, CPU_MIPS64 },
e7af610e 14376
c7a23324 14377 /* Broadcom SB-1 CPU core */
316f5878 14378 { "sb1", 0, ISA_MIPS64, CPU_SB1 },
e7af610e 14379
316f5878
RS
14380 /* End marker */
14381 { NULL, 0, 0, 0 }
14382};
e7af610e 14383
84ea6cf2 14384
316f5878
RS
14385/* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
14386 with a final "000" replaced by "k". Ignore case.
e7af610e 14387
316f5878 14388 Note: this function is shared between GCC and GAS. */
c6c98b38 14389
b34976b6 14390static bfd_boolean
316f5878
RS
14391mips_strict_matching_cpu_name_p (canonical, given)
14392 const char *canonical, *given;
14393{
14394 while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
14395 given++, canonical++;
14396
14397 return ((*given == 0 && *canonical == 0)
14398 || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
14399}
14400
14401
14402/* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
14403 CPU name. We've traditionally allowed a lot of variation here.
14404
14405 Note: this function is shared between GCC and GAS. */
14406
b34976b6 14407static bfd_boolean
316f5878
RS
14408mips_matching_cpu_name_p (canonical, given)
14409 const char *canonical, *given;
14410{
14411 /* First see if the name matches exactly, or with a final "000"
14412 turned into "k". */
14413 if (mips_strict_matching_cpu_name_p (canonical, given))
b34976b6 14414 return TRUE;
316f5878
RS
14415
14416 /* If not, try comparing based on numerical designation alone.
14417 See if GIVEN is an unadorned number, or 'r' followed by a number. */
14418 if (TOLOWER (*given) == 'r')
14419 given++;
14420 if (!ISDIGIT (*given))
b34976b6 14421 return FALSE;
316f5878
RS
14422
14423 /* Skip over some well-known prefixes in the canonical name,
14424 hoping to find a number there too. */
14425 if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
14426 canonical += 2;
14427 else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
14428 canonical += 2;
14429 else if (TOLOWER (canonical[0]) == 'r')
14430 canonical += 1;
14431
14432 return mips_strict_matching_cpu_name_p (canonical, given);
14433}
14434
14435
14436/* Parse an option that takes the name of a processor as its argument.
14437 OPTION is the name of the option and CPU_STRING is the argument.
14438 Return the corresponding processor enumeration if the CPU_STRING is
14439 recognized, otherwise report an error and return null.
14440
14441 A similar function exists in GCC. */
e7af610e
NC
14442
14443static const struct mips_cpu_info *
316f5878
RS
14444mips_parse_cpu (option, cpu_string)
14445 const char *option, *cpu_string;
e7af610e 14446{
316f5878 14447 const struct mips_cpu_info *p;
e7af610e 14448
316f5878
RS
14449 /* 'from-abi' selects the most compatible architecture for the given
14450 ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs. For the
14451 EABIs, we have to decide whether we're using the 32-bit or 64-bit
14452 version. Look first at the -mgp options, if given, otherwise base
14453 the choice on MIPS_DEFAULT_64BIT.
e7af610e 14454
316f5878
RS
14455 Treat NO_ABI like the EABIs. One reason to do this is that the
14456 plain 'mips' and 'mips64' configs have 'from-abi' as their default
14457 architecture. This code picks MIPS I for 'mips' and MIPS III for
14458 'mips64', just as we did in the days before 'from-abi'. */
14459 if (strcasecmp (cpu_string, "from-abi") == 0)
14460 {
14461 if (ABI_NEEDS_32BIT_REGS (mips_abi))
14462 return mips_cpu_info_from_isa (ISA_MIPS1);
14463
14464 if (ABI_NEEDS_64BIT_REGS (mips_abi))
14465 return mips_cpu_info_from_isa (ISA_MIPS3);
14466
14467 if (file_mips_gp32 >= 0)
14468 return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
14469
14470 return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
14471 ? ISA_MIPS3
14472 : ISA_MIPS1);
14473 }
14474
14475 /* 'default' has traditionally been a no-op. Probably not very useful. */
14476 if (strcasecmp (cpu_string, "default") == 0)
14477 return 0;
14478
14479 for (p = mips_cpu_info_table; p->name != 0; p++)
14480 if (mips_matching_cpu_name_p (p->name, cpu_string))
14481 return p;
14482
14483 as_bad ("Bad value (%s) for %s", cpu_string, option);
14484 return 0;
e7af610e
NC
14485}
14486
316f5878
RS
14487/* Return the canonical processor information for ISA (a member of the
14488 ISA_MIPS* enumeration). */
14489
e7af610e
NC
14490static const struct mips_cpu_info *
14491mips_cpu_info_from_isa (isa)
14492 int isa;
14493{
14494 int i;
14495
14496 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
14497 if (mips_cpu_info_table[i].is_isa
316f5878 14498 && isa == mips_cpu_info_table[i].isa)
e7af610e
NC
14499 return (&mips_cpu_info_table[i]);
14500
e972090a 14501 return NULL;
e7af610e 14502}
316f5878
RS
14503\f
14504static void
14505show (stream, string, col_p, first_p)
14506 FILE *stream;
14507 const char *string;
14508 int *col_p;
14509 int *first_p;
14510{
14511 if (*first_p)
14512 {
14513 fprintf (stream, "%24s", "");
14514 *col_p = 24;
14515 }
14516 else
14517 {
14518 fprintf (stream, ", ");
14519 *col_p += 2;
14520 }
e7af610e 14521
316f5878
RS
14522 if (*col_p + strlen (string) > 72)
14523 {
14524 fprintf (stream, "\n%24s", "");
14525 *col_p = 24;
14526 }
14527
14528 fprintf (stream, "%s", string);
14529 *col_p += strlen (string);
14530
14531 *first_p = 0;
14532}
14533
14534void
14535md_show_usage (stream)
14536 FILE *stream;
e7af610e 14537{
316f5878
RS
14538 int column, first;
14539 size_t i;
14540
14541 fprintf (stream, _("\
14542MIPS options:\n\
14543-membedded-pic generate embedded position independent code\n\
14544-EB generate big endian output\n\
14545-EL generate little endian output\n\
14546-g, -g2 do not remove unneeded NOPs or swap branches\n\
14547-G NUM allow referencing objects up to NUM bytes\n\
14548 implicitly with the gp register [default 8]\n"));
14549 fprintf (stream, _("\
14550-mips1 generate MIPS ISA I instructions\n\
14551-mips2 generate MIPS ISA II instructions\n\
14552-mips3 generate MIPS ISA III instructions\n\
14553-mips4 generate MIPS ISA IV instructions\n\
14554-mips5 generate MIPS ISA V instructions\n\
14555-mips32 generate MIPS32 ISA instructions\n\
af7ee8bf 14556-mips32r2 generate MIPS32 release 2 ISA instructions\n\
316f5878
RS
14557-mips64 generate MIPS64 ISA instructions\n\
14558-march=CPU/-mtune=CPU generate code/schedule for CPU, where CPU is one of:\n"));
14559
14560 first = 1;
e7af610e
NC
14561
14562 for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
316f5878
RS
14563 show (stream, mips_cpu_info_table[i].name, &column, &first);
14564 show (stream, "from-abi", &column, &first);
14565 fputc ('\n', stream);
e7af610e 14566
316f5878
RS
14567 fprintf (stream, _("\
14568-mCPU equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
14569-no-mCPU don't generate code specific to CPU.\n\
14570 For -mCPU and -no-mCPU, CPU must be one of:\n"));
14571
14572 first = 1;
14573
14574 show (stream, "3900", &column, &first);
14575 show (stream, "4010", &column, &first);
14576 show (stream, "4100", &column, &first);
14577 show (stream, "4650", &column, &first);
14578 fputc ('\n', stream);
14579
14580 fprintf (stream, _("\
14581-mips16 generate mips16 instructions\n\
14582-no-mips16 do not generate mips16 instructions\n"));
14583 fprintf (stream, _("\
14584-mgp32 use 32-bit GPRs, regardless of the chosen ISA\n\
14585-mfp32 use 32-bit FPRs, regardless of the chosen ISA\n\
14586-O0 remove unneeded NOPs, do not swap branches\n\
14587-O remove unneeded NOPs and swap branches\n\
14588-n warn about NOPs generated from macros\n\
14589--[no-]construct-floats [dis]allow floating point values to be constructed\n\
14590--trap, --no-break trap exception on div by 0 and mult overflow\n\
14591--break, --no-trap break exception on div by 0 and mult overflow\n"));
14592#ifdef OBJ_ELF
14593 fprintf (stream, _("\
14594-KPIC, -call_shared generate SVR4 position independent code\n\
14595-non_shared do not generate position independent code\n\
14596-xgot assume a 32 bit GOT\n\
14597-mabi=ABI create ABI conformant object file for:\n"));
14598
14599 first = 1;
14600
14601 show (stream, "32", &column, &first);
14602 show (stream, "o64", &column, &first);
14603 show (stream, "n32", &column, &first);
14604 show (stream, "64", &column, &first);
14605 show (stream, "eabi", &column, &first);
14606
14607 fputc ('\n', stream);
14608
14609 fprintf (stream, _("\
14610-32 create o32 ABI object file (default)\n\
14611-n32 create n32 ABI object file\n\
14612-64 create 64 ABI object file\n"));
14613#endif
e7af610e 14614}
14e777e0
KB
14615
14616enum dwarf2_format
14617mips_dwarf2_format ()
14618{
14619 if (mips_abi == N64_ABI)
1de5b6a1
AO
14620 {
14621#ifdef TE_IRIX
14622 return dwarf2_format_64bit_irix;
14623#else
14624 return dwarf2_format_64bit;
14625#endif
14626 }
14e777e0
KB
14627 else
14628 return dwarf2_format_32bit;
14629}
This page took 1.061459 seconds and 4 git commands to generate.