OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [gas/] [config/] [tc-mips.c] - Blame information for rev 21

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 16 khays
/* tc-mips.c -- assemble code for a MIPS chip.
2
   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3
   2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4
   Free Software Foundation, Inc.
5
   Contributed by the OSF and Ralph Campbell.
6
   Written by Keith Knowles and Ralph Campbell, working independently.
7
   Modified for ECOFF and R4000 support by Ian Lance Taylor of Cygnus
8
   Support.
9
 
10
   This file is part of GAS.
11
 
12
   GAS is free software; you can redistribute it and/or modify
13
   it under the terms of the GNU General Public License as published by
14
   the Free Software Foundation; either version 3, or (at your option)
15
   any later version.
16
 
17
   GAS is distributed in the hope that it will be useful,
18
   but WITHOUT ANY WARRANTY; without even the implied warranty of
19
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20
   GNU General Public License for more details.
21
 
22
   You should have received a copy of the GNU General Public License
23
   along with GAS; see the file COPYING.  If not, write to the Free
24
   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
25
   02110-1301, USA.  */
26
 
27
#include "as.h"
28
#include "config.h"
29
#include "subsegs.h"
30
#include "safe-ctype.h"
31
 
32
#include "opcode/mips.h"
33
#include "itbl-ops.h"
34
#include "dwarf2dbg.h"
35
#include "dw2gencfi.h"
36
 
37
#ifdef DEBUG
38
#define DBG(x) printf x
39
#else
40
#define DBG(x)
41
#endif
42
 
43
#ifdef OBJ_MAYBE_ELF
44
/* Clean up namespace so we can include obj-elf.h too.  */
45
static int mips_output_flavor (void);
46
static int mips_output_flavor (void) { return OUTPUT_FLAVOR; }
47
#undef OBJ_PROCESS_STAB
48
#undef OUTPUT_FLAVOR
49
#undef S_GET_ALIGN
50
#undef S_GET_SIZE
51
#undef S_SET_ALIGN
52
#undef S_SET_SIZE
53
#undef obj_frob_file
54
#undef obj_frob_file_after_relocs
55
#undef obj_frob_symbol
56
#undef obj_pop_insert
57
#undef obj_sec_sym_ok_for_reloc
58
#undef OBJ_COPY_SYMBOL_ATTRIBUTES
59
 
60
#include "obj-elf.h"
61
/* Fix any of them that we actually care about.  */
62
#undef OUTPUT_FLAVOR
63
#define OUTPUT_FLAVOR mips_output_flavor()
64
#endif
65
 
66
#if defined (OBJ_ELF)
67
#include "elf/mips.h"
68
#endif
69
 
70
#ifndef ECOFF_DEBUGGING
71
#define NO_ECOFF_DEBUGGING
72
#define ECOFF_DEBUGGING 0
73
#endif
74
 
75
int mips_flag_mdebug = -1;
76
 
77
/* Control generation of .pdr sections.  Off by default on IRIX: the native
78
   linker doesn't know about and discards them, but relocations against them
79
   remain, leading to rld crashes.  */
80
#ifdef TE_IRIX
81
int mips_flag_pdr = FALSE;
82
#else
83
int mips_flag_pdr = TRUE;
84
#endif
85
 
86
#include "ecoff.h"
87
 
88
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
89
static char *mips_regmask_frag;
90
#endif
91
 
92
#define ZERO 0
93
#define ATREG 1
94
#define TREG 24
95
#define PIC_CALL_REG 25
96
#define KT0 26
97
#define KT1 27
98
#define GP  28
99
#define SP  29
100
#define FP  30
101
#define RA  31
102
 
103
#define ILLEGAL_REG (32)
104
 
105
#define AT  mips_opts.at
106
 
107
/* Allow override of standard little-endian ECOFF format.  */
108
 
109
#ifndef ECOFF_LITTLE_FORMAT
110
#define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
111
#endif
112
 
113
extern int target_big_endian;
114
 
115
/* The name of the readonly data section.  */
116
#define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
117
                            ? ".rdata" \
118
                            : OUTPUT_FLAVOR == bfd_target_coff_flavour \
119
                            ? ".rdata" \
120
                            : OUTPUT_FLAVOR == bfd_target_elf_flavour \
121
                            ? ".rodata" \
122
                            : (abort (), ""))
123
 
124
/* Information about an instruction, including its format, operands
125
   and fixups.  */
126
struct mips_cl_insn
127
{
128
  /* The opcode's entry in mips_opcodes or mips16_opcodes.  */
129
  const struct mips_opcode *insn_mo;
130
 
131
  /* True if this is a mips16 instruction and if we want the extended
132
     form of INSN_MO.  */
133
  bfd_boolean use_extend;
134
 
135
  /* The 16-bit extension instruction to use when USE_EXTEND is true.  */
136
  unsigned short extend;
137
 
138
  /* The 16-bit or 32-bit bitstring of the instruction itself.  This is
139
     a copy of INSN_MO->match with the operands filled in.  */
140
  unsigned long insn_opcode;
141
 
142
  /* The frag that contains the instruction.  */
143
  struct frag *frag;
144
 
145
  /* The offset into FRAG of the first instruction byte.  */
146
  long where;
147
 
148
  /* The relocs associated with the instruction, if any.  */
149
  fixS *fixp[3];
150
 
151
  /* True if this entry cannot be moved from its current position.  */
152
  unsigned int fixed_p : 1;
153
 
154
  /* True if this instruction occurred in a .set noreorder block.  */
155
  unsigned int noreorder_p : 1;
156
 
157
  /* True for mips16 instructions that jump to an absolute address.  */
158
  unsigned int mips16_absolute_jump_p : 1;
159
 
160
  /* True if this instruction is complete.  */
161
  unsigned int complete_p : 1;
162
};
163
 
164
/* The ABI to use.  */
165
enum mips_abi_level
166
{
167
  NO_ABI = 0,
168
  O32_ABI,
169
  O64_ABI,
170
  N32_ABI,
171
  N64_ABI,
172
  EABI_ABI
173
};
174
 
175
/* MIPS ABI we are using for this output file.  */
176
static enum mips_abi_level mips_abi = NO_ABI;
177
 
178
/* Whether or not we have code that can call pic code.  */
179
int mips_abicalls = FALSE;
180
 
181
/* Whether or not we have code which can be put into a shared
182
   library.  */
183
static bfd_boolean mips_in_shared = TRUE;
184
 
185
/* This is the set of options which may be modified by the .set
186
   pseudo-op.  We use a struct so that .set push and .set pop are more
187
   reliable.  */
188
 
189
struct mips_set_options
190
{
191
  /* MIPS ISA (Instruction Set Architecture) level.  This is set to -1
192
     if it has not been initialized.  Changed by `.set mipsN', and the
193
     -mipsN command line option, and the default CPU.  */
194
  int isa;
195
  /* Enabled Application Specific Extensions (ASEs).  These are set to -1
196
     if they have not been initialized.  Changed by `.set <asename>', by
197
     command line options, and based on the default architecture.  */
198
  int ase_mips3d;
199
  int ase_mdmx;
200
  int ase_smartmips;
201
  int ase_dsp;
202
  int ase_dspr2;
203
  int ase_mt;
204
  /* Whether we are assembling for the mips16 processor.  0 if we are
205
     not, 1 if we are, and -1 if the value has not been initialized.
206
     Changed by `.set mips16' and `.set nomips16', and the -mips16 and
207
     -nomips16 command line options, and the default CPU.  */
208
  int mips16;
209
  /* Non-zero if we should not reorder instructions.  Changed by `.set
210
     reorder' and `.set noreorder'.  */
211
  int noreorder;
212
  /* Non-zero if we should not permit the register designated "assembler
213
     temporary" to be used in instructions.  The value is the register
214
     number, normally $at ($1).  Changed by `.set at=REG', `.set noat'
215
     (same as `.set at=$0') and `.set at' (same as `.set at=$1').  */
216
  unsigned int at;
217
  /* Non-zero if we should warn when a macro instruction expands into
218
     more than one machine instruction.  Changed by `.set nomacro' and
219
     `.set macro'.  */
220
  int warn_about_macros;
221
  /* Non-zero if we should not move instructions.  Changed by `.set
222
     move', `.set volatile', `.set nomove', and `.set novolatile'.  */
223
  int nomove;
224
  /* Non-zero if we should not optimize branches by moving the target
225
     of the branch into the delay slot.  Actually, we don't perform
226
     this optimization anyhow.  Changed by `.set bopt' and `.set
227
     nobopt'.  */
228
  int nobopt;
229
  /* Non-zero if we should not autoextend mips16 instructions.
230
     Changed by `.set autoextend' and `.set noautoextend'.  */
231
  int noautoextend;
232
  /* Restrict general purpose registers and floating point registers
233
     to 32 bit.  This is initially determined when -mgp32 or -mfp32
234
     is passed but can changed if the assembler code uses .set mipsN.  */
235
  int gp32;
236
  int fp32;
237
  /* MIPS architecture (CPU) type.  Changed by .set arch=FOO, the -march
238
     command line option, and the default CPU.  */
239
  int arch;
240
  /* True if ".set sym32" is in effect.  */
241
  bfd_boolean sym32;
242
  /* True if floating-point operations are not allowed.  Changed by .set
243
     softfloat or .set hardfloat, by command line options -msoft-float or
244
     -mhard-float.  The default is false.  */
245
  bfd_boolean soft_float;
246
 
247
  /* True if only single-precision floating-point operations are allowed.
248
     Changed by .set singlefloat or .set doublefloat, command-line options
249
     -msingle-float or -mdouble-float.  The default is false.  */
250
  bfd_boolean single_float;
251
};
252
 
253
/* This is the struct we use to hold the current set of options.  Note
254
   that we must set the isa field to ISA_UNKNOWN and the ASE fields to
255
   -1 to indicate that they have not been initialized.  */
256
 
257
/* True if -mgp32 was passed.  */
258
static int file_mips_gp32 = -1;
259
 
260
/* True if -mfp32 was passed.  */
261
static int file_mips_fp32 = -1;
262
 
263
/* 1 if -msoft-float, 0 if -mhard-float.  The default is 0.  */
264
static int file_mips_soft_float = 0;
265
 
266
/* 1 if -msingle-float, 0 if -mdouble-float.  The default is 0.   */
267
static int file_mips_single_float = 0;
268
 
269
static struct mips_set_options mips_opts =
270
{
271
  /* isa */ ISA_UNKNOWN, /* ase_mips3d */ -1, /* ase_mdmx */ -1,
272
  /* ase_smartmips */ 0, /* ase_dsp */ -1, /* ase_dspr2 */ -1, /* ase_mt */ -1,
273
  /* mips16 */ -1, /* noreorder */ 0, /* at */ ATREG,
274
  /* warn_about_macros */ 0, /* nomove */ 0, /* nobopt */ 0,
275
  /* noautoextend */ 0, /* gp32 */ 0, /* fp32 */ 0, /* arch */ CPU_UNKNOWN,
276
  /* sym32 */ FALSE, /* soft_float */ FALSE, /* single_float */ FALSE
277
};
278
 
279
/* These variables are filled in with the masks of registers used.
280
   The object format code reads them and puts them in the appropriate
281
   place.  */
282
unsigned long mips_gprmask;
283
unsigned long mips_cprmask[4];
284
 
285
/* MIPS ISA we are using for this output file.  */
286
static int file_mips_isa = ISA_UNKNOWN;
287
 
288
/* True if any MIPS16 code was produced.  */
289
static int file_ase_mips16;
290
 
291
#define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32               \
292
                              || mips_opts.isa == ISA_MIPS32R2          \
293
                              || mips_opts.isa == ISA_MIPS64            \
294
                              || mips_opts.isa == ISA_MIPS64R2)
295
 
296
/* True if we want to create R_MIPS_JALR for jalr $25.  */
297
#ifdef TE_IRIX
298
#define MIPS_JALR_HINT_P(EXPR) HAVE_NEWABI
299
#else
300
/* As a GNU extension, we use R_MIPS_JALR for o32 too.  However,
301
   because there's no place for any addend, the only acceptable
302
   expression is a bare symbol.  */
303
#define MIPS_JALR_HINT_P(EXPR) \
304
  (!HAVE_IN_PLACE_ADDENDS \
305
   || ((EXPR)->X_op == O_symbol && (EXPR)->X_add_number == 0))
306
#endif
307
 
308
/* True if -mips3d was passed or implied by arguments passed on the
309
   command line (e.g., by -march).  */
310
static int file_ase_mips3d;
311
 
312
/* True if -mdmx was passed or implied by arguments passed on the
313
   command line (e.g., by -march).  */
314
static int file_ase_mdmx;
315
 
316
/* True if -msmartmips was passed or implied by arguments passed on the
317
   command line (e.g., by -march).  */
318
static int file_ase_smartmips;
319
 
320
#define ISA_SUPPORTS_SMARTMIPS (mips_opts.isa == ISA_MIPS32             \
321
                                || mips_opts.isa == ISA_MIPS32R2)
322
 
323
/* True if -mdsp was passed or implied by arguments passed on the
324
   command line (e.g., by -march).  */
325
static int file_ase_dsp;
326
 
327
#define ISA_SUPPORTS_DSP_ASE (mips_opts.isa == ISA_MIPS32R2             \
328
                              || mips_opts.isa == ISA_MIPS64R2)
329
 
330
#define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
331
 
332
/* True if -mdspr2 was passed or implied by arguments passed on the
333
   command line (e.g., by -march).  */
334
static int file_ase_dspr2;
335
 
336
#define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2           \
337
                                || mips_opts.isa == ISA_MIPS64R2)
338
 
339
/* True if -mmt was passed or implied by arguments passed on the
340
   command line (e.g., by -march).  */
341
static int file_ase_mt;
342
 
343
#define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2              \
344
                             || mips_opts.isa == ISA_MIPS64R2)
345
 
346
/* The argument of the -march= flag.  The architecture we are assembling.  */
347
static int file_mips_arch = CPU_UNKNOWN;
348
static const char *mips_arch_string;
349
 
350
/* The argument of the -mtune= flag.  The architecture for which we
351
   are optimizing.  */
352
static int mips_tune = CPU_UNKNOWN;
353
static const char *mips_tune_string;
354
 
355
/* True when generating 32-bit code for a 64-bit processor.  */
356
static int mips_32bitmode = 0;
357
 
358
/* True if the given ABI requires 32-bit registers.  */
359
#define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
360
 
361
/* Likewise 64-bit registers.  */
362
#define ABI_NEEDS_64BIT_REGS(ABI)       \
363
  ((ABI) == N32_ABI                     \
364
   || (ABI) == N64_ABI                  \
365
   || (ABI) == O64_ABI)
366
 
367
/*  Return true if ISA supports 64 bit wide gp registers.  */
368
#define ISA_HAS_64BIT_REGS(ISA)         \
369
  ((ISA) == ISA_MIPS3                   \
370
   || (ISA) == ISA_MIPS4                \
371
   || (ISA) == ISA_MIPS5                \
372
   || (ISA) == ISA_MIPS64               \
373
   || (ISA) == ISA_MIPS64R2)
374
 
375
/*  Return true if ISA supports 64 bit wide float registers.  */
376
#define ISA_HAS_64BIT_FPRS(ISA)         \
377
  ((ISA) == ISA_MIPS3                   \
378
   || (ISA) == ISA_MIPS4                \
379
   || (ISA) == ISA_MIPS5                \
380
   || (ISA) == ISA_MIPS32R2             \
381
   || (ISA) == ISA_MIPS64               \
382
   || (ISA) == ISA_MIPS64R2)
383
 
384
/* Return true if ISA supports 64-bit right rotate (dror et al.)
385
   instructions.  */
386
#define ISA_HAS_DROR(ISA)               \
387
  ((ISA) == ISA_MIPS64R2)
388
 
389
/* Return true if ISA supports 32-bit right rotate (ror et al.)
390
   instructions.  */
391
#define ISA_HAS_ROR(ISA)                \
392
  ((ISA) == ISA_MIPS32R2                \
393
   || (ISA) == ISA_MIPS64R2             \
394
   || mips_opts.ase_smartmips)
395
 
396
/* Return true if ISA supports single-precision floats in odd registers.  */
397
#define ISA_HAS_ODD_SINGLE_FPR(ISA)     \
398
  ((ISA) == ISA_MIPS32                  \
399
   || (ISA) == ISA_MIPS32R2             \
400
   || (ISA) == ISA_MIPS64               \
401
   || (ISA) == ISA_MIPS64R2)
402
 
403
/* Return true if ISA supports move to/from high part of a 64-bit
404
   floating-point register. */
405
#define ISA_HAS_MXHC1(ISA)              \
406
  ((ISA) == ISA_MIPS32R2                \
407
   || (ISA) == ISA_MIPS64R2)
408
 
409
#define HAVE_32BIT_GPRS                            \
410
    (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
411
 
412
#define HAVE_32BIT_FPRS                            \
413
    (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
414
 
415
#define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
416
#define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
417
 
418
#define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
419
 
420
#define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
421
 
422
/* True if relocations are stored in-place.  */
423
#define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
424
 
425
/* The ABI-derived address size.  */
426
#define HAVE_64BIT_ADDRESSES \
427
  (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
428
#define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
429
 
430
/* The size of symbolic constants (i.e., expressions of the form
431
   "SYMBOL" or "SYMBOL + OFFSET").  */
432
#define HAVE_32BIT_SYMBOLS \
433
  (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
434
#define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
435
 
436
/* Addresses are loaded in different ways, depending on the address size
437
   in use.  The n32 ABI Documentation also mandates the use of additions
438
   with overflow checking, but existing implementations don't follow it.  */
439
#define ADDRESS_ADD_INSN                                                \
440
   (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
441
 
442
#define ADDRESS_ADDI_INSN                                               \
443
   (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
444
 
445
#define ADDRESS_LOAD_INSN                                               \
446
   (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
447
 
448
#define ADDRESS_STORE_INSN                                              \
449
   (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
450
 
451
/* Return true if the given CPU supports the MIPS16 ASE.  */
452
#define CPU_HAS_MIPS16(cpu)                                             \
453
   (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0           \
454
    || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
455
 
456
/* True if CPU has a dror instruction.  */
457
#define CPU_HAS_DROR(CPU)       ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
458
 
459
/* True if CPU has a ror instruction.  */
460
#define CPU_HAS_ROR(CPU)        CPU_HAS_DROR (CPU)
461
 
462
/* True if CPU has seq/sne and seqi/snei instructions.  */
463
#define CPU_HAS_SEQ(CPU)        ((CPU) == CPU_OCTEON)
464
 
465
/* True if CPU does not implement the all the coprocessor insns.  For these
466
   CPUs only those COP insns are accepted that are explicitly marked to be
467
   available on the CPU.  ISA membership for COP insns is ignored.  */
468
#define NO_ISA_COP(CPU)         ((CPU) == CPU_OCTEON)
469
 
470
/* True if mflo and mfhi can be immediately followed by instructions
471
   which write to the HI and LO registers.
472
 
473
   According to MIPS specifications, MIPS ISAs I, II, and III need
474
   (at least) two instructions between the reads of HI/LO and
475
   instructions which write them, and later ISAs do not.  Contradicting
476
   the MIPS specifications, some MIPS IV processor user manuals (e.g.
477
   the UM for the NEC Vr5000) document needing the instructions between
478
   HI/LO reads and writes, as well.  Therefore, we declare only MIPS32,
479
   MIPS64 and later ISAs to have the interlocks, plus any specific
480
   earlier-ISA CPUs for which CPU documentation declares that the
481
   instructions are really interlocked.  */
482
#define hilo_interlocks \
483
  (mips_opts.isa == ISA_MIPS32                        \
484
   || mips_opts.isa == ISA_MIPS32R2                   \
485
   || mips_opts.isa == ISA_MIPS64                     \
486
   || mips_opts.isa == ISA_MIPS64R2                   \
487
   || mips_opts.arch == CPU_R4010                     \
488
   || mips_opts.arch == CPU_R10000                    \
489
   || mips_opts.arch == CPU_R12000                    \
490
   || mips_opts.arch == CPU_R14000                    \
491
   || mips_opts.arch == CPU_R16000                    \
492
   || mips_opts.arch == CPU_RM7000                    \
493
   || mips_opts.arch == CPU_VR5500                    \
494
   )
495
 
496
/* Whether the processor uses hardware interlocks to protect reads
497
   from the GPRs after they are loaded from memory, and thus does not
498
   require nops to be inserted.  This applies to instructions marked
499
   INSN_LOAD_MEMORY_DELAY.  These nops are only required at MIPS ISA
500
   level I.  */
501
#define gpr_interlocks \
502
  (mips_opts.isa != ISA_MIPS1  \
503
   || mips_opts.arch == CPU_R3900)
504
 
505
/* Whether the processor uses hardware interlocks to avoid delays
506
   required by coprocessor instructions, and thus does not require
507
   nops to be inserted.  This applies to instructions marked
508
   INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
509
   between instructions marked INSN_WRITE_COND_CODE and ones marked
510
   INSN_READ_COND_CODE.  These nops are only required at MIPS ISA
511
   levels I, II, and III.  */
512
/* Itbl support may require additional care here.  */
513
#define cop_interlocks                                \
514
  ((mips_opts.isa != ISA_MIPS1                        \
515
    && mips_opts.isa != ISA_MIPS2                     \
516
    && mips_opts.isa != ISA_MIPS3)                    \
517
   || mips_opts.arch == CPU_R4300                     \
518
   )
519
 
520
/* Whether the processor uses hardware interlocks to protect reads
521
   from coprocessor registers after they are loaded from memory, and
522
   thus does not require nops to be inserted.  This applies to
523
   instructions marked INSN_COPROC_MEMORY_DELAY.  These nops are only
524
   requires at MIPS ISA level I.  */
525
#define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
526
 
527
/* Is this a mfhi or mflo instruction?  */
528
#define MF_HILO_INSN(PINFO) \
529
  ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
530
 
531
/* Returns true for a (non floating-point) coprocessor instruction.  Reading
532
   or writing the condition code is only possible on the coprocessors and
533
   these insns are not marked with INSN_COP.  Thus for these insns use the
534
   condition-code flags.  */
535
#define COP_INSN(PINFO)                                                 \
536
  (PINFO != INSN_MACRO                                                  \
537
   && ((PINFO) & (FP_S | FP_D)) == 0                                     \
538
   && ((PINFO) & (INSN_COP | INSN_READ_COND_CODE | INSN_WRITE_COND_CODE)))
539
 
540
/* MIPS PIC level.  */
541
 
542
enum mips_pic_level mips_pic;
543
 
544
/* 1 if we should generate 32 bit offsets from the $gp register in
545
   SVR4_PIC mode.  Currently has no meaning in other modes.  */
546
static int mips_big_got = 0;
547
 
548
/* 1 if trap instructions should used for overflow rather than break
549
   instructions.  */
550
static int mips_trap = 0;
551
 
552
/* 1 if double width floating point constants should not be constructed
553
   by assembling two single width halves into two single width floating
554
   point registers which just happen to alias the double width destination
555
   register.  On some architectures this aliasing can be disabled by a bit
556
   in the status register, and the setting of this bit cannot be determined
557
   automatically at assemble time.  */
558
static int mips_disable_float_construction;
559
 
560
/* Non-zero if any .set noreorder directives were used.  */
561
 
562
static int mips_any_noreorder;
563
 
564
/* Non-zero if nops should be inserted when the register referenced in
565
   an mfhi/mflo instruction is read in the next two instructions.  */
566
static int mips_7000_hilo_fix;
567
 
568
/* The size of objects in the small data section.  */
569
static unsigned int g_switch_value = 8;
570
/* Whether the -G option was used.  */
571
static int g_switch_seen = 0;
572
 
573
#define N_RMASK 0xc4
574
#define N_VFP   0xd4
575
 
576
/* If we can determine in advance that GP optimization won't be
577
   possible, we can skip the relaxation stuff that tries to produce
578
   GP-relative references.  This makes delay slot optimization work
579
   better.
580
 
581
   This function can only provide a guess, but it seems to work for
582
   gcc output.  It needs to guess right for gcc, otherwise gcc
583
   will put what it thinks is a GP-relative instruction in a branch
584
   delay slot.
585
 
586
   I don't know if a fix is needed for the SVR4_PIC mode.  I've only
587
   fixed it for the non-PIC mode.  KR 95/04/07  */
588
static int nopic_need_relax (symbolS *, int);
589
 
590
/* handle of the OPCODE hash table */
591
static struct hash_control *op_hash = NULL;
592
 
593
/* The opcode hash table we use for the mips16.  */
594
static struct hash_control *mips16_op_hash = NULL;
595
 
596
/* This array holds the chars that always start a comment.  If the
597
    pre-processor is disabled, these aren't very useful */
598
const char comment_chars[] = "#";
599
 
600
/* This array holds the chars that only start a comment at the beginning of
601
   a line.  If the line seems to have the form '# 123 filename'
602
   .line and .file directives will appear in the pre-processed output */
603
/* Note that input_file.c hand checks for '#' at the beginning of the
604
   first line of the input file.  This is because the compiler outputs
605
   #NO_APP at the beginning of its output.  */
606
/* Also note that C style comments are always supported.  */
607
const char line_comment_chars[] = "#";
608
 
609
/* This array holds machine specific line separator characters.  */
610
const char line_separator_chars[] = ";";
611
 
612
/* Chars that can be used to separate mant from exp in floating point nums */
613
const char EXP_CHARS[] = "eE";
614
 
615
/* Chars that mean this number is a floating point constant */
616
/* As in 0f12.456 */
617
/* or    0d1.2345e12 */
618
const char FLT_CHARS[] = "rRsSfFdDxXpP";
619
 
620
/* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
621
   changed in read.c .  Ideally it shouldn't have to know about it at all,
622
   but nothing is ideal around here.
623
 */
624
 
625
static char *insn_error;
626
 
627
static int auto_align = 1;
628
 
629
/* When outputting SVR4 PIC code, the assembler needs to know the
630
   offset in the stack frame from which to restore the $gp register.
631
   This is set by the .cprestore pseudo-op, and saved in this
632
   variable.  */
633
static offsetT mips_cprestore_offset = -1;
634
 
635
/* Similar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
636
   more optimizations, it can use a register value instead of a memory-saved
637
   offset and even an other register than $gp as global pointer.  */
638
static offsetT mips_cpreturn_offset = -1;
639
static int mips_cpreturn_register = -1;
640
static int mips_gp_register = GP;
641
static int mips_gprel_offset = 0;
642
 
643
/* Whether mips_cprestore_offset has been set in the current function
644
   (or whether it has already been warned about, if not).  */
645
static int mips_cprestore_valid = 0;
646
 
647
/* This is the register which holds the stack frame, as set by the
648
   .frame pseudo-op.  This is needed to implement .cprestore.  */
649
static int mips_frame_reg = SP;
650
 
651
/* Whether mips_frame_reg has been set in the current function
652
   (or whether it has already been warned about, if not).  */
653
static int mips_frame_reg_valid = 0;
654
 
655
/* To output NOP instructions correctly, we need to keep information
656
   about the previous two instructions.  */
657
 
658
/* Whether we are optimizing.  The default value of 2 means to remove
659
   unneeded NOPs and swap branch instructions when possible.  A value
660
   of 1 means to not swap branches.  A value of 0 means to always
661
   insert NOPs.  */
662
static int mips_optimize = 2;
663
 
664
/* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
665
   equivalent to seeing no -g option at all.  */
666
static int mips_debug = 0;
667
 
668
/* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata.  */
669
#define MAX_VR4130_NOPS 4
670
 
671
/* The maximum number of NOPs needed to fill delay slots.  */
672
#define MAX_DELAY_NOPS 2
673
 
674
/* The maximum number of NOPs needed for any purpose.  */
675
#define MAX_NOPS 4
676
 
677
/* A list of previous instructions, with index 0 being the most recent.
678
   We need to look back MAX_NOPS instructions when filling delay slots
679
   or working around processor errata.  We need to look back one
680
   instruction further if we're thinking about using history[0] to
681
   fill a branch delay slot.  */
682
static struct mips_cl_insn history[1 + MAX_NOPS];
683
 
684
/* Nop instructions used by emit_nop.  */
685
static struct mips_cl_insn nop_insn, mips16_nop_insn;
686
 
687
/* The appropriate nop for the current mode.  */
688
#define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn : &nop_insn)
689
 
690
/* If this is set, it points to a frag holding nop instructions which
691
   were inserted before the start of a noreorder section.  If those
692
   nops turn out to be unnecessary, the size of the frag can be
693
   decreased.  */
694
static fragS *prev_nop_frag;
695
 
696
/* The number of nop instructions we created in prev_nop_frag.  */
697
static int prev_nop_frag_holds;
698
 
699
/* The number of nop instructions that we know we need in
700
   prev_nop_frag.  */
701
static int prev_nop_frag_required;
702
 
703
/* The number of instructions we've seen since prev_nop_frag.  */
704
static int prev_nop_frag_since;
705
 
706
/* For ECOFF and ELF, relocations against symbols are done in two
707
   parts, with a HI relocation and a LO relocation.  Each relocation
708
   has only 16 bits of space to store an addend.  This means that in
709
   order for the linker to handle carries correctly, it must be able
710
   to locate both the HI and the LO relocation.  This means that the
711
   relocations must appear in order in the relocation table.
712
 
713
   In order to implement this, we keep track of each unmatched HI
714
   relocation.  We then sort them so that they immediately precede the
715
   corresponding LO relocation.  */
716
 
717
struct mips_hi_fixup
718
{
719
  /* Next HI fixup.  */
720
  struct mips_hi_fixup *next;
721
  /* This fixup.  */
722
  fixS *fixp;
723
  /* The section this fixup is in.  */
724
  segT seg;
725
};
726
 
727
/* The list of unmatched HI relocs.  */
728
 
729
static struct mips_hi_fixup *mips_hi_fixup_list;
730
 
731
/* The frag containing the last explicit relocation operator.
732
   Null if explicit relocations have not been used.  */
733
 
734
static fragS *prev_reloc_op_frag;
735
 
736
/* Map normal MIPS register numbers to mips16 register numbers.  */
737
 
738
#define X ILLEGAL_REG
739
static const int mips32_to_16_reg_map[] =
740
{
741
  X, X, 2, 3, 4, 5, 6, 7,
742
  X, X, X, X, X, X, X, X,
743
  0, 1, X, X, X, X, X, X,
744
  X, X, X, X, X, X, X, X
745
};
746
#undef X
747
 
748
/* Map mips16 register numbers to normal MIPS register numbers.  */
749
 
750
static const unsigned int mips16_to_32_reg_map[] =
751
{
752
  16, 17, 2, 3, 4, 5, 6, 7
753
};
754
 
755
/* Classifies the kind of instructions we're interested in when
756
   implementing -mfix-vr4120.  */
757
enum fix_vr4120_class
758
{
759
  FIX_VR4120_MACC,
760
  FIX_VR4120_DMACC,
761
  FIX_VR4120_MULT,
762
  FIX_VR4120_DMULT,
763
  FIX_VR4120_DIV,
764
  FIX_VR4120_MTHILO,
765
  NUM_FIX_VR4120_CLASSES
766
};
767
 
768
/* ...likewise -mfix-loongson2f-jump.  */
769
static bfd_boolean mips_fix_loongson2f_jump;
770
 
771
/* ...likewise -mfix-loongson2f-nop.  */
772
static bfd_boolean mips_fix_loongson2f_nop;
773
 
774
/* True if -mfix-loongson2f-nop or -mfix-loongson2f-jump passed.  */
775
static bfd_boolean mips_fix_loongson2f;
776
 
777
/* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
778
   there must be at least one other instruction between an instruction
779
   of type X and an instruction of type Y.  */
780
static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
781
 
782
/* True if -mfix-vr4120 is in force.  */
783
static int mips_fix_vr4120;
784
 
785
/* ...likewise -mfix-vr4130.  */
786
static int mips_fix_vr4130;
787
 
788
/* ...likewise -mfix-24k.  */
789
static int mips_fix_24k;
790
 
791
/* ...likewise -mfix-cn63xxp1 */
792
static bfd_boolean mips_fix_cn63xxp1;
793
 
794
/* We don't relax branches by default, since this causes us to expand
795
   `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
796
   fail to compute the offset before expanding the macro to the most
797
   efficient expansion.  */
798
 
799
static int mips_relax_branch;
800
 
801
/* The expansion of many macros depends on the type of symbol that
802
   they refer to.  For example, when generating position-dependent code,
803
   a macro that refers to a symbol may have two different expansions,
804
   one which uses GP-relative addresses and one which uses absolute
805
   addresses.  When generating SVR4-style PIC, a macro may have
806
   different expansions for local and global symbols.
807
 
808
   We handle these situations by generating both sequences and putting
809
   them in variant frags.  In position-dependent code, the first sequence
810
   will be the GP-relative one and the second sequence will be the
811
   absolute one.  In SVR4 PIC, the first sequence will be for global
812
   symbols and the second will be for local symbols.
813
 
814
   The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
815
   SECOND are the lengths of the two sequences in bytes.  These fields
816
   can be extracted using RELAX_FIRST() and RELAX_SECOND().  In addition,
817
   the subtype has the following flags:
818
 
819
   RELAX_USE_SECOND
820
        Set if it has been decided that we should use the second
821
        sequence instead of the first.
822
 
823
   RELAX_SECOND_LONGER
824
        Set in the first variant frag if the macro's second implementation
825
        is longer than its first.  This refers to the macro as a whole,
826
        not an individual relaxation.
827
 
828
   RELAX_NOMACRO
829
        Set in the first variant frag if the macro appeared in a .set nomacro
830
        block and if one alternative requires a warning but the other does not.
831
 
832
   RELAX_DELAY_SLOT
833
        Like RELAX_NOMACRO, but indicates that the macro appears in a branch
834
        delay slot.
835
 
836
   The frag's "opcode" points to the first fixup for relaxable code.
837
 
838
   Relaxable macros are generated using a sequence such as:
839
 
840
      relax_start (SYMBOL);
841
      ... generate first expansion ...
842
      relax_switch ();
843
      ... generate second expansion ...
844
      relax_end ();
845
 
846
   The code and fixups for the unwanted alternative are discarded
847
   by md_convert_frag.  */
848
#define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
849
 
850
#define RELAX_FIRST(X) (((X) >> 8) & 0xff)
851
#define RELAX_SECOND(X) ((X) & 0xff)
852
#define RELAX_USE_SECOND 0x10000
853
#define RELAX_SECOND_LONGER 0x20000
854
#define RELAX_NOMACRO 0x40000
855
#define RELAX_DELAY_SLOT 0x80000
856
 
857
/* Branch without likely bit.  If label is out of range, we turn:
858
 
859
        beq reg1, reg2, label
860
        delay slot
861
 
862
   into
863
 
864
        bne reg1, reg2, 0f
865
        nop
866
        j label
867
     0: delay slot
868
 
869
   with the following opcode replacements:
870
 
871
        beq <-> bne
872
        blez <-> bgtz
873
        bltz <-> bgez
874
        bc1f <-> bc1t
875
 
876
        bltzal <-> bgezal  (with jal label instead of j label)
877
 
878
   Even though keeping the delay slot instruction in the delay slot of
879
   the branch would be more efficient, it would be very tricky to do
880
   correctly, because we'd have to introduce a variable frag *after*
881
   the delay slot instruction, and expand that instead.  Let's do it
882
   the easy way for now, even if the branch-not-taken case now costs
883
   one additional instruction.  Out-of-range branches are not supposed
884
   to be common, anyway.
885
 
886
   Branch likely.  If label is out of range, we turn:
887
 
888
        beql reg1, reg2, label
889
        delay slot (annulled if branch not taken)
890
 
891
   into
892
 
893
        beql reg1, reg2, 1f
894
        nop
895
        beql $0, $0, 2f
896
        nop
897
     1: j[al] label
898
        delay slot (executed only if branch taken)
899
     2:
900
 
901
   It would be possible to generate a shorter sequence by losing the
902
   likely bit, generating something like:
903
 
904
        bne reg1, reg2, 0f
905
        nop
906
        j[al] label
907
        delay slot (executed only if branch taken)
908
     0:
909
 
910
        beql -> bne
911
        bnel -> beq
912
        blezl -> bgtz
913
        bgtzl -> blez
914
        bltzl -> bgez
915
        bgezl -> bltz
916
        bc1fl -> bc1t
917
        bc1tl -> bc1f
918
 
919
        bltzall -> bgezal  (with jal label instead of j label)
920
        bgezall -> bltzal  (ditto)
921
 
922
 
923
   but it's not clear that it would actually improve performance.  */
924
#define RELAX_BRANCH_ENCODE(at, uncond, likely, link, toofar)   \
925
  ((relax_substateT)                                            \
926
   (0xc0000000                                                  \
927
    | ((at) & 0x1f)                                             \
928
    | ((toofar) ? 0x20 : 0)                                      \
929
    | ((link) ? 0x40 : 0)                                        \
930
    | ((likely) ? 0x80 : 0)                                      \
931
    | ((uncond) ? 0x100 : 0)))
932
#define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
933
#define RELAX_BRANCH_UNCOND(i) (((i) & 0x100) != 0)
934
#define RELAX_BRANCH_LIKELY(i) (((i) & 0x80) != 0)
935
#define RELAX_BRANCH_LINK(i) (((i) & 0x40) != 0)
936
#define RELAX_BRANCH_TOOFAR(i) (((i) & 0x20) != 0)
937
#define RELAX_BRANCH_AT(i) ((i) & 0x1f)
938
 
939
/* For mips16 code, we use an entirely different form of relaxation.
940
   mips16 supports two versions of most instructions which take
941
   immediate values: a small one which takes some small value, and a
942
   larger one which takes a 16 bit value.  Since branches also follow
943
   this pattern, relaxing these values is required.
944
 
945
   We can assemble both mips16 and normal MIPS code in a single
946
   object.  Therefore, we need to support this type of relaxation at
947
   the same time that we support the relaxation described above.  We
948
   use the high bit of the subtype field to distinguish these cases.
949
 
950
   The information we store for this type of relaxation is the
951
   argument code found in the opcode file for this relocation, whether
952
   the user explicitly requested a small or extended form, and whether
953
   the relocation is in a jump or jal delay slot.  That tells us the
954
   size of the value, and how it should be stored.  We also store
955
   whether the fragment is considered to be extended or not.  We also
956
   store whether this is known to be a branch to a different section,
957
   whether we have tried to relax this frag yet, and whether we have
958
   ever extended a PC relative fragment because of a shift count.  */
959
#define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
960
  (0x80000000                                                   \
961
   | ((type) & 0xff)                                            \
962
   | ((small) ? 0x100 : 0)                                       \
963
   | ((ext) ? 0x200 : 0)                                 \
964
   | ((dslot) ? 0x400 : 0)                                       \
965
   | ((jal_dslot) ? 0x800 : 0))
966
#define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
967
#define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
968
#define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
969
#define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
970
#define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
971
#define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
972
#define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
973
#define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
974
#define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
975
#define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
976
#define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
977
#define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
978
 
979
/* Is the given value a sign-extended 32-bit value?  */
980
#define IS_SEXT_32BIT_NUM(x)                                            \
981
  (((x) &~ (offsetT) 0x7fffffff) == 0                                    \
982
   || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
983
 
984
/* Is the given value a sign-extended 16-bit value?  */
985
#define IS_SEXT_16BIT_NUM(x)                                            \
986
  (((x) &~ (offsetT) 0x7fff) == 0                                        \
987
   || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
988
 
989
/* Is the given value a zero-extended 32-bit value?  Or a negated one?  */
990
#define IS_ZEXT_32BIT_NUM(x)                                            \
991
  (((x) &~ (offsetT) 0xffffffff) == 0                                    \
992
   || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
993
 
994
/* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
995
   VALUE << SHIFT.  VALUE is evaluated exactly once.  */
996
#define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
997
  (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
998
              | (((VALUE) & (MASK)) << (SHIFT)))
999
 
1000
/* Extract bits MASK << SHIFT from STRUCT and shift them right
1001
   SHIFT places.  */
1002
#define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
1003
  (((STRUCT) >> (SHIFT)) & (MASK))
1004
 
1005
/* Change INSN's opcode so that the operand given by FIELD has value VALUE.
1006
   INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
1007
 
1008
   include/opcode/mips.h specifies operand fields using the macros
1009
   OP_MASK_<FIELD> and OP_SH_<FIELD>.  The MIPS16 equivalents start
1010
   with "MIPS16OP" instead of "OP".  */
1011
#define INSERT_OPERAND(FIELD, INSN, VALUE) \
1012
  INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
1013
#define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
1014
  INSERT_BITS ((INSN).insn_opcode, VALUE, \
1015
                MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
1016
 
1017
/* Extract the operand given by FIELD from mips_cl_insn INSN.  */
1018
#define EXTRACT_OPERAND(FIELD, INSN) \
1019
  EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD)
1020
#define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
1021
  EXTRACT_BITS ((INSN).insn_opcode, \
1022
                MIPS16OP_MASK_##FIELD, \
1023
                MIPS16OP_SH_##FIELD)
1024
 
1025
/* Global variables used when generating relaxable macros.  See the
1026
   comment above RELAX_ENCODE for more details about how relaxation
1027
   is used.  */
1028
static struct {
1029
  /* 0 if we're not emitting a relaxable macro.
1030
     1 if we're emitting the first of the two relaxation alternatives.
1031
     2 if we're emitting the second alternative.  */
1032
  int sequence;
1033
 
1034
  /* The first relaxable fixup in the current frag.  (In other words,
1035
     the first fixup that refers to relaxable code.)  */
1036
  fixS *first_fixup;
1037
 
1038
  /* sizes[0] says how many bytes of the first alternative are stored in
1039
     the current frag.  Likewise sizes[1] for the second alternative.  */
1040
  unsigned int sizes[2];
1041
 
1042
  /* The symbol on which the choice of sequence depends.  */
1043
  symbolS *symbol;
1044
} mips_relax;
1045
 
1046
/* Global variables used to decide whether a macro needs a warning.  */
1047
static struct {
1048
  /* True if the macro is in a branch delay slot.  */
1049
  bfd_boolean delay_slot_p;
1050
 
1051
  /* For relaxable macros, sizes[0] is the length of the first alternative
1052
     in bytes and sizes[1] is the length of the second alternative.
1053
     For non-relaxable macros, both elements give the length of the
1054
     macro in bytes.  */
1055
  unsigned int sizes[2];
1056
 
1057
  /* The first variant frag for this macro.  */
1058
  fragS *first_frag;
1059
} mips_macro_warning;
1060
 
1061
/* Prototypes for static functions.  */
1062
 
1063
#define internalError()                                                 \
1064
    as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
1065
 
1066
enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
1067
 
1068
static void append_insn
1069
  (struct mips_cl_insn *, expressionS *, bfd_reloc_code_real_type *);
1070
static void mips_no_prev_insn (void);
1071
static void macro_build (expressionS *, const char *, const char *, ...);
1072
static void mips16_macro_build
1073
  (expressionS *, const char *, const char *, va_list *);
1074
static void load_register (int, expressionS *, int);
1075
static void macro_start (void);
1076
static void macro_end (void);
1077
static void macro (struct mips_cl_insn * ip);
1078
static void mips16_macro (struct mips_cl_insn * ip);
1079
static void mips_ip (char *str, struct mips_cl_insn * ip);
1080
static void mips16_ip (char *str, struct mips_cl_insn * ip);
1081
static void mips16_immed
1082
  (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
1083
   unsigned long *, bfd_boolean *, unsigned short *);
1084
static size_t my_getSmallExpression
1085
  (expressionS *, bfd_reloc_code_real_type *, char *);
1086
static void my_getExpression (expressionS *, char *);
1087
static void s_align (int);
1088
static void s_change_sec (int);
1089
static void s_change_section (int);
1090
static void s_cons (int);
1091
static void s_float_cons (int);
1092
static void s_mips_globl (int);
1093
static void s_option (int);
1094
static void s_mipsset (int);
1095
static void s_abicalls (int);
1096
static void s_cpload (int);
1097
static void s_cpsetup (int);
1098
static void s_cplocal (int);
1099
static void s_cprestore (int);
1100
static void s_cpreturn (int);
1101
static void s_dtprelword (int);
1102
static void s_dtpreldword (int);
1103
static void s_gpvalue (int);
1104
static void s_gpword (int);
1105
static void s_gpdword (int);
1106
static void s_cpadd (int);
1107
static void s_insn (int);
1108
static void md_obj_begin (void);
1109
static void md_obj_end (void);
1110
static void s_mips_ent (int);
1111
static void s_mips_end (int);
1112
static void s_mips_frame (int);
1113
static void s_mips_mask (int reg_type);
1114
static void s_mips_stab (int);
1115
static void s_mips_weakext (int);
1116
static void s_mips_file (int);
1117
static void s_mips_loc (int);
1118
static bfd_boolean pic_need_relax (symbolS *, asection *);
1119
static int relaxed_branch_length (fragS *, asection *, int);
1120
static int validate_mips_insn (const struct mips_opcode *);
1121
 
1122
/* Table and functions used to map between CPU/ISA names, and
1123
   ISA levels, and CPU numbers.  */
1124
 
1125
struct mips_cpu_info
1126
{
1127
  const char *name;           /* CPU or ISA name.  */
1128
  int flags;                  /* ASEs available, or ISA flag.  */
1129
  int isa;                    /* ISA level.  */
1130
  int cpu;                    /* CPU number (default CPU if ISA).  */
1131
};
1132
 
1133
#define MIPS_CPU_IS_ISA         0x0001  /* Is this an ISA?  (If 0, a CPU.) */
1134
#define MIPS_CPU_ASE_SMARTMIPS  0x0002  /* CPU implements SmartMIPS ASE */
1135
#define MIPS_CPU_ASE_DSP        0x0004  /* CPU implements DSP ASE */
1136
#define MIPS_CPU_ASE_MT         0x0008  /* CPU implements MT ASE */
1137
#define MIPS_CPU_ASE_MIPS3D     0x0010  /* CPU implements MIPS-3D ASE */
1138
#define MIPS_CPU_ASE_MDMX       0x0020  /* CPU implements MDMX ASE */
1139
#define MIPS_CPU_ASE_DSPR2      0x0040  /* CPU implements DSP R2 ASE */
1140
 
1141
static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1142
static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1143
static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1144
 
1145
/* Pseudo-op table.
1146
 
1147
   The following pseudo-ops from the Kane and Heinrich MIPS book
1148
   should be defined here, but are currently unsupported: .alias,
1149
   .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1150
 
1151
   The following pseudo-ops from the Kane and Heinrich MIPS book are
1152
   specific to the type of debugging information being generated, and
1153
   should be defined by the object format: .aent, .begin, .bend,
1154
   .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1155
   .vreg.
1156
 
1157
   The following pseudo-ops from the Kane and Heinrich MIPS book are
1158
   not MIPS CPU specific, but are also not specific to the object file
1159
   format.  This file is probably the best place to define them, but
1160
   they are not currently supported: .asm0, .endr, .lab, .struct.  */
1161
 
1162
static const pseudo_typeS mips_pseudo_table[] =
1163
{
1164
  /* MIPS specific pseudo-ops.  */
1165
  {"option", s_option, 0},
1166
  {"set", s_mipsset, 0},
1167
  {"rdata", s_change_sec, 'r'},
1168
  {"sdata", s_change_sec, 's'},
1169
  {"livereg", s_ignore, 0},
1170
  {"abicalls", s_abicalls, 0},
1171
  {"cpload", s_cpload, 0},
1172
  {"cpsetup", s_cpsetup, 0},
1173
  {"cplocal", s_cplocal, 0},
1174
  {"cprestore", s_cprestore, 0},
1175
  {"cpreturn", s_cpreturn, 0},
1176
  {"dtprelword", s_dtprelword, 0},
1177
  {"dtpreldword", s_dtpreldword, 0},
1178
  {"gpvalue", s_gpvalue, 0},
1179
  {"gpword", s_gpword, 0},
1180
  {"gpdword", s_gpdword, 0},
1181
  {"cpadd", s_cpadd, 0},
1182
  {"insn", s_insn, 0},
1183
 
1184
  /* Relatively generic pseudo-ops that happen to be used on MIPS
1185
     chips.  */
1186
  {"asciiz", stringer, 8 + 1},
1187
  {"bss", s_change_sec, 'b'},
1188
  {"err", s_err, 0},
1189
  {"half", s_cons, 1},
1190
  {"dword", s_cons, 3},
1191
  {"weakext", s_mips_weakext, 0},
1192
  {"origin", s_org, 0},
1193
  {"repeat", s_rept, 0},
1194
 
1195
  /* For MIPS this is non-standard, but we define it for consistency.  */
1196
  {"sbss", s_change_sec, 'B'},
1197
 
1198
  /* These pseudo-ops are defined in read.c, but must be overridden
1199
     here for one reason or another.  */
1200
  {"align", s_align, 0},
1201
  {"byte", s_cons, 0},
1202
  {"data", s_change_sec, 'd'},
1203
  {"double", s_float_cons, 'd'},
1204
  {"float", s_float_cons, 'f'},
1205
  {"globl", s_mips_globl, 0},
1206
  {"global", s_mips_globl, 0},
1207
  {"hword", s_cons, 1},
1208
  {"int", s_cons, 2},
1209
  {"long", s_cons, 2},
1210
  {"octa", s_cons, 4},
1211
  {"quad", s_cons, 3},
1212
  {"section", s_change_section, 0},
1213
  {"short", s_cons, 1},
1214
  {"single", s_float_cons, 'f'},
1215
  {"stabn", s_mips_stab, 'n'},
1216
  {"text", s_change_sec, 't'},
1217
  {"word", s_cons, 2},
1218
 
1219
  { "extern", ecoff_directive_extern, 0},
1220
 
1221
  { NULL, NULL, 0 },
1222
};
1223
 
1224
static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1225
{
1226
  /* These pseudo-ops should be defined by the object file format.
1227
     However, a.out doesn't support them, so we have versions here.  */
1228
  {"aent", s_mips_ent, 1},
1229
  {"bgnb", s_ignore, 0},
1230
  {"end", s_mips_end, 0},
1231
  {"endb", s_ignore, 0},
1232
  {"ent", s_mips_ent, 0},
1233
  {"file", s_mips_file, 0},
1234
  {"fmask", s_mips_mask, 'F'},
1235
  {"frame", s_mips_frame, 0},
1236
  {"loc", s_mips_loc, 0},
1237
  {"mask", s_mips_mask, 'R'},
1238
  {"verstamp", s_ignore, 0},
1239
  { NULL, NULL, 0 },
1240
};
1241
 
1242
/* Export the ABI address size for use by TC_ADDRESS_BYTES for the
1243
   purpose of the `.dc.a' internal pseudo-op.  */
1244
 
1245
int
1246
mips_address_bytes (void)
1247
{
1248
  return HAVE_64BIT_ADDRESSES ? 8 : 4;
1249
}
1250
 
1251
extern void pop_insert (const pseudo_typeS *);
1252
 
1253
void
1254
mips_pop_insert (void)
1255
{
1256
  pop_insert (mips_pseudo_table);
1257
  if (! ECOFF_DEBUGGING)
1258
    pop_insert (mips_nonecoff_pseudo_table);
1259
}
1260
 
1261
/* Symbols labelling the current insn.  */
1262
 
1263
struct insn_label_list
1264
{
1265
  struct insn_label_list *next;
1266
  symbolS *label;
1267
};
1268
 
1269
static struct insn_label_list *free_insn_labels;
1270
#define label_list tc_segment_info_data.labels
1271
 
1272
static void mips_clear_insn_labels (void);
1273
 
1274
static inline void
1275
mips_clear_insn_labels (void)
1276
{
1277
  register struct insn_label_list **pl;
1278
  segment_info_type *si;
1279
 
1280
  if (now_seg)
1281
    {
1282
      for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1283
        ;
1284
 
1285
      si = seg_info (now_seg);
1286
      *pl = si->label_list;
1287
      si->label_list = NULL;
1288
    }
1289
}
1290
 
1291
 
1292
static char *expr_end;
1293
 
1294
/* Expressions which appear in instructions.  These are set by
1295
   mips_ip.  */
1296
 
1297
static expressionS imm_expr;
1298
static expressionS imm2_expr;
1299
static expressionS offset_expr;
1300
 
1301
/* Relocs associated with imm_expr and offset_expr.  */
1302
 
1303
static bfd_reloc_code_real_type imm_reloc[3]
1304
  = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1305
static bfd_reloc_code_real_type offset_reloc[3]
1306
  = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1307
 
1308
/* These are set by mips16_ip if an explicit extension is used.  */
1309
 
1310
static bfd_boolean mips16_small, mips16_ext;
1311
 
1312
#ifdef OBJ_ELF
1313
/* The pdr segment for per procedure frame/regmask info.  Not used for
1314
   ECOFF debugging.  */
1315
 
1316
static segT pdr_seg;
1317
#endif
1318
 
1319
/* The default target format to use.  */
1320
 
1321
#if defined (TE_FreeBSD)
1322
#define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips-freebsd"
1323
#elif defined (TE_TMIPS)
1324
#define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips"
1325
#else
1326
#define ELF_TARGET(PREFIX, ENDIAN) PREFIX ENDIAN "mips"
1327
#endif
1328
 
1329
const char *
1330
mips_target_format (void)
1331
{
1332
  switch (OUTPUT_FLAVOR)
1333
    {
1334
    case bfd_target_ecoff_flavour:
1335
      return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1336
    case bfd_target_coff_flavour:
1337
      return "pe-mips";
1338
    case bfd_target_elf_flavour:
1339
#ifdef TE_VXWORKS
1340
      if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1341
        return (target_big_endian
1342
                ? "elf32-bigmips-vxworks"
1343
                : "elf32-littlemips-vxworks");
1344
#endif
1345
      return (target_big_endian
1346
              ? (HAVE_64BIT_OBJECTS
1347
                 ? ELF_TARGET ("elf64-", "big")
1348
                 : (HAVE_NEWABI
1349
                    ? ELF_TARGET ("elf32-n", "big")
1350
                    : ELF_TARGET ("elf32-", "big")))
1351
              : (HAVE_64BIT_OBJECTS
1352
                 ? ELF_TARGET ("elf64-", "little")
1353
                 : (HAVE_NEWABI
1354
                    ? ELF_TARGET ("elf32-n", "little")
1355
                    : ELF_TARGET ("elf32-", "little"))));
1356
    default:
1357
      abort ();
1358
      return NULL;
1359
    }
1360
}
1361
 
1362
/* Return the length of instruction INSN.  */
1363
 
1364
static inline unsigned int
1365
insn_length (const struct mips_cl_insn *insn)
1366
{
1367
  if (!mips_opts.mips16)
1368
    return 4;
1369
  return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1370
}
1371
 
1372
/* Initialise INSN from opcode entry MO.  Leave its position unspecified.  */
1373
 
1374
static void
1375
create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1376
{
1377
  size_t i;
1378
 
1379
  insn->insn_mo = mo;
1380
  insn->use_extend = FALSE;
1381
  insn->extend = 0;
1382
  insn->insn_opcode = mo->match;
1383
  insn->frag = NULL;
1384
  insn->where = 0;
1385
  for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1386
    insn->fixp[i] = NULL;
1387
  insn->fixed_p = (mips_opts.noreorder > 0);
1388
  insn->noreorder_p = (mips_opts.noreorder > 0);
1389
  insn->mips16_absolute_jump_p = 0;
1390
  insn->complete_p = 0;
1391
}
1392
 
1393
/* Record the current MIPS16 mode in now_seg.  */
1394
 
1395
static void
1396
mips_record_mips16_mode (void)
1397
{
1398
  segment_info_type *si;
1399
 
1400
  si = seg_info (now_seg);
1401
  if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
1402
    si->tc_segment_info_data.mips16 = mips_opts.mips16;
1403
}
1404
 
1405
/* Install INSN at the location specified by its "frag" and "where" fields.  */
1406
 
1407
static void
1408
install_insn (const struct mips_cl_insn *insn)
1409
{
1410
  char *f = insn->frag->fr_literal + insn->where;
1411
  if (!mips_opts.mips16)
1412
    md_number_to_chars (f, insn->insn_opcode, 4);
1413
  else if (insn->mips16_absolute_jump_p)
1414
    {
1415
      md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1416
      md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1417
    }
1418
  else
1419
    {
1420
      if (insn->use_extend)
1421
        {
1422
          md_number_to_chars (f, 0xf000 | insn->extend, 2);
1423
          f += 2;
1424
        }
1425
      md_number_to_chars (f, insn->insn_opcode, 2);
1426
    }
1427
  mips_record_mips16_mode ();
1428
}
1429
 
1430
/* Move INSN to offset WHERE in FRAG.  Adjust the fixups accordingly
1431
   and install the opcode in the new location.  */
1432
 
1433
static void
1434
move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1435
{
1436
  size_t i;
1437
 
1438
  insn->frag = frag;
1439
  insn->where = where;
1440
  for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1441
    if (insn->fixp[i] != NULL)
1442
      {
1443
        insn->fixp[i]->fx_frag = frag;
1444
        insn->fixp[i]->fx_where = where;
1445
      }
1446
  install_insn (insn);
1447
}
1448
 
1449
/* Add INSN to the end of the output.  */
1450
 
1451
static void
1452
add_fixed_insn (struct mips_cl_insn *insn)
1453
{
1454
  char *f = frag_more (insn_length (insn));
1455
  move_insn (insn, frag_now, f - frag_now->fr_literal);
1456
}
1457
 
1458
/* Start a variant frag and move INSN to the start of the variant part,
1459
   marking it as fixed.  The other arguments are as for frag_var.  */
1460
 
1461
static void
1462
add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1463
                  relax_substateT subtype, symbolS *symbol, offsetT offset)
1464
{
1465
  frag_grow (max_chars);
1466
  move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1467
  insn->fixed_p = 1;
1468
  frag_var (rs_machine_dependent, max_chars, var,
1469
            subtype, symbol, offset, NULL);
1470
}
1471
 
1472
/* Insert N copies of INSN into the history buffer, starting at
1473
   position FIRST.  Neither FIRST nor N need to be clipped.  */
1474
 
1475
static void
1476
insert_into_history (unsigned int first, unsigned int n,
1477
                     const struct mips_cl_insn *insn)
1478
{
1479
  if (mips_relax.sequence != 2)
1480
    {
1481
      unsigned int i;
1482
 
1483
      for (i = ARRAY_SIZE (history); i-- > first;)
1484
        if (i >= first + n)
1485
          history[i] = history[i - n];
1486
        else
1487
          history[i] = *insn;
1488
    }
1489
}
1490
 
1491
/* Emit a nop instruction, recording it in the history buffer.  */
1492
 
1493
static void
1494
emit_nop (void)
1495
{
1496
  add_fixed_insn (NOP_INSN);
1497
  insert_into_history (0, 1, NOP_INSN);
1498
}
1499
 
1500
/* Initialize vr4120_conflicts.  There is a bit of duplication here:
1501
   the idea is to make it obvious at a glance that each errata is
1502
   included.  */
1503
 
1504
static void
1505
init_vr4120_conflicts (void)
1506
{
1507
#define CONFLICT(FIRST, SECOND) \
1508
    vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1509
 
1510
  /* Errata 21 - [D]DIV[U] after [D]MACC */
1511
  CONFLICT (MACC, DIV);
1512
  CONFLICT (DMACC, DIV);
1513
 
1514
  /* Errata 23 - Continuous DMULT[U]/DMACC instructions.  */
1515
  CONFLICT (DMULT, DMULT);
1516
  CONFLICT (DMULT, DMACC);
1517
  CONFLICT (DMACC, DMULT);
1518
  CONFLICT (DMACC, DMACC);
1519
 
1520
  /* Errata 24 - MT{LO,HI} after [D]MACC */
1521
  CONFLICT (MACC, MTHILO);
1522
  CONFLICT (DMACC, MTHILO);
1523
 
1524
  /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1525
     instruction is executed immediately after a MACC or DMACC
1526
     instruction, the result of [either instruction] is incorrect."  */
1527
  CONFLICT (MACC, MULT);
1528
  CONFLICT (MACC, DMULT);
1529
  CONFLICT (DMACC, MULT);
1530
  CONFLICT (DMACC, DMULT);
1531
 
1532
  /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1533
     executed immediately after a DMULT, DMULTU, DIV, DIVU,
1534
     DDIV or DDIVU instruction, the result of the MACC or
1535
     DMACC instruction is incorrect.".  */
1536
  CONFLICT (DMULT, MACC);
1537
  CONFLICT (DMULT, DMACC);
1538
  CONFLICT (DIV, MACC);
1539
  CONFLICT (DIV, DMACC);
1540
 
1541
#undef CONFLICT
1542
}
1543
 
1544
struct regname {
1545
  const char *name;
1546
  unsigned int num;
1547
};
1548
 
1549
#define RTYPE_MASK      0x1ff00
1550
#define RTYPE_NUM       0x00100
1551
#define RTYPE_FPU       0x00200
1552
#define RTYPE_FCC       0x00400
1553
#define RTYPE_VEC       0x00800
1554
#define RTYPE_GP        0x01000
1555
#define RTYPE_CP0       0x02000
1556
#define RTYPE_PC        0x04000
1557
#define RTYPE_ACC       0x08000
1558
#define RTYPE_CCC       0x10000
1559
#define RNUM_MASK       0x000ff
1560
#define RWARN           0x80000
1561
 
1562
#define GENERIC_REGISTER_NUMBERS \
1563
    {"$0",      RTYPE_NUM | 0},  \
1564
    {"$1",      RTYPE_NUM | 1},  \
1565
    {"$2",      RTYPE_NUM | 2},  \
1566
    {"$3",      RTYPE_NUM | 3},  \
1567
    {"$4",      RTYPE_NUM | 4},  \
1568
    {"$5",      RTYPE_NUM | 5},  \
1569
    {"$6",      RTYPE_NUM | 6},  \
1570
    {"$7",      RTYPE_NUM | 7},  \
1571
    {"$8",      RTYPE_NUM | 8},  \
1572
    {"$9",      RTYPE_NUM | 9},  \
1573
    {"$10",     RTYPE_NUM | 10}, \
1574
    {"$11",     RTYPE_NUM | 11}, \
1575
    {"$12",     RTYPE_NUM | 12}, \
1576
    {"$13",     RTYPE_NUM | 13}, \
1577
    {"$14",     RTYPE_NUM | 14}, \
1578
    {"$15",     RTYPE_NUM | 15}, \
1579
    {"$16",     RTYPE_NUM | 16}, \
1580
    {"$17",     RTYPE_NUM | 17}, \
1581
    {"$18",     RTYPE_NUM | 18}, \
1582
    {"$19",     RTYPE_NUM | 19}, \
1583
    {"$20",     RTYPE_NUM | 20}, \
1584
    {"$21",     RTYPE_NUM | 21}, \
1585
    {"$22",     RTYPE_NUM | 22}, \
1586
    {"$23",     RTYPE_NUM | 23}, \
1587
    {"$24",     RTYPE_NUM | 24}, \
1588
    {"$25",     RTYPE_NUM | 25}, \
1589
    {"$26",     RTYPE_NUM | 26}, \
1590
    {"$27",     RTYPE_NUM | 27}, \
1591
    {"$28",     RTYPE_NUM | 28}, \
1592
    {"$29",     RTYPE_NUM | 29}, \
1593
    {"$30",     RTYPE_NUM | 30}, \
1594
    {"$31",     RTYPE_NUM | 31}
1595
 
1596
#define FPU_REGISTER_NAMES       \
1597
    {"$f0",     RTYPE_FPU | 0},  \
1598
    {"$f1",     RTYPE_FPU | 1},  \
1599
    {"$f2",     RTYPE_FPU | 2},  \
1600
    {"$f3",     RTYPE_FPU | 3},  \
1601
    {"$f4",     RTYPE_FPU | 4},  \
1602
    {"$f5",     RTYPE_FPU | 5},  \
1603
    {"$f6",     RTYPE_FPU | 6},  \
1604
    {"$f7",     RTYPE_FPU | 7},  \
1605
    {"$f8",     RTYPE_FPU | 8},  \
1606
    {"$f9",     RTYPE_FPU | 9},  \
1607
    {"$f10",    RTYPE_FPU | 10}, \
1608
    {"$f11",    RTYPE_FPU | 11}, \
1609
    {"$f12",    RTYPE_FPU | 12}, \
1610
    {"$f13",    RTYPE_FPU | 13}, \
1611
    {"$f14",    RTYPE_FPU | 14}, \
1612
    {"$f15",    RTYPE_FPU | 15}, \
1613
    {"$f16",    RTYPE_FPU | 16}, \
1614
    {"$f17",    RTYPE_FPU | 17}, \
1615
    {"$f18",    RTYPE_FPU | 18}, \
1616
    {"$f19",    RTYPE_FPU | 19}, \
1617
    {"$f20",    RTYPE_FPU | 20}, \
1618
    {"$f21",    RTYPE_FPU | 21}, \
1619
    {"$f22",    RTYPE_FPU | 22}, \
1620
    {"$f23",    RTYPE_FPU | 23}, \
1621
    {"$f24",    RTYPE_FPU | 24}, \
1622
    {"$f25",    RTYPE_FPU | 25}, \
1623
    {"$f26",    RTYPE_FPU | 26}, \
1624
    {"$f27",    RTYPE_FPU | 27}, \
1625
    {"$f28",    RTYPE_FPU | 28}, \
1626
    {"$f29",    RTYPE_FPU | 29}, \
1627
    {"$f30",    RTYPE_FPU | 30}, \
1628
    {"$f31",    RTYPE_FPU | 31}
1629
 
1630
#define FPU_CONDITION_CODE_NAMES \
1631
    {"$fcc0",   RTYPE_FCC | 0},  \
1632
    {"$fcc1",   RTYPE_FCC | 1},  \
1633
    {"$fcc2",   RTYPE_FCC | 2},  \
1634
    {"$fcc3",   RTYPE_FCC | 3},  \
1635
    {"$fcc4",   RTYPE_FCC | 4},  \
1636
    {"$fcc5",   RTYPE_FCC | 5},  \
1637
    {"$fcc6",   RTYPE_FCC | 6},  \
1638
    {"$fcc7",   RTYPE_FCC | 7}
1639
 
1640
#define COPROC_CONDITION_CODE_NAMES         \
1641
    {"$cc0",    RTYPE_FCC | RTYPE_CCC | 0}, \
1642
    {"$cc1",    RTYPE_FCC | RTYPE_CCC | 1}, \
1643
    {"$cc2",    RTYPE_FCC | RTYPE_CCC | 2}, \
1644
    {"$cc3",    RTYPE_FCC | RTYPE_CCC | 3}, \
1645
    {"$cc4",    RTYPE_FCC | RTYPE_CCC | 4}, \
1646
    {"$cc5",    RTYPE_FCC | RTYPE_CCC | 5}, \
1647
    {"$cc6",    RTYPE_FCC | RTYPE_CCC | 6}, \
1648
    {"$cc7",    RTYPE_FCC | RTYPE_CCC | 7}
1649
 
1650
#define N32N64_SYMBOLIC_REGISTER_NAMES \
1651
    {"$a4",     RTYPE_GP | 8},  \
1652
    {"$a5",     RTYPE_GP | 9},  \
1653
    {"$a6",     RTYPE_GP | 10}, \
1654
    {"$a7",     RTYPE_GP | 11}, \
1655
    {"$ta0",    RTYPE_GP | 8},  /* alias for $a4 */ \
1656
    {"$ta1",    RTYPE_GP | 9},  /* alias for $a5 */ \
1657
    {"$ta2",    RTYPE_GP | 10}, /* alias for $a6 */ \
1658
    {"$ta3",    RTYPE_GP | 11}, /* alias for $a7 */ \
1659
    {"$t0",     RTYPE_GP | 12}, \
1660
    {"$t1",     RTYPE_GP | 13}, \
1661
    {"$t2",     RTYPE_GP | 14}, \
1662
    {"$t3",     RTYPE_GP | 15}
1663
 
1664
#define O32_SYMBOLIC_REGISTER_NAMES \
1665
    {"$t0",     RTYPE_GP | 8},  \
1666
    {"$t1",     RTYPE_GP | 9},  \
1667
    {"$t2",     RTYPE_GP | 10}, \
1668
    {"$t3",     RTYPE_GP | 11}, \
1669
    {"$t4",     RTYPE_GP | 12}, \
1670
    {"$t5",     RTYPE_GP | 13}, \
1671
    {"$t6",     RTYPE_GP | 14}, \
1672
    {"$t7",     RTYPE_GP | 15}, \
1673
    {"$ta0",    RTYPE_GP | 12}, /* alias for $t4 */ \
1674
    {"$ta1",    RTYPE_GP | 13}, /* alias for $t5 */ \
1675
    {"$ta2",    RTYPE_GP | 14}, /* alias for $t6 */ \
1676
    {"$ta3",    RTYPE_GP | 15}  /* alias for $t7 */
1677
 
1678
/* Remaining symbolic register names */
1679
#define SYMBOLIC_REGISTER_NAMES \
1680
    {"$zero",   RTYPE_GP | 0},  \
1681
    {"$at",     RTYPE_GP | 1},  \
1682
    {"$AT",     RTYPE_GP | 1},  \
1683
    {"$v0",     RTYPE_GP | 2},  \
1684
    {"$v1",     RTYPE_GP | 3},  \
1685
    {"$a0",     RTYPE_GP | 4},  \
1686
    {"$a1",     RTYPE_GP | 5},  \
1687
    {"$a2",     RTYPE_GP | 6},  \
1688
    {"$a3",     RTYPE_GP | 7},  \
1689
    {"$s0",     RTYPE_GP | 16}, \
1690
    {"$s1",     RTYPE_GP | 17}, \
1691
    {"$s2",     RTYPE_GP | 18}, \
1692
    {"$s3",     RTYPE_GP | 19}, \
1693
    {"$s4",     RTYPE_GP | 20}, \
1694
    {"$s5",     RTYPE_GP | 21}, \
1695
    {"$s6",     RTYPE_GP | 22}, \
1696
    {"$s7",     RTYPE_GP | 23}, \
1697
    {"$t8",     RTYPE_GP | 24}, \
1698
    {"$t9",     RTYPE_GP | 25}, \
1699
    {"$k0",     RTYPE_GP | 26}, \
1700
    {"$kt0",    RTYPE_GP | 26}, \
1701
    {"$k1",     RTYPE_GP | 27}, \
1702
    {"$kt1",    RTYPE_GP | 27}, \
1703
    {"$gp",     RTYPE_GP | 28}, \
1704
    {"$sp",     RTYPE_GP | 29}, \
1705
    {"$s8",     RTYPE_GP | 30}, \
1706
    {"$fp",     RTYPE_GP | 30}, \
1707
    {"$ra",     RTYPE_GP | 31}
1708
 
1709
#define MIPS16_SPECIAL_REGISTER_NAMES \
1710
    {"$pc",     RTYPE_PC | 0}
1711
 
1712
#define MDMX_VECTOR_REGISTER_NAMES \
1713
    /* {"$v0",  RTYPE_VEC | 0},  clash with REG 2 above */ \
1714
    /* {"$v1",  RTYPE_VEC | 1},  clash with REG 3 above */ \
1715
    {"$v2",     RTYPE_VEC | 2},  \
1716
    {"$v3",     RTYPE_VEC | 3},  \
1717
    {"$v4",     RTYPE_VEC | 4},  \
1718
    {"$v5",     RTYPE_VEC | 5},  \
1719
    {"$v6",     RTYPE_VEC | 6},  \
1720
    {"$v7",     RTYPE_VEC | 7},  \
1721
    {"$v8",     RTYPE_VEC | 8},  \
1722
    {"$v9",     RTYPE_VEC | 9},  \
1723
    {"$v10",    RTYPE_VEC | 10}, \
1724
    {"$v11",    RTYPE_VEC | 11}, \
1725
    {"$v12",    RTYPE_VEC | 12}, \
1726
    {"$v13",    RTYPE_VEC | 13}, \
1727
    {"$v14",    RTYPE_VEC | 14}, \
1728
    {"$v15",    RTYPE_VEC | 15}, \
1729
    {"$v16",    RTYPE_VEC | 16}, \
1730
    {"$v17",    RTYPE_VEC | 17}, \
1731
    {"$v18",    RTYPE_VEC | 18}, \
1732
    {"$v19",    RTYPE_VEC | 19}, \
1733
    {"$v20",    RTYPE_VEC | 20}, \
1734
    {"$v21",    RTYPE_VEC | 21}, \
1735
    {"$v22",    RTYPE_VEC | 22}, \
1736
    {"$v23",    RTYPE_VEC | 23}, \
1737
    {"$v24",    RTYPE_VEC | 24}, \
1738
    {"$v25",    RTYPE_VEC | 25}, \
1739
    {"$v26",    RTYPE_VEC | 26}, \
1740
    {"$v27",    RTYPE_VEC | 27}, \
1741
    {"$v28",    RTYPE_VEC | 28}, \
1742
    {"$v29",    RTYPE_VEC | 29}, \
1743
    {"$v30",    RTYPE_VEC | 30}, \
1744
    {"$v31",    RTYPE_VEC | 31}
1745
 
1746
#define MIPS_DSP_ACCUMULATOR_NAMES \
1747
    {"$ac0",    RTYPE_ACC | 0}, \
1748
    {"$ac1",    RTYPE_ACC | 1}, \
1749
    {"$ac2",    RTYPE_ACC | 2}, \
1750
    {"$ac3",    RTYPE_ACC | 3}
1751
 
1752
static const struct regname reg_names[] = {
1753
  GENERIC_REGISTER_NUMBERS,
1754
  FPU_REGISTER_NAMES,
1755
  FPU_CONDITION_CODE_NAMES,
1756
  COPROC_CONDITION_CODE_NAMES,
1757
 
1758
  /* The $txx registers depends on the abi,
1759
     these will be added later into the symbol table from
1760
     one of the tables below once mips_abi is set after
1761
     parsing of arguments from the command line. */
1762
  SYMBOLIC_REGISTER_NAMES,
1763
 
1764
  MIPS16_SPECIAL_REGISTER_NAMES,
1765
  MDMX_VECTOR_REGISTER_NAMES,
1766
  MIPS_DSP_ACCUMULATOR_NAMES,
1767
  {0, 0}
1768
};
1769
 
1770
static const struct regname reg_names_o32[] = {
1771
  O32_SYMBOLIC_REGISTER_NAMES,
1772
  {0, 0}
1773
};
1774
 
1775
static const struct regname reg_names_n32n64[] = {
1776
  N32N64_SYMBOLIC_REGISTER_NAMES,
1777
  {0, 0}
1778
};
1779
 
1780
static int
1781
reg_lookup (char **s, unsigned int types, unsigned int *regnop)
1782
{
1783
  symbolS *symbolP;
1784
  char *e;
1785
  char save_c;
1786
  int reg = -1;
1787
 
1788
  /* Find end of name.  */
1789
  e = *s;
1790
  if (is_name_beginner (*e))
1791
    ++e;
1792
  while (is_part_of_name (*e))
1793
    ++e;
1794
 
1795
  /* Terminate name.  */
1796
  save_c = *e;
1797
  *e = '\0';
1798
 
1799
  /* Look for a register symbol.  */
1800
  if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
1801
    {
1802
      int r = S_GET_VALUE (symbolP);
1803
      if (r & types)
1804
        reg = r & RNUM_MASK;
1805
      else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
1806
        /* Convert GP reg $v0/1 to MDMX reg $v0/1!  */
1807
        reg = (r & RNUM_MASK) - 2;
1808
    }
1809
  /* Else see if this is a register defined in an itbl entry.  */
1810
  else if ((types & RTYPE_GP) && itbl_have_entries)
1811
    {
1812
      char *n = *s;
1813
      unsigned long r;
1814
 
1815
      if (*n == '$')
1816
        ++n;
1817
      if (itbl_get_reg_val (n, &r))
1818
        reg = r & RNUM_MASK;
1819
    }
1820
 
1821
  /* Advance to next token if a register was recognised.  */
1822
  if (reg >= 0)
1823
    *s = e;
1824
  else if (types & RWARN)
1825
    as_warn (_("Unrecognized register name `%s'"), *s);
1826
 
1827
  *e = save_c;
1828
  if (regnop)
1829
    *regnop = reg;
1830
  return reg >= 0;
1831
}
1832
 
1833
/* Return TRUE if opcode MO is valid on the currently selected ISA and
1834
   architecture.  Use is_opcode_valid_16 for MIPS16 opcodes.  */
1835
 
1836
static bfd_boolean
1837
is_opcode_valid (const struct mips_opcode *mo)
1838
{
1839
  int isa = mips_opts.isa;
1840
  int fp_s, fp_d;
1841
 
1842
  if (mips_opts.ase_mdmx)
1843
    isa |= INSN_MDMX;
1844
  if (mips_opts.ase_dsp)
1845
    isa |= INSN_DSP;
1846
  if (mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
1847
    isa |= INSN_DSP64;
1848
  if (mips_opts.ase_dspr2)
1849
    isa |= INSN_DSPR2;
1850
  if (mips_opts.ase_mt)
1851
    isa |= INSN_MT;
1852
  if (mips_opts.ase_mips3d)
1853
    isa |= INSN_MIPS3D;
1854
  if (mips_opts.ase_smartmips)
1855
    isa |= INSN_SMARTMIPS;
1856
 
1857
  /* Don't accept instructions based on the ISA if the CPU does not implement
1858
     all the coprocessor insns. */
1859
  if (NO_ISA_COP (mips_opts.arch)
1860
      && COP_INSN (mo->pinfo))
1861
    isa = 0;
1862
 
1863
  if (!OPCODE_IS_MEMBER (mo, isa, mips_opts.arch))
1864
    return FALSE;
1865
 
1866
  /* Check whether the instruction or macro requires single-precision or
1867
     double-precision floating-point support.  Note that this information is
1868
     stored differently in the opcode table for insns and macros.  */
1869
  if (mo->pinfo == INSN_MACRO)
1870
    {
1871
      fp_s = mo->pinfo2 & INSN2_M_FP_S;
1872
      fp_d = mo->pinfo2 & INSN2_M_FP_D;
1873
    }
1874
  else
1875
    {
1876
      fp_s = mo->pinfo & FP_S;
1877
      fp_d = mo->pinfo & FP_D;
1878
    }
1879
 
1880
  if (fp_d && (mips_opts.soft_float || mips_opts.single_float))
1881
    return FALSE;
1882
 
1883
  if (fp_s && mips_opts.soft_float)
1884
    return FALSE;
1885
 
1886
  return TRUE;
1887
}
1888
 
1889
/* Return TRUE if the MIPS16 opcode MO is valid on the currently
1890
   selected ISA and architecture.  */
1891
 
1892
static bfd_boolean
1893
is_opcode_valid_16 (const struct mips_opcode *mo)
1894
{
1895
  return OPCODE_IS_MEMBER (mo, mips_opts.isa, mips_opts.arch) ? TRUE : FALSE;
1896
}
1897
 
1898
/* This function is called once, at assembler startup time.  It should set up
1899
   all the tables, etc. that the MD part of the assembler will need.  */
1900
 
1901
void
1902
md_begin (void)
1903
{
1904
  const char *retval = NULL;
1905
  int i = 0;
1906
  int broken = 0;
1907
 
1908
  if (mips_pic != NO_PIC)
1909
    {
1910
      if (g_switch_seen && g_switch_value != 0)
1911
        as_bad (_("-G may not be used in position-independent code"));
1912
      g_switch_value = 0;
1913
    }
1914
 
1915
  if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
1916
    as_warn (_("Could not set architecture and machine"));
1917
 
1918
  op_hash = hash_new ();
1919
 
1920
  for (i = 0; i < NUMOPCODES;)
1921
    {
1922
      const char *name = mips_opcodes[i].name;
1923
 
1924
      retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
1925
      if (retval != NULL)
1926
        {
1927
          fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1928
                   mips_opcodes[i].name, retval);
1929
          /* Probably a memory allocation problem?  Give up now.  */
1930
          as_fatal (_("Broken assembler.  No assembly attempted."));
1931
        }
1932
      do
1933
        {
1934
          if (mips_opcodes[i].pinfo != INSN_MACRO)
1935
            {
1936
              if (!validate_mips_insn (&mips_opcodes[i]))
1937
                broken = 1;
1938
              if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1939
                {
1940
                  create_insn (&nop_insn, mips_opcodes + i);
1941
                  if (mips_fix_loongson2f_nop)
1942
                    nop_insn.insn_opcode = LOONGSON2F_NOP_INSN;
1943
                  nop_insn.fixed_p = 1;
1944
                }
1945
            }
1946
          ++i;
1947
        }
1948
      while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1949
    }
1950
 
1951
  mips16_op_hash = hash_new ();
1952
 
1953
  i = 0;
1954
  while (i < bfd_mips16_num_opcodes)
1955
    {
1956
      const char *name = mips16_opcodes[i].name;
1957
 
1958
      retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
1959
      if (retval != NULL)
1960
        as_fatal (_("internal: can't hash `%s': %s"),
1961
                  mips16_opcodes[i].name, retval);
1962
      do
1963
        {
1964
          if (mips16_opcodes[i].pinfo != INSN_MACRO
1965
              && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1966
                  != mips16_opcodes[i].match))
1967
            {
1968
              fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1969
                       mips16_opcodes[i].name, mips16_opcodes[i].args);
1970
              broken = 1;
1971
            }
1972
          if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1973
            {
1974
              create_insn (&mips16_nop_insn, mips16_opcodes + i);
1975
              mips16_nop_insn.fixed_p = 1;
1976
            }
1977
          ++i;
1978
        }
1979
      while (i < bfd_mips16_num_opcodes
1980
             && strcmp (mips16_opcodes[i].name, name) == 0);
1981
    }
1982
 
1983
  if (broken)
1984
    as_fatal (_("Broken assembler.  No assembly attempted."));
1985
 
1986
  /* We add all the general register names to the symbol table.  This
1987
     helps us detect invalid uses of them.  */
1988
  for (i = 0; reg_names[i].name; i++)
1989
    symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
1990
                                     reg_names[i].num, /* & RNUM_MASK, */
1991
                                     &zero_address_frag));
1992
  if (HAVE_NEWABI)
1993
    for (i = 0; reg_names_n32n64[i].name; i++)
1994
      symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
1995
                                       reg_names_n32n64[i].num, /* & RNUM_MASK, */
1996
                                       &zero_address_frag));
1997
  else
1998
    for (i = 0; reg_names_o32[i].name; i++)
1999
      symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
2000
                                       reg_names_o32[i].num, /* & RNUM_MASK, */
2001
                                       &zero_address_frag));
2002
 
2003
  mips_no_prev_insn ();
2004
 
2005
  mips_gprmask = 0;
2006
  mips_cprmask[0] = 0;
2007
  mips_cprmask[1] = 0;
2008
  mips_cprmask[2] = 0;
2009
  mips_cprmask[3] = 0;
2010
 
2011
  /* set the default alignment for the text section (2**2) */
2012
  record_alignment (text_section, 2);
2013
 
2014
  bfd_set_gp_size (stdoutput, g_switch_value);
2015
 
2016
#ifdef OBJ_ELF
2017
  if (IS_ELF)
2018
    {
2019
      /* On a native system other than VxWorks, sections must be aligned
2020
         to 16 byte boundaries.  When configured for an embedded ELF
2021
         target, we don't bother.  */
2022
      if (strncmp (TARGET_OS, "elf", 3) != 0
2023
          && strncmp (TARGET_OS, "vxworks", 7) != 0)
2024
        {
2025
          (void) bfd_set_section_alignment (stdoutput, text_section, 4);
2026
          (void) bfd_set_section_alignment (stdoutput, data_section, 4);
2027
          (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
2028
        }
2029
 
2030
      /* Create a .reginfo section for register masks and a .mdebug
2031
         section for debugging information.  */
2032
      {
2033
        segT seg;
2034
        subsegT subseg;
2035
        flagword flags;
2036
        segT sec;
2037
 
2038
        seg = now_seg;
2039
        subseg = now_subseg;
2040
 
2041
        /* The ABI says this section should be loaded so that the
2042
           running program can access it.  However, we don't load it
2043
           if we are configured for an embedded target */
2044
        flags = SEC_READONLY | SEC_DATA;
2045
        if (strncmp (TARGET_OS, "elf", 3) != 0)
2046
          flags |= SEC_ALLOC | SEC_LOAD;
2047
 
2048
        if (mips_abi != N64_ABI)
2049
          {
2050
            sec = subseg_new (".reginfo", (subsegT) 0);
2051
 
2052
            bfd_set_section_flags (stdoutput, sec, flags);
2053
            bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
2054
 
2055
            mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
2056
          }
2057
        else
2058
          {
2059
            /* The 64-bit ABI uses a .MIPS.options section rather than
2060
               .reginfo section.  */
2061
            sec = subseg_new (".MIPS.options", (subsegT) 0);
2062
            bfd_set_section_flags (stdoutput, sec, flags);
2063
            bfd_set_section_alignment (stdoutput, sec, 3);
2064
 
2065
            /* Set up the option header.  */
2066
            {
2067
              Elf_Internal_Options opthdr;
2068
              char *f;
2069
 
2070
              opthdr.kind = ODK_REGINFO;
2071
              opthdr.size = (sizeof (Elf_External_Options)
2072
                             + sizeof (Elf64_External_RegInfo));
2073
              opthdr.section = 0;
2074
              opthdr.info = 0;
2075
              f = frag_more (sizeof (Elf_External_Options));
2076
              bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
2077
                                             (Elf_External_Options *) f);
2078
 
2079
              mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
2080
            }
2081
          }
2082
 
2083
        if (ECOFF_DEBUGGING)
2084
          {
2085
            sec = subseg_new (".mdebug", (subsegT) 0);
2086
            (void) bfd_set_section_flags (stdoutput, sec,
2087
                                          SEC_HAS_CONTENTS | SEC_READONLY);
2088
            (void) bfd_set_section_alignment (stdoutput, sec, 2);
2089
          }
2090
        else if (mips_flag_pdr)
2091
          {
2092
            pdr_seg = subseg_new (".pdr", (subsegT) 0);
2093
            (void) bfd_set_section_flags (stdoutput, pdr_seg,
2094
                                          SEC_READONLY | SEC_RELOC
2095
                                          | SEC_DEBUGGING);
2096
            (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
2097
          }
2098
 
2099
        subseg_set (seg, subseg);
2100
      }
2101
    }
2102
#endif /* OBJ_ELF */
2103
 
2104
  if (! ECOFF_DEBUGGING)
2105
    md_obj_begin ();
2106
 
2107
  if (mips_fix_vr4120)
2108
    init_vr4120_conflicts ();
2109
}
2110
 
2111
void
2112
md_mips_end (void)
2113
{
2114
  if (! ECOFF_DEBUGGING)
2115
    md_obj_end ();
2116
}
2117
 
2118
void
2119
md_assemble (char *str)
2120
{
2121
  struct mips_cl_insn insn;
2122
  bfd_reloc_code_real_type unused_reloc[3]
2123
    = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
2124
 
2125
  imm_expr.X_op = O_absent;
2126
  imm2_expr.X_op = O_absent;
2127
  offset_expr.X_op = O_absent;
2128
  imm_reloc[0] = BFD_RELOC_UNUSED;
2129
  imm_reloc[1] = BFD_RELOC_UNUSED;
2130
  imm_reloc[2] = BFD_RELOC_UNUSED;
2131
  offset_reloc[0] = BFD_RELOC_UNUSED;
2132
  offset_reloc[1] = BFD_RELOC_UNUSED;
2133
  offset_reloc[2] = BFD_RELOC_UNUSED;
2134
 
2135
  if (mips_opts.mips16)
2136
    mips16_ip (str, &insn);
2137
  else
2138
    {
2139
      mips_ip (str, &insn);
2140
      DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
2141
            str, insn.insn_opcode));
2142
    }
2143
 
2144
  if (insn_error)
2145
    {
2146
      as_bad ("%s `%s'", insn_error, str);
2147
      return;
2148
    }
2149
 
2150
  if (insn.insn_mo->pinfo == INSN_MACRO)
2151
    {
2152
      macro_start ();
2153
      if (mips_opts.mips16)
2154
        mips16_macro (&insn);
2155
      else
2156
        macro (&insn);
2157
      macro_end ();
2158
    }
2159
  else
2160
    {
2161
      if (imm_expr.X_op != O_absent)
2162
        append_insn (&insn, &imm_expr, imm_reloc);
2163
      else if (offset_expr.X_op != O_absent)
2164
        append_insn (&insn, &offset_expr, offset_reloc);
2165
      else
2166
        append_insn (&insn, NULL, unused_reloc);
2167
    }
2168
}
2169
 
2170
/* Convenience functions for abstracting away the differences between
2171
   MIPS16 and non-MIPS16 relocations.  */
2172
 
2173
static inline bfd_boolean
2174
mips16_reloc_p (bfd_reloc_code_real_type reloc)
2175
{
2176
  switch (reloc)
2177
    {
2178
    case BFD_RELOC_MIPS16_JMP:
2179
    case BFD_RELOC_MIPS16_GPREL:
2180
    case BFD_RELOC_MIPS16_GOT16:
2181
    case BFD_RELOC_MIPS16_CALL16:
2182
    case BFD_RELOC_MIPS16_HI16_S:
2183
    case BFD_RELOC_MIPS16_HI16:
2184
    case BFD_RELOC_MIPS16_LO16:
2185
      return TRUE;
2186
 
2187
    default:
2188
      return FALSE;
2189
    }
2190
}
2191
 
2192
static inline bfd_boolean
2193
got16_reloc_p (bfd_reloc_code_real_type reloc)
2194
{
2195
  return reloc == BFD_RELOC_MIPS_GOT16 || reloc == BFD_RELOC_MIPS16_GOT16;
2196
}
2197
 
2198
static inline bfd_boolean
2199
hi16_reloc_p (bfd_reloc_code_real_type reloc)
2200
{
2201
  return reloc == BFD_RELOC_HI16_S || reloc == BFD_RELOC_MIPS16_HI16_S;
2202
}
2203
 
2204
static inline bfd_boolean
2205
lo16_reloc_p (bfd_reloc_code_real_type reloc)
2206
{
2207
  return reloc == BFD_RELOC_LO16 || reloc == BFD_RELOC_MIPS16_LO16;
2208
}
2209
 
2210
/* Return true if the given relocation might need a matching %lo().
2211
   This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2212
   need a matching %lo() when applied to local symbols.  */
2213
 
2214
static inline bfd_boolean
2215
reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
2216
{
2217
  return (HAVE_IN_PLACE_ADDENDS
2218
          && (hi16_reloc_p (reloc)
2219
              /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2220
                 all GOT16 relocations evaluate to "G".  */
2221
              || (got16_reloc_p (reloc) && mips_pic != VXWORKS_PIC)));
2222
}
2223
 
2224
/* Return the type of %lo() reloc needed by RELOC, given that
2225
   reloc_needs_lo_p.  */
2226
 
2227
static inline bfd_reloc_code_real_type
2228
matching_lo_reloc (bfd_reloc_code_real_type reloc)
2229
{
2230
  return mips16_reloc_p (reloc) ? BFD_RELOC_MIPS16_LO16 : BFD_RELOC_LO16;
2231
}
2232
 
2233
/* Return true if the given fixup is followed by a matching R_MIPS_LO16
2234
   relocation.  */
2235
 
2236
static inline bfd_boolean
2237
fixup_has_matching_lo_p (fixS *fixp)
2238
{
2239
  return (fixp->fx_next != NULL
2240
          && fixp->fx_next->fx_r_type == matching_lo_reloc (fixp->fx_r_type)
2241
          && fixp->fx_addsy == fixp->fx_next->fx_addsy
2242
          && fixp->fx_offset == fixp->fx_next->fx_offset);
2243
}
2244
 
2245
/* See whether instruction IP reads register REG.  CLASS is the type
2246
   of register.  */
2247
 
2248
static int
2249
insn_uses_reg (const struct mips_cl_insn *ip, unsigned int reg,
2250
               enum mips_regclass regclass)
2251
{
2252
  if (regclass == MIPS16_REG)
2253
    {
2254
      gas_assert (mips_opts.mips16);
2255
      reg = mips16_to_32_reg_map[reg];
2256
      regclass = MIPS_GR_REG;
2257
    }
2258
 
2259
  /* Don't report on general register ZERO, since it never changes.  */
2260
  if (regclass == MIPS_GR_REG && reg == ZERO)
2261
    return 0;
2262
 
2263
  if (regclass == MIPS_FP_REG)
2264
    {
2265
      gas_assert (! mips_opts.mips16);
2266
      /* If we are called with either $f0 or $f1, we must check $f0.
2267
         This is not optimal, because it will introduce an unnecessary
2268
         NOP between "lwc1 $f0" and "swc1 $f1".  To fix this we would
2269
         need to distinguish reading both $f0 and $f1 or just one of
2270
         them.  Note that we don't have to check the other way,
2271
         because there is no instruction that sets both $f0 and $f1
2272
         and requires a delay.  */
2273
      if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
2274
          && ((EXTRACT_OPERAND (FS, *ip) & ~(unsigned) 1)
2275
              == (reg &~ (unsigned) 1)))
2276
        return 1;
2277
      if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
2278
          && ((EXTRACT_OPERAND (FT, *ip) & ~(unsigned) 1)
2279
              == (reg &~ (unsigned) 1)))
2280
        return 1;
2281
      if ((ip->insn_mo->pinfo2 & INSN2_READ_FPR_Z)
2282
          && ((EXTRACT_OPERAND (FZ, *ip) & ~(unsigned) 1)
2283
              == (reg &~ (unsigned) 1)))
2284
        return 1;
2285
    }
2286
  else if (! mips_opts.mips16)
2287
    {
2288
      if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
2289
          && EXTRACT_OPERAND (RS, *ip) == reg)
2290
        return 1;
2291
      if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
2292
          && EXTRACT_OPERAND (RT, *ip) == reg)
2293
        return 1;
2294
      if ((ip->insn_mo->pinfo2 & INSN2_READ_GPR_D)
2295
          && EXTRACT_OPERAND (RD, *ip) == reg)
2296
        return 1;
2297
      if ((ip->insn_mo->pinfo2 & INSN2_READ_GPR_Z)
2298
          && EXTRACT_OPERAND (RZ, *ip) == reg)
2299
        return 1;
2300
    }
2301
  else
2302
    {
2303
      if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
2304
          && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)] == reg)
2305
        return 1;
2306
      if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
2307
          && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)] == reg)
2308
        return 1;
2309
      if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
2310
          && (mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]
2311
              == reg))
2312
        return 1;
2313
      if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
2314
        return 1;
2315
      if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
2316
        return 1;
2317
      if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
2318
        return 1;
2319
      if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
2320
          && MIPS16_EXTRACT_OPERAND (REGR32, *ip) == reg)
2321
        return 1;
2322
    }
2323
 
2324
  return 0;
2325
}
2326
 
2327
/* This function returns true if modifying a register requires a
2328
   delay.  */
2329
 
2330
static int
2331
reg_needs_delay (unsigned int reg)
2332
{
2333
  unsigned long prev_pinfo;
2334
 
2335
  prev_pinfo = history[0].insn_mo->pinfo;
2336
  if (! mips_opts.noreorder
2337
      && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2338
           && ! gpr_interlocks)
2339
          || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2340
              && ! cop_interlocks)))
2341
    {
2342
      /* A load from a coprocessor or from memory.  All load delays
2343
         delay the use of general register rt for one instruction.  */
2344
      /* Itbl support may require additional care here.  */
2345
      know (prev_pinfo & INSN_WRITE_GPR_T);
2346
      if (reg == EXTRACT_OPERAND (RT, history[0]))
2347
        return 1;
2348
    }
2349
 
2350
  return 0;
2351
}
2352
 
2353
/* Move all labels in insn_labels to the current insertion point.  */
2354
 
2355
static void
2356
mips_move_labels (void)
2357
{
2358
  segment_info_type *si = seg_info (now_seg);
2359
  struct insn_label_list *l;
2360
  valueT val;
2361
 
2362
  for (l = si->label_list; l != NULL; l = l->next)
2363
    {
2364
      gas_assert (S_GET_SEGMENT (l->label) == now_seg);
2365
      symbol_set_frag (l->label, frag_now);
2366
      val = (valueT) frag_now_fix ();
2367
      /* mips16 text labels are stored as odd.  */
2368
      if (mips_opts.mips16)
2369
        ++val;
2370
      S_SET_VALUE (l->label, val);
2371
    }
2372
}
2373
 
2374
static bfd_boolean
2375
s_is_linkonce (symbolS *sym, segT from_seg)
2376
{
2377
  bfd_boolean linkonce = FALSE;
2378
  segT symseg = S_GET_SEGMENT (sym);
2379
 
2380
  if (symseg != from_seg && !S_IS_LOCAL (sym))
2381
    {
2382
      if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
2383
        linkonce = TRUE;
2384
#ifdef OBJ_ELF
2385
      /* The GNU toolchain uses an extension for ELF: a section
2386
         beginning with the magic string .gnu.linkonce is a
2387
         linkonce section.  */
2388
      if (strncmp (segment_name (symseg), ".gnu.linkonce",
2389
                   sizeof ".gnu.linkonce" - 1) == 0)
2390
        linkonce = TRUE;
2391
#endif
2392
    }
2393
  return linkonce;
2394
}
2395
 
2396
/* Mark instruction labels in mips16 mode.  This permits the linker to
2397
   handle them specially, such as generating jalx instructions when
2398
   needed.  We also make them odd for the duration of the assembly, in
2399
   order to generate the right sort of code.  We will make them even
2400
   in the adjust_symtab routine, while leaving them marked.  This is
2401
   convenient for the debugger and the disassembler.  The linker knows
2402
   to make them odd again.  */
2403
 
2404
static void
2405
mips16_mark_labels (void)
2406
{
2407
  segment_info_type *si = seg_info (now_seg);
2408
  struct insn_label_list *l;
2409
 
2410
  if (!mips_opts.mips16)
2411
    return;
2412
 
2413
  for (l = si->label_list; l != NULL; l = l->next)
2414
   {
2415
      symbolS *label = l->label;
2416
 
2417
#if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
2418
      if (IS_ELF)
2419
        S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label)));
2420
#endif
2421
      if ((S_GET_VALUE (label) & 1) == 0
2422
        /* Don't adjust the address if the label is global or weak, or
2423
           in a link-once section, since we'll be emitting symbol reloc
2424
           references to it which will be patched up by the linker, and
2425
           the final value of the symbol may or may not be MIPS16.  */
2426
          && ! S_IS_WEAK (label)
2427
          && ! S_IS_EXTERNAL (label)
2428
          && ! s_is_linkonce (label, now_seg))
2429
        S_SET_VALUE (label, S_GET_VALUE (label) | 1);
2430
    }
2431
}
2432
 
2433
/* End the current frag.  Make it a variant frag and record the
2434
   relaxation info.  */
2435
 
2436
static void
2437
relax_close_frag (void)
2438
{
2439
  mips_macro_warning.first_frag = frag_now;
2440
  frag_var (rs_machine_dependent, 0, 0,
2441
            RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
2442
            mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2443
 
2444
  memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2445
  mips_relax.first_fixup = 0;
2446
}
2447
 
2448
/* Start a new relaxation sequence whose expansion depends on SYMBOL.
2449
   See the comment above RELAX_ENCODE for more details.  */
2450
 
2451
static void
2452
relax_start (symbolS *symbol)
2453
{
2454
  gas_assert (mips_relax.sequence == 0);
2455
  mips_relax.sequence = 1;
2456
  mips_relax.symbol = symbol;
2457
}
2458
 
2459
/* Start generating the second version of a relaxable sequence.
2460
   See the comment above RELAX_ENCODE for more details.  */
2461
 
2462
static void
2463
relax_switch (void)
2464
{
2465
  gas_assert (mips_relax.sequence == 1);
2466
  mips_relax.sequence = 2;
2467
}
2468
 
2469
/* End the current relaxable sequence.  */
2470
 
2471
static void
2472
relax_end (void)
2473
{
2474
  gas_assert (mips_relax.sequence == 2);
2475
  relax_close_frag ();
2476
  mips_relax.sequence = 0;
2477
}
2478
 
2479
/* Classify an instruction according to the FIX_VR4120_* enumeration.
2480
   Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
2481
   by VR4120 errata.  */
2482
 
2483
static unsigned int
2484
classify_vr4120_insn (const char *name)
2485
{
2486
  if (strncmp (name, "macc", 4) == 0)
2487
    return FIX_VR4120_MACC;
2488
  if (strncmp (name, "dmacc", 5) == 0)
2489
    return FIX_VR4120_DMACC;
2490
  if (strncmp (name, "mult", 4) == 0)
2491
    return FIX_VR4120_MULT;
2492
  if (strncmp (name, "dmult", 5) == 0)
2493
    return FIX_VR4120_DMULT;
2494
  if (strstr (name, "div"))
2495
    return FIX_VR4120_DIV;
2496
  if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
2497
    return FIX_VR4120_MTHILO;
2498
  return NUM_FIX_VR4120_CLASSES;
2499
}
2500
 
2501
#define INSN_ERET  0x42000018
2502
#define INSN_DERET 0x4200001f
2503
 
2504
/* Return the number of instructions that must separate INSN1 and INSN2,
2505
   where INSN1 is the earlier instruction.  Return the worst-case value
2506
   for any INSN2 if INSN2 is null.  */
2507
 
2508
static unsigned int
2509
insns_between (const struct mips_cl_insn *insn1,
2510
               const struct mips_cl_insn *insn2)
2511
{
2512
  unsigned long pinfo1, pinfo2;
2513
 
2514
  /* This function needs to know which pinfo flags are set for INSN2
2515
     and which registers INSN2 uses.  The former is stored in PINFO2 and
2516
     the latter is tested via INSN2_USES_REG.  If INSN2 is null, PINFO2
2517
     will have every flag set and INSN2_USES_REG will always return true.  */
2518
  pinfo1 = insn1->insn_mo->pinfo;
2519
  pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
2520
 
2521
#define INSN2_USES_REG(REG, CLASS) \
2522
   (insn2 == NULL || insn_uses_reg (insn2, REG, CLASS))
2523
 
2524
  /* For most targets, write-after-read dependencies on the HI and LO
2525
     registers must be separated by at least two instructions.  */
2526
  if (!hilo_interlocks)
2527
    {
2528
      if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
2529
        return 2;
2530
      if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
2531
        return 2;
2532
    }
2533
 
2534
  /* If we're working around r7000 errata, there must be two instructions
2535
     between an mfhi or mflo and any instruction that uses the result.  */
2536
  if (mips_7000_hilo_fix
2537
      && MF_HILO_INSN (pinfo1)
2538
      && INSN2_USES_REG (EXTRACT_OPERAND (RD, *insn1), MIPS_GR_REG))
2539
    return 2;
2540
 
2541
  /* If we're working around 24K errata, one instruction is required
2542
     if an ERET or DERET is followed by a branch instruction.  */
2543
  if (mips_fix_24k)
2544
    {
2545
      if (insn1->insn_opcode == INSN_ERET
2546
          || insn1->insn_opcode == INSN_DERET)
2547
        {
2548
          if (insn2 == NULL
2549
              || insn2->insn_opcode == INSN_ERET
2550
              || insn2->insn_opcode == INSN_DERET
2551
              || (insn2->insn_mo->pinfo
2552
                  & (INSN_UNCOND_BRANCH_DELAY
2553
                     | INSN_COND_BRANCH_DELAY
2554
                     | INSN_COND_BRANCH_LIKELY)) != 0)
2555
            return 1;
2556
        }
2557
    }
2558
 
2559
  /* If working around VR4120 errata, check for combinations that need
2560
     a single intervening instruction.  */
2561
  if (mips_fix_vr4120)
2562
    {
2563
      unsigned int class1, class2;
2564
 
2565
      class1 = classify_vr4120_insn (insn1->insn_mo->name);
2566
      if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
2567
        {
2568
          if (insn2 == NULL)
2569
            return 1;
2570
          class2 = classify_vr4120_insn (insn2->insn_mo->name);
2571
          if (vr4120_conflicts[class1] & (1 << class2))
2572
            return 1;
2573
        }
2574
    }
2575
 
2576
  if (!mips_opts.mips16)
2577
    {
2578
      /* Check for GPR or coprocessor load delays.  All such delays
2579
         are on the RT register.  */
2580
      /* Itbl support may require additional care here.  */
2581
      if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
2582
          || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
2583
        {
2584
          know (pinfo1 & INSN_WRITE_GPR_T);
2585
          if (INSN2_USES_REG (EXTRACT_OPERAND (RT, *insn1), MIPS_GR_REG))
2586
            return 1;
2587
        }
2588
 
2589
      /* Check for generic coprocessor hazards.
2590
 
2591
         This case is not handled very well.  There is no special
2592
         knowledge of CP0 handling, and the coprocessors other than
2593
         the floating point unit are not distinguished at all.  */
2594
      /* Itbl support may require additional care here. FIXME!
2595
         Need to modify this to include knowledge about
2596
         user specified delays!  */
2597
      else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
2598
               || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
2599
        {
2600
          /* Handle cases where INSN1 writes to a known general coprocessor
2601
             register.  There must be a one instruction delay before INSN2
2602
             if INSN2 reads that register, otherwise no delay is needed.  */
2603
          if (pinfo1 & INSN_WRITE_FPR_T)
2604
            {
2605
              if (INSN2_USES_REG (EXTRACT_OPERAND (FT, *insn1), MIPS_FP_REG))
2606
                return 1;
2607
            }
2608
          else if (pinfo1 & INSN_WRITE_FPR_S)
2609
            {
2610
              if (INSN2_USES_REG (EXTRACT_OPERAND (FS, *insn1), MIPS_FP_REG))
2611
                return 1;
2612
            }
2613
          else
2614
            {
2615
              /* Read-after-write dependencies on the control registers
2616
                 require a two-instruction gap.  */
2617
              if ((pinfo1 & INSN_WRITE_COND_CODE)
2618
                  && (pinfo2 & INSN_READ_COND_CODE))
2619
                return 2;
2620
 
2621
              /* We don't know exactly what INSN1 does.  If INSN2 is
2622
                 also a coprocessor instruction, assume there must be
2623
                 a one instruction gap.  */
2624
              if (pinfo2 & INSN_COP)
2625
                return 1;
2626
            }
2627
        }
2628
 
2629
      /* Check for read-after-write dependencies on the coprocessor
2630
         control registers in cases where INSN1 does not need a general
2631
         coprocessor delay.  This means that INSN1 is a floating point
2632
         comparison instruction.  */
2633
      /* Itbl support may require additional care here.  */
2634
      else if (!cop_interlocks
2635
               && (pinfo1 & INSN_WRITE_COND_CODE)
2636
               && (pinfo2 & INSN_READ_COND_CODE))
2637
        return 1;
2638
    }
2639
 
2640
#undef INSN2_USES_REG
2641
 
2642
  return 0;
2643
}
2644
 
2645
/* Return the number of nops that would be needed to work around the
2646
   VR4130 mflo/mfhi errata if instruction INSN immediately followed
2647
   the MAX_VR4130_NOPS instructions described by HIST.  */
2648
 
2649
static int
2650
nops_for_vr4130 (const struct mips_cl_insn *hist,
2651
                 const struct mips_cl_insn *insn)
2652
{
2653
  int i, j, reg;
2654
 
2655
  /* Check if the instruction writes to HI or LO.  MTHI and MTLO
2656
     are not affected by the errata.  */
2657
  if (insn != 0
2658
      && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
2659
          || strcmp (insn->insn_mo->name, "mtlo") == 0
2660
          || strcmp (insn->insn_mo->name, "mthi") == 0))
2661
    return 0;
2662
 
2663
  /* Search for the first MFLO or MFHI.  */
2664
  for (i = 0; i < MAX_VR4130_NOPS; i++)
2665
    if (MF_HILO_INSN (hist[i].insn_mo->pinfo))
2666
      {
2667
        /* Extract the destination register.  */
2668
        if (mips_opts.mips16)
2669
          reg = mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, hist[i])];
2670
        else
2671
          reg = EXTRACT_OPERAND (RD, hist[i]);
2672
 
2673
        /* No nops are needed if INSN reads that register.  */
2674
        if (insn != NULL && insn_uses_reg (insn, reg, MIPS_GR_REG))
2675
          return 0;
2676
 
2677
        /* ...or if any of the intervening instructions do.  */
2678
        for (j = 0; j < i; j++)
2679
          if (insn_uses_reg (&hist[j], reg, MIPS_GR_REG))
2680
            return 0;
2681
 
2682
        return MAX_VR4130_NOPS - i;
2683
      }
2684
  return 0;
2685
}
2686
 
2687
#define BASE_REG_EQ(INSN1, INSN2)       \
2688
  ((((INSN1) >> OP_SH_RS) & OP_MASK_RS) \
2689
      == (((INSN2) >> OP_SH_RS) & OP_MASK_RS))
2690
 
2691
/* Return the minimum alignment for this store instruction.  */
2692
 
2693
static int
2694
fix_24k_align_to (const struct mips_opcode *mo)
2695
{
2696
  if (strcmp (mo->name, "sh") == 0)
2697
    return 2;
2698
 
2699
  if (strcmp (mo->name, "swc1") == 0
2700
      || strcmp (mo->name, "swc2") == 0
2701
      || strcmp (mo->name, "sw") == 0
2702
      || strcmp (mo->name, "sc") == 0
2703
      || strcmp (mo->name, "s.s") == 0)
2704
    return 4;
2705
 
2706
  if (strcmp (mo->name, "sdc1") == 0
2707
      || strcmp (mo->name, "sdc2") == 0
2708
      || strcmp (mo->name, "s.d") == 0)
2709
    return 8;
2710
 
2711
  /* sb, swl, swr */
2712
  return 1;
2713
}
2714
 
2715
struct fix_24k_store_info
2716
  {
2717
    /* Immediate offset, if any, for this store instruction.  */
2718
    short off;
2719
    /* Alignment required by this store instruction.  */
2720
    int align_to;
2721
    /* True for register offsets.  */
2722
    int register_offset;
2723
  };
2724
 
2725
/* Comparison function used by qsort.  */
2726
 
2727
static int
2728
fix_24k_sort (const void *a, const void *b)
2729
{
2730
  const struct fix_24k_store_info *pos1 = a;
2731
  const struct fix_24k_store_info *pos2 = b;
2732
 
2733
  return (pos1->off - pos2->off);
2734
}
2735
 
2736
/* INSN is a store instruction.  Try to record the store information
2737
   in STINFO.  Return false if the information isn't known.  */
2738
 
2739
static bfd_boolean
2740
fix_24k_record_store_info (struct fix_24k_store_info *stinfo,
2741
                      const struct mips_cl_insn *insn)
2742
{
2743
  /* The instruction must have a known offset.  */
2744
  if (!insn->complete_p || !strstr (insn->insn_mo->args, "o("))
2745
    return FALSE;
2746
 
2747
  stinfo->off = (insn->insn_opcode >> OP_SH_IMMEDIATE) & OP_MASK_IMMEDIATE;
2748
  stinfo->align_to = fix_24k_align_to (insn->insn_mo);
2749
  return TRUE;
2750
}
2751
 
2752
/* 24K Errata: Lost Data on Stores During Refill.
2753
 
2754
  Problem: The FSB (fetch store buffer) acts as an intermediate buffer
2755
  for the data cache refills and store data. The following describes
2756
  the scenario where the store data could be lost.
2757
 
2758
  * A data cache miss, due to either a load or a store, causing fill
2759
    data to be supplied by the memory subsystem
2760
  * The first three doublewords of fill data are returned and written
2761
    into the cache
2762
  * A sequence of four stores occurs in consecutive cycles around the
2763
    final doubleword of the fill:
2764
  * Store A
2765
  * Store B
2766
  * Store C
2767
  * Zero, One or more instructions
2768
  * Store D
2769
 
2770
  The four stores A-D must be to different doublewords of the line that
2771
  is being filled. The fourth instruction in the sequence above permits
2772
  the fill of the final doubleword to be transferred from the FSB into
2773
  the cache. In the sequence above, the stores may be either integer
2774
  (sb, sh, sw, swr, swl, sc) or coprocessor (swc1/swc2, sdc1/sdc2,
2775
  swxc1, sdxc1, suxc1) stores, as long as the four stores are to
2776
  different doublewords on the line. If the floating point unit is
2777
  running in 1:2 mode, it is not possible to create the sequence above
2778
  using only floating point store instructions.
2779
 
2780
   In this case, the cache line being filled is incorrectly marked
2781
   invalid, thereby losing the data from any store to the line that
2782
   occurs between the original miss and the completion of the five
2783
   cycle sequence shown above.
2784
 
2785
  The workarounds are:
2786
 
2787
  * Run the data cache in write-through mode.
2788
  * Insert a non-store instruction between
2789
    Store A and Store B or Store B and Store C.  */
2790
 
2791
static int
2792
nops_for_24k (const struct mips_cl_insn *hist,
2793
              const struct mips_cl_insn *insn)
2794
{
2795
  struct fix_24k_store_info pos[3];
2796
  int align, i, base_offset;
2797
 
2798
  /* If INSN is definitely not a store, there's nothing to worry about.  */
2799
  if (insn && (insn->insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
2800
    return 0;
2801
 
2802
  /* Likewise, the previous instruction wasn't a store.  */
2803
  if ((hist[0].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
2804
    return 0;
2805
 
2806
  /* If we don't know what came before, assume the worst.  */
2807
  if (hist[1].frag == NULL)
2808
    return 1;
2809
 
2810
  /* If the instruction was not a store, there's nothing to worry about.  */
2811
  if ((hist[1].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
2812
    return 0;
2813
 
2814
  /* If we don't know the relationship between the store addresses,
2815
     assume the worst.  */
2816
  if (insn == NULL
2817
      || !BASE_REG_EQ (insn->insn_opcode, hist[0].insn_opcode)
2818
      || !BASE_REG_EQ (insn->insn_opcode, hist[1].insn_opcode))
2819
    return 1;
2820
 
2821
  if (!fix_24k_record_store_info (&pos[0], insn)
2822
      || !fix_24k_record_store_info (&pos[1], &hist[0])
2823
      || !fix_24k_record_store_info (&pos[2], &hist[1]))
2824
    return 1;
2825
 
2826
  qsort (&pos, 3, sizeof (struct fix_24k_store_info), fix_24k_sort);
2827
 
2828
  /* Pick a value of ALIGN and X such that all offsets are adjusted by
2829
     X bytes and such that the base register + X is known to be aligned
2830
     to align bytes.  */
2831
 
2832
  if (((insn->insn_opcode >> OP_SH_RS) & OP_MASK_RS) == SP)
2833
    align = 8;
2834
  else
2835
    {
2836
      align = pos[0].align_to;
2837
      base_offset = pos[0].off;
2838
      for (i = 1; i < 3; i++)
2839
        if (align < pos[i].align_to)
2840
          {
2841
            align = pos[i].align_to;
2842
            base_offset = pos[i].off;
2843
          }
2844
      for (i = 0; i < 3; i++)
2845
        pos[i].off -= base_offset;
2846
    }
2847
 
2848
  pos[0].off &= ~align + 1;
2849
  pos[1].off &= ~align + 1;
2850
  pos[2].off &= ~align + 1;
2851
 
2852
  /* If any two stores write to the same chunk, they also write to the
2853
     same doubleword.  The offsets are still sorted at this point.  */
2854
  if (pos[0].off == pos[1].off || pos[1].off == pos[2].off)
2855
    return 0;
2856
 
2857
  /* A range of at least 9 bytes is needed for the stores to be in
2858
     non-overlapping doublewords.  */
2859
  if (pos[2].off - pos[0].off <= 8)
2860
    return 0;
2861
 
2862
  if (pos[2].off - pos[1].off >= 24
2863
      || pos[1].off - pos[0].off >= 24
2864
      || pos[2].off - pos[0].off >= 32)
2865
    return 0;
2866
 
2867
  return 1;
2868
}
2869
 
2870
/* Return the number of nops that would be needed if instruction INSN
2871
   immediately followed the MAX_NOPS instructions given by HIST,
2872
   where HIST[0] is the most recent instruction.  If INSN is null,
2873
   return the worse-case number of nops for any instruction.  */
2874
 
2875
static int
2876
nops_for_insn (const struct mips_cl_insn *hist,
2877
               const struct mips_cl_insn *insn)
2878
{
2879
  int i, nops, tmp_nops;
2880
 
2881
  nops = 0;
2882
  for (i = 0; i < MAX_DELAY_NOPS; i++)
2883
    {
2884
      tmp_nops = insns_between (hist + i, insn) - i;
2885
      if (tmp_nops > nops)
2886
        nops = tmp_nops;
2887
    }
2888
 
2889
  if (mips_fix_vr4130)
2890
    {
2891
      tmp_nops = nops_for_vr4130 (hist, insn);
2892
      if (tmp_nops > nops)
2893
        nops = tmp_nops;
2894
    }
2895
 
2896
  if (mips_fix_24k)
2897
    {
2898
      tmp_nops = nops_for_24k (hist, insn);
2899
      if (tmp_nops > nops)
2900
        nops = tmp_nops;
2901
    }
2902
 
2903
  return nops;
2904
}
2905
 
2906
/* The variable arguments provide NUM_INSNS extra instructions that
2907
   might be added to HIST.  Return the largest number of nops that
2908
   would be needed after the extended sequence.  */
2909
 
2910
static int
2911
nops_for_sequence (int num_insns, const struct mips_cl_insn *hist, ...)
2912
{
2913
  va_list args;
2914
  struct mips_cl_insn buffer[MAX_NOPS];
2915
  struct mips_cl_insn *cursor;
2916
  int nops;
2917
 
2918
  va_start (args, hist);
2919
  cursor = buffer + num_insns;
2920
  memcpy (cursor, hist, (MAX_NOPS - num_insns) * sizeof (*cursor));
2921
  while (cursor > buffer)
2922
    *--cursor = *va_arg (args, const struct mips_cl_insn *);
2923
 
2924
  nops = nops_for_insn (buffer, NULL);
2925
  va_end (args);
2926
  return nops;
2927
}
2928
 
2929
/* Like nops_for_insn, but if INSN is a branch, take into account the
2930
   worst-case delay for the branch target.  */
2931
 
2932
static int
2933
nops_for_insn_or_target (const struct mips_cl_insn *hist,
2934
                         const struct mips_cl_insn *insn)
2935
{
2936
  int nops, tmp_nops;
2937
 
2938
  nops = nops_for_insn (hist, insn);
2939
  if (insn->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2940
                              | INSN_COND_BRANCH_DELAY
2941
                              | INSN_COND_BRANCH_LIKELY))
2942
    {
2943
      tmp_nops = nops_for_sequence (2, hist, insn, NOP_INSN);
2944
      if (tmp_nops > nops)
2945
        nops = tmp_nops;
2946
    }
2947
  else if (mips_opts.mips16
2948
           && (insn->insn_mo->pinfo & (MIPS16_INSN_UNCOND_BRANCH
2949
                                       | MIPS16_INSN_COND_BRANCH)))
2950
    {
2951
      tmp_nops = nops_for_sequence (1, hist, insn);
2952
      if (tmp_nops > nops)
2953
        nops = tmp_nops;
2954
    }
2955
  return nops;
2956
}
2957
 
2958
/* Fix NOP issue: Replace nops by "or at,at,zero".  */
2959
 
2960
static void
2961
fix_loongson2f_nop (struct mips_cl_insn * ip)
2962
{
2963
  if (strcmp (ip->insn_mo->name, "nop") == 0)
2964
    ip->insn_opcode = LOONGSON2F_NOP_INSN;
2965
}
2966
 
2967
/* Fix Jump Issue: Eliminate instruction fetch from outside 256M region
2968
                   jr target pc &= 'hffff_ffff_cfff_ffff.  */
2969
 
2970
static void
2971
fix_loongson2f_jump (struct mips_cl_insn * ip)
2972
{
2973
  if (strcmp (ip->insn_mo->name, "j") == 0
2974
      || strcmp (ip->insn_mo->name, "jr") == 0
2975
      || strcmp (ip->insn_mo->name, "jalr") == 0)
2976
    {
2977
      int sreg;
2978
      expressionS ep;
2979
 
2980
      if (! mips_opts.at)
2981
        return;
2982
 
2983
      sreg = EXTRACT_OPERAND (RS, *ip);
2984
      if (sreg == ZERO || sreg == KT0 || sreg == KT1 || sreg == ATREG)
2985
        return;
2986
 
2987
      ep.X_op = O_constant;
2988
      ep.X_add_number = 0xcfff0000;
2989
      macro_build (&ep, "lui", "t,u", ATREG, BFD_RELOC_HI16);
2990
      ep.X_add_number = 0xffff;
2991
      macro_build (&ep, "ori", "t,r,i", ATREG, ATREG, BFD_RELOC_LO16);
2992
      macro_build (NULL, "and", "d,v,t", sreg, sreg, ATREG);
2993
    }
2994
}
2995
 
2996
static void
2997
fix_loongson2f (struct mips_cl_insn * ip)
2998
{
2999
  if (mips_fix_loongson2f_nop)
3000
    fix_loongson2f_nop (ip);
3001
 
3002
  if (mips_fix_loongson2f_jump)
3003
    fix_loongson2f_jump (ip);
3004
}
3005
 
3006
/* Output an instruction.  IP is the instruction information.
3007
   ADDRESS_EXPR is an operand of the instruction to be used with
3008
   RELOC_TYPE.  */
3009
 
3010
static void
3011
append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
3012
             bfd_reloc_code_real_type *reloc_type)
3013
{
3014
  unsigned long prev_pinfo, pinfo;
3015
  unsigned long prev_pinfo2, pinfo2;
3016
  relax_stateT prev_insn_frag_type = 0;
3017
  bfd_boolean relaxed_branch = FALSE;
3018
  segment_info_type *si = seg_info (now_seg);
3019
 
3020
  if (mips_fix_loongson2f)
3021
    fix_loongson2f (ip);
3022
 
3023
  /* Mark instruction labels in mips16 mode.  */
3024
  mips16_mark_labels ();
3025
 
3026
  file_ase_mips16 |= mips_opts.mips16;
3027
 
3028
  prev_pinfo = history[0].insn_mo->pinfo;
3029
  prev_pinfo2 = history[0].insn_mo->pinfo2;
3030
  pinfo = ip->insn_mo->pinfo;
3031
  pinfo2 = ip->insn_mo->pinfo2;
3032
 
3033
  if (address_expr == NULL)
3034
    ip->complete_p = 1;
3035
  else if (*reloc_type <= BFD_RELOC_UNUSED
3036
           && address_expr->X_op == O_constant)
3037
    {
3038
      unsigned int tmp;
3039
 
3040
      ip->complete_p = 1;
3041
      switch (*reloc_type)
3042
        {
3043
        case BFD_RELOC_32:
3044
          ip->insn_opcode |= address_expr->X_add_number;
3045
          break;
3046
 
3047
        case BFD_RELOC_MIPS_HIGHEST:
3048
          tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
3049
          ip->insn_opcode |= tmp & 0xffff;
3050
          break;
3051
 
3052
        case BFD_RELOC_MIPS_HIGHER:
3053
          tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
3054
          ip->insn_opcode |= tmp & 0xffff;
3055
          break;
3056
 
3057
        case BFD_RELOC_HI16_S:
3058
          tmp = (address_expr->X_add_number + 0x8000) >> 16;
3059
          ip->insn_opcode |= tmp & 0xffff;
3060
          break;
3061
 
3062
        case BFD_RELOC_HI16:
3063
          ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
3064
          break;
3065
 
3066
        case BFD_RELOC_UNUSED:
3067
        case BFD_RELOC_LO16:
3068
        case BFD_RELOC_MIPS_GOT_DISP:
3069
          ip->insn_opcode |= address_expr->X_add_number & 0xffff;
3070
          break;
3071
 
3072
        case BFD_RELOC_MIPS_JMP:
3073
          if ((address_expr->X_add_number & 3) != 0)
3074
            as_bad (_("jump to misaligned address (0x%lx)"),
3075
                    (unsigned long) address_expr->X_add_number);
3076
          ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
3077
          ip->complete_p = 0;
3078
          break;
3079
 
3080
        case BFD_RELOC_MIPS16_JMP:
3081
          if ((address_expr->X_add_number & 3) != 0)
3082
            as_bad (_("jump to misaligned address (0x%lx)"),
3083
                    (unsigned long) address_expr->X_add_number);
3084
          ip->insn_opcode |=
3085
            (((address_expr->X_add_number & 0x7c0000) << 3)
3086
               | ((address_expr->X_add_number & 0xf800000) >> 7)
3087
               | ((address_expr->X_add_number & 0x3fffc) >> 2));
3088
          ip->complete_p = 0;
3089
          break;
3090
 
3091
        case BFD_RELOC_16_PCREL_S2:
3092
          if ((address_expr->X_add_number & 3) != 0)
3093
            as_bad (_("branch to misaligned address (0x%lx)"),
3094
                    (unsigned long) address_expr->X_add_number);
3095
          if (mips_relax_branch)
3096
            goto need_reloc;
3097
          if ((address_expr->X_add_number + 0x20000) & ~0x3ffff)
3098
            as_bad (_("branch address range overflow (0x%lx)"),
3099
                    (unsigned long) address_expr->X_add_number);
3100
          ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0xffff;
3101
          ip->complete_p = 0;
3102
          break;
3103
 
3104
        default:
3105
          internalError ();
3106
        }
3107
    }
3108
 
3109
  if (mips_relax.sequence != 2 && !mips_opts.noreorder)
3110
    {
3111
      /* There are a lot of optimizations we could do that we don't.
3112
         In particular, we do not, in general, reorder instructions.
3113
         If you use gcc with optimization, it will reorder
3114
         instructions and generally do much more optimization then we
3115
         do here; repeating all that work in the assembler would only
3116
         benefit hand written assembly code, and does not seem worth
3117
         it.  */
3118
      int nops = (mips_optimize == 0
3119
                  ? nops_for_insn (history, NULL)
3120
                  : nops_for_insn_or_target (history, ip));
3121
      if (nops > 0)
3122
        {
3123
          fragS *old_frag;
3124
          unsigned long old_frag_offset;
3125
          int i;
3126
 
3127
          old_frag = frag_now;
3128
          old_frag_offset = frag_now_fix ();
3129
 
3130
          for (i = 0; i < nops; i++)
3131
            emit_nop ();
3132
 
3133
          if (listing)
3134
            {
3135
              listing_prev_line ();
3136
              /* We may be at the start of a variant frag.  In case we
3137
                 are, make sure there is enough space for the frag
3138
                 after the frags created by listing_prev_line.  The
3139
                 argument to frag_grow here must be at least as large
3140
                 as the argument to all other calls to frag_grow in
3141
                 this file.  We don't have to worry about being in the
3142
                 middle of a variant frag, because the variants insert
3143
                 all needed nop instructions themselves.  */
3144
              frag_grow (40);
3145
            }
3146
 
3147
          mips_move_labels ();
3148
 
3149
#ifndef NO_ECOFF_DEBUGGING
3150
          if (ECOFF_DEBUGGING)
3151
            ecoff_fix_loc (old_frag, old_frag_offset);
3152
#endif
3153
        }
3154
    }
3155
  else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
3156
    {
3157
      /* Work out how many nops in prev_nop_frag are needed by IP.  */
3158
      int nops = nops_for_insn_or_target (history, ip);
3159
      gas_assert (nops <= prev_nop_frag_holds);
3160
 
3161
      /* Enforce NOPS as a minimum.  */
3162
      if (nops > prev_nop_frag_required)
3163
        prev_nop_frag_required = nops;
3164
 
3165
      if (prev_nop_frag_holds == prev_nop_frag_required)
3166
        {
3167
          /* Settle for the current number of nops.  Update the history
3168
             accordingly (for the benefit of any future .set reorder code).  */
3169
          prev_nop_frag = NULL;
3170
          insert_into_history (prev_nop_frag_since,
3171
                               prev_nop_frag_holds, NOP_INSN);
3172
        }
3173
      else
3174
        {
3175
          /* Allow this instruction to replace one of the nops that was
3176
             tentatively added to prev_nop_frag.  */
3177
          prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
3178
          prev_nop_frag_holds--;
3179
          prev_nop_frag_since++;
3180
        }
3181
    }
3182
 
3183
#ifdef OBJ_ELF
3184
  /* The value passed to dwarf2_emit_insn is the distance between
3185
     the beginning of the current instruction and the address that
3186
     should be recorded in the debug tables.  For MIPS16 debug info
3187
     we want to use ISA-encoded addresses, so we pass -1 for an
3188
     address higher by one than the current.  */
3189
  dwarf2_emit_insn (mips_opts.mips16 ? -1 : 0);
3190
#endif
3191
 
3192
  /* Record the frag type before frag_var.  */
3193
  if (history[0].frag)
3194
    prev_insn_frag_type = history[0].frag->fr_type;
3195
 
3196
  if (address_expr
3197
      && *reloc_type == BFD_RELOC_16_PCREL_S2
3198
      && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
3199
          || pinfo & INSN_COND_BRANCH_LIKELY)
3200
      && mips_relax_branch
3201
      /* Don't try branch relaxation within .set nomacro, or within
3202
         .set noat if we use $at for PIC computations.  If it turns
3203
         out that the branch was out-of-range, we'll get an error.  */
3204
      && !mips_opts.warn_about_macros
3205
      && (mips_opts.at || mips_pic == NO_PIC)
3206
      /* Don't relax BPOSGE32/64 as they have no complementing branches.  */
3207
      && !(ip->insn_mo->membership & (INSN_DSP64 | INSN_DSP))
3208
      && !mips_opts.mips16)
3209
    {
3210
      relaxed_branch = TRUE;
3211
      add_relaxed_insn (ip, (relaxed_branch_length
3212
                             (NULL, NULL,
3213
                              (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
3214
                              : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1
3215
                              : 0)), 4,
3216
                        RELAX_BRANCH_ENCODE
3217
                        (AT,
3218
                         pinfo & INSN_UNCOND_BRANCH_DELAY,
3219
                         pinfo & INSN_COND_BRANCH_LIKELY,
3220
                         pinfo & INSN_WRITE_GPR_31,
3221
                         0),
3222
                        address_expr->X_add_symbol,
3223
                        address_expr->X_add_number);
3224
      *reloc_type = BFD_RELOC_UNUSED;
3225
    }
3226
  else if (*reloc_type > BFD_RELOC_UNUSED)
3227
    {
3228
      /* We need to set up a variant frag.  */
3229
      gas_assert (mips_opts.mips16 && address_expr != NULL);
3230
      add_relaxed_insn (ip, 4, 0,
3231
                        RELAX_MIPS16_ENCODE
3232
                        (*reloc_type - BFD_RELOC_UNUSED,
3233
                         mips16_small, mips16_ext,
3234
                         prev_pinfo & INSN_UNCOND_BRANCH_DELAY,
3235
                         history[0].mips16_absolute_jump_p),
3236
                        make_expr_symbol (address_expr), 0);
3237
    }
3238
  else if (mips_opts.mips16
3239
           && ! ip->use_extend
3240
           && *reloc_type != BFD_RELOC_MIPS16_JMP)
3241
    {
3242
      if ((pinfo & INSN_UNCOND_BRANCH_DELAY) == 0)
3243
        /* Make sure there is enough room to swap this instruction with
3244
           a following jump instruction.  */
3245
        frag_grow (6);
3246
      add_fixed_insn (ip);
3247
    }
3248
  else
3249
    {
3250
      if (mips_opts.mips16
3251
          && mips_opts.noreorder
3252
          && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
3253
        as_warn (_("extended instruction in delay slot"));
3254
 
3255
      if (mips_relax.sequence)
3256
        {
3257
          /* If we've reached the end of this frag, turn it into a variant
3258
             frag and record the information for the instructions we've
3259
             written so far.  */
3260
          if (frag_room () < 4)
3261
            relax_close_frag ();
3262
          mips_relax.sizes[mips_relax.sequence - 1] += 4;
3263
        }
3264
 
3265
      if (mips_relax.sequence != 2)
3266
        mips_macro_warning.sizes[0] += 4;
3267
      if (mips_relax.sequence != 1)
3268
        mips_macro_warning.sizes[1] += 4;
3269
 
3270
      if (mips_opts.mips16)
3271
        {
3272
          ip->fixed_p = 1;
3273
          ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
3274
        }
3275
      add_fixed_insn (ip);
3276
    }
3277
 
3278
  if (address_expr != NULL && *reloc_type <= BFD_RELOC_UNUSED)
3279
    {
3280
      if (!ip->complete_p
3281
          && *reloc_type < BFD_RELOC_UNUSED)
3282
        need_reloc:
3283
        {
3284
          reloc_howto_type *howto;
3285
          int i;
3286
 
3287
          /* In a compound relocation, it is the final (outermost)
3288
             operator that determines the relocated field.  */
3289
          for (i = 1; i < 3; i++)
3290
            if (reloc_type[i] == BFD_RELOC_UNUSED)
3291
              break;
3292
 
3293
          howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
3294
          if (howto == NULL)
3295
            {
3296
              /* To reproduce this failure try assembling gas/testsuites/
3297
                 gas/mips/mips16-intermix.s with a mips-ecoff targeted
3298
                 assembler.  */
3299
              as_bad (_("Unsupported MIPS relocation number %d"), reloc_type[i - 1]);
3300
              howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_16);
3301
            }
3302
 
3303
          ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
3304
                                     bfd_get_reloc_size (howto),
3305
                                     address_expr,
3306
                                     reloc_type[0] == BFD_RELOC_16_PCREL_S2,
3307
                                     reloc_type[0]);
3308
 
3309
          /* Tag symbols that have a R_MIPS16_26 relocation against them.  */
3310
          if (reloc_type[0] == BFD_RELOC_MIPS16_JMP
3311
              && ip->fixp[0]->fx_addsy)
3312
            *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
3313
 
3314
          /* These relocations can have an addend that won't fit in
3315
             4 octets for 64bit assembly.  */
3316
          if (HAVE_64BIT_GPRS
3317
              && ! howto->partial_inplace
3318
              && (reloc_type[0] == BFD_RELOC_16
3319
                  || reloc_type[0] == BFD_RELOC_32
3320
                  || reloc_type[0] == BFD_RELOC_MIPS_JMP
3321
                  || reloc_type[0] == BFD_RELOC_GPREL16
3322
                  || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
3323
                  || reloc_type[0] == BFD_RELOC_GPREL32
3324
                  || reloc_type[0] == BFD_RELOC_64
3325
                  || reloc_type[0] == BFD_RELOC_CTOR
3326
                  || reloc_type[0] == BFD_RELOC_MIPS_SUB
3327
                  || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
3328
                  || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
3329
                  || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
3330
                  || reloc_type[0] == BFD_RELOC_MIPS_REL16
3331
                  || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
3332
                  || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
3333
                  || hi16_reloc_p (reloc_type[0])
3334
                  || lo16_reloc_p (reloc_type[0])))
3335
            ip->fixp[0]->fx_no_overflow = 1;
3336
 
3337
          if (mips_relax.sequence)
3338
            {
3339
              if (mips_relax.first_fixup == 0)
3340
                mips_relax.first_fixup = ip->fixp[0];
3341
            }
3342
          else if (reloc_needs_lo_p (*reloc_type))
3343
            {
3344
              struct mips_hi_fixup *hi_fixup;
3345
 
3346
              /* Reuse the last entry if it already has a matching %lo.  */
3347
              hi_fixup = mips_hi_fixup_list;
3348
              if (hi_fixup == 0
3349
                  || !fixup_has_matching_lo_p (hi_fixup->fixp))
3350
                {
3351
                  hi_fixup = ((struct mips_hi_fixup *)
3352
                              xmalloc (sizeof (struct mips_hi_fixup)));
3353
                  hi_fixup->next = mips_hi_fixup_list;
3354
                  mips_hi_fixup_list = hi_fixup;
3355
                }
3356
              hi_fixup->fixp = ip->fixp[0];
3357
              hi_fixup->seg = now_seg;
3358
            }
3359
 
3360
          /* Add fixups for the second and third relocations, if given.
3361
             Note that the ABI allows the second relocation to be
3362
             against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC.  At the
3363
             moment we only use RSS_UNDEF, but we could add support
3364
             for the others if it ever becomes necessary.  */
3365
          for (i = 1; i < 3; i++)
3366
            if (reloc_type[i] != BFD_RELOC_UNUSED)
3367
              {
3368
                ip->fixp[i] = fix_new (ip->frag, ip->where,
3369
                                       ip->fixp[0]->fx_size, NULL, 0,
3370
                                       FALSE, reloc_type[i]);
3371
 
3372
                /* Use fx_tcbit to mark compound relocs.  */
3373
                ip->fixp[0]->fx_tcbit = 1;
3374
                ip->fixp[i]->fx_tcbit = 1;
3375
              }
3376
        }
3377
    }
3378
  install_insn (ip);
3379
 
3380
  /* Update the register mask information.  */
3381
  if (! mips_opts.mips16)
3382
    {
3383
      if ((pinfo & INSN_WRITE_GPR_D) || (pinfo2 & INSN2_READ_GPR_D))
3384
        mips_gprmask |= 1 << EXTRACT_OPERAND (RD, *ip);
3385
      if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
3386
        mips_gprmask |= 1 << EXTRACT_OPERAND (RT, *ip);
3387
      if (pinfo & INSN_READ_GPR_S)
3388
        mips_gprmask |= 1 << EXTRACT_OPERAND (RS, *ip);
3389
      if (pinfo & INSN_WRITE_GPR_31)
3390
        mips_gprmask |= 1 << RA;
3391
      if (pinfo2 & (INSN2_WRITE_GPR_Z | INSN2_READ_GPR_Z))
3392
        mips_gprmask |= 1 << EXTRACT_OPERAND (RZ, *ip);
3393
      if (pinfo & INSN_WRITE_FPR_D)
3394
        mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FD, *ip);
3395
      if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
3396
        mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FS, *ip);
3397
      if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
3398
        mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FT, *ip);
3399
      if ((pinfo & INSN_READ_FPR_R) != 0)
3400
        mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FR, *ip);
3401
      if (pinfo2 & (INSN2_WRITE_FPR_Z | INSN2_READ_FPR_Z))
3402
        mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FZ, *ip);
3403
      if (pinfo & INSN_COP)
3404
        {
3405
          /* We don't keep enough information to sort these cases out.
3406
             The itbl support does keep this information however, although
3407
             we currently don't support itbl fprmats as part of the cop
3408
             instruction.  May want to add this support in the future.  */
3409
        }
3410
      /* Never set the bit for $0, which is always zero.  */
3411
      mips_gprmask &= ~1 << 0;
3412
    }
3413
  else
3414
    {
3415
      if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
3416
        mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RX, *ip);
3417
      if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
3418
        mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RY, *ip);
3419
      if (pinfo & MIPS16_INSN_WRITE_Z)
3420
        mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RZ, *ip);
3421
      if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
3422
        mips_gprmask |= 1 << TREG;
3423
      if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
3424
        mips_gprmask |= 1 << SP;
3425
      if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
3426
        mips_gprmask |= 1 << RA;
3427
      if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
3428
        mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
3429
      if (pinfo & MIPS16_INSN_READ_Z)
3430
        mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip);
3431
      if (pinfo & MIPS16_INSN_READ_GPR_X)
3432
        mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
3433
    }
3434
 
3435
  if (mips_relax.sequence != 2 && !mips_opts.noreorder)
3436
    {
3437
      /* Filling the branch delay slot is more complex.  We try to
3438
         switch the branch with the previous instruction, which we can
3439
         do if the previous instruction does not set up a condition
3440
         that the branch tests and if the branch is not itself the
3441
         target of any branch.  */
3442
      if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
3443
          || (pinfo & INSN_COND_BRANCH_DELAY))
3444
        {
3445
          if (mips_optimize < 2
3446
              /* If we have seen .set volatile or .set nomove, don't
3447
                 optimize.  */
3448
              || mips_opts.nomove != 0
3449
              /* We can't swap if the previous instruction's position
3450
                 is fixed.  */
3451
              || history[0].fixed_p
3452
              /* If the previous previous insn was in a .set
3453
                 noreorder, we can't swap.  Actually, the MIPS
3454
                 assembler will swap in this situation.  However, gcc
3455
                 configured -with-gnu-as will generate code like
3456
                   .set noreorder
3457
                   lw   $4,XXX
3458
                   .set reorder
3459
                   INSN
3460
                   bne  $4,$0,foo
3461
                 in which we can not swap the bne and INSN.  If gcc is
3462
                 not configured -with-gnu-as, it does not output the
3463
                 .set pseudo-ops.  */
3464
              || history[1].noreorder_p
3465
              /* If the branch is itself the target of a branch, we
3466
                 can not swap.  We cheat on this; all we check for is
3467
                 whether there is a label on this instruction.  If
3468
                 there are any branches to anything other than a
3469
                 label, users must use .set noreorder.  */
3470
              || si->label_list != NULL
3471
              /* If the previous instruction is in a variant frag
3472
                 other than this branch's one, we cannot do the swap.
3473
                 This does not apply to the mips16, which uses variant
3474
                 frags for different purposes.  */
3475
              || (! mips_opts.mips16
3476
                  && prev_insn_frag_type == rs_machine_dependent)
3477
              /* Check for conflicts between the branch and the instructions
3478
                 before the candidate delay slot.  */
3479
              || nops_for_insn (history + 1, ip) > 0
3480
              /* Check for conflicts between the swapped sequence and the
3481
                 target of the branch.  */
3482
              || nops_for_sequence (2, history + 1, ip, history) > 0
3483
              /* We do not swap with a trap instruction, since it
3484
                 complicates trap handlers to have the trap
3485
                 instruction be in a delay slot.  */
3486
              || (prev_pinfo & INSN_TRAP)
3487
              /* If the branch reads a register that the previous
3488
                 instruction sets, we can not swap.  */
3489
              || (! mips_opts.mips16
3490
                  && (prev_pinfo & INSN_WRITE_GPR_T)
3491
                  && insn_uses_reg (ip, EXTRACT_OPERAND (RT, history[0]),
3492
                                    MIPS_GR_REG))
3493
              || (! mips_opts.mips16
3494
                  && (prev_pinfo & INSN_WRITE_GPR_D)
3495
                  && insn_uses_reg (ip, EXTRACT_OPERAND (RD, history[0]),
3496
                                    MIPS_GR_REG))
3497
              || (! mips_opts.mips16
3498
                  && (prev_pinfo2 & INSN2_WRITE_GPR_Z)
3499
                  && insn_uses_reg (ip, EXTRACT_OPERAND (RZ, history[0]),
3500
                                    MIPS_GR_REG))
3501
              || (mips_opts.mips16
3502
                  && (((prev_pinfo & MIPS16_INSN_WRITE_X)
3503
                       && (insn_uses_reg
3504
                           (ip, MIPS16_EXTRACT_OPERAND (RX, history[0]),
3505
                            MIPS16_REG)))
3506
                      || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
3507
                          && (insn_uses_reg
3508
                              (ip, MIPS16_EXTRACT_OPERAND (RY, history[0]),
3509
                               MIPS16_REG)))
3510
                      || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
3511
                          && (insn_uses_reg
3512
                              (ip, MIPS16_EXTRACT_OPERAND (RZ, history[0]),
3513
                               MIPS16_REG)))
3514
                      || ((prev_pinfo & MIPS16_INSN_WRITE_T)
3515
                          && insn_uses_reg (ip, TREG, MIPS_GR_REG))
3516
                      || ((prev_pinfo & MIPS16_INSN_WRITE_31)
3517
                          && insn_uses_reg (ip, RA, MIPS_GR_REG))
3518
                      || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3519
                          && insn_uses_reg (ip,
3520
                                            MIPS16OP_EXTRACT_REG32R
3521
                                              (history[0].insn_opcode),
3522
                                            MIPS_GR_REG))))
3523
              /* If the branch writes a register that the previous
3524
                 instruction sets, we can not swap (we know that
3525
                 branches write only to RD or to $31).  */
3526
              || (! mips_opts.mips16
3527
                  && (prev_pinfo & INSN_WRITE_GPR_T)
3528
                  && (((pinfo & INSN_WRITE_GPR_D)
3529
                       && (EXTRACT_OPERAND (RT, history[0])
3530
                           == EXTRACT_OPERAND (RD, *ip)))
3531
                      || ((pinfo & INSN_WRITE_GPR_31)
3532
                          && EXTRACT_OPERAND (RT, history[0]) == RA)))
3533
              || (! mips_opts.mips16
3534
                  && (prev_pinfo & INSN_WRITE_GPR_D)
3535
                  && (((pinfo & INSN_WRITE_GPR_D)
3536
                       && (EXTRACT_OPERAND (RD, history[0])
3537
                           == EXTRACT_OPERAND (RD, *ip)))
3538
                      || ((pinfo & INSN_WRITE_GPR_31)
3539
                          && EXTRACT_OPERAND (RD, history[0]) == RA)))
3540
              || (mips_opts.mips16
3541
                  && (pinfo & MIPS16_INSN_WRITE_31)
3542
                  && ((prev_pinfo & MIPS16_INSN_WRITE_31)
3543
                      || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3544
                          && (MIPS16OP_EXTRACT_REG32R (history[0].insn_opcode)
3545
                              == RA))))
3546
              /* If the branch writes a register that the previous
3547
                 instruction reads, we can not swap (we know that
3548
                 branches only write to RD or to $31).  */
3549
              || (! mips_opts.mips16
3550
                  && (pinfo & INSN_WRITE_GPR_D)
3551
                  && insn_uses_reg (&history[0],
3552
                                    EXTRACT_OPERAND (RD, *ip),
3553
                                    MIPS_GR_REG))
3554
              || (! mips_opts.mips16
3555
                  && (pinfo & INSN_WRITE_GPR_31)
3556
                  && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3557
              || (mips_opts.mips16
3558
                  && (pinfo & MIPS16_INSN_WRITE_31)
3559
                  && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3560
              /* If one instruction sets a condition code and the
3561
                 other one uses a condition code, we can not swap.  */
3562
              || ((pinfo & INSN_READ_COND_CODE)
3563
                  && (prev_pinfo & INSN_WRITE_COND_CODE))
3564
              || ((pinfo & INSN_WRITE_COND_CODE)
3565
                  && (prev_pinfo & INSN_READ_COND_CODE))
3566
              /* If the previous instruction uses the PC, we can not
3567
                 swap.  */
3568
              || (mips_opts.mips16
3569
                  && (prev_pinfo & MIPS16_INSN_READ_PC))
3570
              /* If the previous instruction had a fixup in mips16
3571
                 mode, we can not swap.  This normally means that the
3572
                 previous instruction was a 4 byte branch anyhow.  */
3573
              || (mips_opts.mips16 && history[0].fixp[0])
3574
              /* If the previous instruction is a sync, sync.l, or
3575
                 sync.p, we can not swap.  */
3576
              || (prev_pinfo & INSN_SYNC)
3577
              /* If the previous instruction is an ERET or
3578
                 DERET, avoid the swap.  */
3579
              || (history[0].insn_opcode == INSN_ERET)
3580
              || (history[0].insn_opcode == INSN_DERET))
3581
            {
3582
              if (mips_opts.mips16
3583
                  && (pinfo & INSN_UNCOND_BRANCH_DELAY)
3584
                  && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31))
3585
                  && ISA_SUPPORTS_MIPS16E)
3586
                {
3587
                  /* Convert MIPS16 jr/jalr into a "compact" jump.  */
3588
                  ip->insn_opcode |= 0x0080;
3589
                  install_insn (ip);
3590
                  insert_into_history (0, 1, ip);
3591
                }
3592
              else
3593
                {
3594
                  /* We could do even better for unconditional branches to
3595
                     portions of this object file; we could pick up the
3596
                     instruction at the destination, put it in the delay
3597
                     slot, and bump the destination address.  */
3598
                  insert_into_history (0, 1, ip);
3599
                  emit_nop ();
3600
                }
3601
 
3602
              if (mips_relax.sequence)
3603
                mips_relax.sizes[mips_relax.sequence - 1] += 4;
3604
            }
3605
          else
3606
            {
3607
              /* It looks like we can actually do the swap.  */
3608
              struct mips_cl_insn delay = history[0];
3609
              if (mips_opts.mips16)
3610
                {
3611
                  know (delay.frag == ip->frag);
3612
                  move_insn (ip, delay.frag, delay.where);
3613
                  move_insn (&delay, ip->frag, ip->where + insn_length (ip));
3614
                }
3615
              else if (relaxed_branch)
3616
                {
3617
                  /* Add the delay slot instruction to the end of the
3618
                     current frag and shrink the fixed part of the
3619
                     original frag.  If the branch occupies the tail of
3620
                     the latter, move it backwards to cover the gap.  */
3621
                  delay.frag->fr_fix -= 4;
3622
                  if (delay.frag == ip->frag)
3623
                    move_insn (ip, ip->frag, ip->where - 4);
3624
                  add_fixed_insn (&delay);
3625
                }
3626
              else
3627
                {
3628
                  move_insn (&delay, ip->frag, ip->where);
3629
                  move_insn (ip, history[0].frag, history[0].where);
3630
                }
3631
              history[0] = *ip;
3632
              delay.fixed_p = 1;
3633
              insert_into_history (0, 1, &delay);
3634
            }
3635
 
3636
          /* If that was an unconditional branch, forget the previous
3637
             insn information.  */
3638
          if (pinfo & INSN_UNCOND_BRANCH_DELAY)
3639
            {
3640
              mips_no_prev_insn ();
3641
            }
3642
        }
3643
      else if (pinfo & INSN_COND_BRANCH_LIKELY)
3644
        {
3645
          /* We don't yet optimize a branch likely.  What we should do
3646
             is look at the target, copy the instruction found there
3647
             into the delay slot, and increment the branch to jump to
3648
             the next instruction.  */
3649
          insert_into_history (0, 1, ip);
3650
          emit_nop ();
3651
        }
3652
      else
3653
        insert_into_history (0, 1, ip);
3654
    }
3655
  else
3656
    insert_into_history (0, 1, ip);
3657
 
3658
  /* We just output an insn, so the next one doesn't have a label.  */
3659
  mips_clear_insn_labels ();
3660
}
3661
 
3662
/* Forget that there was any previous instruction or label.  */
3663
 
3664
static void
3665
mips_no_prev_insn (void)
3666
{
3667
  prev_nop_frag = NULL;
3668
  insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
3669
  mips_clear_insn_labels ();
3670
}
3671
 
3672
/* This function must be called before we emit something other than
3673
   instructions.  It is like mips_no_prev_insn except that it inserts
3674
   any NOPS that might be needed by previous instructions.  */
3675
 
3676
void
3677
mips_emit_delays (void)
3678
{
3679
  if (! mips_opts.noreorder)
3680
    {
3681
      int nops = nops_for_insn (history, NULL);
3682
      if (nops > 0)
3683
        {
3684
          while (nops-- > 0)
3685
            add_fixed_insn (NOP_INSN);
3686
          mips_move_labels ();
3687
        }
3688
    }
3689
  mips_no_prev_insn ();
3690
}
3691
 
3692
/* Start a (possibly nested) noreorder block.  */
3693
 
3694
static void
3695
start_noreorder (void)
3696
{
3697
  if (mips_opts.noreorder == 0)
3698
    {
3699
      unsigned int i;
3700
      int nops;
3701
 
3702
      /* None of the instructions before the .set noreorder can be moved.  */
3703
      for (i = 0; i < ARRAY_SIZE (history); i++)
3704
        history[i].fixed_p = 1;
3705
 
3706
      /* Insert any nops that might be needed between the .set noreorder
3707
         block and the previous instructions.  We will later remove any
3708
         nops that turn out not to be needed.  */
3709
      nops = nops_for_insn (history, NULL);
3710
      if (nops > 0)
3711
        {
3712
          if (mips_optimize != 0)
3713
            {
3714
              /* Record the frag which holds the nop instructions, so
3715
                 that we can remove them if we don't need them.  */
3716
              frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
3717
              prev_nop_frag = frag_now;
3718
              prev_nop_frag_holds = nops;
3719
              prev_nop_frag_required = 0;
3720
              prev_nop_frag_since = 0;
3721
            }
3722
 
3723
          for (; nops > 0; --nops)
3724
            add_fixed_insn (NOP_INSN);
3725
 
3726
          /* Move on to a new frag, so that it is safe to simply
3727
             decrease the size of prev_nop_frag.  */
3728
          frag_wane (frag_now);
3729
          frag_new (0);
3730
          mips_move_labels ();
3731
        }
3732
      mips16_mark_labels ();
3733
      mips_clear_insn_labels ();
3734
    }
3735
  mips_opts.noreorder++;
3736
  mips_any_noreorder = 1;
3737
}
3738
 
3739
/* End a nested noreorder block.  */
3740
 
3741
static void
3742
end_noreorder (void)
3743
{
3744
 
3745
  mips_opts.noreorder--;
3746
  if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
3747
    {
3748
      /* Commit to inserting prev_nop_frag_required nops and go back to
3749
         handling nop insertion the .set reorder way.  */
3750
      prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
3751
                                * (mips_opts.mips16 ? 2 : 4));
3752
      insert_into_history (prev_nop_frag_since,
3753
                           prev_nop_frag_required, NOP_INSN);
3754
      prev_nop_frag = NULL;
3755
    }
3756
}
3757
 
3758
/* Set up global variables for the start of a new macro.  */
3759
 
3760
static void
3761
macro_start (void)
3762
{
3763
  memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
3764
  mips_macro_warning.delay_slot_p = (mips_opts.noreorder
3765
                                     && (history[0].insn_mo->pinfo
3766
                                         & (INSN_UNCOND_BRANCH_DELAY
3767
                                            | INSN_COND_BRANCH_DELAY
3768
                                            | INSN_COND_BRANCH_LIKELY)) != 0);
3769
}
3770
 
3771
/* Given that a macro is longer than 4 bytes, return the appropriate warning
3772
   for it.  Return null if no warning is needed.  SUBTYPE is a bitmask of
3773
   RELAX_DELAY_SLOT and RELAX_NOMACRO.  */
3774
 
3775
static const char *
3776
macro_warning (relax_substateT subtype)
3777
{
3778
  if (subtype & RELAX_DELAY_SLOT)
3779
    return _("Macro instruction expanded into multiple instructions"
3780
             " in a branch delay slot");
3781
  else if (subtype & RELAX_NOMACRO)
3782
    return _("Macro instruction expanded into multiple instructions");
3783
  else
3784
    return 0;
3785
}
3786
 
3787
/* Finish up a macro.  Emit warnings as appropriate.  */
3788
 
3789
static void
3790
macro_end (void)
3791
{
3792
  if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
3793
    {
3794
      relax_substateT subtype;
3795
 
3796
      /* Set up the relaxation warning flags.  */
3797
      subtype = 0;
3798
      if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
3799
        subtype |= RELAX_SECOND_LONGER;
3800
      if (mips_opts.warn_about_macros)
3801
        subtype |= RELAX_NOMACRO;
3802
      if (mips_macro_warning.delay_slot_p)
3803
        subtype |= RELAX_DELAY_SLOT;
3804
 
3805
      if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
3806
        {
3807
          /* Either the macro has a single implementation or both
3808
             implementations are longer than 4 bytes.  Emit the
3809
             warning now.  */
3810
          const char *msg = macro_warning (subtype);
3811
          if (msg != 0)
3812
            as_warn ("%s", msg);
3813
        }
3814
      else
3815
        {
3816
          /* One implementation might need a warning but the other
3817
             definitely doesn't.  */
3818
          mips_macro_warning.first_frag->fr_subtype |= subtype;
3819
        }
3820
    }
3821
}
3822
 
3823
/* Read a macro's relocation codes from *ARGS and store them in *R.
3824
   The first argument in *ARGS will be either the code for a single
3825
   relocation or -1 followed by the three codes that make up a
3826
   composite relocation.  */
3827
 
3828
static void
3829
macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
3830
{
3831
  int i, next;
3832
 
3833
  next = va_arg (*args, int);
3834
  if (next >= 0)
3835
    r[0] = (bfd_reloc_code_real_type) next;
3836
  else
3837
    for (i = 0; i < 3; i++)
3838
      r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
3839
}
3840
 
3841
/* Build an instruction created by a macro expansion.  This is passed
3842
   a pointer to the count of instructions created so far, an
3843
   expression, the name of the instruction to build, an operand format
3844
   string, and corresponding arguments.  */
3845
 
3846
static void
3847
macro_build (expressionS *ep, const char *name, const char *fmt, ...)
3848
{
3849
  const struct mips_opcode *mo;
3850
  struct mips_cl_insn insn;
3851
  bfd_reloc_code_real_type r[3];
3852
  va_list args;
3853
 
3854
  va_start (args, fmt);
3855
 
3856
  if (mips_opts.mips16)
3857
    {
3858
      mips16_macro_build (ep, name, fmt, &args);
3859
      va_end (args);
3860
      return;
3861
    }
3862
 
3863
  r[0] = BFD_RELOC_UNUSED;
3864
  r[1] = BFD_RELOC_UNUSED;
3865
  r[2] = BFD_RELOC_UNUSED;
3866
  mo = (struct mips_opcode *) hash_find (op_hash, name);
3867
  gas_assert (mo);
3868
  gas_assert (strcmp (name, mo->name) == 0);
3869
 
3870
  while (1)
3871
    {
3872
      /* Search until we get a match for NAME.  It is assumed here that
3873
         macros will never generate MDMX, MIPS-3D, or MT instructions.  */
3874
      if (strcmp (fmt, mo->args) == 0
3875
          && mo->pinfo != INSN_MACRO
3876
          && is_opcode_valid (mo))
3877
        break;
3878
 
3879
      ++mo;
3880
      gas_assert (mo->name);
3881
      gas_assert (strcmp (name, mo->name) == 0);
3882
    }
3883
 
3884
  create_insn (&insn, mo);
3885
  for (;;)
3886
    {
3887
      switch (*fmt++)
3888
        {
3889
        case '\0':
3890
          break;
3891
 
3892
        case ',':
3893
        case '(':
3894
        case ')':
3895
          continue;
3896
 
3897
        case '+':
3898
          switch (*fmt++)
3899
            {
3900
            case 'A':
3901
            case 'E':
3902
              INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3903
              continue;
3904
 
3905
            case 'B':
3906
            case 'F':
3907
              /* Note that in the macro case, these arguments are already
3908
                 in MSB form.  (When handling the instruction in the
3909
                 non-macro case, these arguments are sizes from which
3910
                 MSB values must be calculated.)  */
3911
              INSERT_OPERAND (INSMSB, insn, va_arg (args, int));
3912
              continue;
3913
 
3914
            case 'C':
3915
            case 'G':
3916
            case 'H':
3917
              /* Note that in the macro case, these arguments are already
3918
                 in MSBD form.  (When handling the instruction in the
3919
                 non-macro case, these arguments are sizes from which
3920
                 MSBD values must be calculated.)  */
3921
              INSERT_OPERAND (EXTMSBD, insn, va_arg (args, int));
3922
              continue;
3923
 
3924
            case 'Q':
3925
              INSERT_OPERAND (SEQI, insn, va_arg (args, int));
3926
              continue;
3927
 
3928
            default:
3929
              internalError ();
3930
            }
3931
          continue;
3932
 
3933
        case '2':
3934
          INSERT_OPERAND (BP, insn, va_arg (args, int));
3935
          continue;
3936
 
3937
        case 't':
3938
        case 'w':
3939
        case 'E':
3940
          INSERT_OPERAND (RT, insn, va_arg (args, int));
3941
          continue;
3942
 
3943
        case 'c':
3944
          INSERT_OPERAND (CODE, insn, va_arg (args, int));
3945
          continue;
3946
 
3947
        case 'T':
3948
        case 'W':
3949
          INSERT_OPERAND (FT, insn, va_arg (args, int));
3950
          continue;
3951
 
3952
        case 'd':
3953
        case 'G':
3954
        case 'K':
3955
          INSERT_OPERAND (RD, insn, va_arg (args, int));
3956
          continue;
3957
 
3958
        case 'U':
3959
          {
3960
            int tmp = va_arg (args, int);
3961
 
3962
            INSERT_OPERAND (RT, insn, tmp);
3963
            INSERT_OPERAND (RD, insn, tmp);
3964
            continue;
3965
          }
3966
 
3967
        case 'V':
3968
        case 'S':
3969
          INSERT_OPERAND (FS, insn, va_arg (args, int));
3970
          continue;
3971
 
3972
        case 'z':
3973
          continue;
3974
 
3975
        case '<':
3976
          INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3977
          continue;
3978
 
3979
        case 'D':
3980
          INSERT_OPERAND (FD, insn, va_arg (args, int));
3981
          continue;
3982
 
3983
        case 'B':
3984
          INSERT_OPERAND (CODE20, insn, va_arg (args, int));
3985
          continue;
3986
 
3987
        case 'J':
3988
          INSERT_OPERAND (CODE19, insn, va_arg (args, int));
3989
          continue;
3990
 
3991
        case 'q':
3992
          INSERT_OPERAND (CODE2, insn, va_arg (args, int));
3993
          continue;
3994
 
3995
        case 'b':
3996
        case 's':
3997
        case 'r':
3998
        case 'v':
3999
          INSERT_OPERAND (RS, insn, va_arg (args, int));
4000
          continue;
4001
 
4002
        case 'i':
4003
        case 'j':
4004
          macro_read_relocs (&args, r);
4005
          gas_assert (*r == BFD_RELOC_GPREL16
4006
                      || *r == BFD_RELOC_MIPS_HIGHER
4007
                      || *r == BFD_RELOC_HI16_S
4008
                      || *r == BFD_RELOC_LO16
4009
                      || *r == BFD_RELOC_MIPS_GOT_OFST);
4010
          continue;
4011
 
4012
        case 'o':
4013
          macro_read_relocs (&args, r);
4014
          continue;
4015
 
4016
        case 'u':
4017
          macro_read_relocs (&args, r);
4018
          gas_assert (ep != NULL
4019
                      && (ep->X_op == O_constant
4020
                          || (ep->X_op == O_symbol
4021
                              && (*r == BFD_RELOC_MIPS_HIGHEST
4022
                                  || *r == BFD_RELOC_HI16_S
4023
                                  || *r == BFD_RELOC_HI16
4024
                                  || *r == BFD_RELOC_GPREL16
4025
                                  || *r == BFD_RELOC_MIPS_GOT_HI16
4026
                                  || *r == BFD_RELOC_MIPS_CALL_HI16))));
4027
          continue;
4028
 
4029
        case 'p':
4030
          gas_assert (ep != NULL);
4031
 
4032
          /*
4033
           * This allows macro() to pass an immediate expression for
4034
           * creating short branches without creating a symbol.
4035
           *
4036
           * We don't allow branch relaxation for these branches, as
4037
           * they should only appear in ".set nomacro" anyway.
4038
           */
4039
          if (ep->X_op == O_constant)
4040
            {
4041
              if ((ep->X_add_number & 3) != 0)
4042
                as_bad (_("branch to misaligned address (0x%lx)"),
4043
                        (unsigned long) ep->X_add_number);
4044
              if ((ep->X_add_number + 0x20000) & ~0x3ffff)
4045
                as_bad (_("branch address range overflow (0x%lx)"),
4046
                        (unsigned long) ep->X_add_number);
4047
              insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
4048
              ep = NULL;
4049
            }
4050
          else
4051
            *r = BFD_RELOC_16_PCREL_S2;
4052
          continue;
4053
 
4054
        case 'a':
4055
          gas_assert (ep != NULL);
4056
          *r = BFD_RELOC_MIPS_JMP;
4057
          continue;
4058
 
4059
        case 'C':
4060
          INSERT_OPERAND (COPZ, insn, va_arg (args, unsigned long));
4061
          continue;
4062
 
4063
        case 'k':
4064
          INSERT_OPERAND (CACHE, insn, va_arg (args, unsigned long));
4065
          continue;
4066
 
4067
        default:
4068
          internalError ();
4069
        }
4070
      break;
4071
    }
4072
  va_end (args);
4073
  gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
4074
 
4075
  append_insn (&insn, ep, r);
4076
}
4077
 
4078
static void
4079
mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
4080
                    va_list *args)
4081
{
4082
  struct mips_opcode *mo;
4083
  struct mips_cl_insn insn;
4084
  bfd_reloc_code_real_type r[3]
4085
    = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
4086
 
4087
  mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
4088
  gas_assert (mo);
4089
  gas_assert (strcmp (name, mo->name) == 0);
4090
 
4091
  while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
4092
    {
4093
      ++mo;
4094
      gas_assert (mo->name);
4095
      gas_assert (strcmp (name, mo->name) == 0);
4096
    }
4097
 
4098
  create_insn (&insn, mo);
4099
  for (;;)
4100
    {
4101
      int c;
4102
 
4103
      c = *fmt++;
4104
      switch (c)
4105
        {
4106
        case '\0':
4107
          break;
4108
 
4109
        case ',':
4110
        case '(':
4111
        case ')':
4112
          continue;
4113
 
4114
        case 'y':
4115
        case 'w':
4116
          MIPS16_INSERT_OPERAND (RY, insn, va_arg (*args, int));
4117
          continue;
4118
 
4119
        case 'x':
4120
        case 'v':
4121
          MIPS16_INSERT_OPERAND (RX, insn, va_arg (*args, int));
4122
          continue;
4123
 
4124
        case 'z':
4125
          MIPS16_INSERT_OPERAND (RZ, insn, va_arg (*args, int));
4126
          continue;
4127
 
4128
        case 'Z':
4129
          MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (*args, int));
4130
          continue;
4131
 
4132
        case '0':
4133
        case 'S':
4134
        case 'P':
4135
        case 'R':
4136
          continue;
4137
 
4138
        case 'X':
4139
          MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (*args, int));
4140
          continue;
4141
 
4142
        case 'Y':
4143
          {
4144
            int regno;
4145
 
4146
            regno = va_arg (*args, int);
4147
            regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
4148
            MIPS16_INSERT_OPERAND (REG32R, insn, regno);
4149
          }
4150
          continue;
4151
 
4152
        case '<':
4153
        case '>':
4154
        case '4':
4155
        case '5':
4156
        case 'H':
4157
        case 'W':
4158
        case 'D':
4159
        case 'j':
4160
        case '8':
4161
        case 'V':
4162
        case 'C':
4163
        case 'U':
4164
        case 'k':
4165
        case 'K':
4166
        case 'p':
4167
        case 'q':
4168
          {
4169
            gas_assert (ep != NULL);
4170
 
4171
            if (ep->X_op != O_constant)
4172
              *r = (int) BFD_RELOC_UNUSED + c;
4173
            else
4174
              {
4175
                mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
4176
                              FALSE, &insn.insn_opcode, &insn.use_extend,
4177
                              &insn.extend);
4178
                ep = NULL;
4179
                *r = BFD_RELOC_UNUSED;
4180
              }
4181
          }
4182
          continue;
4183
 
4184
        case '6':
4185
          MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (*args, int));
4186
          continue;
4187
        }
4188
 
4189
      break;
4190
    }
4191
 
4192
  gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
4193
 
4194
  append_insn (&insn, ep, r);
4195
}
4196
 
4197
/*
4198
 * Sign-extend 32-bit mode constants that have bit 31 set and all
4199
 * higher bits unset.
4200
 */
4201
static void
4202
normalize_constant_expr (expressionS *ex)
4203
{
4204
  if (ex->X_op == O_constant
4205
      && IS_ZEXT_32BIT_NUM (ex->X_add_number))
4206
    ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
4207
                        - 0x80000000);
4208
}
4209
 
4210
/*
4211
 * Sign-extend 32-bit mode address offsets that have bit 31 set and
4212
 * all higher bits unset.
4213
 */
4214
static void
4215
normalize_address_expr (expressionS *ex)
4216
{
4217
  if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
4218
        || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
4219
      && IS_ZEXT_32BIT_NUM (ex->X_add_number))
4220
    ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
4221
                        - 0x80000000);
4222
}
4223
 
4224
/*
4225
 * Generate a "jalr" instruction with a relocation hint to the called
4226
 * function.  This occurs in NewABI PIC code.
4227
 */
4228
static void
4229
macro_build_jalr (expressionS *ep)
4230
{
4231
  char *f = NULL;
4232
 
4233
  if (MIPS_JALR_HINT_P (ep))
4234
    {
4235
      frag_grow (8);
4236
      f = frag_more (0);
4237
    }
4238
  macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
4239
  if (MIPS_JALR_HINT_P (ep))
4240
    fix_new_exp (frag_now, f - frag_now->fr_literal,
4241
                 4, ep, FALSE, BFD_RELOC_MIPS_JALR);
4242
}
4243
 
4244
/*
4245
 * Generate a "lui" instruction.
4246
 */
4247
static void
4248
macro_build_lui (expressionS *ep, int regnum)
4249
{
4250
  expressionS high_expr;
4251
  const struct mips_opcode *mo;
4252
  struct mips_cl_insn insn;
4253
  bfd_reloc_code_real_type r[3]
4254
    = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
4255
  const char *name = "lui";
4256
  const char *fmt = "t,u";
4257
 
4258
  gas_assert (! mips_opts.mips16);
4259
 
4260
  high_expr = *ep;
4261
 
4262
  if (high_expr.X_op == O_constant)
4263
    {
4264
      /* We can compute the instruction now without a relocation entry.  */
4265
      high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
4266
                                >> 16) & 0xffff;
4267
      *r = BFD_RELOC_UNUSED;
4268
    }
4269
  else
4270
    {
4271
      gas_assert (ep->X_op == O_symbol);
4272
      /* _gp_disp is a special case, used from s_cpload.
4273
         __gnu_local_gp is used if mips_no_shared.  */
4274
      gas_assert (mips_pic == NO_PIC
4275
              || (! HAVE_NEWABI
4276
                  && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
4277
              || (! mips_in_shared
4278
                  && strcmp (S_GET_NAME (ep->X_add_symbol),
4279
                             "__gnu_local_gp") == 0));
4280
      *r = BFD_RELOC_HI16_S;
4281
    }
4282
 
4283
  mo = hash_find (op_hash, name);
4284
  gas_assert (strcmp (name, mo->name) == 0);
4285
  gas_assert (strcmp (fmt, mo->args) == 0);
4286
  create_insn (&insn, mo);
4287
 
4288
  insn.insn_opcode = insn.insn_mo->match;
4289
  INSERT_OPERAND (RT, insn, regnum);
4290
  if (*r == BFD_RELOC_UNUSED)
4291
    {
4292
      insn.insn_opcode |= high_expr.X_add_number;
4293
      append_insn (&insn, NULL, r);
4294
    }
4295
  else
4296
    append_insn (&insn, &high_expr, r);
4297
}
4298
 
4299
/* Generate a sequence of instructions to do a load or store from a constant
4300
   offset off of a base register (breg) into/from a target register (treg),
4301
   using AT if necessary.  */
4302
static void
4303
macro_build_ldst_constoffset (expressionS *ep, const char *op,
4304
                              int treg, int breg, int dbl)
4305
{
4306
  gas_assert (ep->X_op == O_constant);
4307
 
4308
  /* Sign-extending 32-bit constants makes their handling easier.  */
4309
  if (!dbl)
4310
    normalize_constant_expr (ep);
4311
 
4312
  /* Right now, this routine can only handle signed 32-bit constants.  */
4313
  if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
4314
    as_warn (_("operand overflow"));
4315
 
4316
  if (IS_SEXT_16BIT_NUM(ep->X_add_number))
4317
    {
4318
      /* Signed 16-bit offset will fit in the op.  Easy!  */
4319
      macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
4320
    }
4321
  else
4322
    {
4323
      /* 32-bit offset, need multiple instructions and AT, like:
4324
           lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
4325
           addu     $tempreg,$tempreg,$breg
4326
           <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
4327
         to handle the complete offset.  */
4328
      macro_build_lui (ep, AT);
4329
      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
4330
      macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
4331
 
4332
      if (!mips_opts.at)
4333
        as_bad (_("Macro used $at after \".set noat\""));
4334
    }
4335
}
4336
 
4337
/*                      set_at()
4338
 * Generates code to set the $at register to true (one)
4339
 * if reg is less than the immediate expression.
4340
 */
4341
static void
4342
set_at (int reg, int unsignedp)
4343
{
4344
  if (imm_expr.X_op == O_constant
4345
      && imm_expr.X_add_number >= -0x8000
4346
      && imm_expr.X_add_number < 0x8000)
4347
    macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
4348
                 AT, reg, BFD_RELOC_LO16);
4349
  else
4350
    {
4351
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4352
      macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
4353
    }
4354
}
4355
 
4356
/* Warn if an expression is not a constant.  */
4357
 
4358
static void
4359
check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
4360
{
4361
  if (ex->X_op == O_big)
4362
    as_bad (_("unsupported large constant"));
4363
  else if (ex->X_op != O_constant)
4364
    as_bad (_("Instruction %s requires absolute expression"),
4365
            ip->insn_mo->name);
4366
 
4367
  if (HAVE_32BIT_GPRS)
4368
    normalize_constant_expr (ex);
4369
}
4370
 
4371
/* Count the leading zeroes by performing a binary chop. This is a
4372
   bulky bit of source, but performance is a LOT better for the
4373
   majority of values than a simple loop to count the bits:
4374
       for (lcnt = 0; (lcnt < 32); lcnt++)
4375
         if ((v) & (1 << (31 - lcnt)))
4376
           break;
4377
  However it is not code size friendly, and the gain will drop a bit
4378
  on certain cached systems.
4379
*/
4380
#define COUNT_TOP_ZEROES(v)             \
4381
  (((v) & ~0xffff) == 0                 \
4382
   ? ((v) & ~0xff) == 0                 \
4383
     ? ((v) & ~0xf) == 0                \
4384
       ? ((v) & ~0x3) == 0              \
4385
         ? ((v) & ~0x1) == 0            \
4386
           ? !(v)                       \
4387
             ? 32                       \
4388
             : 31                       \
4389
           : 30                         \
4390
         : ((v) & ~0x7) == 0            \
4391
           ? 29                         \
4392
           : 28                         \
4393
       : ((v) & ~0x3f) == 0             \
4394
         ? ((v) & ~0x1f) == 0           \
4395
           ? 27                         \
4396
           : 26                         \
4397
         : ((v) & ~0x7f) == 0           \
4398
           ? 25                         \
4399
           : 24                         \
4400
     : ((v) & ~0xfff) == 0              \
4401
       ? ((v) & ~0x3ff) == 0            \
4402
         ? ((v) & ~0x1ff) == 0          \
4403
           ? 23                         \
4404
           : 22                         \
4405
         : ((v) & ~0x7ff) == 0          \
4406
           ? 21                         \
4407
           : 20                         \
4408
       : ((v) & ~0x3fff) == 0           \
4409
         ? ((v) & ~0x1fff) == 0         \
4410
           ? 19                         \
4411
           : 18                         \
4412
         : ((v) & ~0x7fff) == 0         \
4413
           ? 17                         \
4414
           : 16                         \
4415
   : ((v) & ~0xffffff) == 0             \
4416
     ? ((v) & ~0xfffff) == 0            \
4417
       ? ((v) & ~0x3ffff) == 0          \
4418
         ? ((v) & ~0x1ffff) == 0        \
4419
           ? 15                         \
4420
           : 14                         \
4421
         : ((v) & ~0x7ffff) == 0        \
4422
           ? 13                         \
4423
           : 12                         \
4424
       : ((v) & ~0x3fffff) == 0         \
4425
         ? ((v) & ~0x1fffff) == 0       \
4426
           ? 11                         \
4427
           : 10                         \
4428
         : ((v) & ~0x7fffff) == 0       \
4429
           ? 9                          \
4430
           : 8                          \
4431
     : ((v) & ~0xfffffff) == 0          \
4432
       ? ((v) & ~0x3ffffff) == 0        \
4433
         ? ((v) & ~0x1ffffff) == 0      \
4434
           ? 7                          \
4435
           : 6                          \
4436
         : ((v) & ~0x7ffffff) == 0      \
4437
           ? 5                          \
4438
           : 4                          \
4439
       : ((v) & ~0x3fffffff) == 0       \
4440
         ? ((v) & ~0x1fffffff) == 0     \
4441
           ? 3                          \
4442
           : 2                          \
4443
         : ((v) & ~0x7fffffff) == 0     \
4444
           ? 1                          \
4445
           : 0)
4446
 
4447
/*                      load_register()
4448
 *  This routine generates the least number of instructions necessary to load
4449
 *  an absolute expression value into a register.
4450
 */
4451
static void
4452
load_register (int reg, expressionS *ep, int dbl)
4453
{
4454
  int freg;
4455
  expressionS hi32, lo32;
4456
 
4457
  if (ep->X_op != O_big)
4458
    {
4459
      gas_assert (ep->X_op == O_constant);
4460
 
4461
      /* Sign-extending 32-bit constants makes their handling easier.  */
4462
      if (!dbl)
4463
        normalize_constant_expr (ep);
4464
 
4465
      if (IS_SEXT_16BIT_NUM (ep->X_add_number))
4466
        {
4467
          /* We can handle 16 bit signed values with an addiu to
4468
             $zero.  No need to ever use daddiu here, since $zero and
4469
             the result are always correct in 32 bit mode.  */
4470
          macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4471
          return;
4472
        }
4473
      else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
4474
        {
4475
          /* We can handle 16 bit unsigned values with an ori to
4476
             $zero.  */
4477
          macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4478
          return;
4479
        }
4480
      else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
4481
        {
4482
          /* 32 bit values require an lui.  */
4483
          macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
4484
          if ((ep->X_add_number & 0xffff) != 0)
4485
            macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4486
          return;
4487
        }
4488
    }
4489
 
4490
  /* The value is larger than 32 bits.  */
4491
 
4492
  if (!dbl || HAVE_32BIT_GPRS)
4493
    {
4494
      char value[32];
4495
 
4496
      sprintf_vma (value, ep->X_add_number);
4497
      as_bad (_("Number (0x%s) larger than 32 bits"), value);
4498
      macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4499
      return;
4500
    }
4501
 
4502
  if (ep->X_op != O_big)
4503
    {
4504
      hi32 = *ep;
4505
      hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4506
      hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4507
      hi32.X_add_number &= 0xffffffff;
4508
      lo32 = *ep;
4509
      lo32.X_add_number &= 0xffffffff;
4510
    }
4511
  else
4512
    {
4513
      gas_assert (ep->X_add_number > 2);
4514
      if (ep->X_add_number == 3)
4515
        generic_bignum[3] = 0;
4516
      else if (ep->X_add_number > 4)
4517
        as_bad (_("Number larger than 64 bits"));
4518
      lo32.X_op = O_constant;
4519
      lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
4520
      hi32.X_op = O_constant;
4521
      hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
4522
    }
4523
 
4524
  if (hi32.X_add_number == 0)
4525
    freg = 0;
4526
  else
4527
    {
4528
      int shift, bit;
4529
      unsigned long hi, lo;
4530
 
4531
      if (hi32.X_add_number == (offsetT) 0xffffffff)
4532
        {
4533
          if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
4534
            {
4535
              macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4536
              return;
4537
            }
4538
          if (lo32.X_add_number & 0x80000000)
4539
            {
4540
              macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4541
              if (lo32.X_add_number & 0xffff)
4542
                macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4543
              return;
4544
            }
4545
        }
4546
 
4547
      /* Check for 16bit shifted constant.  We know that hi32 is
4548
         non-zero, so start the mask on the first bit of the hi32
4549
         value.  */
4550
      shift = 17;
4551
      do
4552
        {
4553
          unsigned long himask, lomask;
4554
 
4555
          if (shift < 32)
4556
            {
4557
              himask = 0xffff >> (32 - shift);
4558
              lomask = (0xffff << shift) & 0xffffffff;
4559
            }
4560
          else
4561
            {
4562
              himask = 0xffff << (shift - 32);
4563
              lomask = 0;
4564
            }
4565
          if ((hi32.X_add_number & ~(offsetT) himask) == 0
4566
              && (lo32.X_add_number & ~(offsetT) lomask) == 0)
4567
            {
4568
              expressionS tmp;
4569
 
4570
              tmp.X_op = O_constant;
4571
              if (shift < 32)
4572
                tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
4573
                                    | (lo32.X_add_number >> shift));
4574
              else
4575
                tmp.X_add_number = hi32.X_add_number >> (shift - 32);
4576
              macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4577
              macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
4578
                           reg, reg, (shift >= 32) ? shift - 32 : shift);
4579
              return;
4580
            }
4581
          ++shift;
4582
        }
4583
      while (shift <= (64 - 16));
4584
 
4585
      /* Find the bit number of the lowest one bit, and store the
4586
         shifted value in hi/lo.  */
4587
      hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
4588
      lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
4589
      if (lo != 0)
4590
        {
4591
          bit = 0;
4592
          while ((lo & 1) == 0)
4593
            {
4594
              lo >>= 1;
4595
              ++bit;
4596
            }
4597
          lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
4598
          hi >>= bit;
4599
        }
4600
      else
4601
        {
4602
          bit = 32;
4603
          while ((hi & 1) == 0)
4604
            {
4605
              hi >>= 1;
4606
              ++bit;
4607
            }
4608
          lo = hi;
4609
          hi = 0;
4610
        }
4611
 
4612
      /* Optimize if the shifted value is a (power of 2) - 1.  */
4613
      if ((hi == 0 && ((lo + 1) & lo) == 0)
4614
          || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
4615
        {
4616
          shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
4617
          if (shift != 0)
4618
            {
4619
              expressionS tmp;
4620
 
4621
              /* This instruction will set the register to be all
4622
                 ones.  */
4623
              tmp.X_op = O_constant;
4624
              tmp.X_add_number = (offsetT) -1;
4625
              macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4626
              if (bit != 0)
4627
                {
4628
                  bit += shift;
4629
                  macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
4630
                               reg, reg, (bit >= 32) ? bit - 32 : bit);
4631
                }
4632
              macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
4633
                           reg, reg, (shift >= 32) ? shift - 32 : shift);
4634
              return;
4635
            }
4636
        }
4637
 
4638
      /* Sign extend hi32 before calling load_register, because we can
4639
         generally get better code when we load a sign extended value.  */
4640
      if ((hi32.X_add_number & 0x80000000) != 0)
4641
        hi32.X_add_number |= ~(offsetT) 0xffffffff;
4642
      load_register (reg, &hi32, 0);
4643
      freg = reg;
4644
    }
4645
  if ((lo32.X_add_number & 0xffff0000) == 0)
4646
    {
4647
      if (freg != 0)
4648
        {
4649
          macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
4650
          freg = reg;
4651
        }
4652
    }
4653
  else
4654
    {
4655
      expressionS mid16;
4656
 
4657
      if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
4658
        {
4659
          macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4660
          macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
4661
          return;
4662
        }
4663
 
4664
      if (freg != 0)
4665
        {
4666
          macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
4667
          freg = reg;
4668
        }
4669
      mid16 = lo32;
4670
      mid16.X_add_number >>= 16;
4671
      macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4672
      macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4673
      freg = reg;
4674
    }
4675
  if ((lo32.X_add_number & 0xffff) != 0)
4676
    macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4677
}
4678
 
4679
static inline void
4680
load_delay_nop (void)
4681
{
4682
  if (!gpr_interlocks)
4683
    macro_build (NULL, "nop", "");
4684
}
4685
 
4686
/* Load an address into a register.  */
4687
 
4688
static void
4689
load_address (int reg, expressionS *ep, int *used_at)
4690
{
4691
  if (ep->X_op != O_constant
4692
      && ep->X_op != O_symbol)
4693
    {
4694
      as_bad (_("expression too complex"));
4695
      ep->X_op = O_constant;
4696
    }
4697
 
4698
  if (ep->X_op == O_constant)
4699
    {
4700
      load_register (reg, ep, HAVE_64BIT_ADDRESSES);
4701
      return;
4702
    }
4703
 
4704
  if (mips_pic == NO_PIC)
4705
    {
4706
      /* If this is a reference to a GP relative symbol, we want
4707
           addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
4708
         Otherwise we want
4709
           lui          $reg,<sym>              (BFD_RELOC_HI16_S)
4710
           addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4711
         If we have an addend, we always use the latter form.
4712
 
4713
         With 64bit address space and a usable $at we want
4714
           lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4715
           lui          $at,<sym>               (BFD_RELOC_HI16_S)
4716
           daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4717
           daddiu       $at,<sym>               (BFD_RELOC_LO16)
4718
           dsll32       $reg,0
4719
           daddu        $reg,$reg,$at
4720
 
4721
         If $at is already in use, we use a path which is suboptimal
4722
         on superscalar processors.
4723
           lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4724
           daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4725
           dsll         $reg,16
4726
           daddiu       $reg,<sym>              (BFD_RELOC_HI16_S)
4727
           dsll         $reg,16
4728
           daddiu       $reg,<sym>              (BFD_RELOC_LO16)
4729
 
4730
         For GP relative symbols in 64bit address space we can use
4731
         the same sequence as in 32bit address space.  */
4732
      if (HAVE_64BIT_SYMBOLS)
4733
        {
4734
          if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4735
              && !nopic_need_relax (ep->X_add_symbol, 1))
4736
            {
4737
              relax_start (ep->X_add_symbol);
4738
              macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4739
                           mips_gp_register, BFD_RELOC_GPREL16);
4740
              relax_switch ();
4741
            }
4742
 
4743
          if (*used_at == 0 && mips_opts.at)
4744
            {
4745
              macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4746
              macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
4747
              macro_build (ep, "daddiu", "t,r,j", reg, reg,
4748
                           BFD_RELOC_MIPS_HIGHER);
4749
              macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
4750
              macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
4751
              macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
4752
              *used_at = 1;
4753
            }
4754
          else
4755
            {
4756
              macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4757
              macro_build (ep, "daddiu", "t,r,j", reg, reg,
4758
                           BFD_RELOC_MIPS_HIGHER);
4759
              macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4760
              macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
4761
              macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4762
              macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
4763
            }
4764
 
4765
          if (mips_relax.sequence)
4766
            relax_end ();
4767
        }
4768
      else
4769
        {
4770
          if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4771
              && !nopic_need_relax (ep->X_add_symbol, 1))
4772
            {
4773
              relax_start (ep->X_add_symbol);
4774
              macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4775
                           mips_gp_register, BFD_RELOC_GPREL16);
4776
              relax_switch ();
4777
            }
4778
          macro_build_lui (ep, reg);
4779
          macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
4780
                       reg, reg, BFD_RELOC_LO16);
4781
          if (mips_relax.sequence)
4782
            relax_end ();
4783
        }
4784
    }
4785
  else if (!mips_big_got)
4786
    {
4787
      expressionS ex;
4788
 
4789
      /* If this is a reference to an external symbol, we want
4790
           lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4791
         Otherwise we want
4792
           lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4793
           nop
4794
           addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4795
         If there is a constant, it must be added in after.
4796
 
4797
         If we have NewABI, we want
4798
           lw           $reg,<sym+cst>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
4799
         unless we're referencing a global symbol with a non-zero
4800
         offset, in which case cst must be added separately.  */
4801
      if (HAVE_NEWABI)
4802
        {
4803
          if (ep->X_add_number)
4804
            {
4805
              ex.X_add_number = ep->X_add_number;
4806
              ep->X_add_number = 0;
4807
              relax_start (ep->X_add_symbol);
4808
              macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4809
                           BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4810
              if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4811
                as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4812
              ex.X_op = O_constant;
4813
              macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4814
                           reg, reg, BFD_RELOC_LO16);
4815
              ep->X_add_number = ex.X_add_number;
4816
              relax_switch ();
4817
            }
4818
          macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4819
                       BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4820
          if (mips_relax.sequence)
4821
            relax_end ();
4822
        }
4823
      else
4824
        {
4825
          ex.X_add_number = ep->X_add_number;
4826
          ep->X_add_number = 0;
4827
          macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4828
                       BFD_RELOC_MIPS_GOT16, mips_gp_register);
4829
          load_delay_nop ();
4830
          relax_start (ep->X_add_symbol);
4831
          relax_switch ();
4832
          macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4833
                       BFD_RELOC_LO16);
4834
          relax_end ();
4835
 
4836
          if (ex.X_add_number != 0)
4837
            {
4838
              if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4839
                as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4840
              ex.X_op = O_constant;
4841
              macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4842
                           reg, reg, BFD_RELOC_LO16);
4843
            }
4844
        }
4845
    }
4846
  else if (mips_big_got)
4847
    {
4848
      expressionS ex;
4849
 
4850
      /* This is the large GOT case.  If this is a reference to an
4851
         external symbol, we want
4852
           lui          $reg,<sym>              (BFD_RELOC_MIPS_GOT_HI16)
4853
           addu         $reg,$reg,$gp
4854
           lw           $reg,<sym>($reg)        (BFD_RELOC_MIPS_GOT_LO16)
4855
 
4856
         Otherwise, for a reference to a local symbol in old ABI, we want
4857
           lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4858
           nop
4859
           addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4860
         If there is a constant, it must be added in after.
4861
 
4862
         In the NewABI, for local symbols, with or without offsets, we want:
4863
           lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
4864
           addiu        $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
4865
      */
4866
      if (HAVE_NEWABI)
4867
        {
4868
          ex.X_add_number = ep->X_add_number;
4869
          ep->X_add_number = 0;
4870
          relax_start (ep->X_add_symbol);
4871
          macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4872
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4873
                       reg, reg, mips_gp_register);
4874
          macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4875
                       reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4876
          if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4877
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4878
          else if (ex.X_add_number)
4879
            {
4880
              ex.X_op = O_constant;
4881
              macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4882
                           BFD_RELOC_LO16);
4883
            }
4884
 
4885
          ep->X_add_number = ex.X_add_number;
4886
          relax_switch ();
4887
          macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4888
                       BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
4889
          macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4890
                       BFD_RELOC_MIPS_GOT_OFST);
4891
          relax_end ();
4892
        }
4893
      else
4894
        {
4895
          ex.X_add_number = ep->X_add_number;
4896
          ep->X_add_number = 0;
4897
          relax_start (ep->X_add_symbol);
4898
          macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4899
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4900
                       reg, reg, mips_gp_register);
4901
          macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4902
                       reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4903
          relax_switch ();
4904
          if (reg_needs_delay (mips_gp_register))
4905
            {
4906
              /* We need a nop before loading from $gp.  This special
4907
                 check is required because the lui which starts the main
4908
                 instruction stream does not refer to $gp, and so will not
4909
                 insert the nop which may be required.  */
4910
              macro_build (NULL, "nop", "");
4911
            }
4912
          macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4913
                       BFD_RELOC_MIPS_GOT16, mips_gp_register);
4914
          load_delay_nop ();
4915
          macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4916
                       BFD_RELOC_LO16);
4917
          relax_end ();
4918
 
4919
          if (ex.X_add_number != 0)
4920
            {
4921
              if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4922
                as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4923
              ex.X_op = O_constant;
4924
              macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4925
                           BFD_RELOC_LO16);
4926
            }
4927
        }
4928
    }
4929
  else
4930
    abort ();
4931
 
4932
  if (!mips_opts.at && *used_at == 1)
4933
    as_bad (_("Macro used $at after \".set noat\""));
4934
}
4935
 
4936
/* Move the contents of register SOURCE into register DEST.  */
4937
 
4938
static void
4939
move_register (int dest, int source)
4940
{
4941
  macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4942
               dest, source, 0);
4943
}
4944
 
4945
/* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
4946
   LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
4947
   The two alternatives are:
4948
 
4949
   Global symbol                Local sybmol
4950
   -------------                ------------
4951
   lw DEST,%got(SYMBOL)         lw DEST,%got(SYMBOL + OFFSET)
4952
   ...                          ...
4953
   addiu DEST,DEST,OFFSET       addiu DEST,DEST,%lo(SYMBOL + OFFSET)
4954
 
4955
   load_got_offset emits the first instruction and add_got_offset
4956
   emits the second for a 16-bit offset or add_got_offset_hilo emits
4957
   a sequence to add a 32-bit offset using a scratch register.  */
4958
 
4959
static void
4960
load_got_offset (int dest, expressionS *local)
4961
{
4962
  expressionS global;
4963
 
4964
  global = *local;
4965
  global.X_add_number = 0;
4966
 
4967
  relax_start (local->X_add_symbol);
4968
  macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4969
               BFD_RELOC_MIPS_GOT16, mips_gp_register);
4970
  relax_switch ();
4971
  macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4972
               BFD_RELOC_MIPS_GOT16, mips_gp_register);
4973
  relax_end ();
4974
}
4975
 
4976
static void
4977
add_got_offset (int dest, expressionS *local)
4978
{
4979
  expressionS global;
4980
 
4981
  global.X_op = O_constant;
4982
  global.X_op_symbol = NULL;
4983
  global.X_add_symbol = NULL;
4984
  global.X_add_number = local->X_add_number;
4985
 
4986
  relax_start (local->X_add_symbol);
4987
  macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
4988
               dest, dest, BFD_RELOC_LO16);
4989
  relax_switch ();
4990
  macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
4991
  relax_end ();
4992
}
4993
 
4994
static void
4995
add_got_offset_hilo (int dest, expressionS *local, int tmp)
4996
{
4997
  expressionS global;
4998
  int hold_mips_optimize;
4999
 
5000
  global.X_op = O_constant;
5001
  global.X_op_symbol = NULL;
5002
  global.X_add_symbol = NULL;
5003
  global.X_add_number = local->X_add_number;
5004
 
5005
  relax_start (local->X_add_symbol);
5006
  load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
5007
  relax_switch ();
5008
  /* Set mips_optimize around the lui instruction to avoid
5009
     inserting an unnecessary nop after the lw.  */
5010
  hold_mips_optimize = mips_optimize;
5011
  mips_optimize = 2;
5012
  macro_build_lui (&global, tmp);
5013
  mips_optimize = hold_mips_optimize;
5014
  macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
5015
  relax_end ();
5016
 
5017
  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
5018
}
5019
 
5020
/*
5021
 *                      Build macros
5022
 *   This routine implements the seemingly endless macro or synthesized
5023
 * instructions and addressing modes in the mips assembly language. Many
5024
 * of these macros are simple and are similar to each other. These could
5025
 * probably be handled by some kind of table or grammar approach instead of
5026
 * this verbose method. Others are not simple macros but are more like
5027
 * optimizing code generation.
5028
 *   One interesting optimization is when several store macros appear
5029
 * consecutively that would load AT with the upper half of the same address.
5030
 * The ensuing load upper instructions are ommited. This implies some kind
5031
 * of global optimization. We currently only optimize within a single macro.
5032
 *   For many of the load and store macros if the address is specified as a
5033
 * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
5034
 * first load register 'at' with zero and use it as the base register. The
5035
 * mips assembler simply uses register $zero. Just one tiny optimization
5036
 * we're missing.
5037
 */
5038
static void
5039
macro (struct mips_cl_insn *ip)
5040
{
5041
  unsigned int treg, sreg, dreg, breg;
5042
  unsigned int tempreg;
5043
  int mask;
5044
  int used_at = 0;
5045
  expressionS expr1;
5046
  const char *s;
5047
  const char *s2;
5048
  const char *fmt;
5049
  int likely = 0;
5050
  int dbl = 0;
5051
  int coproc = 0;
5052
  int lr = 0;
5053
  int imm = 0;
5054
  int call = 0;
5055
  int off;
5056
  offsetT maxnum;
5057
  bfd_reloc_code_real_type r;
5058
  int hold_mips_optimize;
5059
 
5060
  gas_assert (! mips_opts.mips16);
5061
 
5062
  treg = EXTRACT_OPERAND (RT, *ip);
5063
  dreg = EXTRACT_OPERAND (RD, *ip);
5064
  sreg = breg = EXTRACT_OPERAND (RS, *ip);
5065
  mask = ip->insn_mo->mask;
5066
 
5067
  expr1.X_op = O_constant;
5068
  expr1.X_op_symbol = NULL;
5069
  expr1.X_add_symbol = NULL;
5070
  expr1.X_add_number = 1;
5071
 
5072
  switch (mask)
5073
    {
5074
    case M_DABS:
5075
      dbl = 1;
5076
    case M_ABS:
5077
      /* bgez $a0,.+12
5078
         move v0,$a0
5079
         sub v0,$zero,$a0
5080
         */
5081
 
5082
      start_noreorder ();
5083
 
5084
      expr1.X_add_number = 8;
5085
      macro_build (&expr1, "bgez", "s,p", sreg);
5086
      if (dreg == sreg)
5087
        macro_build (NULL, "nop", "");
5088
      else
5089
        move_register (dreg, sreg);
5090
      macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
5091
 
5092
      end_noreorder ();
5093
      break;
5094
 
5095
    case M_ADD_I:
5096
      s = "addi";
5097
      s2 = "add";
5098
      goto do_addi;
5099
    case M_ADDU_I:
5100
      s = "addiu";
5101
      s2 = "addu";
5102
      goto do_addi;
5103
    case M_DADD_I:
5104
      dbl = 1;
5105
      s = "daddi";
5106
      s2 = "dadd";
5107
      goto do_addi;
5108
    case M_DADDU_I:
5109
      dbl = 1;
5110
      s = "daddiu";
5111
      s2 = "daddu";
5112
    do_addi:
5113
      if (imm_expr.X_op == O_constant
5114
          && imm_expr.X_add_number >= -0x8000
5115
          && imm_expr.X_add_number < 0x8000)
5116
        {
5117
          macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
5118
          break;
5119
        }
5120
      used_at = 1;
5121
      load_register (AT, &imm_expr, dbl);
5122
      macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
5123
      break;
5124
 
5125
    case M_AND_I:
5126
      s = "andi";
5127
      s2 = "and";
5128
      goto do_bit;
5129
    case M_OR_I:
5130
      s = "ori";
5131
      s2 = "or";
5132
      goto do_bit;
5133
    case M_NOR_I:
5134
      s = "";
5135
      s2 = "nor";
5136
      goto do_bit;
5137
    case M_XOR_I:
5138
      s = "xori";
5139
      s2 = "xor";
5140
    do_bit:
5141
      if (imm_expr.X_op == O_constant
5142
          && imm_expr.X_add_number >= 0
5143
          && imm_expr.X_add_number < 0x10000)
5144
        {
5145
          if (mask != M_NOR_I)
5146
            macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
5147
          else
5148
            {
5149
              macro_build (&imm_expr, "ori", "t,r,i",
5150
                           treg, sreg, BFD_RELOC_LO16);
5151
              macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
5152
            }
5153
          break;
5154
        }
5155
 
5156
      used_at = 1;
5157
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
5158
      macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
5159
      break;
5160
 
5161
    case M_BALIGN:
5162
      switch (imm_expr.X_add_number)
5163
        {
5164
        case 0:
5165
          macro_build (NULL, "nop", "");
5166
          break;
5167
        case 2:
5168
          macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
5169
          break;
5170
        default:
5171
          macro_build (NULL, "balign", "t,s,2", treg, sreg,
5172
                       (int) imm_expr.X_add_number);
5173
          break;
5174
        }
5175
      break;
5176
 
5177
    case M_BEQ_I:
5178
      s = "beq";
5179
      goto beq_i;
5180
    case M_BEQL_I:
5181
      s = "beql";
5182
      likely = 1;
5183
      goto beq_i;
5184
    case M_BNE_I:
5185
      s = "bne";
5186
      goto beq_i;
5187
    case M_BNEL_I:
5188
      s = "bnel";
5189
      likely = 1;
5190
    beq_i:
5191
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5192
        {
5193
          macro_build (&offset_expr, s, "s,t,p", sreg, ZERO);
5194
          break;
5195
        }
5196
      used_at = 1;
5197
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
5198
      macro_build (&offset_expr, s, "s,t,p", sreg, AT);
5199
      break;
5200
 
5201
    case M_BGEL:
5202
      likely = 1;
5203
    case M_BGE:
5204
      if (treg == 0)
5205
        {
5206
          macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
5207
          break;
5208
        }
5209
      if (sreg == 0)
5210
        {
5211
          macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
5212
          break;
5213
        }
5214
      used_at = 1;
5215
      macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
5216
      macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5217
      break;
5218
 
5219
    case M_BGTL_I:
5220
      likely = 1;
5221
    case M_BGT_I:
5222
      /* Check for > max integer.  */
5223
      maxnum = 0x7fffffff;
5224
      if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
5225
        {
5226
          maxnum <<= 16;
5227
          maxnum |= 0xffff;
5228
          maxnum <<= 16;
5229
          maxnum |= 0xffff;
5230
        }
5231
      if (imm_expr.X_op == O_constant
5232
          && imm_expr.X_add_number >= maxnum
5233
          && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5234
        {
5235
        do_false:
5236
          /* Result is always false.  */
5237
          if (! likely)
5238
            macro_build (NULL, "nop", "");
5239
          else
5240
            macro_build (&offset_expr, "bnel", "s,t,p", ZERO, ZERO);
5241
          break;
5242
        }
5243
      if (imm_expr.X_op != O_constant)
5244
        as_bad (_("Unsupported large constant"));
5245
      ++imm_expr.X_add_number;
5246
      /* FALLTHROUGH */
5247
    case M_BGE_I:
5248
    case M_BGEL_I:
5249
      if (mask == M_BGEL_I)
5250
        likely = 1;
5251
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5252
        {
5253
          macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
5254
          break;
5255
        }
5256
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5257
        {
5258
          macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
5259
          break;
5260
        }
5261
      maxnum = 0x7fffffff;
5262
      if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
5263
        {
5264
          maxnum <<= 16;
5265
          maxnum |= 0xffff;
5266
          maxnum <<= 16;
5267
          maxnum |= 0xffff;
5268
        }
5269
      maxnum = - maxnum - 1;
5270
      if (imm_expr.X_op == O_constant
5271
          && imm_expr.X_add_number <= maxnum
5272
          && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5273
        {
5274
        do_true:
5275
          /* result is always true */
5276
          as_warn (_("Branch %s is always true"), ip->insn_mo->name);
5277
          macro_build (&offset_expr, "b", "p");
5278
          break;
5279
        }
5280
      used_at = 1;
5281
      set_at (sreg, 0);
5282
      macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5283
      break;
5284
 
5285
    case M_BGEUL:
5286
      likely = 1;
5287
    case M_BGEU:
5288
      if (treg == 0)
5289
        goto do_true;
5290
      if (sreg == 0)
5291
        {
5292
          macro_build (&offset_expr, likely ? "beql" : "beq",
5293
                       "s,t,p", ZERO, treg);
5294
          break;
5295
        }
5296
      used_at = 1;
5297
      macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
5298
      macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5299
      break;
5300
 
5301
    case M_BGTUL_I:
5302
      likely = 1;
5303
    case M_BGTU_I:
5304
      if (sreg == 0
5305
          || (HAVE_32BIT_GPRS
5306
              && imm_expr.X_op == O_constant
5307
              && imm_expr.X_add_number == -1))
5308
        goto do_false;
5309
      if (imm_expr.X_op != O_constant)
5310
        as_bad (_("Unsupported large constant"));
5311
      ++imm_expr.X_add_number;
5312
      /* FALLTHROUGH */
5313
    case M_BGEU_I:
5314
    case M_BGEUL_I:
5315
      if (mask == M_BGEUL_I)
5316
        likely = 1;
5317
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5318
        goto do_true;
5319
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5320
        {
5321
          macro_build (&offset_expr, likely ? "bnel" : "bne",
5322
                       "s,t,p", sreg, ZERO);
5323
          break;
5324
        }
5325
      used_at = 1;
5326
      set_at (sreg, 1);
5327
      macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5328
      break;
5329
 
5330
    case M_BGTL:
5331
      likely = 1;
5332
    case M_BGT:
5333
      if (treg == 0)
5334
        {
5335
          macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
5336
          break;
5337
        }
5338
      if (sreg == 0)
5339
        {
5340
          macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
5341
          break;
5342
        }
5343
      used_at = 1;
5344
      macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
5345
      macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5346
      break;
5347
 
5348
    case M_BGTUL:
5349
      likely = 1;
5350
    case M_BGTU:
5351
      if (treg == 0)
5352
        {
5353
          macro_build (&offset_expr, likely ? "bnel" : "bne",
5354
                       "s,t,p", sreg, ZERO);
5355
          break;
5356
        }
5357
      if (sreg == 0)
5358
        goto do_false;
5359
      used_at = 1;
5360
      macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
5361
      macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5362
      break;
5363
 
5364
    case M_BLEL:
5365
      likely = 1;
5366
    case M_BLE:
5367
      if (treg == 0)
5368
        {
5369
          macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
5370
          break;
5371
        }
5372
      if (sreg == 0)
5373
        {
5374
          macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
5375
          break;
5376
        }
5377
      used_at = 1;
5378
      macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
5379
      macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5380
      break;
5381
 
5382
    case M_BLEL_I:
5383
      likely = 1;
5384
    case M_BLE_I:
5385
      maxnum = 0x7fffffff;
5386
      if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
5387
        {
5388
          maxnum <<= 16;
5389
          maxnum |= 0xffff;
5390
          maxnum <<= 16;
5391
          maxnum |= 0xffff;
5392
        }
5393
      if (imm_expr.X_op == O_constant
5394
          && imm_expr.X_add_number >= maxnum
5395
          && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5396
        goto do_true;
5397
      if (imm_expr.X_op != O_constant)
5398
        as_bad (_("Unsupported large constant"));
5399
      ++imm_expr.X_add_number;
5400
      /* FALLTHROUGH */
5401
    case M_BLT_I:
5402
    case M_BLTL_I:
5403
      if (mask == M_BLTL_I)
5404
        likely = 1;
5405
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5406
        {
5407
          macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
5408
          break;
5409
        }
5410
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5411
        {
5412
          macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
5413
          break;
5414
        }
5415
      used_at = 1;
5416
      set_at (sreg, 0);
5417
      macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5418
      break;
5419
 
5420
    case M_BLEUL:
5421
      likely = 1;
5422
    case M_BLEU:
5423
      if (treg == 0)
5424
        {
5425
          macro_build (&offset_expr, likely ? "beql" : "beq",
5426
                       "s,t,p", sreg, ZERO);
5427
          break;
5428
        }
5429
      if (sreg == 0)
5430
        goto do_true;
5431
      used_at = 1;
5432
      macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
5433
      macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5434
      break;
5435
 
5436
    case M_BLEUL_I:
5437
      likely = 1;
5438
    case M_BLEU_I:
5439
      if (sreg == 0
5440
          || (HAVE_32BIT_GPRS
5441
              && imm_expr.X_op == O_constant
5442
              && imm_expr.X_add_number == -1))
5443
        goto do_true;
5444
      if (imm_expr.X_op != O_constant)
5445
        as_bad (_("Unsupported large constant"));
5446
      ++imm_expr.X_add_number;
5447
      /* FALLTHROUGH */
5448
    case M_BLTU_I:
5449
    case M_BLTUL_I:
5450
      if (mask == M_BLTUL_I)
5451
        likely = 1;
5452
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5453
        goto do_false;
5454
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5455
        {
5456
          macro_build (&offset_expr, likely ? "beql" : "beq",
5457
                       "s,t,p", sreg, ZERO);
5458
          break;
5459
        }
5460
      used_at = 1;
5461
      set_at (sreg, 1);
5462
      macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5463
      break;
5464
 
5465
    case M_BLTL:
5466
      likely = 1;
5467
    case M_BLT:
5468
      if (treg == 0)
5469
        {
5470
          macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
5471
          break;
5472
        }
5473
      if (sreg == 0)
5474
        {
5475
          macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
5476
          break;
5477
        }
5478
      used_at = 1;
5479
      macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
5480
      macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5481
      break;
5482
 
5483
    case M_BLTUL:
5484
      likely = 1;
5485
    case M_BLTU:
5486
      if (treg == 0)
5487
        goto do_false;
5488
      if (sreg == 0)
5489
        {
5490
          macro_build (&offset_expr, likely ? "bnel" : "bne",
5491
                       "s,t,p", ZERO, treg);
5492
          break;
5493
        }
5494
      used_at = 1;
5495
      macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
5496
      macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5497
      break;
5498
 
5499
    case M_DEXT:
5500
      {
5501
        /* Use unsigned arithmetic.  */
5502
        addressT pos;
5503
        addressT size;
5504
 
5505
        if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5506
          {
5507
            as_bad (_("Unsupported large constant"));
5508
            pos = size = 1;
5509
          }
5510
        else
5511
          {
5512
            pos = imm_expr.X_add_number;
5513
            size = imm2_expr.X_add_number;
5514
          }
5515
 
5516
        if (pos > 63)
5517
          {
5518
            as_bad (_("Improper position (%lu)"), (unsigned long) pos);
5519
            pos = 1;
5520
          }
5521
        if (size == 0 || size > 64 || (pos + size - 1) > 63)
5522
          {
5523
            as_bad (_("Improper extract size (%lu, position %lu)"),
5524
                    (unsigned long) size, (unsigned long) pos);
5525
            size = 1;
5526
          }
5527
 
5528
        if (size <= 32 && pos < 32)
5529
          {
5530
            s = "dext";
5531
            fmt = "t,r,+A,+C";
5532
          }
5533
        else if (size <= 32)
5534
          {
5535
            s = "dextu";
5536
            fmt = "t,r,+E,+H";
5537
          }
5538
        else
5539
          {
5540
            s = "dextm";
5541
            fmt = "t,r,+A,+G";
5542
          }
5543
        macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
5544
                     (int) (size - 1));
5545
      }
5546
      break;
5547
 
5548
    case M_DINS:
5549
      {
5550
        /* Use unsigned arithmetic.  */
5551
        addressT pos;
5552
        addressT size;
5553
 
5554
        if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5555
          {
5556
            as_bad (_("Unsupported large constant"));
5557
            pos = size = 1;
5558
          }
5559
        else
5560
          {
5561
            pos = imm_expr.X_add_number;
5562
            size = imm2_expr.X_add_number;
5563
          }
5564
 
5565
        if (pos > 63)
5566
          {
5567
            as_bad (_("Improper position (%lu)"), (unsigned long) pos);
5568
            pos = 1;
5569
          }
5570
        if (size == 0 || size > 64 || (pos + size - 1) > 63)
5571
          {
5572
            as_bad (_("Improper insert size (%lu, position %lu)"),
5573
                    (unsigned long) size, (unsigned long) pos);
5574
            size = 1;
5575
          }
5576
 
5577
        if (pos < 32 && (pos + size - 1) < 32)
5578
          {
5579
            s = "dins";
5580
            fmt = "t,r,+A,+B";
5581
          }
5582
        else if (pos >= 32)
5583
          {
5584
            s = "dinsu";
5585
            fmt = "t,r,+E,+F";
5586
          }
5587
        else
5588
          {
5589
            s = "dinsm";
5590
            fmt = "t,r,+A,+F";
5591
          }
5592
        macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
5593
                     (int) (pos + size - 1));
5594
      }
5595
      break;
5596
 
5597
    case M_DDIV_3:
5598
      dbl = 1;
5599
    case M_DIV_3:
5600
      s = "mflo";
5601
      goto do_div3;
5602
    case M_DREM_3:
5603
      dbl = 1;
5604
    case M_REM_3:
5605
      s = "mfhi";
5606
    do_div3:
5607
      if (treg == 0)
5608
        {
5609
          as_warn (_("Divide by zero."));
5610
          if (mips_trap)
5611
            macro_build (NULL, "teq", "s,t,q", ZERO, ZERO, 7);
5612
          else
5613
            macro_build (NULL, "break", "c", 7);
5614
          break;
5615
        }
5616
 
5617
      start_noreorder ();
5618
      if (mips_trap)
5619
        {
5620
          macro_build (NULL, "teq", "s,t,q", treg, ZERO, 7);
5621
          macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5622
        }
5623
      else
5624
        {
5625
          expr1.X_add_number = 8;
5626
          macro_build (&expr1, "bne", "s,t,p", treg, ZERO);
5627
          macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5628
          macro_build (NULL, "break", "c", 7);
5629
        }
5630
      expr1.X_add_number = -1;
5631
      used_at = 1;
5632
      load_register (AT, &expr1, dbl);
5633
      expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
5634
      macro_build (&expr1, "bne", "s,t,p", treg, AT);
5635
      if (dbl)
5636
        {
5637
          expr1.X_add_number = 1;
5638
          load_register (AT, &expr1, dbl);
5639
          macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
5640
        }
5641
      else
5642
        {
5643
          expr1.X_add_number = 0x80000000;
5644
          macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
5645
        }
5646
      if (mips_trap)
5647
        {
5648
          macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
5649
          /* We want to close the noreorder block as soon as possible, so
5650
             that later insns are available for delay slot filling.  */
5651
          end_noreorder ();
5652
        }
5653
      else
5654
        {
5655
          expr1.X_add_number = 8;
5656
          macro_build (&expr1, "bne", "s,t,p", sreg, AT);
5657
          macro_build (NULL, "nop", "");
5658
 
5659
          /* We want to close the noreorder block as soon as possible, so
5660
             that later insns are available for delay slot filling.  */
5661
          end_noreorder ();
5662
 
5663
          macro_build (NULL, "break", "c", 6);
5664
        }
5665
      macro_build (NULL, s, "d", dreg);
5666
      break;
5667
 
5668
    case M_DIV_3I:
5669
      s = "div";
5670
      s2 = "mflo";
5671
      goto do_divi;
5672
    case M_DIVU_3I:
5673
      s = "divu";
5674
      s2 = "mflo";
5675
      goto do_divi;
5676
    case M_REM_3I:
5677
      s = "div";
5678
      s2 = "mfhi";
5679
      goto do_divi;
5680
    case M_REMU_3I:
5681
      s = "divu";
5682
      s2 = "mfhi";
5683
      goto do_divi;
5684
    case M_DDIV_3I:
5685
      dbl = 1;
5686
      s = "ddiv";
5687
      s2 = "mflo";
5688
      goto do_divi;
5689
    case M_DDIVU_3I:
5690
      dbl = 1;
5691
      s = "ddivu";
5692
      s2 = "mflo";
5693
      goto do_divi;
5694
    case M_DREM_3I:
5695
      dbl = 1;
5696
      s = "ddiv";
5697
      s2 = "mfhi";
5698
      goto do_divi;
5699
    case M_DREMU_3I:
5700
      dbl = 1;
5701
      s = "ddivu";
5702
      s2 = "mfhi";
5703
    do_divi:
5704
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5705
        {
5706
          as_warn (_("Divide by zero."));
5707
          if (mips_trap)
5708
            macro_build (NULL, "teq", "s,t,q", ZERO, ZERO, 7);
5709
          else
5710
            macro_build (NULL, "break", "c", 7);
5711
          break;
5712
        }
5713
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5714
        {
5715
          if (strcmp (s2, "mflo") == 0)
5716
            move_register (dreg, sreg);
5717
          else
5718
            move_register (dreg, ZERO);
5719
          break;
5720
        }
5721
      if (imm_expr.X_op == O_constant
5722
          && imm_expr.X_add_number == -1
5723
          && s[strlen (s) - 1] != 'u')
5724
        {
5725
          if (strcmp (s2, "mflo") == 0)
5726
            {
5727
              macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
5728
            }
5729
          else
5730
            move_register (dreg, ZERO);
5731
          break;
5732
        }
5733
 
5734
      used_at = 1;
5735
      load_register (AT, &imm_expr, dbl);
5736
      macro_build (NULL, s, "z,s,t", sreg, AT);
5737
      macro_build (NULL, s2, "d", dreg);
5738
      break;
5739
 
5740
    case M_DIVU_3:
5741
      s = "divu";
5742
      s2 = "mflo";
5743
      goto do_divu3;
5744
    case M_REMU_3:
5745
      s = "divu";
5746
      s2 = "mfhi";
5747
      goto do_divu3;
5748
    case M_DDIVU_3:
5749
      s = "ddivu";
5750
      s2 = "mflo";
5751
      goto do_divu3;
5752
    case M_DREMU_3:
5753
      s = "ddivu";
5754
      s2 = "mfhi";
5755
    do_divu3:
5756
      start_noreorder ();
5757
      if (mips_trap)
5758
        {
5759
          macro_build (NULL, "teq", "s,t,q", treg, ZERO, 7);
5760
          macro_build (NULL, s, "z,s,t", sreg, treg);
5761
          /* We want to close the noreorder block as soon as possible, so
5762
             that later insns are available for delay slot filling.  */
5763
          end_noreorder ();
5764
        }
5765
      else
5766
        {
5767
          expr1.X_add_number = 8;
5768
          macro_build (&expr1, "bne", "s,t,p", treg, ZERO);
5769
          macro_build (NULL, s, "z,s,t", sreg, treg);
5770
 
5771
          /* We want to close the noreorder block as soon as possible, so
5772
             that later insns are available for delay slot filling.  */
5773
          end_noreorder ();
5774
          macro_build (NULL, "break", "c", 7);
5775
        }
5776
      macro_build (NULL, s2, "d", dreg);
5777
      break;
5778
 
5779
    case M_DLCA_AB:
5780
      dbl = 1;
5781
    case M_LCA_AB:
5782
      call = 1;
5783
      goto do_la;
5784
    case M_DLA_AB:
5785
      dbl = 1;
5786
    case M_LA_AB:
5787
    do_la:
5788
      /* Load the address of a symbol into a register.  If breg is not
5789
         zero, we then add a base register to it.  */
5790
 
5791
      if (dbl && HAVE_32BIT_GPRS)
5792
        as_warn (_("dla used to load 32-bit register"));
5793
 
5794
      if (!dbl && HAVE_64BIT_OBJECTS)
5795
        as_warn (_("la used to load 64-bit address"));
5796
 
5797
      if (offset_expr.X_op == O_constant
5798
          && offset_expr.X_add_number >= -0x8000
5799
          && offset_expr.X_add_number < 0x8000)
5800
        {
5801
          macro_build (&offset_expr, ADDRESS_ADDI_INSN,
5802
                       "t,r,j", treg, sreg, BFD_RELOC_LO16);
5803
          break;
5804
        }
5805
 
5806
      if (mips_opts.at && (treg == breg))
5807
        {
5808
          tempreg = AT;
5809
          used_at = 1;
5810
        }
5811
      else
5812
        {
5813
          tempreg = treg;
5814
        }
5815
 
5816
      if (offset_expr.X_op != O_symbol
5817
          && offset_expr.X_op != O_constant)
5818
        {
5819
          as_bad (_("Expression too complex"));
5820
          offset_expr.X_op = O_constant;
5821
        }
5822
 
5823
      if (offset_expr.X_op == O_constant)
5824
        load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
5825
      else if (mips_pic == NO_PIC)
5826
        {
5827
          /* If this is a reference to a GP relative symbol, we want
5828
               addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
5829
             Otherwise we want
5830
               lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
5831
               addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5832
             If we have a constant, we need two instructions anyhow,
5833
             so we may as well always use the latter form.
5834
 
5835
             With 64bit address space and a usable $at we want
5836
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5837
               lui      $at,<sym>               (BFD_RELOC_HI16_S)
5838
               daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5839
               daddiu   $at,<sym>               (BFD_RELOC_LO16)
5840
               dsll32   $tempreg,0
5841
               daddu    $tempreg,$tempreg,$at
5842
 
5843
             If $at is already in use, we use a path which is suboptimal
5844
             on superscalar processors.
5845
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5846
               daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5847
               dsll     $tempreg,16
5848
               daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
5849
               dsll     $tempreg,16
5850
               daddiu   $tempreg,<sym>          (BFD_RELOC_LO16)
5851
 
5852
             For GP relative symbols in 64bit address space we can use
5853
             the same sequence as in 32bit address space.  */
5854
          if (HAVE_64BIT_SYMBOLS)
5855
            {
5856
              if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5857
                  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5858
                {
5859
                  relax_start (offset_expr.X_add_symbol);
5860
                  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5861
                               tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5862
                  relax_switch ();
5863
                }
5864
 
5865
              if (used_at == 0 && mips_opts.at)
5866
                {
5867
                  macro_build (&offset_expr, "lui", "t,u",
5868
                               tempreg, BFD_RELOC_MIPS_HIGHEST);
5869
                  macro_build (&offset_expr, "lui", "t,u",
5870
                               AT, BFD_RELOC_HI16_S);
5871
                  macro_build (&offset_expr, "daddiu", "t,r,j",
5872
                               tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5873
                  macro_build (&offset_expr, "daddiu", "t,r,j",
5874
                               AT, AT, BFD_RELOC_LO16);
5875
                  macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
5876
                  macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
5877
                  used_at = 1;
5878
                }
5879
              else
5880
                {
5881
                  macro_build (&offset_expr, "lui", "t,u",
5882
                               tempreg, BFD_RELOC_MIPS_HIGHEST);
5883
                  macro_build (&offset_expr, "daddiu", "t,r,j",
5884
                               tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5885
                  macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5886
                  macro_build (&offset_expr, "daddiu", "t,r,j",
5887
                               tempreg, tempreg, BFD_RELOC_HI16_S);
5888
                  macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5889
                  macro_build (&offset_expr, "daddiu", "t,r,j",
5890
                               tempreg, tempreg, BFD_RELOC_LO16);
5891
                }
5892
 
5893
              if (mips_relax.sequence)
5894
                relax_end ();
5895
            }
5896
          else
5897
            {
5898
              if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5899
                  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5900
                {
5901
                  relax_start (offset_expr.X_add_symbol);
5902
                  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5903
                               tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5904
                  relax_switch ();
5905
                }
5906
              if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
5907
                as_bad (_("Offset too large"));
5908
              macro_build_lui (&offset_expr, tempreg);
5909
              macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5910
                           tempreg, tempreg, BFD_RELOC_LO16);
5911
              if (mips_relax.sequence)
5912
                relax_end ();
5913
            }
5914
        }
5915
      else if (!mips_big_got && !HAVE_NEWABI)
5916
        {
5917
          int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5918
 
5919
          /* If this is a reference to an external symbol, and there
5920
             is no constant, we want
5921
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5922
             or for lca or if tempreg is PIC_CALL_REG
5923
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5924
             For a local symbol, we want
5925
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5926
               nop
5927
               addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5928
 
5929
             If we have a small constant, and this is a reference to
5930
             an external symbol, we want
5931
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5932
               nop
5933
               addiu    $tempreg,$tempreg,<constant>
5934
             For a local symbol, we want the same instruction
5935
             sequence, but we output a BFD_RELOC_LO16 reloc on the
5936
             addiu instruction.
5937
 
5938
             If we have a large constant, and this is a reference to
5939
             an external symbol, we want
5940
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5941
               lui      $at,<hiconstant>
5942
               addiu    $at,$at,<loconstant>
5943
               addu     $tempreg,$tempreg,$at
5944
             For a local symbol, we want the same instruction
5945
             sequence, but we output a BFD_RELOC_LO16 reloc on the
5946
             addiu instruction.
5947
           */
5948
 
5949
          if (offset_expr.X_add_number == 0)
5950
            {
5951
              if (mips_pic == SVR4_PIC
5952
                  && breg == 0
5953
                  && (call || tempreg == PIC_CALL_REG))
5954
                lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5955
 
5956
              relax_start (offset_expr.X_add_symbol);
5957
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5958
                           lw_reloc_type, mips_gp_register);
5959
              if (breg != 0)
5960
                {
5961
                  /* We're going to put in an addu instruction using
5962
                     tempreg, so we may as well insert the nop right
5963
                     now.  */
5964
                  load_delay_nop ();
5965
                }
5966
              relax_switch ();
5967
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5968
                           tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
5969
              load_delay_nop ();
5970
              macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5971
                           tempreg, tempreg, BFD_RELOC_LO16);
5972
              relax_end ();
5973
              /* FIXME: If breg == 0, and the next instruction uses
5974
                 $tempreg, then if this variant case is used an extra
5975
                 nop will be generated.  */
5976
            }
5977
          else if (offset_expr.X_add_number >= -0x8000
5978
                   && offset_expr.X_add_number < 0x8000)
5979
            {
5980
              load_got_offset (tempreg, &offset_expr);
5981
              load_delay_nop ();
5982
              add_got_offset (tempreg, &offset_expr);
5983
            }
5984
          else
5985
            {
5986
              expr1.X_add_number = offset_expr.X_add_number;
5987
              offset_expr.X_add_number =
5988
                ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
5989
              load_got_offset (tempreg, &offset_expr);
5990
              offset_expr.X_add_number = expr1.X_add_number;
5991
              /* If we are going to add in a base register, and the
5992
                 target register and the base register are the same,
5993
                 then we are using AT as a temporary register.  Since
5994
                 we want to load the constant into AT, we add our
5995
                 current AT (from the global offset table) and the
5996
                 register into the register now, and pretend we were
5997
                 not using a base register.  */
5998
              if (breg == treg)
5999
                {
6000
                  load_delay_nop ();
6001
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6002
                               treg, AT, breg);
6003
                  breg = 0;
6004
                  tempreg = treg;
6005
                }
6006
              add_got_offset_hilo (tempreg, &offset_expr, AT);
6007
              used_at = 1;
6008
            }
6009
        }
6010
      else if (!mips_big_got && HAVE_NEWABI)
6011
        {
6012
          int add_breg_early = 0;
6013
 
6014
          /* If this is a reference to an external, and there is no
6015
             constant, or local symbol (*), with or without a
6016
             constant, we want
6017
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
6018
             or for lca or if tempreg is PIC_CALL_REG
6019
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
6020
 
6021
             If we have a small constant, and this is a reference to
6022
             an external symbol, we want
6023
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
6024
               addiu    $tempreg,$tempreg,<constant>
6025
 
6026
             If we have a large constant, and this is a reference to
6027
             an external symbol, we want
6028
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
6029
               lui      $at,<hiconstant>
6030
               addiu    $at,$at,<loconstant>
6031
               addu     $tempreg,$tempreg,$at
6032
 
6033
             (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
6034
             local symbols, even though it introduces an additional
6035
             instruction.  */
6036
 
6037
          if (offset_expr.X_add_number)
6038
            {
6039
              expr1.X_add_number = offset_expr.X_add_number;
6040
              offset_expr.X_add_number = 0;
6041
 
6042
              relax_start (offset_expr.X_add_symbol);
6043
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6044
                           BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
6045
 
6046
              if (expr1.X_add_number >= -0x8000
6047
                  && expr1.X_add_number < 0x8000)
6048
                {
6049
                  macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
6050
                               tempreg, tempreg, BFD_RELOC_LO16);
6051
                }
6052
              else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
6053
                {
6054
                  /* If we are going to add in a base register, and the
6055
                     target register and the base register are the same,
6056
                     then we are using AT as a temporary register.  Since
6057
                     we want to load the constant into AT, we add our
6058
                     current AT (from the global offset table) and the
6059
                     register into the register now, and pretend we were
6060
                     not using a base register.  */
6061
                  if (breg != treg)
6062
                    dreg = tempreg;
6063
                  else
6064
                    {
6065
                      gas_assert (tempreg == AT);
6066
                      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6067
                                   treg, AT, breg);
6068
                      dreg = treg;
6069
                      add_breg_early = 1;
6070
                    }
6071
 
6072
                  load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
6073
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6074
                               dreg, dreg, AT);
6075
 
6076
                  used_at = 1;
6077
                }
6078
              else
6079
                as_bad (_("PIC code offset overflow (max 32 signed bits)"));
6080
 
6081
              relax_switch ();
6082
              offset_expr.X_add_number = expr1.X_add_number;
6083
 
6084
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6085
                           BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
6086
              if (add_breg_early)
6087
                {
6088
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6089
                               treg, tempreg, breg);
6090
                  breg = 0;
6091
                  tempreg = treg;
6092
                }
6093
              relax_end ();
6094
            }
6095
          else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
6096
            {
6097
              relax_start (offset_expr.X_add_symbol);
6098
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6099
                           BFD_RELOC_MIPS_CALL16, mips_gp_register);
6100
              relax_switch ();
6101
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6102
                           BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
6103
              relax_end ();
6104
            }
6105
          else
6106
            {
6107
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6108
                           BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
6109
            }
6110
        }
6111
      else if (mips_big_got && !HAVE_NEWABI)
6112
        {
6113
          int gpdelay;
6114
          int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
6115
          int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
6116
          int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6117
 
6118
          /* This is the large GOT case.  If this is a reference to an
6119
             external symbol, and there is no constant, we want
6120
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6121
               addu     $tempreg,$tempreg,$gp
6122
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6123
             or for lca or if tempreg is PIC_CALL_REG
6124
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
6125
               addu     $tempreg,$tempreg,$gp
6126
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
6127
             For a local symbol, we want
6128
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6129
               nop
6130
               addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6131
 
6132
             If we have a small constant, and this is a reference to
6133
             an external symbol, we want
6134
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6135
               addu     $tempreg,$tempreg,$gp
6136
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6137
               nop
6138
               addiu    $tempreg,$tempreg,<constant>
6139
             For a local symbol, we want
6140
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6141
               nop
6142
               addiu    $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
6143
 
6144
             If we have a large constant, and this is a reference to
6145
             an external symbol, we want
6146
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6147
               addu     $tempreg,$tempreg,$gp
6148
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6149
               lui      $at,<hiconstant>
6150
               addiu    $at,$at,<loconstant>
6151
               addu     $tempreg,$tempreg,$at
6152
             For a local symbol, we want
6153
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6154
               lui      $at,<hiconstant>
6155
               addiu    $at,$at,<loconstant>    (BFD_RELOC_LO16)
6156
               addu     $tempreg,$tempreg,$at
6157
          */
6158
 
6159
          expr1.X_add_number = offset_expr.X_add_number;
6160
          offset_expr.X_add_number = 0;
6161
          relax_start (offset_expr.X_add_symbol);
6162
          gpdelay = reg_needs_delay (mips_gp_register);
6163
          if (expr1.X_add_number == 0 && breg == 0
6164
              && (call || tempreg == PIC_CALL_REG))
6165
            {
6166
              lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
6167
              lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
6168
            }
6169
          macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
6170
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6171
                       tempreg, tempreg, mips_gp_register);
6172
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6173
                       tempreg, lw_reloc_type, tempreg);
6174
          if (expr1.X_add_number == 0)
6175
            {
6176
              if (breg != 0)
6177
                {
6178
                  /* We're going to put in an addu instruction using
6179
                     tempreg, so we may as well insert the nop right
6180
                     now.  */
6181
                  load_delay_nop ();
6182
                }
6183
            }
6184
          else if (expr1.X_add_number >= -0x8000
6185
                   && expr1.X_add_number < 0x8000)
6186
            {
6187
              load_delay_nop ();
6188
              macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
6189
                           tempreg, tempreg, BFD_RELOC_LO16);
6190
            }
6191
          else
6192
            {
6193
              /* If we are going to add in a base register, and the
6194
                 target register and the base register are the same,
6195
                 then we are using AT as a temporary register.  Since
6196
                 we want to load the constant into AT, we add our
6197
                 current AT (from the global offset table) and the
6198
                 register into the register now, and pretend we were
6199
                 not using a base register.  */
6200
              if (breg != treg)
6201
                dreg = tempreg;
6202
              else
6203
                {
6204
                  gas_assert (tempreg == AT);
6205
                  load_delay_nop ();
6206
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6207
                               treg, AT, breg);
6208
                  dreg = treg;
6209
                }
6210
 
6211
              load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
6212
              macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
6213
 
6214
              used_at = 1;
6215
            }
6216
          offset_expr.X_add_number =
6217
            ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
6218
          relax_switch ();
6219
 
6220
          if (gpdelay)
6221
            {
6222
              /* This is needed because this instruction uses $gp, but
6223
                 the first instruction on the main stream does not.  */
6224
              macro_build (NULL, "nop", "");
6225
            }
6226
 
6227
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6228
                       local_reloc_type, mips_gp_register);
6229
          if (expr1.X_add_number >= -0x8000
6230
              && expr1.X_add_number < 0x8000)
6231
            {
6232
              load_delay_nop ();
6233
              macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6234
                           tempreg, tempreg, BFD_RELOC_LO16);
6235
              /* FIXME: If add_number is 0, and there was no base
6236
                 register, the external symbol case ended with a load,
6237
                 so if the symbol turns out to not be external, and
6238
                 the next instruction uses tempreg, an unnecessary nop
6239
                 will be inserted.  */
6240
            }
6241
          else
6242
            {
6243
              if (breg == treg)
6244
                {
6245
                  /* We must add in the base register now, as in the
6246
                     external symbol case.  */
6247
                  gas_assert (tempreg == AT);
6248
                  load_delay_nop ();
6249
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6250
                               treg, AT, breg);
6251
                  tempreg = treg;
6252
                  /* We set breg to 0 because we have arranged to add
6253
                     it in in both cases.  */
6254
                  breg = 0;
6255
                }
6256
 
6257
              macro_build_lui (&expr1, AT);
6258
              macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6259
                           AT, AT, BFD_RELOC_LO16);
6260
              macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6261
                           tempreg, tempreg, AT);
6262
              used_at = 1;
6263
            }
6264
          relax_end ();
6265
        }
6266
      else if (mips_big_got && HAVE_NEWABI)
6267
        {
6268
          int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
6269
          int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
6270
          int add_breg_early = 0;
6271
 
6272
          /* This is the large GOT case.  If this is a reference to an
6273
             external symbol, and there is no constant, we want
6274
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6275
               add      $tempreg,$tempreg,$gp
6276
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6277
             or for lca or if tempreg is PIC_CALL_REG
6278
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
6279
               add      $tempreg,$tempreg,$gp
6280
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
6281
 
6282
             If we have a small constant, and this is a reference to
6283
             an external symbol, we want
6284
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6285
               add      $tempreg,$tempreg,$gp
6286
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6287
               addi     $tempreg,$tempreg,<constant>
6288
 
6289
             If we have a large constant, and this is a reference to
6290
             an external symbol, we want
6291
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6292
               addu     $tempreg,$tempreg,$gp
6293
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6294
               lui      $at,<hiconstant>
6295
               addi     $at,$at,<loconstant>
6296
               add      $tempreg,$tempreg,$at
6297
 
6298
             If we have NewABI, and we know it's a local symbol, we want
6299
               lw       $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
6300
               addiu    $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
6301
             otherwise we have to resort to GOT_HI16/GOT_LO16.  */
6302
 
6303
          relax_start (offset_expr.X_add_symbol);
6304
 
6305
          expr1.X_add_number = offset_expr.X_add_number;
6306
          offset_expr.X_add_number = 0;
6307
 
6308
          if (expr1.X_add_number == 0 && breg == 0
6309
              && (call || tempreg == PIC_CALL_REG))
6310
            {
6311
              lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
6312
              lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
6313
            }
6314
          macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
6315
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6316
                       tempreg, tempreg, mips_gp_register);
6317
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6318
                       tempreg, lw_reloc_type, tempreg);
6319
 
6320
          if (expr1.X_add_number == 0)
6321
            ;
6322
          else if (expr1.X_add_number >= -0x8000
6323
                   && expr1.X_add_number < 0x8000)
6324
            {
6325
              macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
6326
                           tempreg, tempreg, BFD_RELOC_LO16);
6327
            }
6328
          else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
6329
            {
6330
              /* If we are going to add in a base register, and the
6331
                 target register and the base register are the same,
6332
                 then we are using AT as a temporary register.  Since
6333
                 we want to load the constant into AT, we add our
6334
                 current AT (from the global offset table) and the
6335
                 register into the register now, and pretend we were
6336
                 not using a base register.  */
6337
              if (breg != treg)
6338
                dreg = tempreg;
6339
              else
6340
                {
6341
                  gas_assert (tempreg == AT);
6342
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6343
                               treg, AT, breg);
6344
                  dreg = treg;
6345
                  add_breg_early = 1;
6346
                }
6347
 
6348
              load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
6349
              macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
6350
 
6351
              used_at = 1;
6352
            }
6353
          else
6354
            as_bad (_("PIC code offset overflow (max 32 signed bits)"));
6355
 
6356
          relax_switch ();
6357
          offset_expr.X_add_number = expr1.X_add_number;
6358
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6359
                       BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6360
          macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6361
                       tempreg, BFD_RELOC_MIPS_GOT_OFST);
6362
          if (add_breg_early)
6363
            {
6364
              macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6365
                           treg, tempreg, breg);
6366
              breg = 0;
6367
              tempreg = treg;
6368
            }
6369
          relax_end ();
6370
        }
6371
      else
6372
        abort ();
6373
 
6374
      if (breg != 0)
6375
        macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
6376
      break;
6377
 
6378
    case M_MSGSND:
6379
      {
6380
        unsigned long temp = (treg << 16) | (0x01);
6381
        macro_build (NULL, "c2", "C", temp);
6382
      }
6383
      break;
6384
 
6385
    case M_MSGLD:
6386
      {
6387
        unsigned long temp = (0x02);
6388
        macro_build (NULL, "c2", "C", temp);
6389
      }
6390
      break;
6391
 
6392
    case M_MSGLD_T:
6393
      {
6394
        unsigned long temp = (treg << 16) | (0x02);
6395
        macro_build (NULL, "c2", "C", temp);
6396
      }
6397
      break;
6398
 
6399
    case M_MSGWAIT:
6400
      macro_build (NULL, "c2", "C", 3);
6401
      break;
6402
 
6403
    case M_MSGWAIT_T:
6404
      {
6405
        unsigned long temp = (treg << 16) | 0x03;
6406
        macro_build (NULL, "c2", "C", temp);
6407
      }
6408
      break;
6409
 
6410
    case M_J_A:
6411
      /* The j instruction may not be used in PIC code, since it
6412
         requires an absolute address.  We convert it to a b
6413
         instruction.  */
6414
      if (mips_pic == NO_PIC)
6415
        macro_build (&offset_expr, "j", "a");
6416
      else
6417
        macro_build (&offset_expr, "b", "p");
6418
      break;
6419
 
6420
      /* The jal instructions must be handled as macros because when
6421
         generating PIC code they expand to multi-instruction
6422
         sequences.  Normally they are simple instructions.  */
6423
    case M_JAL_1:
6424
      dreg = RA;
6425
      /* Fall through.  */
6426
    case M_JAL_2:
6427
      if (mips_pic == NO_PIC)
6428
        macro_build (NULL, "jalr", "d,s", dreg, sreg);
6429
      else
6430
        {
6431
          if (sreg != PIC_CALL_REG)
6432
            as_warn (_("MIPS PIC call to register other than $25"));
6433
 
6434
          macro_build (NULL, "jalr", "d,s", dreg, sreg);
6435
          if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
6436
            {
6437
              if (mips_cprestore_offset < 0)
6438
                as_warn (_("No .cprestore pseudo-op used in PIC code"));
6439
              else
6440
                {
6441
                  if (!mips_frame_reg_valid)
6442
                    {
6443
                      as_warn (_("No .frame pseudo-op used in PIC code"));
6444
                      /* Quiet this warning.  */
6445
                      mips_frame_reg_valid = 1;
6446
                    }
6447
                  if (!mips_cprestore_valid)
6448
                    {
6449
                      as_warn (_("No .cprestore pseudo-op used in PIC code"));
6450
                      /* Quiet this warning.  */
6451
                      mips_cprestore_valid = 1;
6452
                    }
6453
                  if (mips_opts.noreorder)
6454
                    macro_build (NULL, "nop", "");
6455
                  expr1.X_add_number = mips_cprestore_offset;
6456
                  macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6457
                                                mips_gp_register,
6458
                                                mips_frame_reg,
6459
                                                HAVE_64BIT_ADDRESSES);
6460
                }
6461
            }
6462
        }
6463
 
6464
      break;
6465
 
6466
    case M_JAL_A:
6467
      if (mips_pic == NO_PIC)
6468
        macro_build (&offset_expr, "jal", "a");
6469
      else if (mips_pic == SVR4_PIC)
6470
        {
6471
          /* If this is a reference to an external symbol, and we are
6472
             using a small GOT, we want
6473
               lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
6474
               nop
6475
               jalr     $ra,$25
6476
               nop
6477
               lw       $gp,cprestore($sp)
6478
             The cprestore value is set using the .cprestore
6479
             pseudo-op.  If we are using a big GOT, we want
6480
               lui      $25,<sym>               (BFD_RELOC_MIPS_CALL_HI16)
6481
               addu     $25,$25,$gp
6482
               lw       $25,<sym>($25)          (BFD_RELOC_MIPS_CALL_LO16)
6483
               nop
6484
               jalr     $ra,$25
6485
               nop
6486
               lw       $gp,cprestore($sp)
6487
             If the symbol is not external, we want
6488
               lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6489
               nop
6490
               addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
6491
               jalr     $ra,$25
6492
               nop
6493
               lw $gp,cprestore($sp)
6494
 
6495
             For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
6496
             sequences above, minus nops, unless the symbol is local,
6497
             which enables us to use GOT_PAGE/GOT_OFST (big got) or
6498
             GOT_DISP.  */
6499
          if (HAVE_NEWABI)
6500
            {
6501
              if (!mips_big_got)
6502
                {
6503
                  relax_start (offset_expr.X_add_symbol);
6504
                  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6505
                               PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6506
                               mips_gp_register);
6507
                  relax_switch ();
6508
                  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6509
                               PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
6510
                               mips_gp_register);
6511
                  relax_end ();
6512
                }
6513
              else
6514
                {
6515
                  relax_start (offset_expr.X_add_symbol);
6516
                  macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6517
                               BFD_RELOC_MIPS_CALL_HI16);
6518
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6519
                               PIC_CALL_REG, mips_gp_register);
6520
                  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6521
                               PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6522
                               PIC_CALL_REG);
6523
                  relax_switch ();
6524
                  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6525
                               PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
6526
                               mips_gp_register);
6527
                  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6528
                               PIC_CALL_REG, PIC_CALL_REG,
6529
                               BFD_RELOC_MIPS_GOT_OFST);
6530
                  relax_end ();
6531
                }
6532
 
6533
              macro_build_jalr (&offset_expr);
6534
            }
6535
          else
6536
            {
6537
              relax_start (offset_expr.X_add_symbol);
6538
              if (!mips_big_got)
6539
                {
6540
                  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6541
                               PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6542
                               mips_gp_register);
6543
                  load_delay_nop ();
6544
                  relax_switch ();
6545
                }
6546
              else
6547
                {
6548
                  int gpdelay;
6549
 
6550
                  gpdelay = reg_needs_delay (mips_gp_register);
6551
                  macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6552
                               BFD_RELOC_MIPS_CALL_HI16);
6553
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6554
                               PIC_CALL_REG, mips_gp_register);
6555
                  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6556
                               PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6557
                               PIC_CALL_REG);
6558
                  load_delay_nop ();
6559
                  relax_switch ();
6560
                  if (gpdelay)
6561
                    macro_build (NULL, "nop", "");
6562
                }
6563
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6564
                           PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
6565
                           mips_gp_register);
6566
              load_delay_nop ();
6567
              macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6568
                           PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
6569
              relax_end ();
6570
              macro_build_jalr (&offset_expr);
6571
 
6572
              if (mips_cprestore_offset < 0)
6573
                as_warn (_("No .cprestore pseudo-op used in PIC code"));
6574
              else
6575
                {
6576
                  if (!mips_frame_reg_valid)
6577
                    {
6578
                      as_warn (_("No .frame pseudo-op used in PIC code"));
6579
                      /* Quiet this warning.  */
6580
                      mips_frame_reg_valid = 1;
6581
                    }
6582
                  if (!mips_cprestore_valid)
6583
                    {
6584
                      as_warn (_("No .cprestore pseudo-op used in PIC code"));
6585
                      /* Quiet this warning.  */
6586
                      mips_cprestore_valid = 1;
6587
                    }
6588
                  if (mips_opts.noreorder)
6589
                    macro_build (NULL, "nop", "");
6590
                  expr1.X_add_number = mips_cprestore_offset;
6591
                  macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6592
                                                mips_gp_register,
6593
                                                mips_frame_reg,
6594
                                                HAVE_64BIT_ADDRESSES);
6595
                }
6596
            }
6597
        }
6598
      else if (mips_pic == VXWORKS_PIC)
6599
        as_bad (_("Non-PIC jump used in PIC library"));
6600
      else
6601
        abort ();
6602
 
6603
      break;
6604
 
6605
    case M_LB_AB:
6606
      s = "lb";
6607
      goto ld;
6608
    case M_LBU_AB:
6609
      s = "lbu";
6610
      goto ld;
6611
    case M_LH_AB:
6612
      s = "lh";
6613
      goto ld;
6614
    case M_LHU_AB:
6615
      s = "lhu";
6616
      goto ld;
6617
    case M_LW_AB:
6618
      s = "lw";
6619
      goto ld;
6620
    case M_LWC0_AB:
6621
      s = "lwc0";
6622
      /* Itbl support may require additional care here.  */
6623
      coproc = 1;
6624
      goto ld;
6625
    case M_LWC1_AB:
6626
      s = "lwc1";
6627
      /* Itbl support may require additional care here.  */
6628
      coproc = 1;
6629
      goto ld;
6630
    case M_LWC2_AB:
6631
      s = "lwc2";
6632
      /* Itbl support may require additional care here.  */
6633
      coproc = 1;
6634
      goto ld;
6635
    case M_LWC3_AB:
6636
      s = "lwc3";
6637
      /* Itbl support may require additional care here.  */
6638
      coproc = 1;
6639
      goto ld;
6640
    case M_LWL_AB:
6641
      s = "lwl";
6642
      lr = 1;
6643
      goto ld;
6644
    case M_LWR_AB:
6645
      s = "lwr";
6646
      lr = 1;
6647
      goto ld;
6648
    case M_LDC1_AB:
6649
      s = "ldc1";
6650
      /* Itbl support may require additional care here.  */
6651
      coproc = 1;
6652
      goto ld;
6653
    case M_LDC2_AB:
6654
      s = "ldc2";
6655
      /* Itbl support may require additional care here.  */
6656
      coproc = 1;
6657
      goto ld;
6658
    case M_LDC3_AB:
6659
      s = "ldc3";
6660
      /* Itbl support may require additional care here.  */
6661
      coproc = 1;
6662
      goto ld;
6663
    case M_LDL_AB:
6664
      s = "ldl";
6665
      lr = 1;
6666
      goto ld;
6667
    case M_LDR_AB:
6668
      s = "ldr";
6669
      lr = 1;
6670
      goto ld;
6671
    case M_LL_AB:
6672
      s = "ll";
6673
      goto ld;
6674
    case M_LLD_AB:
6675
      s = "lld";
6676
      goto ld;
6677
    case M_LWU_AB:
6678
      s = "lwu";
6679
    ld:
6680
      if (breg == treg || coproc || lr)
6681
        {
6682
          tempreg = AT;
6683
          used_at = 1;
6684
        }
6685
      else
6686
        {
6687
          tempreg = treg;
6688
        }
6689
      goto ld_st;
6690
    case M_SB_AB:
6691
      s = "sb";
6692
      goto st;
6693
    case M_SH_AB:
6694
      s = "sh";
6695
      goto st;
6696
    case M_SW_AB:
6697
      s = "sw";
6698
      goto st;
6699
    case M_SWC0_AB:
6700
      s = "swc0";
6701
      /* Itbl support may require additional care here.  */
6702
      coproc = 1;
6703
      goto st;
6704
    case M_SWC1_AB:
6705
      s = "swc1";
6706
      /* Itbl support may require additional care here.  */
6707
      coproc = 1;
6708
      goto st;
6709
    case M_SWC2_AB:
6710
      s = "swc2";
6711
      /* Itbl support may require additional care here.  */
6712
      coproc = 1;
6713
      goto st;
6714
    case M_SWC3_AB:
6715
      s = "swc3";
6716
      /* Itbl support may require additional care here.  */
6717
      coproc = 1;
6718
      goto st;
6719
    case M_SWL_AB:
6720
      s = "swl";
6721
      goto st;
6722
    case M_SWR_AB:
6723
      s = "swr";
6724
      goto st;
6725
    case M_SC_AB:
6726
      s = "sc";
6727
      goto st;
6728
    case M_SCD_AB:
6729
      s = "scd";
6730
      goto st;
6731
    case M_CACHE_AB:
6732
      s = "cache";
6733
      goto st;
6734
    case M_PREF_AB:
6735
      s = "pref";
6736
      goto st;
6737
    case M_SDC1_AB:
6738
      s = "sdc1";
6739
      coproc = 1;
6740
      /* Itbl support may require additional care here.  */
6741
      goto st;
6742
    case M_SDC2_AB:
6743
      s = "sdc2";
6744
      /* Itbl support may require additional care here.  */
6745
      coproc = 1;
6746
      goto st;
6747
    case M_SDC3_AB:
6748
      s = "sdc3";
6749
      /* Itbl support may require additional care here.  */
6750
      coproc = 1;
6751
      goto st;
6752
    case M_SDL_AB:
6753
      s = "sdl";
6754
      goto st;
6755
    case M_SDR_AB:
6756
      s = "sdr";
6757
    st:
6758
      tempreg = AT;
6759
      used_at = 1;
6760
    ld_st:
6761
      if (coproc
6762
          && NO_ISA_COP (mips_opts.arch)
6763
          && (ip->insn_mo->pinfo2 & (INSN2_M_FP_S | INSN2_M_FP_D)) == 0)
6764
        {
6765
          as_bad (_("Opcode not supported on this processor: %s"),
6766
                  mips_cpu_info_from_arch (mips_opts.arch)->name);
6767
          break;
6768
        }
6769
 
6770
      /* Itbl support may require additional care here.  */
6771
      if (mask == M_LWC1_AB
6772
          || mask == M_SWC1_AB
6773
          || mask == M_LDC1_AB
6774
          || mask == M_SDC1_AB
6775
          || mask == M_L_DAB
6776
          || mask == M_S_DAB)
6777
        fmt = "T,o(b)";
6778
      else if (mask == M_CACHE_AB || mask == M_PREF_AB)
6779
        fmt = "k,o(b)";
6780
      else if (coproc)
6781
        fmt = "E,o(b)";
6782
      else
6783
        fmt = "t,o(b)";
6784
 
6785
      if (offset_expr.X_op != O_constant
6786
          && offset_expr.X_op != O_symbol)
6787
        {
6788
          as_bad (_("Expression too complex"));
6789
          offset_expr.X_op = O_constant;
6790
        }
6791
 
6792
      if (HAVE_32BIT_ADDRESSES
6793
          && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6794
        {
6795
          char value [32];
6796
 
6797
          sprintf_vma (value, offset_expr.X_add_number);
6798
          as_bad (_("Number (0x%s) larger than 32 bits"), value);
6799
        }
6800
 
6801
      /* A constant expression in PIC code can be handled just as it
6802
         is in non PIC code.  */
6803
      if (offset_expr.X_op == O_constant)
6804
        {
6805
          expr1.X_add_number = offset_expr.X_add_number;
6806
          normalize_address_expr (&expr1);
6807
          if (!IS_SEXT_16BIT_NUM (expr1.X_add_number))
6808
            {
6809
              expr1.X_add_number = ((expr1.X_add_number + 0x8000)
6810
                                    & ~(bfd_vma) 0xffff);
6811
              load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
6812
              if (breg != 0)
6813
                macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6814
                             tempreg, tempreg, breg);
6815
              breg = tempreg;
6816
            }
6817
          macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, breg);
6818
        }
6819
      else if (mips_pic == NO_PIC)
6820
        {
6821
          /* If this is a reference to a GP relative symbol, and there
6822
             is no base register, we want
6823
               <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6824
             Otherwise, if there is no base register, we want
6825
               lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6826
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6827
             If we have a constant, we need two instructions anyhow,
6828
             so we always use the latter form.
6829
 
6830
             If we have a base register, and this is a reference to a
6831
             GP relative symbol, we want
6832
               addu     $tempreg,$breg,$gp
6833
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
6834
             Otherwise we want
6835
               lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6836
               addu     $tempreg,$tempreg,$breg
6837
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6838
             With a constant we always use the latter case.
6839
 
6840
             With 64bit address space and no base register and $at usable,
6841
             we want
6842
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6843
               lui      $at,<sym>               (BFD_RELOC_HI16_S)
6844
               daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6845
               dsll32   $tempreg,0
6846
               daddu    $tempreg,$at
6847
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6848
             If we have a base register, we want
6849
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6850
               lui      $at,<sym>               (BFD_RELOC_HI16_S)
6851
               daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6852
               daddu    $at,$breg
6853
               dsll32   $tempreg,0
6854
               daddu    $tempreg,$at
6855
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6856
 
6857
             Without $at we can't generate the optimal path for superscalar
6858
             processors here since this would require two temporary registers.
6859
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6860
               daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6861
               dsll     $tempreg,16
6862
               daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6863
               dsll     $tempreg,16
6864
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6865
             If we have a base register, we want
6866
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6867
               daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6868
               dsll     $tempreg,16
6869
               daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6870
               dsll     $tempreg,16
6871
               daddu    $tempreg,$tempreg,$breg
6872
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6873
 
6874
             For GP relative symbols in 64bit address space we can use
6875
             the same sequence as in 32bit address space.  */
6876
          if (HAVE_64BIT_SYMBOLS)
6877
            {
6878
              if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6879
                  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6880
                {
6881
                  relax_start (offset_expr.X_add_symbol);
6882
                  if (breg == 0)
6883
                    {
6884
                      macro_build (&offset_expr, s, fmt, treg,
6885
                                   BFD_RELOC_GPREL16, mips_gp_register);
6886
                    }
6887
                  else
6888
                    {
6889
                      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6890
                                   tempreg, breg, mips_gp_register);
6891
                      macro_build (&offset_expr, s, fmt, treg,
6892
                                   BFD_RELOC_GPREL16, tempreg);
6893
                    }
6894
                  relax_switch ();
6895
                }
6896
 
6897
              if (used_at == 0 && mips_opts.at)
6898
                {
6899
                  macro_build (&offset_expr, "lui", "t,u", tempreg,
6900
                               BFD_RELOC_MIPS_HIGHEST);
6901
                  macro_build (&offset_expr, "lui", "t,u", AT,
6902
                               BFD_RELOC_HI16_S);
6903
                  macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6904
                               tempreg, BFD_RELOC_MIPS_HIGHER);
6905
                  if (breg != 0)
6906
                    macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
6907
                  macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
6908
                  macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
6909
                  macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
6910
                               tempreg);
6911
                  used_at = 1;
6912
                }
6913
              else
6914
                {
6915
                  macro_build (&offset_expr, "lui", "t,u", tempreg,
6916
                               BFD_RELOC_MIPS_HIGHEST);
6917
                  macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6918
                               tempreg, BFD_RELOC_MIPS_HIGHER);
6919
                  macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6920
                  macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6921
                               tempreg, BFD_RELOC_HI16_S);
6922
                  macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6923
                  if (breg != 0)
6924
                    macro_build (NULL, "daddu", "d,v,t",
6925
                                 tempreg, tempreg, breg);
6926
                  macro_build (&offset_expr, s, fmt, treg,
6927
                               BFD_RELOC_LO16, tempreg);
6928
                }
6929
 
6930
              if (mips_relax.sequence)
6931
                relax_end ();
6932
              break;
6933
            }
6934
 
6935
          if (breg == 0)
6936
            {
6937
              if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6938
                  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6939
                {
6940
                  relax_start (offset_expr.X_add_symbol);
6941
                  macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6942
                               mips_gp_register);
6943
                  relax_switch ();
6944
                }
6945
              macro_build_lui (&offset_expr, tempreg);
6946
              macro_build (&offset_expr, s, fmt, treg,
6947
                           BFD_RELOC_LO16, tempreg);
6948
              if (mips_relax.sequence)
6949
                relax_end ();
6950
            }
6951
          else
6952
            {
6953
              if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6954
                  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6955
                {
6956
                  relax_start (offset_expr.X_add_symbol);
6957
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6958
                               tempreg, breg, mips_gp_register);
6959
                  macro_build (&offset_expr, s, fmt, treg,
6960
                               BFD_RELOC_GPREL16, tempreg);
6961
                  relax_switch ();
6962
                }
6963
              macro_build_lui (&offset_expr, tempreg);
6964
              macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6965
                           tempreg, tempreg, breg);
6966
              macro_build (&offset_expr, s, fmt, treg,
6967
                           BFD_RELOC_LO16, tempreg);
6968
              if (mips_relax.sequence)
6969
                relax_end ();
6970
            }
6971
        }
6972
      else if (!mips_big_got)
6973
        {
6974
          int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6975
 
6976
          /* If this is a reference to an external symbol, we want
6977
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6978
               nop
6979
               <op>     $treg,0($tempreg)
6980
             Otherwise we want
6981
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6982
               nop
6983
               addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6984
               <op>     $treg,0($tempreg)
6985
 
6986
             For NewABI, we want
6987
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6988
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
6989
 
6990
             If there is a base register, we add it to $tempreg before
6991
             the <op>.  If there is a constant, we stick it in the
6992
             <op> instruction.  We don't handle constants larger than
6993
             16 bits, because we have no way to load the upper 16 bits
6994
             (actually, we could handle them for the subset of cases
6995
             in which we are not using $at).  */
6996
          gas_assert (offset_expr.X_op == O_symbol);
6997
          if (HAVE_NEWABI)
6998
            {
6999
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7000
                           BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
7001
              if (breg != 0)
7002
                macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7003
                             tempreg, tempreg, breg);
7004
              macro_build (&offset_expr, s, fmt, treg,
7005
                           BFD_RELOC_MIPS_GOT_OFST, tempreg);
7006
              break;
7007
            }
7008
          expr1.X_add_number = offset_expr.X_add_number;
7009
          offset_expr.X_add_number = 0;
7010
          if (expr1.X_add_number < -0x8000
7011
              || expr1.X_add_number >= 0x8000)
7012
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7013
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7014
                       lw_reloc_type, mips_gp_register);
7015
          load_delay_nop ();
7016
          relax_start (offset_expr.X_add_symbol);
7017
          relax_switch ();
7018
          macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
7019
                       tempreg, BFD_RELOC_LO16);
7020
          relax_end ();
7021
          if (breg != 0)
7022
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7023
                         tempreg, tempreg, breg);
7024
          macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
7025
        }
7026
      else if (mips_big_got && !HAVE_NEWABI)
7027
        {
7028
          int gpdelay;
7029
 
7030
          /* If this is a reference to an external symbol, we want
7031
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7032
               addu     $tempreg,$tempreg,$gp
7033
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7034
               <op>     $treg,0($tempreg)
7035
             Otherwise we want
7036
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7037
               nop
7038
               addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7039
               <op>     $treg,0($tempreg)
7040
             If there is a base register, we add it to $tempreg before
7041
             the <op>.  If there is a constant, we stick it in the
7042
             <op> instruction.  We don't handle constants larger than
7043
             16 bits, because we have no way to load the upper 16 bits
7044
             (actually, we could handle them for the subset of cases
7045
             in which we are not using $at).  */
7046
          gas_assert (offset_expr.X_op == O_symbol);
7047
          expr1.X_add_number = offset_expr.X_add_number;
7048
          offset_expr.X_add_number = 0;
7049
          if (expr1.X_add_number < -0x8000
7050
              || expr1.X_add_number >= 0x8000)
7051
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7052
          gpdelay = reg_needs_delay (mips_gp_register);
7053
          relax_start (offset_expr.X_add_symbol);
7054
          macro_build (&offset_expr, "lui", "t,u", tempreg,
7055
                       BFD_RELOC_MIPS_GOT_HI16);
7056
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
7057
                       mips_gp_register);
7058
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7059
                       BFD_RELOC_MIPS_GOT_LO16, tempreg);
7060
          relax_switch ();
7061
          if (gpdelay)
7062
            macro_build (NULL, "nop", "");
7063
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7064
                       BFD_RELOC_MIPS_GOT16, mips_gp_register);
7065
          load_delay_nop ();
7066
          macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
7067
                       tempreg, BFD_RELOC_LO16);
7068
          relax_end ();
7069
 
7070
          if (breg != 0)
7071
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7072
                         tempreg, tempreg, breg);
7073
          macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
7074
        }
7075
      else if (mips_big_got && HAVE_NEWABI)
7076
        {
7077
          /* If this is a reference to an external symbol, we want
7078
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7079
               add      $tempreg,$tempreg,$gp
7080
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7081
               <op>     $treg,<ofst>($tempreg)
7082
             Otherwise, for local symbols, we want:
7083
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
7084
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
7085
          gas_assert (offset_expr.X_op == O_symbol);
7086
          expr1.X_add_number = offset_expr.X_add_number;
7087
          offset_expr.X_add_number = 0;
7088
          if (expr1.X_add_number < -0x8000
7089
              || expr1.X_add_number >= 0x8000)
7090
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7091
          relax_start (offset_expr.X_add_symbol);
7092
          macro_build (&offset_expr, "lui", "t,u", tempreg,
7093
                       BFD_RELOC_MIPS_GOT_HI16);
7094
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
7095
                       mips_gp_register);
7096
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7097
                       BFD_RELOC_MIPS_GOT_LO16, tempreg);
7098
          if (breg != 0)
7099
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7100
                         tempreg, tempreg, breg);
7101
          macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
7102
 
7103
          relax_switch ();
7104
          offset_expr.X_add_number = expr1.X_add_number;
7105
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7106
                       BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
7107
          if (breg != 0)
7108
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7109
                         tempreg, tempreg, breg);
7110
          macro_build (&offset_expr, s, fmt, treg,
7111
                       BFD_RELOC_MIPS_GOT_OFST, tempreg);
7112
          relax_end ();
7113
        }
7114
      else
7115
        abort ();
7116
 
7117
      break;
7118
 
7119
    case M_LI:
7120
    case M_LI_S:
7121
      load_register (treg, &imm_expr, 0);
7122
      break;
7123
 
7124
    case M_DLI:
7125
      load_register (treg, &imm_expr, 1);
7126
      break;
7127
 
7128
    case M_LI_SS:
7129
      if (imm_expr.X_op == O_constant)
7130
        {
7131
          used_at = 1;
7132
          load_register (AT, &imm_expr, 0);
7133
          macro_build (NULL, "mtc1", "t,G", AT, treg);
7134
          break;
7135
        }
7136
      else
7137
        {
7138
          gas_assert (offset_expr.X_op == O_symbol
7139
                      && strcmp (segment_name (S_GET_SEGMENT
7140
                                               (offset_expr.X_add_symbol)),
7141
                                 ".lit4") == 0
7142
                      && offset_expr.X_add_number == 0);
7143
          macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
7144
                       BFD_RELOC_MIPS_LITERAL, mips_gp_register);
7145
          break;
7146
        }
7147
 
7148
    case M_LI_D:
7149
      /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
7150
         wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
7151
         order 32 bits of the value and the low order 32 bits are either
7152
         zero or in OFFSET_EXPR.  */
7153
      if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
7154
        {
7155
          if (HAVE_64BIT_GPRS)
7156
            load_register (treg, &imm_expr, 1);
7157
          else
7158
            {
7159
              int hreg, lreg;
7160
 
7161
              if (target_big_endian)
7162
                {
7163
                  hreg = treg;
7164
                  lreg = treg + 1;
7165
                }
7166
              else
7167
                {
7168
                  hreg = treg + 1;
7169
                  lreg = treg;
7170
                }
7171
 
7172
              if (hreg <= 31)
7173
                load_register (hreg, &imm_expr, 0);
7174
              if (lreg <= 31)
7175
                {
7176
                  if (offset_expr.X_op == O_absent)
7177
                    move_register (lreg, 0);
7178
                  else
7179
                    {
7180
                      gas_assert (offset_expr.X_op == O_constant);
7181
                      load_register (lreg, &offset_expr, 0);
7182
                    }
7183
                }
7184
            }
7185
          break;
7186
        }
7187
 
7188
      /* We know that sym is in the .rdata section.  First we get the
7189
         upper 16 bits of the address.  */
7190
      if (mips_pic == NO_PIC)
7191
        {
7192
          macro_build_lui (&offset_expr, AT);
7193
          used_at = 1;
7194
        }
7195
      else
7196
        {
7197
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7198
                       BFD_RELOC_MIPS_GOT16, mips_gp_register);
7199
          used_at = 1;
7200
        }
7201
 
7202
      /* Now we load the register(s).  */
7203
      if (HAVE_64BIT_GPRS)
7204
        {
7205
          used_at = 1;
7206
          macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7207
        }
7208
      else
7209
        {
7210
          used_at = 1;
7211
          macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7212
          if (treg != RA)
7213
            {
7214
              /* FIXME: How in the world do we deal with the possible
7215
                 overflow here?  */
7216
              offset_expr.X_add_number += 4;
7217
              macro_build (&offset_expr, "lw", "t,o(b)",
7218
                           treg + 1, BFD_RELOC_LO16, AT);
7219
            }
7220
        }
7221
      break;
7222
 
7223
    case M_LI_DD:
7224
      /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
7225
         wide, IMM_EXPR is the entire value and the GPRs are known to be 64
7226
         bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
7227
         the value and the low order 32 bits are either zero or in
7228
         OFFSET_EXPR.  */
7229
      if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
7230
        {
7231
          used_at = 1;
7232
          load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
7233
          if (HAVE_64BIT_FPRS)
7234
            {
7235
              gas_assert (HAVE_64BIT_GPRS);
7236
              macro_build (NULL, "dmtc1", "t,S", AT, treg);
7237
            }
7238
          else
7239
            {
7240
              macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
7241
              if (offset_expr.X_op == O_absent)
7242
                macro_build (NULL, "mtc1", "t,G", 0, treg);
7243
              else
7244
                {
7245
                  gas_assert (offset_expr.X_op == O_constant);
7246
                  load_register (AT, &offset_expr, 0);
7247
                  macro_build (NULL, "mtc1", "t,G", AT, treg);
7248
                }
7249
            }
7250
          break;
7251
        }
7252
 
7253
      gas_assert (offset_expr.X_op == O_symbol
7254
                  && offset_expr.X_add_number == 0);
7255
      s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
7256
      if (strcmp (s, ".lit8") == 0)
7257
        {
7258
          if (mips_opts.isa != ISA_MIPS1)
7259
            {
7260
              macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
7261
                           BFD_RELOC_MIPS_LITERAL, mips_gp_register);
7262
              break;
7263
            }
7264
          breg = mips_gp_register;
7265
          r = BFD_RELOC_MIPS_LITERAL;
7266
          goto dob;
7267
        }
7268
      else
7269
        {
7270
          gas_assert (strcmp (s, RDATA_SECTION_NAME) == 0);
7271
          used_at = 1;
7272
          if (mips_pic != NO_PIC)
7273
            macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7274
                         BFD_RELOC_MIPS_GOT16, mips_gp_register);
7275
          else
7276
            {
7277
              /* FIXME: This won't work for a 64 bit address.  */
7278
              macro_build_lui (&offset_expr, AT);
7279
            }
7280
 
7281
          if (mips_opts.isa != ISA_MIPS1)
7282
            {
7283
              macro_build (&offset_expr, "ldc1", "T,o(b)",
7284
                           treg, BFD_RELOC_LO16, AT);
7285
              break;
7286
            }
7287
          breg = AT;
7288
          r = BFD_RELOC_LO16;
7289
          goto dob;
7290
        }
7291
 
7292
    case M_L_DOB:
7293
      /* Even on a big endian machine $fn comes before $fn+1.  We have
7294
         to adjust when loading from memory.  */
7295
      r = BFD_RELOC_LO16;
7296
    dob:
7297
      gas_assert (mips_opts.isa == ISA_MIPS1);
7298
      macro_build (&offset_expr, "lwc1", "T,o(b)",
7299
                   target_big_endian ? treg + 1 : treg, r, breg);
7300
      /* FIXME: A possible overflow which I don't know how to deal
7301
         with.  */
7302
      offset_expr.X_add_number += 4;
7303
      macro_build (&offset_expr, "lwc1", "T,o(b)",
7304
                   target_big_endian ? treg : treg + 1, r, breg);
7305
      break;
7306
 
7307
    case M_S_DOB:
7308
      gas_assert (mips_opts.isa == ISA_MIPS1);
7309
      /* Even on a big endian machine $fn comes before $fn+1.  We have
7310
         to adjust when storing to memory.  */
7311
      macro_build (&offset_expr, "swc1", "T,o(b)",
7312
                   target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7313
      offset_expr.X_add_number += 4;
7314
      macro_build (&offset_expr, "swc1", "T,o(b)",
7315
                   target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7316
      break;
7317
 
7318
    case M_L_DAB:
7319
      /*
7320
       * The MIPS assembler seems to check for X_add_number not
7321
       * being double aligned and generating:
7322
       *        lui     at,%hi(foo+1)
7323
       *        addu    at,at,v1
7324
       *        addiu   at,at,%lo(foo+1)
7325
       *        lwc1    f2,0(at)
7326
       *        lwc1    f3,4(at)
7327
       * But, the resulting address is the same after relocation so why
7328
       * generate the extra instruction?
7329
       */
7330
      /* Itbl support may require additional care here.  */
7331
      coproc = 1;
7332
      if (mips_opts.isa != ISA_MIPS1)
7333
        {
7334
          s = "ldc1";
7335
          goto ld;
7336
        }
7337
 
7338
      s = "lwc1";
7339
      fmt = "T,o(b)";
7340
      goto ldd_std;
7341
 
7342
    case M_S_DAB:
7343
      if (mips_opts.isa != ISA_MIPS1)
7344
        {
7345
          s = "sdc1";
7346
          goto st;
7347
        }
7348
 
7349
      s = "swc1";
7350
      fmt = "T,o(b)";
7351
      /* Itbl support may require additional care here.  */
7352
      coproc = 1;
7353
      goto ldd_std;
7354
 
7355
    case M_LD_AB:
7356
      if (HAVE_64BIT_GPRS)
7357
        {
7358
          s = "ld";
7359
          goto ld;
7360
        }
7361
 
7362
      s = "lw";
7363
      fmt = "t,o(b)";
7364
      goto ldd_std;
7365
 
7366
    case M_SD_AB:
7367
      if (HAVE_64BIT_GPRS)
7368
        {
7369
          s = "sd";
7370
          goto st;
7371
        }
7372
 
7373
      s = "sw";
7374
      fmt = "t,o(b)";
7375
 
7376
    ldd_std:
7377
      if (offset_expr.X_op != O_symbol
7378
          && offset_expr.X_op != O_constant)
7379
        {
7380
          as_bad (_("Expression too complex"));
7381
          offset_expr.X_op = O_constant;
7382
        }
7383
 
7384
      if (HAVE_32BIT_ADDRESSES
7385
          && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
7386
        {
7387
          char value [32];
7388
 
7389
          sprintf_vma (value, offset_expr.X_add_number);
7390
          as_bad (_("Number (0x%s) larger than 32 bits"), value);
7391
        }
7392
 
7393
      /* Even on a big endian machine $fn comes before $fn+1.  We have
7394
         to adjust when loading from memory.  We set coproc if we must
7395
         load $fn+1 first.  */
7396
      /* Itbl support may require additional care here.  */
7397
      if (!target_big_endian)
7398
        coproc = 0;
7399
 
7400
      if (mips_pic == NO_PIC || offset_expr.X_op == O_constant)
7401
        {
7402
          /* If this is a reference to a GP relative symbol, we want
7403
               <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
7404
               <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
7405
             If we have a base register, we use this
7406
               addu     $at,$breg,$gp
7407
               <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
7408
               <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
7409
             If this is not a GP relative symbol, we want
7410
               lui      $at,<sym>               (BFD_RELOC_HI16_S)
7411
               <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7412
               <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7413
             If there is a base register, we add it to $at after the
7414
             lui instruction.  If there is a constant, we always use
7415
             the last case.  */
7416
          if (offset_expr.X_op == O_symbol
7417
              && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7418
              && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7419
            {
7420
              relax_start (offset_expr.X_add_symbol);
7421
              if (breg == 0)
7422
                {
7423
                  tempreg = mips_gp_register;
7424
                }
7425
              else
7426
                {
7427
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7428
                               AT, breg, mips_gp_register);
7429
                  tempreg = AT;
7430
                  used_at = 1;
7431
                }
7432
 
7433
              /* Itbl support may require additional care here.  */
7434
              macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7435
                           BFD_RELOC_GPREL16, tempreg);
7436
              offset_expr.X_add_number += 4;
7437
 
7438
              /* Set mips_optimize to 2 to avoid inserting an
7439
                 undesired nop.  */
7440
              hold_mips_optimize = mips_optimize;
7441
              mips_optimize = 2;
7442
              /* Itbl support may require additional care here.  */
7443
              macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7444
                           BFD_RELOC_GPREL16, tempreg);
7445
              mips_optimize = hold_mips_optimize;
7446
 
7447
              relax_switch ();
7448
 
7449
              offset_expr.X_add_number -= 4;
7450
            }
7451
          used_at = 1;
7452
          macro_build_lui (&offset_expr, AT);
7453
          if (breg != 0)
7454
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7455
          /* Itbl support may require additional care here.  */
7456
          macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7457
                       BFD_RELOC_LO16, AT);
7458
          /* FIXME: How do we handle overflow here?  */
7459
          offset_expr.X_add_number += 4;
7460
          /* Itbl support may require additional care here.  */
7461
          macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7462
                       BFD_RELOC_LO16, AT);
7463
          if (mips_relax.sequence)
7464
            relax_end ();
7465
        }
7466
      else if (!mips_big_got)
7467
        {
7468
          /* If this is a reference to an external symbol, we want
7469
               lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7470
               nop
7471
               <op>     $treg,0($at)
7472
               <op>     $treg+1,4($at)
7473
             Otherwise we want
7474
               lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7475
               nop
7476
               <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7477
               <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7478
             If there is a base register we add it to $at before the
7479
             lwc1 instructions.  If there is a constant we include it
7480
             in the lwc1 instructions.  */
7481
          used_at = 1;
7482
          expr1.X_add_number = offset_expr.X_add_number;
7483
          if (expr1.X_add_number < -0x8000
7484
              || expr1.X_add_number >= 0x8000 - 4)
7485
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7486
          load_got_offset (AT, &offset_expr);
7487
          load_delay_nop ();
7488
          if (breg != 0)
7489
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7490
 
7491
          /* Set mips_optimize to 2 to avoid inserting an undesired
7492
             nop.  */
7493
          hold_mips_optimize = mips_optimize;
7494
          mips_optimize = 2;
7495
 
7496
          /* Itbl support may require additional care here.  */
7497
          relax_start (offset_expr.X_add_symbol);
7498
          macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7499
                       BFD_RELOC_LO16, AT);
7500
          expr1.X_add_number += 4;
7501
          macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7502
                       BFD_RELOC_LO16, AT);
7503
          relax_switch ();
7504
          macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7505
                       BFD_RELOC_LO16, AT);
7506
          offset_expr.X_add_number += 4;
7507
          macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7508
                       BFD_RELOC_LO16, AT);
7509
          relax_end ();
7510
 
7511
          mips_optimize = hold_mips_optimize;
7512
        }
7513
      else if (mips_big_got)
7514
        {
7515
          int gpdelay;
7516
 
7517
          /* If this is a reference to an external symbol, we want
7518
               lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
7519
               addu     $at,$at,$gp
7520
               lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
7521
               nop
7522
               <op>     $treg,0($at)
7523
               <op>     $treg+1,4($at)
7524
             Otherwise we want
7525
               lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7526
               nop
7527
               <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7528
               <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7529
             If there is a base register we add it to $at before the
7530
             lwc1 instructions.  If there is a constant we include it
7531
             in the lwc1 instructions.  */
7532
          used_at = 1;
7533
          expr1.X_add_number = offset_expr.X_add_number;
7534
          offset_expr.X_add_number = 0;
7535
          if (expr1.X_add_number < -0x8000
7536
              || expr1.X_add_number >= 0x8000 - 4)
7537
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7538
          gpdelay = reg_needs_delay (mips_gp_register);
7539
          relax_start (offset_expr.X_add_symbol);
7540
          macro_build (&offset_expr, "lui", "t,u",
7541
                       AT, BFD_RELOC_MIPS_GOT_HI16);
7542
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7543
                       AT, AT, mips_gp_register);
7544
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7545
                       AT, BFD_RELOC_MIPS_GOT_LO16, AT);
7546
          load_delay_nop ();
7547
          if (breg != 0)
7548
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7549
          /* Itbl support may require additional care here.  */
7550
          macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7551
                       BFD_RELOC_LO16, AT);
7552
          expr1.X_add_number += 4;
7553
 
7554
          /* Set mips_optimize to 2 to avoid inserting an undesired
7555
             nop.  */
7556
          hold_mips_optimize = mips_optimize;
7557
          mips_optimize = 2;
7558
          /* Itbl support may require additional care here.  */
7559
          macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7560
                       BFD_RELOC_LO16, AT);
7561
          mips_optimize = hold_mips_optimize;
7562
          expr1.X_add_number -= 4;
7563
 
7564
          relax_switch ();
7565
          offset_expr.X_add_number = expr1.X_add_number;
7566
          if (gpdelay)
7567
            macro_build (NULL, "nop", "");
7568
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7569
                       BFD_RELOC_MIPS_GOT16, mips_gp_register);
7570
          load_delay_nop ();
7571
          if (breg != 0)
7572
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7573
          /* Itbl support may require additional care here.  */
7574
          macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7575
                       BFD_RELOC_LO16, AT);
7576
          offset_expr.X_add_number += 4;
7577
 
7578
          /* Set mips_optimize to 2 to avoid inserting an undesired
7579
             nop.  */
7580
          hold_mips_optimize = mips_optimize;
7581
          mips_optimize = 2;
7582
          /* Itbl support may require additional care here.  */
7583
          macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7584
                       BFD_RELOC_LO16, AT);
7585
          mips_optimize = hold_mips_optimize;
7586
          relax_end ();
7587
        }
7588
      else
7589
        abort ();
7590
 
7591
      break;
7592
 
7593
    case M_LD_OB:
7594
      s = HAVE_64BIT_GPRS ? "ld" : "lw";
7595
      goto sd_ob;
7596
    case M_SD_OB:
7597
      s = HAVE_64BIT_GPRS ? "sd" : "sw";
7598
    sd_ob:
7599
      macro_build (&offset_expr, s, "t,o(b)", treg,
7600
                   -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
7601
                   breg);
7602
      if (!HAVE_64BIT_GPRS)
7603
        {
7604
          offset_expr.X_add_number += 4;
7605
          macro_build (&offset_expr, s, "t,o(b)", treg + 1,
7606
                       -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
7607
                       breg);
7608
        }
7609
      break;
7610
 
7611
   /* New code added to support COPZ instructions.
7612
      This code builds table entries out of the macros in mip_opcodes.
7613
      R4000 uses interlocks to handle coproc delays.
7614
      Other chips (like the R3000) require nops to be inserted for delays.
7615
 
7616
      FIXME: Currently, we require that the user handle delays.
7617
      In order to fill delay slots for non-interlocked chips,
7618
      we must have a way to specify delays based on the coprocessor.
7619
      Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
7620
      What are the side-effects of the cop instruction?
7621
      What cache support might we have and what are its effects?
7622
      Both coprocessor & memory require delays. how long???
7623
      What registers are read/set/modified?
7624
 
7625
      If an itbl is provided to interpret cop instructions,
7626
      this knowledge can be encoded in the itbl spec.  */
7627
 
7628
    case M_COP0:
7629
      s = "c0";
7630
      goto copz;
7631
    case M_COP1:
7632
      s = "c1";
7633
      goto copz;
7634
    case M_COP2:
7635
      s = "c2";
7636
      goto copz;
7637
    case M_COP3:
7638
      s = "c3";
7639
    copz:
7640
      if (NO_ISA_COP (mips_opts.arch)
7641
          && (ip->insn_mo->pinfo2 & INSN2_M_FP_S) == 0)
7642
        {
7643
          as_bad (_("opcode not supported on this processor: %s"),
7644
                  mips_cpu_info_from_arch (mips_opts.arch)->name);
7645
          break;
7646
        }
7647
 
7648
      /* For now we just do C (same as Cz).  The parameter will be
7649
         stored in insn_opcode by mips_ip.  */
7650
      macro_build (NULL, s, "C", ip->insn_opcode);
7651
      break;
7652
 
7653
    case M_MOVE:
7654
      move_register (dreg, sreg);
7655
      break;
7656
 
7657
    case M_DMUL:
7658
      dbl = 1;
7659
    case M_MUL:
7660
      macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7661
      macro_build (NULL, "mflo", "d", dreg);
7662
      break;
7663
 
7664
    case M_DMUL_I:
7665
      dbl = 1;
7666
    case M_MUL_I:
7667
      /* The MIPS assembler some times generates shifts and adds.  I'm
7668
         not trying to be that fancy. GCC should do this for us
7669
         anyway.  */
7670
      used_at = 1;
7671
      load_register (AT, &imm_expr, dbl);
7672
      macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
7673
      macro_build (NULL, "mflo", "d", dreg);
7674
      break;
7675
 
7676
    case M_DMULO_I:
7677
      dbl = 1;
7678
    case M_MULO_I:
7679
      imm = 1;
7680
      goto do_mulo;
7681
 
7682
    case M_DMULO:
7683
      dbl = 1;
7684
    case M_MULO:
7685
    do_mulo:
7686
      start_noreorder ();
7687
      used_at = 1;
7688
      if (imm)
7689
        load_register (AT, &imm_expr, dbl);
7690
      macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
7691
      macro_build (NULL, "mflo", "d", dreg);
7692
      macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
7693
      macro_build (NULL, "mfhi", "d", AT);
7694
      if (mips_trap)
7695
        macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
7696
      else
7697
        {
7698
          expr1.X_add_number = 8;
7699
          macro_build (&expr1, "beq", "s,t,p", dreg, AT);
7700
          macro_build (NULL, "nop", "");
7701
          macro_build (NULL, "break", "c", 6);
7702
        }
7703
      end_noreorder ();
7704
      macro_build (NULL, "mflo", "d", dreg);
7705
      break;
7706
 
7707
    case M_DMULOU_I:
7708
      dbl = 1;
7709
    case M_MULOU_I:
7710
      imm = 1;
7711
      goto do_mulou;
7712
 
7713
    case M_DMULOU:
7714
      dbl = 1;
7715
    case M_MULOU:
7716
    do_mulou:
7717
      start_noreorder ();
7718
      used_at = 1;
7719
      if (imm)
7720
        load_register (AT, &imm_expr, dbl);
7721
      macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
7722
                   sreg, imm ? AT : treg);
7723
      macro_build (NULL, "mfhi", "d", AT);
7724
      macro_build (NULL, "mflo", "d", dreg);
7725
      if (mips_trap)
7726
        macro_build (NULL, "tne", "s,t,q", AT, ZERO, 6);
7727
      else
7728
        {
7729
          expr1.X_add_number = 8;
7730
          macro_build (&expr1, "beq", "s,t,p", AT, ZERO);
7731
          macro_build (NULL, "nop", "");
7732
          macro_build (NULL, "break", "c", 6);
7733
        }
7734
      end_noreorder ();
7735
      break;
7736
 
7737
    case M_DROL:
7738
      if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7739
        {
7740
          if (dreg == sreg)
7741
            {
7742
              tempreg = AT;
7743
              used_at = 1;
7744
            }
7745
          else
7746
            {
7747
              tempreg = dreg;
7748
            }
7749
          macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7750
          macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
7751
          break;
7752
        }
7753
      used_at = 1;
7754
      macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
7755
      macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
7756
      macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
7757
      macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7758
      break;
7759
 
7760
    case M_ROL:
7761
      if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7762
        {
7763
          if (dreg == sreg)
7764
            {
7765
              tempreg = AT;
7766
              used_at = 1;
7767
            }
7768
          else
7769
            {
7770
              tempreg = dreg;
7771
            }
7772
          macro_build (NULL, "negu", "d,w", tempreg, treg);
7773
          macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
7774
          break;
7775
        }
7776
      used_at = 1;
7777
      macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
7778
      macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
7779
      macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
7780
      macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7781
      break;
7782
 
7783
    case M_DROL_I:
7784
      {
7785
        unsigned int rot;
7786
        char *l;
7787
        char *rr;
7788
 
7789
        if (imm_expr.X_op != O_constant)
7790
          as_bad (_("Improper rotate count"));
7791
        rot = imm_expr.X_add_number & 0x3f;
7792
        if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7793
          {
7794
            rot = (64 - rot) & 0x3f;
7795
            if (rot >= 32)
7796
              macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7797
            else
7798
              macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7799
            break;
7800
          }
7801
        if (rot == 0)
7802
          {
7803
            macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7804
            break;
7805
          }
7806
        l = (rot < 0x20) ? "dsll" : "dsll32";
7807
        rr = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7808
        rot &= 0x1f;
7809
        used_at = 1;
7810
        macro_build (NULL, l, "d,w,<", AT, sreg, rot);
7811
        macro_build (NULL, rr, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7812
        macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7813
      }
7814
      break;
7815
 
7816
    case M_ROL_I:
7817
      {
7818
        unsigned int rot;
7819
 
7820
        if (imm_expr.X_op != O_constant)
7821
          as_bad (_("Improper rotate count"));
7822
        rot = imm_expr.X_add_number & 0x1f;
7823
        if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7824
          {
7825
            macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
7826
            break;
7827
          }
7828
        if (rot == 0)
7829
          {
7830
            macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7831
            break;
7832
          }
7833
        used_at = 1;
7834
        macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
7835
        macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7836
        macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7837
      }
7838
      break;
7839
 
7840
    case M_DROR:
7841
      if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7842
        {
7843
          macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
7844
          break;
7845
        }
7846
      used_at = 1;
7847
      macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
7848
      macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
7849
      macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
7850
      macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7851
      break;
7852
 
7853
    case M_ROR:
7854
      if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7855
        {
7856
          macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
7857
          break;
7858
        }
7859
      used_at = 1;
7860
      macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
7861
      macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7862
      macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7863
      macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7864
      break;
7865
 
7866
    case M_DROR_I:
7867
      {
7868
        unsigned int rot;
7869
        char *l;
7870
        char *rr;
7871
 
7872
        if (imm_expr.X_op != O_constant)
7873
          as_bad (_("Improper rotate count"));
7874
        rot = imm_expr.X_add_number & 0x3f;
7875
        if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7876
          {
7877
            if (rot >= 32)
7878
              macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7879
            else
7880
              macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7881
            break;
7882
          }
7883
        if (rot == 0)
7884
          {
7885
            macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7886
            break;
7887
          }
7888
        rr = (rot < 0x20) ? "dsrl" : "dsrl32";
7889
        l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7890
        rot &= 0x1f;
7891
        used_at = 1;
7892
        macro_build (NULL, rr, "d,w,<", AT, sreg, rot);
7893
        macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7894
        macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7895
      }
7896
      break;
7897
 
7898
    case M_ROR_I:
7899
      {
7900
        unsigned int rot;
7901
 
7902
        if (imm_expr.X_op != O_constant)
7903
          as_bad (_("Improper rotate count"));
7904
        rot = imm_expr.X_add_number & 0x1f;
7905
        if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7906
          {
7907
            macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
7908
            break;
7909
          }
7910
        if (rot == 0)
7911
          {
7912
            macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7913
            break;
7914
          }
7915
        used_at = 1;
7916
        macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7917
        macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7918
        macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7919
      }
7920
      break;
7921
 
7922
    case M_SEQ:
7923
      if (sreg == 0)
7924
        macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
7925
      else if (treg == 0)
7926
        macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7927
      else
7928
        {
7929
          macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7930
          macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7931
        }
7932
      break;
7933
 
7934
    case M_SEQ_I:
7935
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7936
        {
7937
          macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7938
          break;
7939
        }
7940
      if (sreg == 0)
7941
        {
7942
          as_warn (_("Instruction %s: result is always false"),
7943
                   ip->insn_mo->name);
7944
          move_register (dreg, 0);
7945
          break;
7946
        }
7947
      if (CPU_HAS_SEQ (mips_opts.arch)
7948
          && -512 <= imm_expr.X_add_number
7949
          && imm_expr.X_add_number < 512)
7950
        {
7951
          macro_build (NULL, "seqi", "t,r,+Q", dreg, sreg,
7952
                       (int) imm_expr.X_add_number);
7953
          break;
7954
        }
7955
      if (imm_expr.X_op == O_constant
7956
          && imm_expr.X_add_number >= 0
7957
          && imm_expr.X_add_number < 0x10000)
7958
        {
7959
          macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7960
        }
7961
      else if (imm_expr.X_op == O_constant
7962
               && imm_expr.X_add_number > -0x8000
7963
               && imm_expr.X_add_number < 0)
7964
        {
7965
          imm_expr.X_add_number = -imm_expr.X_add_number;
7966
          macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7967
                       "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7968
        }
7969
      else if (CPU_HAS_SEQ (mips_opts.arch))
7970
        {
7971
          used_at = 1;
7972
          load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7973
          macro_build (NULL, "seq", "d,v,t", dreg, sreg, AT);
7974
          break;
7975
        }
7976
      else
7977
        {
7978
          load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7979
          macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7980
          used_at = 1;
7981
        }
7982
      macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7983
      break;
7984
 
7985
    case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
7986
      s = "slt";
7987
      goto sge;
7988
    case M_SGEU:
7989
      s = "sltu";
7990
    sge:
7991
      macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
7992
      macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7993
      break;
7994
 
7995
    case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
7996
    case M_SGEU_I:
7997
      if (imm_expr.X_op == O_constant
7998
          && imm_expr.X_add_number >= -0x8000
7999
          && imm_expr.X_add_number < 0x8000)
8000
        {
8001
          macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
8002
                       dreg, sreg, BFD_RELOC_LO16);
8003
        }
8004
      else
8005
        {
8006
          load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8007
          macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
8008
                       dreg, sreg, AT);
8009
          used_at = 1;
8010
        }
8011
      macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
8012
      break;
8013
 
8014
    case M_SGT:         /* sreg > treg  <==>  treg < sreg */
8015
      s = "slt";
8016
      goto sgt;
8017
    case M_SGTU:
8018
      s = "sltu";
8019
    sgt:
8020
      macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
8021
      break;
8022
 
8023
    case M_SGT_I:               /* sreg > I  <==>  I < sreg */
8024
      s = "slt";
8025
      goto sgti;
8026
    case M_SGTU_I:
8027
      s = "sltu";
8028
    sgti:
8029
      used_at = 1;
8030
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8031
      macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
8032
      break;
8033
 
8034
    case M_SLE: /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
8035
      s = "slt";
8036
      goto sle;
8037
    case M_SLEU:
8038
      s = "sltu";
8039
    sle:
8040
      macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
8041
      macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
8042
      break;
8043
 
8044
    case M_SLE_I:       /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
8045
      s = "slt";
8046
      goto slei;
8047
    case M_SLEU_I:
8048
      s = "sltu";
8049
    slei:
8050
      used_at = 1;
8051
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8052
      macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
8053
      macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
8054
      break;
8055
 
8056
    case M_SLT_I:
8057
      if (imm_expr.X_op == O_constant
8058
          && imm_expr.X_add_number >= -0x8000
8059
          && imm_expr.X_add_number < 0x8000)
8060
        {
8061
          macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
8062
          break;
8063
        }
8064
      used_at = 1;
8065
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8066
      macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
8067
      break;
8068
 
8069
    case M_SLTU_I:
8070
      if (imm_expr.X_op == O_constant
8071
          && imm_expr.X_add_number >= -0x8000
8072
          && imm_expr.X_add_number < 0x8000)
8073
        {
8074
          macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
8075
                       BFD_RELOC_LO16);
8076
          break;
8077
        }
8078
      used_at = 1;
8079
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8080
      macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
8081
      break;
8082
 
8083
    case M_SNE:
8084
      if (sreg == 0)
8085
        macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
8086
      else if (treg == 0)
8087
        macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
8088
      else
8089
        {
8090
          macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
8091
          macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
8092
        }
8093
      break;
8094
 
8095
    case M_SNE_I:
8096
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
8097
        {
8098
          macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
8099
          break;
8100
        }
8101
      if (sreg == 0)
8102
        {
8103
          as_warn (_("Instruction %s: result is always true"),
8104
                   ip->insn_mo->name);
8105
          macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
8106
                       dreg, 0, BFD_RELOC_LO16);
8107
          break;
8108
        }
8109
      if (CPU_HAS_SEQ (mips_opts.arch)
8110
          && -512 <= imm_expr.X_add_number
8111
          && imm_expr.X_add_number < 512)
8112
        {
8113
          macro_build (NULL, "snei", "t,r,+Q", dreg, sreg,
8114
                       (int) imm_expr.X_add_number);
8115
          break;
8116
        }
8117
      if (imm_expr.X_op == O_constant
8118
          && imm_expr.X_add_number >= 0
8119
          && imm_expr.X_add_number < 0x10000)
8120
        {
8121
          macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
8122
        }
8123
      else if (imm_expr.X_op == O_constant
8124
               && imm_expr.X_add_number > -0x8000
8125
               && imm_expr.X_add_number < 0)
8126
        {
8127
          imm_expr.X_add_number = -imm_expr.X_add_number;
8128
          macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
8129
                       "t,r,j", dreg, sreg, BFD_RELOC_LO16);
8130
        }
8131
      else if (CPU_HAS_SEQ (mips_opts.arch))
8132
        {
8133
          used_at = 1;
8134
          load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8135
          macro_build (NULL, "sne", "d,v,t", dreg, sreg, AT);
8136
          break;
8137
        }
8138
      else
8139
        {
8140
          load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8141
          macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
8142
          used_at = 1;
8143
        }
8144
      macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
8145
      break;
8146
 
8147
    case M_DSUB_I:
8148
      dbl = 1;
8149
    case M_SUB_I:
8150
      if (imm_expr.X_op == O_constant
8151
          && imm_expr.X_add_number > -0x8000
8152
          && imm_expr.X_add_number <= 0x8000)
8153
        {
8154
          imm_expr.X_add_number = -imm_expr.X_add_number;
8155
          macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
8156
                       dreg, sreg, BFD_RELOC_LO16);
8157
          break;
8158
        }
8159
      used_at = 1;
8160
      load_register (AT, &imm_expr, dbl);
8161
      macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
8162
      break;
8163
 
8164
    case M_DSUBU_I:
8165
      dbl = 1;
8166
    case M_SUBU_I:
8167
      if (imm_expr.X_op == O_constant
8168
          && imm_expr.X_add_number > -0x8000
8169
          && imm_expr.X_add_number <= 0x8000)
8170
        {
8171
          imm_expr.X_add_number = -imm_expr.X_add_number;
8172
          macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
8173
                       dreg, sreg, BFD_RELOC_LO16);
8174
          break;
8175
        }
8176
      used_at = 1;
8177
      load_register (AT, &imm_expr, dbl);
8178
      macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
8179
      break;
8180
 
8181
    case M_TEQ_I:
8182
      s = "teq";
8183
      goto trap;
8184
    case M_TGE_I:
8185
      s = "tge";
8186
      goto trap;
8187
    case M_TGEU_I:
8188
      s = "tgeu";
8189
      goto trap;
8190
    case M_TLT_I:
8191
      s = "tlt";
8192
      goto trap;
8193
    case M_TLTU_I:
8194
      s = "tltu";
8195
      goto trap;
8196
    case M_TNE_I:
8197
      s = "tne";
8198
    trap:
8199
      used_at = 1;
8200
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8201
      macro_build (NULL, s, "s,t", sreg, AT);
8202
      break;
8203
 
8204
    case M_TRUNCWS:
8205
    case M_TRUNCWD:
8206
      gas_assert (mips_opts.isa == ISA_MIPS1);
8207
      used_at = 1;
8208
      sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
8209
      dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
8210
 
8211
      /*
8212
       * Is the double cfc1 instruction a bug in the mips assembler;
8213
       * or is there a reason for it?
8214
       */
8215
      start_noreorder ();
8216
      macro_build (NULL, "cfc1", "t,G", treg, RA);
8217
      macro_build (NULL, "cfc1", "t,G", treg, RA);
8218
      macro_build (NULL, "nop", "");
8219
      expr1.X_add_number = 3;
8220
      macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
8221
      expr1.X_add_number = 2;
8222
      macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
8223
      macro_build (NULL, "ctc1", "t,G", AT, RA);
8224
      macro_build (NULL, "nop", "");
8225
      macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
8226
                   dreg, sreg);
8227
      macro_build (NULL, "ctc1", "t,G", treg, RA);
8228
      macro_build (NULL, "nop", "");
8229
      end_noreorder ();
8230
      break;
8231
 
8232
    case M_ULH:
8233
      s = "lb";
8234
      goto ulh;
8235
    case M_ULHU:
8236
      s = "lbu";
8237
    ulh:
8238
      used_at = 1;
8239
      if (offset_expr.X_add_number >= 0x7fff)
8240
        as_bad (_("Operand overflow"));
8241
      if (!target_big_endian)
8242
        ++offset_expr.X_add_number;
8243
      macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
8244
      if (!target_big_endian)
8245
        --offset_expr.X_add_number;
8246
      else
8247
        ++offset_expr.X_add_number;
8248
      macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8249
      macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
8250
      macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8251
      break;
8252
 
8253
    case M_ULD:
8254
      s = "ldl";
8255
      s2 = "ldr";
8256
      off = 7;
8257
      goto ulw;
8258
    case M_ULW:
8259
      s = "lwl";
8260
      s2 = "lwr";
8261
      off = 3;
8262
    ulw:
8263
      if (offset_expr.X_add_number >= 0x8000 - off)
8264
        as_bad (_("Operand overflow"));
8265
      if (treg != breg)
8266
        tempreg = treg;
8267
      else
8268
        {
8269
          used_at = 1;
8270
          tempreg = AT;
8271
        }
8272
      if (!target_big_endian)
8273
        offset_expr.X_add_number += off;
8274
      macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
8275
      if (!target_big_endian)
8276
        offset_expr.X_add_number -= off;
8277
      else
8278
        offset_expr.X_add_number += off;
8279
      macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
8280
 
8281
      /* If necessary, move the result in tempreg to the final destination.  */
8282
      if (treg == tempreg)
8283
        break;
8284
      /* Protect second load's delay slot.  */
8285
      load_delay_nop ();
8286
      move_register (treg, tempreg);
8287
      break;
8288
 
8289
    case M_ULD_A:
8290
      s = "ldl";
8291
      s2 = "ldr";
8292
      off = 7;
8293
      goto ulwa;
8294
    case M_ULW_A:
8295
      s = "lwl";
8296
      s2 = "lwr";
8297
      off = 3;
8298
    ulwa:
8299
      used_at = 1;
8300
      load_address (AT, &offset_expr, &used_at);
8301
      if (breg != 0)
8302
        macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8303
      if (!target_big_endian)
8304
        expr1.X_add_number = off;
8305
      else
8306
        expr1.X_add_number = 0;
8307
      macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8308
      if (!target_big_endian)
8309
        expr1.X_add_number = 0;
8310
      else
8311
        expr1.X_add_number = off;
8312
      macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8313
      break;
8314
 
8315
    case M_ULH_A:
8316
    case M_ULHU_A:
8317
      used_at = 1;
8318
      load_address (AT, &offset_expr, &used_at);
8319
      if (breg != 0)
8320
        macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8321
      if (target_big_endian)
8322
        expr1.X_add_number = 0;
8323
      macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
8324
                   treg, BFD_RELOC_LO16, AT);
8325
      if (target_big_endian)
8326
        expr1.X_add_number = 1;
8327
      else
8328
        expr1.X_add_number = 0;
8329
      macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8330
      macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8331
      macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8332
      break;
8333
 
8334
    case M_USH:
8335
      used_at = 1;
8336
      if (offset_expr.X_add_number >= 0x7fff)
8337
        as_bad (_("Operand overflow"));
8338
      if (target_big_endian)
8339
        ++offset_expr.X_add_number;
8340
      macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8341
      macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
8342
      if (target_big_endian)
8343
        --offset_expr.X_add_number;
8344
      else
8345
        ++offset_expr.X_add_number;
8346
      macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
8347
      break;
8348
 
8349
    case M_USD:
8350
      s = "sdl";
8351
      s2 = "sdr";
8352
      off = 7;
8353
      goto usw;
8354
    case M_USW:
8355
      s = "swl";
8356
      s2 = "swr";
8357
      off = 3;
8358
    usw:
8359
      if (offset_expr.X_add_number >= 0x8000 - off)
8360
        as_bad (_("Operand overflow"));
8361
      if (!target_big_endian)
8362
        offset_expr.X_add_number += off;
8363
      macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8364
      if (!target_big_endian)
8365
        offset_expr.X_add_number -= off;
8366
      else
8367
        offset_expr.X_add_number += off;
8368
      macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8369
      break;
8370
 
8371
    case M_USD_A:
8372
      s = "sdl";
8373
      s2 = "sdr";
8374
      off = 7;
8375
      goto uswa;
8376
    case M_USW_A:
8377
      s = "swl";
8378
      s2 = "swr";
8379
      off = 3;
8380
    uswa:
8381
      used_at = 1;
8382
      load_address (AT, &offset_expr, &used_at);
8383
      if (breg != 0)
8384
        macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8385
      if (!target_big_endian)
8386
        expr1.X_add_number = off;
8387
      else
8388
        expr1.X_add_number = 0;
8389
      macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8390
      if (!target_big_endian)
8391
        expr1.X_add_number = 0;
8392
      else
8393
        expr1.X_add_number = off;
8394
      macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8395
      break;
8396
 
8397
    case M_USH_A:
8398
      used_at = 1;
8399
      load_address (AT, &offset_expr, &used_at);
8400
      if (breg != 0)
8401
        macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8402
      if (!target_big_endian)
8403
        expr1.X_add_number = 0;
8404
      macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8405
      macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
8406
      if (!target_big_endian)
8407
        expr1.X_add_number = 1;
8408
      else
8409
        expr1.X_add_number = 0;
8410
      macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8411
      if (!target_big_endian)
8412
        expr1.X_add_number = 0;
8413
      else
8414
        expr1.X_add_number = 1;
8415
      macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8416
      macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8417
      macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8418
      break;
8419
 
8420
    default:
8421
      /* FIXME: Check if this is one of the itbl macros, since they
8422
         are added dynamically.  */
8423
      as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
8424
      break;
8425
    }
8426
  if (!mips_opts.at && used_at)
8427
    as_bad (_("Macro used $at after \".set noat\""));
8428
}
8429
 
8430
/* Implement macros in mips16 mode.  */
8431
 
8432
static void
8433
mips16_macro (struct mips_cl_insn *ip)
8434
{
8435
  int mask;
8436
  int xreg, yreg, zreg, tmp;
8437
  expressionS expr1;
8438
  int dbl;
8439
  const char *s, *s2, *s3;
8440
 
8441
  mask = ip->insn_mo->mask;
8442
 
8443
  xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
8444
  yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
8445
  zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
8446
 
8447
  expr1.X_op = O_constant;
8448
  expr1.X_op_symbol = NULL;
8449
  expr1.X_add_symbol = NULL;
8450
  expr1.X_add_number = 1;
8451
 
8452
  dbl = 0;
8453
 
8454
  switch (mask)
8455
    {
8456
    default:
8457
      internalError ();
8458
 
8459
    case M_DDIV_3:
8460
      dbl = 1;
8461
    case M_DIV_3:
8462
      s = "mflo";
8463
      goto do_div3;
8464
    case M_DREM_3:
8465
      dbl = 1;
8466
    case M_REM_3:
8467
      s = "mfhi";
8468
    do_div3:
8469
      start_noreorder ();
8470
      macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
8471
      expr1.X_add_number = 2;
8472
      macro_build (&expr1, "bnez", "x,p", yreg);
8473
      macro_build (NULL, "break", "6", 7);
8474
 
8475
      /* FIXME: The normal code checks for of -1 / -0x80000000 here,
8476
         since that causes an overflow.  We should do that as well,
8477
         but I don't see how to do the comparisons without a temporary
8478
         register.  */
8479
      end_noreorder ();
8480
      macro_build (NULL, s, "x", zreg);
8481
      break;
8482
 
8483
    case M_DIVU_3:
8484
      s = "divu";
8485
      s2 = "mflo";
8486
      goto do_divu3;
8487
    case M_REMU_3:
8488
      s = "divu";
8489
      s2 = "mfhi";
8490
      goto do_divu3;
8491
    case M_DDIVU_3:
8492
      s = "ddivu";
8493
      s2 = "mflo";
8494
      goto do_divu3;
8495
    case M_DREMU_3:
8496
      s = "ddivu";
8497
      s2 = "mfhi";
8498
    do_divu3:
8499
      start_noreorder ();
8500
      macro_build (NULL, s, "0,x,y", xreg, yreg);
8501
      expr1.X_add_number = 2;
8502
      macro_build (&expr1, "bnez", "x,p", yreg);
8503
      macro_build (NULL, "break", "6", 7);
8504
      end_noreorder ();
8505
      macro_build (NULL, s2, "x", zreg);
8506
      break;
8507
 
8508
    case M_DMUL:
8509
      dbl = 1;
8510
    case M_MUL:
8511
      macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
8512
      macro_build (NULL, "mflo", "x", zreg);
8513
      break;
8514
 
8515
    case M_DSUBU_I:
8516
      dbl = 1;
8517
      goto do_subu;
8518
    case M_SUBU_I:
8519
    do_subu:
8520
      if (imm_expr.X_op != O_constant)
8521
        as_bad (_("Unsupported large constant"));
8522
      imm_expr.X_add_number = -imm_expr.X_add_number;
8523
      macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
8524
      break;
8525
 
8526
    case M_SUBU_I_2:
8527
      if (imm_expr.X_op != O_constant)
8528
        as_bad (_("Unsupported large constant"));
8529
      imm_expr.X_add_number = -imm_expr.X_add_number;
8530
      macro_build (&imm_expr, "addiu", "x,k", xreg);
8531
      break;
8532
 
8533
    case M_DSUBU_I_2:
8534
      if (imm_expr.X_op != O_constant)
8535
        as_bad (_("Unsupported large constant"));
8536
      imm_expr.X_add_number = -imm_expr.X_add_number;
8537
      macro_build (&imm_expr, "daddiu", "y,j", yreg);
8538
      break;
8539
 
8540
    case M_BEQ:
8541
      s = "cmp";
8542
      s2 = "bteqz";
8543
      goto do_branch;
8544
    case M_BNE:
8545
      s = "cmp";
8546
      s2 = "btnez";
8547
      goto do_branch;
8548
    case M_BLT:
8549
      s = "slt";
8550
      s2 = "btnez";
8551
      goto do_branch;
8552
    case M_BLTU:
8553
      s = "sltu";
8554
      s2 = "btnez";
8555
      goto do_branch;
8556
    case M_BLE:
8557
      s = "slt";
8558
      s2 = "bteqz";
8559
      goto do_reverse_branch;
8560
    case M_BLEU:
8561
      s = "sltu";
8562
      s2 = "bteqz";
8563
      goto do_reverse_branch;
8564
    case M_BGE:
8565
      s = "slt";
8566
      s2 = "bteqz";
8567
      goto do_branch;
8568
    case M_BGEU:
8569
      s = "sltu";
8570
      s2 = "bteqz";
8571
      goto do_branch;
8572
    case M_BGT:
8573
      s = "slt";
8574
      s2 = "btnez";
8575
      goto do_reverse_branch;
8576
    case M_BGTU:
8577
      s = "sltu";
8578
      s2 = "btnez";
8579
 
8580
    do_reverse_branch:
8581
      tmp = xreg;
8582
      xreg = yreg;
8583
      yreg = tmp;
8584
 
8585
    do_branch:
8586
      macro_build (NULL, s, "x,y", xreg, yreg);
8587
      macro_build (&offset_expr, s2, "p");
8588
      break;
8589
 
8590
    case M_BEQ_I:
8591
      s = "cmpi";
8592
      s2 = "bteqz";
8593
      s3 = "x,U";
8594
      goto do_branch_i;
8595
    case M_BNE_I:
8596
      s = "cmpi";
8597
      s2 = "btnez";
8598
      s3 = "x,U";
8599
      goto do_branch_i;
8600
    case M_BLT_I:
8601
      s = "slti";
8602
      s2 = "btnez";
8603
      s3 = "x,8";
8604
      goto do_branch_i;
8605
    case M_BLTU_I:
8606
      s = "sltiu";
8607
      s2 = "btnez";
8608
      s3 = "x,8";
8609
      goto do_branch_i;
8610
    case M_BLE_I:
8611
      s = "slti";
8612
      s2 = "btnez";
8613
      s3 = "x,8";
8614
      goto do_addone_branch_i;
8615
    case M_BLEU_I:
8616
      s = "sltiu";
8617
      s2 = "btnez";
8618
      s3 = "x,8";
8619
      goto do_addone_branch_i;
8620
    case M_BGE_I:
8621
      s = "slti";
8622
      s2 = "bteqz";
8623
      s3 = "x,8";
8624
      goto do_branch_i;
8625
    case M_BGEU_I:
8626
      s = "sltiu";
8627
      s2 = "bteqz";
8628
      s3 = "x,8";
8629
      goto do_branch_i;
8630
    case M_BGT_I:
8631
      s = "slti";
8632
      s2 = "bteqz";
8633
      s3 = "x,8";
8634
      goto do_addone_branch_i;
8635
    case M_BGTU_I:
8636
      s = "sltiu";
8637
      s2 = "bteqz";
8638
      s3 = "x,8";
8639
 
8640
    do_addone_branch_i:
8641
      if (imm_expr.X_op != O_constant)
8642
        as_bad (_("Unsupported large constant"));
8643
      ++imm_expr.X_add_number;
8644
 
8645
    do_branch_i:
8646
      macro_build (&imm_expr, s, s3, xreg);
8647
      macro_build (&offset_expr, s2, "p");
8648
      break;
8649
 
8650
    case M_ABS:
8651
      expr1.X_add_number = 0;
8652
      macro_build (&expr1, "slti", "x,8", yreg);
8653
      if (xreg != yreg)
8654
        move_register (xreg, yreg);
8655
      expr1.X_add_number = 2;
8656
      macro_build (&expr1, "bteqz", "p");
8657
      macro_build (NULL, "neg", "x,w", xreg, xreg);
8658
    }
8659
}
8660
 
8661
/* For consistency checking, verify that all bits are specified either
8662
   by the match/mask part of the instruction definition, or by the
8663
   operand list.  */
8664
static int
8665
validate_mips_insn (const struct mips_opcode *opc)
8666
{
8667
  const char *p = opc->args;
8668
  char c;
8669
  unsigned long used_bits = opc->mask;
8670
 
8671
  if ((used_bits & opc->match) != opc->match)
8672
    {
8673
      as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8674
              opc->name, opc->args);
8675
      return 0;
8676
    }
8677
#define USE_BITS(mask,shift)    (used_bits |= ((mask) << (shift)))
8678
  while (*p)
8679
    switch (c = *p++)
8680
      {
8681
      case ',': break;
8682
      case '(': break;
8683
      case ')': break;
8684
      case '+':
8685
        switch (c = *p++)
8686
          {
8687
          case '1': USE_BITS (OP_MASK_UDI1,     OP_SH_UDI1);    break;
8688
          case '2': USE_BITS (OP_MASK_UDI2,     OP_SH_UDI2);    break;
8689
          case '3': USE_BITS (OP_MASK_UDI3,     OP_SH_UDI3);    break;
8690
          case '4': USE_BITS (OP_MASK_UDI4,     OP_SH_UDI4);    break;
8691
          case 'A': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8692
          case 'B': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8693
          case 'C': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8694
          case 'D': USE_BITS (OP_MASK_RD,       OP_SH_RD);
8695
                    USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8696
          case 'E': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8697
          case 'F': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8698
          case 'G': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8699
          case 'H': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8700
          case 'I': break;
8701
          case 't': USE_BITS (OP_MASK_RT,       OP_SH_RT);      break;
8702
          case 'T': USE_BITS (OP_MASK_RT,       OP_SH_RT);
8703
                    USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8704
          case 'x': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
8705
          case 'X': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
8706
          case 'p': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
8707
          case 'P': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
8708
          case 'Q': USE_BITS (OP_MASK_SEQI,     OP_SH_SEQI);    break;
8709
          case 's': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
8710
          case 'S': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
8711
          case 'z': USE_BITS (OP_MASK_RZ,       OP_SH_RZ);      break;
8712
          case 'Z': USE_BITS (OP_MASK_FZ,       OP_SH_FZ);      break;
8713
          case 'a': USE_BITS (OP_MASK_OFFSET_A, OP_SH_OFFSET_A); break;
8714
          case 'b': USE_BITS (OP_MASK_OFFSET_B, OP_SH_OFFSET_B); break;
8715
          case 'c': USE_BITS (OP_MASK_OFFSET_C, OP_SH_OFFSET_C); break;
8716
 
8717
          default:
8718
            as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8719
                    c, opc->name, opc->args);
8720
            return 0;
8721
          }
8722
        break;
8723
      case '<': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8724
      case '>': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8725
      case 'A': break;
8726
      case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
8727
      case 'C': USE_BITS (OP_MASK_COPZ,         OP_SH_COPZ);    break;
8728
      case 'D': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8729
      case 'E': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8730
      case 'F': break;
8731
      case 'G': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8732
      case 'H': USE_BITS (OP_MASK_SEL,          OP_SH_SEL);     break;
8733
      case 'I': break;
8734
      case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
8735
      case 'K': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8736
      case 'L': break;
8737
      case 'M': USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
8738
      case 'N': USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
8739
      case 'O': USE_BITS (OP_MASK_ALN,          OP_SH_ALN);     break;
8740
      case 'Q': USE_BITS (OP_MASK_VSEL,         OP_SH_VSEL);
8741
                USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8742
      case 'R': USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
8743
      case 'S': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8744
      case 'T': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8745
      case 'V': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8746
      case 'W': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8747
      case 'X': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8748
      case 'Y': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8749
      case 'Z': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8750
      case 'a': USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
8751
      case 'b': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8752
      case 'c': USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
8753
      case 'd': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8754
      case 'f': break;
8755
      case 'h': USE_BITS (OP_MASK_PREFX,        OP_SH_PREFX);   break;
8756
      case 'i': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8757
      case 'j': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8758
      case 'k': USE_BITS (OP_MASK_CACHE,        OP_SH_CACHE);   break;
8759
      case 'l': break;
8760
      case 'o': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8761
      case 'p': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8762
      case 'q': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
8763
      case 'r': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8764
      case 's': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8765
      case 't': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8766
      case 'u': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8767
      case 'v': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8768
      case 'w': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8769
      case 'x': break;
8770
      case 'z': break;
8771
      case 'P': USE_BITS (OP_MASK_PERFREG,      OP_SH_PERFREG); break;
8772
      case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
8773
                USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8774
      case 'e': USE_BITS (OP_MASK_VECBYTE,      OP_SH_VECBYTE); break;
8775
      case '%': USE_BITS (OP_MASK_VECALIGN,     OP_SH_VECALIGN); break;
8776
      case '[': break;
8777
      case ']': break;
8778
      case '1': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8779
      case '2': USE_BITS (OP_MASK_BP,           OP_SH_BP);      break;
8780
      case '3': USE_BITS (OP_MASK_SA3,          OP_SH_SA3);     break;
8781
      case '4': USE_BITS (OP_MASK_SA4,          OP_SH_SA4);     break;
8782
      case '5': USE_BITS (OP_MASK_IMM8,         OP_SH_IMM8);    break;
8783
      case '6': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8784
      case '7': USE_BITS (OP_MASK_DSPACC,       OP_SH_DSPACC);  break;
8785
      case '8': USE_BITS (OP_MASK_WRDSP,        OP_SH_WRDSP);   break;
8786
      case '9': USE_BITS (OP_MASK_DSPACC_S,     OP_SH_DSPACC_S);break;
8787
      case '0': USE_BITS (OP_MASK_DSPSFT,       OP_SH_DSPSFT);  break;
8788
      case '\'': USE_BITS (OP_MASK_RDDSP,       OP_SH_RDDSP);   break;
8789
      case ':': USE_BITS (OP_MASK_DSPSFT_7,     OP_SH_DSPSFT_7);break;
8790
      case '@': USE_BITS (OP_MASK_IMM10,        OP_SH_IMM10);   break;
8791
      case '!': USE_BITS (OP_MASK_MT_U,         OP_SH_MT_U);    break;
8792
      case '$': USE_BITS (OP_MASK_MT_H,         OP_SH_MT_H);    break;
8793
      case '*': USE_BITS (OP_MASK_MTACC_T,      OP_SH_MTACC_T); break;
8794
      case '&': USE_BITS (OP_MASK_MTACC_D,      OP_SH_MTACC_D); break;
8795
      case 'g': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8796
      default:
8797
        as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8798
                c, opc->name, opc->args);
8799
        return 0;
8800
      }
8801
#undef USE_BITS
8802
  if (used_bits != 0xffffffff)
8803
    {
8804
      as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8805
              ~used_bits & 0xffffffff, opc->name, opc->args);
8806
      return 0;
8807
    }
8808
  return 1;
8809
}
8810
 
8811
/* UDI immediates.  */
8812
struct mips_immed {
8813
  char          type;
8814
  unsigned int  shift;
8815
  unsigned long mask;
8816
  const char *  desc;
8817
};
8818
 
8819
static const struct mips_immed mips_immed[] = {
8820
  { '1',        OP_SH_UDI1,     OP_MASK_UDI1,           0},
8821
  { '2',        OP_SH_UDI2,     OP_MASK_UDI2,           0},
8822
  { '3',        OP_SH_UDI3,     OP_MASK_UDI3,           0},
8823
  { '4',        OP_SH_UDI4,     OP_MASK_UDI4,           0},
8824
  { 0,0,0,0 }
8825
};
8826
 
8827
/* Check whether an odd floating-point register is allowed.  */
8828
static int
8829
mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
8830
{
8831
  const char *s = insn->name;
8832
 
8833
  if (insn->pinfo == INSN_MACRO)
8834
    /* Let a macro pass, we'll catch it later when it is expanded.  */
8835
    return 1;
8836
 
8837
  if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
8838
    {
8839
      /* Allow odd registers for single-precision ops.  */
8840
      switch (insn->pinfo & (FP_S | FP_D))
8841
        {
8842
        case FP_S:
8843
        case 0:
8844
          return 1;     /* both single precision - ok */
8845
        case FP_D:
8846
          return 0;      /* both double precision - fail */
8847
        default:
8848
          break;
8849
        }
8850
 
8851
      /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand.  */
8852
      s = strchr (insn->name, '.');
8853
      if (argnum == 2)
8854
        s = s != NULL ? strchr (s + 1, '.') : NULL;
8855
      return (s != NULL && (s[1] == 'w' || s[1] == 's'));
8856
    }
8857
 
8858
  /* Single-precision coprocessor loads and moves are OK too.  */
8859
  if ((insn->pinfo & FP_S)
8860
      && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
8861
                         | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
8862
    return 1;
8863
 
8864
  return 0;
8865
}
8866
 
8867
/* This routine assembles an instruction into its binary format.  As a
8868
   side effect, it sets one of the global variables imm_reloc or
8869
   offset_reloc to the type of relocation to do if one of the operands
8870
   is an address expression.  */
8871
 
8872
static void
8873
mips_ip (char *str, struct mips_cl_insn *ip)
8874
{
8875
  char *s;
8876
  const char *args;
8877
  char c = 0;
8878
  struct mips_opcode *insn;
8879
  char *argsStart;
8880
  unsigned int regno;
8881
  unsigned int lastregno;
8882
  unsigned int lastpos = 0;
8883
  unsigned int limlo, limhi;
8884
  char *s_reset;
8885
  char save_c = 0;
8886
  offsetT min_range, max_range;
8887
  int argnum;
8888
  unsigned int rtype;
8889
 
8890
  insn_error = NULL;
8891
 
8892
  /* If the instruction contains a '.', we first try to match an instruction
8893
     including the '.'.  Then we try again without the '.'.  */
8894
  insn = NULL;
8895
  for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8896
    continue;
8897
 
8898
  /* If we stopped on whitespace, then replace the whitespace with null for
8899
     the call to hash_find.  Save the character we replaced just in case we
8900
     have to re-parse the instruction.  */
8901
  if (ISSPACE (*s))
8902
    {
8903
      save_c = *s;
8904
      *s++ = '\0';
8905
    }
8906
 
8907
  insn = (struct mips_opcode *) hash_find (op_hash, str);
8908
 
8909
  /* If we didn't find the instruction in the opcode table, try again, but
8910
     this time with just the instruction up to, but not including the
8911
     first '.'.  */
8912
  if (insn == NULL)
8913
    {
8914
      /* Restore the character we overwrite above (if any).  */
8915
      if (save_c)
8916
        *(--s) = save_c;
8917
 
8918
      /* Scan up to the first '.' or whitespace.  */
8919
      for (s = str;
8920
           *s != '\0' && *s != '.' && !ISSPACE (*s);
8921
           ++s)
8922
        continue;
8923
 
8924
      /* If we did not find a '.', then we can quit now.  */
8925
      if (*s != '.')
8926
        {
8927
          insn_error = _("Unrecognized opcode");
8928
          return;
8929
        }
8930
 
8931
      /* Lookup the instruction in the hash table.  */
8932
      *s++ = '\0';
8933
      if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8934
        {
8935
          insn_error = _("Unrecognized opcode");
8936
          return;
8937
        }
8938
    }
8939
 
8940
  argsStart = s;
8941
  for (;;)
8942
    {
8943
      bfd_boolean ok;
8944
 
8945
      gas_assert (strcmp (insn->name, str) == 0);
8946
 
8947
      ok = is_opcode_valid (insn);
8948
      if (! ok)
8949
        {
8950
          if (insn + 1 < &mips_opcodes[NUMOPCODES]
8951
              && strcmp (insn->name, insn[1].name) == 0)
8952
            {
8953
              ++insn;
8954
              continue;
8955
            }
8956
          else
8957
            {
8958
              if (!insn_error)
8959
                {
8960
                  static char buf[100];
8961
                  sprintf (buf,
8962
                           _("opcode not supported on this processor: %s (%s)"),
8963
                           mips_cpu_info_from_arch (mips_opts.arch)->name,
8964
                           mips_cpu_info_from_isa (mips_opts.isa)->name);
8965
                  insn_error = buf;
8966
                }
8967
              if (save_c)
8968
                *(--s) = save_c;
8969
              return;
8970
            }
8971
        }
8972
 
8973
      create_insn (ip, insn);
8974
      insn_error = NULL;
8975
      argnum = 1;
8976
      lastregno = 0xffffffff;
8977
      for (args = insn->args;; ++args)
8978
        {
8979
          int is_mdmx;
8980
 
8981
          s += strspn (s, " \t");
8982
          is_mdmx = 0;
8983
          switch (*args)
8984
            {
8985
            case '\0':          /* end of args */
8986
              if (*s == '\0')
8987
                return;
8988
              break;
8989
 
8990
            case '2': /* DSP 2-bit unsigned immediate in bit 11.  */
8991
              my_getExpression (&imm_expr, s);
8992
              check_absolute_expr (ip, &imm_expr);
8993
              if ((unsigned long) imm_expr.X_add_number != 1
8994
                  && (unsigned long) imm_expr.X_add_number != 3)
8995
                {
8996
                  as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
8997
                          (unsigned long) imm_expr.X_add_number);
8998
                }
8999
              INSERT_OPERAND (BP, *ip, imm_expr.X_add_number);
9000
              imm_expr.X_op = O_absent;
9001
              s = expr_end;
9002
              continue;
9003
 
9004
            case '3': /* DSP 3-bit unsigned immediate in bit 21.  */
9005
              my_getExpression (&imm_expr, s);
9006
              check_absolute_expr (ip, &imm_expr);
9007
              if (imm_expr.X_add_number & ~OP_MASK_SA3)
9008
                {
9009
                  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9010
                          OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
9011
                }
9012
              INSERT_OPERAND (SA3, *ip, imm_expr.X_add_number);
9013
              imm_expr.X_op = O_absent;
9014
              s = expr_end;
9015
              continue;
9016
 
9017
            case '4': /* DSP 4-bit unsigned immediate in bit 21.  */
9018
              my_getExpression (&imm_expr, s);
9019
              check_absolute_expr (ip, &imm_expr);
9020
              if (imm_expr.X_add_number & ~OP_MASK_SA4)
9021
                {
9022
                  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9023
                          OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
9024
                }
9025
              INSERT_OPERAND (SA4, *ip, imm_expr.X_add_number);
9026
              imm_expr.X_op = O_absent;
9027
              s = expr_end;
9028
              continue;
9029
 
9030
            case '5': /* DSP 8-bit unsigned immediate in bit 16.  */
9031
              my_getExpression (&imm_expr, s);
9032
              check_absolute_expr (ip, &imm_expr);
9033
              if (imm_expr.X_add_number & ~OP_MASK_IMM8)
9034
                {
9035
                  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9036
                          OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
9037
                }
9038
              INSERT_OPERAND (IMM8, *ip, imm_expr.X_add_number);
9039
              imm_expr.X_op = O_absent;
9040
              s = expr_end;
9041
              continue;
9042
 
9043
            case '6': /* DSP 5-bit unsigned immediate in bit 21.  */
9044
              my_getExpression (&imm_expr, s);
9045
              check_absolute_expr (ip, &imm_expr);
9046
              if (imm_expr.X_add_number & ~OP_MASK_RS)
9047
                {
9048
                  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9049
                          OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
9050
                }
9051
              INSERT_OPERAND (RS, *ip, imm_expr.X_add_number);
9052
              imm_expr.X_op = O_absent;
9053
              s = expr_end;
9054
              continue;
9055
 
9056
            case '7': /* Four DSP accumulators in bits 11,12.  */
9057
              if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
9058
                  s[3] >= '0' && s[3] <= '3')
9059
                {
9060
                  regno = s[3] - '0';
9061
                  s += 4;
9062
                  INSERT_OPERAND (DSPACC, *ip, regno);
9063
                  continue;
9064
                }
9065
              else
9066
                as_bad (_("Invalid dsp acc register"));
9067
              break;
9068
 
9069
            case '8': /* DSP 6-bit unsigned immediate in bit 11.  */
9070
              my_getExpression (&imm_expr, s);
9071
              check_absolute_expr (ip, &imm_expr);
9072
              if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
9073
                {
9074
                  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9075
                          OP_MASK_WRDSP,
9076
                          (unsigned long) imm_expr.X_add_number);
9077
                }
9078
              INSERT_OPERAND (WRDSP, *ip, imm_expr.X_add_number);
9079
              imm_expr.X_op = O_absent;
9080
              s = expr_end;
9081
              continue;
9082
 
9083
            case '9': /* Four DSP accumulators in bits 21,22.  */
9084
              if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
9085
                  s[3] >= '0' && s[3] <= '3')
9086
                {
9087
                  regno = s[3] - '0';
9088
                  s += 4;
9089
                  INSERT_OPERAND (DSPACC_S, *ip, regno);
9090
                  continue;
9091
                }
9092
              else
9093
                as_bad (_("Invalid dsp acc register"));
9094
              break;
9095
 
9096
            case '0': /* DSP 6-bit signed immediate in bit 20.  */
9097
              my_getExpression (&imm_expr, s);
9098
              check_absolute_expr (ip, &imm_expr);
9099
              min_range = -((OP_MASK_DSPSFT + 1) >> 1);
9100
              max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
9101
              if (imm_expr.X_add_number < min_range ||
9102
                  imm_expr.X_add_number > max_range)
9103
                {
9104
                  as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
9105
                          (long) min_range, (long) max_range,
9106
                          (long) imm_expr.X_add_number);
9107
                }
9108
              INSERT_OPERAND (DSPSFT, *ip, imm_expr.X_add_number);
9109
              imm_expr.X_op = O_absent;
9110
              s = expr_end;
9111
              continue;
9112
 
9113
            case '\'': /* DSP 6-bit unsigned immediate in bit 16.  */
9114
              my_getExpression (&imm_expr, s);
9115
              check_absolute_expr (ip, &imm_expr);
9116
              if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
9117
                {
9118
                  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9119
                          OP_MASK_RDDSP,
9120
                          (unsigned long) imm_expr.X_add_number);
9121
                }
9122
              INSERT_OPERAND (RDDSP, *ip, imm_expr.X_add_number);
9123
              imm_expr.X_op = O_absent;
9124
              s = expr_end;
9125
              continue;
9126
 
9127
            case ':': /* DSP 7-bit signed immediate in bit 19.  */
9128
              my_getExpression (&imm_expr, s);
9129
              check_absolute_expr (ip, &imm_expr);
9130
              min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
9131
              max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
9132
              if (imm_expr.X_add_number < min_range ||
9133
                  imm_expr.X_add_number > max_range)
9134
                {
9135
                  as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
9136
                          (long) min_range, (long) max_range,
9137
                          (long) imm_expr.X_add_number);
9138
                }
9139
              INSERT_OPERAND (DSPSFT_7, *ip, imm_expr.X_add_number);
9140
              imm_expr.X_op = O_absent;
9141
              s = expr_end;
9142
              continue;
9143
 
9144
            case '@': /* DSP 10-bit signed immediate in bit 16.  */
9145
              my_getExpression (&imm_expr, s);
9146
              check_absolute_expr (ip, &imm_expr);
9147
              min_range = -((OP_MASK_IMM10 + 1) >> 1);
9148
              max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
9149
              if (imm_expr.X_add_number < min_range ||
9150
                  imm_expr.X_add_number > max_range)
9151
                {
9152
                  as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
9153
                          (long) min_range, (long) max_range,
9154
                          (long) imm_expr.X_add_number);
9155
                }
9156
              INSERT_OPERAND (IMM10, *ip, imm_expr.X_add_number);
9157
              imm_expr.X_op = O_absent;
9158
              s = expr_end;
9159
              continue;
9160
 
9161
            case '!': /* MT usermode flag bit.  */
9162
              my_getExpression (&imm_expr, s);
9163
              check_absolute_expr (ip, &imm_expr);
9164
              if (imm_expr.X_add_number & ~OP_MASK_MT_U)
9165
                as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
9166
                        (unsigned long) imm_expr.X_add_number);
9167
              INSERT_OPERAND (MT_U, *ip, imm_expr.X_add_number);
9168
              imm_expr.X_op = O_absent;
9169
              s = expr_end;
9170
              continue;
9171
 
9172
            case '$': /* MT load high flag bit.  */
9173
              my_getExpression (&imm_expr, s);
9174
              check_absolute_expr (ip, &imm_expr);
9175
              if (imm_expr.X_add_number & ~OP_MASK_MT_H)
9176
                as_bad (_("MT load high bit not 0 or 1 (%lu)"),
9177
                        (unsigned long) imm_expr.X_add_number);
9178
              INSERT_OPERAND (MT_H, *ip, imm_expr.X_add_number);
9179
              imm_expr.X_op = O_absent;
9180
              s = expr_end;
9181
              continue;
9182
 
9183
            case '*': /* Four DSP accumulators in bits 18,19.  */
9184
              if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
9185
                  s[3] >= '0' && s[3] <= '3')
9186
                {
9187
                  regno = s[3] - '0';
9188
                  s += 4;
9189
                  INSERT_OPERAND (MTACC_T, *ip, regno);
9190
                  continue;
9191
                }
9192
              else
9193
                as_bad (_("Invalid dsp/smartmips acc register"));
9194
              break;
9195
 
9196
            case '&': /* Four DSP accumulators in bits 13,14.  */
9197
              if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
9198
                  s[3] >= '0' && s[3] <= '3')
9199
                {
9200
                  regno = s[3] - '0';
9201
                  s += 4;
9202
                  INSERT_OPERAND (MTACC_D, *ip, regno);
9203
                  continue;
9204
                }
9205
              else
9206
                as_bad (_("Invalid dsp/smartmips acc register"));
9207
              break;
9208
 
9209
            case ',':
9210
              ++argnum;
9211
              if (*s++ == *args)
9212
                continue;
9213
              s--;
9214
              switch (*++args)
9215
                {
9216
                case 'r':
9217
                case 'v':
9218
                  INSERT_OPERAND (RS, *ip, lastregno);
9219
                  continue;
9220
 
9221
                case 'w':
9222
                  INSERT_OPERAND (RT, *ip, lastregno);
9223
                  continue;
9224
 
9225
                case 'W':
9226
                  INSERT_OPERAND (FT, *ip, lastregno);
9227
                  continue;
9228
 
9229
                case 'V':
9230
                  INSERT_OPERAND (FS, *ip, lastregno);
9231
                  continue;
9232
                }
9233
              break;
9234
 
9235
            case '(':
9236
              /* Handle optional base register.
9237
                 Either the base register is omitted or
9238
                 we must have a left paren.  */
9239
              /* This is dependent on the next operand specifier
9240
                 is a base register specification.  */
9241
              gas_assert (args[1] == 'b');
9242
              if (*s == '\0')
9243
                return;
9244
 
9245
            case ')':           /* These must match exactly.  */
9246
            case '[':
9247
            case ']':
9248
              if (*s++ == *args)
9249
                continue;
9250
              break;
9251
 
9252
            case '+':           /* Opcode extension character.  */
9253
              switch (*++args)
9254
                {
9255
                case '1':       /* UDI immediates.  */
9256
                case '2':
9257
                case '3':
9258
                case '4':
9259
                  {
9260
                    const struct mips_immed *imm = mips_immed;
9261
 
9262
                    while (imm->type && imm->type != *args)
9263
                      ++imm;
9264
                    if (! imm->type)
9265
                      internalError ();
9266
                    my_getExpression (&imm_expr, s);
9267
                    check_absolute_expr (ip, &imm_expr);
9268
                    if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
9269
                      {
9270
                        as_warn (_("Illegal %s number (%lu, 0x%lx)"),
9271
                                 imm->desc ? imm->desc : ip->insn_mo->name,
9272
                                 (unsigned long) imm_expr.X_add_number,
9273
                                 (unsigned long) imm_expr.X_add_number);
9274
                        imm_expr.X_add_number &= imm->mask;
9275
                      }
9276
                    ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
9277
                                        << imm->shift);
9278
                    imm_expr.X_op = O_absent;
9279
                    s = expr_end;
9280
                  }
9281
                  continue;
9282
 
9283
                case 'A':               /* ins/ext position, becomes LSB.  */
9284
                  limlo = 0;
9285
                  limhi = 31;
9286
                  goto do_lsb;
9287
                case 'E':
9288
                  limlo = 32;
9289
                  limhi = 63;
9290
                  goto do_lsb;
9291
                do_lsb:
9292
                  my_getExpression (&imm_expr, s);
9293
                  check_absolute_expr (ip, &imm_expr);
9294
                  if ((unsigned long) imm_expr.X_add_number < limlo
9295
                      || (unsigned long) imm_expr.X_add_number > limhi)
9296
                    {
9297
                      as_bad (_("Improper position (%lu)"),
9298
                              (unsigned long) imm_expr.X_add_number);
9299
                      imm_expr.X_add_number = limlo;
9300
                    }
9301
                  lastpos = imm_expr.X_add_number;
9302
                  INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9303
                  imm_expr.X_op = O_absent;
9304
                  s = expr_end;
9305
                  continue;
9306
 
9307
                case 'B':               /* ins size, becomes MSB.  */
9308
                  limlo = 1;
9309
                  limhi = 32;
9310
                  goto do_msb;
9311
                case 'F':
9312
                  limlo = 33;
9313
                  limhi = 64;
9314
                  goto do_msb;
9315
                do_msb:
9316
                  my_getExpression (&imm_expr, s);
9317
                  check_absolute_expr (ip, &imm_expr);
9318
                  /* Check for negative input so that small negative numbers
9319
                     will not succeed incorrectly.  The checks against
9320
                     (pos+size) transitively check "size" itself,
9321
                     assuming that "pos" is reasonable.  */
9322
                  if ((long) imm_expr.X_add_number < 0
9323
                      || ((unsigned long) imm_expr.X_add_number
9324
                          + lastpos) < limlo
9325
                      || ((unsigned long) imm_expr.X_add_number
9326
                          + lastpos) > limhi)
9327
                    {
9328
                      as_bad (_("Improper insert size (%lu, position %lu)"),
9329
                              (unsigned long) imm_expr.X_add_number,
9330
                              (unsigned long) lastpos);
9331
                      imm_expr.X_add_number = limlo - lastpos;
9332
                    }
9333
                  INSERT_OPERAND (INSMSB, *ip,
9334
                                 lastpos + imm_expr.X_add_number - 1);
9335
                  imm_expr.X_op = O_absent;
9336
                  s = expr_end;
9337
                  continue;
9338
 
9339
                case 'C':               /* ext size, becomes MSBD.  */
9340
                  limlo = 1;
9341
                  limhi = 32;
9342
                  goto do_msbd;
9343
                case 'G':
9344
                  limlo = 33;
9345
                  limhi = 64;
9346
                  goto do_msbd;
9347
                case 'H':
9348
                  limlo = 33;
9349
                  limhi = 64;
9350
                  goto do_msbd;
9351
                do_msbd:
9352
                  my_getExpression (&imm_expr, s);
9353
                  check_absolute_expr (ip, &imm_expr);
9354
                  /* Check for negative input so that small negative numbers
9355
                     will not succeed incorrectly.  The checks against
9356
                     (pos+size) transitively check "size" itself,
9357
                     assuming that "pos" is reasonable.  */
9358
                  if ((long) imm_expr.X_add_number < 0
9359
                      || ((unsigned long) imm_expr.X_add_number
9360
                          + lastpos) < limlo
9361
                      || ((unsigned long) imm_expr.X_add_number
9362
                          + lastpos) > limhi)
9363
                    {
9364
                      as_bad (_("Improper extract size (%lu, position %lu)"),
9365
                              (unsigned long) imm_expr.X_add_number,
9366
                              (unsigned long) lastpos);
9367
                      imm_expr.X_add_number = limlo - lastpos;
9368
                    }
9369
                  INSERT_OPERAND (EXTMSBD, *ip, imm_expr.X_add_number - 1);
9370
                  imm_expr.X_op = O_absent;
9371
                  s = expr_end;
9372
                  continue;
9373
 
9374
                case 'D':
9375
                  /* +D is for disassembly only; never match.  */
9376
                  break;
9377
 
9378
                case 'I':
9379
                  /* "+I" is like "I", except that imm2_expr is used.  */
9380
                  my_getExpression (&imm2_expr, s);
9381
                  if (imm2_expr.X_op != O_big
9382
                      && imm2_expr.X_op != O_constant)
9383
                  insn_error = _("absolute expression required");
9384
                  if (HAVE_32BIT_GPRS)
9385
                    normalize_constant_expr (&imm2_expr);
9386
                  s = expr_end;
9387
                  continue;
9388
 
9389
                case 'T': /* Coprocessor register.  */
9390
                  /* +T is for disassembly only; never match.  */
9391
                  break;
9392
 
9393
                case 't': /* Coprocessor register number.  */
9394
                  if (s[0] == '$' && ISDIGIT (s[1]))
9395
                    {
9396
                      ++s;
9397
                      regno = 0;
9398
                      do
9399
                        {
9400
                          regno *= 10;
9401
                          regno += *s - '0';
9402
                          ++s;
9403
                        }
9404
                      while (ISDIGIT (*s));
9405
                      if (regno > 31)
9406
                        as_bad (_("Invalid register number (%d)"), regno);
9407
                      else
9408
                        {
9409
                          INSERT_OPERAND (RT, *ip, regno);
9410
                          continue;
9411
                        }
9412
                    }
9413
                  else
9414
                    as_bad (_("Invalid coprocessor 0 register number"));
9415
                  break;
9416
 
9417
                case 'x':
9418
                  /* bbit[01] and bbit[01]32 bit index.  Give error if index
9419
                     is not in the valid range.  */
9420
                  my_getExpression (&imm_expr, s);
9421
                  check_absolute_expr (ip, &imm_expr);
9422
                  if ((unsigned) imm_expr.X_add_number > 31)
9423
                    {
9424
                      as_bad (_("Improper bit index (%lu)"),
9425
                              (unsigned long) imm_expr.X_add_number);
9426
                      imm_expr.X_add_number = 0;
9427
                    }
9428
                  INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number);
9429
                  imm_expr.X_op = O_absent;
9430
                  s = expr_end;
9431
                  continue;
9432
 
9433
                case 'X':
9434
                  /* bbit[01] bit index when bbit is used but we generate
9435
                     bbit[01]32 because the index is over 32.  Move to the
9436
                     next candidate if index is not in the valid range.  */
9437
                  my_getExpression (&imm_expr, s);
9438
                  check_absolute_expr (ip, &imm_expr);
9439
                  if ((unsigned) imm_expr.X_add_number < 32
9440
                      || (unsigned) imm_expr.X_add_number > 63)
9441
                    break;
9442
                  INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number - 32);
9443
                  imm_expr.X_op = O_absent;
9444
                  s = expr_end;
9445
                  continue;
9446
 
9447
                case 'p':
9448
                  /* cins, cins32, exts and exts32 position field.  Give error
9449
                     if it's not in the valid range.  */
9450
                  my_getExpression (&imm_expr, s);
9451
                  check_absolute_expr (ip, &imm_expr);
9452
                  if ((unsigned) imm_expr.X_add_number > 31)
9453
                    {
9454
                      as_bad (_("Improper position (%lu)"),
9455
                              (unsigned long) imm_expr.X_add_number);
9456
                      imm_expr.X_add_number = 0;
9457
                    }
9458
                  /* Make the pos explicit to simplify +S.  */
9459
                  lastpos = imm_expr.X_add_number + 32;
9460
                  INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number);
9461
                  imm_expr.X_op = O_absent;
9462
                  s = expr_end;
9463
                  continue;
9464
 
9465
                case 'P':
9466
                  /* cins, cins32, exts and exts32 position field.  Move to
9467
                     the next candidate if it's not in the valid range.  */
9468
                  my_getExpression (&imm_expr, s);
9469
                  check_absolute_expr (ip, &imm_expr);
9470
                  if ((unsigned) imm_expr.X_add_number < 32
9471
                      || (unsigned) imm_expr.X_add_number > 63)
9472
                    break;
9473
                  lastpos = imm_expr.X_add_number;
9474
                  INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number - 32);
9475
                  imm_expr.X_op = O_absent;
9476
                  s = expr_end;
9477
                  continue;
9478
 
9479
                case 's':
9480
                  /* cins and exts length-minus-one field.  */
9481
                  my_getExpression (&imm_expr, s);
9482
                  check_absolute_expr (ip, &imm_expr);
9483
                  if ((unsigned long) imm_expr.X_add_number > 31)
9484
                    {
9485
                      as_bad (_("Improper size (%lu)"),
9486
                              (unsigned long) imm_expr.X_add_number);
9487
                      imm_expr.X_add_number = 0;
9488
                    }
9489
                  INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9490
                  imm_expr.X_op = O_absent;
9491
                  s = expr_end;
9492
                  continue;
9493
 
9494
                case 'S':
9495
                  /* cins32/exts32 and cins/exts aliasing cint32/exts32
9496
                     length-minus-one field.  */
9497
                  my_getExpression (&imm_expr, s);
9498
                  check_absolute_expr (ip, &imm_expr);
9499
                  if ((long) imm_expr.X_add_number < 0
9500
                      || (unsigned long) imm_expr.X_add_number + lastpos > 63)
9501
                    {
9502
                      as_bad (_("Improper size (%lu)"),
9503
                              (unsigned long) imm_expr.X_add_number);
9504
                      imm_expr.X_add_number = 0;
9505
                    }
9506
                  INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9507
                  imm_expr.X_op = O_absent;
9508
                  s = expr_end;
9509
                  continue;
9510
 
9511
                case 'Q':
9512
                  /* seqi/snei immediate field.  */
9513
                  my_getExpression (&imm_expr, s);
9514
                  check_absolute_expr (ip, &imm_expr);
9515
                  if ((long) imm_expr.X_add_number < -512
9516
                      || (long) imm_expr.X_add_number >= 512)
9517
                    {
9518
                      as_bad (_("Improper immediate (%ld)"),
9519
                               (long) imm_expr.X_add_number);
9520
                      imm_expr.X_add_number = 0;
9521
                    }
9522
                  INSERT_OPERAND (SEQI, *ip, imm_expr.X_add_number);
9523
                  imm_expr.X_op = O_absent;
9524
                  s = expr_end;
9525
                  continue;
9526
 
9527
                case 'a': /* 8-bit signed offset in bit 6 */
9528
                  my_getExpression (&imm_expr, s);
9529
                  check_absolute_expr (ip, &imm_expr);
9530
                  min_range = -((OP_MASK_OFFSET_A + 1) >> 1);
9531
                  max_range = ((OP_MASK_OFFSET_A + 1) >> 1) - 1;
9532
                  if (imm_expr.X_add_number < min_range
9533
                      || imm_expr.X_add_number > max_range)
9534
                    {
9535
                      as_bad (_("Offset not in range %ld..%ld (%ld)"),
9536
                              (long) min_range, (long) max_range,
9537
                              (long) imm_expr.X_add_number);
9538
                    }
9539
                  INSERT_OPERAND (OFFSET_A, *ip, imm_expr.X_add_number);
9540
                  imm_expr.X_op = O_absent;
9541
                  s = expr_end;
9542
                  continue;
9543
 
9544
                case 'b': /* 8-bit signed offset in bit 3 */
9545
                  my_getExpression (&imm_expr, s);
9546
                  check_absolute_expr (ip, &imm_expr);
9547
                  min_range = -((OP_MASK_OFFSET_B + 1) >> 1);
9548
                  max_range = ((OP_MASK_OFFSET_B + 1) >> 1) - 1;
9549
                  if (imm_expr.X_add_number < min_range
9550
                      || imm_expr.X_add_number > max_range)
9551
                    {
9552
                      as_bad (_("Offset not in range %ld..%ld (%ld)"),
9553
                              (long) min_range, (long) max_range,
9554
                              (long) imm_expr.X_add_number);
9555
                    }
9556
                  INSERT_OPERAND (OFFSET_B, *ip, imm_expr.X_add_number);
9557
                  imm_expr.X_op = O_absent;
9558
                  s = expr_end;
9559
                  continue;
9560
 
9561
                case 'c': /* 9-bit signed offset in bit 6 */
9562
                  my_getExpression (&imm_expr, s);
9563
                  check_absolute_expr (ip, &imm_expr);
9564
                  min_range = -((OP_MASK_OFFSET_C + 1) >> 1);
9565
                  max_range = ((OP_MASK_OFFSET_C + 1) >> 1) - 1;
9566
                  /* We check the offset range before adjusted.  */
9567
                  min_range <<= 4;
9568
                  max_range <<= 4;
9569
                  if (imm_expr.X_add_number < min_range
9570
                      || imm_expr.X_add_number > max_range)
9571
                    {
9572
                      as_bad (_("Offset not in range %ld..%ld (%ld)"),
9573
                              (long) min_range, (long) max_range,
9574
                              (long) imm_expr.X_add_number);
9575
                    }
9576
                  if (imm_expr.X_add_number & 0xf)
9577
                    {
9578
                      as_bad (_("Offset not 16 bytes alignment (%ld)"),
9579
                              (long) imm_expr.X_add_number);
9580
                    }
9581
                  /* Right shift 4 bits to adjust the offset operand.  */
9582
                  INSERT_OPERAND (OFFSET_C, *ip, imm_expr.X_add_number >> 4);
9583
                  imm_expr.X_op = O_absent;
9584
                  s = expr_end;
9585
                  continue;
9586
 
9587
                case 'z':
9588
                  if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
9589
                    break;
9590
                  if (regno == AT && mips_opts.at)
9591
                    {
9592
                      if (mips_opts.at == ATREG)
9593
                        as_warn (_("used $at without \".set noat\""));
9594
                      else
9595
                        as_warn (_("used $%u with \".set at=$%u\""),
9596
                                 regno, mips_opts.at);
9597
                    }
9598
                  INSERT_OPERAND (RZ, *ip, regno);
9599
                  continue;
9600
 
9601
                case 'Z':
9602
                  if (!reg_lookup (&s, RTYPE_FPU, &regno))
9603
                    break;
9604
                  INSERT_OPERAND (FZ, *ip, regno);
9605
                  continue;
9606
 
9607
                default:
9608
                  as_bad (_("Internal error: bad mips opcode "
9609
                            "(unknown extension operand type `+%c'): %s %s"),
9610
                          *args, insn->name, insn->args);
9611
                  /* Further processing is fruitless.  */
9612
                  return;
9613
                }
9614
              break;
9615
 
9616
            case '<':           /* must be at least one digit */
9617
              /*
9618
               * According to the manual, if the shift amount is greater
9619
               * than 31 or less than 0, then the shift amount should be
9620
               * mod 32.  In reality the mips assembler issues an error.
9621
               * We issue a warning and mask out all but the low 5 bits.
9622
               */
9623
              my_getExpression (&imm_expr, s);
9624
              check_absolute_expr (ip, &imm_expr);
9625
              if ((unsigned long) imm_expr.X_add_number > 31)
9626
                as_warn (_("Improper shift amount (%lu)"),
9627
                         (unsigned long) imm_expr.X_add_number);
9628
              INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9629
              imm_expr.X_op = O_absent;
9630
              s = expr_end;
9631
              continue;
9632
 
9633
            case '>':           /* shift amount minus 32 */
9634
              my_getExpression (&imm_expr, s);
9635
              check_absolute_expr (ip, &imm_expr);
9636
              if ((unsigned long) imm_expr.X_add_number < 32
9637
                  || (unsigned long) imm_expr.X_add_number > 63)
9638
                break;
9639
              INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number - 32);
9640
              imm_expr.X_op = O_absent;
9641
              s = expr_end;
9642
              continue;
9643
 
9644
            case 'k':           /* CACHE code.  */
9645
            case 'h':           /* PREFX code.  */
9646
            case '1':           /* SYNC type.  */
9647
              my_getExpression (&imm_expr, s);
9648
              check_absolute_expr (ip, &imm_expr);
9649
              if ((unsigned long) imm_expr.X_add_number > 31)
9650
                as_warn (_("Invalid value for `%s' (%lu)"),
9651
                         ip->insn_mo->name,
9652
                         (unsigned long) imm_expr.X_add_number);
9653
              if (*args == 'k')
9654
                {
9655
                  if (mips_fix_cn63xxp1 && strcmp ("pref", insn->name) == 0)
9656
                    switch (imm_expr.X_add_number)
9657
                      {
9658
                      case 5:
9659
                      case 25:
9660
                      case 26:
9661
                      case 27:
9662
                      case 28:
9663
                      case 29:
9664
                      case 30:
9665
                      case 31:  /* These are ok.  */
9666
                        break;
9667
 
9668
                      default:  /* The rest must be changed to 28.  */
9669
                        imm_expr.X_add_number = 28;
9670
                        break;
9671
                      }
9672
                  INSERT_OPERAND (CACHE, *ip, imm_expr.X_add_number);
9673
                }
9674
              else if (*args == 'h')
9675
                INSERT_OPERAND (PREFX, *ip, imm_expr.X_add_number);
9676
              else
9677
                INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9678
              imm_expr.X_op = O_absent;
9679
              s = expr_end;
9680
              continue;
9681
 
9682
            case 'c':           /* BREAK code.  */
9683
              my_getExpression (&imm_expr, s);
9684
              check_absolute_expr (ip, &imm_expr);
9685
              if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE)
9686
                as_warn (_("Code for %s not in range 0..1023 (%lu)"),
9687
                         ip->insn_mo->name,
9688
                         (unsigned long) imm_expr.X_add_number);
9689
              INSERT_OPERAND (CODE, *ip, imm_expr.X_add_number);
9690
              imm_expr.X_op = O_absent;
9691
              s = expr_end;
9692
              continue;
9693
 
9694
            case 'q':           /* Lower BREAK code.  */
9695
              my_getExpression (&imm_expr, s);
9696
              check_absolute_expr (ip, &imm_expr);
9697
              if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE2)
9698
                as_warn (_("Lower code for %s not in range 0..1023 (%lu)"),
9699
                         ip->insn_mo->name,
9700
                         (unsigned long) imm_expr.X_add_number);
9701
              INSERT_OPERAND (CODE2, *ip, imm_expr.X_add_number);
9702
              imm_expr.X_op = O_absent;
9703
              s = expr_end;
9704
              continue;
9705
 
9706
            case 'B':           /* 20-bit SYSCALL/BREAK code.  */
9707
              my_getExpression (&imm_expr, s);
9708
              check_absolute_expr (ip, &imm_expr);
9709
              if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
9710
                as_warn (_("Code for %s not in range 0..1048575 (%lu)"),
9711
                         ip->insn_mo->name,
9712
                         (unsigned long) imm_expr.X_add_number);
9713
              INSERT_OPERAND (CODE20, *ip, imm_expr.X_add_number);
9714
              imm_expr.X_op = O_absent;
9715
              s = expr_end;
9716
              continue;
9717
 
9718
            case 'C':           /* Coprocessor code.  */
9719
              my_getExpression (&imm_expr, s);
9720
              check_absolute_expr (ip, &imm_expr);
9721
              if ((unsigned long) imm_expr.X_add_number > OP_MASK_COPZ)
9722
                {
9723
                  as_warn (_("Coproccesor code > 25 bits (%lu)"),
9724
                           (unsigned long) imm_expr.X_add_number);
9725
                  imm_expr.X_add_number &= OP_MASK_COPZ;
9726
                }
9727
              INSERT_OPERAND (COPZ, *ip, imm_expr.X_add_number);
9728
              imm_expr.X_op = O_absent;
9729
              s = expr_end;
9730
              continue;
9731
 
9732
            case 'J':           /* 19-bit WAIT code.  */
9733
              my_getExpression (&imm_expr, s);
9734
              check_absolute_expr (ip, &imm_expr);
9735
              if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
9736
                {
9737
                  as_warn (_("Illegal 19-bit code (%lu)"),
9738
                           (unsigned long) imm_expr.X_add_number);
9739
                  imm_expr.X_add_number &= OP_MASK_CODE19;
9740
                }
9741
              INSERT_OPERAND (CODE19, *ip, imm_expr.X_add_number);
9742
              imm_expr.X_op = O_absent;
9743
              s = expr_end;
9744
              continue;
9745
 
9746
            case 'P':           /* Performance register.  */
9747
              my_getExpression (&imm_expr, s);
9748
              check_absolute_expr (ip, &imm_expr);
9749
              if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
9750
                as_warn (_("Invalid performance register (%lu)"),
9751
                         (unsigned long) imm_expr.X_add_number);
9752
              INSERT_OPERAND (PERFREG, *ip, imm_expr.X_add_number);
9753
              imm_expr.X_op = O_absent;
9754
              s = expr_end;
9755
              continue;
9756
 
9757
            case 'G':           /* Coprocessor destination register.  */
9758
              if (((ip->insn_opcode >> OP_SH_OP) & OP_MASK_OP) == OP_OP_COP0)
9759
                ok = reg_lookup (&s, RTYPE_NUM | RTYPE_CP0, &regno);
9760
              else
9761
                ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9762
              INSERT_OPERAND (RD, *ip, regno);
9763
              if (ok)
9764
                {
9765
                  lastregno = regno;
9766
                  continue;
9767
                }
9768
              else
9769
                break;
9770
 
9771
            case 'b':           /* Base register.  */
9772
            case 'd':           /* Destination register.  */
9773
            case 's':           /* Source register.  */
9774
            case 't':           /* Target register.  */
9775
            case 'r':           /* Both target and source.  */
9776
            case 'v':           /* Both dest and source.  */
9777
            case 'w':           /* Both dest and target.  */
9778
            case 'E':           /* Coprocessor target register.  */
9779
            case 'K':           /* RDHWR destination register.  */
9780
            case 'x':           /* Ignore register name.  */
9781
            case 'z':           /* Must be zero register.  */
9782
            case 'U':           /* Destination register (CLO/CLZ).  */
9783
            case 'g':           /* Coprocessor destination register.  */
9784
              s_reset = s;
9785
              if (*args == 'E' || *args == 'K')
9786
                ok = reg_lookup (&s, RTYPE_NUM, &regno);
9787
              else
9788
                {
9789
                  ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9790
                  if (regno == AT && mips_opts.at)
9791
                    {
9792
                      if (mips_opts.at == ATREG)
9793
                        as_warn (_("Used $at without \".set noat\""));
9794
                      else
9795
                        as_warn (_("Used $%u with \".set at=$%u\""),
9796
                                 regno, mips_opts.at);
9797
                    }
9798
                }
9799
              if (ok)
9800
                {
9801
                  c = *args;
9802
                  if (*s == ' ')
9803
                    ++s;
9804
                  if (args[1] != *s)
9805
                    {
9806
                      if (c == 'r' || c == 'v' || c == 'w')
9807
                        {
9808
                          regno = lastregno;
9809
                          s = s_reset;
9810
                          ++args;
9811
                        }
9812
                    }
9813
                  /* 'z' only matches $0.  */
9814
                  if (c == 'z' && regno != 0)
9815
                    break;
9816
 
9817
                  if (c == 's' && !strncmp (ip->insn_mo->name, "jalr", 4))
9818
                    {
9819
                      if (regno == lastregno)
9820
                        {
9821
                          insn_error
9822
                            = _("Source and destination must be different");
9823
                          continue;
9824
                        }
9825
                      if (regno == 31 && lastregno == 0xffffffff)
9826
                        {
9827
                          insn_error
9828
                            = _("A destination register must be supplied");
9829
                          continue;
9830
                        }
9831
                    }
9832
                  /* Now that we have assembled one operand, we use the args
9833
                     string to figure out where it goes in the instruction.  */
9834
                  switch (c)
9835
                    {
9836
                    case 'r':
9837
                    case 's':
9838
                    case 'v':
9839
                    case 'b':
9840
                      INSERT_OPERAND (RS, *ip, regno);
9841
                      break;
9842
                    case 'd':
9843
                    case 'K':
9844
                    case 'g':
9845
                      INSERT_OPERAND (RD, *ip, regno);
9846
                      break;
9847
                    case 'U':
9848
                      INSERT_OPERAND (RD, *ip, regno);
9849
                      INSERT_OPERAND (RT, *ip, regno);
9850
                      break;
9851
                    case 'w':
9852
                    case 't':
9853
                    case 'E':
9854
                      INSERT_OPERAND (RT, *ip, regno);
9855
                      break;
9856
                    case 'x':
9857
                      /* This case exists because on the r3000 trunc
9858
                         expands into a macro which requires a gp
9859
                         register.  On the r6000 or r4000 it is
9860
                         assembled into a single instruction which
9861
                         ignores the register.  Thus the insn version
9862
                         is MIPS_ISA2 and uses 'x', and the macro
9863
                         version is MIPS_ISA1 and uses 't'.  */
9864
                      break;
9865
                    case 'z':
9866
                      /* This case is for the div instruction, which
9867
                         acts differently if the destination argument
9868
                         is $0.  This only matches $0, and is checked
9869
                         outside the switch.  */
9870
                      break;
9871
                    }
9872
                  lastregno = regno;
9873
                  continue;
9874
                }
9875
              switch (*args++)
9876
                {
9877
                case 'r':
9878
                case 'v':
9879
                  INSERT_OPERAND (RS, *ip, lastregno);
9880
                  continue;
9881
                case 'w':
9882
                  INSERT_OPERAND (RT, *ip, lastregno);
9883
                  continue;
9884
                }
9885
              break;
9886
 
9887
            case 'O':           /* MDMX alignment immediate constant.  */
9888
              my_getExpression (&imm_expr, s);
9889
              check_absolute_expr (ip, &imm_expr);
9890
              if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
9891
                as_warn (_("Improper align amount (%ld), using low bits"),
9892
                         (long) imm_expr.X_add_number);
9893
              INSERT_OPERAND (ALN, *ip, imm_expr.X_add_number);
9894
              imm_expr.X_op = O_absent;
9895
              s = expr_end;
9896
              continue;
9897
 
9898
            case 'Q':           /* MDMX vector, element sel, or const.  */
9899
              if (s[0] != '$')
9900
                {
9901
                  /* MDMX Immediate.  */
9902
                  my_getExpression (&imm_expr, s);
9903
                  check_absolute_expr (ip, &imm_expr);
9904
                  if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
9905
                    as_warn (_("Invalid MDMX Immediate (%ld)"),
9906
                             (long) imm_expr.X_add_number);
9907
                  INSERT_OPERAND (FT, *ip, imm_expr.X_add_number);
9908
                  if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9909
                    ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
9910
                  else
9911
                    ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
9912
                  imm_expr.X_op = O_absent;
9913
                  s = expr_end;
9914
                  continue;
9915
                }
9916
              /* Not MDMX Immediate.  Fall through.  */
9917
            case 'X':           /* MDMX destination register.  */
9918
            case 'Y':           /* MDMX source register.  */
9919
            case 'Z':           /* MDMX target register.  */
9920
              is_mdmx = 1;
9921
            case 'D':           /* Floating point destination register.  */
9922
            case 'S':           /* Floating point source register.  */
9923
            case 'T':           /* Floating point target register.  */
9924
            case 'R':           /* Floating point source register.  */
9925
            case 'V':
9926
            case 'W':
9927
              rtype = RTYPE_FPU;
9928
              if (is_mdmx
9929
                  || (mips_opts.ase_mdmx
9930
                      && (ip->insn_mo->pinfo & FP_D)
9931
                      && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
9932
                                                | INSN_COPROC_MEMORY_DELAY
9933
                                                | INSN_LOAD_COPROC_DELAY
9934
                                                | INSN_LOAD_MEMORY_DELAY
9935
                                                | INSN_STORE_MEMORY))))
9936
                rtype |= RTYPE_VEC;
9937
              s_reset = s;
9938
              if (reg_lookup (&s, rtype, &regno))
9939
                {
9940
                  if ((regno & 1) != 0
9941
                      && HAVE_32BIT_FPRS
9942
                      && !mips_oddfpreg_ok (ip->insn_mo, argnum))
9943
                    as_warn (_("Float register should be even, was %d"),
9944
                             regno);
9945
 
9946
                  c = *args;
9947
                  if (*s == ' ')
9948
                    ++s;
9949
                  if (args[1] != *s)
9950
                    {
9951
                      if (c == 'V' || c == 'W')
9952
                        {
9953
                          regno = lastregno;
9954
                          s = s_reset;
9955
                          ++args;
9956
                        }
9957
                    }
9958
                  switch (c)
9959
                    {
9960
                    case 'D':
9961
                    case 'X':
9962
                      INSERT_OPERAND (FD, *ip, regno);
9963
                      break;
9964
                    case 'V':
9965
                    case 'S':
9966
                    case 'Y':
9967
                      INSERT_OPERAND (FS, *ip, regno);
9968
                      break;
9969
                    case 'Q':
9970
                      /* This is like 'Z', but also needs to fix the MDMX
9971
                         vector/scalar select bits.  Note that the
9972
                         scalar immediate case is handled above.  */
9973
                      if (*s == '[')
9974
                        {
9975
                          int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
9976
                          int max_el = (is_qh ? 3 : 7);
9977
                          s++;
9978
                          my_getExpression(&imm_expr, s);
9979
                          check_absolute_expr (ip, &imm_expr);
9980
                          s = expr_end;
9981
                          if (imm_expr.X_add_number > max_el)
9982
                            as_bad (_("Bad element selector %ld"),
9983
                                    (long) imm_expr.X_add_number);
9984
                          imm_expr.X_add_number &= max_el;
9985
                          ip->insn_opcode |= (imm_expr.X_add_number
9986
                                              << (OP_SH_VSEL +
9987
                                                  (is_qh ? 2 : 1)));
9988
                          imm_expr.X_op = O_absent;
9989
                          if (*s != ']')
9990
                            as_warn (_("Expecting ']' found '%s'"), s);
9991
                          else
9992
                            s++;
9993
                        }
9994
                      else
9995
                        {
9996
                          if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9997
                            ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
9998
                                                << OP_SH_VSEL);
9999
                          else
10000
                            ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
10001
                                                OP_SH_VSEL);
10002
                        }
10003
                      /* Fall through.  */
10004
                    case 'W':
10005
                    case 'T':
10006
                    case 'Z':
10007
                      INSERT_OPERAND (FT, *ip, regno);
10008
                      break;
10009
                    case 'R':
10010
                      INSERT_OPERAND (FR, *ip, regno);
10011
                      break;
10012
                    }
10013
                  lastregno = regno;
10014
                  continue;
10015
                }
10016
 
10017
              switch (*args++)
10018
                {
10019
                case 'V':
10020
                  INSERT_OPERAND (FS, *ip, lastregno);
10021
                  continue;
10022
                case 'W':
10023
                  INSERT_OPERAND (FT, *ip, lastregno);
10024
                  continue;
10025
                }
10026
              break;
10027
 
10028
            case 'I':
10029
              my_getExpression (&imm_expr, s);
10030
              if (imm_expr.X_op != O_big
10031
                  && imm_expr.X_op != O_constant)
10032
                insn_error = _("absolute expression required");
10033
              if (HAVE_32BIT_GPRS)
10034
                normalize_constant_expr (&imm_expr);
10035
              s = expr_end;
10036
              continue;
10037
 
10038
            case 'A':
10039
              my_getExpression (&offset_expr, s);
10040
              normalize_address_expr (&offset_expr);
10041
              *imm_reloc = BFD_RELOC_32;
10042
              s = expr_end;
10043
              continue;
10044
 
10045
            case 'F':
10046
            case 'L':
10047
            case 'f':
10048
            case 'l':
10049
              {
10050
                int f64;
10051
                int using_gprs;
10052
                char *save_in;
10053
                char *err;
10054
                unsigned char temp[8];
10055
                int len;
10056
                unsigned int length;
10057
                segT seg;
10058
                subsegT subseg;
10059
                char *p;
10060
 
10061
                /* These only appear as the last operand in an
10062
                   instruction, and every instruction that accepts
10063
                   them in any variant accepts them in all variants.
10064
                   This means we don't have to worry about backing out
10065
                   any changes if the instruction does not match.
10066
 
10067
                   The difference between them is the size of the
10068
                   floating point constant and where it goes.  For 'F'
10069
                   and 'L' the constant is 64 bits; for 'f' and 'l' it
10070
                   is 32 bits.  Where the constant is placed is based
10071
                   on how the MIPS assembler does things:
10072
                    F -- .rdata
10073
                    L -- .lit8
10074
                    f -- immediate value
10075
                    l -- .lit4
10076
 
10077
                    The .lit4 and .lit8 sections are only used if
10078
                    permitted by the -G argument.
10079
 
10080
                    The code below needs to know whether the target register
10081
                    is 32 or 64 bits wide.  It relies on the fact 'f' and
10082
                    'F' are used with GPR-based instructions and 'l' and
10083
                    'L' are used with FPR-based instructions.  */
10084
 
10085
                f64 = *args == 'F' || *args == 'L';
10086
                using_gprs = *args == 'F' || *args == 'f';
10087
 
10088
                save_in = input_line_pointer;
10089
                input_line_pointer = s;
10090
                err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
10091
                length = len;
10092
                s = input_line_pointer;
10093
                input_line_pointer = save_in;
10094
                if (err != NULL && *err != '\0')
10095
                  {
10096
                    as_bad (_("Bad floating point constant: %s"), err);
10097
                    memset (temp, '\0', sizeof temp);
10098
                    length = f64 ? 8 : 4;
10099
                  }
10100
 
10101
                gas_assert (length == (unsigned) (f64 ? 8 : 4));
10102
 
10103
                if (*args == 'f'
10104
                    || (*args == 'l'
10105
                        && (g_switch_value < 4
10106
                            || (temp[0] == 0 && temp[1] == 0)
10107
                            || (temp[2] == 0 && temp[3] == 0))))
10108
                  {
10109
                    imm_expr.X_op = O_constant;
10110
                    if (!target_big_endian)
10111
                      imm_expr.X_add_number = bfd_getl32 (temp);
10112
                    else
10113
                      imm_expr.X_add_number = bfd_getb32 (temp);
10114
                  }
10115
                else if (length > 4
10116
                         && !mips_disable_float_construction
10117
                         /* Constants can only be constructed in GPRs and
10118
                            copied to FPRs if the GPRs are at least as wide
10119
                            as the FPRs.  Force the constant into memory if
10120
                            we are using 64-bit FPRs but the GPRs are only
10121
                            32 bits wide.  */
10122
                         && (using_gprs
10123
                             || !(HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
10124
                         && ((temp[0] == 0 && temp[1] == 0)
10125
                             || (temp[2] == 0 && temp[3] == 0))
10126
                         && ((temp[4] == 0 && temp[5] == 0)
10127
                             || (temp[6] == 0 && temp[7] == 0)))
10128
                  {
10129
                    /* The value is simple enough to load with a couple of
10130
                       instructions.  If using 32-bit registers, set
10131
                       imm_expr to the high order 32 bits and offset_expr to
10132
                       the low order 32 bits.  Otherwise, set imm_expr to
10133
                       the entire 64 bit constant.  */
10134
                    if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
10135
                      {
10136
                        imm_expr.X_op = O_constant;
10137
                        offset_expr.X_op = O_constant;
10138
                        if (!target_big_endian)
10139
                          {
10140
                            imm_expr.X_add_number = bfd_getl32 (temp + 4);
10141
                            offset_expr.X_add_number = bfd_getl32 (temp);
10142
                          }
10143
                        else
10144
                          {
10145
                            imm_expr.X_add_number = bfd_getb32 (temp);
10146
                            offset_expr.X_add_number = bfd_getb32 (temp + 4);
10147
                          }
10148
                        if (offset_expr.X_add_number == 0)
10149
                          offset_expr.X_op = O_absent;
10150
                      }
10151
                    else if (sizeof (imm_expr.X_add_number) > 4)
10152
                      {
10153
                        imm_expr.X_op = O_constant;
10154
                        if (!target_big_endian)
10155
                          imm_expr.X_add_number = bfd_getl64 (temp);
10156
                        else
10157
                          imm_expr.X_add_number = bfd_getb64 (temp);
10158
                      }
10159
                    else
10160
                      {
10161
                        imm_expr.X_op = O_big;
10162
                        imm_expr.X_add_number = 4;
10163
                        if (!target_big_endian)
10164
                          {
10165
                            generic_bignum[0] = bfd_getl16 (temp);
10166
                            generic_bignum[1] = bfd_getl16 (temp + 2);
10167
                            generic_bignum[2] = bfd_getl16 (temp + 4);
10168
                            generic_bignum[3] = bfd_getl16 (temp + 6);
10169
                          }
10170
                        else
10171
                          {
10172
                            generic_bignum[0] = bfd_getb16 (temp + 6);
10173
                            generic_bignum[1] = bfd_getb16 (temp + 4);
10174
                            generic_bignum[2] = bfd_getb16 (temp + 2);
10175
                            generic_bignum[3] = bfd_getb16 (temp);
10176
                          }
10177
                      }
10178
                  }
10179
                else
10180
                  {
10181
                    const char *newname;
10182
                    segT new_seg;
10183
 
10184
                    /* Switch to the right section.  */
10185
                    seg = now_seg;
10186
                    subseg = now_subseg;
10187
                    switch (*args)
10188
                      {
10189
                      default: /* unused default case avoids warnings.  */
10190
                      case 'L':
10191
                        newname = RDATA_SECTION_NAME;
10192
                        if (g_switch_value >= 8)
10193
                          newname = ".lit8";
10194
                        break;
10195
                      case 'F':
10196
                        newname = RDATA_SECTION_NAME;
10197
                        break;
10198
                      case 'l':
10199
                        gas_assert (g_switch_value >= 4);
10200
                        newname = ".lit4";
10201
                        break;
10202
                      }
10203
                    new_seg = subseg_new (newname, (subsegT) 0);
10204
                    if (IS_ELF)
10205
                      bfd_set_section_flags (stdoutput, new_seg,
10206
                                             (SEC_ALLOC
10207
                                              | SEC_LOAD
10208
                                              | SEC_READONLY
10209
                                              | SEC_DATA));
10210
                    frag_align (*args == 'l' ? 2 : 3, 0, 0);
10211
                    if (IS_ELF && strncmp (TARGET_OS, "elf", 3) != 0)
10212
                      record_alignment (new_seg, 4);
10213
                    else
10214
                      record_alignment (new_seg, *args == 'l' ? 2 : 3);
10215
                    if (seg == now_seg)
10216
                      as_bad (_("Can't use floating point insn in this section"));
10217
 
10218
                    /* Set the argument to the current address in the
10219
                       section.  */
10220
                    offset_expr.X_op = O_symbol;
10221
                    offset_expr.X_add_symbol = symbol_temp_new_now ();
10222
                    offset_expr.X_add_number = 0;
10223
 
10224
                    /* Put the floating point number into the section.  */
10225
                    p = frag_more ((int) length);
10226
                    memcpy (p, temp, length);
10227
 
10228
                    /* Switch back to the original section.  */
10229
                    subseg_set (seg, subseg);
10230
                  }
10231
              }
10232
              continue;
10233
 
10234
            case 'i':           /* 16-bit unsigned immediate.  */
10235
            case 'j':           /* 16-bit signed immediate.  */
10236
              *imm_reloc = BFD_RELOC_LO16;
10237
              if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
10238
                {
10239
                  int more;
10240
                  offsetT minval, maxval;
10241
 
10242
                  more = (insn + 1 < &mips_opcodes[NUMOPCODES]
10243
                          && strcmp (insn->name, insn[1].name) == 0);
10244
 
10245
                  /* If the expression was written as an unsigned number,
10246
                     only treat it as signed if there are no more
10247
                     alternatives.  */
10248
                  if (more
10249
                      && *args == 'j'
10250
                      && sizeof (imm_expr.X_add_number) <= 4
10251
                      && imm_expr.X_op == O_constant
10252
                      && imm_expr.X_add_number < 0
10253
                      && imm_expr.X_unsigned
10254
                      && HAVE_64BIT_GPRS)
10255
                    break;
10256
 
10257
                  /* For compatibility with older assemblers, we accept
10258
                     0x8000-0xffff as signed 16-bit numbers when only
10259
                     signed numbers are allowed.  */
10260
                  if (*args == 'i')
10261
                    minval = 0, maxval = 0xffff;
10262
                  else if (more)
10263
                    minval = -0x8000, maxval = 0x7fff;
10264
                  else
10265
                    minval = -0x8000, maxval = 0xffff;
10266
 
10267
                  if (imm_expr.X_op != O_constant
10268
                      || imm_expr.X_add_number < minval
10269
                      || imm_expr.X_add_number > maxval)
10270
                    {
10271
                      if (more)
10272
                        break;
10273
                      if (imm_expr.X_op == O_constant
10274
                          || imm_expr.X_op == O_big)
10275
                        as_bad (_("Expression out of range"));
10276
                    }
10277
                }
10278
              s = expr_end;
10279
              continue;
10280
 
10281
            case 'o':           /* 16-bit offset.  */
10282
              offset_reloc[0] = BFD_RELOC_LO16;
10283
              offset_reloc[1] = BFD_RELOC_UNUSED;
10284
              offset_reloc[2] = BFD_RELOC_UNUSED;
10285
 
10286
              /* Check whether there is only a single bracketed expression
10287
                 left.  If so, it must be the base register and the
10288
                 constant must be zero.  */
10289
              if (*s == '(' && strchr (s + 1, '(') == 0)
10290
                {
10291
                  offset_expr.X_op = O_constant;
10292
                  offset_expr.X_add_number = 0;
10293
                  continue;
10294
                }
10295
 
10296
              /* If this value won't fit into a 16 bit offset, then go
10297
                 find a macro that will generate the 32 bit offset
10298
                 code pattern.  */
10299
              if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
10300
                  && (offset_expr.X_op != O_constant
10301
                      || offset_expr.X_add_number >= 0x8000
10302
                      || offset_expr.X_add_number < -0x8000))
10303
                break;
10304
 
10305
              s = expr_end;
10306
              continue;
10307
 
10308
            case 'p':           /* PC-relative offset.  */
10309
              *offset_reloc = BFD_RELOC_16_PCREL_S2;
10310
              my_getExpression (&offset_expr, s);
10311
              s = expr_end;
10312
              continue;
10313
 
10314
            case 'u':           /* Upper 16 bits.  */
10315
              if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
10316
                  && imm_expr.X_op == O_constant
10317
                  && (imm_expr.X_add_number < 0
10318
                      || imm_expr.X_add_number >= 0x10000))
10319
                as_bad (_("lui expression (%lu) not in range 0..65535"),
10320
                        (unsigned long) imm_expr.X_add_number);
10321
              s = expr_end;
10322
              continue;
10323
 
10324
            case 'a':           /* 26-bit address.  */
10325
              my_getExpression (&offset_expr, s);
10326
              s = expr_end;
10327
              *offset_reloc = BFD_RELOC_MIPS_JMP;
10328
              continue;
10329
 
10330
            case 'N':           /* 3-bit branch condition code.  */
10331
            case 'M':           /* 3-bit compare condition code.  */
10332
              rtype = RTYPE_CCC;
10333
              if (ip->insn_mo->pinfo & (FP_D | FP_S))
10334
                rtype |= RTYPE_FCC;
10335
              if (!reg_lookup (&s, rtype, &regno))
10336
                break;
10337
              if ((strcmp (str + strlen (str) - 3, ".ps") == 0
10338
                   || strcmp (str + strlen (str) - 5, "any2f") == 0
10339
                   || strcmp (str + strlen (str) - 5, "any2t") == 0)
10340
                  && (regno & 1) != 0)
10341
                as_warn (_("Condition code register should be even for %s, "
10342
                           "was %d"),
10343
                         str, regno);
10344
              if ((strcmp (str + strlen (str) - 5, "any4f") == 0
10345
                   || strcmp (str + strlen (str) - 5, "any4t") == 0)
10346
                  && (regno & 3) != 0)
10347
                as_warn (_("Condition code register should be 0 or 4 for %s, "
10348
                           "was %d"),
10349
                         str, regno);
10350
              if (*args == 'N')
10351
                INSERT_OPERAND (BCC, *ip, regno);
10352
              else
10353
                INSERT_OPERAND (CCC, *ip, regno);
10354
              continue;
10355
 
10356
            case 'H':
10357
              if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
10358
                s += 2;
10359
              if (ISDIGIT (*s))
10360
                {
10361
                  c = 0;
10362
                  do
10363
                    {
10364
                      c *= 10;
10365
                      c += *s - '0';
10366
                      ++s;
10367
                    }
10368
                  while (ISDIGIT (*s));
10369
                }
10370
              else
10371
                c = 8; /* Invalid sel value.  */
10372
 
10373
              if (c > 7)
10374
                as_bad (_("Invalid coprocessor sub-selection value (0-7)"));
10375
              ip->insn_opcode |= c;
10376
              continue;
10377
 
10378
            case 'e':
10379
              /* Must be at least one digit.  */
10380
              my_getExpression (&imm_expr, s);
10381
              check_absolute_expr (ip, &imm_expr);
10382
 
10383
              if ((unsigned long) imm_expr.X_add_number
10384
                  > (unsigned long) OP_MASK_VECBYTE)
10385
                {
10386
                  as_bad (_("bad byte vector index (%ld)"),
10387
                           (long) imm_expr.X_add_number);
10388
                  imm_expr.X_add_number = 0;
10389
                }
10390
 
10391
              INSERT_OPERAND (VECBYTE, *ip, imm_expr.X_add_number);
10392
              imm_expr.X_op = O_absent;
10393
              s = expr_end;
10394
              continue;
10395
 
10396
            case '%':
10397
              my_getExpression (&imm_expr, s);
10398
              check_absolute_expr (ip, &imm_expr);
10399
 
10400
              if ((unsigned long) imm_expr.X_add_number
10401
                  > (unsigned long) OP_MASK_VECALIGN)
10402
                {
10403
                  as_bad (_("bad byte vector index (%ld)"),
10404
                           (long) imm_expr.X_add_number);
10405
                  imm_expr.X_add_number = 0;
10406
                }
10407
 
10408
              INSERT_OPERAND (VECALIGN, *ip, imm_expr.X_add_number);
10409
              imm_expr.X_op = O_absent;
10410
              s = expr_end;
10411
              continue;
10412
 
10413
            default:
10414
              as_bad (_("Bad char = '%c'\n"), *args);
10415
              internalError ();
10416
            }
10417
          break;
10418
        }
10419
      /* Args don't match.  */
10420
      if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
10421
          !strcmp (insn->name, insn[1].name))
10422
        {
10423
          ++insn;
10424
          s = argsStart;
10425
          insn_error = _("Illegal operands");
10426
          continue;
10427
        }
10428
      if (save_c)
10429
        *(--argsStart) = save_c;
10430
      insn_error = _("Illegal operands");
10431
      return;
10432
    }
10433
}
10434
 
10435
#define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
10436
 
10437
/* This routine assembles an instruction into its binary format when
10438
   assembling for the mips16.  As a side effect, it sets one of the
10439
   global variables imm_reloc or offset_reloc to the type of
10440
   relocation to do if one of the operands is an address expression.
10441
   It also sets mips16_small and mips16_ext if the user explicitly
10442
   requested a small or extended instruction.  */
10443
 
10444
static void
10445
mips16_ip (char *str, struct mips_cl_insn *ip)
10446
{
10447
  char *s;
10448
  const char *args;
10449
  struct mips_opcode *insn;
10450
  char *argsstart;
10451
  unsigned int regno;
10452
  unsigned int lastregno = 0;
10453
  char *s_reset;
10454
  size_t i;
10455
 
10456
  insn_error = NULL;
10457
 
10458
  mips16_small = FALSE;
10459
  mips16_ext = FALSE;
10460
 
10461
  for (s = str; ISLOWER (*s); ++s)
10462
    ;
10463
  switch (*s)
10464
    {
10465
    case '\0':
10466
      break;
10467
 
10468
    case ' ':
10469
      *s++ = '\0';
10470
      break;
10471
 
10472
    case '.':
10473
      if (s[1] == 't' && s[2] == ' ')
10474
        {
10475
          *s = '\0';
10476
          mips16_small = TRUE;
10477
          s += 3;
10478
          break;
10479
        }
10480
      else if (s[1] == 'e' && s[2] == ' ')
10481
        {
10482
          *s = '\0';
10483
          mips16_ext = TRUE;
10484
          s += 3;
10485
          break;
10486
        }
10487
      /* Fall through.  */
10488
    default:
10489
      insn_error = _("unknown opcode");
10490
      return;
10491
    }
10492
 
10493
  if (mips_opts.noautoextend && ! mips16_ext)
10494
    mips16_small = TRUE;
10495
 
10496
  if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
10497
    {
10498
      insn_error = _("unrecognized opcode");
10499
      return;
10500
    }
10501
 
10502
  argsstart = s;
10503
  for (;;)
10504
    {
10505
      bfd_boolean ok;
10506
 
10507
      gas_assert (strcmp (insn->name, str) == 0);
10508
 
10509
      ok = is_opcode_valid_16 (insn);
10510
      if (! ok)
10511
        {
10512
          if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
10513
              && strcmp (insn->name, insn[1].name) == 0)
10514
            {
10515
              ++insn;
10516
              continue;
10517
            }
10518
          else
10519
            {
10520
              if (!insn_error)
10521
                {
10522
                  static char buf[100];
10523
                  sprintf (buf,
10524
                           _("opcode not supported on this processor: %s (%s)"),
10525
                           mips_cpu_info_from_arch (mips_opts.arch)->name,
10526
                           mips_cpu_info_from_isa (mips_opts.isa)->name);
10527
                  insn_error = buf;
10528
                }
10529
              return;
10530
            }
10531
        }
10532
 
10533
      create_insn (ip, insn);
10534
      imm_expr.X_op = O_absent;
10535
      imm_reloc[0] = BFD_RELOC_UNUSED;
10536
      imm_reloc[1] = BFD_RELOC_UNUSED;
10537
      imm_reloc[2] = BFD_RELOC_UNUSED;
10538
      imm2_expr.X_op = O_absent;
10539
      offset_expr.X_op = O_absent;
10540
      offset_reloc[0] = BFD_RELOC_UNUSED;
10541
      offset_reloc[1] = BFD_RELOC_UNUSED;
10542
      offset_reloc[2] = BFD_RELOC_UNUSED;
10543
      for (args = insn->args; 1; ++args)
10544
        {
10545
          int c;
10546
 
10547
          if (*s == ' ')
10548
            ++s;
10549
 
10550
          /* In this switch statement we call break if we did not find
10551
             a match, continue if we did find a match, or return if we
10552
             are done.  */
10553
 
10554
          c = *args;
10555
          switch (c)
10556
            {
10557
            case '\0':
10558
              if (*s == '\0')
10559
                {
10560
                  /* Stuff the immediate value in now, if we can.  */
10561
                  if (imm_expr.X_op == O_constant
10562
                      && *imm_reloc > BFD_RELOC_UNUSED
10563
                      && *imm_reloc != BFD_RELOC_MIPS16_GOT16
10564
                      && *imm_reloc != BFD_RELOC_MIPS16_CALL16
10565
                      && insn->pinfo != INSN_MACRO)
10566
                    {
10567
                      valueT tmp;
10568
 
10569
                      switch (*offset_reloc)
10570
                        {
10571
                          case BFD_RELOC_MIPS16_HI16_S:
10572
                            tmp = (imm_expr.X_add_number + 0x8000) >> 16;
10573
                            break;
10574
 
10575
                          case BFD_RELOC_MIPS16_HI16:
10576
                            tmp = imm_expr.X_add_number >> 16;
10577
                            break;
10578
 
10579
                          case BFD_RELOC_MIPS16_LO16:
10580
                            tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
10581
                                  - 0x8000;
10582
                            break;
10583
 
10584
                          case BFD_RELOC_UNUSED:
10585
                            tmp = imm_expr.X_add_number;
10586
                            break;
10587
 
10588
                          default:
10589
                            internalError ();
10590
                        }
10591
                      *offset_reloc = BFD_RELOC_UNUSED;
10592
 
10593
                      mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
10594
                                    tmp, TRUE, mips16_small,
10595
                                    mips16_ext, &ip->insn_opcode,
10596
                                    &ip->use_extend, &ip->extend);
10597
                      imm_expr.X_op = O_absent;
10598
                      *imm_reloc = BFD_RELOC_UNUSED;
10599
                    }
10600
 
10601
                  return;
10602
                }
10603
              break;
10604
 
10605
            case ',':
10606
              if (*s++ == c)
10607
                continue;
10608
              s--;
10609
              switch (*++args)
10610
                {
10611
                case 'v':
10612
                  MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10613
                  continue;
10614
                case 'w':
10615
                  MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10616
                  continue;
10617
                }
10618
              break;
10619
 
10620
            case '(':
10621
            case ')':
10622
              if (*s++ == c)
10623
                continue;
10624
              break;
10625
 
10626
            case 'v':
10627
            case 'w':
10628
              if (s[0] != '$')
10629
                {
10630
                  if (c == 'v')
10631
                    MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10632
                  else
10633
                    MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10634
                  ++args;
10635
                  continue;
10636
                }
10637
              /* Fall through.  */
10638
            case 'x':
10639
            case 'y':
10640
            case 'z':
10641
            case 'Z':
10642
            case '0':
10643
            case 'S':
10644
            case 'R':
10645
            case 'X':
10646
            case 'Y':
10647
              s_reset = s;
10648
              if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
10649
                {
10650
                  if (c == 'v' || c == 'w')
10651
                    {
10652
                      if (c == 'v')
10653
                        MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10654
                      else
10655
                        MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10656
                      ++args;
10657
                      continue;
10658
                    }
10659
                  break;
10660
                }
10661
 
10662
              if (*s == ' ')
10663
                ++s;
10664
              if (args[1] != *s)
10665
                {
10666
                  if (c == 'v' || c == 'w')
10667
                    {
10668
                      regno = mips16_to_32_reg_map[lastregno];
10669
                      s = s_reset;
10670
                      ++args;
10671
                    }
10672
                }
10673
 
10674
              switch (c)
10675
                {
10676
                case 'x':
10677
                case 'y':
10678
                case 'z':
10679
                case 'v':
10680
                case 'w':
10681
                case 'Z':
10682
                  regno = mips32_to_16_reg_map[regno];
10683
                  break;
10684
 
10685
                case '0':
10686
                  if (regno != 0)
10687
                    regno = ILLEGAL_REG;
10688
                  break;
10689
 
10690
                case 'S':
10691
                  if (regno != SP)
10692
                    regno = ILLEGAL_REG;
10693
                  break;
10694
 
10695
                case 'R':
10696
                  if (regno != RA)
10697
                    regno = ILLEGAL_REG;
10698
                  break;
10699
 
10700
                case 'X':
10701
                case 'Y':
10702
                  if (regno == AT && mips_opts.at)
10703
                    {
10704
                      if (mips_opts.at == ATREG)
10705
                        as_warn (_("used $at without \".set noat\""));
10706
                      else
10707
                        as_warn (_("used $%u with \".set at=$%u\""),
10708
                                 regno, mips_opts.at);
10709
                    }
10710
                  break;
10711
 
10712
                default:
10713
                  internalError ();
10714
                }
10715
 
10716
              if (regno == ILLEGAL_REG)
10717
                break;
10718
 
10719
              switch (c)
10720
                {
10721
                case 'x':
10722
                case 'v':
10723
                  MIPS16_INSERT_OPERAND (RX, *ip, regno);
10724
                  break;
10725
                case 'y':
10726
                case 'w':
10727
                  MIPS16_INSERT_OPERAND (RY, *ip, regno);
10728
                  break;
10729
                case 'z':
10730
                  MIPS16_INSERT_OPERAND (RZ, *ip, regno);
10731
                  break;
10732
                case 'Z':
10733
                  MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
10734
                case '0':
10735
                case 'S':
10736
                case 'R':
10737
                  break;
10738
                case 'X':
10739
                  MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
10740
                  break;
10741
                case 'Y':
10742
                  regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
10743
                  MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
10744
                  break;
10745
                default:
10746
                  internalError ();
10747
                }
10748
 
10749
              lastregno = regno;
10750
              continue;
10751
 
10752
            case 'P':
10753
              if (strncmp (s, "$pc", 3) == 0)
10754
                {
10755
                  s += 3;
10756
                  continue;
10757
                }
10758
              break;
10759
 
10760
            case '5':
10761
            case 'H':
10762
            case 'W':
10763
            case 'D':
10764
            case 'j':
10765
            case 'V':
10766
            case 'C':
10767
            case 'U':
10768
            case 'k':
10769
            case 'K':
10770
              i = my_getSmallExpression (&imm_expr, imm_reloc, s);
10771
              if (i > 0)
10772
                {
10773
                  if (imm_expr.X_op != O_constant)
10774
                    {
10775
                      mips16_ext = TRUE;
10776
                      ip->use_extend = TRUE;
10777
                      ip->extend = 0;
10778
                    }
10779
                  else
10780
                    {
10781
                      /* We need to relax this instruction.  */
10782
                      *offset_reloc = *imm_reloc;
10783
                      *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10784
                    }
10785
                  s = expr_end;
10786
                  continue;
10787
                }
10788
              *imm_reloc = BFD_RELOC_UNUSED;
10789
              /* Fall through.  */
10790
            case '<':
10791
            case '>':
10792
            case '[':
10793
            case ']':
10794
            case '4':
10795
            case '8':
10796
              my_getExpression (&imm_expr, s);
10797
              if (imm_expr.X_op == O_register)
10798
                {
10799
                  /* What we thought was an expression turned out to
10800
                     be a register.  */
10801
 
10802
                  if (s[0] == '(' && args[1] == '(')
10803
                    {
10804
                      /* It looks like the expression was omitted
10805
                         before a register indirection, which means
10806
                         that the expression is implicitly zero.  We
10807
                         still set up imm_expr, so that we handle
10808
                         explicit extensions correctly.  */
10809
                      imm_expr.X_op = O_constant;
10810
                      imm_expr.X_add_number = 0;
10811
                      *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10812
                      continue;
10813
                    }
10814
 
10815
                  break;
10816
                }
10817
 
10818
              /* We need to relax this instruction.  */
10819
              *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10820
              s = expr_end;
10821
              continue;
10822
 
10823
            case 'p':
10824
            case 'q':
10825
            case 'A':
10826
            case 'B':
10827
            case 'E':
10828
              /* We use offset_reloc rather than imm_reloc for the PC
10829
                 relative operands.  This lets macros with both
10830
                 immediate and address operands work correctly.  */
10831
              my_getExpression (&offset_expr, s);
10832
 
10833
              if (offset_expr.X_op == O_register)
10834
                break;
10835
 
10836
              /* We need to relax this instruction.  */
10837
              *offset_reloc = (int) BFD_RELOC_UNUSED + c;
10838
              s = expr_end;
10839
              continue;
10840
 
10841
            case '6':           /* break code */
10842
              my_getExpression (&imm_expr, s);
10843
              check_absolute_expr (ip, &imm_expr);
10844
              if ((unsigned long) imm_expr.X_add_number > 63)
10845
                as_warn (_("Invalid value for `%s' (%lu)"),
10846
                         ip->insn_mo->name,
10847
                         (unsigned long) imm_expr.X_add_number);
10848
              MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
10849
              imm_expr.X_op = O_absent;
10850
              s = expr_end;
10851
              continue;
10852
 
10853
            case 'a':           /* 26 bit address */
10854
              my_getExpression (&offset_expr, s);
10855
              s = expr_end;
10856
              *offset_reloc = BFD_RELOC_MIPS16_JMP;
10857
              ip->insn_opcode <<= 16;
10858
              continue;
10859
 
10860
            case 'l':           /* register list for entry macro */
10861
            case 'L':           /* register list for exit macro */
10862
              {
10863
                int mask;
10864
 
10865
                if (c == 'l')
10866
                  mask = 0;
10867
                else
10868
                  mask = 7 << 3;
10869
                while (*s != '\0')
10870
                  {
10871
                    unsigned int freg, reg1, reg2;
10872
 
10873
                    while (*s == ' ' || *s == ',')
10874
                      ++s;
10875
                    if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10876
                      freg = 0;
10877
                    else if (reg_lookup (&s, RTYPE_FPU, &reg1))
10878
                      freg = 1;
10879
                    else
10880
                      {
10881
                        as_bad (_("can't parse register list"));
10882
                        break;
10883
                      }
10884
                    if (*s == ' ')
10885
                      ++s;
10886
                    if (*s != '-')
10887
                      reg2 = reg1;
10888
                    else
10889
                      {
10890
                        ++s;
10891
                        if (!reg_lookup (&s, freg ? RTYPE_FPU
10892
                                         : (RTYPE_GP | RTYPE_NUM), &reg2))
10893
                          {
10894
                            as_bad (_("invalid register list"));
10895
                            break;
10896
                          }
10897
                      }
10898
                    if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10899
                      {
10900
                        mask &= ~ (7 << 3);
10901
                        mask |= 5 << 3;
10902
                      }
10903
                    else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10904
                      {
10905
                        mask &= ~ (7 << 3);
10906
                        mask |= 6 << 3;
10907
                      }
10908
                    else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
10909
                      mask |= (reg2 - 3) << 3;
10910
                    else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
10911
                      mask |= (reg2 - 15) << 1;
10912
                    else if (reg1 == RA && reg2 == RA)
10913
                      mask |= 1;
10914
                    else
10915
                      {
10916
                        as_bad (_("invalid register list"));
10917
                        break;
10918
                      }
10919
                  }
10920
                /* The mask is filled in in the opcode table for the
10921
                   benefit of the disassembler.  We remove it before
10922
                   applying the actual mask.  */
10923
                ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
10924
                ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
10925
              }
10926
            continue;
10927
 
10928
            case 'm':           /* Register list for save insn.  */
10929
            case 'M':           /* Register list for restore insn.  */
10930
              {
10931
                int opcode = 0;
10932
                int framesz = 0, seen_framesz = 0;
10933
                int nargs = 0, statics = 0, sregs = 0;
10934
 
10935
                while (*s != '\0')
10936
                  {
10937
                    unsigned int reg1, reg2;
10938
 
10939
                    SKIP_SPACE_TABS (s);
10940
                    while (*s == ',')
10941
                      ++s;
10942
                    SKIP_SPACE_TABS (s);
10943
 
10944
                    my_getExpression (&imm_expr, s);
10945
                    if (imm_expr.X_op == O_constant)
10946
                      {
10947
                        /* Handle the frame size.  */
10948
                        if (seen_framesz)
10949
                          {
10950
                            as_bad (_("more than one frame size in list"));
10951
                            break;
10952
                          }
10953
                        seen_framesz = 1;
10954
                        framesz = imm_expr.X_add_number;
10955
                        imm_expr.X_op = O_absent;
10956
                        s = expr_end;
10957
                        continue;
10958
                      }
10959
 
10960
                    if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10961
                      {
10962
                        as_bad (_("can't parse register list"));
10963
                        break;
10964
                      }
10965
 
10966
                    while (*s == ' ')
10967
                      ++s;
10968
 
10969
                    if (*s != '-')
10970
                      reg2 = reg1;
10971
                    else
10972
                      {
10973
                        ++s;
10974
                        if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
10975
                            || reg2 < reg1)
10976
                          {
10977
                            as_bad (_("can't parse register list"));
10978
                            break;
10979
                          }
10980
                      }
10981
 
10982
                    while (reg1 <= reg2)
10983
                      {
10984
                        if (reg1 >= 4 && reg1 <= 7)
10985
                          {
10986
                            if (!seen_framesz)
10987
                                /* args $a0-$a3 */
10988
                                nargs |= 1 << (reg1 - 4);
10989
                            else
10990
                                /* statics $a0-$a3 */
10991
                                statics |= 1 << (reg1 - 4);
10992
                          }
10993
                        else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
10994
                          {
10995
                            /* $s0-$s8 */
10996
                            sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
10997
                          }
10998
                        else if (reg1 == 31)
10999
                          {
11000
                            /* Add $ra to insn.  */
11001
                            opcode |= 0x40;
11002
                          }
11003
                        else
11004
                          {
11005
                            as_bad (_("unexpected register in list"));
11006
                            break;
11007
                          }
11008
                        if (++reg1 == 24)
11009
                          reg1 = 30;
11010
                      }
11011
                  }
11012
 
11013
                /* Encode args/statics combination.  */
11014
                if (nargs & statics)
11015
                  as_bad (_("arg/static registers overlap"));
11016
                else if (nargs == 0xf)
11017
                  /* All $a0-$a3 are args.  */
11018
                  opcode |= MIPS16_ALL_ARGS << 16;
11019
                else if (statics == 0xf)
11020
                  /* All $a0-$a3 are statics.  */
11021
                  opcode |= MIPS16_ALL_STATICS << 16;
11022
                else
11023
                  {
11024
                    int narg = 0, nstat = 0;
11025
 
11026
                    /* Count arg registers.  */
11027
                    while (nargs & 0x1)
11028
                      {
11029
                        nargs >>= 1;
11030
                        narg++;
11031
                      }
11032
                    if (nargs != 0)
11033
                      as_bad (_("invalid arg register list"));
11034
 
11035
                    /* Count static registers.  */
11036
                    while (statics & 0x8)
11037
                      {
11038
                        statics = (statics << 1) & 0xf;
11039
                        nstat++;
11040
                      }
11041
                    if (statics != 0)
11042
                      as_bad (_("invalid static register list"));
11043
 
11044
                    /* Encode args/statics.  */
11045
                    opcode |= ((narg << 2) | nstat) << 16;
11046
                  }
11047
 
11048
                /* Encode $s0/$s1.  */
11049
                if (sregs & (1 << 0))            /* $s0 */
11050
                  opcode |= 0x20;
11051
                if (sregs & (1 << 1))           /* $s1 */
11052
                  opcode |= 0x10;
11053
                sregs >>= 2;
11054
 
11055
                if (sregs != 0)
11056
                  {
11057
                    /* Count regs $s2-$s8.  */
11058
                    int nsreg = 0;
11059
                    while (sregs & 1)
11060
                      {
11061
                        sregs >>= 1;
11062
                        nsreg++;
11063
                      }
11064
                    if (sregs != 0)
11065
                      as_bad (_("invalid static register list"));
11066
                    /* Encode $s2-$s8. */
11067
                    opcode |= nsreg << 24;
11068
                  }
11069
 
11070
                /* Encode frame size.  */
11071
                if (!seen_framesz)
11072
                  as_bad (_("missing frame size"));
11073
                else if ((framesz & 7) != 0 || framesz < 0
11074
                         || framesz > 0xff * 8)
11075
                  as_bad (_("invalid frame size"));
11076
                else if (framesz != 128 || (opcode >> 16) != 0)
11077
                  {
11078
                    framesz /= 8;
11079
                    opcode |= (((framesz & 0xf0) << 16)
11080
                             | (framesz & 0x0f));
11081
                  }
11082
 
11083
                /* Finally build the instruction.  */
11084
                if ((opcode >> 16) != 0 || framesz == 0)
11085
                  {
11086
                    ip->use_extend = TRUE;
11087
                    ip->extend = opcode >> 16;
11088
                  }
11089
                ip->insn_opcode |= opcode & 0x7f;
11090
              }
11091
            continue;
11092
 
11093
            case 'e':           /* extend code */
11094
              my_getExpression (&imm_expr, s);
11095
              check_absolute_expr (ip, &imm_expr);
11096
              if ((unsigned long) imm_expr.X_add_number > 0x7ff)
11097
                {
11098
                  as_warn (_("Invalid value for `%s' (%lu)"),
11099
                           ip->insn_mo->name,
11100
                           (unsigned long) imm_expr.X_add_number);
11101
                  imm_expr.X_add_number &= 0x7ff;
11102
                }
11103
              ip->insn_opcode |= imm_expr.X_add_number;
11104
              imm_expr.X_op = O_absent;
11105
              s = expr_end;
11106
              continue;
11107
 
11108
            default:
11109
              internalError ();
11110
            }
11111
          break;
11112
        }
11113
 
11114
      /* Args don't match.  */
11115
      if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
11116
          strcmp (insn->name, insn[1].name) == 0)
11117
        {
11118
          ++insn;
11119
          s = argsstart;
11120
          continue;
11121
        }
11122
 
11123
      insn_error = _("illegal operands");
11124
 
11125
      return;
11126
    }
11127
}
11128
 
11129
/* This structure holds information we know about a mips16 immediate
11130
   argument type.  */
11131
 
11132
struct mips16_immed_operand
11133
{
11134
  /* The type code used in the argument string in the opcode table.  */
11135
  int type;
11136
  /* The number of bits in the short form of the opcode.  */
11137
  int nbits;
11138
  /* The number of bits in the extended form of the opcode.  */
11139
  int extbits;
11140
  /* The amount by which the short form is shifted when it is used;
11141
     for example, the sw instruction has a shift count of 2.  */
11142
  int shift;
11143
  /* The amount by which the short form is shifted when it is stored
11144
     into the instruction code.  */
11145
  int op_shift;
11146
  /* Non-zero if the short form is unsigned.  */
11147
  int unsp;
11148
  /* Non-zero if the extended form is unsigned.  */
11149
  int extu;
11150
  /* Non-zero if the value is PC relative.  */
11151
  int pcrel;
11152
};
11153
 
11154
/* The mips16 immediate operand types.  */
11155
 
11156
static const struct mips16_immed_operand mips16_immed_operands[] =
11157
{
11158
  { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
11159
  { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
11160
  { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
11161
  { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
11162
  { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
11163
  { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
11164
  { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
11165
  { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
11166
  { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
11167
  { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
11168
  { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
11169
  { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
11170
  { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
11171
  { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
11172
  { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
11173
  { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
11174
  { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
11175
  { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
11176
  { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
11177
  { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
11178
  { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
11179
};
11180
 
11181
#define MIPS16_NUM_IMMED \
11182
  (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
11183
 
11184
/* Handle a mips16 instruction with an immediate value.  This or's the
11185
   small immediate value into *INSN.  It sets *USE_EXTEND to indicate
11186
   whether an extended value is needed; if one is needed, it sets
11187
   *EXTEND to the value.  The argument type is TYPE.  The value is VAL.
11188
   If SMALL is true, an unextended opcode was explicitly requested.
11189
   If EXT is true, an extended opcode was explicitly requested.  If
11190
   WARN is true, warn if EXT does not match reality.  */
11191
 
11192
static void
11193
mips16_immed (char *file, unsigned int line, int type, offsetT val,
11194
              bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
11195
              unsigned long *insn, bfd_boolean *use_extend,
11196
              unsigned short *extend)
11197
{
11198
  const struct mips16_immed_operand *op;
11199
  int mintiny, maxtiny;
11200
  bfd_boolean needext;
11201
 
11202
  op = mips16_immed_operands;
11203
  while (op->type != type)
11204
    {
11205
      ++op;
11206
      gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
11207
    }
11208
 
11209
  if (op->unsp)
11210
    {
11211
      if (type == '<' || type == '>' || type == '[' || type == ']')
11212
        {
11213
          mintiny = 1;
11214
          maxtiny = 1 << op->nbits;
11215
        }
11216
      else
11217
        {
11218
          mintiny = 0;
11219
          maxtiny = (1 << op->nbits) - 1;
11220
        }
11221
    }
11222
  else
11223
    {
11224
      mintiny = - (1 << (op->nbits - 1));
11225
      maxtiny = (1 << (op->nbits - 1)) - 1;
11226
    }
11227
 
11228
  /* Branch offsets have an implicit 0 in the lowest bit.  */
11229
  if (type == 'p' || type == 'q')
11230
    val /= 2;
11231
 
11232
  if ((val & ((1 << op->shift) - 1)) != 0
11233
      || val < (mintiny << op->shift)
11234
      || val > (maxtiny << op->shift))
11235
    needext = TRUE;
11236
  else
11237
    needext = FALSE;
11238
 
11239
  if (warn && ext && ! needext)
11240
    as_warn_where (file, line,
11241
                   _("extended operand requested but not required"));
11242
  if (small && needext)
11243
    as_bad_where (file, line, _("invalid unextended operand value"));
11244
 
11245
  if (small || (! ext && ! needext))
11246
    {
11247
      int insnval;
11248
 
11249
      *use_extend = FALSE;
11250
      insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
11251
      insnval <<= op->op_shift;
11252
      *insn |= insnval;
11253
    }
11254
  else
11255
    {
11256
      long minext, maxext;
11257
      int extval;
11258
 
11259
      if (op->extu)
11260
        {
11261
          minext = 0;
11262
          maxext = (1 << op->extbits) - 1;
11263
        }
11264
      else
11265
        {
11266
          minext = - (1 << (op->extbits - 1));
11267
          maxext = (1 << (op->extbits - 1)) - 1;
11268
        }
11269
      if (val < minext || val > maxext)
11270
        as_bad_where (file, line,
11271
                      _("operand value out of range for instruction"));
11272
 
11273
      *use_extend = TRUE;
11274
      if (op->extbits == 16)
11275
        {
11276
          extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
11277
          val &= 0x1f;
11278
        }
11279
      else if (op->extbits == 15)
11280
        {
11281
          extval = ((val >> 11) & 0xf) | (val & 0x7f0);
11282
          val &= 0xf;
11283
        }
11284
      else
11285
        {
11286
          extval = ((val & 0x1f) << 6) | (val & 0x20);
11287
          val = 0;
11288
        }
11289
 
11290
      *extend = (unsigned short) extval;
11291
      *insn |= val;
11292
    }
11293
}
11294
 
11295
struct percent_op_match
11296
{
11297
  const char *str;
11298
  bfd_reloc_code_real_type reloc;
11299
};
11300
 
11301
static const struct percent_op_match mips_percent_op[] =
11302
{
11303
  {"%lo", BFD_RELOC_LO16},
11304
#ifdef OBJ_ELF
11305
  {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
11306
  {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
11307
  {"%call16", BFD_RELOC_MIPS_CALL16},
11308
  {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
11309
  {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
11310
  {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
11311
  {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
11312
  {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
11313
  {"%got", BFD_RELOC_MIPS_GOT16},
11314
  {"%gp_rel", BFD_RELOC_GPREL16},
11315
  {"%half", BFD_RELOC_16},
11316
  {"%highest", BFD_RELOC_MIPS_HIGHEST},
11317
  {"%higher", BFD_RELOC_MIPS_HIGHER},
11318
  {"%neg", BFD_RELOC_MIPS_SUB},
11319
  {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
11320
  {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
11321
  {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
11322
  {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
11323
  {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
11324
  {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
11325
  {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
11326
#endif
11327
  {"%hi", BFD_RELOC_HI16_S}
11328
};
11329
 
11330
static const struct percent_op_match mips16_percent_op[] =
11331
{
11332
  {"%lo", BFD_RELOC_MIPS16_LO16},
11333
  {"%gprel", BFD_RELOC_MIPS16_GPREL},
11334
  {"%got", BFD_RELOC_MIPS16_GOT16},
11335
  {"%call16", BFD_RELOC_MIPS16_CALL16},
11336
  {"%hi", BFD_RELOC_MIPS16_HI16_S}
11337
};
11338
 
11339
 
11340
/* Return true if *STR points to a relocation operator.  When returning true,
11341
   move *STR over the operator and store its relocation code in *RELOC.
11342
   Leave both *STR and *RELOC alone when returning false.  */
11343
 
11344
static bfd_boolean
11345
parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
11346
{
11347
  const struct percent_op_match *percent_op;
11348
  size_t limit, i;
11349
 
11350
  if (mips_opts.mips16)
11351
    {
11352
      percent_op = mips16_percent_op;
11353
      limit = ARRAY_SIZE (mips16_percent_op);
11354
    }
11355
  else
11356
    {
11357
      percent_op = mips_percent_op;
11358
      limit = ARRAY_SIZE (mips_percent_op);
11359
    }
11360
 
11361
  for (i = 0; i < limit; i++)
11362
    if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
11363
      {
11364
        int len = strlen (percent_op[i].str);
11365
 
11366
        if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
11367
          continue;
11368
 
11369
        *str += strlen (percent_op[i].str);
11370
        *reloc = percent_op[i].reloc;
11371
 
11372
        /* Check whether the output BFD supports this relocation.
11373
           If not, issue an error and fall back on something safe.  */
11374
        if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
11375
          {
11376
            as_bad (_("relocation %s isn't supported by the current ABI"),
11377
                    percent_op[i].str);
11378
            *reloc = BFD_RELOC_UNUSED;
11379
          }
11380
        return TRUE;
11381
      }
11382
  return FALSE;
11383
}
11384
 
11385
 
11386
/* Parse string STR as a 16-bit relocatable operand.  Store the
11387
   expression in *EP and the relocations in the array starting
11388
   at RELOC.  Return the number of relocation operators used.
11389
 
11390
   On exit, EXPR_END points to the first character after the expression.  */
11391
 
11392
static size_t
11393
my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
11394
                       char *str)
11395
{
11396
  bfd_reloc_code_real_type reversed_reloc[3];
11397
  size_t reloc_index, i;
11398
  int crux_depth, str_depth;
11399
  char *crux;
11400
 
11401
  /* Search for the start of the main expression, recoding relocations
11402
     in REVERSED_RELOC.  End the loop with CRUX pointing to the start
11403
     of the main expression and with CRUX_DEPTH containing the number
11404
     of open brackets at that point.  */
11405
  reloc_index = -1;
11406
  str_depth = 0;
11407
  do
11408
    {
11409
      reloc_index++;
11410
      crux = str;
11411
      crux_depth = str_depth;
11412
 
11413
      /* Skip over whitespace and brackets, keeping count of the number
11414
         of brackets.  */
11415
      while (*str == ' ' || *str == '\t' || *str == '(')
11416
        if (*str++ == '(')
11417
          str_depth++;
11418
    }
11419
  while (*str == '%'
11420
         && reloc_index < (HAVE_NEWABI ? 3 : 1)
11421
         && parse_relocation (&str, &reversed_reloc[reloc_index]));
11422
 
11423
  my_getExpression (ep, crux);
11424
  str = expr_end;
11425
 
11426
  /* Match every open bracket.  */
11427
  while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
11428
    if (*str++ == ')')
11429
      crux_depth--;
11430
 
11431
  if (crux_depth > 0)
11432
    as_bad (_("unclosed '('"));
11433
 
11434
  expr_end = str;
11435
 
11436
  if (reloc_index != 0)
11437
    {
11438
      prev_reloc_op_frag = frag_now;
11439
      for (i = 0; i < reloc_index; i++)
11440
        reloc[i] = reversed_reloc[reloc_index - 1 - i];
11441
    }
11442
 
11443
  return reloc_index;
11444
}
11445
 
11446
static void
11447
my_getExpression (expressionS *ep, char *str)
11448
{
11449
  char *save_in;
11450
 
11451
  save_in = input_line_pointer;
11452
  input_line_pointer = str;
11453
  expression (ep);
11454
  expr_end = input_line_pointer;
11455
  input_line_pointer = save_in;
11456
}
11457
 
11458
char *
11459
md_atof (int type, char *litP, int *sizeP)
11460
{
11461
  return ieee_md_atof (type, litP, sizeP, target_big_endian);
11462
}
11463
 
11464
void
11465
md_number_to_chars (char *buf, valueT val, int n)
11466
{
11467
  if (target_big_endian)
11468
    number_to_chars_bigendian (buf, val, n);
11469
  else
11470
    number_to_chars_littleendian (buf, val, n);
11471
}
11472
 
11473
#ifdef OBJ_ELF
11474
static int support_64bit_objects(void)
11475
{
11476
  const char **list, **l;
11477
  int yes;
11478
 
11479
  list = bfd_target_list ();
11480
  for (l = list; *l != NULL; l++)
11481
    if (strcmp (*l, ELF_TARGET ("elf64-", "big")) == 0
11482
        || strcmp (*l, ELF_TARGET ("elf64-", "little")) == 0)
11483
      break;
11484
  yes = (*l != NULL);
11485
  free (list);
11486
  return yes;
11487
}
11488
#endif /* OBJ_ELF */
11489
 
11490
const char *md_shortopts = "O::g::G:";
11491
 
11492
enum options
11493
  {
11494
    OPTION_MARCH = OPTION_MD_BASE,
11495
    OPTION_MTUNE,
11496
    OPTION_MIPS1,
11497
    OPTION_MIPS2,
11498
    OPTION_MIPS3,
11499
    OPTION_MIPS4,
11500
    OPTION_MIPS5,
11501
    OPTION_MIPS32,
11502
    OPTION_MIPS64,
11503
    OPTION_MIPS32R2,
11504
    OPTION_MIPS64R2,
11505
    OPTION_MIPS16,
11506
    OPTION_NO_MIPS16,
11507
    OPTION_MIPS3D,
11508
    OPTION_NO_MIPS3D,
11509
    OPTION_MDMX,
11510
    OPTION_NO_MDMX,
11511
    OPTION_DSP,
11512
    OPTION_NO_DSP,
11513
    OPTION_MT,
11514
    OPTION_NO_MT,
11515
    OPTION_SMARTMIPS,
11516
    OPTION_NO_SMARTMIPS,
11517
    OPTION_DSPR2,
11518
    OPTION_NO_DSPR2,
11519
    OPTION_COMPAT_ARCH_BASE,
11520
    OPTION_M4650,
11521
    OPTION_NO_M4650,
11522
    OPTION_M4010,
11523
    OPTION_NO_M4010,
11524
    OPTION_M4100,
11525
    OPTION_NO_M4100,
11526
    OPTION_M3900,
11527
    OPTION_NO_M3900,
11528
    OPTION_M7000_HILO_FIX,
11529
    OPTION_MNO_7000_HILO_FIX,
11530
    OPTION_FIX_24K,
11531
    OPTION_NO_FIX_24K,
11532
    OPTION_FIX_LOONGSON2F_JUMP,
11533
    OPTION_NO_FIX_LOONGSON2F_JUMP,
11534
    OPTION_FIX_LOONGSON2F_NOP,
11535
    OPTION_NO_FIX_LOONGSON2F_NOP,
11536
    OPTION_FIX_VR4120,
11537
    OPTION_NO_FIX_VR4120,
11538
    OPTION_FIX_VR4130,
11539
    OPTION_NO_FIX_VR4130,
11540
    OPTION_FIX_CN63XXP1,
11541
    OPTION_NO_FIX_CN63XXP1,
11542
    OPTION_TRAP,
11543
    OPTION_BREAK,
11544
    OPTION_EB,
11545
    OPTION_EL,
11546
    OPTION_FP32,
11547
    OPTION_GP32,
11548
    OPTION_CONSTRUCT_FLOATS,
11549
    OPTION_NO_CONSTRUCT_FLOATS,
11550
    OPTION_FP64,
11551
    OPTION_GP64,
11552
    OPTION_RELAX_BRANCH,
11553
    OPTION_NO_RELAX_BRANCH,
11554
    OPTION_MSHARED,
11555
    OPTION_MNO_SHARED,
11556
    OPTION_MSYM32,
11557
    OPTION_MNO_SYM32,
11558
    OPTION_SOFT_FLOAT,
11559
    OPTION_HARD_FLOAT,
11560
    OPTION_SINGLE_FLOAT,
11561
    OPTION_DOUBLE_FLOAT,
11562
    OPTION_32,
11563
#ifdef OBJ_ELF
11564
    OPTION_CALL_SHARED,
11565
    OPTION_CALL_NONPIC,
11566
    OPTION_NON_SHARED,
11567
    OPTION_XGOT,
11568
    OPTION_MABI,
11569
    OPTION_N32,
11570
    OPTION_64,
11571
    OPTION_MDEBUG,
11572
    OPTION_NO_MDEBUG,
11573
    OPTION_PDR,
11574
    OPTION_NO_PDR,
11575
    OPTION_MVXWORKS_PIC,
11576
#endif /* OBJ_ELF */
11577
    OPTION_END_OF_ENUM
11578
  };
11579
 
11580
struct option md_longopts[] =
11581
{
11582
  /* Options which specify architecture.  */
11583
  {"march", required_argument, NULL, OPTION_MARCH},
11584
  {"mtune", required_argument, NULL, OPTION_MTUNE},
11585
  {"mips0", no_argument, NULL, OPTION_MIPS1},
11586
  {"mips1", no_argument, NULL, OPTION_MIPS1},
11587
  {"mips2", no_argument, NULL, OPTION_MIPS2},
11588
  {"mips3", no_argument, NULL, OPTION_MIPS3},
11589
  {"mips4", no_argument, NULL, OPTION_MIPS4},
11590
  {"mips5", no_argument, NULL, OPTION_MIPS5},
11591
  {"mips32", no_argument, NULL, OPTION_MIPS32},
11592
  {"mips64", no_argument, NULL, OPTION_MIPS64},
11593
  {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
11594
  {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
11595
 
11596
  /* Options which specify Application Specific Extensions (ASEs).  */
11597
  {"mips16", no_argument, NULL, OPTION_MIPS16},
11598
  {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
11599
  {"mips3d", no_argument, NULL, OPTION_MIPS3D},
11600
  {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
11601
  {"mdmx", no_argument, NULL, OPTION_MDMX},
11602
  {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
11603
  {"mdsp", no_argument, NULL, OPTION_DSP},
11604
  {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
11605
  {"mmt", no_argument, NULL, OPTION_MT},
11606
  {"mno-mt", no_argument, NULL, OPTION_NO_MT},
11607
  {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
11608
  {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
11609
  {"mdspr2", no_argument, NULL, OPTION_DSPR2},
11610
  {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
11611
 
11612
  /* Old-style architecture options.  Don't add more of these.  */
11613
  {"m4650", no_argument, NULL, OPTION_M4650},
11614
  {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
11615
  {"m4010", no_argument, NULL, OPTION_M4010},
11616
  {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
11617
  {"m4100", no_argument, NULL, OPTION_M4100},
11618
  {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
11619
  {"m3900", no_argument, NULL, OPTION_M3900},
11620
  {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
11621
 
11622
  /* Options which enable bug fixes.  */
11623
  {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
11624
  {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11625
  {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11626
  {"mfix-loongson2f-jump", no_argument, NULL, OPTION_FIX_LOONGSON2F_JUMP},
11627
  {"mno-fix-loongson2f-jump", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_JUMP},
11628
  {"mfix-loongson2f-nop", no_argument, NULL, OPTION_FIX_LOONGSON2F_NOP},
11629
  {"mno-fix-loongson2f-nop", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_NOP},
11630
  {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
11631
  {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
11632
  {"mfix-vr4130",    no_argument, NULL, OPTION_FIX_VR4130},
11633
  {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
11634
  {"mfix-24k",    no_argument, NULL, OPTION_FIX_24K},
11635
  {"mno-fix-24k", no_argument, NULL, OPTION_NO_FIX_24K},
11636
  {"mfix-cn63xxp1", no_argument, NULL, OPTION_FIX_CN63XXP1},
11637
  {"mno-fix-cn63xxp1", no_argument, NULL, OPTION_NO_FIX_CN63XXP1},
11638
 
11639
  /* Miscellaneous options.  */
11640
  {"trap", no_argument, NULL, OPTION_TRAP},
11641
  {"no-break", no_argument, NULL, OPTION_TRAP},
11642
  {"break", no_argument, NULL, OPTION_BREAK},
11643
  {"no-trap", no_argument, NULL, OPTION_BREAK},
11644
  {"EB", no_argument, NULL, OPTION_EB},
11645
  {"EL", no_argument, NULL, OPTION_EL},
11646
  {"mfp32", no_argument, NULL, OPTION_FP32},
11647
  {"mgp32", no_argument, NULL, OPTION_GP32},
11648
  {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
11649
  {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
11650
  {"mfp64", no_argument, NULL, OPTION_FP64},
11651
  {"mgp64", no_argument, NULL, OPTION_GP64},
11652
  {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
11653
  {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
11654
  {"mshared", no_argument, NULL, OPTION_MSHARED},
11655
  {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
11656
  {"msym32", no_argument, NULL, OPTION_MSYM32},
11657
  {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
11658
  {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
11659
  {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
11660
  {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
11661
  {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
11662
 
11663
  /* Strictly speaking this next option is ELF specific,
11664
     but we allow it for other ports as well in order to
11665
     make testing easier.  */
11666
  {"32",          no_argument, NULL, OPTION_32},
11667
 
11668
  /* ELF-specific options.  */
11669
#ifdef OBJ_ELF
11670
  {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
11671
  {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
11672
  {"call_nonpic", no_argument, NULL, OPTION_CALL_NONPIC},
11673
  {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
11674
  {"xgot",        no_argument, NULL, OPTION_XGOT},
11675
  {"mabi", required_argument, NULL, OPTION_MABI},
11676
  {"n32",         no_argument, NULL, OPTION_N32},
11677
  {"64",          no_argument, NULL, OPTION_64},
11678
  {"mdebug", no_argument, NULL, OPTION_MDEBUG},
11679
  {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
11680
  {"mpdr", no_argument, NULL, OPTION_PDR},
11681
  {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
11682
  {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
11683
#endif /* OBJ_ELF */
11684
 
11685
  {NULL, no_argument, NULL, 0}
11686
};
11687
size_t md_longopts_size = sizeof (md_longopts);
11688
 
11689
/* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
11690
   NEW_VALUE.  Warn if another value was already specified.  Note:
11691
   we have to defer parsing the -march and -mtune arguments in order
11692
   to handle 'from-abi' correctly, since the ABI might be specified
11693
   in a later argument.  */
11694
 
11695
static void
11696
mips_set_option_string (const char **string_ptr, const char *new_value)
11697
{
11698
  if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
11699
    as_warn (_("A different %s was already specified, is now %s"),
11700
             string_ptr == &mips_arch_string ? "-march" : "-mtune",
11701
             new_value);
11702
 
11703
  *string_ptr = new_value;
11704
}
11705
 
11706
int
11707
md_parse_option (int c, char *arg)
11708
{
11709
  switch (c)
11710
    {
11711
    case OPTION_CONSTRUCT_FLOATS:
11712
      mips_disable_float_construction = 0;
11713
      break;
11714
 
11715
    case OPTION_NO_CONSTRUCT_FLOATS:
11716
      mips_disable_float_construction = 1;
11717
      break;
11718
 
11719
    case OPTION_TRAP:
11720
      mips_trap = 1;
11721
      break;
11722
 
11723
    case OPTION_BREAK:
11724
      mips_trap = 0;
11725
      break;
11726
 
11727
    case OPTION_EB:
11728
      target_big_endian = 1;
11729
      break;
11730
 
11731
    case OPTION_EL:
11732
      target_big_endian = 0;
11733
      break;
11734
 
11735
    case 'O':
11736
      if (arg == NULL)
11737
        mips_optimize = 1;
11738
      else if (arg[0] == '0')
11739
        mips_optimize = 0;
11740
      else if (arg[0] == '1')
11741
        mips_optimize = 1;
11742
      else
11743
        mips_optimize = 2;
11744
      break;
11745
 
11746
    case 'g':
11747
      if (arg == NULL)
11748
        mips_debug = 2;
11749
      else
11750
        mips_debug = atoi (arg);
11751
      break;
11752
 
11753
    case OPTION_MIPS1:
11754
      file_mips_isa = ISA_MIPS1;
11755
      break;
11756
 
11757
    case OPTION_MIPS2:
11758
      file_mips_isa = ISA_MIPS2;
11759
      break;
11760
 
11761
    case OPTION_MIPS3:
11762
      file_mips_isa = ISA_MIPS3;
11763
      break;
11764
 
11765
    case OPTION_MIPS4:
11766
      file_mips_isa = ISA_MIPS4;
11767
      break;
11768
 
11769
    case OPTION_MIPS5:
11770
      file_mips_isa = ISA_MIPS5;
11771
      break;
11772
 
11773
    case OPTION_MIPS32:
11774
      file_mips_isa = ISA_MIPS32;
11775
      break;
11776
 
11777
    case OPTION_MIPS32R2:
11778
      file_mips_isa = ISA_MIPS32R2;
11779
      break;
11780
 
11781
    case OPTION_MIPS64R2:
11782
      file_mips_isa = ISA_MIPS64R2;
11783
      break;
11784
 
11785
    case OPTION_MIPS64:
11786
      file_mips_isa = ISA_MIPS64;
11787
      break;
11788
 
11789
    case OPTION_MTUNE:
11790
      mips_set_option_string (&mips_tune_string, arg);
11791
      break;
11792
 
11793
    case OPTION_MARCH:
11794
      mips_set_option_string (&mips_arch_string, arg);
11795
      break;
11796
 
11797
    case OPTION_M4650:
11798
      mips_set_option_string (&mips_arch_string, "4650");
11799
      mips_set_option_string (&mips_tune_string, "4650");
11800
      break;
11801
 
11802
    case OPTION_NO_M4650:
11803
      break;
11804
 
11805
    case OPTION_M4010:
11806
      mips_set_option_string (&mips_arch_string, "4010");
11807
      mips_set_option_string (&mips_tune_string, "4010");
11808
      break;
11809
 
11810
    case OPTION_NO_M4010:
11811
      break;
11812
 
11813
    case OPTION_M4100:
11814
      mips_set_option_string (&mips_arch_string, "4100");
11815
      mips_set_option_string (&mips_tune_string, "4100");
11816
      break;
11817
 
11818
    case OPTION_NO_M4100:
11819
      break;
11820
 
11821
    case OPTION_M3900:
11822
      mips_set_option_string (&mips_arch_string, "3900");
11823
      mips_set_option_string (&mips_tune_string, "3900");
11824
      break;
11825
 
11826
    case OPTION_NO_M3900:
11827
      break;
11828
 
11829
    case OPTION_MDMX:
11830
      mips_opts.ase_mdmx = 1;
11831
      break;
11832
 
11833
    case OPTION_NO_MDMX:
11834
      mips_opts.ase_mdmx = 0;
11835
      break;
11836
 
11837
    case OPTION_DSP:
11838
      mips_opts.ase_dsp = 1;
11839
      mips_opts.ase_dspr2 = 0;
11840
      break;
11841
 
11842
    case OPTION_NO_DSP:
11843
      mips_opts.ase_dsp = 0;
11844
      mips_opts.ase_dspr2 = 0;
11845
      break;
11846
 
11847
    case OPTION_DSPR2:
11848
      mips_opts.ase_dspr2 = 1;
11849
      mips_opts.ase_dsp = 1;
11850
      break;
11851
 
11852
    case OPTION_NO_DSPR2:
11853
      mips_opts.ase_dspr2 = 0;
11854
      mips_opts.ase_dsp = 0;
11855
      break;
11856
 
11857
    case OPTION_MT:
11858
      mips_opts.ase_mt = 1;
11859
      break;
11860
 
11861
    case OPTION_NO_MT:
11862
      mips_opts.ase_mt = 0;
11863
      break;
11864
 
11865
    case OPTION_MIPS16:
11866
      mips_opts.mips16 = 1;
11867
      mips_no_prev_insn ();
11868
      break;
11869
 
11870
    case OPTION_NO_MIPS16:
11871
      mips_opts.mips16 = 0;
11872
      mips_no_prev_insn ();
11873
      break;
11874
 
11875
    case OPTION_MIPS3D:
11876
      mips_opts.ase_mips3d = 1;
11877
      break;
11878
 
11879
    case OPTION_NO_MIPS3D:
11880
      mips_opts.ase_mips3d = 0;
11881
      break;
11882
 
11883
    case OPTION_SMARTMIPS:
11884
      mips_opts.ase_smartmips = 1;
11885
      break;
11886
 
11887
    case OPTION_NO_SMARTMIPS:
11888
      mips_opts.ase_smartmips = 0;
11889
      break;
11890
 
11891
    case OPTION_FIX_24K:
11892
      mips_fix_24k = 1;
11893
      break;
11894
 
11895
    case OPTION_NO_FIX_24K:
11896
      mips_fix_24k = 0;
11897
      break;
11898
 
11899
    case OPTION_FIX_LOONGSON2F_JUMP:
11900
      mips_fix_loongson2f_jump = TRUE;
11901
      break;
11902
 
11903
    case OPTION_NO_FIX_LOONGSON2F_JUMP:
11904
      mips_fix_loongson2f_jump = FALSE;
11905
      break;
11906
 
11907
    case OPTION_FIX_LOONGSON2F_NOP:
11908
      mips_fix_loongson2f_nop = TRUE;
11909
      break;
11910
 
11911
    case OPTION_NO_FIX_LOONGSON2F_NOP:
11912
      mips_fix_loongson2f_nop = FALSE;
11913
      break;
11914
 
11915
    case OPTION_FIX_VR4120:
11916
      mips_fix_vr4120 = 1;
11917
      break;
11918
 
11919
    case OPTION_NO_FIX_VR4120:
11920
      mips_fix_vr4120 = 0;
11921
      break;
11922
 
11923
    case OPTION_FIX_VR4130:
11924
      mips_fix_vr4130 = 1;
11925
      break;
11926
 
11927
    case OPTION_NO_FIX_VR4130:
11928
      mips_fix_vr4130 = 0;
11929
      break;
11930
 
11931
    case OPTION_FIX_CN63XXP1:
11932
      mips_fix_cn63xxp1 = TRUE;
11933
      break;
11934
 
11935
    case OPTION_NO_FIX_CN63XXP1:
11936
      mips_fix_cn63xxp1 = FALSE;
11937
      break;
11938
 
11939
    case OPTION_RELAX_BRANCH:
11940
      mips_relax_branch = 1;
11941
      break;
11942
 
11943
    case OPTION_NO_RELAX_BRANCH:
11944
      mips_relax_branch = 0;
11945
      break;
11946
 
11947
    case OPTION_MSHARED:
11948
      mips_in_shared = TRUE;
11949
      break;
11950
 
11951
    case OPTION_MNO_SHARED:
11952
      mips_in_shared = FALSE;
11953
      break;
11954
 
11955
    case OPTION_MSYM32:
11956
      mips_opts.sym32 = TRUE;
11957
      break;
11958
 
11959
    case OPTION_MNO_SYM32:
11960
      mips_opts.sym32 = FALSE;
11961
      break;
11962
 
11963
#ifdef OBJ_ELF
11964
      /* When generating ELF code, we permit -KPIC and -call_shared to
11965
         select SVR4_PIC, and -non_shared to select no PIC.  This is
11966
         intended to be compatible with Irix 5.  */
11967
    case OPTION_CALL_SHARED:
11968
      if (!IS_ELF)
11969
        {
11970
          as_bad (_("-call_shared is supported only for ELF format"));
11971
          return 0;
11972
        }
11973
      mips_pic = SVR4_PIC;
11974
      mips_abicalls = TRUE;
11975
      break;
11976
 
11977
    case OPTION_CALL_NONPIC:
11978
      if (!IS_ELF)
11979
        {
11980
          as_bad (_("-call_nonpic is supported only for ELF format"));
11981
          return 0;
11982
        }
11983
      mips_pic = NO_PIC;
11984
      mips_abicalls = TRUE;
11985
      break;
11986
 
11987
    case OPTION_NON_SHARED:
11988
      if (!IS_ELF)
11989
        {
11990
          as_bad (_("-non_shared is supported only for ELF format"));
11991
          return 0;
11992
        }
11993
      mips_pic = NO_PIC;
11994
      mips_abicalls = FALSE;
11995
      break;
11996
 
11997
      /* The -xgot option tells the assembler to use 32 bit offsets
11998
         when accessing the got in SVR4_PIC mode.  It is for Irix
11999
         compatibility.  */
12000
    case OPTION_XGOT:
12001
      mips_big_got = 1;
12002
      break;
12003
#endif /* OBJ_ELF */
12004
 
12005
    case 'G':
12006
      g_switch_value = atoi (arg);
12007
      g_switch_seen = 1;
12008
      break;
12009
 
12010
      /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
12011
         and -mabi=64.  */
12012
    case OPTION_32:
12013
      if (IS_ELF)
12014
        mips_abi = O32_ABI;
12015
      /* We silently ignore -32 for non-ELF targets.  This greatly
12016
         simplifies the construction of the MIPS GAS test cases.  */
12017
      break;
12018
 
12019
#ifdef OBJ_ELF
12020
    case OPTION_N32:
12021
      if (!IS_ELF)
12022
        {
12023
          as_bad (_("-n32 is supported for ELF format only"));
12024
          return 0;
12025
        }
12026
      mips_abi = N32_ABI;
12027
      break;
12028
 
12029
    case OPTION_64:
12030
      if (!IS_ELF)
12031
        {
12032
          as_bad (_("-64 is supported for ELF format only"));
12033
          return 0;
12034
        }
12035
      mips_abi = N64_ABI;
12036
      if (!support_64bit_objects())
12037
        as_fatal (_("No compiled in support for 64 bit object file format"));
12038
      break;
12039
#endif /* OBJ_ELF */
12040
 
12041
    case OPTION_GP32:
12042
      file_mips_gp32 = 1;
12043
      break;
12044
 
12045
    case OPTION_GP64:
12046
      file_mips_gp32 = 0;
12047
      break;
12048
 
12049
    case OPTION_FP32:
12050
      file_mips_fp32 = 1;
12051
      break;
12052
 
12053
    case OPTION_FP64:
12054
      file_mips_fp32 = 0;
12055
      break;
12056
 
12057
    case OPTION_SINGLE_FLOAT:
12058
      file_mips_single_float = 1;
12059
      break;
12060
 
12061
    case OPTION_DOUBLE_FLOAT:
12062
      file_mips_single_float = 0;
12063
      break;
12064
 
12065
    case OPTION_SOFT_FLOAT:
12066
      file_mips_soft_float = 1;
12067
      break;
12068
 
12069
    case OPTION_HARD_FLOAT:
12070
      file_mips_soft_float = 0;
12071
      break;
12072
 
12073
#ifdef OBJ_ELF
12074
    case OPTION_MABI:
12075
      if (!IS_ELF)
12076
        {
12077
          as_bad (_("-mabi is supported for ELF format only"));
12078
          return 0;
12079
        }
12080
      if (strcmp (arg, "32") == 0)
12081
        mips_abi = O32_ABI;
12082
      else if (strcmp (arg, "o64") == 0)
12083
        mips_abi = O64_ABI;
12084
      else if (strcmp (arg, "n32") == 0)
12085
        mips_abi = N32_ABI;
12086
      else if (strcmp (arg, "64") == 0)
12087
        {
12088
          mips_abi = N64_ABI;
12089
          if (! support_64bit_objects())
12090
            as_fatal (_("No compiled in support for 64 bit object file "
12091
                        "format"));
12092
        }
12093
      else if (strcmp (arg, "eabi") == 0)
12094
        mips_abi = EABI_ABI;
12095
      else
12096
        {
12097
          as_fatal (_("invalid abi -mabi=%s"), arg);
12098
          return 0;
12099
        }
12100
      break;
12101
#endif /* OBJ_ELF */
12102
 
12103
    case OPTION_M7000_HILO_FIX:
12104
      mips_7000_hilo_fix = TRUE;
12105
      break;
12106
 
12107
    case OPTION_MNO_7000_HILO_FIX:
12108
      mips_7000_hilo_fix = FALSE;
12109
      break;
12110
 
12111
#ifdef OBJ_ELF
12112
    case OPTION_MDEBUG:
12113
      mips_flag_mdebug = TRUE;
12114
      break;
12115
 
12116
    case OPTION_NO_MDEBUG:
12117
      mips_flag_mdebug = FALSE;
12118
      break;
12119
 
12120
    case OPTION_PDR:
12121
      mips_flag_pdr = TRUE;
12122
      break;
12123
 
12124
    case OPTION_NO_PDR:
12125
      mips_flag_pdr = FALSE;
12126
      break;
12127
 
12128
    case OPTION_MVXWORKS_PIC:
12129
      mips_pic = VXWORKS_PIC;
12130
      break;
12131
#endif /* OBJ_ELF */
12132
 
12133
    default:
12134
      return 0;
12135
    }
12136
 
12137
    mips_fix_loongson2f = mips_fix_loongson2f_nop || mips_fix_loongson2f_jump;
12138
 
12139
  return 1;
12140
}
12141
 
12142
/* Set up globals to generate code for the ISA or processor
12143
   described by INFO.  */
12144
 
12145
static void
12146
mips_set_architecture (const struct mips_cpu_info *info)
12147
{
12148
  if (info != 0)
12149
    {
12150
      file_mips_arch = info->cpu;
12151
      mips_opts.arch = info->cpu;
12152
      mips_opts.isa = info->isa;
12153
    }
12154
}
12155
 
12156
 
12157
/* Likewise for tuning.  */
12158
 
12159
static void
12160
mips_set_tune (const struct mips_cpu_info *info)
12161
{
12162
  if (info != 0)
12163
    mips_tune = info->cpu;
12164
}
12165
 
12166
 
12167
void
12168
mips_after_parse_args (void)
12169
{
12170
  const struct mips_cpu_info *arch_info = 0;
12171
  const struct mips_cpu_info *tune_info = 0;
12172
 
12173
  /* GP relative stuff not working for PE */
12174
  if (strncmp (TARGET_OS, "pe", 2) == 0)
12175
    {
12176
      if (g_switch_seen && g_switch_value != 0)
12177
        as_bad (_("-G not supported in this configuration."));
12178
      g_switch_value = 0;
12179
    }
12180
 
12181
  if (mips_abi == NO_ABI)
12182
    mips_abi = MIPS_DEFAULT_ABI;
12183
 
12184
  /* The following code determines the architecture and register size.
12185
     Similar code was added to GCC 3.3 (see override_options() in
12186
     config/mips/mips.c).  The GAS and GCC code should be kept in sync
12187
     as much as possible.  */
12188
 
12189
  if (mips_arch_string != 0)
12190
    arch_info = mips_parse_cpu ("-march", mips_arch_string);
12191
 
12192
  if (file_mips_isa != ISA_UNKNOWN)
12193
    {
12194
      /* Handle -mipsN.  At this point, file_mips_isa contains the
12195
         ISA level specified by -mipsN, while arch_info->isa contains
12196
         the -march selection (if any).  */
12197
      if (arch_info != 0)
12198
        {
12199
          /* -march takes precedence over -mipsN, since it is more descriptive.
12200
             There's no harm in specifying both as long as the ISA levels
12201
             are the same.  */
12202
          if (file_mips_isa != arch_info->isa)
12203
            as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
12204
                    mips_cpu_info_from_isa (file_mips_isa)->name,
12205
                    mips_cpu_info_from_isa (arch_info->isa)->name);
12206
        }
12207
      else
12208
        arch_info = mips_cpu_info_from_isa (file_mips_isa);
12209
    }
12210
 
12211
  if (arch_info == 0)
12212
    arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
12213
 
12214
  if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
12215
    as_bad (_("-march=%s is not compatible with the selected ABI"),
12216
            arch_info->name);
12217
 
12218
  mips_set_architecture (arch_info);
12219
 
12220
  /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
12221
  if (mips_tune_string != 0)
12222
    tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
12223
 
12224
  if (tune_info == 0)
12225
    mips_set_tune (arch_info);
12226
  else
12227
    mips_set_tune (tune_info);
12228
 
12229
  if (file_mips_gp32 >= 0)
12230
    {
12231
      /* The user specified the size of the integer registers.  Make sure
12232
         it agrees with the ABI and ISA.  */
12233
      if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
12234
        as_bad (_("-mgp64 used with a 32-bit processor"));
12235
      else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
12236
        as_bad (_("-mgp32 used with a 64-bit ABI"));
12237
      else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
12238
        as_bad (_("-mgp64 used with a 32-bit ABI"));
12239
    }
12240
  else
12241
    {
12242
      /* Infer the integer register size from the ABI and processor.
12243
         Restrict ourselves to 32-bit registers if that's all the
12244
         processor has, or if the ABI cannot handle 64-bit registers.  */
12245
      file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
12246
                        || !ISA_HAS_64BIT_REGS (mips_opts.isa));
12247
    }
12248
 
12249
  switch (file_mips_fp32)
12250
    {
12251
    default:
12252
    case -1:
12253
      /* No user specified float register size.
12254
         ??? GAS treats single-float processors as though they had 64-bit
12255
         float registers (although it complains when double-precision
12256
         instructions are used).  As things stand, saying they have 32-bit
12257
         registers would lead to spurious "register must be even" messages.
12258
         So here we assume float registers are never smaller than the
12259
         integer ones.  */
12260
      if (file_mips_gp32 == 0)
12261
        /* 64-bit integer registers implies 64-bit float registers.  */
12262
        file_mips_fp32 = 0;
12263
      else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
12264
               && ISA_HAS_64BIT_FPRS (mips_opts.isa))
12265
        /* -mips3d and -mdmx imply 64-bit float registers, if possible.  */
12266
        file_mips_fp32 = 0;
12267
      else
12268
        /* 32-bit float registers.  */
12269
        file_mips_fp32 = 1;
12270
      break;
12271
 
12272
    /* The user specified the size of the float registers.  Check if it
12273
       agrees with the ABI and ISA.  */
12274
    case 0:
12275
      if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
12276
        as_bad (_("-mfp64 used with a 32-bit fpu"));
12277
      else if (ABI_NEEDS_32BIT_REGS (mips_abi)
12278
               && !ISA_HAS_MXHC1 (mips_opts.isa))
12279
        as_warn (_("-mfp64 used with a 32-bit ABI"));
12280
      break;
12281
    case 1:
12282
      if (ABI_NEEDS_64BIT_REGS (mips_abi))
12283
        as_warn (_("-mfp32 used with a 64-bit ABI"));
12284
      break;
12285
    }
12286
 
12287
  /* End of GCC-shared inference code.  */
12288
 
12289
  /* This flag is set when we have a 64-bit capable CPU but use only
12290
     32-bit wide registers.  Note that EABI does not use it.  */
12291
  if (ISA_HAS_64BIT_REGS (mips_opts.isa)
12292
      && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
12293
          || mips_abi == O32_ABI))
12294
    mips_32bitmode = 1;
12295
 
12296
  if (mips_opts.isa == ISA_MIPS1 && mips_trap)
12297
    as_bad (_("trap exception not supported at ISA 1"));
12298
 
12299
  /* If the selected architecture includes support for ASEs, enable
12300
     generation of code for them.  */
12301
  if (mips_opts.mips16 == -1)
12302
    mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
12303
  if (mips_opts.ase_mips3d == -1)
12304
    mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
12305
                            && file_mips_fp32 == 0) ? 1 : 0;
12306
  if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
12307
    as_bad (_("-mfp32 used with -mips3d"));
12308
 
12309
  if (mips_opts.ase_mdmx == -1)
12310
    mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
12311
                          && file_mips_fp32 == 0) ? 1 : 0;
12312
  if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
12313
    as_bad (_("-mfp32 used with -mdmx"));
12314
 
12315
  if (mips_opts.ase_smartmips == -1)
12316
    mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
12317
  if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
12318
    as_warn (_("%s ISA does not support SmartMIPS"),
12319
             mips_cpu_info_from_isa (mips_opts.isa)->name);
12320
 
12321
  if (mips_opts.ase_dsp == -1)
12322
    mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
12323
  if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
12324
    as_warn (_("%s ISA does not support DSP ASE"),
12325
             mips_cpu_info_from_isa (mips_opts.isa)->name);
12326
 
12327
  if (mips_opts.ase_dspr2 == -1)
12328
    {
12329
      mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
12330
      mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
12331
    }
12332
  if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
12333
    as_warn (_("%s ISA does not support DSP R2 ASE"),
12334
             mips_cpu_info_from_isa (mips_opts.isa)->name);
12335
 
12336
  if (mips_opts.ase_mt == -1)
12337
    mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
12338
  if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
12339
    as_warn (_("%s ISA does not support MT ASE"),
12340
             mips_cpu_info_from_isa (mips_opts.isa)->name);
12341
 
12342
  file_mips_isa = mips_opts.isa;
12343
  file_ase_mips3d = mips_opts.ase_mips3d;
12344
  file_ase_mdmx = mips_opts.ase_mdmx;
12345
  file_ase_smartmips = mips_opts.ase_smartmips;
12346
  file_ase_dsp = mips_opts.ase_dsp;
12347
  file_ase_dspr2 = mips_opts.ase_dspr2;
12348
  file_ase_mt = mips_opts.ase_mt;
12349
  mips_opts.gp32 = file_mips_gp32;
12350
  mips_opts.fp32 = file_mips_fp32;
12351
  mips_opts.soft_float = file_mips_soft_float;
12352
  mips_opts.single_float = file_mips_single_float;
12353
 
12354
  if (mips_flag_mdebug < 0)
12355
    {
12356
#ifdef OBJ_MAYBE_ECOFF
12357
      if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
12358
        mips_flag_mdebug = 1;
12359
      else
12360
#endif /* OBJ_MAYBE_ECOFF */
12361
        mips_flag_mdebug = 0;
12362
    }
12363
}
12364
 
12365
void
12366
mips_init_after_args (void)
12367
{
12368
  /* initialize opcodes */
12369
  bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
12370
  mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
12371
}
12372
 
12373
long
12374
md_pcrel_from (fixS *fixP)
12375
{
12376
  valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
12377
  switch (fixP->fx_r_type)
12378
    {
12379
    case BFD_RELOC_16_PCREL_S2:
12380
    case BFD_RELOC_MIPS_JMP:
12381
      /* Return the address of the delay slot.  */
12382
      return addr + 4;
12383
    default:
12384
      /* We have no relocation type for PC relative MIPS16 instructions.  */
12385
      if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
12386
        as_bad_where (fixP->fx_file, fixP->fx_line,
12387
                      _("PC relative MIPS16 instruction references a different section"));
12388
      return addr;
12389
    }
12390
}
12391
 
12392
/* This is called before the symbol table is processed.  In order to
12393
   work with gcc when using mips-tfile, we must keep all local labels.
12394
   However, in other cases, we want to discard them.  If we were
12395
   called with -g, but we didn't see any debugging information, it may
12396
   mean that gcc is smuggling debugging information through to
12397
   mips-tfile, in which case we must generate all local labels.  */
12398
 
12399
void
12400
mips_frob_file_before_adjust (void)
12401
{
12402
#ifndef NO_ECOFF_DEBUGGING
12403
  if (ECOFF_DEBUGGING
12404
      && mips_debug != 0
12405
      && ! ecoff_debugging_seen)
12406
    flag_keep_locals = 1;
12407
#endif
12408
}
12409
 
12410
/* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
12411
   the corresponding LO16 reloc.  This is called before md_apply_fix and
12412
   tc_gen_reloc.  Unmatched relocs can only be generated by use of explicit
12413
   relocation operators.
12414
 
12415
   For our purposes, a %lo() expression matches a %got() or %hi()
12416
   expression if:
12417
 
12418
      (a) it refers to the same symbol; and
12419
      (b) the offset applied in the %lo() expression is no lower than
12420
          the offset applied in the %got() or %hi().
12421
 
12422
   (b) allows us to cope with code like:
12423
 
12424
        lui     $4,%hi(foo)
12425
        lh      $4,%lo(foo+2)($4)
12426
 
12427
   ...which is legal on RELA targets, and has a well-defined behaviour
12428
   if the user knows that adding 2 to "foo" will not induce a carry to
12429
   the high 16 bits.
12430
 
12431
   When several %lo()s match a particular %got() or %hi(), we use the
12432
   following rules to distinguish them:
12433
 
12434
     (1) %lo()s with smaller offsets are a better match than %lo()s with
12435
         higher offsets.
12436
 
12437
     (2) %lo()s with no matching %got() or %hi() are better than those
12438
         that already have a matching %got() or %hi().
12439
 
12440
     (3) later %lo()s are better than earlier %lo()s.
12441
 
12442
   These rules are applied in order.
12443
 
12444
   (1) means, among other things, that %lo()s with identical offsets are
12445
   chosen if they exist.
12446
 
12447
   (2) means that we won't associate several high-part relocations with
12448
   the same low-part relocation unless there's no alternative.  Having
12449
   several high parts for the same low part is a GNU extension; this rule
12450
   allows careful users to avoid it.
12451
 
12452
   (3) is purely cosmetic.  mips_hi_fixup_list is is in reverse order,
12453
   with the last high-part relocation being at the front of the list.
12454
   It therefore makes sense to choose the last matching low-part
12455
   relocation, all other things being equal.  It's also easier
12456
   to code that way.  */
12457
 
12458
void
12459
mips_frob_file (void)
12460
{
12461
  struct mips_hi_fixup *l;
12462
  bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
12463
 
12464
  for (l = mips_hi_fixup_list; l != NULL; l = l->next)
12465
    {
12466
      segment_info_type *seginfo;
12467
      bfd_boolean matched_lo_p;
12468
      fixS **hi_pos, **lo_pos, **pos;
12469
 
12470
      gas_assert (reloc_needs_lo_p (l->fixp->fx_r_type));
12471
 
12472
      /* If a GOT16 relocation turns out to be against a global symbol,
12473
         there isn't supposed to be a matching LO.  */
12474
      if (got16_reloc_p (l->fixp->fx_r_type)
12475
          && !pic_need_relax (l->fixp->fx_addsy, l->seg))
12476
        continue;
12477
 
12478
      /* Check quickly whether the next fixup happens to be a matching %lo.  */
12479
      if (fixup_has_matching_lo_p (l->fixp))
12480
        continue;
12481
 
12482
      seginfo = seg_info (l->seg);
12483
 
12484
      /* Set HI_POS to the position of this relocation in the chain.
12485
         Set LO_POS to the position of the chosen low-part relocation.
12486
         MATCHED_LO_P is true on entry to the loop if *POS is a low-part
12487
         relocation that matches an immediately-preceding high-part
12488
         relocation.  */
12489
      hi_pos = NULL;
12490
      lo_pos = NULL;
12491
      matched_lo_p = FALSE;
12492
      looking_for_rtype = matching_lo_reloc (l->fixp->fx_r_type);
12493
 
12494
      for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
12495
        {
12496
          if (*pos == l->fixp)
12497
            hi_pos = pos;
12498
 
12499
          if ((*pos)->fx_r_type == looking_for_rtype
12500
              && symbol_same_p ((*pos)->fx_addsy, l->fixp->fx_addsy)
12501
              && (*pos)->fx_offset >= l->fixp->fx_offset
12502
              && (lo_pos == NULL
12503
                  || (*pos)->fx_offset < (*lo_pos)->fx_offset
12504
                  || (!matched_lo_p
12505
                      && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
12506
            lo_pos = pos;
12507
 
12508
          matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
12509
                          && fixup_has_matching_lo_p (*pos));
12510
        }
12511
 
12512
      /* If we found a match, remove the high-part relocation from its
12513
         current position and insert it before the low-part relocation.
12514
         Make the offsets match so that fixup_has_matching_lo_p()
12515
         will return true.
12516
 
12517
         We don't warn about unmatched high-part relocations since some
12518
         versions of gcc have been known to emit dead "lui ...%hi(...)"
12519
         instructions.  */
12520
      if (lo_pos != NULL)
12521
        {
12522
          l->fixp->fx_offset = (*lo_pos)->fx_offset;
12523
          if (l->fixp->fx_next != *lo_pos)
12524
            {
12525
              *hi_pos = l->fixp->fx_next;
12526
              l->fixp->fx_next = *lo_pos;
12527
              *lo_pos = l->fixp;
12528
            }
12529
        }
12530
    }
12531
}
12532
 
12533
/* We may have combined relocations without symbols in the N32/N64 ABI.
12534
   We have to prevent gas from dropping them.  */
12535
 
12536
int
12537
mips_force_relocation (fixS *fixp)
12538
{
12539
  if (generic_force_reloc (fixp))
12540
    return 1;
12541
 
12542
  if (HAVE_NEWABI
12543
      && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
12544
      && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
12545
          || hi16_reloc_p (fixp->fx_r_type)
12546
          || lo16_reloc_p (fixp->fx_r_type)))
12547
    return 1;
12548
 
12549
  return 0;
12550
}
12551
 
12552
/* Apply a fixup to the object file.  */
12553
 
12554
void
12555
md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
12556
{
12557
  bfd_byte *buf;
12558
  long insn;
12559
  reloc_howto_type *howto;
12560
 
12561
  /* We ignore generic BFD relocations we don't know about.  */
12562
  howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
12563
  if (! howto)
12564
    return;
12565
 
12566
  gas_assert (fixP->fx_size == 4
12567
              || fixP->fx_r_type == BFD_RELOC_16
12568
              || fixP->fx_r_type == BFD_RELOC_64
12569
              || fixP->fx_r_type == BFD_RELOC_CTOR
12570
              || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
12571
              || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
12572
              || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
12573
              || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
12574
 
12575
  buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
12576
 
12577
  gas_assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2);
12578
 
12579
  /* Don't treat parts of a composite relocation as done.  There are two
12580
     reasons for this:
12581
 
12582
     (1) The second and third parts will be against 0 (RSS_UNDEF) but
12583
         should nevertheless be emitted if the first part is.
12584
 
12585
     (2) In normal usage, composite relocations are never assembly-time
12586
         constants.  The easiest way of dealing with the pathological
12587
         exceptions is to generate a relocation against STN_UNDEF and
12588
         leave everything up to the linker.  */
12589
  if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
12590
    fixP->fx_done = 1;
12591
 
12592
  switch (fixP->fx_r_type)
12593
    {
12594
    case BFD_RELOC_MIPS_TLS_GD:
12595
    case BFD_RELOC_MIPS_TLS_LDM:
12596
    case BFD_RELOC_MIPS_TLS_DTPREL32:
12597
    case BFD_RELOC_MIPS_TLS_DTPREL64:
12598
    case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
12599
    case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
12600
    case BFD_RELOC_MIPS_TLS_GOTTPREL:
12601
    case BFD_RELOC_MIPS_TLS_TPREL_HI16:
12602
    case BFD_RELOC_MIPS_TLS_TPREL_LO16:
12603
      S_SET_THREAD_LOCAL (fixP->fx_addsy);
12604
      /* fall through */
12605
 
12606
    case BFD_RELOC_MIPS_JMP:
12607
    case BFD_RELOC_MIPS_SHIFT5:
12608
    case BFD_RELOC_MIPS_SHIFT6:
12609
    case BFD_RELOC_MIPS_GOT_DISP:
12610
    case BFD_RELOC_MIPS_GOT_PAGE:
12611
    case BFD_RELOC_MIPS_GOT_OFST:
12612
    case BFD_RELOC_MIPS_SUB:
12613
    case BFD_RELOC_MIPS_INSERT_A:
12614
    case BFD_RELOC_MIPS_INSERT_B:
12615
    case BFD_RELOC_MIPS_DELETE:
12616
    case BFD_RELOC_MIPS_HIGHEST:
12617
    case BFD_RELOC_MIPS_HIGHER:
12618
    case BFD_RELOC_MIPS_SCN_DISP:
12619
    case BFD_RELOC_MIPS_REL16:
12620
    case BFD_RELOC_MIPS_RELGOT:
12621
    case BFD_RELOC_MIPS_JALR:
12622
    case BFD_RELOC_HI16:
12623
    case BFD_RELOC_HI16_S:
12624
    case BFD_RELOC_GPREL16:
12625
    case BFD_RELOC_MIPS_LITERAL:
12626
    case BFD_RELOC_MIPS_CALL16:
12627
    case BFD_RELOC_MIPS_GOT16:
12628
    case BFD_RELOC_GPREL32:
12629
    case BFD_RELOC_MIPS_GOT_HI16:
12630
    case BFD_RELOC_MIPS_GOT_LO16:
12631
    case BFD_RELOC_MIPS_CALL_HI16:
12632
    case BFD_RELOC_MIPS_CALL_LO16:
12633
    case BFD_RELOC_MIPS16_GPREL:
12634
    case BFD_RELOC_MIPS16_GOT16:
12635
    case BFD_RELOC_MIPS16_CALL16:
12636
    case BFD_RELOC_MIPS16_HI16:
12637
    case BFD_RELOC_MIPS16_HI16_S:
12638
    case BFD_RELOC_MIPS16_JMP:
12639
      /* Nothing needed to do.  The value comes from the reloc entry.  */
12640
      break;
12641
 
12642
    case BFD_RELOC_64:
12643
      /* This is handled like BFD_RELOC_32, but we output a sign
12644
         extended value if we are only 32 bits.  */
12645
      if (fixP->fx_done)
12646
        {
12647
          if (8 <= sizeof (valueT))
12648
            md_number_to_chars ((char *) buf, *valP, 8);
12649
          else
12650
            {
12651
              valueT hiv;
12652
 
12653
              if ((*valP & 0x80000000) != 0)
12654
                hiv = 0xffffffff;
12655
              else
12656
                hiv = 0;
12657
              md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
12658
                                  *valP, 4);
12659
              md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
12660
                                  hiv, 4);
12661
            }
12662
        }
12663
      break;
12664
 
12665
    case BFD_RELOC_RVA:
12666
    case BFD_RELOC_32:
12667
    case BFD_RELOC_16:
12668
      /* If we are deleting this reloc entry, we must fill in the
12669
         value now.  This can happen if we have a .word which is not
12670
         resolved when it appears but is later defined.  */
12671
      if (fixP->fx_done)
12672
        md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
12673
      break;
12674
 
12675
    case BFD_RELOC_LO16:
12676
    case BFD_RELOC_MIPS16_LO16:
12677
      /* FIXME: Now that embedded-PIC is gone, some of this code/comment
12678
         may be safe to remove, but if so it's not obvious.  */
12679
      /* When handling an embedded PIC switch statement, we can wind
12680
         up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
12681
      if (fixP->fx_done)
12682
        {
12683
          if (*valP + 0x8000 > 0xffff)
12684
            as_bad_where (fixP->fx_file, fixP->fx_line,
12685
                          _("relocation overflow"));
12686
          if (target_big_endian)
12687
            buf += 2;
12688
          md_number_to_chars ((char *) buf, *valP, 2);
12689
        }
12690
      break;
12691
 
12692
    case BFD_RELOC_16_PCREL_S2:
12693
      if ((*valP & 0x3) != 0)
12694
        as_bad_where (fixP->fx_file, fixP->fx_line,
12695
                      _("Branch to misaligned address (%lx)"), (long) *valP);
12696
 
12697
      /* We need to save the bits in the instruction since fixup_segment()
12698
         might be deleting the relocation entry (i.e., a branch within
12699
         the current segment).  */
12700
      if (! fixP->fx_done)
12701
        break;
12702
 
12703
      /* Update old instruction data.  */
12704
      if (target_big_endian)
12705
        insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
12706
      else
12707
        insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
12708
 
12709
      if (*valP + 0x20000 <= 0x3ffff)
12710
        {
12711
          insn |= (*valP >> 2) & 0xffff;
12712
          md_number_to_chars ((char *) buf, insn, 4);
12713
        }
12714
      else if (mips_pic == NO_PIC
12715
               && fixP->fx_done
12716
               && fixP->fx_frag->fr_address >= text_section->vma
12717
               && (fixP->fx_frag->fr_address
12718
                   < text_section->vma + bfd_get_section_size (text_section))
12719
               && ((insn & 0xffff0000) == 0x10000000     /* beq $0,$0 */
12720
                   || (insn & 0xffff0000) == 0x04010000  /* bgez $0 */
12721
                   || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
12722
        {
12723
          /* The branch offset is too large.  If this is an
12724
             unconditional branch, and we are not generating PIC code,
12725
             we can convert it to an absolute jump instruction.  */
12726
          if ((insn & 0xffff0000) == 0x04110000)         /* bgezal $0 */
12727
            insn = 0x0c000000;  /* jal */
12728
          else
12729
            insn = 0x08000000;  /* j */
12730
          fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
12731
          fixP->fx_done = 0;
12732
          fixP->fx_addsy = section_symbol (text_section);
12733
          *valP += md_pcrel_from (fixP);
12734
          md_number_to_chars ((char *) buf, insn, 4);
12735
        }
12736
      else
12737
        {
12738
          /* If we got here, we have branch-relaxation disabled,
12739
             and there's nothing we can do to fix this instruction
12740
             without turning it into a longer sequence.  */
12741
          as_bad_where (fixP->fx_file, fixP->fx_line,
12742
                        _("Branch out of range"));
12743
        }
12744
      break;
12745
 
12746
    case BFD_RELOC_VTABLE_INHERIT:
12747
      fixP->fx_done = 0;
12748
      if (fixP->fx_addsy
12749
          && !S_IS_DEFINED (fixP->fx_addsy)
12750
          && !S_IS_WEAK (fixP->fx_addsy))
12751
        S_SET_WEAK (fixP->fx_addsy);
12752
      break;
12753
 
12754
    case BFD_RELOC_VTABLE_ENTRY:
12755
      fixP->fx_done = 0;
12756
      break;
12757
 
12758
    default:
12759
      internalError ();
12760
    }
12761
 
12762
  /* Remember value for tc_gen_reloc.  */
12763
  fixP->fx_addnumber = *valP;
12764
}
12765
 
12766
static symbolS *
12767
get_symbol (void)
12768
{
12769
  int c;
12770
  char *name;
12771
  symbolS *p;
12772
 
12773
  name = input_line_pointer;
12774
  c = get_symbol_end ();
12775
  p = (symbolS *) symbol_find_or_make (name);
12776
  *input_line_pointer = c;
12777
  return p;
12778
}
12779
 
12780
/* Align the current frag to a given power of two.  If a particular
12781
   fill byte should be used, FILL points to an integer that contains
12782
   that byte, otherwise FILL is null.
12783
 
12784
   The MIPS assembler also automatically adjusts any preceding
12785
   label.  */
12786
 
12787
static void
12788
mips_align (int to, int *fill, symbolS *label)
12789
{
12790
  mips_emit_delays ();
12791
  mips_record_mips16_mode ();
12792
  if (fill == NULL && subseg_text_p (now_seg))
12793
    frag_align_code (to, 0);
12794
  else
12795
    frag_align (to, fill ? *fill : 0, 0);
12796
  record_alignment (now_seg, to);
12797
  if (label != NULL)
12798
    {
12799
      gas_assert (S_GET_SEGMENT (label) == now_seg);
12800
      symbol_set_frag (label, frag_now);
12801
      S_SET_VALUE (label, (valueT) frag_now_fix ());
12802
    }
12803
}
12804
 
12805
/* Align to a given power of two.  .align 0 turns off the automatic
12806
   alignment used by the data creating pseudo-ops.  */
12807
 
12808
static void
12809
s_align (int x ATTRIBUTE_UNUSED)
12810
{
12811
  int temp, fill_value, *fill_ptr;
12812
  long max_alignment = 28;
12813
 
12814
  /* o Note that the assembler pulls down any immediately preceding label
12815
       to the aligned address.
12816
     o It's not documented but auto alignment is reinstated by
12817
       a .align pseudo instruction.
12818
     o Note also that after auto alignment is turned off the mips assembler
12819
       issues an error on attempt to assemble an improperly aligned data item.
12820
       We don't.  */
12821
 
12822
  temp = get_absolute_expression ();
12823
  if (temp > max_alignment)
12824
    as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
12825
  else if (temp < 0)
12826
    {
12827
      as_warn (_("Alignment negative: 0 assumed."));
12828
      temp = 0;
12829
    }
12830
  if (*input_line_pointer == ',')
12831
    {
12832
      ++input_line_pointer;
12833
      fill_value = get_absolute_expression ();
12834
      fill_ptr = &fill_value;
12835
    }
12836
  else
12837
    fill_ptr = 0;
12838
  if (temp)
12839
    {
12840
      segment_info_type *si = seg_info (now_seg);
12841
      struct insn_label_list *l = si->label_list;
12842
      /* Auto alignment should be switched on by next section change.  */
12843
      auto_align = 1;
12844
      mips_align (temp, fill_ptr, l != NULL ? l->label : NULL);
12845
    }
12846
  else
12847
    {
12848
      auto_align = 0;
12849
    }
12850
 
12851
  demand_empty_rest_of_line ();
12852
}
12853
 
12854
static void
12855
s_change_sec (int sec)
12856
{
12857
  segT seg;
12858
 
12859
#ifdef OBJ_ELF
12860
  /* The ELF backend needs to know that we are changing sections, so
12861
     that .previous works correctly.  We could do something like check
12862
     for an obj_section_change_hook macro, but that might be confusing
12863
     as it would not be appropriate to use it in the section changing
12864
     functions in read.c, since obj-elf.c intercepts those.  FIXME:
12865
     This should be cleaner, somehow.  */
12866
  if (IS_ELF)
12867
    obj_elf_section_change_hook ();
12868
#endif
12869
 
12870
  mips_emit_delays ();
12871
 
12872
  switch (sec)
12873
    {
12874
    case 't':
12875
      s_text (0);
12876
      break;
12877
    case 'd':
12878
      s_data (0);
12879
      break;
12880
    case 'b':
12881
      subseg_set (bss_section, (subsegT) get_absolute_expression ());
12882
      demand_empty_rest_of_line ();
12883
      break;
12884
 
12885
    case 'r':
12886
      seg = subseg_new (RDATA_SECTION_NAME,
12887
                        (subsegT) get_absolute_expression ());
12888
      if (IS_ELF)
12889
        {
12890
          bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
12891
                                                  | SEC_READONLY | SEC_RELOC
12892
                                                  | SEC_DATA));
12893
          if (strncmp (TARGET_OS, "elf", 3) != 0)
12894
            record_alignment (seg, 4);
12895
        }
12896
      demand_empty_rest_of_line ();
12897
      break;
12898
 
12899
    case 's':
12900
      seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
12901
      if (IS_ELF)
12902
        {
12903
          bfd_set_section_flags (stdoutput, seg,
12904
                                 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
12905
          if (strncmp (TARGET_OS, "elf", 3) != 0)
12906
            record_alignment (seg, 4);
12907
        }
12908
      demand_empty_rest_of_line ();
12909
      break;
12910
 
12911
    case 'B':
12912
      seg = subseg_new (".sbss", (subsegT) get_absolute_expression ());
12913
      if (IS_ELF)
12914
        {
12915
          bfd_set_section_flags (stdoutput, seg, SEC_ALLOC);
12916
          if (strncmp (TARGET_OS, "elf", 3) != 0)
12917
            record_alignment (seg, 4);
12918
        }
12919
      demand_empty_rest_of_line ();
12920
      break;
12921
    }
12922
 
12923
  auto_align = 1;
12924
}
12925
 
12926
void
12927
s_change_section (int ignore ATTRIBUTE_UNUSED)
12928
{
12929
#ifdef OBJ_ELF
12930
  char *section_name;
12931
  char c;
12932
  char next_c = 0;
12933
  int section_type;
12934
  int section_flag;
12935
  int section_entry_size;
12936
  int section_alignment;
12937
 
12938
  if (!IS_ELF)
12939
    return;
12940
 
12941
  section_name = input_line_pointer;
12942
  c = get_symbol_end ();
12943
  if (c)
12944
    next_c = *(input_line_pointer + 1);
12945
 
12946
  /* Do we have .section Name<,"flags">?  */
12947
  if (c != ',' || (c == ',' && next_c == '"'))
12948
    {
12949
      /* just after name is now '\0'.  */
12950
      *input_line_pointer = c;
12951
      input_line_pointer = section_name;
12952
      obj_elf_section (ignore);
12953
      return;
12954
    }
12955
  input_line_pointer++;
12956
 
12957
  /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
12958
  if (c == ',')
12959
    section_type = get_absolute_expression ();
12960
  else
12961
    section_type = 0;
12962
  if (*input_line_pointer++ == ',')
12963
    section_flag = get_absolute_expression ();
12964
  else
12965
    section_flag = 0;
12966
  if (*input_line_pointer++ == ',')
12967
    section_entry_size = get_absolute_expression ();
12968
  else
12969
    section_entry_size = 0;
12970
  if (*input_line_pointer++ == ',')
12971
    section_alignment = get_absolute_expression ();
12972
  else
12973
    section_alignment = 0;
12974
  /* FIXME: really ignore?  */
12975
  (void) section_alignment;
12976
 
12977
  section_name = xstrdup (section_name);
12978
 
12979
  /* When using the generic form of .section (as implemented by obj-elf.c),
12980
     there's no way to set the section type to SHT_MIPS_DWARF.  Users have
12981
     traditionally had to fall back on the more common @progbits instead.
12982
 
12983
     There's nothing really harmful in this, since bfd will correct
12984
     SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
12985
     means that, for backwards compatibility, the special_section entries
12986
     for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
12987
 
12988
     Even so, we shouldn't force users of the MIPS .section syntax to
12989
     incorrectly label the sections as SHT_PROGBITS.  The best compromise
12990
     seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
12991
     generic type-checking code.  */
12992
  if (section_type == SHT_MIPS_DWARF)
12993
    section_type = SHT_PROGBITS;
12994
 
12995
  obj_elf_change_section (section_name, section_type, section_flag,
12996
                          section_entry_size, 0, 0, 0);
12997
 
12998
  if (now_seg->name != section_name)
12999
    free (section_name);
13000
#endif /* OBJ_ELF */
13001
}
13002
 
13003
void
13004
mips_enable_auto_align (void)
13005
{
13006
  auto_align = 1;
13007
}
13008
 
13009
static void
13010
s_cons (int log_size)
13011
{
13012
  segment_info_type *si = seg_info (now_seg);
13013
  struct insn_label_list *l = si->label_list;
13014
  symbolS *label;
13015
 
13016
  label = l != NULL ? l->label : NULL;
13017
  mips_emit_delays ();
13018
  if (log_size > 0 && auto_align)
13019
    mips_align (log_size, 0, label);
13020
  cons (1 << log_size);
13021
  mips_clear_insn_labels ();
13022
}
13023
 
13024
static void
13025
s_float_cons (int type)
13026
{
13027
  segment_info_type *si = seg_info (now_seg);
13028
  struct insn_label_list *l = si->label_list;
13029
  symbolS *label;
13030
 
13031
  label = l != NULL ? l->label : NULL;
13032
 
13033
  mips_emit_delays ();
13034
 
13035
  if (auto_align)
13036
    {
13037
      if (type == 'd')
13038
        mips_align (3, 0, label);
13039
      else
13040
        mips_align (2, 0, label);
13041
    }
13042
 
13043
  float_cons (type);
13044
  mips_clear_insn_labels ();
13045
}
13046
 
13047
/* Handle .globl.  We need to override it because on Irix 5 you are
13048
   permitted to say
13049
       .globl foo .text
13050
   where foo is an undefined symbol, to mean that foo should be
13051
   considered to be the address of a function.  */
13052
 
13053
static void
13054
s_mips_globl (int x ATTRIBUTE_UNUSED)
13055
{
13056
  char *name;
13057
  int c;
13058
  symbolS *symbolP;
13059
  flagword flag;
13060
 
13061
  do
13062
    {
13063
      name = input_line_pointer;
13064
      c = get_symbol_end ();
13065
      symbolP = symbol_find_or_make (name);
13066
      S_SET_EXTERNAL (symbolP);
13067
 
13068
      *input_line_pointer = c;
13069
      SKIP_WHITESPACE ();
13070
 
13071
      /* On Irix 5, every global symbol that is not explicitly labelled as
13072
         being a function is apparently labelled as being an object.  */
13073
      flag = BSF_OBJECT;
13074
 
13075
      if (!is_end_of_line[(unsigned char) *input_line_pointer]
13076
          && (*input_line_pointer != ','))
13077
        {
13078
          char *secname;
13079
          asection *sec;
13080
 
13081
          secname = input_line_pointer;
13082
          c = get_symbol_end ();
13083
          sec = bfd_get_section_by_name (stdoutput, secname);
13084
          if (sec == NULL)
13085
            as_bad (_("%s: no such section"), secname);
13086
          *input_line_pointer = c;
13087
 
13088
          if (sec != NULL && (sec->flags & SEC_CODE) != 0)
13089
            flag = BSF_FUNCTION;
13090
        }
13091
 
13092
      symbol_get_bfdsym (symbolP)->flags |= flag;
13093
 
13094
      c = *input_line_pointer;
13095
      if (c == ',')
13096
        {
13097
          input_line_pointer++;
13098
          SKIP_WHITESPACE ();
13099
          if (is_end_of_line[(unsigned char) *input_line_pointer])
13100
            c = '\n';
13101
        }
13102
    }
13103
  while (c == ',');
13104
 
13105
  demand_empty_rest_of_line ();
13106
}
13107
 
13108
static void
13109
s_option (int x ATTRIBUTE_UNUSED)
13110
{
13111
  char *opt;
13112
  char c;
13113
 
13114
  opt = input_line_pointer;
13115
  c = get_symbol_end ();
13116
 
13117
  if (*opt == 'O')
13118
    {
13119
      /* FIXME: What does this mean?  */
13120
    }
13121
  else if (strncmp (opt, "pic", 3) == 0)
13122
    {
13123
      int i;
13124
 
13125
      i = atoi (opt + 3);
13126
      if (i == 0)
13127
        mips_pic = NO_PIC;
13128
      else if (i == 2)
13129
        {
13130
        mips_pic = SVR4_PIC;
13131
          mips_abicalls = TRUE;
13132
        }
13133
      else
13134
        as_bad (_(".option pic%d not supported"), i);
13135
 
13136
      if (mips_pic == SVR4_PIC)
13137
        {
13138
          if (g_switch_seen && g_switch_value != 0)
13139
            as_warn (_("-G may not be used with SVR4 PIC code"));
13140
          g_switch_value = 0;
13141
          bfd_set_gp_size (stdoutput, 0);
13142
        }
13143
    }
13144
  else
13145
    as_warn (_("Unrecognized option \"%s\""), opt);
13146
 
13147
  *input_line_pointer = c;
13148
  demand_empty_rest_of_line ();
13149
}
13150
 
13151
/* This structure is used to hold a stack of .set values.  */
13152
 
13153
struct mips_option_stack
13154
{
13155
  struct mips_option_stack *next;
13156
  struct mips_set_options options;
13157
};
13158
 
13159
static struct mips_option_stack *mips_opts_stack;
13160
 
13161
/* Handle the .set pseudo-op.  */
13162
 
13163
static void
13164
s_mipsset (int x ATTRIBUTE_UNUSED)
13165
{
13166
  char *name = input_line_pointer, ch;
13167
 
13168
  while (!is_end_of_line[(unsigned char) *input_line_pointer])
13169
    ++input_line_pointer;
13170
  ch = *input_line_pointer;
13171
  *input_line_pointer = '\0';
13172
 
13173
  if (strcmp (name, "reorder") == 0)
13174
    {
13175
      if (mips_opts.noreorder)
13176
        end_noreorder ();
13177
    }
13178
  else if (strcmp (name, "noreorder") == 0)
13179
    {
13180
      if (!mips_opts.noreorder)
13181
        start_noreorder ();
13182
    }
13183
  else if (strncmp (name, "at=", 3) == 0)
13184
    {
13185
      char *s = name + 3;
13186
 
13187
      if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
13188
        as_bad (_("Unrecognized register name `%s'"), s);
13189
    }
13190
  else if (strcmp (name, "at") == 0)
13191
    {
13192
      mips_opts.at = ATREG;
13193
    }
13194
  else if (strcmp (name, "noat") == 0)
13195
    {
13196
      mips_opts.at = ZERO;
13197
    }
13198
  else if (strcmp (name, "macro") == 0)
13199
    {
13200
      mips_opts.warn_about_macros = 0;
13201
    }
13202
  else if (strcmp (name, "nomacro") == 0)
13203
    {
13204
      if (mips_opts.noreorder == 0)
13205
        as_bad (_("`noreorder' must be set before `nomacro'"));
13206
      mips_opts.warn_about_macros = 1;
13207
    }
13208
  else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
13209
    {
13210
      mips_opts.nomove = 0;
13211
    }
13212
  else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
13213
    {
13214
      mips_opts.nomove = 1;
13215
    }
13216
  else if (strcmp (name, "bopt") == 0)
13217
    {
13218
      mips_opts.nobopt = 0;
13219
    }
13220
  else if (strcmp (name, "nobopt") == 0)
13221
    {
13222
      mips_opts.nobopt = 1;
13223
    }
13224
  else if (strcmp (name, "gp=default") == 0)
13225
    mips_opts.gp32 = file_mips_gp32;
13226
  else if (strcmp (name, "gp=32") == 0)
13227
    mips_opts.gp32 = 1;
13228
  else if (strcmp (name, "gp=64") == 0)
13229
    {
13230
      if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
13231
        as_warn (_("%s isa does not support 64-bit registers"),
13232
                 mips_cpu_info_from_isa (mips_opts.isa)->name);
13233
      mips_opts.gp32 = 0;
13234
    }
13235
  else if (strcmp (name, "fp=default") == 0)
13236
    mips_opts.fp32 = file_mips_fp32;
13237
  else if (strcmp (name, "fp=32") == 0)
13238
    mips_opts.fp32 = 1;
13239
  else if (strcmp (name, "fp=64") == 0)
13240
    {
13241
      if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
13242
        as_warn (_("%s isa does not support 64-bit floating point registers"),
13243
                 mips_cpu_info_from_isa (mips_opts.isa)->name);
13244
      mips_opts.fp32 = 0;
13245
    }
13246
  else if (strcmp (name, "softfloat") == 0)
13247
    mips_opts.soft_float = 1;
13248
  else if (strcmp (name, "hardfloat") == 0)
13249
    mips_opts.soft_float = 0;
13250
  else if (strcmp (name, "singlefloat") == 0)
13251
    mips_opts.single_float = 1;
13252
  else if (strcmp (name, "doublefloat") == 0)
13253
    mips_opts.single_float = 0;
13254
  else if (strcmp (name, "mips16") == 0
13255
           || strcmp (name, "MIPS-16") == 0)
13256
    mips_opts.mips16 = 1;
13257
  else if (strcmp (name, "nomips16") == 0
13258
           || strcmp (name, "noMIPS-16") == 0)
13259
    mips_opts.mips16 = 0;
13260
  else if (strcmp (name, "smartmips") == 0)
13261
    {
13262
      if (!ISA_SUPPORTS_SMARTMIPS)
13263
        as_warn (_("%s ISA does not support SmartMIPS ASE"),
13264
                 mips_cpu_info_from_isa (mips_opts.isa)->name);
13265
      mips_opts.ase_smartmips = 1;
13266
    }
13267
  else if (strcmp (name, "nosmartmips") == 0)
13268
    mips_opts.ase_smartmips = 0;
13269
  else if (strcmp (name, "mips3d") == 0)
13270
    mips_opts.ase_mips3d = 1;
13271
  else if (strcmp (name, "nomips3d") == 0)
13272
    mips_opts.ase_mips3d = 0;
13273
  else if (strcmp (name, "mdmx") == 0)
13274
    mips_opts.ase_mdmx = 1;
13275
  else if (strcmp (name, "nomdmx") == 0)
13276
    mips_opts.ase_mdmx = 0;
13277
  else if (strcmp (name, "dsp") == 0)
13278
    {
13279
      if (!ISA_SUPPORTS_DSP_ASE)
13280
        as_warn (_("%s ISA does not support DSP ASE"),
13281
                 mips_cpu_info_from_isa (mips_opts.isa)->name);
13282
      mips_opts.ase_dsp = 1;
13283
      mips_opts.ase_dspr2 = 0;
13284
    }
13285
  else if (strcmp (name, "nodsp") == 0)
13286
    {
13287
      mips_opts.ase_dsp = 0;
13288
      mips_opts.ase_dspr2 = 0;
13289
    }
13290
  else if (strcmp (name, "dspr2") == 0)
13291
    {
13292
      if (!ISA_SUPPORTS_DSPR2_ASE)
13293
        as_warn (_("%s ISA does not support DSP R2 ASE"),
13294
                 mips_cpu_info_from_isa (mips_opts.isa)->name);
13295
      mips_opts.ase_dspr2 = 1;
13296
      mips_opts.ase_dsp = 1;
13297
    }
13298
  else if (strcmp (name, "nodspr2") == 0)
13299
    {
13300
      mips_opts.ase_dspr2 = 0;
13301
      mips_opts.ase_dsp = 0;
13302
    }
13303
  else if (strcmp (name, "mt") == 0)
13304
    {
13305
      if (!ISA_SUPPORTS_MT_ASE)
13306
        as_warn (_("%s ISA does not support MT ASE"),
13307
                 mips_cpu_info_from_isa (mips_opts.isa)->name);
13308
      mips_opts.ase_mt = 1;
13309
    }
13310
  else if (strcmp (name, "nomt") == 0)
13311
    mips_opts.ase_mt = 0;
13312
  else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
13313
    {
13314
      int reset = 0;
13315
 
13316
      /* Permit the user to change the ISA and architecture on the fly.
13317
         Needless to say, misuse can cause serious problems.  */
13318
      if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
13319
        {
13320
          reset = 1;
13321
          mips_opts.isa = file_mips_isa;
13322
          mips_opts.arch = file_mips_arch;
13323
        }
13324
      else if (strncmp (name, "arch=", 5) == 0)
13325
        {
13326
          const struct mips_cpu_info *p;
13327
 
13328
          p = mips_parse_cpu("internal use", name + 5);
13329
          if (!p)
13330
            as_bad (_("unknown architecture %s"), name + 5);
13331
          else
13332
            {
13333
              mips_opts.arch = p->cpu;
13334
              mips_opts.isa = p->isa;
13335
            }
13336
        }
13337
      else if (strncmp (name, "mips", 4) == 0)
13338
        {
13339
          const struct mips_cpu_info *p;
13340
 
13341
          p = mips_parse_cpu("internal use", name);
13342
          if (!p)
13343
            as_bad (_("unknown ISA level %s"), name + 4);
13344
          else
13345
            {
13346
              mips_opts.arch = p->cpu;
13347
              mips_opts.isa = p->isa;
13348
            }
13349
        }
13350
      else
13351
        as_bad (_("unknown ISA or architecture %s"), name);
13352
 
13353
      switch (mips_opts.isa)
13354
        {
13355
        case  0:
13356
          break;
13357
        case ISA_MIPS1:
13358
        case ISA_MIPS2:
13359
        case ISA_MIPS32:
13360
        case ISA_MIPS32R2:
13361
          mips_opts.gp32 = 1;
13362
          mips_opts.fp32 = 1;
13363
          break;
13364
        case ISA_MIPS3:
13365
        case ISA_MIPS4:
13366
        case ISA_MIPS5:
13367
        case ISA_MIPS64:
13368
        case ISA_MIPS64R2:
13369
          mips_opts.gp32 = 0;
13370
          mips_opts.fp32 = 0;
13371
          break;
13372
        default:
13373
          as_bad (_("unknown ISA level %s"), name + 4);
13374
          break;
13375
        }
13376
      if (reset)
13377
        {
13378
          mips_opts.gp32 = file_mips_gp32;
13379
          mips_opts.fp32 = file_mips_fp32;
13380
        }
13381
    }
13382
  else if (strcmp (name, "autoextend") == 0)
13383
    mips_opts.noautoextend = 0;
13384
  else if (strcmp (name, "noautoextend") == 0)
13385
    mips_opts.noautoextend = 1;
13386
  else if (strcmp (name, "push") == 0)
13387
    {
13388
      struct mips_option_stack *s;
13389
 
13390
      s = (struct mips_option_stack *) xmalloc (sizeof *s);
13391
      s->next = mips_opts_stack;
13392
      s->options = mips_opts;
13393
      mips_opts_stack = s;
13394
    }
13395
  else if (strcmp (name, "pop") == 0)
13396
    {
13397
      struct mips_option_stack *s;
13398
 
13399
      s = mips_opts_stack;
13400
      if (s == NULL)
13401
        as_bad (_(".set pop with no .set push"));
13402
      else
13403
        {
13404
          /* If we're changing the reorder mode we need to handle
13405
             delay slots correctly.  */
13406
          if (s->options.noreorder && ! mips_opts.noreorder)
13407
            start_noreorder ();
13408
          else if (! s->options.noreorder && mips_opts.noreorder)
13409
            end_noreorder ();
13410
 
13411
          mips_opts = s->options;
13412
          mips_opts_stack = s->next;
13413
          free (s);
13414
        }
13415
    }
13416
  else if (strcmp (name, "sym32") == 0)
13417
    mips_opts.sym32 = TRUE;
13418
  else if (strcmp (name, "nosym32") == 0)
13419
    mips_opts.sym32 = FALSE;
13420
  else if (strchr (name, ','))
13421
    {
13422
      /* Generic ".set" directive; use the generic handler.  */
13423
      *input_line_pointer = ch;
13424
      input_line_pointer = name;
13425
      s_set (0);
13426
      return;
13427
    }
13428
  else
13429
    {
13430
      as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
13431
    }
13432
  *input_line_pointer = ch;
13433
  demand_empty_rest_of_line ();
13434
}
13435
 
13436
/* Handle the .abicalls pseudo-op.  I believe this is equivalent to
13437
   .option pic2.  It means to generate SVR4 PIC calls.  */
13438
 
13439
static void
13440
s_abicalls (int ignore ATTRIBUTE_UNUSED)
13441
{
13442
  mips_pic = SVR4_PIC;
13443
  mips_abicalls = TRUE;
13444
 
13445
  if (g_switch_seen && g_switch_value != 0)
13446
    as_warn (_("-G may not be used with SVR4 PIC code"));
13447
  g_switch_value = 0;
13448
 
13449
  bfd_set_gp_size (stdoutput, 0);
13450
  demand_empty_rest_of_line ();
13451
}
13452
 
13453
/* Handle the .cpload pseudo-op.  This is used when generating SVR4
13454
   PIC code.  It sets the $gp register for the function based on the
13455
   function address, which is in the register named in the argument.
13456
   This uses a relocation against _gp_disp, which is handled specially
13457
   by the linker.  The result is:
13458
        lui     $gp,%hi(_gp_disp)
13459
        addiu   $gp,$gp,%lo(_gp_disp)
13460
        addu    $gp,$gp,.cpload argument
13461
   The .cpload argument is normally $25 == $t9.
13462
 
13463
   The -mno-shared option changes this to:
13464
        lui     $gp,%hi(__gnu_local_gp)
13465
        addiu   $gp,$gp,%lo(__gnu_local_gp)
13466
   and the argument is ignored.  This saves an instruction, but the
13467
   resulting code is not position independent; it uses an absolute
13468
   address for __gnu_local_gp.  Thus code assembled with -mno-shared
13469
   can go into an ordinary executable, but not into a shared library.  */
13470
 
13471
static void
13472
s_cpload (int ignore ATTRIBUTE_UNUSED)
13473
{
13474
  expressionS ex;
13475
  int reg;
13476
  int in_shared;
13477
 
13478
  /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13479
     .cpload is ignored.  */
13480
  if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13481
    {
13482
      s_ignore (0);
13483
      return;
13484
    }
13485
 
13486
  /* .cpload should be in a .set noreorder section.  */
13487
  if (mips_opts.noreorder == 0)
13488
    as_warn (_(".cpload not in noreorder section"));
13489
 
13490
  reg = tc_get_register (0);
13491
 
13492
  /* If we need to produce a 64-bit address, we are better off using
13493
     the default instruction sequence.  */
13494
  in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
13495
 
13496
  ex.X_op = O_symbol;
13497
  ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
13498
                                         "__gnu_local_gp");
13499
  ex.X_op_symbol = NULL;
13500
  ex.X_add_number = 0;
13501
 
13502
  /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
13503
  symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13504
 
13505
  macro_start ();
13506
  macro_build_lui (&ex, mips_gp_register);
13507
  macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13508
               mips_gp_register, BFD_RELOC_LO16);
13509
  if (in_shared)
13510
    macro_build (NULL, "addu", "d,v,t", mips_gp_register,
13511
                 mips_gp_register, reg);
13512
  macro_end ();
13513
 
13514
  demand_empty_rest_of_line ();
13515
}
13516
 
13517
/* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
13518
     .cpsetup $reg1, offset|$reg2, label
13519
 
13520
   If offset is given, this results in:
13521
     sd         $gp, offset($sp)
13522
     lui        $gp, %hi(%neg(%gp_rel(label)))
13523
     addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
13524
     daddu      $gp, $gp, $reg1
13525
 
13526
   If $reg2 is given, this results in:
13527
     daddu      $reg2, $gp, $0
13528
     lui        $gp, %hi(%neg(%gp_rel(label)))
13529
     addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
13530
     daddu      $gp, $gp, $reg1
13531
   $reg1 is normally $25 == $t9.
13532
 
13533
   The -mno-shared option replaces the last three instructions with
13534
        lui     $gp,%hi(_gp)
13535
        addiu   $gp,$gp,%lo(_gp)  */
13536
 
13537
static void
13538
s_cpsetup (int ignore ATTRIBUTE_UNUSED)
13539
{
13540
  expressionS ex_off;
13541
  expressionS ex_sym;
13542
  int reg1;
13543
 
13544
  /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
13545
     We also need NewABI support.  */
13546
  if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13547
    {
13548
      s_ignore (0);
13549
      return;
13550
    }
13551
 
13552
  reg1 = tc_get_register (0);
13553
  SKIP_WHITESPACE ();
13554
  if (*input_line_pointer != ',')
13555
    {
13556
      as_bad (_("missing argument separator ',' for .cpsetup"));
13557
      return;
13558
    }
13559
  else
13560
    ++input_line_pointer;
13561
  SKIP_WHITESPACE ();
13562
  if (*input_line_pointer == '$')
13563
    {
13564
      mips_cpreturn_register = tc_get_register (0);
13565
      mips_cpreturn_offset = -1;
13566
    }
13567
  else
13568
    {
13569
      mips_cpreturn_offset = get_absolute_expression ();
13570
      mips_cpreturn_register = -1;
13571
    }
13572
  SKIP_WHITESPACE ();
13573
  if (*input_line_pointer != ',')
13574
    {
13575
      as_bad (_("missing argument separator ',' for .cpsetup"));
13576
      return;
13577
    }
13578
  else
13579
    ++input_line_pointer;
13580
  SKIP_WHITESPACE ();
13581
  expression (&ex_sym);
13582
 
13583
  macro_start ();
13584
  if (mips_cpreturn_register == -1)
13585
    {
13586
      ex_off.X_op = O_constant;
13587
      ex_off.X_add_symbol = NULL;
13588
      ex_off.X_op_symbol = NULL;
13589
      ex_off.X_add_number = mips_cpreturn_offset;
13590
 
13591
      macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
13592
                   BFD_RELOC_LO16, SP);
13593
    }
13594
  else
13595
    macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
13596
                 mips_gp_register, 0);
13597
 
13598
  if (mips_in_shared || HAVE_64BIT_SYMBOLS)
13599
    {
13600
      macro_build (&ex_sym, "lui", "t,u", mips_gp_register,
13601
                   -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
13602
                   BFD_RELOC_HI16_S);
13603
 
13604
      macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
13605
                   mips_gp_register, -1, BFD_RELOC_GPREL16,
13606
                   BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
13607
 
13608
      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
13609
                   mips_gp_register, reg1);
13610
    }
13611
  else
13612
    {
13613
      expressionS ex;
13614
 
13615
      ex.X_op = O_symbol;
13616
      ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
13617
      ex.X_op_symbol = NULL;
13618
      ex.X_add_number = 0;
13619
 
13620
      /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
13621
      symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13622
 
13623
      macro_build_lui (&ex, mips_gp_register);
13624
      macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13625
                   mips_gp_register, BFD_RELOC_LO16);
13626
    }
13627
 
13628
  macro_end ();
13629
 
13630
  demand_empty_rest_of_line ();
13631
}
13632
 
13633
static void
13634
s_cplocal (int ignore ATTRIBUTE_UNUSED)
13635
{
13636
  /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
13637
     .cplocal is ignored.  */
13638
  if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13639
    {
13640
      s_ignore (0);
13641
      return;
13642
    }
13643
 
13644
  mips_gp_register = tc_get_register (0);
13645
  demand_empty_rest_of_line ();
13646
}
13647
 
13648
/* Handle the .cprestore pseudo-op.  This stores $gp into a given
13649
   offset from $sp.  The offset is remembered, and after making a PIC
13650
   call $gp is restored from that location.  */
13651
 
13652
static void
13653
s_cprestore (int ignore ATTRIBUTE_UNUSED)
13654
{
13655
  expressionS ex;
13656
 
13657
  /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13658
     .cprestore is ignored.  */
13659
  if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13660
    {
13661
      s_ignore (0);
13662
      return;
13663
    }
13664
 
13665
  mips_cprestore_offset = get_absolute_expression ();
13666
  mips_cprestore_valid = 1;
13667
 
13668
  ex.X_op = O_constant;
13669
  ex.X_add_symbol = NULL;
13670
  ex.X_op_symbol = NULL;
13671
  ex.X_add_number = mips_cprestore_offset;
13672
 
13673
  macro_start ();
13674
  macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
13675
                                SP, HAVE_64BIT_ADDRESSES);
13676
  macro_end ();
13677
 
13678
  demand_empty_rest_of_line ();
13679
}
13680
 
13681
/* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
13682
   was given in the preceding .cpsetup, it results in:
13683
     ld         $gp, offset($sp)
13684
 
13685
   If a register $reg2 was given there, it results in:
13686
     daddu      $gp, $reg2, $0  */
13687
 
13688
static void
13689
s_cpreturn (int ignore ATTRIBUTE_UNUSED)
13690
{
13691
  expressionS ex;
13692
 
13693
  /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
13694
     We also need NewABI support.  */
13695
  if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13696
    {
13697
      s_ignore (0);
13698
      return;
13699
    }
13700
 
13701
  macro_start ();
13702
  if (mips_cpreturn_register == -1)
13703
    {
13704
      ex.X_op = O_constant;
13705
      ex.X_add_symbol = NULL;
13706
      ex.X_op_symbol = NULL;
13707
      ex.X_add_number = mips_cpreturn_offset;
13708
 
13709
      macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
13710
    }
13711
  else
13712
    macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
13713
                 mips_cpreturn_register, 0);
13714
  macro_end ();
13715
 
13716
  demand_empty_rest_of_line ();
13717
}
13718
 
13719
/* Handle the .dtprelword and .dtpreldword pseudo-ops.  They generate
13720
   a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
13721
   use in DWARF debug information.  */
13722
 
13723
static void
13724
s_dtprel_internal (size_t bytes)
13725
{
13726
  expressionS ex;
13727
  char *p;
13728
 
13729
  expression (&ex);
13730
 
13731
  if (ex.X_op != O_symbol)
13732
    {
13733
      as_bad (_("Unsupported use of %s"), (bytes == 8
13734
                                           ? ".dtpreldword"
13735
                                           : ".dtprelword"));
13736
      ignore_rest_of_line ();
13737
    }
13738
 
13739
  p = frag_more (bytes);
13740
  md_number_to_chars (p, 0, bytes);
13741
  fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
13742
               (bytes == 8
13743
                ? BFD_RELOC_MIPS_TLS_DTPREL64
13744
                : BFD_RELOC_MIPS_TLS_DTPREL32));
13745
 
13746
  demand_empty_rest_of_line ();
13747
}
13748
 
13749
/* Handle .dtprelword.  */
13750
 
13751
static void
13752
s_dtprelword (int ignore ATTRIBUTE_UNUSED)
13753
{
13754
  s_dtprel_internal (4);
13755
}
13756
 
13757
/* Handle .dtpreldword.  */
13758
 
13759
static void
13760
s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
13761
{
13762
  s_dtprel_internal (8);
13763
}
13764
 
13765
/* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
13766
   code.  It sets the offset to use in gp_rel relocations.  */
13767
 
13768
static void
13769
s_gpvalue (int ignore ATTRIBUTE_UNUSED)
13770
{
13771
  /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
13772
     We also need NewABI support.  */
13773
  if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13774
    {
13775
      s_ignore (0);
13776
      return;
13777
    }
13778
 
13779
  mips_gprel_offset = get_absolute_expression ();
13780
 
13781
  demand_empty_rest_of_line ();
13782
}
13783
 
13784
/* Handle the .gpword pseudo-op.  This is used when generating PIC
13785
   code.  It generates a 32 bit GP relative reloc.  */
13786
 
13787
static void
13788
s_gpword (int ignore ATTRIBUTE_UNUSED)
13789
{
13790
  segment_info_type *si;
13791
  struct insn_label_list *l;
13792
  symbolS *label;
13793
  expressionS ex;
13794
  char *p;
13795
 
13796
  /* When not generating PIC code, this is treated as .word.  */
13797
  if (mips_pic != SVR4_PIC)
13798
    {
13799
      s_cons (2);
13800
      return;
13801
    }
13802
 
13803
  si = seg_info (now_seg);
13804
  l = si->label_list;
13805
  label = l != NULL ? l->label : NULL;
13806
  mips_emit_delays ();
13807
  if (auto_align)
13808
    mips_align (2, 0, label);
13809
 
13810
  expression (&ex);
13811
  mips_clear_insn_labels ();
13812
 
13813
  if (ex.X_op != O_symbol || ex.X_add_number != 0)
13814
    {
13815
      as_bad (_("Unsupported use of .gpword"));
13816
      ignore_rest_of_line ();
13817
    }
13818
 
13819
  p = frag_more (4);
13820
  md_number_to_chars (p, 0, 4);
13821
  fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13822
               BFD_RELOC_GPREL32);
13823
 
13824
  demand_empty_rest_of_line ();
13825
}
13826
 
13827
static void
13828
s_gpdword (int ignore ATTRIBUTE_UNUSED)
13829
{
13830
  segment_info_type *si;
13831
  struct insn_label_list *l;
13832
  symbolS *label;
13833
  expressionS ex;
13834
  char *p;
13835
 
13836
  /* When not generating PIC code, this is treated as .dword.  */
13837
  if (mips_pic != SVR4_PIC)
13838
    {
13839
      s_cons (3);
13840
      return;
13841
    }
13842
 
13843
  si = seg_info (now_seg);
13844
  l = si->label_list;
13845
  label = l != NULL ? l->label : NULL;
13846
  mips_emit_delays ();
13847
  if (auto_align)
13848
    mips_align (3, 0, label);
13849
 
13850
  expression (&ex);
13851
  mips_clear_insn_labels ();
13852
 
13853
  if (ex.X_op != O_symbol || ex.X_add_number != 0)
13854
    {
13855
      as_bad (_("Unsupported use of .gpdword"));
13856
      ignore_rest_of_line ();
13857
    }
13858
 
13859
  p = frag_more (8);
13860
  md_number_to_chars (p, 0, 8);
13861
  fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13862
               BFD_RELOC_GPREL32)->fx_tcbit = 1;
13863
 
13864
  /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
13865
  fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
13866
           FALSE, BFD_RELOC_64)->fx_tcbit = 1;
13867
 
13868
  demand_empty_rest_of_line ();
13869
}
13870
 
13871
/* Handle the .cpadd pseudo-op.  This is used when dealing with switch
13872
   tables in SVR4 PIC code.  */
13873
 
13874
static void
13875
s_cpadd (int ignore ATTRIBUTE_UNUSED)
13876
{
13877
  int reg;
13878
 
13879
  /* This is ignored when not generating SVR4 PIC code.  */
13880
  if (mips_pic != SVR4_PIC)
13881
    {
13882
      s_ignore (0);
13883
      return;
13884
    }
13885
 
13886
  /* Add $gp to the register named as an argument.  */
13887
  macro_start ();
13888
  reg = tc_get_register (0);
13889
  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
13890
  macro_end ();
13891
 
13892
  demand_empty_rest_of_line ();
13893
}
13894
 
13895
/* Handle the .insn pseudo-op.  This marks instruction labels in
13896
   mips16 mode.  This permits the linker to handle them specially,
13897
   such as generating jalx instructions when needed.  We also make
13898
   them odd for the duration of the assembly, in order to generate the
13899
   right sort of code.  We will make them even in the adjust_symtab
13900
   routine, while leaving them marked.  This is convenient for the
13901
   debugger and the disassembler.  The linker knows to make them odd
13902
   again.  */
13903
 
13904
static void
13905
s_insn (int ignore ATTRIBUTE_UNUSED)
13906
{
13907
  mips16_mark_labels ();
13908
 
13909
  demand_empty_rest_of_line ();
13910
}
13911
 
13912
/* Handle a .stabn directive.  We need these in order to mark a label
13913
   as being a mips16 text label correctly.  Sometimes the compiler
13914
   will emit a label, followed by a .stabn, and then switch sections.
13915
   If the label and .stabn are in mips16 mode, then the label is
13916
   really a mips16 text label.  */
13917
 
13918
static void
13919
s_mips_stab (int type)
13920
{
13921
  if (type == 'n')
13922
    mips16_mark_labels ();
13923
 
13924
  s_stab (type);
13925
}
13926
 
13927
/* Handle the .weakext pseudo-op as defined in Kane and Heinrich.  */
13928
 
13929
static void
13930
s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
13931
{
13932
  char *name;
13933
  int c;
13934
  symbolS *symbolP;
13935
  expressionS exp;
13936
 
13937
  name = input_line_pointer;
13938
  c = get_symbol_end ();
13939
  symbolP = symbol_find_or_make (name);
13940
  S_SET_WEAK (symbolP);
13941
  *input_line_pointer = c;
13942
 
13943
  SKIP_WHITESPACE ();
13944
 
13945
  if (! is_end_of_line[(unsigned char) *input_line_pointer])
13946
    {
13947
      if (S_IS_DEFINED (symbolP))
13948
        {
13949
          as_bad (_("ignoring attempt to redefine symbol %s"),
13950
                  S_GET_NAME (symbolP));
13951
          ignore_rest_of_line ();
13952
          return;
13953
        }
13954
 
13955
      if (*input_line_pointer == ',')
13956
        {
13957
          ++input_line_pointer;
13958
          SKIP_WHITESPACE ();
13959
        }
13960
 
13961
      expression (&exp);
13962
      if (exp.X_op != O_symbol)
13963
        {
13964
          as_bad (_("bad .weakext directive"));
13965
          ignore_rest_of_line ();
13966
          return;
13967
        }
13968
      symbol_set_value_expression (symbolP, &exp);
13969
    }
13970
 
13971
  demand_empty_rest_of_line ();
13972
}
13973
 
13974
/* Parse a register string into a number.  Called from the ECOFF code
13975
   to parse .frame.  The argument is non-zero if this is the frame
13976
   register, so that we can record it in mips_frame_reg.  */
13977
 
13978
int
13979
tc_get_register (int frame)
13980
{
13981
  unsigned int reg;
13982
 
13983
  SKIP_WHITESPACE ();
13984
  if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
13985
    reg = 0;
13986
  if (frame)
13987
    {
13988
      mips_frame_reg = reg != 0 ? reg : SP;
13989
      mips_frame_reg_valid = 1;
13990
      mips_cprestore_valid = 0;
13991
    }
13992
  return reg;
13993
}
13994
 
13995
valueT
13996
md_section_align (asection *seg, valueT addr)
13997
{
13998
  int align = bfd_get_section_alignment (stdoutput, seg);
13999
 
14000
  if (IS_ELF)
14001
    {
14002
      /* We don't need to align ELF sections to the full alignment.
14003
         However, Irix 5 may prefer that we align them at least to a 16
14004
         byte boundary.  We don't bother to align the sections if we
14005
         are targeted for an embedded system.  */
14006
      if (strncmp (TARGET_OS, "elf", 3) == 0)
14007
        return addr;
14008
      if (align > 4)
14009
        align = 4;
14010
    }
14011
 
14012
  return ((addr + (1 << align) - 1) & (-1 << align));
14013
}
14014
 
14015
/* Utility routine, called from above as well.  If called while the
14016
   input file is still being read, it's only an approximation.  (For
14017
   example, a symbol may later become defined which appeared to be
14018
   undefined earlier.)  */
14019
 
14020
static int
14021
nopic_need_relax (symbolS *sym, int before_relaxing)
14022
{
14023
  if (sym == 0)
14024
    return 0;
14025
 
14026
  if (g_switch_value > 0)
14027
    {
14028
      const char *symname;
14029
      int change;
14030
 
14031
      /* Find out whether this symbol can be referenced off the $gp
14032
         register.  It can be if it is smaller than the -G size or if
14033
         it is in the .sdata or .sbss section.  Certain symbols can
14034
         not be referenced off the $gp, although it appears as though
14035
         they can.  */
14036
      symname = S_GET_NAME (sym);
14037
      if (symname != (const char *) NULL
14038
          && (strcmp (symname, "eprol") == 0
14039
              || strcmp (symname, "etext") == 0
14040
              || strcmp (symname, "_gp") == 0
14041
              || strcmp (symname, "edata") == 0
14042
              || strcmp (symname, "_fbss") == 0
14043
              || strcmp (symname, "_fdata") == 0
14044
              || strcmp (symname, "_ftext") == 0
14045
              || strcmp (symname, "end") == 0
14046
              || strcmp (symname, "_gp_disp") == 0))
14047
        change = 1;
14048
      else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
14049
               && (0
14050
#ifndef NO_ECOFF_DEBUGGING
14051
                   || (symbol_get_obj (sym)->ecoff_extern_size != 0
14052
                       && (symbol_get_obj (sym)->ecoff_extern_size
14053
                           <= g_switch_value))
14054
#endif
14055
                   /* We must defer this decision until after the whole
14056
                      file has been read, since there might be a .extern
14057
                      after the first use of this symbol.  */
14058
                   || (before_relaxing
14059
#ifndef NO_ECOFF_DEBUGGING
14060
                       && symbol_get_obj (sym)->ecoff_extern_size == 0
14061
#endif
14062
                       && S_GET_VALUE (sym) == 0)
14063
                   || (S_GET_VALUE (sym) != 0
14064
                       && S_GET_VALUE (sym) <= g_switch_value)))
14065
        change = 0;
14066
      else
14067
        {
14068
          const char *segname;
14069
 
14070
          segname = segment_name (S_GET_SEGMENT (sym));
14071
          gas_assert (strcmp (segname, ".lit8") != 0
14072
                  && strcmp (segname, ".lit4") != 0);
14073
          change = (strcmp (segname, ".sdata") != 0
14074
                    && strcmp (segname, ".sbss") != 0
14075
                    && strncmp (segname, ".sdata.", 7) != 0
14076
                    && strncmp (segname, ".sbss.", 6) != 0
14077
                    && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
14078
                    && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
14079
        }
14080
      return change;
14081
    }
14082
  else
14083
    /* We are not optimizing for the $gp register.  */
14084
    return 1;
14085
}
14086
 
14087
 
14088
/* Return true if the given symbol should be considered local for SVR4 PIC.  */
14089
 
14090
static bfd_boolean
14091
pic_need_relax (symbolS *sym, asection *segtype)
14092
{
14093
  asection *symsec;
14094
 
14095
  /* Handle the case of a symbol equated to another symbol.  */
14096
  while (symbol_equated_reloc_p (sym))
14097
    {
14098
      symbolS *n;
14099
 
14100
      /* It's possible to get a loop here in a badly written program.  */
14101
      n = symbol_get_value_expression (sym)->X_add_symbol;
14102
      if (n == sym)
14103
        break;
14104
      sym = n;
14105
    }
14106
 
14107
  if (symbol_section_p (sym))
14108
    return TRUE;
14109
 
14110
  symsec = S_GET_SEGMENT (sym);
14111
 
14112
  /* This must duplicate the test in adjust_reloc_syms.  */
14113
  return (symsec != &bfd_und_section
14114
          && symsec != &bfd_abs_section
14115
          && !bfd_is_com_section (symsec)
14116
          && !s_is_linkonce (sym, segtype)
14117
#ifdef OBJ_ELF
14118
          /* A global or weak symbol is treated as external.  */
14119
          && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
14120
#endif
14121
          );
14122
}
14123
 
14124
 
14125
/* Given a mips16 variant frag FRAGP, return non-zero if it needs an
14126
   extended opcode.  SEC is the section the frag is in.  */
14127
 
14128
static int
14129
mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
14130
{
14131
  int type;
14132
  const struct mips16_immed_operand *op;
14133
  offsetT val;
14134
  int mintiny, maxtiny;
14135
  segT symsec;
14136
  fragS *sym_frag;
14137
 
14138
  if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
14139
    return 0;
14140
  if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
14141
    return 1;
14142
 
14143
  type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14144
  op = mips16_immed_operands;
14145
  while (op->type != type)
14146
    {
14147
      ++op;
14148
      gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
14149
    }
14150
 
14151
  if (op->unsp)
14152
    {
14153
      if (type == '<' || type == '>' || type == '[' || type == ']')
14154
        {
14155
          mintiny = 1;
14156
          maxtiny = 1 << op->nbits;
14157
        }
14158
      else
14159
        {
14160
          mintiny = 0;
14161
          maxtiny = (1 << op->nbits) - 1;
14162
        }
14163
    }
14164
  else
14165
    {
14166
      mintiny = - (1 << (op->nbits - 1));
14167
      maxtiny = (1 << (op->nbits - 1)) - 1;
14168
    }
14169
 
14170
  sym_frag = symbol_get_frag (fragp->fr_symbol);
14171
  val = S_GET_VALUE (fragp->fr_symbol);
14172
  symsec = S_GET_SEGMENT (fragp->fr_symbol);
14173
 
14174
  if (op->pcrel)
14175
    {
14176
      addressT addr;
14177
 
14178
      /* We won't have the section when we are called from
14179
         mips_relax_frag.  However, we will always have been called
14180
         from md_estimate_size_before_relax first.  If this is a
14181
         branch to a different section, we mark it as such.  If SEC is
14182
         NULL, and the frag is not marked, then it must be a branch to
14183
         the same section.  */
14184
      if (sec == NULL)
14185
        {
14186
          if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
14187
            return 1;
14188
        }
14189
      else
14190
        {
14191
          /* Must have been called from md_estimate_size_before_relax.  */
14192
          if (symsec != sec)
14193
            {
14194
              fragp->fr_subtype =
14195
                RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
14196
 
14197
              /* FIXME: We should support this, and let the linker
14198
                 catch branches and loads that are out of range.  */
14199
              as_bad_where (fragp->fr_file, fragp->fr_line,
14200
                            _("unsupported PC relative reference to different section"));
14201
 
14202
              return 1;
14203
            }
14204
          if (fragp != sym_frag && sym_frag->fr_address == 0)
14205
            /* Assume non-extended on the first relaxation pass.
14206
               The address we have calculated will be bogus if this is
14207
               a forward branch to another frag, as the forward frag
14208
               will have fr_address == 0.  */
14209
            return 0;
14210
        }
14211
 
14212
      /* In this case, we know for sure that the symbol fragment is in
14213
         the same section.  If the relax_marker of the symbol fragment
14214
         differs from the relax_marker of this fragment, we have not
14215
         yet adjusted the symbol fragment fr_address.  We want to add
14216
         in STRETCH in order to get a better estimate of the address.
14217
         This particularly matters because of the shift bits.  */
14218
      if (stretch != 0
14219
          && sym_frag->relax_marker != fragp->relax_marker)
14220
        {
14221
          fragS *f;
14222
 
14223
          /* Adjust stretch for any alignment frag.  Note that if have
14224
             been expanding the earlier code, the symbol may be
14225
             defined in what appears to be an earlier frag.  FIXME:
14226
             This doesn't handle the fr_subtype field, which specifies
14227
             a maximum number of bytes to skip when doing an
14228
             alignment.  */
14229
          for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
14230
            {
14231
              if (f->fr_type == rs_align || f->fr_type == rs_align_code)
14232
                {
14233
                  if (stretch < 0)
14234
                    stretch = - ((- stretch)
14235
                                 & ~ ((1 << (int) f->fr_offset) - 1));
14236
                  else
14237
                    stretch &= ~ ((1 << (int) f->fr_offset) - 1);
14238
                  if (stretch == 0)
14239
                    break;
14240
                }
14241
            }
14242
          if (f != NULL)
14243
            val += stretch;
14244
        }
14245
 
14246
      addr = fragp->fr_address + fragp->fr_fix;
14247
 
14248
      /* The base address rules are complicated.  The base address of
14249
         a branch is the following instruction.  The base address of a
14250
         PC relative load or add is the instruction itself, but if it
14251
         is in a delay slot (in which case it can not be extended) use
14252
         the address of the instruction whose delay slot it is in.  */
14253
      if (type == 'p' || type == 'q')
14254
        {
14255
          addr += 2;
14256
 
14257
          /* If we are currently assuming that this frag should be
14258
             extended, then, the current address is two bytes
14259
             higher.  */
14260
          if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14261
            addr += 2;
14262
 
14263
          /* Ignore the low bit in the target, since it will be set
14264
             for a text label.  */
14265
          if ((val & 1) != 0)
14266
            --val;
14267
        }
14268
      else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14269
        addr -= 4;
14270
      else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14271
        addr -= 2;
14272
 
14273
      val -= addr & ~ ((1 << op->shift) - 1);
14274
 
14275
      /* Branch offsets have an implicit 0 in the lowest bit.  */
14276
      if (type == 'p' || type == 'q')
14277
        val /= 2;
14278
 
14279
      /* If any of the shifted bits are set, we must use an extended
14280
         opcode.  If the address depends on the size of this
14281
         instruction, this can lead to a loop, so we arrange to always
14282
         use an extended opcode.  We only check this when we are in
14283
         the main relaxation loop, when SEC is NULL.  */
14284
      if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
14285
        {
14286
          fragp->fr_subtype =
14287
            RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
14288
          return 1;
14289
        }
14290
 
14291
      /* If we are about to mark a frag as extended because the value
14292
         is precisely maxtiny + 1, then there is a chance of an
14293
         infinite loop as in the following code:
14294
             la $4,foo
14295
             .skip      1020
14296
             .align     2
14297
           foo:
14298
         In this case when the la is extended, foo is 0x3fc bytes
14299
         away, so the la can be shrunk, but then foo is 0x400 away, so
14300
         the la must be extended.  To avoid this loop, we mark the
14301
         frag as extended if it was small, and is about to become
14302
         extended with a value of maxtiny + 1.  */
14303
      if (val == ((maxtiny + 1) << op->shift)
14304
          && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
14305
          && sec == NULL)
14306
        {
14307
          fragp->fr_subtype =
14308
            RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
14309
          return 1;
14310
        }
14311
    }
14312
  else if (symsec != absolute_section && sec != NULL)
14313
    as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
14314
 
14315
  if ((val & ((1 << op->shift) - 1)) != 0
14316
      || val < (mintiny << op->shift)
14317
      || val > (maxtiny << op->shift))
14318
    return 1;
14319
  else
14320
    return 0;
14321
}
14322
 
14323
/* Compute the length of a branch sequence, and adjust the
14324
   RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
14325
   worst-case length is computed, with UPDATE being used to indicate
14326
   whether an unconditional (-1), branch-likely (+1) or regular (0)
14327
   branch is to be computed.  */
14328
static int
14329
relaxed_branch_length (fragS *fragp, asection *sec, int update)
14330
{
14331
  bfd_boolean toofar;
14332
  int length;
14333
 
14334
  if (fragp
14335
      && S_IS_DEFINED (fragp->fr_symbol)
14336
      && sec == S_GET_SEGMENT (fragp->fr_symbol))
14337
    {
14338
      addressT addr;
14339
      offsetT val;
14340
 
14341
      val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
14342
 
14343
      addr = fragp->fr_address + fragp->fr_fix + 4;
14344
 
14345
      val -= addr;
14346
 
14347
      toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
14348
    }
14349
  else if (fragp)
14350
    /* If the symbol is not defined or it's in a different segment,
14351
       assume the user knows what's going on and emit a short
14352
       branch.  */
14353
    toofar = FALSE;
14354
  else
14355
    toofar = TRUE;
14356
 
14357
  if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14358
    fragp->fr_subtype
14359
      = RELAX_BRANCH_ENCODE (RELAX_BRANCH_AT (fragp->fr_subtype),
14360
                             RELAX_BRANCH_UNCOND (fragp->fr_subtype),
14361
                             RELAX_BRANCH_LIKELY (fragp->fr_subtype),
14362
                             RELAX_BRANCH_LINK (fragp->fr_subtype),
14363
                             toofar);
14364
 
14365
  length = 4;
14366
  if (toofar)
14367
    {
14368
      if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
14369
        length += 8;
14370
 
14371
      if (mips_pic != NO_PIC)
14372
        {
14373
          /* Additional space for PIC loading of target address.  */
14374
          length += 8;
14375
          if (mips_opts.isa == ISA_MIPS1)
14376
            /* Additional space for $at-stabilizing nop.  */
14377
            length += 4;
14378
        }
14379
 
14380
      /* If branch is conditional.  */
14381
      if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
14382
        length += 8;
14383
    }
14384
 
14385
  return length;
14386
}
14387
 
14388
/* Estimate the size of a frag before relaxing.  Unless this is the
14389
   mips16, we are not really relaxing here, and the final size is
14390
   encoded in the subtype information.  For the mips16, we have to
14391
   decide whether we are using an extended opcode or not.  */
14392
 
14393
int
14394
md_estimate_size_before_relax (fragS *fragp, asection *segtype)
14395
{
14396
  int change;
14397
 
14398
  if (RELAX_BRANCH_P (fragp->fr_subtype))
14399
    {
14400
 
14401
      fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
14402
 
14403
      return fragp->fr_var;
14404
    }
14405
 
14406
  if (RELAX_MIPS16_P (fragp->fr_subtype))
14407
    /* We don't want to modify the EXTENDED bit here; it might get us
14408
       into infinite loops.  We change it only in mips_relax_frag().  */
14409
    return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
14410
 
14411
  if (mips_pic == NO_PIC)
14412
    change = nopic_need_relax (fragp->fr_symbol, 0);
14413
  else if (mips_pic == SVR4_PIC)
14414
    change = pic_need_relax (fragp->fr_symbol, segtype);
14415
  else if (mips_pic == VXWORKS_PIC)
14416
    /* For vxworks, GOT16 relocations never have a corresponding LO16.  */
14417
    change = 0;
14418
  else
14419
    abort ();
14420
 
14421
  if (change)
14422
    {
14423
      fragp->fr_subtype |= RELAX_USE_SECOND;
14424
      return -RELAX_FIRST (fragp->fr_subtype);
14425
    }
14426
  else
14427
    return -RELAX_SECOND (fragp->fr_subtype);
14428
}
14429
 
14430
/* This is called to see whether a reloc against a defined symbol
14431
   should be converted into a reloc against a section.  */
14432
 
14433
int
14434
mips_fix_adjustable (fixS *fixp)
14435
{
14436
  if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
14437
      || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14438
    return 0;
14439
 
14440
  if (fixp->fx_addsy == NULL)
14441
    return 1;
14442
 
14443
  /* If symbol SYM is in a mergeable section, relocations of the form
14444
     SYM + 0 can usually be made section-relative.  The mergeable data
14445
     is then identified by the section offset rather than by the symbol.
14446
 
14447
     However, if we're generating REL LO16 relocations, the offset is split
14448
     between the LO16 and parterning high part relocation.  The linker will
14449
     need to recalculate the complete offset in order to correctly identify
14450
     the merge data.
14451
 
14452
     The linker has traditionally not looked for the parterning high part
14453
     relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
14454
     placed anywhere.  Rather than break backwards compatibility by changing
14455
     this, it seems better not to force the issue, and instead keep the
14456
     original symbol.  This will work with either linker behavior.  */
14457
  if ((lo16_reloc_p (fixp->fx_r_type)
14458
       || reloc_needs_lo_p (fixp->fx_r_type))
14459
      && HAVE_IN_PLACE_ADDENDS
14460
      && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
14461
    return 0;
14462
 
14463
  /* There is no place to store an in-place offset for JALR relocations.
14464
     Likewise an in-range offset of PC-relative relocations may overflow
14465
     the in-place relocatable field if recalculated against the start
14466
     address of the symbol's containing section.  */
14467
  if (HAVE_IN_PLACE_ADDENDS
14468
      && (fixp->fx_pcrel || fixp->fx_r_type == BFD_RELOC_MIPS_JALR))
14469
    return 0;
14470
 
14471
#ifdef OBJ_ELF
14472
  /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
14473
     to a floating-point stub.  The same is true for non-R_MIPS16_26
14474
     relocations against MIPS16 functions; in this case, the stub becomes
14475
     the function's canonical address.
14476
 
14477
     Floating-point stubs are stored in unique .mips16.call.* or
14478
     .mips16.fn.* sections.  If a stub T for function F is in section S,
14479
     the first relocation in section S must be against F; this is how the
14480
     linker determines the target function.  All relocations that might
14481
     resolve to T must also be against F.  We therefore have the following
14482
     restrictions, which are given in an intentionally-redundant way:
14483
 
14484
       1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
14485
          symbols.
14486
 
14487
       2. We cannot reduce a stub's relocations against non-MIPS16 symbols
14488
          if that stub might be used.
14489
 
14490
       3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
14491
          symbols.
14492
 
14493
       4. We cannot reduce a stub's relocations against MIPS16 symbols if
14494
          that stub might be used.
14495
 
14496
     There is a further restriction:
14497
 
14498
       5. We cannot reduce R_MIPS16_26 relocations against MIPS16 symbols
14499
          on targets with in-place addends; the relocation field cannot
14500
          encode the low bit.
14501
 
14502
     For simplicity, we deal with (3)-(5) by not reducing _any_ relocation
14503
     against a MIPS16 symbol.
14504
 
14505
     We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
14506
     relocation against some symbol R, no relocation against R may be
14507
     reduced.  (Note that this deals with (2) as well as (1) because
14508
     relocations against global symbols will never be reduced on ELF
14509
     targets.)  This approach is a little simpler than trying to detect
14510
     stub sections, and gives the "all or nothing" per-symbol consistency
14511
     that we have for MIPS16 symbols.  */
14512
  if (IS_ELF
14513
      && fixp->fx_subsy == NULL
14514
      && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
14515
          || *symbol_get_tc (fixp->fx_addsy)))
14516
    return 0;
14517
#endif
14518
 
14519
  return 1;
14520
}
14521
 
14522
/* Translate internal representation of relocation info to BFD target
14523
   format.  */
14524
 
14525
arelent **
14526
tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
14527
{
14528
  static arelent *retval[4];
14529
  arelent *reloc;
14530
  bfd_reloc_code_real_type code;
14531
 
14532
  memset (retval, 0, sizeof(retval));
14533
  reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
14534
  reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
14535
  *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
14536
  reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
14537
 
14538
  if (fixp->fx_pcrel)
14539
    {
14540
      gas_assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2);
14541
 
14542
      /* At this point, fx_addnumber is "symbol offset - pcrel address".
14543
         Relocations want only the symbol offset.  */
14544
      reloc->addend = fixp->fx_addnumber + reloc->address;
14545
      if (!IS_ELF)
14546
        {
14547
          /* A gruesome hack which is a result of the gruesome gas
14548
             reloc handling.  What's worse, for COFF (as opposed to
14549
             ECOFF), we might need yet another copy of reloc->address.
14550
             See bfd_install_relocation.  */
14551
          reloc->addend += reloc->address;
14552
        }
14553
    }
14554
  else
14555
    reloc->addend = fixp->fx_addnumber;
14556
 
14557
  /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
14558
     entry to be used in the relocation's section offset.  */
14559
  if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14560
    {
14561
      reloc->address = reloc->addend;
14562
      reloc->addend = 0;
14563
    }
14564
 
14565
  code = fixp->fx_r_type;
14566
 
14567
  reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
14568
  if (reloc->howto == NULL)
14569
    {
14570
      as_bad_where (fixp->fx_file, fixp->fx_line,
14571
                    _("Can not represent %s relocation in this object file format"),
14572
                    bfd_get_reloc_code_name (code));
14573
      retval[0] = NULL;
14574
    }
14575
 
14576
  return retval;
14577
}
14578
 
14579
/* Relax a machine dependent frag.  This returns the amount by which
14580
   the current size of the frag should change.  */
14581
 
14582
int
14583
mips_relax_frag (asection *sec, fragS *fragp, long stretch)
14584
{
14585
  if (RELAX_BRANCH_P (fragp->fr_subtype))
14586
    {
14587
      offsetT old_var = fragp->fr_var;
14588
 
14589
      fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
14590
 
14591
      return fragp->fr_var - old_var;
14592
    }
14593
 
14594
  if (! RELAX_MIPS16_P (fragp->fr_subtype))
14595
    return 0;
14596
 
14597
  if (mips16_extended_frag (fragp, NULL, stretch))
14598
    {
14599
      if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14600
        return 0;
14601
      fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
14602
      return 2;
14603
    }
14604
  else
14605
    {
14606
      if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14607
        return 0;
14608
      fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
14609
      return -2;
14610
    }
14611
 
14612
  return 0;
14613
}
14614
 
14615
/* Convert a machine dependent frag.  */
14616
 
14617
void
14618
md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
14619
{
14620
  if (RELAX_BRANCH_P (fragp->fr_subtype))
14621
    {
14622
      bfd_byte *buf;
14623
      unsigned long insn;
14624
      expressionS exp;
14625
      fixS *fixp;
14626
 
14627
      buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
14628
 
14629
      if (target_big_endian)
14630
        insn = bfd_getb32 (buf);
14631
      else
14632
        insn = bfd_getl32 (buf);
14633
 
14634
      if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14635
        {
14636
          /* We generate a fixup instead of applying it right now
14637
             because, if there are linker relaxations, we're going to
14638
             need the relocations.  */
14639
          exp.X_op = O_symbol;
14640
          exp.X_add_symbol = fragp->fr_symbol;
14641
          exp.X_add_number = fragp->fr_offset;
14642
 
14643
          fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14644
                              4, &exp, TRUE, BFD_RELOC_16_PCREL_S2);
14645
          fixp->fx_file = fragp->fr_file;
14646
          fixp->fx_line = fragp->fr_line;
14647
 
14648
          md_number_to_chars ((char *) buf, insn, 4);
14649
          buf += 4;
14650
        }
14651
      else
14652
        {
14653
          int i;
14654
 
14655
          as_warn_where (fragp->fr_file, fragp->fr_line,
14656
                         _("Relaxed out-of-range branch into a jump"));
14657
 
14658
          if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
14659
            goto uncond;
14660
 
14661
          if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14662
            {
14663
              /* Reverse the branch.  */
14664
              switch ((insn >> 28) & 0xf)
14665
                {
14666
                case 4:
14667
                  /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
14668
                     have the condition reversed by tweaking a single
14669
                     bit, and their opcodes all have 0x4???????.  */
14670
                  gas_assert ((insn & 0xf1000000) == 0x41000000);
14671
                  insn ^= 0x00010000;
14672
                  break;
14673
 
14674
                case 0:
14675
                  /* bltz       0x04000000      bgez    0x04010000
14676
                     bltzal     0x04100000      bgezal  0x04110000  */
14677
                  gas_assert ((insn & 0xfc0e0000) == 0x04000000);
14678
                  insn ^= 0x00010000;
14679
                  break;
14680
 
14681
                case 1:
14682
                  /* beq        0x10000000      bne     0x14000000
14683
                     blez       0x18000000      bgtz    0x1c000000  */
14684
                  insn ^= 0x04000000;
14685
                  break;
14686
 
14687
                default:
14688
                  abort ();
14689
                }
14690
            }
14691
 
14692
          if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14693
            {
14694
              /* Clear the and-link bit.  */
14695
              gas_assert ((insn & 0xfc1c0000) == 0x04100000);
14696
 
14697
              /* bltzal         0x04100000      bgezal  0x04110000
14698
                 bltzall        0x04120000      bgezall 0x04130000  */
14699
              insn &= ~0x00100000;
14700
            }
14701
 
14702
          /* Branch over the branch (if the branch was likely) or the
14703
             full jump (not likely case).  Compute the offset from the
14704
             current instruction to branch to.  */
14705
          if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14706
            i = 16;
14707
          else
14708
            {
14709
              /* How many bytes in instructions we've already emitted?  */
14710
              i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14711
              /* How many bytes in instructions from here to the end?  */
14712
              i = fragp->fr_var - i;
14713
            }
14714
          /* Convert to instruction count.  */
14715
          i >>= 2;
14716
          /* Branch counts from the next instruction.  */
14717
          i--;
14718
          insn |= i;
14719
          /* Branch over the jump.  */
14720
          md_number_to_chars ((char *) buf, insn, 4);
14721
          buf += 4;
14722
 
14723
          /* nop */
14724
          md_number_to_chars ((char *) buf, 0, 4);
14725
          buf += 4;
14726
 
14727
          if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14728
            {
14729
              /* beql $0, $0, 2f */
14730
              insn = 0x50000000;
14731
              /* Compute the PC offset from the current instruction to
14732
                 the end of the variable frag.  */
14733
              /* How many bytes in instructions we've already emitted?  */
14734
              i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14735
              /* How many bytes in instructions from here to the end?  */
14736
              i = fragp->fr_var - i;
14737
              /* Convert to instruction count.  */
14738
              i >>= 2;
14739
              /* Don't decrement i, because we want to branch over the
14740
                 delay slot.  */
14741
 
14742
              insn |= i;
14743
              md_number_to_chars ((char *) buf, insn, 4);
14744
              buf += 4;
14745
 
14746
              md_number_to_chars ((char *) buf, 0, 4);
14747
              buf += 4;
14748
            }
14749
 
14750
        uncond:
14751
          if (mips_pic == NO_PIC)
14752
            {
14753
              /* j or jal.  */
14754
              insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
14755
                      ? 0x0c000000 : 0x08000000);
14756
              exp.X_op = O_symbol;
14757
              exp.X_add_symbol = fragp->fr_symbol;
14758
              exp.X_add_number = fragp->fr_offset;
14759
 
14760
              fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14761
                                  4, &exp, FALSE, BFD_RELOC_MIPS_JMP);
14762
              fixp->fx_file = fragp->fr_file;
14763
              fixp->fx_line = fragp->fr_line;
14764
 
14765
              md_number_to_chars ((char *) buf, insn, 4);
14766
              buf += 4;
14767
            }
14768
          else
14769
            {
14770
              unsigned long at = RELAX_BRANCH_AT (fragp->fr_subtype);
14771
 
14772
              /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
14773
              insn = HAVE_64BIT_ADDRESSES ? 0xdf800000 : 0x8f800000;
14774
              insn |= at << OP_SH_RT;
14775
              exp.X_op = O_symbol;
14776
              exp.X_add_symbol = fragp->fr_symbol;
14777
              exp.X_add_number = fragp->fr_offset;
14778
 
14779
              if (fragp->fr_offset)
14780
                {
14781
                  exp.X_add_symbol = make_expr_symbol (&exp);
14782
                  exp.X_add_number = 0;
14783
                }
14784
 
14785
              fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14786
                                  4, &exp, FALSE, BFD_RELOC_MIPS_GOT16);
14787
              fixp->fx_file = fragp->fr_file;
14788
              fixp->fx_line = fragp->fr_line;
14789
 
14790
              md_number_to_chars ((char *) buf, insn, 4);
14791
              buf += 4;
14792
 
14793
              if (mips_opts.isa == ISA_MIPS1)
14794
                {
14795
                  /* nop */
14796
                  md_number_to_chars ((char *) buf, 0, 4);
14797
                  buf += 4;
14798
                }
14799
 
14800
              /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
14801
              insn = HAVE_64BIT_ADDRESSES ? 0x64000000 : 0x24000000;
14802
              insn |= at << OP_SH_RS | at << OP_SH_RT;
14803
 
14804
              fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14805
                                  4, &exp, FALSE, BFD_RELOC_LO16);
14806
              fixp->fx_file = fragp->fr_file;
14807
              fixp->fx_line = fragp->fr_line;
14808
 
14809
              md_number_to_chars ((char *) buf, insn, 4);
14810
              buf += 4;
14811
 
14812
              /* j(al)r $at.  */
14813
              if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14814
                insn = 0x0000f809;
14815
              else
14816
                insn = 0x00000008;
14817
              insn |= at << OP_SH_RS;
14818
 
14819
              md_number_to_chars ((char *) buf, insn, 4);
14820
              buf += 4;
14821
            }
14822
        }
14823
 
14824
      gas_assert (buf == (bfd_byte *)fragp->fr_literal
14825
              + fragp->fr_fix + fragp->fr_var);
14826
 
14827
      fragp->fr_fix += fragp->fr_var;
14828
 
14829
      return;
14830
    }
14831
 
14832
  if (RELAX_MIPS16_P (fragp->fr_subtype))
14833
    {
14834
      int type;
14835
      const struct mips16_immed_operand *op;
14836
      bfd_boolean small, ext;
14837
      offsetT val;
14838
      bfd_byte *buf;
14839
      unsigned long insn;
14840
      bfd_boolean use_extend;
14841
      unsigned short extend;
14842
 
14843
      type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14844
      op = mips16_immed_operands;
14845
      while (op->type != type)
14846
        ++op;
14847
 
14848
      if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14849
        {
14850
          small = FALSE;
14851
          ext = TRUE;
14852
        }
14853
      else
14854
        {
14855
          small = TRUE;
14856
          ext = FALSE;
14857
        }
14858
 
14859
      val = resolve_symbol_value (fragp->fr_symbol);
14860
      if (op->pcrel)
14861
        {
14862
          addressT addr;
14863
 
14864
          addr = fragp->fr_address + fragp->fr_fix;
14865
 
14866
          /* The rules for the base address of a PC relative reloc are
14867
             complicated; see mips16_extended_frag.  */
14868
          if (type == 'p' || type == 'q')
14869
            {
14870
              addr += 2;
14871
              if (ext)
14872
                addr += 2;
14873
              /* Ignore the low bit in the target, since it will be
14874
                 set for a text label.  */
14875
              if ((val & 1) != 0)
14876
                --val;
14877
            }
14878
          else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14879
            addr -= 4;
14880
          else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14881
            addr -= 2;
14882
 
14883
          addr &= ~ (addressT) ((1 << op->shift) - 1);
14884
          val -= addr;
14885
 
14886
          /* Make sure the section winds up with the alignment we have
14887
             assumed.  */
14888
          if (op->shift > 0)
14889
            record_alignment (asec, op->shift);
14890
        }
14891
 
14892
      if (ext
14893
          && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
14894
              || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
14895
        as_warn_where (fragp->fr_file, fragp->fr_line,
14896
                       _("extended instruction in delay slot"));
14897
 
14898
      buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
14899
 
14900
      if (target_big_endian)
14901
        insn = bfd_getb16 (buf);
14902
      else
14903
        insn = bfd_getl16 (buf);
14904
 
14905
      mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
14906
                    RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
14907
                    small, ext, &insn, &use_extend, &extend);
14908
 
14909
      if (use_extend)
14910
        {
14911
          md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
14912
          fragp->fr_fix += 2;
14913
          buf += 2;
14914
        }
14915
 
14916
      md_number_to_chars ((char *) buf, insn, 2);
14917
      fragp->fr_fix += 2;
14918
      buf += 2;
14919
    }
14920
  else
14921
    {
14922
      int first, second;
14923
      fixS *fixp;
14924
 
14925
      first = RELAX_FIRST (fragp->fr_subtype);
14926
      second = RELAX_SECOND (fragp->fr_subtype);
14927
      fixp = (fixS *) fragp->fr_opcode;
14928
 
14929
      /* Possibly emit a warning if we've chosen the longer option.  */
14930
      if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
14931
          == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
14932
        {
14933
          const char *msg = macro_warning (fragp->fr_subtype);
14934
          if (msg != 0)
14935
            as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
14936
        }
14937
 
14938
      /* Go through all the fixups for the first sequence.  Disable them
14939
         (by marking them as done) if we're going to use the second
14940
         sequence instead.  */
14941
      while (fixp
14942
             && fixp->fx_frag == fragp
14943
             && fixp->fx_where < fragp->fr_fix - second)
14944
        {
14945
          if (fragp->fr_subtype & RELAX_USE_SECOND)
14946
            fixp->fx_done = 1;
14947
          fixp = fixp->fx_next;
14948
        }
14949
 
14950
      /* Go through the fixups for the second sequence.  Disable them if
14951
         we're going to use the first sequence, otherwise adjust their
14952
         addresses to account for the relaxation.  */
14953
      while (fixp && fixp->fx_frag == fragp)
14954
        {
14955
          if (fragp->fr_subtype & RELAX_USE_SECOND)
14956
            fixp->fx_where -= first;
14957
          else
14958
            fixp->fx_done = 1;
14959
          fixp = fixp->fx_next;
14960
        }
14961
 
14962
      /* Now modify the frag contents.  */
14963
      if (fragp->fr_subtype & RELAX_USE_SECOND)
14964
        {
14965
          char *start;
14966
 
14967
          start = fragp->fr_literal + fragp->fr_fix - first - second;
14968
          memmove (start, start + first, second);
14969
          fragp->fr_fix -= first;
14970
        }
14971
      else
14972
        fragp->fr_fix -= second;
14973
    }
14974
}
14975
 
14976
#ifdef OBJ_ELF
14977
 
14978
/* This function is called after the relocs have been generated.
14979
   We've been storing mips16 text labels as odd.  Here we convert them
14980
   back to even for the convenience of the debugger.  */
14981
 
14982
void
14983
mips_frob_file_after_relocs (void)
14984
{
14985
  asymbol **syms;
14986
  unsigned int count, i;
14987
 
14988
  if (!IS_ELF)
14989
    return;
14990
 
14991
  syms = bfd_get_outsymbols (stdoutput);
14992
  count = bfd_get_symcount (stdoutput);
14993
  for (i = 0; i < count; i++, syms++)
14994
    {
14995
      if (ELF_ST_IS_MIPS16 (elf_symbol (*syms)->internal_elf_sym.st_other)
14996
          && ((*syms)->value & 1) != 0)
14997
        {
14998
          (*syms)->value &= ~1;
14999
          /* If the symbol has an odd size, it was probably computed
15000
             incorrectly, so adjust that as well.  */
15001
          if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
15002
            ++elf_symbol (*syms)->internal_elf_sym.st_size;
15003
        }
15004
    }
15005
}
15006
 
15007
#endif
15008
 
15009
/* This function is called whenever a label is defined, including fake
15010
   labels instantiated off the dot special symbol.  It is used when
15011
   handling branch delays; if a branch has a label, we assume we cannot
15012
   move it.  This also bumps the value of the symbol by 1 in compressed
15013
   code.  */
15014
 
15015
void
15016
mips_record_label (symbolS *sym)
15017
{
15018
  segment_info_type *si = seg_info (now_seg);
15019
  struct insn_label_list *l;
15020
 
15021
  if (free_insn_labels == NULL)
15022
    l = (struct insn_label_list *) xmalloc (sizeof *l);
15023
  else
15024
    {
15025
      l = free_insn_labels;
15026
      free_insn_labels = l->next;
15027
    }
15028
 
15029
  l->label = sym;
15030
  l->next = si->label_list;
15031
  si->label_list = l;
15032
}
15033
 
15034
/* This function is called as tc_frob_label() whenever a label is defined
15035
   and adds a DWARF-2 record we only want for true labels.  */
15036
 
15037
void
15038
mips_define_label (symbolS *sym)
15039
{
15040
  mips_record_label (sym);
15041
#ifdef OBJ_ELF
15042
  dwarf2_emit_label (sym);
15043
#endif
15044
}
15045
 
15046
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
15047
 
15048
/* Some special processing for a MIPS ELF file.  */
15049
 
15050
void
15051
mips_elf_final_processing (void)
15052
{
15053
  /* Write out the register information.  */
15054
  if (mips_abi != N64_ABI)
15055
    {
15056
      Elf32_RegInfo s;
15057
 
15058
      s.ri_gprmask = mips_gprmask;
15059
      s.ri_cprmask[0] = mips_cprmask[0];
15060
      s.ri_cprmask[1] = mips_cprmask[1];
15061
      s.ri_cprmask[2] = mips_cprmask[2];
15062
      s.ri_cprmask[3] = mips_cprmask[3];
15063
      /* The gp_value field is set by the MIPS ELF backend.  */
15064
 
15065
      bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
15066
                                       ((Elf32_External_RegInfo *)
15067
                                        mips_regmask_frag));
15068
    }
15069
  else
15070
    {
15071
      Elf64_Internal_RegInfo s;
15072
 
15073
      s.ri_gprmask = mips_gprmask;
15074
      s.ri_pad = 0;
15075
      s.ri_cprmask[0] = mips_cprmask[0];
15076
      s.ri_cprmask[1] = mips_cprmask[1];
15077
      s.ri_cprmask[2] = mips_cprmask[2];
15078
      s.ri_cprmask[3] = mips_cprmask[3];
15079
      /* The gp_value field is set by the MIPS ELF backend.  */
15080
 
15081
      bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
15082
                                       ((Elf64_External_RegInfo *)
15083
                                        mips_regmask_frag));
15084
    }
15085
 
15086
  /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
15087
     sort of BFD interface for this.  */
15088
  if (mips_any_noreorder)
15089
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
15090
  if (mips_pic != NO_PIC)
15091
    {
15092
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
15093
      elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
15094
    }
15095
  if (mips_abicalls)
15096
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
15097
 
15098
  /* Set MIPS ELF flags for ASEs.  */
15099
  /* We may need to define a new flag for DSP ASE, and set this flag when
15100
     file_ase_dsp is true.  */
15101
  /* Same for DSP R2.  */
15102
  /* We may need to define a new flag for MT ASE, and set this flag when
15103
     file_ase_mt is true.  */
15104
  if (file_ase_mips16)
15105
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
15106
#if 0 /* XXX FIXME */
15107
  if (file_ase_mips3d)
15108
    elf_elfheader (stdoutput)->e_flags |= ???;
15109
#endif
15110
  if (file_ase_mdmx)
15111
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
15112
 
15113
  /* Set the MIPS ELF ABI flags.  */
15114
  if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
15115
    elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
15116
  else if (mips_abi == O64_ABI)
15117
    elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
15118
  else if (mips_abi == EABI_ABI)
15119
    {
15120
      if (!file_mips_gp32)
15121
        elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
15122
      else
15123
        elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
15124
    }
15125
  else if (mips_abi == N32_ABI)
15126
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
15127
 
15128
  /* Nothing to do for N64_ABI.  */
15129
 
15130
  if (mips_32bitmode)
15131
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
15132
 
15133
#if 0 /* XXX FIXME */
15134
  /* 32 bit code with 64 bit FP registers.  */
15135
  if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
15136
    elf_elfheader (stdoutput)->e_flags |= ???;
15137
#endif
15138
}
15139
 
15140
#endif /* OBJ_ELF || OBJ_MAYBE_ELF */
15141
 
15142
typedef struct proc {
15143
  symbolS *func_sym;
15144
  symbolS *func_end_sym;
15145
  unsigned long reg_mask;
15146
  unsigned long reg_offset;
15147
  unsigned long fpreg_mask;
15148
  unsigned long fpreg_offset;
15149
  unsigned long frame_offset;
15150
  unsigned long frame_reg;
15151
  unsigned long pc_reg;
15152
} procS;
15153
 
15154
static procS cur_proc;
15155
static procS *cur_proc_ptr;
15156
static int numprocs;
15157
 
15158
/* Implement NOP_OPCODE.  We encode a MIPS16 nop as "1" and a normal
15159
   nop as "0".  */
15160
 
15161
char
15162
mips_nop_opcode (void)
15163
{
15164
  return seg_info (now_seg)->tc_segment_info_data.mips16;
15165
}
15166
 
15167
/* Fill in an rs_align_code fragment.  This only needs to do something
15168
   for MIPS16 code, where 0 is not a nop.  */
15169
 
15170
void
15171
mips_handle_align (fragS *fragp)
15172
{
15173
  char *p;
15174
  int bytes, size, excess;
15175
  valueT opcode;
15176
 
15177
  if (fragp->fr_type != rs_align_code)
15178
    return;
15179
 
15180
  p = fragp->fr_literal + fragp->fr_fix;
15181
  if (*p)
15182
    {
15183
      opcode = mips16_nop_insn.insn_opcode;
15184
      size = 2;
15185
    }
15186
  else
15187
    {
15188
      opcode = nop_insn.insn_opcode;
15189
      size = 4;
15190
    }
15191
 
15192
  bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
15193
  excess = bytes % size;
15194
  if (excess != 0)
15195
    {
15196
      /* If we're not inserting a whole number of instructions,
15197
         pad the end of the fixed part of the frag with zeros.  */
15198
      memset (p, 0, excess);
15199
      p += excess;
15200
      fragp->fr_fix += excess;
15201
    }
15202
 
15203
  md_number_to_chars (p, opcode, size);
15204
  fragp->fr_var = size;
15205
}
15206
 
15207
static void
15208
md_obj_begin (void)
15209
{
15210
}
15211
 
15212
static void
15213
md_obj_end (void)
15214
{
15215
  /* Check for premature end, nesting errors, etc.  */
15216
  if (cur_proc_ptr)
15217
    as_warn (_("missing .end at end of assembly"));
15218
}
15219
 
15220
static long
15221
get_number (void)
15222
{
15223
  int negative = 0;
15224
  long val = 0;
15225
 
15226
  if (*input_line_pointer == '-')
15227
    {
15228
      ++input_line_pointer;
15229
      negative = 1;
15230
    }
15231
  if (!ISDIGIT (*input_line_pointer))
15232
    as_bad (_("expected simple number"));
15233
  if (input_line_pointer[0] == '0')
15234
    {
15235
      if (input_line_pointer[1] == 'x')
15236
        {
15237
          input_line_pointer += 2;
15238
          while (ISXDIGIT (*input_line_pointer))
15239
            {
15240
              val <<= 4;
15241
              val |= hex_value (*input_line_pointer++);
15242
            }
15243
          return negative ? -val : val;
15244
        }
15245
      else
15246
        {
15247
          ++input_line_pointer;
15248
          while (ISDIGIT (*input_line_pointer))
15249
            {
15250
              val <<= 3;
15251
              val |= *input_line_pointer++ - '0';
15252
            }
15253
          return negative ? -val : val;
15254
        }
15255
    }
15256
  if (!ISDIGIT (*input_line_pointer))
15257
    {
15258
      printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
15259
              *input_line_pointer, *input_line_pointer);
15260
      as_warn (_("invalid number"));
15261
      return -1;
15262
    }
15263
  while (ISDIGIT (*input_line_pointer))
15264
    {
15265
      val *= 10;
15266
      val += *input_line_pointer++ - '0';
15267
    }
15268
  return negative ? -val : val;
15269
}
15270
 
15271
/* The .file directive; just like the usual .file directive, but there
15272
   is an initial number which is the ECOFF file index.  In the non-ECOFF
15273
   case .file implies DWARF-2.  */
15274
 
15275
static void
15276
s_mips_file (int x ATTRIBUTE_UNUSED)
15277
{
15278
  static int first_file_directive = 0;
15279
 
15280
  if (ECOFF_DEBUGGING)
15281
    {
15282
      get_number ();
15283
      s_app_file (0);
15284
    }
15285
  else
15286
    {
15287
      char *filename;
15288
 
15289
      filename = dwarf2_directive_file (0);
15290
 
15291
      /* Versions of GCC up to 3.1 start files with a ".file"
15292
         directive even for stabs output.  Make sure that this
15293
         ".file" is handled.  Note that you need a version of GCC
15294
         after 3.1 in order to support DWARF-2 on MIPS.  */
15295
      if (filename != NULL && ! first_file_directive)
15296
        {
15297
          (void) new_logical_line (filename, -1);
15298
          s_app_file_string (filename, 0);
15299
        }
15300
      first_file_directive = 1;
15301
    }
15302
}
15303
 
15304
/* The .loc directive, implying DWARF-2.  */
15305
 
15306
static void
15307
s_mips_loc (int x ATTRIBUTE_UNUSED)
15308
{
15309
  if (!ECOFF_DEBUGGING)
15310
    dwarf2_directive_loc (0);
15311
}
15312
 
15313
/* The .end directive.  */
15314
 
15315
static void
15316
s_mips_end (int x ATTRIBUTE_UNUSED)
15317
{
15318
  symbolS *p;
15319
 
15320
  /* Following functions need their own .frame and .cprestore directives.  */
15321
  mips_frame_reg_valid = 0;
15322
  mips_cprestore_valid = 0;
15323
 
15324
  if (!is_end_of_line[(unsigned char) *input_line_pointer])
15325
    {
15326
      p = get_symbol ();
15327
      demand_empty_rest_of_line ();
15328
    }
15329
  else
15330
    p = NULL;
15331
 
15332
  if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
15333
    as_warn (_(".end not in text section"));
15334
 
15335
  if (!cur_proc_ptr)
15336
    {
15337
      as_warn (_(".end directive without a preceding .ent directive."));
15338
      demand_empty_rest_of_line ();
15339
      return;
15340
    }
15341
 
15342
  if (p != NULL)
15343
    {
15344
      gas_assert (S_GET_NAME (p));
15345
      if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
15346
        as_warn (_(".end symbol does not match .ent symbol."));
15347
 
15348
      if (debug_type == DEBUG_STABS)
15349
        stabs_generate_asm_endfunc (S_GET_NAME (p),
15350
                                    S_GET_NAME (p));
15351
    }
15352
  else
15353
    as_warn (_(".end directive missing or unknown symbol"));
15354
 
15355
#ifdef OBJ_ELF
15356
  /* Create an expression to calculate the size of the function.  */
15357
  if (p && cur_proc_ptr)
15358
    {
15359
      OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
15360
      expressionS *exp = xmalloc (sizeof (expressionS));
15361
 
15362
      obj->size = exp;
15363
      exp->X_op = O_subtract;
15364
      exp->X_add_symbol = symbol_temp_new_now ();
15365
      exp->X_op_symbol = p;
15366
      exp->X_add_number = 0;
15367
 
15368
      cur_proc_ptr->func_end_sym = exp->X_add_symbol;
15369
    }
15370
 
15371
  /* Generate a .pdr section.  */
15372
  if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
15373
    {
15374
      segT saved_seg = now_seg;
15375
      subsegT saved_subseg = now_subseg;
15376
      expressionS exp;
15377
      char *fragp;
15378
 
15379
#ifdef md_flush_pending_output
15380
      md_flush_pending_output ();
15381
#endif
15382
 
15383
      gas_assert (pdr_seg);
15384
      subseg_set (pdr_seg, 0);
15385
 
15386
      /* Write the symbol.  */
15387
      exp.X_op = O_symbol;
15388
      exp.X_add_symbol = p;
15389
      exp.X_add_number = 0;
15390
      emit_expr (&exp, 4);
15391
 
15392
      fragp = frag_more (7 * 4);
15393
 
15394
      md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
15395
      md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
15396
      md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
15397
      md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
15398
      md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
15399
      md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
15400
      md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
15401
 
15402
      subseg_set (saved_seg, saved_subseg);
15403
    }
15404
#endif /* OBJ_ELF */
15405
 
15406
  cur_proc_ptr = NULL;
15407
}
15408
 
15409
/* The .aent and .ent directives.  */
15410
 
15411
static void
15412
s_mips_ent (int aent)
15413
{
15414
  symbolS *symbolP;
15415
 
15416
  symbolP = get_symbol ();
15417
  if (*input_line_pointer == ',')
15418
    ++input_line_pointer;
15419
  SKIP_WHITESPACE ();
15420
  if (ISDIGIT (*input_line_pointer)
15421
      || *input_line_pointer == '-')
15422
    get_number ();
15423
 
15424
  if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
15425
    as_warn (_(".ent or .aent not in text section."));
15426
 
15427
  if (!aent && cur_proc_ptr)
15428
    as_warn (_("missing .end"));
15429
 
15430
  if (!aent)
15431
    {
15432
      /* This function needs its own .frame and .cprestore directives.  */
15433
      mips_frame_reg_valid = 0;
15434
      mips_cprestore_valid = 0;
15435
 
15436
      cur_proc_ptr = &cur_proc;
15437
      memset (cur_proc_ptr, '\0', sizeof (procS));
15438
 
15439
      cur_proc_ptr->func_sym = symbolP;
15440
 
15441
      ++numprocs;
15442
 
15443
      if (debug_type == DEBUG_STABS)
15444
        stabs_generate_asm_func (S_GET_NAME (symbolP),
15445
                                 S_GET_NAME (symbolP));
15446
    }
15447
 
15448
  symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
15449
 
15450
  demand_empty_rest_of_line ();
15451
}
15452
 
15453
/* The .frame directive. If the mdebug section is present (IRIX 5 native)
15454
   then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
15455
   s_mips_frame is used so that we can set the PDR information correctly.
15456
   We can't use the ecoff routines because they make reference to the ecoff
15457
   symbol table (in the mdebug section).  */
15458
 
15459
static void
15460
s_mips_frame (int ignore ATTRIBUTE_UNUSED)
15461
{
15462
#ifdef OBJ_ELF
15463
  if (IS_ELF && !ECOFF_DEBUGGING)
15464
    {
15465
      long val;
15466
 
15467
      if (cur_proc_ptr == (procS *) NULL)
15468
        {
15469
          as_warn (_(".frame outside of .ent"));
15470
          demand_empty_rest_of_line ();
15471
          return;
15472
        }
15473
 
15474
      cur_proc_ptr->frame_reg = tc_get_register (1);
15475
 
15476
      SKIP_WHITESPACE ();
15477
      if (*input_line_pointer++ != ','
15478
          || get_absolute_expression_and_terminator (&val) != ',')
15479
        {
15480
          as_warn (_("Bad .frame directive"));
15481
          --input_line_pointer;
15482
          demand_empty_rest_of_line ();
15483
          return;
15484
        }
15485
 
15486
      cur_proc_ptr->frame_offset = val;
15487
      cur_proc_ptr->pc_reg = tc_get_register (0);
15488
 
15489
      demand_empty_rest_of_line ();
15490
    }
15491
  else
15492
#endif /* OBJ_ELF */
15493
    s_ignore (ignore);
15494
}
15495
 
15496
/* The .fmask and .mask directives. If the mdebug section is present
15497
   (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
15498
   embedded targets, s_mips_mask is used so that we can set the PDR
15499
   information correctly. We can't use the ecoff routines because they
15500
   make reference to the ecoff symbol table (in the mdebug section).  */
15501
 
15502
static void
15503
s_mips_mask (int reg_type)
15504
{
15505
#ifdef OBJ_ELF
15506
  if (IS_ELF && !ECOFF_DEBUGGING)
15507
    {
15508
      long mask, off;
15509
 
15510
      if (cur_proc_ptr == (procS *) NULL)
15511
        {
15512
          as_warn (_(".mask/.fmask outside of .ent"));
15513
          demand_empty_rest_of_line ();
15514
          return;
15515
        }
15516
 
15517
      if (get_absolute_expression_and_terminator (&mask) != ',')
15518
        {
15519
          as_warn (_("Bad .mask/.fmask directive"));
15520
          --input_line_pointer;
15521
          demand_empty_rest_of_line ();
15522
          return;
15523
        }
15524
 
15525
      off = get_absolute_expression ();
15526
 
15527
      if (reg_type == 'F')
15528
        {
15529
          cur_proc_ptr->fpreg_mask = mask;
15530
          cur_proc_ptr->fpreg_offset = off;
15531
        }
15532
      else
15533
        {
15534
          cur_proc_ptr->reg_mask = mask;
15535
          cur_proc_ptr->reg_offset = off;
15536
        }
15537
 
15538
      demand_empty_rest_of_line ();
15539
    }
15540
  else
15541
#endif /* OBJ_ELF */
15542
    s_ignore (reg_type);
15543
}
15544
 
15545
/* A table describing all the processors gas knows about.  Names are
15546
   matched in the order listed.
15547
 
15548
   To ease comparison, please keep this table in the same order as
15549
   gcc's mips_cpu_info_table[].  */
15550
static const struct mips_cpu_info mips_cpu_info_table[] =
15551
{
15552
  /* Entries for generic ISAs */
15553
  { "mips1",          MIPS_CPU_IS_ISA,          ISA_MIPS1,      CPU_R3000 },
15554
  { "mips2",          MIPS_CPU_IS_ISA,          ISA_MIPS2,      CPU_R6000 },
15555
  { "mips3",          MIPS_CPU_IS_ISA,          ISA_MIPS3,      CPU_R4000 },
15556
  { "mips4",          MIPS_CPU_IS_ISA,          ISA_MIPS4,      CPU_R8000 },
15557
  { "mips5",          MIPS_CPU_IS_ISA,          ISA_MIPS5,      CPU_MIPS5 },
15558
  { "mips32",         MIPS_CPU_IS_ISA,          ISA_MIPS32,     CPU_MIPS32 },
15559
  { "mips32r2",       MIPS_CPU_IS_ISA,          ISA_MIPS32R2,   CPU_MIPS32R2 },
15560
  { "mips64",         MIPS_CPU_IS_ISA,          ISA_MIPS64,     CPU_MIPS64 },
15561
  { "mips64r2",       MIPS_CPU_IS_ISA,          ISA_MIPS64R2,   CPU_MIPS64R2 },
15562
 
15563
  /* MIPS I */
15564
  { "r3000",          0,                 ISA_MIPS1,      CPU_R3000 },
15565
  { "r2000",          0,                 ISA_MIPS1,      CPU_R3000 },
15566
  { "r3900",          0,                 ISA_MIPS1,      CPU_R3900 },
15567
 
15568
  /* MIPS II */
15569
  { "r6000",          0,                 ISA_MIPS2,      CPU_R6000 },
15570
 
15571
  /* MIPS III */
15572
  { "r4000",          0,                 ISA_MIPS3,      CPU_R4000 },
15573
  { "r4010",          0,                 ISA_MIPS2,      CPU_R4010 },
15574
  { "vr4100",         0,                 ISA_MIPS3,      CPU_VR4100 },
15575
  { "vr4111",         0,                 ISA_MIPS3,      CPU_R4111 },
15576
  { "vr4120",         0,                 ISA_MIPS3,      CPU_VR4120 },
15577
  { "vr4130",         0,                 ISA_MIPS3,      CPU_VR4120 },
15578
  { "vr4181",         0,                 ISA_MIPS3,      CPU_R4111 },
15579
  { "vr4300",         0,                 ISA_MIPS3,      CPU_R4300 },
15580
  { "r4400",          0,                 ISA_MIPS3,      CPU_R4400 },
15581
  { "r4600",          0,                 ISA_MIPS3,      CPU_R4600 },
15582
  { "orion",          0,                 ISA_MIPS3,      CPU_R4600 },
15583
  { "r4650",          0,                 ISA_MIPS3,      CPU_R4650 },
15584
  /* ST Microelectronics Loongson 2E and 2F cores */
15585
  { "loongson2e",     0,                 ISA_MIPS3,   CPU_LOONGSON_2E },
15586
  { "loongson2f",     0,                 ISA_MIPS3,   CPU_LOONGSON_2F },
15587
 
15588
  /* MIPS IV */
15589
  { "r8000",          0,                 ISA_MIPS4,      CPU_R8000 },
15590
  { "r10000",         0,                 ISA_MIPS4,      CPU_R10000 },
15591
  { "r12000",         0,                 ISA_MIPS4,      CPU_R12000 },
15592
  { "r14000",         0,                 ISA_MIPS4,      CPU_R14000 },
15593
  { "r16000",         0,                 ISA_MIPS4,      CPU_R16000 },
15594
  { "vr5000",         0,                 ISA_MIPS4,      CPU_R5000 },
15595
  { "vr5400",         0,                 ISA_MIPS4,      CPU_VR5400 },
15596
  { "vr5500",         0,                 ISA_MIPS4,      CPU_VR5500 },
15597
  { "rm5200",         0,                 ISA_MIPS4,      CPU_R5000 },
15598
  { "rm5230",         0,                 ISA_MIPS4,      CPU_R5000 },
15599
  { "rm5231",         0,                 ISA_MIPS4,      CPU_R5000 },
15600
  { "rm5261",         0,                 ISA_MIPS4,      CPU_R5000 },
15601
  { "rm5721",         0,                 ISA_MIPS4,      CPU_R5000 },
15602
  { "rm7000",         0,                 ISA_MIPS4,      CPU_RM7000 },
15603
  { "rm9000",         0,                 ISA_MIPS4,      CPU_RM9000 },
15604
 
15605
  /* MIPS 32 */
15606
  { "4kc",            0,                 ISA_MIPS32,     CPU_MIPS32 },
15607
  { "4km",            0,                 ISA_MIPS32,     CPU_MIPS32 },
15608
  { "4kp",            0,                 ISA_MIPS32,     CPU_MIPS32 },
15609
  { "4ksc",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32,     CPU_MIPS32 },
15610
 
15611
  /* MIPS 32 Release 2 */
15612
  { "4kec",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15613
  { "4kem",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15614
  { "4kep",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15615
  { "4ksd",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32R2,   CPU_MIPS32R2 },
15616
  { "m4k",            0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15617
  { "m4kp",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15618
  { "24kc",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15619
  { "24kf2_1",        0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15620
  { "24kf",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15621
  { "24kf1_1",        0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15622
  /* Deprecated forms of the above.  */
15623
  { "24kfx",          0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15624
  { "24kx",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15625
  /* 24KE is a 24K with DSP ASE, other ASEs are optional.  */
15626
  { "24kec",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15627
  { "24kef2_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15628
  { "24kef",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15629
  { "24kef1_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15630
  /* Deprecated forms of the above.  */
15631
  { "24kefx",         MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15632
  { "24kex",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15633
  /* 34K is a 24K with DSP and MT ASE, other ASEs are optional.  */
15634
  { "34kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15635
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15636
  { "34kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15637
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15638
  { "34kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15639
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15640
  { "34kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15641
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15642
  /* Deprecated forms of the above.  */
15643
  { "34kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15644
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15645
  { "34kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15646
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15647
  /* 74K with DSP and DSPR2 ASE, other ASEs are optional.  */
15648
  { "74kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15649
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15650
  { "74kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15651
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15652
  { "74kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15653
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15654
  { "74kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15655
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15656
  { "74kf3_2",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15657
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15658
  /* Deprecated forms of the above.  */
15659
  { "74kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15660
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15661
  { "74kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15662
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15663
  /* 1004K cores are multiprocessor versions of the 34K.  */
15664
  { "1004kc",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15665
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15666
  { "1004kf2_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15667
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15668
  { "1004kf",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15669
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15670
  { "1004kf1_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15671
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15672
 
15673
  /* MIPS 64 */
15674
  { "5kc",            0,                 ISA_MIPS64,     CPU_MIPS64 },
15675
  { "5kf",            0,                 ISA_MIPS64,     CPU_MIPS64 },
15676
  { "20kc",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
15677
  { "25kf",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
15678
 
15679
  /* Broadcom SB-1 CPU core */
15680
  { "sb1",            MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15681
                                                ISA_MIPS64,     CPU_SB1 },
15682
  /* Broadcom SB-1A CPU core */
15683
  { "sb1a",           MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15684
                                                ISA_MIPS64,     CPU_SB1 },
15685
 
15686
  { "loongson3a",     0,                 ISA_MIPS64,     CPU_LOONGSON_3A },
15687
 
15688
  /* MIPS 64 Release 2 */
15689
 
15690
  /* Cavium Networks Octeon CPU core */
15691
  { "octeon",         0,      ISA_MIPS64R2,   CPU_OCTEON },
15692
 
15693
  /* RMI Xlr */
15694
  { "xlr",            0,      ISA_MIPS64,     CPU_XLR },
15695
 
15696
  /* End marker */
15697
  { NULL, 0, 0, 0 }
15698
};
15699
 
15700
 
15701
/* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
15702
   with a final "000" replaced by "k".  Ignore case.
15703
 
15704
   Note: this function is shared between GCC and GAS.  */
15705
 
15706
static bfd_boolean
15707
mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
15708
{
15709
  while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
15710
    given++, canonical++;
15711
 
15712
  return ((*given == 0 && *canonical == 0)
15713
          || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
15714
}
15715
 
15716
 
15717
/* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
15718
   CPU name.  We've traditionally allowed a lot of variation here.
15719
 
15720
   Note: this function is shared between GCC and GAS.  */
15721
 
15722
static bfd_boolean
15723
mips_matching_cpu_name_p (const char *canonical, const char *given)
15724
{
15725
  /* First see if the name matches exactly, or with a final "000"
15726
     turned into "k".  */
15727
  if (mips_strict_matching_cpu_name_p (canonical, given))
15728
    return TRUE;
15729
 
15730
  /* If not, try comparing based on numerical designation alone.
15731
     See if GIVEN is an unadorned number, or 'r' followed by a number.  */
15732
  if (TOLOWER (*given) == 'r')
15733
    given++;
15734
  if (!ISDIGIT (*given))
15735
    return FALSE;
15736
 
15737
  /* Skip over some well-known prefixes in the canonical name,
15738
     hoping to find a number there too.  */
15739
  if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
15740
    canonical += 2;
15741
  else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
15742
    canonical += 2;
15743
  else if (TOLOWER (canonical[0]) == 'r')
15744
    canonical += 1;
15745
 
15746
  return mips_strict_matching_cpu_name_p (canonical, given);
15747
}
15748
 
15749
 
15750
/* Parse an option that takes the name of a processor as its argument.
15751
   OPTION is the name of the option and CPU_STRING is the argument.
15752
   Return the corresponding processor enumeration if the CPU_STRING is
15753
   recognized, otherwise report an error and return null.
15754
 
15755
   A similar function exists in GCC.  */
15756
 
15757
static const struct mips_cpu_info *
15758
mips_parse_cpu (const char *option, const char *cpu_string)
15759
{
15760
  const struct mips_cpu_info *p;
15761
 
15762
  /* 'from-abi' selects the most compatible architecture for the given
15763
     ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
15764
     EABIs, we have to decide whether we're using the 32-bit or 64-bit
15765
     version.  Look first at the -mgp options, if given, otherwise base
15766
     the choice on MIPS_DEFAULT_64BIT.
15767
 
15768
     Treat NO_ABI like the EABIs.  One reason to do this is that the
15769
     plain 'mips' and 'mips64' configs have 'from-abi' as their default
15770
     architecture.  This code picks MIPS I for 'mips' and MIPS III for
15771
     'mips64', just as we did in the days before 'from-abi'.  */
15772
  if (strcasecmp (cpu_string, "from-abi") == 0)
15773
    {
15774
      if (ABI_NEEDS_32BIT_REGS (mips_abi))
15775
        return mips_cpu_info_from_isa (ISA_MIPS1);
15776
 
15777
      if (ABI_NEEDS_64BIT_REGS (mips_abi))
15778
        return mips_cpu_info_from_isa (ISA_MIPS3);
15779
 
15780
      if (file_mips_gp32 >= 0)
15781
        return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
15782
 
15783
      return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
15784
                                     ? ISA_MIPS3
15785
                                     : ISA_MIPS1);
15786
    }
15787
 
15788
  /* 'default' has traditionally been a no-op.  Probably not very useful.  */
15789
  if (strcasecmp (cpu_string, "default") == 0)
15790
    return 0;
15791
 
15792
  for (p = mips_cpu_info_table; p->name != 0; p++)
15793
    if (mips_matching_cpu_name_p (p->name, cpu_string))
15794
      return p;
15795
 
15796
  as_bad (_("Bad value (%s) for %s"), cpu_string, option);
15797
  return 0;
15798
}
15799
 
15800
/* Return the canonical processor information for ISA (a member of the
15801
   ISA_MIPS* enumeration).  */
15802
 
15803
static const struct mips_cpu_info *
15804
mips_cpu_info_from_isa (int isa)
15805
{
15806
  int i;
15807
 
15808
  for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15809
    if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
15810
        && isa == mips_cpu_info_table[i].isa)
15811
      return (&mips_cpu_info_table[i]);
15812
 
15813
  return NULL;
15814
}
15815
 
15816
static const struct mips_cpu_info *
15817
mips_cpu_info_from_arch (int arch)
15818
{
15819
  int i;
15820
 
15821
  for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15822
    if (arch == mips_cpu_info_table[i].cpu)
15823
      return (&mips_cpu_info_table[i]);
15824
 
15825
  return NULL;
15826
}
15827
 
15828
static void
15829
show (FILE *stream, const char *string, int *col_p, int *first_p)
15830
{
15831
  if (*first_p)
15832
    {
15833
      fprintf (stream, "%24s", "");
15834
      *col_p = 24;
15835
    }
15836
  else
15837
    {
15838
      fprintf (stream, ", ");
15839
      *col_p += 2;
15840
    }
15841
 
15842
  if (*col_p + strlen (string) > 72)
15843
    {
15844
      fprintf (stream, "\n%24s", "");
15845
      *col_p = 24;
15846
    }
15847
 
15848
  fprintf (stream, "%s", string);
15849
  *col_p += strlen (string);
15850
 
15851
  *first_p = 0;
15852
}
15853
 
15854
void
15855
md_show_usage (FILE *stream)
15856
{
15857
  int column, first;
15858
  size_t i;
15859
 
15860
  fprintf (stream, _("\
15861
MIPS options:\n\
15862
-EB                     generate big endian output\n\
15863
-EL                     generate little endian output\n\
15864
-g, -g2                 do not remove unneeded NOPs or swap branches\n\
15865
-G NUM                  allow referencing objects up to NUM bytes\n\
15866
                        implicitly with the gp register [default 8]\n"));
15867
  fprintf (stream, _("\
15868
-mips1                  generate MIPS ISA I instructions\n\
15869
-mips2                  generate MIPS ISA II instructions\n\
15870
-mips3                  generate MIPS ISA III instructions\n\
15871
-mips4                  generate MIPS ISA IV instructions\n\
15872
-mips5                  generate MIPS ISA V instructions\n\
15873
-mips32                 generate MIPS32 ISA instructions\n\
15874
-mips32r2               generate MIPS32 release 2 ISA instructions\n\
15875
-mips64                 generate MIPS64 ISA instructions\n\
15876
-mips64r2               generate MIPS64 release 2 ISA instructions\n\
15877
-march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
15878
 
15879
  first = 1;
15880
 
15881
  for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15882
    show (stream, mips_cpu_info_table[i].name, &column, &first);
15883
  show (stream, "from-abi", &column, &first);
15884
  fputc ('\n', stream);
15885
 
15886
  fprintf (stream, _("\
15887
-mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
15888
-no-mCPU                don't generate code specific to CPU.\n\
15889
                        For -mCPU and -no-mCPU, CPU must be one of:\n"));
15890
 
15891
  first = 1;
15892
 
15893
  show (stream, "3900", &column, &first);
15894
  show (stream, "4010", &column, &first);
15895
  show (stream, "4100", &column, &first);
15896
  show (stream, "4650", &column, &first);
15897
  fputc ('\n', stream);
15898
 
15899
  fprintf (stream, _("\
15900
-mips16                 generate mips16 instructions\n\
15901
-no-mips16              do not generate mips16 instructions\n"));
15902
  fprintf (stream, _("\
15903
-msmartmips             generate smartmips instructions\n\
15904
-mno-smartmips          do not generate smartmips instructions\n"));
15905
  fprintf (stream, _("\
15906
-mdsp                   generate DSP instructions\n\
15907
-mno-dsp                do not generate DSP instructions\n"));
15908
  fprintf (stream, _("\
15909
-mdspr2                 generate DSP R2 instructions\n\
15910
-mno-dspr2              do not generate DSP R2 instructions\n"));
15911
  fprintf (stream, _("\
15912
-mmt                    generate MT instructions\n\
15913
-mno-mt                 do not generate MT instructions\n"));
15914
  fprintf (stream, _("\
15915
-mfix-loongson2f-jump   work around Loongson2F JUMP instructions\n\
15916
-mfix-loongson2f-nop    work around Loongson2F NOP errata\n\
15917
-mfix-vr4120            work around certain VR4120 errata\n\
15918
-mfix-vr4130            work around VR4130 mflo/mfhi errata\n\
15919
-mfix-24k               insert a nop after ERET and DERET instructions\n\
15920
-mfix-cn63xxp1          work around CN63XXP1 PREF errata\n\
15921
-mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
15922
-mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
15923
-msym32                 assume all symbols have 32-bit values\n\
15924
-O0                     remove unneeded NOPs, do not swap branches\n\
15925
-O                      remove unneeded NOPs and swap branches\n\
15926
--trap, --no-break      trap exception on div by 0 and mult overflow\n\
15927
--break, --no-trap      break exception on div by 0 and mult overflow\n"));
15928
  fprintf (stream, _("\
15929
-mhard-float            allow floating-point instructions\n\
15930
-msoft-float            do not allow floating-point instructions\n\
15931
-msingle-float          only allow 32-bit floating-point operations\n\
15932
-mdouble-float          allow 32-bit and 64-bit floating-point operations\n\
15933
--[no-]construct-floats [dis]allow floating point values to be constructed\n"
15934
                     ));
15935
#ifdef OBJ_ELF
15936
  fprintf (stream, _("\
15937
-KPIC, -call_shared     generate SVR4 position independent code\n\
15938
-call_nonpic            generate non-PIC code that can operate with DSOs\n\
15939
-mvxworks-pic           generate VxWorks position independent code\n\
15940
-non_shared             do not generate code that can operate with DSOs\n\
15941
-xgot                   assume a 32 bit GOT\n\
15942
-mpdr, -mno-pdr         enable/disable creation of .pdr sections\n\
15943
-mshared, -mno-shared   disable/enable .cpload optimization for\n\
15944
                        position dependent (non shared) code\n\
15945
-mabi=ABI               create ABI conformant object file for:\n"));
15946
 
15947
  first = 1;
15948
 
15949
  show (stream, "32", &column, &first);
15950
  show (stream, "o64", &column, &first);
15951
  show (stream, "n32", &column, &first);
15952
  show (stream, "64", &column, &first);
15953
  show (stream, "eabi", &column, &first);
15954
 
15955
  fputc ('\n', stream);
15956
 
15957
  fprintf (stream, _("\
15958
-32                     create o32 ABI object file (default)\n\
15959
-n32                    create n32 ABI object file\n\
15960
-64                     create 64 ABI object file\n"));
15961
#endif
15962
}
15963
 
15964
#ifdef TE_IRIX
15965
enum dwarf2_format
15966
mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
15967
{
15968
  if (HAVE_64BIT_SYMBOLS)
15969
    return dwarf2_format_64bit_irix;
15970
  else
15971
    return dwarf2_format_32bit;
15972
}
15973
#endif
15974
 
15975
int
15976
mips_dwarf2_addr_size (void)
15977
{
15978
  if (HAVE_64BIT_OBJECTS)
15979
    return 8;
15980
  else
15981
    return 4;
15982
}
15983
 
15984
/* Standard calling conventions leave the CFA at SP on entry.  */
15985
void
15986
mips_cfi_frame_initial_instructions (void)
15987
{
15988
  cfi_add_CFA_def_cfa_register (SP);
15989
}
15990
 
15991
int
15992
tc_mips_regname_to_dw2regnum (char *regname)
15993
{
15994
  unsigned int regnum = -1;
15995
  unsigned int reg;
15996
 
15997
  if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
15998
    regnum = reg;
15999
 
16000
  return regnum;
16001
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.