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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [binutils-2.20.1/] [gas/] [config/] [tc-mips.c] - Blame information for rev 816

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

Line No. Rev Author Line
1 205 julius
/* 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  Free Software Foundation, Inc.
4
   Contributed by the OSF and Ralph Campbell.
5
   Written by Keith Knowles and Ralph Campbell, working independently.
6
   Modified for ECOFF and R4000 support by Ian Lance Taylor of Cygnus
7
   Support.
8
 
9
   This file is part of GAS.
10
 
11
   GAS is free software; you can redistribute it and/or modify
12
   it under the terms of the GNU General Public License as published by
13
   the Free Software Foundation; either version 3, or (at your option)
14
   any later version.
15
 
16
   GAS is distributed in the hope that it will be useful,
17
   but WITHOUT ANY WARRANTY; without even the implied warranty of
18
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
   GNU General Public License for more details.
20
 
21
   You should have received a copy of the GNU General Public License
22
   along with GAS; see the file COPYING.  If not, write to the Free
23
   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
24
   02110-1301, USA.  */
25
 
26
#include "as.h"
27
#include "config.h"
28
#include "subsegs.h"
29
#include "safe-ctype.h"
30
 
31
#include "opcode/mips.h"
32
#include "itbl-ops.h"
33
#include "dwarf2dbg.h"
34
#include "dw2gencfi.h"
35
 
36
#ifdef DEBUG
37
#define DBG(x) printf x
38
#else
39
#define DBG(x)
40
#endif
41
 
42
#ifdef OBJ_MAYBE_ELF
43
/* Clean up namespace so we can include obj-elf.h too.  */
44
static int mips_output_flavor (void);
45
static int mips_output_flavor (void) { return OUTPUT_FLAVOR; }
46
#undef OBJ_PROCESS_STAB
47
#undef OUTPUT_FLAVOR
48
#undef S_GET_ALIGN
49
#undef S_GET_SIZE
50
#undef S_SET_ALIGN
51
#undef S_SET_SIZE
52
#undef obj_frob_file
53
#undef obj_frob_file_after_relocs
54
#undef obj_frob_symbol
55
#undef obj_pop_insert
56
#undef obj_sec_sym_ok_for_reloc
57
#undef OBJ_COPY_SYMBOL_ATTRIBUTES
58
 
59
#include "obj-elf.h"
60
/* Fix any of them that we actually care about.  */
61
#undef OUTPUT_FLAVOR
62
#define OUTPUT_FLAVOR mips_output_flavor()
63
#endif
64
 
65
#if defined (OBJ_ELF)
66
#include "elf/mips.h"
67
#endif
68
 
69
#ifndef ECOFF_DEBUGGING
70
#define NO_ECOFF_DEBUGGING
71
#define ECOFF_DEBUGGING 0
72
#endif
73
 
74
int mips_flag_mdebug = -1;
75
 
76
/* Control generation of .pdr sections.  Off by default on IRIX: the native
77
   linker doesn't know about and discards them, but relocations against them
78
   remain, leading to rld crashes.  */
79
#ifdef TE_IRIX
80
int mips_flag_pdr = FALSE;
81
#else
82
int mips_flag_pdr = TRUE;
83
#endif
84
 
85
#include "ecoff.h"
86
 
87
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
88
static char *mips_regmask_frag;
89
#endif
90
 
91
#define ZERO 0
92
#define ATREG 1
93
#define TREG 24
94
#define PIC_CALL_REG 25
95
#define KT0 26
96
#define KT1 27
97
#define GP  28
98
#define SP  29
99
#define FP  30
100
#define RA  31
101
 
102
#define ILLEGAL_REG (32)
103
 
104
#define AT  mips_opts.at
105
 
106
/* Allow override of standard little-endian ECOFF format.  */
107
 
108
#ifndef ECOFF_LITTLE_FORMAT
109
#define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
110
#endif
111
 
112
extern int target_big_endian;
113
 
114
/* The name of the readonly data section.  */
115
#define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
116
                            ? ".rdata" \
117
                            : OUTPUT_FLAVOR == bfd_target_coff_flavour \
118
                            ? ".rdata" \
119
                            : OUTPUT_FLAVOR == bfd_target_elf_flavour \
120
                            ? ".rodata" \
121
                            : (abort (), ""))
122
 
123
/* Information about an instruction, including its format, operands
124
   and fixups.  */
125
struct mips_cl_insn
126
{
127
  /* The opcode's entry in mips_opcodes or mips16_opcodes.  */
128
  const struct mips_opcode *insn_mo;
129
 
130
  /* True if this is a mips16 instruction and if we want the extended
131
     form of INSN_MO.  */
132
  bfd_boolean use_extend;
133
 
134
  /* The 16-bit extension instruction to use when USE_EXTEND is true.  */
135
  unsigned short extend;
136
 
137
  /* The 16-bit or 32-bit bitstring of the instruction itself.  This is
138
     a copy of INSN_MO->match with the operands filled in.  */
139
  unsigned long insn_opcode;
140
 
141
  /* The frag that contains the instruction.  */
142
  struct frag *frag;
143
 
144
  /* The offset into FRAG of the first instruction byte.  */
145
  long where;
146
 
147
  /* The relocs associated with the instruction, if any.  */
148
  fixS *fixp[3];
149
 
150
  /* True if this entry cannot be moved from its current position.  */
151
  unsigned int fixed_p : 1;
152
 
153
  /* True if this instruction occurred in a .set noreorder block.  */
154
  unsigned int noreorder_p : 1;
155
 
156
  /* True for mips16 instructions that jump to an absolute address.  */
157
  unsigned int mips16_absolute_jump_p : 1;
158
};
159
 
160
/* The ABI to use.  */
161
enum mips_abi_level
162
{
163
  NO_ABI = 0,
164
  O32_ABI,
165
  O64_ABI,
166
  N32_ABI,
167
  N64_ABI,
168
  EABI_ABI
169
};
170
 
171
/* MIPS ABI we are using for this output file.  */
172
static enum mips_abi_level mips_abi = NO_ABI;
173
 
174
/* Whether or not we have code that can call pic code.  */
175
int mips_abicalls = FALSE;
176
 
177
/* Whether or not we have code which can be put into a shared
178
   library.  */
179
static bfd_boolean mips_in_shared = TRUE;
180
 
181
/* This is the set of options which may be modified by the .set
182
   pseudo-op.  We use a struct so that .set push and .set pop are more
183
   reliable.  */
184
 
185
struct mips_set_options
186
{
187
  /* MIPS ISA (Instruction Set Architecture) level.  This is set to -1
188
     if it has not been initialized.  Changed by `.set mipsN', and the
189
     -mipsN command line option, and the default CPU.  */
190
  int isa;
191
  /* Enabled Application Specific Extensions (ASEs).  These are set to -1
192
     if they have not been initialized.  Changed by `.set <asename>', by
193
     command line options, and based on the default architecture.  */
194
  int ase_mips3d;
195
  int ase_mdmx;
196
  int ase_smartmips;
197
  int ase_dsp;
198
  int ase_dspr2;
199
  int ase_mt;
200
  /* Whether we are assembling for the mips16 processor.  0 if we are
201
     not, 1 if we are, and -1 if the value has not been initialized.
202
     Changed by `.set mips16' and `.set nomips16', and the -mips16 and
203
     -nomips16 command line options, and the default CPU.  */
204
  int mips16;
205
  /* Non-zero if we should not reorder instructions.  Changed by `.set
206
     reorder' and `.set noreorder'.  */
207
  int noreorder;
208
  /* Non-zero if we should not permit the register designated "assembler
209
     temporary" to be used in instructions.  The value is the register
210
     number, normally $at ($1).  Changed by `.set at=REG', `.set noat'
211
     (same as `.set at=$0') and `.set at' (same as `.set at=$1').  */
212
  unsigned int at;
213
  /* Non-zero if we should warn when a macro instruction expands into
214
     more than one machine instruction.  Changed by `.set nomacro' and
215
     `.set macro'.  */
216
  int warn_about_macros;
217
  /* Non-zero if we should not move instructions.  Changed by `.set
218
     move', `.set volatile', `.set nomove', and `.set novolatile'.  */
219
  int nomove;
220
  /* Non-zero if we should not optimize branches by moving the target
221
     of the branch into the delay slot.  Actually, we don't perform
222
     this optimization anyhow.  Changed by `.set bopt' and `.set
223
     nobopt'.  */
224
  int nobopt;
225
  /* Non-zero if we should not autoextend mips16 instructions.
226
     Changed by `.set autoextend' and `.set noautoextend'.  */
227
  int noautoextend;
228
  /* Restrict general purpose registers and floating point registers
229
     to 32 bit.  This is initially determined when -mgp32 or -mfp32
230
     is passed but can changed if the assembler code uses .set mipsN.  */
231
  int gp32;
232
  int fp32;
233
  /* MIPS architecture (CPU) type.  Changed by .set arch=FOO, the -march
234
     command line option, and the default CPU.  */
235
  int arch;
236
  /* True if ".set sym32" is in effect.  */
237
  bfd_boolean sym32;
238
  /* True if floating-point operations are not allowed.  Changed by .set
239
     softfloat or .set hardfloat, by command line options -msoft-float or
240
     -mhard-float.  The default is false.  */
241
  bfd_boolean soft_float;
242
 
243
  /* True if only single-precision floating-point operations are allowed.
244
     Changed by .set singlefloat or .set doublefloat, command-line options
245
     -msingle-float or -mdouble-float.  The default is false.  */
246
  bfd_boolean single_float;
247
};
248
 
249
/* This is the struct we use to hold the current set of options.  Note
250
   that we must set the isa field to ISA_UNKNOWN and the ASE fields to
251
   -1 to indicate that they have not been initialized.  */
252
 
253
/* True if -mgp32 was passed.  */
254
static int file_mips_gp32 = -1;
255
 
256
/* True if -mfp32 was passed.  */
257
static int file_mips_fp32 = -1;
258
 
259
/* 1 if -msoft-float, 0 if -mhard-float.  The default is 0.  */
260
static int file_mips_soft_float = 0;
261
 
262
/* 1 if -msingle-float, 0 if -mdouble-float.  The default is 0.   */
263
static int file_mips_single_float = 0;
264
 
265
static struct mips_set_options mips_opts =
266
{
267
  /* isa */ ISA_UNKNOWN, /* ase_mips3d */ -1, /* ase_mdmx */ -1,
268
  /* ase_smartmips */ 0, /* ase_dsp */ -1, /* ase_dspr2 */ -1, /* ase_mt */ -1,
269
  /* mips16 */ -1, /* noreorder */ 0, /* at */ ATREG,
270
  /* warn_about_macros */ 0, /* nomove */ 0, /* nobopt */ 0,
271
  /* noautoextend */ 0, /* gp32 */ 0, /* fp32 */ 0, /* arch */ CPU_UNKNOWN,
272
  /* sym32 */ FALSE, /* soft_float */ FALSE, /* single_float */ FALSE
273
};
274
 
275
/* These variables are filled in with the masks of registers used.
276
   The object format code reads them and puts them in the appropriate
277
   place.  */
278
unsigned long mips_gprmask;
279
unsigned long mips_cprmask[4];
280
 
281
/* MIPS ISA we are using for this output file.  */
282
static int file_mips_isa = ISA_UNKNOWN;
283
 
284
/* True if -mips16 was passed or implied by arguments passed on the
285
   command line (e.g., by -march).  */
286
static int file_ase_mips16;
287
 
288
#define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32               \
289
                              || mips_opts.isa == ISA_MIPS32R2          \
290
                              || mips_opts.isa == ISA_MIPS64            \
291
                              || mips_opts.isa == ISA_MIPS64R2)
292
 
293
/* True if we want to create R_MIPS_JALR for jalr $25.  */
294
#ifdef TE_IRIX
295
#define MIPS_JALR_HINT_P(EXPR) HAVE_NEWABI
296
#else
297
/* As a GNU extension, we use R_MIPS_JALR for o32 too.  However,
298
   because there's no place for any addend, the only acceptable
299
   expression is a bare symbol.  */
300
#define MIPS_JALR_HINT_P(EXPR) \
301
  (!HAVE_IN_PLACE_ADDENDS \
302
   || ((EXPR)->X_op == O_symbol && (EXPR)->X_add_number == 0))
303
#endif
304
 
305
/* True if -mips3d was passed or implied by arguments passed on the
306
   command line (e.g., by -march).  */
307
static int file_ase_mips3d;
308
 
309
/* True if -mdmx was passed or implied by arguments passed on the
310
   command line (e.g., by -march).  */
311
static int file_ase_mdmx;
312
 
313
/* True if -msmartmips was passed or implied by arguments passed on the
314
   command line (e.g., by -march).  */
315
static int file_ase_smartmips;
316
 
317
#define ISA_SUPPORTS_SMARTMIPS (mips_opts.isa == ISA_MIPS32             \
318
                                || mips_opts.isa == ISA_MIPS32R2)
319
 
320
/* True if -mdsp was passed or implied by arguments passed on the
321
   command line (e.g., by -march).  */
322
static int file_ase_dsp;
323
 
324
#define ISA_SUPPORTS_DSP_ASE (mips_opts.isa == ISA_MIPS32R2             \
325
                              || mips_opts.isa == ISA_MIPS64R2)
326
 
327
#define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
328
 
329
/* True if -mdspr2 was passed or implied by arguments passed on the
330
   command line (e.g., by -march).  */
331
static int file_ase_dspr2;
332
 
333
#define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2           \
334
                                || mips_opts.isa == ISA_MIPS64R2)
335
 
336
/* True if -mmt was passed or implied by arguments passed on the
337
   command line (e.g., by -march).  */
338
static int file_ase_mt;
339
 
340
#define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2              \
341
                             || mips_opts.isa == ISA_MIPS64R2)
342
 
343
/* The argument of the -march= flag.  The architecture we are assembling.  */
344
static int file_mips_arch = CPU_UNKNOWN;
345
static const char *mips_arch_string;
346
 
347
/* The argument of the -mtune= flag.  The architecture for which we
348
   are optimizing.  */
349
static int mips_tune = CPU_UNKNOWN;
350
static const char *mips_tune_string;
351
 
352
/* True when generating 32-bit code for a 64-bit processor.  */
353
static int mips_32bitmode = 0;
354
 
355
/* True if the given ABI requires 32-bit registers.  */
356
#define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
357
 
358
/* Likewise 64-bit registers.  */
359
#define ABI_NEEDS_64BIT_REGS(ABI)       \
360
  ((ABI) == N32_ABI                     \
361
   || (ABI) == N64_ABI                  \
362
   || (ABI) == O64_ABI)
363
 
364
/*  Return true if ISA supports 64 bit wide gp registers.  */
365
#define ISA_HAS_64BIT_REGS(ISA)         \
366
  ((ISA) == ISA_MIPS3                   \
367
   || (ISA) == ISA_MIPS4                \
368
   || (ISA) == ISA_MIPS5                \
369
   || (ISA) == ISA_MIPS64               \
370
   || (ISA) == ISA_MIPS64R2)
371
 
372
/*  Return true if ISA supports 64 bit wide float registers.  */
373
#define ISA_HAS_64BIT_FPRS(ISA)         \
374
  ((ISA) == ISA_MIPS3                   \
375
   || (ISA) == ISA_MIPS4                \
376
   || (ISA) == ISA_MIPS5                \
377
   || (ISA) == ISA_MIPS32R2             \
378
   || (ISA) == ISA_MIPS64               \
379
   || (ISA) == ISA_MIPS64R2)
380
 
381
/* Return true if ISA supports 64-bit right rotate (dror et al.)
382
   instructions.  */
383
#define ISA_HAS_DROR(ISA)               \
384
  ((ISA) == ISA_MIPS64R2)
385
 
386
/* Return true if ISA supports 32-bit right rotate (ror et al.)
387
   instructions.  */
388
#define ISA_HAS_ROR(ISA)                \
389
  ((ISA) == ISA_MIPS32R2                \
390
   || (ISA) == ISA_MIPS64R2             \
391
   || mips_opts.ase_smartmips)
392
 
393
/* Return true if ISA supports single-precision floats in odd registers.  */
394
#define ISA_HAS_ODD_SINGLE_FPR(ISA)     \
395
  ((ISA) == ISA_MIPS32                  \
396
   || (ISA) == ISA_MIPS32R2             \
397
   || (ISA) == ISA_MIPS64               \
398
   || (ISA) == ISA_MIPS64R2)
399
 
400
/* Return true if ISA supports move to/from high part of a 64-bit
401
   floating-point register. */
402
#define ISA_HAS_MXHC1(ISA)              \
403
  ((ISA) == ISA_MIPS32R2                \
404
   || (ISA) == ISA_MIPS64R2)
405
 
406
#define HAVE_32BIT_GPRS                            \
407
    (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
408
 
409
#define HAVE_32BIT_FPRS                            \
410
    (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
411
 
412
#define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
413
#define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
414
 
415
#define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
416
 
417
#define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
418
 
419
/* True if relocations are stored in-place.  */
420
#define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
421
 
422
/* The ABI-derived address size.  */
423
#define HAVE_64BIT_ADDRESSES \
424
  (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
425
#define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
426
 
427
/* The size of symbolic constants (i.e., expressions of the form
428
   "SYMBOL" or "SYMBOL + OFFSET").  */
429
#define HAVE_32BIT_SYMBOLS \
430
  (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
431
#define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
432
 
433
/* Addresses are loaded in different ways, depending on the address size
434
   in use.  The n32 ABI Documentation also mandates the use of additions
435
   with overflow checking, but existing implementations don't follow it.  */
436
#define ADDRESS_ADD_INSN                                                \
437
   (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
438
 
439
#define ADDRESS_ADDI_INSN                                               \
440
   (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
441
 
442
#define ADDRESS_LOAD_INSN                                               \
443
   (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
444
 
445
#define ADDRESS_STORE_INSN                                              \
446
   (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
447
 
448
/* Return true if the given CPU supports the MIPS16 ASE.  */
449
#define CPU_HAS_MIPS16(cpu)                                             \
450
   (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0           \
451
    || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
452
 
453
/* True if CPU has a dror instruction.  */
454
#define CPU_HAS_DROR(CPU)       ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
455
 
456
/* True if CPU has a ror instruction.  */
457
#define CPU_HAS_ROR(CPU)        CPU_HAS_DROR (CPU)
458
 
459
/* True if CPU has seq/sne and seqi/snei instructions.  */
460
#define CPU_HAS_SEQ(CPU)        ((CPU) == CPU_OCTEON)
461
 
462
/* True if CPU does not implement the all the coprocessor insns.  For these
463
   CPUs only those COP insns are accepted that are explicitly marked to be
464
   available on the CPU.  ISA membership for COP insns is ignored.  */
465
#define NO_ISA_COP(CPU)         ((CPU) == CPU_OCTEON)
466
 
467
/* True if mflo and mfhi can be immediately followed by instructions
468
   which write to the HI and LO registers.
469
 
470
   According to MIPS specifications, MIPS ISAs I, II, and III need
471
   (at least) two instructions between the reads of HI/LO and
472
   instructions which write them, and later ISAs do not.  Contradicting
473
   the MIPS specifications, some MIPS IV processor user manuals (e.g.
474
   the UM for the NEC Vr5000) document needing the instructions between
475
   HI/LO reads and writes, as well.  Therefore, we declare only MIPS32,
476
   MIPS64 and later ISAs to have the interlocks, plus any specific
477
   earlier-ISA CPUs for which CPU documentation declares that the
478
   instructions are really interlocked.  */
479
#define hilo_interlocks \
480
  (mips_opts.isa == ISA_MIPS32                        \
481
   || mips_opts.isa == ISA_MIPS32R2                   \
482
   || mips_opts.isa == ISA_MIPS64                     \
483
   || mips_opts.isa == ISA_MIPS64R2                   \
484
   || mips_opts.arch == CPU_R4010                     \
485
   || mips_opts.arch == CPU_R10000                    \
486
   || mips_opts.arch == CPU_R12000                    \
487
   || mips_opts.arch == CPU_R14000                    \
488
   || mips_opts.arch == CPU_R16000                    \
489
   || mips_opts.arch == CPU_RM7000                    \
490
   || mips_opts.arch == CPU_VR5500                    \
491
   )
492
 
493
/* Whether the processor uses hardware interlocks to protect reads
494
   from the GPRs after they are loaded from memory, and thus does not
495
   require nops to be inserted.  This applies to instructions marked
496
   INSN_LOAD_MEMORY_DELAY.  These nops are only required at MIPS ISA
497
   level I.  */
498
#define gpr_interlocks \
499
  (mips_opts.isa != ISA_MIPS1  \
500
   || mips_opts.arch == CPU_R3900)
501
 
502
/* Whether the processor uses hardware interlocks to avoid delays
503
   required by coprocessor instructions, and thus does not require
504
   nops to be inserted.  This applies to instructions marked
505
   INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
506
   between instructions marked INSN_WRITE_COND_CODE and ones marked
507
   INSN_READ_COND_CODE.  These nops are only required at MIPS ISA
508
   levels I, II, and III.  */
509
/* Itbl support may require additional care here.  */
510
#define cop_interlocks                                \
511
  ((mips_opts.isa != ISA_MIPS1                        \
512
    && mips_opts.isa != ISA_MIPS2                     \
513
    && mips_opts.isa != ISA_MIPS3)                    \
514
   || mips_opts.arch == CPU_R4300                     \
515
   )
516
 
517
/* Whether the processor uses hardware interlocks to protect reads
518
   from coprocessor registers after they are loaded from memory, and
519
   thus does not require nops to be inserted.  This applies to
520
   instructions marked INSN_COPROC_MEMORY_DELAY.  These nops are only
521
   requires at MIPS ISA level I.  */
522
#define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
523
 
524
/* Is this a mfhi or mflo instruction?  */
525
#define MF_HILO_INSN(PINFO) \
526
  ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
527
 
528
/* Returns true for a (non floating-point) coprocessor instruction.  Reading
529
   or writing the condition code is only possible on the coprocessors and
530
   these insns are not marked with INSN_COP.  Thus for these insns use the
531
   condition-code flags.  */
532
#define COP_INSN(PINFO)                                                 \
533
  (PINFO != INSN_MACRO                                                  \
534
   && ((PINFO) & (FP_S | FP_D)) == 0                                     \
535
   && ((PINFO) & (INSN_COP | INSN_READ_COND_CODE | INSN_WRITE_COND_CODE)))
536
 
537
/* MIPS PIC level.  */
538
 
539
enum mips_pic_level mips_pic;
540
 
541
/* 1 if we should generate 32 bit offsets from the $gp register in
542
   SVR4_PIC mode.  Currently has no meaning in other modes.  */
543
static int mips_big_got = 0;
544
 
545
/* 1 if trap instructions should used for overflow rather than break
546
   instructions.  */
547
static int mips_trap = 0;
548
 
549
/* 1 if double width floating point constants should not be constructed
550
   by assembling two single width halves into two single width floating
551
   point registers which just happen to alias the double width destination
552
   register.  On some architectures this aliasing can be disabled by a bit
553
   in the status register, and the setting of this bit cannot be determined
554
   automatically at assemble time.  */
555
static int mips_disable_float_construction;
556
 
557
/* Non-zero if any .set noreorder directives were used.  */
558
 
559
static int mips_any_noreorder;
560
 
561
/* Non-zero if nops should be inserted when the register referenced in
562
   an mfhi/mflo instruction is read in the next two instructions.  */
563
static int mips_7000_hilo_fix;
564
 
565
/* The size of objects in the small data section.  */
566
static unsigned int g_switch_value = 8;
567
/* Whether the -G option was used.  */
568
static int g_switch_seen = 0;
569
 
570
#define N_RMASK 0xc4
571
#define N_VFP   0xd4
572
 
573
/* If we can determine in advance that GP optimization won't be
574
   possible, we can skip the relaxation stuff that tries to produce
575
   GP-relative references.  This makes delay slot optimization work
576
   better.
577
 
578
   This function can only provide a guess, but it seems to work for
579
   gcc output.  It needs to guess right for gcc, otherwise gcc
580
   will put what it thinks is a GP-relative instruction in a branch
581
   delay slot.
582
 
583
   I don't know if a fix is needed for the SVR4_PIC mode.  I've only
584
   fixed it for the non-PIC mode.  KR 95/04/07  */
585
static int nopic_need_relax (symbolS *, int);
586
 
587
/* handle of the OPCODE hash table */
588
static struct hash_control *op_hash = NULL;
589
 
590
/* The opcode hash table we use for the mips16.  */
591
static struct hash_control *mips16_op_hash = NULL;
592
 
593
/* This array holds the chars that always start a comment.  If the
594
    pre-processor is disabled, these aren't very useful */
595
const char comment_chars[] = "#";
596
 
597
/* This array holds the chars that only start a comment at the beginning of
598
   a line.  If the line seems to have the form '# 123 filename'
599
   .line and .file directives will appear in the pre-processed output */
600
/* Note that input_file.c hand checks for '#' at the beginning of the
601
   first line of the input file.  This is because the compiler outputs
602
   #NO_APP at the beginning of its output.  */
603
/* Also note that C style comments are always supported.  */
604
const char line_comment_chars[] = "#";
605
 
606
/* This array holds machine specific line separator characters.  */
607
const char line_separator_chars[] = ";";
608
 
609
/* Chars that can be used to separate mant from exp in floating point nums */
610
const char EXP_CHARS[] = "eE";
611
 
612
/* Chars that mean this number is a floating point constant */
613
/* As in 0f12.456 */
614
/* or    0d1.2345e12 */
615
const char FLT_CHARS[] = "rRsSfFdDxXpP";
616
 
617
/* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
618
   changed in read.c .  Ideally it shouldn't have to know about it at all,
619
   but nothing is ideal around here.
620
 */
621
 
622
static char *insn_error;
623
 
624
static int auto_align = 1;
625
 
626
/* When outputting SVR4 PIC code, the assembler needs to know the
627
   offset in the stack frame from which to restore the $gp register.
628
   This is set by the .cprestore pseudo-op, and saved in this
629
   variable.  */
630
static offsetT mips_cprestore_offset = -1;
631
 
632
/* Similar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
633
   more optimizations, it can use a register value instead of a memory-saved
634
   offset and even an other register than $gp as global pointer.  */
635
static offsetT mips_cpreturn_offset = -1;
636
static int mips_cpreturn_register = -1;
637
static int mips_gp_register = GP;
638
static int mips_gprel_offset = 0;
639
 
640
/* Whether mips_cprestore_offset has been set in the current function
641
   (or whether it has already been warned about, if not).  */
642
static int mips_cprestore_valid = 0;
643
 
644
/* This is the register which holds the stack frame, as set by the
645
   .frame pseudo-op.  This is needed to implement .cprestore.  */
646
static int mips_frame_reg = SP;
647
 
648
/* Whether mips_frame_reg has been set in the current function
649
   (or whether it has already been warned about, if not).  */
650
static int mips_frame_reg_valid = 0;
651
 
652
/* To output NOP instructions correctly, we need to keep information
653
   about the previous two instructions.  */
654
 
655
/* Whether we are optimizing.  The default value of 2 means to remove
656
   unneeded NOPs and swap branch instructions when possible.  A value
657
   of 1 means to not swap branches.  A value of 0 means to always
658
   insert NOPs.  */
659
static int mips_optimize = 2;
660
 
661
/* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
662
   equivalent to seeing no -g option at all.  */
663
static int mips_debug = 0;
664
 
665
/* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata.  */
666
#define MAX_VR4130_NOPS 4
667
 
668
/* The maximum number of NOPs needed to fill delay slots.  */
669
#define MAX_DELAY_NOPS 2
670
 
671
/* The maximum number of NOPs needed for any purpose.  */
672
#define MAX_NOPS 4
673
 
674
/* A list of previous instructions, with index 0 being the most recent.
675
   We need to look back MAX_NOPS instructions when filling delay slots
676
   or working around processor errata.  We need to look back one
677
   instruction further if we're thinking about using history[0] to
678
   fill a branch delay slot.  */
679
static struct mips_cl_insn history[1 + MAX_NOPS];
680
 
681
/* Nop instructions used by emit_nop.  */
682
static struct mips_cl_insn nop_insn, mips16_nop_insn;
683
 
684
/* The appropriate nop for the current mode.  */
685
#define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn : &nop_insn)
686
 
687
/* If this is set, it points to a frag holding nop instructions which
688
   were inserted before the start of a noreorder section.  If those
689
   nops turn out to be unnecessary, the size of the frag can be
690
   decreased.  */
691
static fragS *prev_nop_frag;
692
 
693
/* The number of nop instructions we created in prev_nop_frag.  */
694
static int prev_nop_frag_holds;
695
 
696
/* The number of nop instructions that we know we need in
697
   prev_nop_frag.  */
698
static int prev_nop_frag_required;
699
 
700
/* The number of instructions we've seen since prev_nop_frag.  */
701
static int prev_nop_frag_since;
702
 
703
/* For ECOFF and ELF, relocations against symbols are done in two
704
   parts, with a HI relocation and a LO relocation.  Each relocation
705
   has only 16 bits of space to store an addend.  This means that in
706
   order for the linker to handle carries correctly, it must be able
707
   to locate both the HI and the LO relocation.  This means that the
708
   relocations must appear in order in the relocation table.
709
 
710
   In order to implement this, we keep track of each unmatched HI
711
   relocation.  We then sort them so that they immediately precede the
712
   corresponding LO relocation.  */
713
 
714
struct mips_hi_fixup
715
{
716
  /* Next HI fixup.  */
717
  struct mips_hi_fixup *next;
718
  /* This fixup.  */
719
  fixS *fixp;
720
  /* The section this fixup is in.  */
721
  segT seg;
722
};
723
 
724
/* The list of unmatched HI relocs.  */
725
 
726
static struct mips_hi_fixup *mips_hi_fixup_list;
727
 
728
/* The frag containing the last explicit relocation operator.
729
   Null if explicit relocations have not been used.  */
730
 
731
static fragS *prev_reloc_op_frag;
732
 
733
/* Map normal MIPS register numbers to mips16 register numbers.  */
734
 
735
#define X ILLEGAL_REG
736
static const int mips32_to_16_reg_map[] =
737
{
738
  X, X, 2, 3, 4, 5, 6, 7,
739
  X, X, X, X, X, X, X, X,
740
  0, 1, X, X, X, X, X, X,
741
  X, X, X, X, X, X, X, X
742
};
743
#undef X
744
 
745
/* Map mips16 register numbers to normal MIPS register numbers.  */
746
 
747
static const unsigned int mips16_to_32_reg_map[] =
748
{
749
  16, 17, 2, 3, 4, 5, 6, 7
750
};
751
 
752
/* Classifies the kind of instructions we're interested in when
753
   implementing -mfix-vr4120.  */
754
enum fix_vr4120_class {
755
  FIX_VR4120_MACC,
756
  FIX_VR4120_DMACC,
757
  FIX_VR4120_MULT,
758
  FIX_VR4120_DMULT,
759
  FIX_VR4120_DIV,
760
  FIX_VR4120_MTHILO,
761
  NUM_FIX_VR4120_CLASSES
762
};
763
 
764
/* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
765
   there must be at least one other instruction between an instruction
766
   of type X and an instruction of type Y.  */
767
static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
768
 
769
/* True if -mfix-vr4120 is in force.  */
770
static int mips_fix_vr4120;
771
 
772
/* ...likewise -mfix-vr4130.  */
773
static int mips_fix_vr4130;
774
 
775
/* ...likewise -mfix-24k.  */
776
static int mips_fix_24k;
777
 
778
/* We don't relax branches by default, since this causes us to expand
779
   `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
780
   fail to compute the offset before expanding the macro to the most
781
   efficient expansion.  */
782
 
783
static int mips_relax_branch;
784
 
785
/* The expansion of many macros depends on the type of symbol that
786
   they refer to.  For example, when generating position-dependent code,
787
   a macro that refers to a symbol may have two different expansions,
788
   one which uses GP-relative addresses and one which uses absolute
789
   addresses.  When generating SVR4-style PIC, a macro may have
790
   different expansions for local and global symbols.
791
 
792
   We handle these situations by generating both sequences and putting
793
   them in variant frags.  In position-dependent code, the first sequence
794
   will be the GP-relative one and the second sequence will be the
795
   absolute one.  In SVR4 PIC, the first sequence will be for global
796
   symbols and the second will be for local symbols.
797
 
798
   The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
799
   SECOND are the lengths of the two sequences in bytes.  These fields
800
   can be extracted using RELAX_FIRST() and RELAX_SECOND().  In addition,
801
   the subtype has the following flags:
802
 
803
   RELAX_USE_SECOND
804
        Set if it has been decided that we should use the second
805
        sequence instead of the first.
806
 
807
   RELAX_SECOND_LONGER
808
        Set in the first variant frag if the macro's second implementation
809
        is longer than its first.  This refers to the macro as a whole,
810
        not an individual relaxation.
811
 
812
   RELAX_NOMACRO
813
        Set in the first variant frag if the macro appeared in a .set nomacro
814
        block and if one alternative requires a warning but the other does not.
815
 
816
   RELAX_DELAY_SLOT
817
        Like RELAX_NOMACRO, but indicates that the macro appears in a branch
818
        delay slot.
819
 
820
   The frag's "opcode" points to the first fixup for relaxable code.
821
 
822
   Relaxable macros are generated using a sequence such as:
823
 
824
      relax_start (SYMBOL);
825
      ... generate first expansion ...
826
      relax_switch ();
827
      ... generate second expansion ...
828
      relax_end ();
829
 
830
   The code and fixups for the unwanted alternative are discarded
831
   by md_convert_frag.  */
832
#define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
833
 
834
#define RELAX_FIRST(X) (((X) >> 8) & 0xff)
835
#define RELAX_SECOND(X) ((X) & 0xff)
836
#define RELAX_USE_SECOND 0x10000
837
#define RELAX_SECOND_LONGER 0x20000
838
#define RELAX_NOMACRO 0x40000
839
#define RELAX_DELAY_SLOT 0x80000
840
 
841
/* Branch without likely bit.  If label is out of range, we turn:
842
 
843
        beq reg1, reg2, label
844
        delay slot
845
 
846
   into
847
 
848
        bne reg1, reg2, 0f
849
        nop
850
        j label
851
     0: delay slot
852
 
853
   with the following opcode replacements:
854
 
855
        beq <-> bne
856
        blez <-> bgtz
857
        bltz <-> bgez
858
        bc1f <-> bc1t
859
 
860
        bltzal <-> bgezal  (with jal label instead of j label)
861
 
862
   Even though keeping the delay slot instruction in the delay slot of
863
   the branch would be more efficient, it would be very tricky to do
864
   correctly, because we'd have to introduce a variable frag *after*
865
   the delay slot instruction, and expand that instead.  Let's do it
866
   the easy way for now, even if the branch-not-taken case now costs
867
   one additional instruction.  Out-of-range branches are not supposed
868
   to be common, anyway.
869
 
870
   Branch likely.  If label is out of range, we turn:
871
 
872
        beql reg1, reg2, label
873
        delay slot (annulled if branch not taken)
874
 
875
   into
876
 
877
        beql reg1, reg2, 1f
878
        nop
879
        beql $0, $0, 2f
880
        nop
881
     1: j[al] label
882
        delay slot (executed only if branch taken)
883
     2:
884
 
885
   It would be possible to generate a shorter sequence by losing the
886
   likely bit, generating something like:
887
 
888
        bne reg1, reg2, 0f
889
        nop
890
        j[al] label
891
        delay slot (executed only if branch taken)
892
     0:
893
 
894
        beql -> bne
895
        bnel -> beq
896
        blezl -> bgtz
897
        bgtzl -> blez
898
        bltzl -> bgez
899
        bgezl -> bltz
900
        bc1fl -> bc1t
901
        bc1tl -> bc1f
902
 
903
        bltzall -> bgezal  (with jal label instead of j label)
904
        bgezall -> bltzal  (ditto)
905
 
906
 
907
   but it's not clear that it would actually improve performance.  */
908
#define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
909
  ((relax_substateT) \
910
   (0xc0000000 \
911
    | ((toofar) ? 1 : 0) \
912
    | ((link) ? 2 : 0) \
913
    | ((likely) ? 4 : 0) \
914
    | ((uncond) ? 8 : 0)))
915
#define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
916
#define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
917
#define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
918
#define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
919
#define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
920
 
921
/* For mips16 code, we use an entirely different form of relaxation.
922
   mips16 supports two versions of most instructions which take
923
   immediate values: a small one which takes some small value, and a
924
   larger one which takes a 16 bit value.  Since branches also follow
925
   this pattern, relaxing these values is required.
926
 
927
   We can assemble both mips16 and normal MIPS code in a single
928
   object.  Therefore, we need to support this type of relaxation at
929
   the same time that we support the relaxation described above.  We
930
   use the high bit of the subtype field to distinguish these cases.
931
 
932
   The information we store for this type of relaxation is the
933
   argument code found in the opcode file for this relocation, whether
934
   the user explicitly requested a small or extended form, and whether
935
   the relocation is in a jump or jal delay slot.  That tells us the
936
   size of the value, and how it should be stored.  We also store
937
   whether the fragment is considered to be extended or not.  We also
938
   store whether this is known to be a branch to a different section,
939
   whether we have tried to relax this frag yet, and whether we have
940
   ever extended a PC relative fragment because of a shift count.  */
941
#define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
942
  (0x80000000                                                   \
943
   | ((type) & 0xff)                                            \
944
   | ((small) ? 0x100 : 0)                                       \
945
   | ((ext) ? 0x200 : 0)                                 \
946
   | ((dslot) ? 0x400 : 0)                                       \
947
   | ((jal_dslot) ? 0x800 : 0))
948
#define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
949
#define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
950
#define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
951
#define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
952
#define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
953
#define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
954
#define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
955
#define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
956
#define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
957
#define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
958
#define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
959
#define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
960
 
961
/* Is the given value a sign-extended 32-bit value?  */
962
#define IS_SEXT_32BIT_NUM(x)                                            \
963
  (((x) &~ (offsetT) 0x7fffffff) == 0                                    \
964
   || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
965
 
966
/* Is the given value a sign-extended 16-bit value?  */
967
#define IS_SEXT_16BIT_NUM(x)                                            \
968
  (((x) &~ (offsetT) 0x7fff) == 0                                        \
969
   || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
970
 
971
/* Is the given value a zero-extended 32-bit value?  Or a negated one?  */
972
#define IS_ZEXT_32BIT_NUM(x)                                            \
973
  (((x) &~ (offsetT) 0xffffffff) == 0                                    \
974
   || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
975
 
976
/* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
977
   VALUE << SHIFT.  VALUE is evaluated exactly once.  */
978
#define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
979
  (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
980
              | (((VALUE) & (MASK)) << (SHIFT)))
981
 
982
/* Extract bits MASK << SHIFT from STRUCT and shift them right
983
   SHIFT places.  */
984
#define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
985
  (((STRUCT) >> (SHIFT)) & (MASK))
986
 
987
/* Change INSN's opcode so that the operand given by FIELD has value VALUE.
988
   INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
989
 
990
   include/opcode/mips.h specifies operand fields using the macros
991
   OP_MASK_<FIELD> and OP_SH_<FIELD>.  The MIPS16 equivalents start
992
   with "MIPS16OP" instead of "OP".  */
993
#define INSERT_OPERAND(FIELD, INSN, VALUE) \
994
  INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
995
#define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
996
  INSERT_BITS ((INSN).insn_opcode, VALUE, \
997
                MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
998
 
999
/* Extract the operand given by FIELD from mips_cl_insn INSN.  */
1000
#define EXTRACT_OPERAND(FIELD, INSN) \
1001
  EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD)
1002
#define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
1003
  EXTRACT_BITS ((INSN).insn_opcode, \
1004
                MIPS16OP_MASK_##FIELD, \
1005
                MIPS16OP_SH_##FIELD)
1006
 
1007
/* Global variables used when generating relaxable macros.  See the
1008
   comment above RELAX_ENCODE for more details about how relaxation
1009
   is used.  */
1010
static struct {
1011
  /* 0 if we're not emitting a relaxable macro.
1012
     1 if we're emitting the first of the two relaxation alternatives.
1013
     2 if we're emitting the second alternative.  */
1014
  int sequence;
1015
 
1016
  /* The first relaxable fixup in the current frag.  (In other words,
1017
     the first fixup that refers to relaxable code.)  */
1018
  fixS *first_fixup;
1019
 
1020
  /* sizes[0] says how many bytes of the first alternative are stored in
1021
     the current frag.  Likewise sizes[1] for the second alternative.  */
1022
  unsigned int sizes[2];
1023
 
1024
  /* The symbol on which the choice of sequence depends.  */
1025
  symbolS *symbol;
1026
} mips_relax;
1027
 
1028
/* Global variables used to decide whether a macro needs a warning.  */
1029
static struct {
1030
  /* True if the macro is in a branch delay slot.  */
1031
  bfd_boolean delay_slot_p;
1032
 
1033
  /* For relaxable macros, sizes[0] is the length of the first alternative
1034
     in bytes and sizes[1] is the length of the second alternative.
1035
     For non-relaxable macros, both elements give the length of the
1036
     macro in bytes.  */
1037
  unsigned int sizes[2];
1038
 
1039
  /* The first variant frag for this macro.  */
1040
  fragS *first_frag;
1041
} mips_macro_warning;
1042
 
1043
/* Prototypes for static functions.  */
1044
 
1045
#define internalError()                                                 \
1046
    as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
1047
 
1048
enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
1049
 
1050
static void append_insn
1051
  (struct mips_cl_insn *ip, expressionS *p, bfd_reloc_code_real_type *r);
1052
static void mips_no_prev_insn (void);
1053
static void mips16_macro_build
1054
  (expressionS *, const char *, const char *, va_list);
1055
static void load_register (int, expressionS *, int);
1056
static void macro_start (void);
1057
static void macro_end (void);
1058
static void macro (struct mips_cl_insn * ip);
1059
static void mips16_macro (struct mips_cl_insn * ip);
1060
#ifdef LOSING_COMPILER
1061
static void macro2 (struct mips_cl_insn * ip);
1062
#endif
1063
static void mips_ip (char *str, struct mips_cl_insn * ip);
1064
static void mips16_ip (char *str, struct mips_cl_insn * ip);
1065
static void mips16_immed
1066
  (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
1067
   unsigned long *, bfd_boolean *, unsigned short *);
1068
static size_t my_getSmallExpression
1069
  (expressionS *, bfd_reloc_code_real_type *, char *);
1070
static void my_getExpression (expressionS *, char *);
1071
static void s_align (int);
1072
static void s_change_sec (int);
1073
static void s_change_section (int);
1074
static void s_cons (int);
1075
static void s_float_cons (int);
1076
static void s_mips_globl (int);
1077
static void s_option (int);
1078
static void s_mipsset (int);
1079
static void s_abicalls (int);
1080
static void s_cpload (int);
1081
static void s_cpsetup (int);
1082
static void s_cplocal (int);
1083
static void s_cprestore (int);
1084
static void s_cpreturn (int);
1085
static void s_dtprelword (int);
1086
static void s_dtpreldword (int);
1087
static void s_gpvalue (int);
1088
static void s_gpword (int);
1089
static void s_gpdword (int);
1090
static void s_cpadd (int);
1091
static void s_insn (int);
1092
static void md_obj_begin (void);
1093
static void md_obj_end (void);
1094
static void s_mips_ent (int);
1095
static void s_mips_end (int);
1096
static void s_mips_frame (int);
1097
static void s_mips_mask (int reg_type);
1098
static void s_mips_stab (int);
1099
static void s_mips_weakext (int);
1100
static void s_mips_file (int);
1101
static void s_mips_loc (int);
1102
static bfd_boolean pic_need_relax (symbolS *, asection *);
1103
static int relaxed_branch_length (fragS *, asection *, int);
1104
static int validate_mips_insn (const struct mips_opcode *);
1105
 
1106
/* Table and functions used to map between CPU/ISA names, and
1107
   ISA levels, and CPU numbers.  */
1108
 
1109
struct mips_cpu_info
1110
{
1111
  const char *name;           /* CPU or ISA name.  */
1112
  int flags;                  /* ASEs available, or ISA flag.  */
1113
  int isa;                    /* ISA level.  */
1114
  int cpu;                    /* CPU number (default CPU if ISA).  */
1115
};
1116
 
1117
#define MIPS_CPU_IS_ISA         0x0001  /* Is this an ISA?  (If 0, a CPU.) */
1118
#define MIPS_CPU_ASE_SMARTMIPS  0x0002  /* CPU implements SmartMIPS ASE */
1119
#define MIPS_CPU_ASE_DSP        0x0004  /* CPU implements DSP ASE */
1120
#define MIPS_CPU_ASE_MT         0x0008  /* CPU implements MT ASE */
1121
#define MIPS_CPU_ASE_MIPS3D     0x0010  /* CPU implements MIPS-3D ASE */
1122
#define MIPS_CPU_ASE_MDMX       0x0020  /* CPU implements MDMX ASE */
1123
#define MIPS_CPU_ASE_DSPR2      0x0040  /* CPU implements DSP R2 ASE */
1124
 
1125
static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1126
static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1127
static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1128
 
1129
/* Pseudo-op table.
1130
 
1131
   The following pseudo-ops from the Kane and Heinrich MIPS book
1132
   should be defined here, but are currently unsupported: .alias,
1133
   .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1134
 
1135
   The following pseudo-ops from the Kane and Heinrich MIPS book are
1136
   specific to the type of debugging information being generated, and
1137
   should be defined by the object format: .aent, .begin, .bend,
1138
   .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1139
   .vreg.
1140
 
1141
   The following pseudo-ops from the Kane and Heinrich MIPS book are
1142
   not MIPS CPU specific, but are also not specific to the object file
1143
   format.  This file is probably the best place to define them, but
1144
   they are not currently supported: .asm0, .endr, .lab, .struct.  */
1145
 
1146
static const pseudo_typeS mips_pseudo_table[] =
1147
{
1148
  /* MIPS specific pseudo-ops.  */
1149
  {"option", s_option, 0},
1150
  {"set", s_mipsset, 0},
1151
  {"rdata", s_change_sec, 'r'},
1152
  {"sdata", s_change_sec, 's'},
1153
  {"livereg", s_ignore, 0},
1154
  {"abicalls", s_abicalls, 0},
1155
  {"cpload", s_cpload, 0},
1156
  {"cpsetup", s_cpsetup, 0},
1157
  {"cplocal", s_cplocal, 0},
1158
  {"cprestore", s_cprestore, 0},
1159
  {"cpreturn", s_cpreturn, 0},
1160
  {"dtprelword", s_dtprelword, 0},
1161
  {"dtpreldword", s_dtpreldword, 0},
1162
  {"gpvalue", s_gpvalue, 0},
1163
  {"gpword", s_gpword, 0},
1164
  {"gpdword", s_gpdword, 0},
1165
  {"cpadd", s_cpadd, 0},
1166
  {"insn", s_insn, 0},
1167
 
1168
  /* Relatively generic pseudo-ops that happen to be used on MIPS
1169
     chips.  */
1170
  {"asciiz", stringer, 8 + 1},
1171
  {"bss", s_change_sec, 'b'},
1172
  {"err", s_err, 0},
1173
  {"half", s_cons, 1},
1174
  {"dword", s_cons, 3},
1175
  {"weakext", s_mips_weakext, 0},
1176
  {"origin", s_org, 0},
1177
  {"repeat", s_rept, 0},
1178
 
1179
  /* These pseudo-ops are defined in read.c, but must be overridden
1180
     here for one reason or another.  */
1181
  {"align", s_align, 0},
1182
  {"byte", s_cons, 0},
1183
  {"data", s_change_sec, 'd'},
1184
  {"double", s_float_cons, 'd'},
1185
  {"float", s_float_cons, 'f'},
1186
  {"globl", s_mips_globl, 0},
1187
  {"global", s_mips_globl, 0},
1188
  {"hword", s_cons, 1},
1189
  {"int", s_cons, 2},
1190
  {"long", s_cons, 2},
1191
  {"octa", s_cons, 4},
1192
  {"quad", s_cons, 3},
1193
  {"section", s_change_section, 0},
1194
  {"short", s_cons, 1},
1195
  {"single", s_float_cons, 'f'},
1196
  {"stabn", s_mips_stab, 'n'},
1197
  {"text", s_change_sec, 't'},
1198
  {"word", s_cons, 2},
1199
 
1200
  { "extern", ecoff_directive_extern, 0},
1201
 
1202
  { NULL, NULL, 0 },
1203
};
1204
 
1205
static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1206
{
1207
  /* These pseudo-ops should be defined by the object file format.
1208
     However, a.out doesn't support them, so we have versions here.  */
1209
  {"aent", s_mips_ent, 1},
1210
  {"bgnb", s_ignore, 0},
1211
  {"end", s_mips_end, 0},
1212
  {"endb", s_ignore, 0},
1213
  {"ent", s_mips_ent, 0},
1214
  {"file", s_mips_file, 0},
1215
  {"fmask", s_mips_mask, 'F'},
1216
  {"frame", s_mips_frame, 0},
1217
  {"loc", s_mips_loc, 0},
1218
  {"mask", s_mips_mask, 'R'},
1219
  {"verstamp", s_ignore, 0},
1220
  { NULL, NULL, 0 },
1221
};
1222
 
1223
extern void pop_insert (const pseudo_typeS *);
1224
 
1225
void
1226
mips_pop_insert (void)
1227
{
1228
  pop_insert (mips_pseudo_table);
1229
  if (! ECOFF_DEBUGGING)
1230
    pop_insert (mips_nonecoff_pseudo_table);
1231
}
1232
 
1233
/* Symbols labelling the current insn.  */
1234
 
1235
struct insn_label_list
1236
{
1237
  struct insn_label_list *next;
1238
  symbolS *label;
1239
};
1240
 
1241
static struct insn_label_list *free_insn_labels;
1242
#define label_list tc_segment_info_data.labels
1243
 
1244
static void mips_clear_insn_labels (void);
1245
 
1246
static inline void
1247
mips_clear_insn_labels (void)
1248
{
1249
  register struct insn_label_list **pl;
1250
  segment_info_type *si;
1251
 
1252
  if (now_seg)
1253
    {
1254
      for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1255
        ;
1256
 
1257
      si = seg_info (now_seg);
1258
      *pl = si->label_list;
1259
      si->label_list = NULL;
1260
    }
1261
}
1262
 
1263
 
1264
static char *expr_end;
1265
 
1266
/* Expressions which appear in instructions.  These are set by
1267
   mips_ip.  */
1268
 
1269
static expressionS imm_expr;
1270
static expressionS imm2_expr;
1271
static expressionS offset_expr;
1272
 
1273
/* Relocs associated with imm_expr and offset_expr.  */
1274
 
1275
static bfd_reloc_code_real_type imm_reloc[3]
1276
  = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1277
static bfd_reloc_code_real_type offset_reloc[3]
1278
  = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1279
 
1280
/* These are set by mips16_ip if an explicit extension is used.  */
1281
 
1282
static bfd_boolean mips16_small, mips16_ext;
1283
 
1284
#ifdef OBJ_ELF
1285
/* The pdr segment for per procedure frame/regmask info.  Not used for
1286
   ECOFF debugging.  */
1287
 
1288
static segT pdr_seg;
1289
#endif
1290
 
1291
/* The default target format to use.  */
1292
 
1293
const char *
1294
mips_target_format (void)
1295
{
1296
  switch (OUTPUT_FLAVOR)
1297
    {
1298
    case bfd_target_ecoff_flavour:
1299
      return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1300
    case bfd_target_coff_flavour:
1301
      return "pe-mips";
1302
    case bfd_target_elf_flavour:
1303
#ifdef TE_VXWORKS
1304
      if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1305
        return (target_big_endian
1306
                ? "elf32-bigmips-vxworks"
1307
                : "elf32-littlemips-vxworks");
1308
#endif
1309
#ifdef TE_TMIPS
1310
      /* This is traditional mips.  */
1311
      return (target_big_endian
1312
              ? (HAVE_64BIT_OBJECTS
1313
                 ? "elf64-tradbigmips"
1314
                 : (HAVE_NEWABI
1315
                    ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1316
              : (HAVE_64BIT_OBJECTS
1317
                 ? "elf64-tradlittlemips"
1318
                 : (HAVE_NEWABI
1319
                    ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
1320
#else
1321
      return (target_big_endian
1322
              ? (HAVE_64BIT_OBJECTS
1323
                 ? "elf64-bigmips"
1324
                 : (HAVE_NEWABI
1325
                    ? "elf32-nbigmips" : "elf32-bigmips"))
1326
              : (HAVE_64BIT_OBJECTS
1327
                 ? "elf64-littlemips"
1328
                 : (HAVE_NEWABI
1329
                    ? "elf32-nlittlemips" : "elf32-littlemips")));
1330
#endif
1331
    default:
1332
      abort ();
1333
      return NULL;
1334
    }
1335
}
1336
 
1337
/* Return the length of instruction INSN.  */
1338
 
1339
static inline unsigned int
1340
insn_length (const struct mips_cl_insn *insn)
1341
{
1342
  if (!mips_opts.mips16)
1343
    return 4;
1344
  return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1345
}
1346
 
1347
/* Initialise INSN from opcode entry MO.  Leave its position unspecified.  */
1348
 
1349
static void
1350
create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1351
{
1352
  size_t i;
1353
 
1354
  insn->insn_mo = mo;
1355
  insn->use_extend = FALSE;
1356
  insn->extend = 0;
1357
  insn->insn_opcode = mo->match;
1358
  insn->frag = NULL;
1359
  insn->where = 0;
1360
  for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1361
    insn->fixp[i] = NULL;
1362
  insn->fixed_p = (mips_opts.noreorder > 0);
1363
  insn->noreorder_p = (mips_opts.noreorder > 0);
1364
  insn->mips16_absolute_jump_p = 0;
1365
}
1366
 
1367
/* Record the current MIPS16 mode in now_seg.  */
1368
 
1369
static void
1370
mips_record_mips16_mode (void)
1371
{
1372
  segment_info_type *si;
1373
 
1374
  si = seg_info (now_seg);
1375
  if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
1376
    si->tc_segment_info_data.mips16 = mips_opts.mips16;
1377
}
1378
 
1379
/* Install INSN at the location specified by its "frag" and "where" fields.  */
1380
 
1381
static void
1382
install_insn (const struct mips_cl_insn *insn)
1383
{
1384
  char *f = insn->frag->fr_literal + insn->where;
1385
  if (!mips_opts.mips16)
1386
    md_number_to_chars (f, insn->insn_opcode, 4);
1387
  else if (insn->mips16_absolute_jump_p)
1388
    {
1389
      md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1390
      md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1391
    }
1392
  else
1393
    {
1394
      if (insn->use_extend)
1395
        {
1396
          md_number_to_chars (f, 0xf000 | insn->extend, 2);
1397
          f += 2;
1398
        }
1399
      md_number_to_chars (f, insn->insn_opcode, 2);
1400
    }
1401
  mips_record_mips16_mode ();
1402
}
1403
 
1404
/* Move INSN to offset WHERE in FRAG.  Adjust the fixups accordingly
1405
   and install the opcode in the new location.  */
1406
 
1407
static void
1408
move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1409
{
1410
  size_t i;
1411
 
1412
  insn->frag = frag;
1413
  insn->where = where;
1414
  for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1415
    if (insn->fixp[i] != NULL)
1416
      {
1417
        insn->fixp[i]->fx_frag = frag;
1418
        insn->fixp[i]->fx_where = where;
1419
      }
1420
  install_insn (insn);
1421
}
1422
 
1423
/* Add INSN to the end of the output.  */
1424
 
1425
static void
1426
add_fixed_insn (struct mips_cl_insn *insn)
1427
{
1428
  char *f = frag_more (insn_length (insn));
1429
  move_insn (insn, frag_now, f - frag_now->fr_literal);
1430
}
1431
 
1432
/* Start a variant frag and move INSN to the start of the variant part,
1433
   marking it as fixed.  The other arguments are as for frag_var.  */
1434
 
1435
static void
1436
add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1437
                  relax_substateT subtype, symbolS *symbol, offsetT offset)
1438
{
1439
  frag_grow (max_chars);
1440
  move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1441
  insn->fixed_p = 1;
1442
  frag_var (rs_machine_dependent, max_chars, var,
1443
            subtype, symbol, offset, NULL);
1444
}
1445
 
1446
/* Insert N copies of INSN into the history buffer, starting at
1447
   position FIRST.  Neither FIRST nor N need to be clipped.  */
1448
 
1449
static void
1450
insert_into_history (unsigned int first, unsigned int n,
1451
                     const struct mips_cl_insn *insn)
1452
{
1453
  if (mips_relax.sequence != 2)
1454
    {
1455
      unsigned int i;
1456
 
1457
      for (i = ARRAY_SIZE (history); i-- > first;)
1458
        if (i >= first + n)
1459
          history[i] = history[i - n];
1460
        else
1461
          history[i] = *insn;
1462
    }
1463
}
1464
 
1465
/* Emit a nop instruction, recording it in the history buffer.  */
1466
 
1467
static void
1468
emit_nop (void)
1469
{
1470
  add_fixed_insn (NOP_INSN);
1471
  insert_into_history (0, 1, NOP_INSN);
1472
}
1473
 
1474
/* Initialize vr4120_conflicts.  There is a bit of duplication here:
1475
   the idea is to make it obvious at a glance that each errata is
1476
   included.  */
1477
 
1478
static void
1479
init_vr4120_conflicts (void)
1480
{
1481
#define CONFLICT(FIRST, SECOND) \
1482
    vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1483
 
1484
  /* Errata 21 - [D]DIV[U] after [D]MACC */
1485
  CONFLICT (MACC, DIV);
1486
  CONFLICT (DMACC, DIV);
1487
 
1488
  /* Errata 23 - Continuous DMULT[U]/DMACC instructions.  */
1489
  CONFLICT (DMULT, DMULT);
1490
  CONFLICT (DMULT, DMACC);
1491
  CONFLICT (DMACC, DMULT);
1492
  CONFLICT (DMACC, DMACC);
1493
 
1494
  /* Errata 24 - MT{LO,HI} after [D]MACC */
1495
  CONFLICT (MACC, MTHILO);
1496
  CONFLICT (DMACC, MTHILO);
1497
 
1498
  /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1499
     instruction is executed immediately after a MACC or DMACC
1500
     instruction, the result of [either instruction] is incorrect."  */
1501
  CONFLICT (MACC, MULT);
1502
  CONFLICT (MACC, DMULT);
1503
  CONFLICT (DMACC, MULT);
1504
  CONFLICT (DMACC, DMULT);
1505
 
1506
  /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1507
     executed immediately after a DMULT, DMULTU, DIV, DIVU,
1508
     DDIV or DDIVU instruction, the result of the MACC or
1509
     DMACC instruction is incorrect.".  */
1510
  CONFLICT (DMULT, MACC);
1511
  CONFLICT (DMULT, DMACC);
1512
  CONFLICT (DIV, MACC);
1513
  CONFLICT (DIV, DMACC);
1514
 
1515
#undef CONFLICT
1516
}
1517
 
1518
struct regname {
1519
  const char *name;
1520
  unsigned int num;
1521
};
1522
 
1523
#define RTYPE_MASK      0x1ff00
1524
#define RTYPE_NUM       0x00100
1525
#define RTYPE_FPU       0x00200
1526
#define RTYPE_FCC       0x00400
1527
#define RTYPE_VEC       0x00800
1528
#define RTYPE_GP        0x01000
1529
#define RTYPE_CP0       0x02000
1530
#define RTYPE_PC        0x04000
1531
#define RTYPE_ACC       0x08000
1532
#define RTYPE_CCC       0x10000
1533
#define RNUM_MASK       0x000ff
1534
#define RWARN           0x80000
1535
 
1536
#define GENERIC_REGISTER_NUMBERS \
1537
    {"$0",      RTYPE_NUM | 0},  \
1538
    {"$1",      RTYPE_NUM | 1},  \
1539
    {"$2",      RTYPE_NUM | 2},  \
1540
    {"$3",      RTYPE_NUM | 3},  \
1541
    {"$4",      RTYPE_NUM | 4},  \
1542
    {"$5",      RTYPE_NUM | 5},  \
1543
    {"$6",      RTYPE_NUM | 6},  \
1544
    {"$7",      RTYPE_NUM | 7},  \
1545
    {"$8",      RTYPE_NUM | 8},  \
1546
    {"$9",      RTYPE_NUM | 9},  \
1547
    {"$10",     RTYPE_NUM | 10}, \
1548
    {"$11",     RTYPE_NUM | 11}, \
1549
    {"$12",     RTYPE_NUM | 12}, \
1550
    {"$13",     RTYPE_NUM | 13}, \
1551
    {"$14",     RTYPE_NUM | 14}, \
1552
    {"$15",     RTYPE_NUM | 15}, \
1553
    {"$16",     RTYPE_NUM | 16}, \
1554
    {"$17",     RTYPE_NUM | 17}, \
1555
    {"$18",     RTYPE_NUM | 18}, \
1556
    {"$19",     RTYPE_NUM | 19}, \
1557
    {"$20",     RTYPE_NUM | 20}, \
1558
    {"$21",     RTYPE_NUM | 21}, \
1559
    {"$22",     RTYPE_NUM | 22}, \
1560
    {"$23",     RTYPE_NUM | 23}, \
1561
    {"$24",     RTYPE_NUM | 24}, \
1562
    {"$25",     RTYPE_NUM | 25}, \
1563
    {"$26",     RTYPE_NUM | 26}, \
1564
    {"$27",     RTYPE_NUM | 27}, \
1565
    {"$28",     RTYPE_NUM | 28}, \
1566
    {"$29",     RTYPE_NUM | 29}, \
1567
    {"$30",     RTYPE_NUM | 30}, \
1568
    {"$31",     RTYPE_NUM | 31}
1569
 
1570
#define FPU_REGISTER_NAMES       \
1571
    {"$f0",     RTYPE_FPU | 0},  \
1572
    {"$f1",     RTYPE_FPU | 1},  \
1573
    {"$f2",     RTYPE_FPU | 2},  \
1574
    {"$f3",     RTYPE_FPU | 3},  \
1575
    {"$f4",     RTYPE_FPU | 4},  \
1576
    {"$f5",     RTYPE_FPU | 5},  \
1577
    {"$f6",     RTYPE_FPU | 6},  \
1578
    {"$f7",     RTYPE_FPU | 7},  \
1579
    {"$f8",     RTYPE_FPU | 8},  \
1580
    {"$f9",     RTYPE_FPU | 9},  \
1581
    {"$f10",    RTYPE_FPU | 10}, \
1582
    {"$f11",    RTYPE_FPU | 11}, \
1583
    {"$f12",    RTYPE_FPU | 12}, \
1584
    {"$f13",    RTYPE_FPU | 13}, \
1585
    {"$f14",    RTYPE_FPU | 14}, \
1586
    {"$f15",    RTYPE_FPU | 15}, \
1587
    {"$f16",    RTYPE_FPU | 16}, \
1588
    {"$f17",    RTYPE_FPU | 17}, \
1589
    {"$f18",    RTYPE_FPU | 18}, \
1590
    {"$f19",    RTYPE_FPU | 19}, \
1591
    {"$f20",    RTYPE_FPU | 20}, \
1592
    {"$f21",    RTYPE_FPU | 21}, \
1593
    {"$f22",    RTYPE_FPU | 22}, \
1594
    {"$f23",    RTYPE_FPU | 23}, \
1595
    {"$f24",    RTYPE_FPU | 24}, \
1596
    {"$f25",    RTYPE_FPU | 25}, \
1597
    {"$f26",    RTYPE_FPU | 26}, \
1598
    {"$f27",    RTYPE_FPU | 27}, \
1599
    {"$f28",    RTYPE_FPU | 28}, \
1600
    {"$f29",    RTYPE_FPU | 29}, \
1601
    {"$f30",    RTYPE_FPU | 30}, \
1602
    {"$f31",    RTYPE_FPU | 31}
1603
 
1604
#define FPU_CONDITION_CODE_NAMES \
1605
    {"$fcc0",   RTYPE_FCC | 0},  \
1606
    {"$fcc1",   RTYPE_FCC | 1},  \
1607
    {"$fcc2",   RTYPE_FCC | 2},  \
1608
    {"$fcc3",   RTYPE_FCC | 3},  \
1609
    {"$fcc4",   RTYPE_FCC | 4},  \
1610
    {"$fcc5",   RTYPE_FCC | 5},  \
1611
    {"$fcc6",   RTYPE_FCC | 6},  \
1612
    {"$fcc7",   RTYPE_FCC | 7}
1613
 
1614
#define COPROC_CONDITION_CODE_NAMES         \
1615
    {"$cc0",    RTYPE_FCC | RTYPE_CCC | 0}, \
1616
    {"$cc1",    RTYPE_FCC | RTYPE_CCC | 1}, \
1617
    {"$cc2",    RTYPE_FCC | RTYPE_CCC | 2}, \
1618
    {"$cc3",    RTYPE_FCC | RTYPE_CCC | 3}, \
1619
    {"$cc4",    RTYPE_FCC | RTYPE_CCC | 4}, \
1620
    {"$cc5",    RTYPE_FCC | RTYPE_CCC | 5}, \
1621
    {"$cc6",    RTYPE_FCC | RTYPE_CCC | 6}, \
1622
    {"$cc7",    RTYPE_FCC | RTYPE_CCC | 7}
1623
 
1624
#define N32N64_SYMBOLIC_REGISTER_NAMES \
1625
    {"$a4",     RTYPE_GP | 8},  \
1626
    {"$a5",     RTYPE_GP | 9},  \
1627
    {"$a6",     RTYPE_GP | 10}, \
1628
    {"$a7",     RTYPE_GP | 11}, \
1629
    {"$ta0",    RTYPE_GP | 8},  /* alias for $a4 */ \
1630
    {"$ta1",    RTYPE_GP | 9},  /* alias for $a5 */ \
1631
    {"$ta2",    RTYPE_GP | 10}, /* alias for $a6 */ \
1632
    {"$ta3",    RTYPE_GP | 11}, /* alias for $a7 */ \
1633
    {"$t0",     RTYPE_GP | 12}, \
1634
    {"$t1",     RTYPE_GP | 13}, \
1635
    {"$t2",     RTYPE_GP | 14}, \
1636
    {"$t3",     RTYPE_GP | 15}
1637
 
1638
#define O32_SYMBOLIC_REGISTER_NAMES \
1639
    {"$t0",     RTYPE_GP | 8},  \
1640
    {"$t1",     RTYPE_GP | 9},  \
1641
    {"$t2",     RTYPE_GP | 10}, \
1642
    {"$t3",     RTYPE_GP | 11}, \
1643
    {"$t4",     RTYPE_GP | 12}, \
1644
    {"$t5",     RTYPE_GP | 13}, \
1645
    {"$t6",     RTYPE_GP | 14}, \
1646
    {"$t7",     RTYPE_GP | 15}, \
1647
    {"$ta0",    RTYPE_GP | 12}, /* alias for $t4 */ \
1648
    {"$ta1",    RTYPE_GP | 13}, /* alias for $t5 */ \
1649
    {"$ta2",    RTYPE_GP | 14}, /* alias for $t6 */ \
1650
    {"$ta3",    RTYPE_GP | 15}  /* alias for $t7 */
1651
 
1652
/* Remaining symbolic register names */
1653
#define SYMBOLIC_REGISTER_NAMES \
1654
    {"$zero",   RTYPE_GP | 0},  \
1655
    {"$at",     RTYPE_GP | 1},  \
1656
    {"$AT",     RTYPE_GP | 1},  \
1657
    {"$v0",     RTYPE_GP | 2},  \
1658
    {"$v1",     RTYPE_GP | 3},  \
1659
    {"$a0",     RTYPE_GP | 4},  \
1660
    {"$a1",     RTYPE_GP | 5},  \
1661
    {"$a2",     RTYPE_GP | 6},  \
1662
    {"$a3",     RTYPE_GP | 7},  \
1663
    {"$s0",     RTYPE_GP | 16}, \
1664
    {"$s1",     RTYPE_GP | 17}, \
1665
    {"$s2",     RTYPE_GP | 18}, \
1666
    {"$s3",     RTYPE_GP | 19}, \
1667
    {"$s4",     RTYPE_GP | 20}, \
1668
    {"$s5",     RTYPE_GP | 21}, \
1669
    {"$s6",     RTYPE_GP | 22}, \
1670
    {"$s7",     RTYPE_GP | 23}, \
1671
    {"$t8",     RTYPE_GP | 24}, \
1672
    {"$t9",     RTYPE_GP | 25}, \
1673
    {"$k0",     RTYPE_GP | 26}, \
1674
    {"$kt0",    RTYPE_GP | 26}, \
1675
    {"$k1",     RTYPE_GP | 27}, \
1676
    {"$kt1",    RTYPE_GP | 27}, \
1677
    {"$gp",     RTYPE_GP | 28}, \
1678
    {"$sp",     RTYPE_GP | 29}, \
1679
    {"$s8",     RTYPE_GP | 30}, \
1680
    {"$fp",     RTYPE_GP | 30}, \
1681
    {"$ra",     RTYPE_GP | 31}
1682
 
1683
#define MIPS16_SPECIAL_REGISTER_NAMES \
1684
    {"$pc",     RTYPE_PC | 0}
1685
 
1686
#define MDMX_VECTOR_REGISTER_NAMES \
1687
    /* {"$v0",  RTYPE_VEC | 0},  clash with REG 2 above */ \
1688
    /* {"$v1",  RTYPE_VEC | 1},  clash with REG 3 above */ \
1689
    {"$v2",     RTYPE_VEC | 2},  \
1690
    {"$v3",     RTYPE_VEC | 3},  \
1691
    {"$v4",     RTYPE_VEC | 4},  \
1692
    {"$v5",     RTYPE_VEC | 5},  \
1693
    {"$v6",     RTYPE_VEC | 6},  \
1694
    {"$v7",     RTYPE_VEC | 7},  \
1695
    {"$v8",     RTYPE_VEC | 8},  \
1696
    {"$v9",     RTYPE_VEC | 9},  \
1697
    {"$v10",    RTYPE_VEC | 10}, \
1698
    {"$v11",    RTYPE_VEC | 11}, \
1699
    {"$v12",    RTYPE_VEC | 12}, \
1700
    {"$v13",    RTYPE_VEC | 13}, \
1701
    {"$v14",    RTYPE_VEC | 14}, \
1702
    {"$v15",    RTYPE_VEC | 15}, \
1703
    {"$v16",    RTYPE_VEC | 16}, \
1704
    {"$v17",    RTYPE_VEC | 17}, \
1705
    {"$v18",    RTYPE_VEC | 18}, \
1706
    {"$v19",    RTYPE_VEC | 19}, \
1707
    {"$v20",    RTYPE_VEC | 20}, \
1708
    {"$v21",    RTYPE_VEC | 21}, \
1709
    {"$v22",    RTYPE_VEC | 22}, \
1710
    {"$v23",    RTYPE_VEC | 23}, \
1711
    {"$v24",    RTYPE_VEC | 24}, \
1712
    {"$v25",    RTYPE_VEC | 25}, \
1713
    {"$v26",    RTYPE_VEC | 26}, \
1714
    {"$v27",    RTYPE_VEC | 27}, \
1715
    {"$v28",    RTYPE_VEC | 28}, \
1716
    {"$v29",    RTYPE_VEC | 29}, \
1717
    {"$v30",    RTYPE_VEC | 30}, \
1718
    {"$v31",    RTYPE_VEC | 31}
1719
 
1720
#define MIPS_DSP_ACCUMULATOR_NAMES \
1721
    {"$ac0",    RTYPE_ACC | 0}, \
1722
    {"$ac1",    RTYPE_ACC | 1}, \
1723
    {"$ac2",    RTYPE_ACC | 2}, \
1724
    {"$ac3",    RTYPE_ACC | 3}
1725
 
1726
static const struct regname reg_names[] = {
1727
  GENERIC_REGISTER_NUMBERS,
1728
  FPU_REGISTER_NAMES,
1729
  FPU_CONDITION_CODE_NAMES,
1730
  COPROC_CONDITION_CODE_NAMES,
1731
 
1732
  /* The $txx registers depends on the abi,
1733
     these will be added later into the symbol table from
1734
     one of the tables below once mips_abi is set after
1735
     parsing of arguments from the command line. */
1736
  SYMBOLIC_REGISTER_NAMES,
1737
 
1738
  MIPS16_SPECIAL_REGISTER_NAMES,
1739
  MDMX_VECTOR_REGISTER_NAMES,
1740
  MIPS_DSP_ACCUMULATOR_NAMES,
1741
  {0, 0}
1742
};
1743
 
1744
static const struct regname reg_names_o32[] = {
1745
  O32_SYMBOLIC_REGISTER_NAMES,
1746
  {0, 0}
1747
};
1748
 
1749
static const struct regname reg_names_n32n64[] = {
1750
  N32N64_SYMBOLIC_REGISTER_NAMES,
1751
  {0, 0}
1752
};
1753
 
1754
static int
1755
reg_lookup (char **s, unsigned int types, unsigned int *regnop)
1756
{
1757
  symbolS *symbolP;
1758
  char *e;
1759
  char save_c;
1760
  int reg = -1;
1761
 
1762
  /* Find end of name.  */
1763
  e = *s;
1764
  if (is_name_beginner (*e))
1765
    ++e;
1766
  while (is_part_of_name (*e))
1767
    ++e;
1768
 
1769
  /* Terminate name.  */
1770
  save_c = *e;
1771
  *e = '\0';
1772
 
1773
  /* Look for a register symbol.  */
1774
  if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
1775
    {
1776
      int r = S_GET_VALUE (symbolP);
1777
      if (r & types)
1778
        reg = r & RNUM_MASK;
1779
      else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
1780
        /* Convert GP reg $v0/1 to MDMX reg $v0/1!  */
1781
        reg = (r & RNUM_MASK) - 2;
1782
    }
1783
  /* Else see if this is a register defined in an itbl entry.  */
1784
  else if ((types & RTYPE_GP) && itbl_have_entries)
1785
    {
1786
      char *n = *s;
1787
      unsigned long r;
1788
 
1789
      if (*n == '$')
1790
        ++n;
1791
      if (itbl_get_reg_val (n, &r))
1792
        reg = r & RNUM_MASK;
1793
    }
1794
 
1795
  /* Advance to next token if a register was recognised.  */
1796
  if (reg >= 0)
1797
    *s = e;
1798
  else if (types & RWARN)
1799
    as_warn (_("Unrecognized register name `%s'"), *s);
1800
 
1801
  *e = save_c;
1802
  if (regnop)
1803
    *regnop = reg;
1804
  return reg >= 0;
1805
}
1806
 
1807
/* Return TRUE if opcode MO is valid on the currently selected ISA and
1808
   architecture.  If EXPANSIONP is TRUE then this check is done while
1809
   expanding a macro.  Use is_opcode_valid_16 for MIPS16 opcodes.  */
1810
 
1811
static bfd_boolean
1812
is_opcode_valid (const struct mips_opcode *mo, bfd_boolean expansionp)
1813
{
1814
  int isa = mips_opts.isa;
1815
  int fp_s, fp_d;
1816
 
1817
  if (mips_opts.ase_mdmx)
1818
    isa |= INSN_MDMX;
1819
  if (mips_opts.ase_dsp)
1820
    isa |= INSN_DSP;
1821
  if (mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
1822
    isa |= INSN_DSP64;
1823
  if (mips_opts.ase_dspr2)
1824
    isa |= INSN_DSPR2;
1825
  if (mips_opts.ase_mt)
1826
    isa |= INSN_MT;
1827
  if (mips_opts.ase_mips3d)
1828
    isa |= INSN_MIPS3D;
1829
  if (mips_opts.ase_smartmips)
1830
    isa |= INSN_SMARTMIPS;
1831
 
1832
  /* For user code we don't check for mips_opts.mips16 since we want
1833
     to allow jalx if -mips16 was specified on the command line.  */
1834
  if (expansionp ? mips_opts.mips16 : file_ase_mips16)
1835
    isa |= INSN_MIPS16;
1836
 
1837
  /* Don't accept instructions based on the ISA if the CPU does not implement
1838
     all the coprocessor insns. */
1839
  if (NO_ISA_COP (mips_opts.arch)
1840
      && COP_INSN (mo->pinfo))
1841
    isa = 0;
1842
 
1843
  if (!OPCODE_IS_MEMBER (mo, isa, mips_opts.arch))
1844
    return FALSE;
1845
 
1846
  /* Check whether the instruction or macro requires single-precision or
1847
     double-precision floating-point support.  Note that this information is
1848
     stored differently in the opcode table for insns and macros.  */
1849
  if (mo->pinfo == INSN_MACRO)
1850
    {
1851
      fp_s = mo->pinfo2 & INSN2_M_FP_S;
1852
      fp_d = mo->pinfo2 & INSN2_M_FP_D;
1853
    }
1854
  else
1855
    {
1856
      fp_s = mo->pinfo & FP_S;
1857
      fp_d = mo->pinfo & FP_D;
1858
    }
1859
 
1860
  if (fp_d && (mips_opts.soft_float || mips_opts.single_float))
1861
    return FALSE;
1862
 
1863
  if (fp_s && mips_opts.soft_float)
1864
    return FALSE;
1865
 
1866
  return TRUE;
1867
}
1868
 
1869
/* Return TRUE if the MIPS16 opcode MO is valid on the currently
1870
   selected ISA and architecture.  */
1871
 
1872
static bfd_boolean
1873
is_opcode_valid_16 (const struct mips_opcode *mo)
1874
{
1875
  return OPCODE_IS_MEMBER (mo, mips_opts.isa, mips_opts.arch) ? TRUE : FALSE;
1876
}
1877
 
1878
/* This function is called once, at assembler startup time.  It should set up
1879
   all the tables, etc. that the MD part of the assembler will need.  */
1880
 
1881
void
1882
md_begin (void)
1883
{
1884
  const char *retval = NULL;
1885
  int i = 0;
1886
  int broken = 0;
1887
 
1888
  if (mips_pic != NO_PIC)
1889
    {
1890
      if (g_switch_seen && g_switch_value != 0)
1891
        as_bad (_("-G may not be used in position-independent code"));
1892
      g_switch_value = 0;
1893
    }
1894
 
1895
  if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
1896
    as_warn (_("Could not set architecture and machine"));
1897
 
1898
  op_hash = hash_new ();
1899
 
1900
  for (i = 0; i < NUMOPCODES;)
1901
    {
1902
      const char *name = mips_opcodes[i].name;
1903
 
1904
      retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
1905
      if (retval != NULL)
1906
        {
1907
          fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1908
                   mips_opcodes[i].name, retval);
1909
          /* Probably a memory allocation problem?  Give up now.  */
1910
          as_fatal (_("Broken assembler.  No assembly attempted."));
1911
        }
1912
      do
1913
        {
1914
          if (mips_opcodes[i].pinfo != INSN_MACRO)
1915
            {
1916
              if (!validate_mips_insn (&mips_opcodes[i]))
1917
                broken = 1;
1918
              if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1919
                {
1920
                  create_insn (&nop_insn, mips_opcodes + i);
1921
                  nop_insn.fixed_p = 1;
1922
                }
1923
            }
1924
          ++i;
1925
        }
1926
      while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1927
    }
1928
 
1929
  mips16_op_hash = hash_new ();
1930
 
1931
  i = 0;
1932
  while (i < bfd_mips16_num_opcodes)
1933
    {
1934
      const char *name = mips16_opcodes[i].name;
1935
 
1936
      retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
1937
      if (retval != NULL)
1938
        as_fatal (_("internal: can't hash `%s': %s"),
1939
                  mips16_opcodes[i].name, retval);
1940
      do
1941
        {
1942
          if (mips16_opcodes[i].pinfo != INSN_MACRO
1943
              && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1944
                  != mips16_opcodes[i].match))
1945
            {
1946
              fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1947
                       mips16_opcodes[i].name, mips16_opcodes[i].args);
1948
              broken = 1;
1949
            }
1950
          if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1951
            {
1952
              create_insn (&mips16_nop_insn, mips16_opcodes + i);
1953
              mips16_nop_insn.fixed_p = 1;
1954
            }
1955
          ++i;
1956
        }
1957
      while (i < bfd_mips16_num_opcodes
1958
             && strcmp (mips16_opcodes[i].name, name) == 0);
1959
    }
1960
 
1961
  if (broken)
1962
    as_fatal (_("Broken assembler.  No assembly attempted."));
1963
 
1964
  /* We add all the general register names to the symbol table.  This
1965
     helps us detect invalid uses of them.  */
1966
  for (i = 0; reg_names[i].name; i++)
1967
    symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
1968
                                     reg_names[i].num, /* & RNUM_MASK, */
1969
                                     &zero_address_frag));
1970
  if (HAVE_NEWABI)
1971
    for (i = 0; reg_names_n32n64[i].name; i++)
1972
      symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
1973
                                       reg_names_n32n64[i].num, /* & RNUM_MASK, */
1974
                                       &zero_address_frag));
1975
  else
1976
    for (i = 0; reg_names_o32[i].name; i++)
1977
      symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
1978
                                       reg_names_o32[i].num, /* & RNUM_MASK, */
1979
                                       &zero_address_frag));
1980
 
1981
  mips_no_prev_insn ();
1982
 
1983
  mips_gprmask = 0;
1984
  mips_cprmask[0] = 0;
1985
  mips_cprmask[1] = 0;
1986
  mips_cprmask[2] = 0;
1987
  mips_cprmask[3] = 0;
1988
 
1989
  /* set the default alignment for the text section (2**2) */
1990
  record_alignment (text_section, 2);
1991
 
1992
  bfd_set_gp_size (stdoutput, g_switch_value);
1993
 
1994
#ifdef OBJ_ELF
1995
  if (IS_ELF)
1996
    {
1997
      /* On a native system other than VxWorks, sections must be aligned
1998
         to 16 byte boundaries.  When configured for an embedded ELF
1999
         target, we don't bother.  */
2000
      if (strncmp (TARGET_OS, "elf", 3) != 0
2001
          && strncmp (TARGET_OS, "vxworks", 7) != 0)
2002
        {
2003
          (void) bfd_set_section_alignment (stdoutput, text_section, 4);
2004
          (void) bfd_set_section_alignment (stdoutput, data_section, 4);
2005
          (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
2006
        }
2007
 
2008
      /* Create a .reginfo section for register masks and a .mdebug
2009
         section for debugging information.  */
2010
      {
2011
        segT seg;
2012
        subsegT subseg;
2013
        flagword flags;
2014
        segT sec;
2015
 
2016
        seg = now_seg;
2017
        subseg = now_subseg;
2018
 
2019
        /* The ABI says this section should be loaded so that the
2020
           running program can access it.  However, we don't load it
2021
           if we are configured for an embedded target */
2022
        flags = SEC_READONLY | SEC_DATA;
2023
        if (strncmp (TARGET_OS, "elf", 3) != 0)
2024
          flags |= SEC_ALLOC | SEC_LOAD;
2025
 
2026
        if (mips_abi != N64_ABI)
2027
          {
2028
            sec = subseg_new (".reginfo", (subsegT) 0);
2029
 
2030
            bfd_set_section_flags (stdoutput, sec, flags);
2031
            bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
2032
 
2033
            mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
2034
          }
2035
        else
2036
          {
2037
            /* The 64-bit ABI uses a .MIPS.options section rather than
2038
               .reginfo section.  */
2039
            sec = subseg_new (".MIPS.options", (subsegT) 0);
2040
            bfd_set_section_flags (stdoutput, sec, flags);
2041
            bfd_set_section_alignment (stdoutput, sec, 3);
2042
 
2043
            /* Set up the option header.  */
2044
            {
2045
              Elf_Internal_Options opthdr;
2046
              char *f;
2047
 
2048
              opthdr.kind = ODK_REGINFO;
2049
              opthdr.size = (sizeof (Elf_External_Options)
2050
                             + sizeof (Elf64_External_RegInfo));
2051
              opthdr.section = 0;
2052
              opthdr.info = 0;
2053
              f = frag_more (sizeof (Elf_External_Options));
2054
              bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
2055
                                             (Elf_External_Options *) f);
2056
 
2057
              mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
2058
            }
2059
          }
2060
 
2061
        if (ECOFF_DEBUGGING)
2062
          {
2063
            sec = subseg_new (".mdebug", (subsegT) 0);
2064
            (void) bfd_set_section_flags (stdoutput, sec,
2065
                                          SEC_HAS_CONTENTS | SEC_READONLY);
2066
            (void) bfd_set_section_alignment (stdoutput, sec, 2);
2067
          }
2068
        else if (mips_flag_pdr)
2069
          {
2070
            pdr_seg = subseg_new (".pdr", (subsegT) 0);
2071
            (void) bfd_set_section_flags (stdoutput, pdr_seg,
2072
                                          SEC_READONLY | SEC_RELOC
2073
                                          | SEC_DEBUGGING);
2074
            (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
2075
          }
2076
 
2077
        subseg_set (seg, subseg);
2078
      }
2079
    }
2080
#endif /* OBJ_ELF */
2081
 
2082
  if (! ECOFF_DEBUGGING)
2083
    md_obj_begin ();
2084
 
2085
  if (mips_fix_vr4120)
2086
    init_vr4120_conflicts ();
2087
}
2088
 
2089
void
2090
md_mips_end (void)
2091
{
2092
  if (! ECOFF_DEBUGGING)
2093
    md_obj_end ();
2094
}
2095
 
2096
void
2097
md_assemble (char *str)
2098
{
2099
  struct mips_cl_insn insn;
2100
  bfd_reloc_code_real_type unused_reloc[3]
2101
    = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
2102
 
2103
  imm_expr.X_op = O_absent;
2104
  imm2_expr.X_op = O_absent;
2105
  offset_expr.X_op = O_absent;
2106
  imm_reloc[0] = BFD_RELOC_UNUSED;
2107
  imm_reloc[1] = BFD_RELOC_UNUSED;
2108
  imm_reloc[2] = BFD_RELOC_UNUSED;
2109
  offset_reloc[0] = BFD_RELOC_UNUSED;
2110
  offset_reloc[1] = BFD_RELOC_UNUSED;
2111
  offset_reloc[2] = BFD_RELOC_UNUSED;
2112
 
2113
  if (mips_opts.mips16)
2114
    mips16_ip (str, &insn);
2115
  else
2116
    {
2117
      mips_ip (str, &insn);
2118
      DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
2119
            str, insn.insn_opcode));
2120
    }
2121
 
2122
  if (insn_error)
2123
    {
2124
      as_bad ("%s `%s'", insn_error, str);
2125
      return;
2126
    }
2127
 
2128
  if (insn.insn_mo->pinfo == INSN_MACRO)
2129
    {
2130
      macro_start ();
2131
      if (mips_opts.mips16)
2132
        mips16_macro (&insn);
2133
      else
2134
        macro (&insn);
2135
      macro_end ();
2136
    }
2137
  else
2138
    {
2139
      if (imm_expr.X_op != O_absent)
2140
        append_insn (&insn, &imm_expr, imm_reloc);
2141
      else if (offset_expr.X_op != O_absent)
2142
        append_insn (&insn, &offset_expr, offset_reloc);
2143
      else
2144
        append_insn (&insn, NULL, unused_reloc);
2145
    }
2146
}
2147
 
2148
/* Convenience functions for abstracting away the differences between
2149
   MIPS16 and non-MIPS16 relocations.  */
2150
 
2151
static inline bfd_boolean
2152
mips16_reloc_p (bfd_reloc_code_real_type reloc)
2153
{
2154
  switch (reloc)
2155
    {
2156
    case BFD_RELOC_MIPS16_JMP:
2157
    case BFD_RELOC_MIPS16_GPREL:
2158
    case BFD_RELOC_MIPS16_GOT16:
2159
    case BFD_RELOC_MIPS16_CALL16:
2160
    case BFD_RELOC_MIPS16_HI16_S:
2161
    case BFD_RELOC_MIPS16_HI16:
2162
    case BFD_RELOC_MIPS16_LO16:
2163
      return TRUE;
2164
 
2165
    default:
2166
      return FALSE;
2167
    }
2168
}
2169
 
2170
static inline bfd_boolean
2171
got16_reloc_p (bfd_reloc_code_real_type reloc)
2172
{
2173
  return reloc == BFD_RELOC_MIPS_GOT16 || reloc == BFD_RELOC_MIPS16_GOT16;
2174
}
2175
 
2176
static inline bfd_boolean
2177
hi16_reloc_p (bfd_reloc_code_real_type reloc)
2178
{
2179
  return reloc == BFD_RELOC_HI16_S || reloc == BFD_RELOC_MIPS16_HI16_S;
2180
}
2181
 
2182
static inline bfd_boolean
2183
lo16_reloc_p (bfd_reloc_code_real_type reloc)
2184
{
2185
  return reloc == BFD_RELOC_LO16 || reloc == BFD_RELOC_MIPS16_LO16;
2186
}
2187
 
2188
/* Return true if the given relocation might need a matching %lo().
2189
   This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2190
   need a matching %lo() when applied to local symbols.  */
2191
 
2192
static inline bfd_boolean
2193
reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
2194
{
2195
  return (HAVE_IN_PLACE_ADDENDS
2196
          && (hi16_reloc_p (reloc)
2197
              /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2198
                 all GOT16 relocations evaluate to "G".  */
2199
              || (got16_reloc_p (reloc) && mips_pic != VXWORKS_PIC)));
2200
}
2201
 
2202
/* Return the type of %lo() reloc needed by RELOC, given that
2203
   reloc_needs_lo_p.  */
2204
 
2205
static inline bfd_reloc_code_real_type
2206
matching_lo_reloc (bfd_reloc_code_real_type reloc)
2207
{
2208
  return mips16_reloc_p (reloc) ? BFD_RELOC_MIPS16_LO16 : BFD_RELOC_LO16;
2209
}
2210
 
2211
/* Return true if the given fixup is followed by a matching R_MIPS_LO16
2212
   relocation.  */
2213
 
2214
static inline bfd_boolean
2215
fixup_has_matching_lo_p (fixS *fixp)
2216
{
2217
  return (fixp->fx_next != NULL
2218
          && fixp->fx_next->fx_r_type == matching_lo_reloc (fixp->fx_r_type)
2219
          && fixp->fx_addsy == fixp->fx_next->fx_addsy
2220
          && fixp->fx_offset == fixp->fx_next->fx_offset);
2221
}
2222
 
2223
/* See whether instruction IP reads register REG.  CLASS is the type
2224
   of register.  */
2225
 
2226
static int
2227
insn_uses_reg (const struct mips_cl_insn *ip, unsigned int reg,
2228
               enum mips_regclass regclass)
2229
{
2230
  if (regclass == MIPS16_REG)
2231
    {
2232
      gas_assert (mips_opts.mips16);
2233
      reg = mips16_to_32_reg_map[reg];
2234
      regclass = MIPS_GR_REG;
2235
    }
2236
 
2237
  /* Don't report on general register ZERO, since it never changes.  */
2238
  if (regclass == MIPS_GR_REG && reg == ZERO)
2239
    return 0;
2240
 
2241
  if (regclass == MIPS_FP_REG)
2242
    {
2243
      gas_assert (! mips_opts.mips16);
2244
      /* If we are called with either $f0 or $f1, we must check $f0.
2245
         This is not optimal, because it will introduce an unnecessary
2246
         NOP between "lwc1 $f0" and "swc1 $f1".  To fix this we would
2247
         need to distinguish reading both $f0 and $f1 or just one of
2248
         them.  Note that we don't have to check the other way,
2249
         because there is no instruction that sets both $f0 and $f1
2250
         and requires a delay.  */
2251
      if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
2252
          && ((EXTRACT_OPERAND (FS, *ip) & ~(unsigned) 1)
2253
              == (reg &~ (unsigned) 1)))
2254
        return 1;
2255
      if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
2256
          && ((EXTRACT_OPERAND (FT, *ip) & ~(unsigned) 1)
2257
              == (reg &~ (unsigned) 1)))
2258
        return 1;
2259
    }
2260
  else if (! mips_opts.mips16)
2261
    {
2262
      if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
2263
          && EXTRACT_OPERAND (RS, *ip) == reg)
2264
        return 1;
2265
      if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
2266
          && EXTRACT_OPERAND (RT, *ip) == reg)
2267
        return 1;
2268
    }
2269
  else
2270
    {
2271
      if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
2272
          && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)] == reg)
2273
        return 1;
2274
      if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
2275
          && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)] == reg)
2276
        return 1;
2277
      if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
2278
          && (mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]
2279
              == reg))
2280
        return 1;
2281
      if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
2282
        return 1;
2283
      if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
2284
        return 1;
2285
      if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
2286
        return 1;
2287
      if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
2288
          && MIPS16_EXTRACT_OPERAND (REGR32, *ip) == reg)
2289
        return 1;
2290
    }
2291
 
2292
  return 0;
2293
}
2294
 
2295
/* This function returns true if modifying a register requires a
2296
   delay.  */
2297
 
2298
static int
2299
reg_needs_delay (unsigned int reg)
2300
{
2301
  unsigned long prev_pinfo;
2302
 
2303
  prev_pinfo = history[0].insn_mo->pinfo;
2304
  if (! mips_opts.noreorder
2305
      && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2306
           && ! gpr_interlocks)
2307
          || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2308
              && ! cop_interlocks)))
2309
    {
2310
      /* A load from a coprocessor or from memory.  All load delays
2311
         delay the use of general register rt for one instruction.  */
2312
      /* Itbl support may require additional care here.  */
2313
      know (prev_pinfo & INSN_WRITE_GPR_T);
2314
      if (reg == EXTRACT_OPERAND (RT, history[0]))
2315
        return 1;
2316
    }
2317
 
2318
  return 0;
2319
}
2320
 
2321
/* Move all labels in insn_labels to the current insertion point.  */
2322
 
2323
static void
2324
mips_move_labels (void)
2325
{
2326
  segment_info_type *si = seg_info (now_seg);
2327
  struct insn_label_list *l;
2328
  valueT val;
2329
 
2330
  for (l = si->label_list; l != NULL; l = l->next)
2331
    {
2332
      gas_assert (S_GET_SEGMENT (l->label) == now_seg);
2333
      symbol_set_frag (l->label, frag_now);
2334
      val = (valueT) frag_now_fix ();
2335
      /* mips16 text labels are stored as odd.  */
2336
      if (mips_opts.mips16)
2337
        ++val;
2338
      S_SET_VALUE (l->label, val);
2339
    }
2340
}
2341
 
2342
static bfd_boolean
2343
s_is_linkonce (symbolS *sym, segT from_seg)
2344
{
2345
  bfd_boolean linkonce = FALSE;
2346
  segT symseg = S_GET_SEGMENT (sym);
2347
 
2348
  if (symseg != from_seg && !S_IS_LOCAL (sym))
2349
    {
2350
      if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
2351
        linkonce = TRUE;
2352
#ifdef OBJ_ELF
2353
      /* The GNU toolchain uses an extension for ELF: a section
2354
         beginning with the magic string .gnu.linkonce is a
2355
         linkonce section.  */
2356
      if (strncmp (segment_name (symseg), ".gnu.linkonce",
2357
                   sizeof ".gnu.linkonce" - 1) == 0)
2358
        linkonce = TRUE;
2359
#endif
2360
    }
2361
  return linkonce;
2362
}
2363
 
2364
/* Mark instruction labels in mips16 mode.  This permits the linker to
2365
   handle them specially, such as generating jalx instructions when
2366
   needed.  We also make them odd for the duration of the assembly, in
2367
   order to generate the right sort of code.  We will make them even
2368
   in the adjust_symtab routine, while leaving them marked.  This is
2369
   convenient for the debugger and the disassembler.  The linker knows
2370
   to make them odd again.  */
2371
 
2372
static void
2373
mips16_mark_labels (void)
2374
{
2375
  segment_info_type *si = seg_info (now_seg);
2376
  struct insn_label_list *l;
2377
 
2378
  if (!mips_opts.mips16)
2379
    return;
2380
 
2381
  for (l = si->label_list; l != NULL; l = l->next)
2382
   {
2383
      symbolS *label = l->label;
2384
 
2385
#if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
2386
      if (IS_ELF)
2387
        S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label)));
2388
#endif
2389
      if ((S_GET_VALUE (label) & 1) == 0
2390
        /* Don't adjust the address if the label is global or weak, or
2391
           in a link-once section, since we'll be emitting symbol reloc
2392
           references to it which will be patched up by the linker, and
2393
           the final value of the symbol may or may not be MIPS16.  */
2394
          && ! S_IS_WEAK (label)
2395
          && ! S_IS_EXTERNAL (label)
2396
          && ! s_is_linkonce (label, now_seg))
2397
        S_SET_VALUE (label, S_GET_VALUE (label) | 1);
2398
    }
2399
}
2400
 
2401
/* End the current frag.  Make it a variant frag and record the
2402
   relaxation info.  */
2403
 
2404
static void
2405
relax_close_frag (void)
2406
{
2407
  mips_macro_warning.first_frag = frag_now;
2408
  frag_var (rs_machine_dependent, 0, 0,
2409
            RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
2410
            mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2411
 
2412
  memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2413
  mips_relax.first_fixup = 0;
2414
}
2415
 
2416
/* Start a new relaxation sequence whose expansion depends on SYMBOL.
2417
   See the comment above RELAX_ENCODE for more details.  */
2418
 
2419
static void
2420
relax_start (symbolS *symbol)
2421
{
2422
  gas_assert (mips_relax.sequence == 0);
2423
  mips_relax.sequence = 1;
2424
  mips_relax.symbol = symbol;
2425
}
2426
 
2427
/* Start generating the second version of a relaxable sequence.
2428
   See the comment above RELAX_ENCODE for more details.  */
2429
 
2430
static void
2431
relax_switch (void)
2432
{
2433
  gas_assert (mips_relax.sequence == 1);
2434
  mips_relax.sequence = 2;
2435
}
2436
 
2437
/* End the current relaxable sequence.  */
2438
 
2439
static void
2440
relax_end (void)
2441
{
2442
  gas_assert (mips_relax.sequence == 2);
2443
  relax_close_frag ();
2444
  mips_relax.sequence = 0;
2445
}
2446
 
2447
/* Classify an instruction according to the FIX_VR4120_* enumeration.
2448
   Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
2449
   by VR4120 errata.  */
2450
 
2451
static unsigned int
2452
classify_vr4120_insn (const char *name)
2453
{
2454
  if (strncmp (name, "macc", 4) == 0)
2455
    return FIX_VR4120_MACC;
2456
  if (strncmp (name, "dmacc", 5) == 0)
2457
    return FIX_VR4120_DMACC;
2458
  if (strncmp (name, "mult", 4) == 0)
2459
    return FIX_VR4120_MULT;
2460
  if (strncmp (name, "dmult", 5) == 0)
2461
    return FIX_VR4120_DMULT;
2462
  if (strstr (name, "div"))
2463
    return FIX_VR4120_DIV;
2464
  if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
2465
    return FIX_VR4120_MTHILO;
2466
  return NUM_FIX_VR4120_CLASSES;
2467
}
2468
 
2469
#define INSN_ERET  0x42000018
2470
#define INSN_DERET 0x4200001f
2471
 
2472
/* Return the number of instructions that must separate INSN1 and INSN2,
2473
   where INSN1 is the earlier instruction.  Return the worst-case value
2474
   for any INSN2 if INSN2 is null.  */
2475
 
2476
static unsigned int
2477
insns_between (const struct mips_cl_insn *insn1,
2478
               const struct mips_cl_insn *insn2)
2479
{
2480
  unsigned long pinfo1, pinfo2;
2481
 
2482
  /* This function needs to know which pinfo flags are set for INSN2
2483
     and which registers INSN2 uses.  The former is stored in PINFO2 and
2484
     the latter is tested via INSN2_USES_REG.  If INSN2 is null, PINFO2
2485
     will have every flag set and INSN2_USES_REG will always return true.  */
2486
  pinfo1 = insn1->insn_mo->pinfo;
2487
  pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
2488
 
2489
#define INSN2_USES_REG(REG, CLASS) \
2490
   (insn2 == NULL || insn_uses_reg (insn2, REG, CLASS))
2491
 
2492
  /* For most targets, write-after-read dependencies on the HI and LO
2493
     registers must be separated by at least two instructions.  */
2494
  if (!hilo_interlocks)
2495
    {
2496
      if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
2497
        return 2;
2498
      if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
2499
        return 2;
2500
    }
2501
 
2502
  /* If we're working around r7000 errata, there must be two instructions
2503
     between an mfhi or mflo and any instruction that uses the result.  */
2504
  if (mips_7000_hilo_fix
2505
      && MF_HILO_INSN (pinfo1)
2506
      && INSN2_USES_REG (EXTRACT_OPERAND (RD, *insn1), MIPS_GR_REG))
2507
    return 2;
2508
 
2509
  /* If we're working around 24K errata, one instruction is required
2510
     if an ERET or DERET is followed by a branch instruction.  */
2511
  if (mips_fix_24k)
2512
    {
2513
      if (insn1->insn_opcode == INSN_ERET
2514
          || insn1->insn_opcode == INSN_DERET)
2515
        {
2516
          if (insn2 == NULL
2517
              || insn2->insn_opcode == INSN_ERET
2518
              || insn2->insn_opcode == INSN_DERET
2519
              || (insn2->insn_mo->pinfo
2520
                  & (INSN_UNCOND_BRANCH_DELAY
2521
                     | INSN_COND_BRANCH_DELAY
2522
                     | INSN_COND_BRANCH_LIKELY)) != 0)
2523
            return 1;
2524
        }
2525
    }
2526
 
2527
  /* If working around VR4120 errata, check for combinations that need
2528
     a single intervening instruction.  */
2529
  if (mips_fix_vr4120)
2530
    {
2531
      unsigned int class1, class2;
2532
 
2533
      class1 = classify_vr4120_insn (insn1->insn_mo->name);
2534
      if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
2535
        {
2536
          if (insn2 == NULL)
2537
            return 1;
2538
          class2 = classify_vr4120_insn (insn2->insn_mo->name);
2539
          if (vr4120_conflicts[class1] & (1 << class2))
2540
            return 1;
2541
        }
2542
    }
2543
 
2544
  if (!mips_opts.mips16)
2545
    {
2546
      /* Check for GPR or coprocessor load delays.  All such delays
2547
         are on the RT register.  */
2548
      /* Itbl support may require additional care here.  */
2549
      if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
2550
          || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
2551
        {
2552
          know (pinfo1 & INSN_WRITE_GPR_T);
2553
          if (INSN2_USES_REG (EXTRACT_OPERAND (RT, *insn1), MIPS_GR_REG))
2554
            return 1;
2555
        }
2556
 
2557
      /* Check for generic coprocessor hazards.
2558
 
2559
         This case is not handled very well.  There is no special
2560
         knowledge of CP0 handling, and the coprocessors other than
2561
         the floating point unit are not distinguished at all.  */
2562
      /* Itbl support may require additional care here. FIXME!
2563
         Need to modify this to include knowledge about
2564
         user specified delays!  */
2565
      else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
2566
               || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
2567
        {
2568
          /* Handle cases where INSN1 writes to a known general coprocessor
2569
             register.  There must be a one instruction delay before INSN2
2570
             if INSN2 reads that register, otherwise no delay is needed.  */
2571
          if (pinfo1 & INSN_WRITE_FPR_T)
2572
            {
2573
              if (INSN2_USES_REG (EXTRACT_OPERAND (FT, *insn1), MIPS_FP_REG))
2574
                return 1;
2575
            }
2576
          else if (pinfo1 & INSN_WRITE_FPR_S)
2577
            {
2578
              if (INSN2_USES_REG (EXTRACT_OPERAND (FS, *insn1), MIPS_FP_REG))
2579
                return 1;
2580
            }
2581
          else
2582
            {
2583
              /* Read-after-write dependencies on the control registers
2584
                 require a two-instruction gap.  */
2585
              if ((pinfo1 & INSN_WRITE_COND_CODE)
2586
                  && (pinfo2 & INSN_READ_COND_CODE))
2587
                return 2;
2588
 
2589
              /* We don't know exactly what INSN1 does.  If INSN2 is
2590
                 also a coprocessor instruction, assume there must be
2591
                 a one instruction gap.  */
2592
              if (pinfo2 & INSN_COP)
2593
                return 1;
2594
            }
2595
        }
2596
 
2597
      /* Check for read-after-write dependencies on the coprocessor
2598
         control registers in cases where INSN1 does not need a general
2599
         coprocessor delay.  This means that INSN1 is a floating point
2600
         comparison instruction.  */
2601
      /* Itbl support may require additional care here.  */
2602
      else if (!cop_interlocks
2603
               && (pinfo1 & INSN_WRITE_COND_CODE)
2604
               && (pinfo2 & INSN_READ_COND_CODE))
2605
        return 1;
2606
    }
2607
 
2608
#undef INSN2_USES_REG
2609
 
2610
  return 0;
2611
}
2612
 
2613
/* Return the number of nops that would be needed to work around the
2614
   VR4130 mflo/mfhi errata if instruction INSN immediately followed
2615
   the MAX_VR4130_NOPS instructions described by HISTORY.  */
2616
 
2617
static int
2618
nops_for_vr4130 (const struct mips_cl_insn *history,
2619
                 const struct mips_cl_insn *insn)
2620
{
2621
  int i, j, reg;
2622
 
2623
  /* Check if the instruction writes to HI or LO.  MTHI and MTLO
2624
     are not affected by the errata.  */
2625
  if (insn != 0
2626
      && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
2627
          || strcmp (insn->insn_mo->name, "mtlo") == 0
2628
          || strcmp (insn->insn_mo->name, "mthi") == 0))
2629
    return 0;
2630
 
2631
  /* Search for the first MFLO or MFHI.  */
2632
  for (i = 0; i < MAX_VR4130_NOPS; i++)
2633
    if (MF_HILO_INSN (history[i].insn_mo->pinfo))
2634
      {
2635
        /* Extract the destination register.  */
2636
        if (mips_opts.mips16)
2637
          reg = mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, history[i])];
2638
        else
2639
          reg = EXTRACT_OPERAND (RD, history[i]);
2640
 
2641
        /* No nops are needed if INSN reads that register.  */
2642
        if (insn != NULL && insn_uses_reg (insn, reg, MIPS_GR_REG))
2643
          return 0;
2644
 
2645
        /* ...or if any of the intervening instructions do.  */
2646
        for (j = 0; j < i; j++)
2647
          if (insn_uses_reg (&history[j], reg, MIPS_GR_REG))
2648
            return 0;
2649
 
2650
        return MAX_VR4130_NOPS - i;
2651
      }
2652
  return 0;
2653
}
2654
 
2655
/* Return the number of nops that would be needed if instruction INSN
2656
   immediately followed the MAX_NOPS instructions given by HISTORY,
2657
   where HISTORY[0] is the most recent instruction.  If INSN is null,
2658
   return the worse-case number of nops for any instruction.  */
2659
 
2660
static int
2661
nops_for_insn (const struct mips_cl_insn *history,
2662
               const struct mips_cl_insn *insn)
2663
{
2664
  int i, nops, tmp_nops;
2665
 
2666
  nops = 0;
2667
  for (i = 0; i < MAX_DELAY_NOPS; i++)
2668
    {
2669
      tmp_nops = insns_between (history + i, insn) - i;
2670
      if (tmp_nops > nops)
2671
        nops = tmp_nops;
2672
    }
2673
 
2674
  if (mips_fix_vr4130)
2675
    {
2676
      tmp_nops = nops_for_vr4130 (history, insn);
2677
      if (tmp_nops > nops)
2678
        nops = tmp_nops;
2679
    }
2680
 
2681
  return nops;
2682
}
2683
 
2684
/* The variable arguments provide NUM_INSNS extra instructions that
2685
   might be added to HISTORY.  Return the largest number of nops that
2686
   would be needed after the extended sequence.  */
2687
 
2688
static int
2689
nops_for_sequence (int num_insns, const struct mips_cl_insn *history, ...)
2690
{
2691
  va_list args;
2692
  struct mips_cl_insn buffer[MAX_NOPS];
2693
  struct mips_cl_insn *cursor;
2694
  int nops;
2695
 
2696
  va_start (args, history);
2697
  cursor = buffer + num_insns;
2698
  memcpy (cursor, history, (MAX_NOPS - num_insns) * sizeof (*cursor));
2699
  while (cursor > buffer)
2700
    *--cursor = *va_arg (args, const struct mips_cl_insn *);
2701
 
2702
  nops = nops_for_insn (buffer, NULL);
2703
  va_end (args);
2704
  return nops;
2705
}
2706
 
2707
/* Like nops_for_insn, but if INSN is a branch, take into account the
2708
   worst-case delay for the branch target.  */
2709
 
2710
static int
2711
nops_for_insn_or_target (const struct mips_cl_insn *history,
2712
                         const struct mips_cl_insn *insn)
2713
{
2714
  int nops, tmp_nops;
2715
 
2716
  nops = nops_for_insn (history, insn);
2717
  if (insn->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2718
                              | INSN_COND_BRANCH_DELAY
2719
                              | INSN_COND_BRANCH_LIKELY))
2720
    {
2721
      tmp_nops = nops_for_sequence (2, history, insn, NOP_INSN);
2722
      if (tmp_nops > nops)
2723
        nops = tmp_nops;
2724
    }
2725
  else if (mips_opts.mips16 && (insn->insn_mo->pinfo & MIPS16_INSN_BRANCH))
2726
    {
2727
      tmp_nops = nops_for_sequence (1, history, insn);
2728
      if (tmp_nops > nops)
2729
        nops = tmp_nops;
2730
    }
2731
  return nops;
2732
}
2733
 
2734
/* Output an instruction.  IP is the instruction information.
2735
   ADDRESS_EXPR is an operand of the instruction to be used with
2736
   RELOC_TYPE.  */
2737
 
2738
static void
2739
append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
2740
             bfd_reloc_code_real_type *reloc_type)
2741
{
2742
  unsigned long prev_pinfo, pinfo;
2743
  relax_stateT prev_insn_frag_type = 0;
2744
  bfd_boolean relaxed_branch = FALSE;
2745
  segment_info_type *si = seg_info (now_seg);
2746
 
2747
  /* Mark instruction labels in mips16 mode.  */
2748
  mips16_mark_labels ();
2749
 
2750
  prev_pinfo = history[0].insn_mo->pinfo;
2751
  pinfo = ip->insn_mo->pinfo;
2752
 
2753
  if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2754
    {
2755
      /* There are a lot of optimizations we could do that we don't.
2756
         In particular, we do not, in general, reorder instructions.
2757
         If you use gcc with optimization, it will reorder
2758
         instructions and generally do much more optimization then we
2759
         do here; repeating all that work in the assembler would only
2760
         benefit hand written assembly code, and does not seem worth
2761
         it.  */
2762
      int nops = (mips_optimize == 0
2763
                  ? nops_for_insn (history, NULL)
2764
                  : nops_for_insn_or_target (history, ip));
2765
      if (nops > 0)
2766
        {
2767
          fragS *old_frag;
2768
          unsigned long old_frag_offset;
2769
          int i;
2770
 
2771
          old_frag = frag_now;
2772
          old_frag_offset = frag_now_fix ();
2773
 
2774
          for (i = 0; i < nops; i++)
2775
            emit_nop ();
2776
 
2777
          if (listing)
2778
            {
2779
              listing_prev_line ();
2780
              /* We may be at the start of a variant frag.  In case we
2781
                 are, make sure there is enough space for the frag
2782
                 after the frags created by listing_prev_line.  The
2783
                 argument to frag_grow here must be at least as large
2784
                 as the argument to all other calls to frag_grow in
2785
                 this file.  We don't have to worry about being in the
2786
                 middle of a variant frag, because the variants insert
2787
                 all needed nop instructions themselves.  */
2788
              frag_grow (40);
2789
            }
2790
 
2791
          mips_move_labels ();
2792
 
2793
#ifndef NO_ECOFF_DEBUGGING
2794
          if (ECOFF_DEBUGGING)
2795
            ecoff_fix_loc (old_frag, old_frag_offset);
2796
#endif
2797
        }
2798
    }
2799
  else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
2800
    {
2801
      /* Work out how many nops in prev_nop_frag are needed by IP.  */
2802
      int nops = nops_for_insn_or_target (history, ip);
2803
      gas_assert (nops <= prev_nop_frag_holds);
2804
 
2805
      /* Enforce NOPS as a minimum.  */
2806
      if (nops > prev_nop_frag_required)
2807
        prev_nop_frag_required = nops;
2808
 
2809
      if (prev_nop_frag_holds == prev_nop_frag_required)
2810
        {
2811
          /* Settle for the current number of nops.  Update the history
2812
             accordingly (for the benefit of any future .set reorder code).  */
2813
          prev_nop_frag = NULL;
2814
          insert_into_history (prev_nop_frag_since,
2815
                               prev_nop_frag_holds, NOP_INSN);
2816
        }
2817
      else
2818
        {
2819
          /* Allow this instruction to replace one of the nops that was
2820
             tentatively added to prev_nop_frag.  */
2821
          prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
2822
          prev_nop_frag_holds--;
2823
          prev_nop_frag_since++;
2824
        }
2825
    }
2826
 
2827
#ifdef OBJ_ELF
2828
  /* The value passed to dwarf2_emit_insn is the distance between
2829
     the beginning of the current instruction and the address that
2830
     should be recorded in the debug tables.  For MIPS16 debug info
2831
     we want to use ISA-encoded addresses, so we pass -1 for an
2832
     address higher by one than the current.  */
2833
  dwarf2_emit_insn (mips_opts.mips16 ? -1 : 0);
2834
#endif
2835
 
2836
  /* Record the frag type before frag_var.  */
2837
  if (history[0].frag)
2838
    prev_insn_frag_type = history[0].frag->fr_type;
2839
 
2840
  if (address_expr
2841
      && *reloc_type == BFD_RELOC_16_PCREL_S2
2842
      && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
2843
          || pinfo & INSN_COND_BRANCH_LIKELY)
2844
      && mips_relax_branch
2845
      /* Don't try branch relaxation within .set nomacro, or within
2846
         .set noat if we use $at for PIC computations.  If it turns
2847
         out that the branch was out-of-range, we'll get an error.  */
2848
      && !mips_opts.warn_about_macros
2849
      && (mips_opts.at || mips_pic == NO_PIC)
2850
      && !mips_opts.mips16)
2851
    {
2852
      relaxed_branch = TRUE;
2853
      add_relaxed_insn (ip, (relaxed_branch_length
2854
                             (NULL, NULL,
2855
                              (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2856
                              : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1
2857
                              : 0)), 4,
2858
                        RELAX_BRANCH_ENCODE
2859
                        (pinfo & INSN_UNCOND_BRANCH_DELAY,
2860
                         pinfo & INSN_COND_BRANCH_LIKELY,
2861
                         pinfo & INSN_WRITE_GPR_31,
2862
                         0),
2863
                        address_expr->X_add_symbol,
2864
                        address_expr->X_add_number);
2865
      *reloc_type = BFD_RELOC_UNUSED;
2866
    }
2867
  else if (*reloc_type > BFD_RELOC_UNUSED)
2868
    {
2869
      /* We need to set up a variant frag.  */
2870
      gas_assert (mips_opts.mips16 && address_expr != NULL);
2871
      add_relaxed_insn (ip, 4, 0,
2872
                        RELAX_MIPS16_ENCODE
2873
                        (*reloc_type - BFD_RELOC_UNUSED,
2874
                         mips16_small, mips16_ext,
2875
                         prev_pinfo & INSN_UNCOND_BRANCH_DELAY,
2876
                         history[0].mips16_absolute_jump_p),
2877
                        make_expr_symbol (address_expr), 0);
2878
    }
2879
  else if (mips_opts.mips16
2880
           && ! ip->use_extend
2881
           && *reloc_type != BFD_RELOC_MIPS16_JMP)
2882
    {
2883
      if ((pinfo & INSN_UNCOND_BRANCH_DELAY) == 0)
2884
        /* Make sure there is enough room to swap this instruction with
2885
           a following jump instruction.  */
2886
        frag_grow (6);
2887
      add_fixed_insn (ip);
2888
    }
2889
  else
2890
    {
2891
      if (mips_opts.mips16
2892
          && mips_opts.noreorder
2893
          && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2894
        as_warn (_("extended instruction in delay slot"));
2895
 
2896
      if (mips_relax.sequence)
2897
        {
2898
          /* If we've reached the end of this frag, turn it into a variant
2899
             frag and record the information for the instructions we've
2900
             written so far.  */
2901
          if (frag_room () < 4)
2902
            relax_close_frag ();
2903
          mips_relax.sizes[mips_relax.sequence - 1] += 4;
2904
        }
2905
 
2906
      if (mips_relax.sequence != 2)
2907
        mips_macro_warning.sizes[0] += 4;
2908
      if (mips_relax.sequence != 1)
2909
        mips_macro_warning.sizes[1] += 4;
2910
 
2911
      if (mips_opts.mips16)
2912
        {
2913
          ip->fixed_p = 1;
2914
          ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
2915
        }
2916
      add_fixed_insn (ip);
2917
    }
2918
 
2919
  if (address_expr != NULL && *reloc_type <= BFD_RELOC_UNUSED)
2920
    {
2921
      if (address_expr->X_op == O_constant)
2922
        {
2923
          unsigned int tmp;
2924
 
2925
          switch (*reloc_type)
2926
            {
2927
            case BFD_RELOC_32:
2928
              ip->insn_opcode |= address_expr->X_add_number;
2929
              break;
2930
 
2931
            case BFD_RELOC_MIPS_HIGHEST:
2932
              tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
2933
              ip->insn_opcode |= tmp & 0xffff;
2934
              break;
2935
 
2936
            case BFD_RELOC_MIPS_HIGHER:
2937
              tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
2938
              ip->insn_opcode |= tmp & 0xffff;
2939
              break;
2940
 
2941
            case BFD_RELOC_HI16_S:
2942
              tmp = (address_expr->X_add_number + 0x8000) >> 16;
2943
              ip->insn_opcode |= tmp & 0xffff;
2944
              break;
2945
 
2946
            case BFD_RELOC_HI16:
2947
              ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
2948
              break;
2949
 
2950
            case BFD_RELOC_UNUSED:
2951
            case BFD_RELOC_LO16:
2952
            case BFD_RELOC_MIPS_GOT_DISP:
2953
              ip->insn_opcode |= address_expr->X_add_number & 0xffff;
2954
              break;
2955
 
2956
            case BFD_RELOC_MIPS_JMP:
2957
              if ((address_expr->X_add_number & 3) != 0)
2958
                as_bad (_("jump to misaligned address (0x%lx)"),
2959
                        (unsigned long) address_expr->X_add_number);
2960
              ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
2961
              break;
2962
 
2963
            case BFD_RELOC_MIPS16_JMP:
2964
              if ((address_expr->X_add_number & 3) != 0)
2965
                as_bad (_("jump to misaligned address (0x%lx)"),
2966
                        (unsigned long) address_expr->X_add_number);
2967
              ip->insn_opcode |=
2968
                (((address_expr->X_add_number & 0x7c0000) << 3)
2969
                 | ((address_expr->X_add_number & 0xf800000) >> 7)
2970
                 | ((address_expr->X_add_number & 0x3fffc) >> 2));
2971
              break;
2972
 
2973
            case BFD_RELOC_16_PCREL_S2:
2974
              if ((address_expr->X_add_number & 3) != 0)
2975
                as_bad (_("branch to misaligned address (0x%lx)"),
2976
                        (unsigned long) address_expr->X_add_number);
2977
              if (mips_relax_branch)
2978
                goto need_reloc;
2979
              if ((address_expr->X_add_number + 0x20000) & ~0x3ffff)
2980
                as_bad (_("branch address range overflow (0x%lx)"),
2981
                        (unsigned long) address_expr->X_add_number);
2982
              ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0xffff;
2983
              break;
2984
 
2985
            default:
2986
              internalError ();
2987
            }
2988
        }
2989
      else if (*reloc_type < BFD_RELOC_UNUSED)
2990
        need_reloc:
2991
        {
2992
          reloc_howto_type *howto;
2993
          int i;
2994
 
2995
          /* In a compound relocation, it is the final (outermost)
2996
             operator that determines the relocated field.  */
2997
          for (i = 1; i < 3; i++)
2998
            if (reloc_type[i] == BFD_RELOC_UNUSED)
2999
              break;
3000
 
3001
          howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
3002
          if (howto == NULL)
3003
            {
3004
              /* To reproduce this failure try assembling gas/testsuites/
3005
                 gas/mips/mips16-intermix.s with a mips-ecoff targeted
3006
                 assembler.  */
3007
              as_bad (_("Unsupported MIPS relocation number %d"), reloc_type[i - 1]);
3008
              howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_16);
3009
            }
3010
 
3011
          ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
3012
                                     bfd_get_reloc_size (howto),
3013
                                     address_expr,
3014
                                     reloc_type[0] == BFD_RELOC_16_PCREL_S2,
3015
                                     reloc_type[0]);
3016
 
3017
          /* Tag symbols that have a R_MIPS16_26 relocation against them.  */
3018
          if (reloc_type[0] == BFD_RELOC_MIPS16_JMP
3019
              && ip->fixp[0]->fx_addsy)
3020
            *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
3021
 
3022
          /* These relocations can have an addend that won't fit in
3023
             4 octets for 64bit assembly.  */
3024
          if (HAVE_64BIT_GPRS
3025
              && ! howto->partial_inplace
3026
              && (reloc_type[0] == BFD_RELOC_16
3027
                  || reloc_type[0] == BFD_RELOC_32
3028
                  || reloc_type[0] == BFD_RELOC_MIPS_JMP
3029
                  || reloc_type[0] == BFD_RELOC_GPREL16
3030
                  || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
3031
                  || reloc_type[0] == BFD_RELOC_GPREL32
3032
                  || reloc_type[0] == BFD_RELOC_64
3033
                  || reloc_type[0] == BFD_RELOC_CTOR
3034
                  || reloc_type[0] == BFD_RELOC_MIPS_SUB
3035
                  || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
3036
                  || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
3037
                  || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
3038
                  || reloc_type[0] == BFD_RELOC_MIPS_REL16
3039
                  || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
3040
                  || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
3041
                  || hi16_reloc_p (reloc_type[0])
3042
                  || lo16_reloc_p (reloc_type[0])))
3043
            ip->fixp[0]->fx_no_overflow = 1;
3044
 
3045
          if (mips_relax.sequence)
3046
            {
3047
              if (mips_relax.first_fixup == 0)
3048
                mips_relax.first_fixup = ip->fixp[0];
3049
            }
3050
          else if (reloc_needs_lo_p (*reloc_type))
3051
            {
3052
              struct mips_hi_fixup *hi_fixup;
3053
 
3054
              /* Reuse the last entry if it already has a matching %lo.  */
3055
              hi_fixup = mips_hi_fixup_list;
3056
              if (hi_fixup == 0
3057
                  || !fixup_has_matching_lo_p (hi_fixup->fixp))
3058
                {
3059
                  hi_fixup = ((struct mips_hi_fixup *)
3060
                              xmalloc (sizeof (struct mips_hi_fixup)));
3061
                  hi_fixup->next = mips_hi_fixup_list;
3062
                  mips_hi_fixup_list = hi_fixup;
3063
                }
3064
              hi_fixup->fixp = ip->fixp[0];
3065
              hi_fixup->seg = now_seg;
3066
            }
3067
 
3068
          /* Add fixups for the second and third relocations, if given.
3069
             Note that the ABI allows the second relocation to be
3070
             against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC.  At the
3071
             moment we only use RSS_UNDEF, but we could add support
3072
             for the others if it ever becomes necessary.  */
3073
          for (i = 1; i < 3; i++)
3074
            if (reloc_type[i] != BFD_RELOC_UNUSED)
3075
              {
3076
                ip->fixp[i] = fix_new (ip->frag, ip->where,
3077
                                       ip->fixp[0]->fx_size, NULL, 0,
3078
                                       FALSE, reloc_type[i]);
3079
 
3080
                /* Use fx_tcbit to mark compound relocs.  */
3081
                ip->fixp[0]->fx_tcbit = 1;
3082
                ip->fixp[i]->fx_tcbit = 1;
3083
              }
3084
        }
3085
    }
3086
  install_insn (ip);
3087
 
3088
  /* Update the register mask information.  */
3089
  if (! mips_opts.mips16)
3090
    {
3091
      if (pinfo & INSN_WRITE_GPR_D)
3092
        mips_gprmask |= 1 << EXTRACT_OPERAND (RD, *ip);
3093
      if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
3094
        mips_gprmask |= 1 << EXTRACT_OPERAND (RT, *ip);
3095
      if (pinfo & INSN_READ_GPR_S)
3096
        mips_gprmask |= 1 << EXTRACT_OPERAND (RS, *ip);
3097
      if (pinfo & INSN_WRITE_GPR_31)
3098
        mips_gprmask |= 1 << RA;
3099
      if (pinfo & INSN_WRITE_FPR_D)
3100
        mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FD, *ip);
3101
      if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
3102
        mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FS, *ip);
3103
      if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
3104
        mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FT, *ip);
3105
      if ((pinfo & INSN_READ_FPR_R) != 0)
3106
        mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FR, *ip);
3107
      if (pinfo & INSN_COP)
3108
        {
3109
          /* We don't keep enough information to sort these cases out.
3110
             The itbl support does keep this information however, although
3111
             we currently don't support itbl fprmats as part of the cop
3112
             instruction.  May want to add this support in the future.  */
3113
        }
3114
      /* Never set the bit for $0, which is always zero.  */
3115
      mips_gprmask &= ~1 << 0;
3116
    }
3117
  else
3118
    {
3119
      if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
3120
        mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RX, *ip);
3121
      if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
3122
        mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RY, *ip);
3123
      if (pinfo & MIPS16_INSN_WRITE_Z)
3124
        mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RZ, *ip);
3125
      if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
3126
        mips_gprmask |= 1 << TREG;
3127
      if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
3128
        mips_gprmask |= 1 << SP;
3129
      if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
3130
        mips_gprmask |= 1 << RA;
3131
      if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
3132
        mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
3133
      if (pinfo & MIPS16_INSN_READ_Z)
3134
        mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip);
3135
      if (pinfo & MIPS16_INSN_READ_GPR_X)
3136
        mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
3137
    }
3138
 
3139
  if (mips_relax.sequence != 2 && !mips_opts.noreorder)
3140
    {
3141
      /* Filling the branch delay slot is more complex.  We try to
3142
         switch the branch with the previous instruction, which we can
3143
         do if the previous instruction does not set up a condition
3144
         that the branch tests and if the branch is not itself the
3145
         target of any branch.  */
3146
      if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
3147
          || (pinfo & INSN_COND_BRANCH_DELAY))
3148
        {
3149
          if (mips_optimize < 2
3150
              /* If we have seen .set volatile or .set nomove, don't
3151
                 optimize.  */
3152
              || mips_opts.nomove != 0
3153
              /* We can't swap if the previous instruction's position
3154
                 is fixed.  */
3155
              || history[0].fixed_p
3156
              /* If the previous previous insn was in a .set
3157
                 noreorder, we can't swap.  Actually, the MIPS
3158
                 assembler will swap in this situation.  However, gcc
3159
                 configured -with-gnu-as will generate code like
3160
                   .set noreorder
3161
                   lw   $4,XXX
3162
                   .set reorder
3163
                   INSN
3164
                   bne  $4,$0,foo
3165
                 in which we can not swap the bne and INSN.  If gcc is
3166
                 not configured -with-gnu-as, it does not output the
3167
                 .set pseudo-ops.  */
3168
              || history[1].noreorder_p
3169
              /* If the branch is itself the target of a branch, we
3170
                 can not swap.  We cheat on this; all we check for is
3171
                 whether there is a label on this instruction.  If
3172
                 there are any branches to anything other than a
3173
                 label, users must use .set noreorder.  */
3174
              || si->label_list != NULL
3175
              /* If the previous instruction is in a variant frag
3176
                 other than this branch's one, we cannot do the swap.
3177
                 This does not apply to the mips16, which uses variant
3178
                 frags for different purposes.  */
3179
              || (! mips_opts.mips16
3180
                  && prev_insn_frag_type == rs_machine_dependent)
3181
              /* Check for conflicts between the branch and the instructions
3182
                 before the candidate delay slot.  */
3183
              || nops_for_insn (history + 1, ip) > 0
3184
              /* Check for conflicts between the swapped sequence and the
3185
                 target of the branch.  */
3186
              || nops_for_sequence (2, history + 1, ip, history) > 0
3187
              /* We do not swap with a trap instruction, since it
3188
                 complicates trap handlers to have the trap
3189
                 instruction be in a delay slot.  */
3190
              || (prev_pinfo & INSN_TRAP)
3191
              /* If the branch reads a register that the previous
3192
                 instruction sets, we can not swap.  */
3193
              || (! mips_opts.mips16
3194
                  && (prev_pinfo & INSN_WRITE_GPR_T)
3195
                  && insn_uses_reg (ip, EXTRACT_OPERAND (RT, history[0]),
3196
                                    MIPS_GR_REG))
3197
              || (! mips_opts.mips16
3198
                  && (prev_pinfo & INSN_WRITE_GPR_D)
3199
                  && insn_uses_reg (ip, EXTRACT_OPERAND (RD, history[0]),
3200
                                    MIPS_GR_REG))
3201
              || (mips_opts.mips16
3202
                  && (((prev_pinfo & MIPS16_INSN_WRITE_X)
3203
                       && (insn_uses_reg
3204
                           (ip, MIPS16_EXTRACT_OPERAND (RX, history[0]),
3205
                            MIPS16_REG)))
3206
                      || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
3207
                          && (insn_uses_reg
3208
                              (ip, MIPS16_EXTRACT_OPERAND (RY, history[0]),
3209
                               MIPS16_REG)))
3210
                      || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
3211
                          && (insn_uses_reg
3212
                              (ip, MIPS16_EXTRACT_OPERAND (RZ, history[0]),
3213
                               MIPS16_REG)))
3214
                      || ((prev_pinfo & MIPS16_INSN_WRITE_T)
3215
                          && insn_uses_reg (ip, TREG, MIPS_GR_REG))
3216
                      || ((prev_pinfo & MIPS16_INSN_WRITE_31)
3217
                          && insn_uses_reg (ip, RA, MIPS_GR_REG))
3218
                      || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3219
                          && insn_uses_reg (ip,
3220
                                            MIPS16OP_EXTRACT_REG32R
3221
                                              (history[0].insn_opcode),
3222
                                            MIPS_GR_REG))))
3223
              /* If the branch writes a register that the previous
3224
                 instruction sets, we can not swap (we know that
3225
                 branches write only to RD or to $31).  */
3226
              || (! mips_opts.mips16
3227
                  && (prev_pinfo & INSN_WRITE_GPR_T)
3228
                  && (((pinfo & INSN_WRITE_GPR_D)
3229
                       && (EXTRACT_OPERAND (RT, history[0])
3230
                           == EXTRACT_OPERAND (RD, *ip)))
3231
                      || ((pinfo & INSN_WRITE_GPR_31)
3232
                          && EXTRACT_OPERAND (RT, history[0]) == RA)))
3233
              || (! mips_opts.mips16
3234
                  && (prev_pinfo & INSN_WRITE_GPR_D)
3235
                  && (((pinfo & INSN_WRITE_GPR_D)
3236
                       && (EXTRACT_OPERAND (RD, history[0])
3237
                           == EXTRACT_OPERAND (RD, *ip)))
3238
                      || ((pinfo & INSN_WRITE_GPR_31)
3239
                          && EXTRACT_OPERAND (RD, history[0]) == RA)))
3240
              || (mips_opts.mips16
3241
                  && (pinfo & MIPS16_INSN_WRITE_31)
3242
                  && ((prev_pinfo & MIPS16_INSN_WRITE_31)
3243
                      || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3244
                          && (MIPS16OP_EXTRACT_REG32R (history[0].insn_opcode)
3245
                              == RA))))
3246
              /* If the branch writes a register that the previous
3247
                 instruction reads, we can not swap (we know that
3248
                 branches only write to RD or to $31).  */
3249
              || (! mips_opts.mips16
3250
                  && (pinfo & INSN_WRITE_GPR_D)
3251
                  && insn_uses_reg (&history[0],
3252
                                    EXTRACT_OPERAND (RD, *ip),
3253
                                    MIPS_GR_REG))
3254
              || (! mips_opts.mips16
3255
                  && (pinfo & INSN_WRITE_GPR_31)
3256
                  && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3257
              || (mips_opts.mips16
3258
                  && (pinfo & MIPS16_INSN_WRITE_31)
3259
                  && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3260
              /* If one instruction sets a condition code and the
3261
                 other one uses a condition code, we can not swap.  */
3262
              || ((pinfo & INSN_READ_COND_CODE)
3263
                  && (prev_pinfo & INSN_WRITE_COND_CODE))
3264
              || ((pinfo & INSN_WRITE_COND_CODE)
3265
                  && (prev_pinfo & INSN_READ_COND_CODE))
3266
              /* If the previous instruction uses the PC, we can not
3267
                 swap.  */
3268
              || (mips_opts.mips16
3269
                  && (prev_pinfo & MIPS16_INSN_READ_PC))
3270
              /* If the previous instruction had a fixup in mips16
3271
                 mode, we can not swap.  This normally means that the
3272
                 previous instruction was a 4 byte branch anyhow.  */
3273
              || (mips_opts.mips16 && history[0].fixp[0])
3274
              /* If the previous instruction is a sync, sync.l, or
3275
                 sync.p, we can not swap.  */
3276
              || (prev_pinfo & INSN_SYNC)
3277
              /* If the previous instruction is an ERET or
3278
                 DERET, avoid the swap.  */
3279
              || (history[0].insn_opcode == INSN_ERET)
3280
              || (history[0].insn_opcode == INSN_DERET))
3281
            {
3282
              if (mips_opts.mips16
3283
                  && (pinfo & INSN_UNCOND_BRANCH_DELAY)
3284
                  && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31))
3285
                  && ISA_SUPPORTS_MIPS16E)
3286
                {
3287
                  /* Convert MIPS16 jr/jalr into a "compact" jump.  */
3288
                  ip->insn_opcode |= 0x0080;
3289
                  install_insn (ip);
3290
                  insert_into_history (0, 1, ip);
3291
                }
3292
              else
3293
                {
3294
                  /* We could do even better for unconditional branches to
3295
                     portions of this object file; we could pick up the
3296
                     instruction at the destination, put it in the delay
3297
                     slot, and bump the destination address.  */
3298
                  insert_into_history (0, 1, ip);
3299
                  emit_nop ();
3300
                }
3301
 
3302
              if (mips_relax.sequence)
3303
                mips_relax.sizes[mips_relax.sequence - 1] += 4;
3304
            }
3305
          else
3306
            {
3307
              /* It looks like we can actually do the swap.  */
3308
              struct mips_cl_insn delay = history[0];
3309
              if (mips_opts.mips16)
3310
                {
3311
                  know (delay.frag == ip->frag);
3312
                  move_insn (ip, delay.frag, delay.where);
3313
                  move_insn (&delay, ip->frag, ip->where + insn_length (ip));
3314
                }
3315
              else if (relaxed_branch)
3316
                {
3317
                  /* Add the delay slot instruction to the end of the
3318
                     current frag and shrink the fixed part of the
3319
                     original frag.  If the branch occupies the tail of
3320
                     the latter, move it backwards to cover the gap.  */
3321
                  delay.frag->fr_fix -= 4;
3322
                  if (delay.frag == ip->frag)
3323
                    move_insn (ip, ip->frag, ip->where - 4);
3324
                  add_fixed_insn (&delay);
3325
                }
3326
              else
3327
                {
3328
                  move_insn (&delay, ip->frag, ip->where);
3329
                  move_insn (ip, history[0].frag, history[0].where);
3330
                }
3331
              history[0] = *ip;
3332
              delay.fixed_p = 1;
3333
              insert_into_history (0, 1, &delay);
3334
            }
3335
 
3336
          /* If that was an unconditional branch, forget the previous
3337
             insn information.  */
3338
          if (pinfo & INSN_UNCOND_BRANCH_DELAY)
3339
            {
3340
              mips_no_prev_insn ();
3341
            }
3342
        }
3343
      else if (pinfo & INSN_COND_BRANCH_LIKELY)
3344
        {
3345
          /* We don't yet optimize a branch likely.  What we should do
3346
             is look at the target, copy the instruction found there
3347
             into the delay slot, and increment the branch to jump to
3348
             the next instruction.  */
3349
          insert_into_history (0, 1, ip);
3350
          emit_nop ();
3351
        }
3352
      else
3353
        insert_into_history (0, 1, ip);
3354
    }
3355
  else
3356
    insert_into_history (0, 1, ip);
3357
 
3358
  /* We just output an insn, so the next one doesn't have a label.  */
3359
  mips_clear_insn_labels ();
3360
}
3361
 
3362
/* Forget that there was any previous instruction or label.  */
3363
 
3364
static void
3365
mips_no_prev_insn (void)
3366
{
3367
  prev_nop_frag = NULL;
3368
  insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
3369
  mips_clear_insn_labels ();
3370
}
3371
 
3372
/* This function must be called before we emit something other than
3373
   instructions.  It is like mips_no_prev_insn except that it inserts
3374
   any NOPS that might be needed by previous instructions.  */
3375
 
3376
void
3377
mips_emit_delays (void)
3378
{
3379
  if (! mips_opts.noreorder)
3380
    {
3381
      int nops = nops_for_insn (history, NULL);
3382
      if (nops > 0)
3383
        {
3384
          while (nops-- > 0)
3385
            add_fixed_insn (NOP_INSN);
3386
          mips_move_labels ();
3387
        }
3388
    }
3389
  mips_no_prev_insn ();
3390
}
3391
 
3392
/* Start a (possibly nested) noreorder block.  */
3393
 
3394
static void
3395
start_noreorder (void)
3396
{
3397
  if (mips_opts.noreorder == 0)
3398
    {
3399
      unsigned int i;
3400
      int nops;
3401
 
3402
      /* None of the instructions before the .set noreorder can be moved.  */
3403
      for (i = 0; i < ARRAY_SIZE (history); i++)
3404
        history[i].fixed_p = 1;
3405
 
3406
      /* Insert any nops that might be needed between the .set noreorder
3407
         block and the previous instructions.  We will later remove any
3408
         nops that turn out not to be needed.  */
3409
      nops = nops_for_insn (history, NULL);
3410
      if (nops > 0)
3411
        {
3412
          if (mips_optimize != 0)
3413
            {
3414
              /* Record the frag which holds the nop instructions, so
3415
                 that we can remove them if we don't need them.  */
3416
              frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
3417
              prev_nop_frag = frag_now;
3418
              prev_nop_frag_holds = nops;
3419
              prev_nop_frag_required = 0;
3420
              prev_nop_frag_since = 0;
3421
            }
3422
 
3423
          for (; nops > 0; --nops)
3424
            add_fixed_insn (NOP_INSN);
3425
 
3426
          /* Move on to a new frag, so that it is safe to simply
3427
             decrease the size of prev_nop_frag.  */
3428
          frag_wane (frag_now);
3429
          frag_new (0);
3430
          mips_move_labels ();
3431
        }
3432
      mips16_mark_labels ();
3433
      mips_clear_insn_labels ();
3434
    }
3435
  mips_opts.noreorder++;
3436
  mips_any_noreorder = 1;
3437
}
3438
 
3439
/* End a nested noreorder block.  */
3440
 
3441
static void
3442
end_noreorder (void)
3443
{
3444
 
3445
  mips_opts.noreorder--;
3446
  if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
3447
    {
3448
      /* Commit to inserting prev_nop_frag_required nops and go back to
3449
         handling nop insertion the .set reorder way.  */
3450
      prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
3451
                                * (mips_opts.mips16 ? 2 : 4));
3452
      insert_into_history (prev_nop_frag_since,
3453
                           prev_nop_frag_required, NOP_INSN);
3454
      prev_nop_frag = NULL;
3455
    }
3456
}
3457
 
3458
/* Set up global variables for the start of a new macro.  */
3459
 
3460
static void
3461
macro_start (void)
3462
{
3463
  memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
3464
  mips_macro_warning.delay_slot_p = (mips_opts.noreorder
3465
                                     && (history[0].insn_mo->pinfo
3466
                                         & (INSN_UNCOND_BRANCH_DELAY
3467
                                            | INSN_COND_BRANCH_DELAY
3468
                                            | INSN_COND_BRANCH_LIKELY)) != 0);
3469
}
3470
 
3471
/* Given that a macro is longer than 4 bytes, return the appropriate warning
3472
   for it.  Return null if no warning is needed.  SUBTYPE is a bitmask of
3473
   RELAX_DELAY_SLOT and RELAX_NOMACRO.  */
3474
 
3475
static const char *
3476
macro_warning (relax_substateT subtype)
3477
{
3478
  if (subtype & RELAX_DELAY_SLOT)
3479
    return _("Macro instruction expanded into multiple instructions"
3480
             " in a branch delay slot");
3481
  else if (subtype & RELAX_NOMACRO)
3482
    return _("Macro instruction expanded into multiple instructions");
3483
  else
3484
    return 0;
3485
}
3486
 
3487
/* Finish up a macro.  Emit warnings as appropriate.  */
3488
 
3489
static void
3490
macro_end (void)
3491
{
3492
  if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
3493
    {
3494
      relax_substateT subtype;
3495
 
3496
      /* Set up the relaxation warning flags.  */
3497
      subtype = 0;
3498
      if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
3499
        subtype |= RELAX_SECOND_LONGER;
3500
      if (mips_opts.warn_about_macros)
3501
        subtype |= RELAX_NOMACRO;
3502
      if (mips_macro_warning.delay_slot_p)
3503
        subtype |= RELAX_DELAY_SLOT;
3504
 
3505
      if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
3506
        {
3507
          /* Either the macro has a single implementation or both
3508
             implementations are longer than 4 bytes.  Emit the
3509
             warning now.  */
3510
          const char *msg = macro_warning (subtype);
3511
          if (msg != 0)
3512
            as_warn ("%s", msg);
3513
        }
3514
      else
3515
        {
3516
          /* One implementation might need a warning but the other
3517
             definitely doesn't.  */
3518
          mips_macro_warning.first_frag->fr_subtype |= subtype;
3519
        }
3520
    }
3521
}
3522
 
3523
/* Read a macro's relocation codes from *ARGS and store them in *R.
3524
   The first argument in *ARGS will be either the code for a single
3525
   relocation or -1 followed by the three codes that make up a
3526
   composite relocation.  */
3527
 
3528
static void
3529
macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
3530
{
3531
  int i, next;
3532
 
3533
  next = va_arg (*args, int);
3534
  if (next >= 0)
3535
    r[0] = (bfd_reloc_code_real_type) next;
3536
  else
3537
    for (i = 0; i < 3; i++)
3538
      r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
3539
}
3540
 
3541
/* Build an instruction created by a macro expansion.  This is passed
3542
   a pointer to the count of instructions created so far, an
3543
   expression, the name of the instruction to build, an operand format
3544
   string, and corresponding arguments.  */
3545
 
3546
static void
3547
macro_build (expressionS *ep, const char *name, const char *fmt, ...)
3548
{
3549
  const struct mips_opcode *mo;
3550
  struct mips_cl_insn insn;
3551
  bfd_reloc_code_real_type r[3];
3552
  va_list args;
3553
 
3554
  va_start (args, fmt);
3555
 
3556
  if (mips_opts.mips16)
3557
    {
3558
      mips16_macro_build (ep, name, fmt, args);
3559
      va_end (args);
3560
      return;
3561
    }
3562
 
3563
  r[0] = BFD_RELOC_UNUSED;
3564
  r[1] = BFD_RELOC_UNUSED;
3565
  r[2] = BFD_RELOC_UNUSED;
3566
  mo = (struct mips_opcode *) hash_find (op_hash, name);
3567
  gas_assert (mo);
3568
  gas_assert (strcmp (name, mo->name) == 0);
3569
 
3570
  while (1)
3571
    {
3572
      /* Search until we get a match for NAME.  It is assumed here that
3573
         macros will never generate MDMX, MIPS-3D, or MT instructions.  */
3574
      if (strcmp (fmt, mo->args) == 0
3575
          && mo->pinfo != INSN_MACRO
3576
          && is_opcode_valid (mo, TRUE))
3577
        break;
3578
 
3579
      ++mo;
3580
      gas_assert (mo->name);
3581
      gas_assert (strcmp (name, mo->name) == 0);
3582
    }
3583
 
3584
  create_insn (&insn, mo);
3585
  for (;;)
3586
    {
3587
      switch (*fmt++)
3588
        {
3589
        case '\0':
3590
          break;
3591
 
3592
        case ',':
3593
        case '(':
3594
        case ')':
3595
          continue;
3596
 
3597
        case '+':
3598
          switch (*fmt++)
3599
            {
3600
            case 'A':
3601
            case 'E':
3602
              INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3603
              continue;
3604
 
3605
            case 'B':
3606
            case 'F':
3607
              /* Note that in the macro case, these arguments are already
3608
                 in MSB form.  (When handling the instruction in the
3609
                 non-macro case, these arguments are sizes from which
3610
                 MSB values must be calculated.)  */
3611
              INSERT_OPERAND (INSMSB, insn, va_arg (args, int));
3612
              continue;
3613
 
3614
            case 'C':
3615
            case 'G':
3616
            case 'H':
3617
              /* Note that in the macro case, these arguments are already
3618
                 in MSBD form.  (When handling the instruction in the
3619
                 non-macro case, these arguments are sizes from which
3620
                 MSBD values must be calculated.)  */
3621
              INSERT_OPERAND (EXTMSBD, insn, va_arg (args, int));
3622
              continue;
3623
 
3624
            case 'Q':
3625
              INSERT_OPERAND (SEQI, insn, va_arg (args, int));
3626
              continue;
3627
 
3628
            default:
3629
              internalError ();
3630
            }
3631
          continue;
3632
 
3633
        case '2':
3634
          INSERT_OPERAND (BP, insn, va_arg (args, int));
3635
          continue;
3636
 
3637
        case 't':
3638
        case 'w':
3639
        case 'E':
3640
          INSERT_OPERAND (RT, insn, va_arg (args, int));
3641
          continue;
3642
 
3643
        case 'c':
3644
          INSERT_OPERAND (CODE, insn, va_arg (args, int));
3645
          continue;
3646
 
3647
        case 'T':
3648
        case 'W':
3649
          INSERT_OPERAND (FT, insn, va_arg (args, int));
3650
          continue;
3651
 
3652
        case 'd':
3653
        case 'G':
3654
        case 'K':
3655
          INSERT_OPERAND (RD, insn, va_arg (args, int));
3656
          continue;
3657
 
3658
        case 'U':
3659
          {
3660
            int tmp = va_arg (args, int);
3661
 
3662
            INSERT_OPERAND (RT, insn, tmp);
3663
            INSERT_OPERAND (RD, insn, tmp);
3664
            continue;
3665
          }
3666
 
3667
        case 'V':
3668
        case 'S':
3669
          INSERT_OPERAND (FS, insn, va_arg (args, int));
3670
          continue;
3671
 
3672
        case 'z':
3673
          continue;
3674
 
3675
        case '<':
3676
          INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3677
          continue;
3678
 
3679
        case 'D':
3680
          INSERT_OPERAND (FD, insn, va_arg (args, int));
3681
          continue;
3682
 
3683
        case 'B':
3684
          INSERT_OPERAND (CODE20, insn, va_arg (args, int));
3685
          continue;
3686
 
3687
        case 'J':
3688
          INSERT_OPERAND (CODE19, insn, va_arg (args, int));
3689
          continue;
3690
 
3691
        case 'q':
3692
          INSERT_OPERAND (CODE2, insn, va_arg (args, int));
3693
          continue;
3694
 
3695
        case 'b':
3696
        case 's':
3697
        case 'r':
3698
        case 'v':
3699
          INSERT_OPERAND (RS, insn, va_arg (args, int));
3700
          continue;
3701
 
3702
        case 'i':
3703
        case 'j':
3704
        case 'o':
3705
          macro_read_relocs (&args, r);
3706
          gas_assert (*r == BFD_RELOC_GPREL16
3707
                  || *r == BFD_RELOC_MIPS_LITERAL
3708
                  || *r == BFD_RELOC_MIPS_HIGHER
3709
                  || *r == BFD_RELOC_HI16_S
3710
                  || *r == BFD_RELOC_LO16
3711
                  || *r == BFD_RELOC_MIPS_GOT16
3712
                  || *r == BFD_RELOC_MIPS_CALL16
3713
                  || *r == BFD_RELOC_MIPS_GOT_DISP
3714
                  || *r == BFD_RELOC_MIPS_GOT_PAGE
3715
                  || *r == BFD_RELOC_MIPS_GOT_OFST
3716
                  || *r == BFD_RELOC_MIPS_GOT_LO16
3717
                  || *r == BFD_RELOC_MIPS_CALL_LO16);
3718
          continue;
3719
 
3720
        case 'u':
3721
          macro_read_relocs (&args, r);
3722
          gas_assert (ep != NULL
3723
                  && (ep->X_op == O_constant
3724
                      || (ep->X_op == O_symbol
3725
                          && (*r == BFD_RELOC_MIPS_HIGHEST
3726
                              || *r == BFD_RELOC_HI16_S
3727
                              || *r == BFD_RELOC_HI16
3728
                              || *r == BFD_RELOC_GPREL16
3729
                              || *r == BFD_RELOC_MIPS_GOT_HI16
3730
                              || *r == BFD_RELOC_MIPS_CALL_HI16))));
3731
          continue;
3732
 
3733
        case 'p':
3734
          gas_assert (ep != NULL);
3735
 
3736
          /*
3737
           * This allows macro() to pass an immediate expression for
3738
           * creating short branches without creating a symbol.
3739
           *
3740
           * We don't allow branch relaxation for these branches, as
3741
           * they should only appear in ".set nomacro" anyway.
3742
           */
3743
          if (ep->X_op == O_constant)
3744
            {
3745
              if ((ep->X_add_number & 3) != 0)
3746
                as_bad (_("branch to misaligned address (0x%lx)"),
3747
                        (unsigned long) ep->X_add_number);
3748
              if ((ep->X_add_number + 0x20000) & ~0x3ffff)
3749
                as_bad (_("branch address range overflow (0x%lx)"),
3750
                        (unsigned long) ep->X_add_number);
3751
              insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3752
              ep = NULL;
3753
            }
3754
          else
3755
            *r = BFD_RELOC_16_PCREL_S2;
3756
          continue;
3757
 
3758
        case 'a':
3759
          gas_assert (ep != NULL);
3760
          *r = BFD_RELOC_MIPS_JMP;
3761
          continue;
3762
 
3763
        case 'C':
3764
          INSERT_OPERAND (COPZ, insn, va_arg (args, unsigned long));
3765
          continue;
3766
 
3767
        case 'k':
3768
          INSERT_OPERAND (CACHE, insn, va_arg (args, unsigned long));
3769
          continue;
3770
 
3771
        default:
3772
          internalError ();
3773
        }
3774
      break;
3775
    }
3776
  va_end (args);
3777
  gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3778
 
3779
  append_insn (&insn, ep, r);
3780
}
3781
 
3782
static void
3783
mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
3784
                    va_list args)
3785
{
3786
  struct mips_opcode *mo;
3787
  struct mips_cl_insn insn;
3788
  bfd_reloc_code_real_type r[3]
3789
    = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3790
 
3791
  mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
3792
  gas_assert (mo);
3793
  gas_assert (strcmp (name, mo->name) == 0);
3794
 
3795
  while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
3796
    {
3797
      ++mo;
3798
      gas_assert (mo->name);
3799
      gas_assert (strcmp (name, mo->name) == 0);
3800
    }
3801
 
3802
  create_insn (&insn, mo);
3803
  for (;;)
3804
    {
3805
      int c;
3806
 
3807
      c = *fmt++;
3808
      switch (c)
3809
        {
3810
        case '\0':
3811
          break;
3812
 
3813
        case ',':
3814
        case '(':
3815
        case ')':
3816
          continue;
3817
 
3818
        case 'y':
3819
        case 'w':
3820
          MIPS16_INSERT_OPERAND (RY, insn, va_arg (args, int));
3821
          continue;
3822
 
3823
        case 'x':
3824
        case 'v':
3825
          MIPS16_INSERT_OPERAND (RX, insn, va_arg (args, int));
3826
          continue;
3827
 
3828
        case 'z':
3829
          MIPS16_INSERT_OPERAND (RZ, insn, va_arg (args, int));
3830
          continue;
3831
 
3832
        case 'Z':
3833
          MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (args, int));
3834
          continue;
3835
 
3836
        case '0':
3837
        case 'S':
3838
        case 'P':
3839
        case 'R':
3840
          continue;
3841
 
3842
        case 'X':
3843
          MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (args, int));
3844
          continue;
3845
 
3846
        case 'Y':
3847
          {
3848
            int regno;
3849
 
3850
            regno = va_arg (args, int);
3851
            regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
3852
            MIPS16_INSERT_OPERAND (REG32R, insn, regno);
3853
          }
3854
          continue;
3855
 
3856
        case '<':
3857
        case '>':
3858
        case '4':
3859
        case '5':
3860
        case 'H':
3861
        case 'W':
3862
        case 'D':
3863
        case 'j':
3864
        case '8':
3865
        case 'V':
3866
        case 'C':
3867
        case 'U':
3868
        case 'k':
3869
        case 'K':
3870
        case 'p':
3871
        case 'q':
3872
          {
3873
            gas_assert (ep != NULL);
3874
 
3875
            if (ep->X_op != O_constant)
3876
              *r = (int) BFD_RELOC_UNUSED + c;
3877
            else
3878
              {
3879
                mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3880
                              FALSE, &insn.insn_opcode, &insn.use_extend,
3881
                              &insn.extend);
3882
                ep = NULL;
3883
                *r = BFD_RELOC_UNUSED;
3884
              }
3885
          }
3886
          continue;
3887
 
3888
        case '6':
3889
          MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (args, int));
3890
          continue;
3891
        }
3892
 
3893
      break;
3894
    }
3895
 
3896
  gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3897
 
3898
  append_insn (&insn, ep, r);
3899
}
3900
 
3901
/*
3902
 * Sign-extend 32-bit mode constants that have bit 31 set and all
3903
 * higher bits unset.
3904
 */
3905
static void
3906
normalize_constant_expr (expressionS *ex)
3907
{
3908
  if (ex->X_op == O_constant
3909
      && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3910
    ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3911
                        - 0x80000000);
3912
}
3913
 
3914
/*
3915
 * Sign-extend 32-bit mode address offsets that have bit 31 set and
3916
 * all higher bits unset.
3917
 */
3918
static void
3919
normalize_address_expr (expressionS *ex)
3920
{
3921
  if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
3922
        || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
3923
      && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3924
    ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3925
                        - 0x80000000);
3926
}
3927
 
3928
/*
3929
 * Generate a "jalr" instruction with a relocation hint to the called
3930
 * function.  This occurs in NewABI PIC code.
3931
 */
3932
static void
3933
macro_build_jalr (expressionS *ep)
3934
{
3935
  char *f = NULL;
3936
 
3937
  if (MIPS_JALR_HINT_P (ep))
3938
    {
3939
      frag_grow (8);
3940
      f = frag_more (0);
3941
    }
3942
  macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
3943
  if (MIPS_JALR_HINT_P (ep))
3944
    fix_new_exp (frag_now, f - frag_now->fr_literal,
3945
                 4, ep, FALSE, BFD_RELOC_MIPS_JALR);
3946
}
3947
 
3948
/*
3949
 * Generate a "lui" instruction.
3950
 */
3951
static void
3952
macro_build_lui (expressionS *ep, int regnum)
3953
{
3954
  expressionS high_expr;
3955
  const struct mips_opcode *mo;
3956
  struct mips_cl_insn insn;
3957
  bfd_reloc_code_real_type r[3]
3958
    = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3959
  const char *name = "lui";
3960
  const char *fmt = "t,u";
3961
 
3962
  gas_assert (! mips_opts.mips16);
3963
 
3964
  high_expr = *ep;
3965
 
3966
  if (high_expr.X_op == O_constant)
3967
    {
3968
      /* We can compute the instruction now without a relocation entry.  */
3969
      high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
3970
                                >> 16) & 0xffff;
3971
      *r = BFD_RELOC_UNUSED;
3972
    }
3973
  else
3974
    {
3975
      gas_assert (ep->X_op == O_symbol);
3976
      /* _gp_disp is a special case, used from s_cpload.
3977
         __gnu_local_gp is used if mips_no_shared.  */
3978
      gas_assert (mips_pic == NO_PIC
3979
              || (! HAVE_NEWABI
3980
                  && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
3981
              || (! mips_in_shared
3982
                  && strcmp (S_GET_NAME (ep->X_add_symbol),
3983
                             "__gnu_local_gp") == 0));
3984
      *r = BFD_RELOC_HI16_S;
3985
    }
3986
 
3987
  mo = hash_find (op_hash, name);
3988
  gas_assert (strcmp (name, mo->name) == 0);
3989
  gas_assert (strcmp (fmt, mo->args) == 0);
3990
  create_insn (&insn, mo);
3991
 
3992
  insn.insn_opcode = insn.insn_mo->match;
3993
  INSERT_OPERAND (RT, insn, regnum);
3994
  if (*r == BFD_RELOC_UNUSED)
3995
    {
3996
      insn.insn_opcode |= high_expr.X_add_number;
3997
      append_insn (&insn, NULL, r);
3998
    }
3999
  else
4000
    append_insn (&insn, &high_expr, r);
4001
}
4002
 
4003
/* Generate a sequence of instructions to do a load or store from a constant
4004
   offset off of a base register (breg) into/from a target register (treg),
4005
   using AT if necessary.  */
4006
static void
4007
macro_build_ldst_constoffset (expressionS *ep, const char *op,
4008
                              int treg, int breg, int dbl)
4009
{
4010
  gas_assert (ep->X_op == O_constant);
4011
 
4012
  /* Sign-extending 32-bit constants makes their handling easier.  */
4013
  if (!dbl)
4014
    normalize_constant_expr (ep);
4015
 
4016
  /* Right now, this routine can only handle signed 32-bit constants.  */
4017
  if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
4018
    as_warn (_("operand overflow"));
4019
 
4020
  if (IS_SEXT_16BIT_NUM(ep->X_add_number))
4021
    {
4022
      /* Signed 16-bit offset will fit in the op.  Easy!  */
4023
      macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
4024
    }
4025
  else
4026
    {
4027
      /* 32-bit offset, need multiple instructions and AT, like:
4028
           lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
4029
           addu     $tempreg,$tempreg,$breg
4030
           <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
4031
         to handle the complete offset.  */
4032
      macro_build_lui (ep, AT);
4033
      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
4034
      macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
4035
 
4036
      if (!mips_opts.at)
4037
        as_bad (_("Macro used $at after \".set noat\""));
4038
    }
4039
}
4040
 
4041
/*                      set_at()
4042
 * Generates code to set the $at register to true (one)
4043
 * if reg is less than the immediate expression.
4044
 */
4045
static void
4046
set_at (int reg, int unsignedp)
4047
{
4048
  if (imm_expr.X_op == O_constant
4049
      && imm_expr.X_add_number >= -0x8000
4050
      && imm_expr.X_add_number < 0x8000)
4051
    macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
4052
                 AT, reg, BFD_RELOC_LO16);
4053
  else
4054
    {
4055
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4056
      macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
4057
    }
4058
}
4059
 
4060
/* Warn if an expression is not a constant.  */
4061
 
4062
static void
4063
check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
4064
{
4065
  if (ex->X_op == O_big)
4066
    as_bad (_("unsupported large constant"));
4067
  else if (ex->X_op != O_constant)
4068
    as_bad (_("Instruction %s requires absolute expression"),
4069
            ip->insn_mo->name);
4070
 
4071
  if (HAVE_32BIT_GPRS)
4072
    normalize_constant_expr (ex);
4073
}
4074
 
4075
/* Count the leading zeroes by performing a binary chop. This is a
4076
   bulky bit of source, but performance is a LOT better for the
4077
   majority of values than a simple loop to count the bits:
4078
       for (lcnt = 0; (lcnt < 32); lcnt++)
4079
         if ((v) & (1 << (31 - lcnt)))
4080
           break;
4081
  However it is not code size friendly, and the gain will drop a bit
4082
  on certain cached systems.
4083
*/
4084
#define COUNT_TOP_ZEROES(v)             \
4085
  (((v) & ~0xffff) == 0                 \
4086
   ? ((v) & ~0xff) == 0                 \
4087
     ? ((v) & ~0xf) == 0                \
4088
       ? ((v) & ~0x3) == 0              \
4089
         ? ((v) & ~0x1) == 0            \
4090
           ? !(v)                       \
4091
             ? 32                       \
4092
             : 31                       \
4093
           : 30                         \
4094
         : ((v) & ~0x7) == 0            \
4095
           ? 29                         \
4096
           : 28                         \
4097
       : ((v) & ~0x3f) == 0             \
4098
         ? ((v) & ~0x1f) == 0           \
4099
           ? 27                         \
4100
           : 26                         \
4101
         : ((v) & ~0x7f) == 0           \
4102
           ? 25                         \
4103
           : 24                         \
4104
     : ((v) & ~0xfff) == 0              \
4105
       ? ((v) & ~0x3ff) == 0            \
4106
         ? ((v) & ~0x1ff) == 0          \
4107
           ? 23                         \
4108
           : 22                         \
4109
         : ((v) & ~0x7ff) == 0          \
4110
           ? 21                         \
4111
           : 20                         \
4112
       : ((v) & ~0x3fff) == 0           \
4113
         ? ((v) & ~0x1fff) == 0         \
4114
           ? 19                         \
4115
           : 18                         \
4116
         : ((v) & ~0x7fff) == 0         \
4117
           ? 17                         \
4118
           : 16                         \
4119
   : ((v) & ~0xffffff) == 0             \
4120
     ? ((v) & ~0xfffff) == 0            \
4121
       ? ((v) & ~0x3ffff) == 0          \
4122
         ? ((v) & ~0x1ffff) == 0        \
4123
           ? 15                         \
4124
           : 14                         \
4125
         : ((v) & ~0x7ffff) == 0        \
4126
           ? 13                         \
4127
           : 12                         \
4128
       : ((v) & ~0x3fffff) == 0         \
4129
         ? ((v) & ~0x1fffff) == 0       \
4130
           ? 11                         \
4131
           : 10                         \
4132
         : ((v) & ~0x7fffff) == 0       \
4133
           ? 9                          \
4134
           : 8                          \
4135
     : ((v) & ~0xfffffff) == 0          \
4136
       ? ((v) & ~0x3ffffff) == 0        \
4137
         ? ((v) & ~0x1ffffff) == 0      \
4138
           ? 7                          \
4139
           : 6                          \
4140
         : ((v) & ~0x7ffffff) == 0      \
4141
           ? 5                          \
4142
           : 4                          \
4143
       : ((v) & ~0x3fffffff) == 0       \
4144
         ? ((v) & ~0x1fffffff) == 0     \
4145
           ? 3                          \
4146
           : 2                          \
4147
         : ((v) & ~0x7fffffff) == 0     \
4148
           ? 1                          \
4149
           : 0)
4150
 
4151
/*                      load_register()
4152
 *  This routine generates the least number of instructions necessary to load
4153
 *  an absolute expression value into a register.
4154
 */
4155
static void
4156
load_register (int reg, expressionS *ep, int dbl)
4157
{
4158
  int freg;
4159
  expressionS hi32, lo32;
4160
 
4161
  if (ep->X_op != O_big)
4162
    {
4163
      gas_assert (ep->X_op == O_constant);
4164
 
4165
      /* Sign-extending 32-bit constants makes their handling easier.  */
4166
      if (!dbl)
4167
        normalize_constant_expr (ep);
4168
 
4169
      if (IS_SEXT_16BIT_NUM (ep->X_add_number))
4170
        {
4171
          /* We can handle 16 bit signed values with an addiu to
4172
             $zero.  No need to ever use daddiu here, since $zero and
4173
             the result are always correct in 32 bit mode.  */
4174
          macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4175
          return;
4176
        }
4177
      else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
4178
        {
4179
          /* We can handle 16 bit unsigned values with an ori to
4180
             $zero.  */
4181
          macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4182
          return;
4183
        }
4184
      else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
4185
        {
4186
          /* 32 bit values require an lui.  */
4187
          macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
4188
          if ((ep->X_add_number & 0xffff) != 0)
4189
            macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4190
          return;
4191
        }
4192
    }
4193
 
4194
  /* The value is larger than 32 bits.  */
4195
 
4196
  if (!dbl || HAVE_32BIT_GPRS)
4197
    {
4198
      char value[32];
4199
 
4200
      sprintf_vma (value, ep->X_add_number);
4201
      as_bad (_("Number (0x%s) larger than 32 bits"), value);
4202
      macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4203
      return;
4204
    }
4205
 
4206
  if (ep->X_op != O_big)
4207
    {
4208
      hi32 = *ep;
4209
      hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4210
      hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4211
      hi32.X_add_number &= 0xffffffff;
4212
      lo32 = *ep;
4213
      lo32.X_add_number &= 0xffffffff;
4214
    }
4215
  else
4216
    {
4217
      gas_assert (ep->X_add_number > 2);
4218
      if (ep->X_add_number == 3)
4219
        generic_bignum[3] = 0;
4220
      else if (ep->X_add_number > 4)
4221
        as_bad (_("Number larger than 64 bits"));
4222
      lo32.X_op = O_constant;
4223
      lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
4224
      hi32.X_op = O_constant;
4225
      hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
4226
    }
4227
 
4228
  if (hi32.X_add_number == 0)
4229
    freg = 0;
4230
  else
4231
    {
4232
      int shift, bit;
4233
      unsigned long hi, lo;
4234
 
4235
      if (hi32.X_add_number == (offsetT) 0xffffffff)
4236
        {
4237
          if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
4238
            {
4239
              macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4240
              return;
4241
            }
4242
          if (lo32.X_add_number & 0x80000000)
4243
            {
4244
              macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4245
              if (lo32.X_add_number & 0xffff)
4246
                macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4247
              return;
4248
            }
4249
        }
4250
 
4251
      /* Check for 16bit shifted constant.  We know that hi32 is
4252
         non-zero, so start the mask on the first bit of the hi32
4253
         value.  */
4254
      shift = 17;
4255
      do
4256
        {
4257
          unsigned long himask, lomask;
4258
 
4259
          if (shift < 32)
4260
            {
4261
              himask = 0xffff >> (32 - shift);
4262
              lomask = (0xffff << shift) & 0xffffffff;
4263
            }
4264
          else
4265
            {
4266
              himask = 0xffff << (shift - 32);
4267
              lomask = 0;
4268
            }
4269
          if ((hi32.X_add_number & ~(offsetT) himask) == 0
4270
              && (lo32.X_add_number & ~(offsetT) lomask) == 0)
4271
            {
4272
              expressionS tmp;
4273
 
4274
              tmp.X_op = O_constant;
4275
              if (shift < 32)
4276
                tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
4277
                                    | (lo32.X_add_number >> shift));
4278
              else
4279
                tmp.X_add_number = hi32.X_add_number >> (shift - 32);
4280
              macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4281
              macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
4282
                           reg, reg, (shift >= 32) ? shift - 32 : shift);
4283
              return;
4284
            }
4285
          ++shift;
4286
        }
4287
      while (shift <= (64 - 16));
4288
 
4289
      /* Find the bit number of the lowest one bit, and store the
4290
         shifted value in hi/lo.  */
4291
      hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
4292
      lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
4293
      if (lo != 0)
4294
        {
4295
          bit = 0;
4296
          while ((lo & 1) == 0)
4297
            {
4298
              lo >>= 1;
4299
              ++bit;
4300
            }
4301
          lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
4302
          hi >>= bit;
4303
        }
4304
      else
4305
        {
4306
          bit = 32;
4307
          while ((hi & 1) == 0)
4308
            {
4309
              hi >>= 1;
4310
              ++bit;
4311
            }
4312
          lo = hi;
4313
          hi = 0;
4314
        }
4315
 
4316
      /* Optimize if the shifted value is a (power of 2) - 1.  */
4317
      if ((hi == 0 && ((lo + 1) & lo) == 0)
4318
          || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
4319
        {
4320
          shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
4321
          if (shift != 0)
4322
            {
4323
              expressionS tmp;
4324
 
4325
              /* This instruction will set the register to be all
4326
                 ones.  */
4327
              tmp.X_op = O_constant;
4328
              tmp.X_add_number = (offsetT) -1;
4329
              macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4330
              if (bit != 0)
4331
                {
4332
                  bit += shift;
4333
                  macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
4334
                               reg, reg, (bit >= 32) ? bit - 32 : bit);
4335
                }
4336
              macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
4337
                           reg, reg, (shift >= 32) ? shift - 32 : shift);
4338
              return;
4339
            }
4340
        }
4341
 
4342
      /* Sign extend hi32 before calling load_register, because we can
4343
         generally get better code when we load a sign extended value.  */
4344
      if ((hi32.X_add_number & 0x80000000) != 0)
4345
        hi32.X_add_number |= ~(offsetT) 0xffffffff;
4346
      load_register (reg, &hi32, 0);
4347
      freg = reg;
4348
    }
4349
  if ((lo32.X_add_number & 0xffff0000) == 0)
4350
    {
4351
      if (freg != 0)
4352
        {
4353
          macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
4354
          freg = reg;
4355
        }
4356
    }
4357
  else
4358
    {
4359
      expressionS mid16;
4360
 
4361
      if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
4362
        {
4363
          macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4364
          macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
4365
          return;
4366
        }
4367
 
4368
      if (freg != 0)
4369
        {
4370
          macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
4371
          freg = reg;
4372
        }
4373
      mid16 = lo32;
4374
      mid16.X_add_number >>= 16;
4375
      macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4376
      macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4377
      freg = reg;
4378
    }
4379
  if ((lo32.X_add_number & 0xffff) != 0)
4380
    macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4381
}
4382
 
4383
static inline void
4384
load_delay_nop (void)
4385
{
4386
  if (!gpr_interlocks)
4387
    macro_build (NULL, "nop", "");
4388
}
4389
 
4390
/* Load an address into a register.  */
4391
 
4392
static void
4393
load_address (int reg, expressionS *ep, int *used_at)
4394
{
4395
  if (ep->X_op != O_constant
4396
      && ep->X_op != O_symbol)
4397
    {
4398
      as_bad (_("expression too complex"));
4399
      ep->X_op = O_constant;
4400
    }
4401
 
4402
  if (ep->X_op == O_constant)
4403
    {
4404
      load_register (reg, ep, HAVE_64BIT_ADDRESSES);
4405
      return;
4406
    }
4407
 
4408
  if (mips_pic == NO_PIC)
4409
    {
4410
      /* If this is a reference to a GP relative symbol, we want
4411
           addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
4412
         Otherwise we want
4413
           lui          $reg,<sym>              (BFD_RELOC_HI16_S)
4414
           addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4415
         If we have an addend, we always use the latter form.
4416
 
4417
         With 64bit address space and a usable $at we want
4418
           lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4419
           lui          $at,<sym>               (BFD_RELOC_HI16_S)
4420
           daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4421
           daddiu       $at,<sym>               (BFD_RELOC_LO16)
4422
           dsll32       $reg,0
4423
           daddu        $reg,$reg,$at
4424
 
4425
         If $at is already in use, we use a path which is suboptimal
4426
         on superscalar processors.
4427
           lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4428
           daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4429
           dsll         $reg,16
4430
           daddiu       $reg,<sym>              (BFD_RELOC_HI16_S)
4431
           dsll         $reg,16
4432
           daddiu       $reg,<sym>              (BFD_RELOC_LO16)
4433
 
4434
         For GP relative symbols in 64bit address space we can use
4435
         the same sequence as in 32bit address space.  */
4436
      if (HAVE_64BIT_SYMBOLS)
4437
        {
4438
          if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4439
              && !nopic_need_relax (ep->X_add_symbol, 1))
4440
            {
4441
              relax_start (ep->X_add_symbol);
4442
              macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4443
                           mips_gp_register, BFD_RELOC_GPREL16);
4444
              relax_switch ();
4445
            }
4446
 
4447
          if (*used_at == 0 && mips_opts.at)
4448
            {
4449
              macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4450
              macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
4451
              macro_build (ep, "daddiu", "t,r,j", reg, reg,
4452
                           BFD_RELOC_MIPS_HIGHER);
4453
              macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
4454
              macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
4455
              macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
4456
              *used_at = 1;
4457
            }
4458
          else
4459
            {
4460
              macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4461
              macro_build (ep, "daddiu", "t,r,j", reg, reg,
4462
                           BFD_RELOC_MIPS_HIGHER);
4463
              macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4464
              macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
4465
              macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4466
              macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
4467
            }
4468
 
4469
          if (mips_relax.sequence)
4470
            relax_end ();
4471
        }
4472
      else
4473
        {
4474
          if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4475
              && !nopic_need_relax (ep->X_add_symbol, 1))
4476
            {
4477
              relax_start (ep->X_add_symbol);
4478
              macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4479
                           mips_gp_register, BFD_RELOC_GPREL16);
4480
              relax_switch ();
4481
            }
4482
          macro_build_lui (ep, reg);
4483
          macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
4484
                       reg, reg, BFD_RELOC_LO16);
4485
          if (mips_relax.sequence)
4486
            relax_end ();
4487
        }
4488
    }
4489
  else if (!mips_big_got)
4490
    {
4491
      expressionS ex;
4492
 
4493
      /* If this is a reference to an external symbol, we want
4494
           lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4495
         Otherwise we want
4496
           lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4497
           nop
4498
           addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4499
         If there is a constant, it must be added in after.
4500
 
4501
         If we have NewABI, we want
4502
           lw           $reg,<sym+cst>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
4503
         unless we're referencing a global symbol with a non-zero
4504
         offset, in which case cst must be added separately.  */
4505
      if (HAVE_NEWABI)
4506
        {
4507
          if (ep->X_add_number)
4508
            {
4509
              ex.X_add_number = ep->X_add_number;
4510
              ep->X_add_number = 0;
4511
              relax_start (ep->X_add_symbol);
4512
              macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4513
                           BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4514
              if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4515
                as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4516
              ex.X_op = O_constant;
4517
              macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4518
                           reg, reg, BFD_RELOC_LO16);
4519
              ep->X_add_number = ex.X_add_number;
4520
              relax_switch ();
4521
            }
4522
          macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4523
                       BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4524
          if (mips_relax.sequence)
4525
            relax_end ();
4526
        }
4527
      else
4528
        {
4529
          ex.X_add_number = ep->X_add_number;
4530
          ep->X_add_number = 0;
4531
          macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4532
                       BFD_RELOC_MIPS_GOT16, mips_gp_register);
4533
          load_delay_nop ();
4534
          relax_start (ep->X_add_symbol);
4535
          relax_switch ();
4536
          macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4537
                       BFD_RELOC_LO16);
4538
          relax_end ();
4539
 
4540
          if (ex.X_add_number != 0)
4541
            {
4542
              if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4543
                as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4544
              ex.X_op = O_constant;
4545
              macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4546
                           reg, reg, BFD_RELOC_LO16);
4547
            }
4548
        }
4549
    }
4550
  else if (mips_big_got)
4551
    {
4552
      expressionS ex;
4553
 
4554
      /* This is the large GOT case.  If this is a reference to an
4555
         external symbol, we want
4556
           lui          $reg,<sym>              (BFD_RELOC_MIPS_GOT_HI16)
4557
           addu         $reg,$reg,$gp
4558
           lw           $reg,<sym>($reg)        (BFD_RELOC_MIPS_GOT_LO16)
4559
 
4560
         Otherwise, for a reference to a local symbol in old ABI, we want
4561
           lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4562
           nop
4563
           addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4564
         If there is a constant, it must be added in after.
4565
 
4566
         In the NewABI, for local symbols, with or without offsets, we want:
4567
           lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
4568
           addiu        $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
4569
      */
4570
      if (HAVE_NEWABI)
4571
        {
4572
          ex.X_add_number = ep->X_add_number;
4573
          ep->X_add_number = 0;
4574
          relax_start (ep->X_add_symbol);
4575
          macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4576
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4577
                       reg, reg, mips_gp_register);
4578
          macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4579
                       reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4580
          if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4581
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4582
          else if (ex.X_add_number)
4583
            {
4584
              ex.X_op = O_constant;
4585
              macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4586
                           BFD_RELOC_LO16);
4587
            }
4588
 
4589
          ep->X_add_number = ex.X_add_number;
4590
          relax_switch ();
4591
          macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4592
                       BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
4593
          macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4594
                       BFD_RELOC_MIPS_GOT_OFST);
4595
          relax_end ();
4596
        }
4597
      else
4598
        {
4599
          ex.X_add_number = ep->X_add_number;
4600
          ep->X_add_number = 0;
4601
          relax_start (ep->X_add_symbol);
4602
          macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4603
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4604
                       reg, reg, mips_gp_register);
4605
          macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4606
                       reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4607
          relax_switch ();
4608
          if (reg_needs_delay (mips_gp_register))
4609
            {
4610
              /* We need a nop before loading from $gp.  This special
4611
                 check is required because the lui which starts the main
4612
                 instruction stream does not refer to $gp, and so will not
4613
                 insert the nop which may be required.  */
4614
              macro_build (NULL, "nop", "");
4615
            }
4616
          macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4617
                       BFD_RELOC_MIPS_GOT16, mips_gp_register);
4618
          load_delay_nop ();
4619
          macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4620
                       BFD_RELOC_LO16);
4621
          relax_end ();
4622
 
4623
          if (ex.X_add_number != 0)
4624
            {
4625
              if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4626
                as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4627
              ex.X_op = O_constant;
4628
              macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4629
                           BFD_RELOC_LO16);
4630
            }
4631
        }
4632
    }
4633
  else
4634
    abort ();
4635
 
4636
  if (!mips_opts.at && *used_at == 1)
4637
    as_bad (_("Macro used $at after \".set noat\""));
4638
}
4639
 
4640
/* Move the contents of register SOURCE into register DEST.  */
4641
 
4642
static void
4643
move_register (int dest, int source)
4644
{
4645
  macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4646
               dest, source, 0);
4647
}
4648
 
4649
/* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
4650
   LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
4651
   The two alternatives are:
4652
 
4653
   Global symbol                Local sybmol
4654
   -------------                ------------
4655
   lw DEST,%got(SYMBOL)         lw DEST,%got(SYMBOL + OFFSET)
4656
   ...                          ...
4657
   addiu DEST,DEST,OFFSET       addiu DEST,DEST,%lo(SYMBOL + OFFSET)
4658
 
4659
   load_got_offset emits the first instruction and add_got_offset
4660
   emits the second for a 16-bit offset or add_got_offset_hilo emits
4661
   a sequence to add a 32-bit offset using a scratch register.  */
4662
 
4663
static void
4664
load_got_offset (int dest, expressionS *local)
4665
{
4666
  expressionS global;
4667
 
4668
  global = *local;
4669
  global.X_add_number = 0;
4670
 
4671
  relax_start (local->X_add_symbol);
4672
  macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4673
               BFD_RELOC_MIPS_GOT16, mips_gp_register);
4674
  relax_switch ();
4675
  macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4676
               BFD_RELOC_MIPS_GOT16, mips_gp_register);
4677
  relax_end ();
4678
}
4679
 
4680
static void
4681
add_got_offset (int dest, expressionS *local)
4682
{
4683
  expressionS global;
4684
 
4685
  global.X_op = O_constant;
4686
  global.X_op_symbol = NULL;
4687
  global.X_add_symbol = NULL;
4688
  global.X_add_number = local->X_add_number;
4689
 
4690
  relax_start (local->X_add_symbol);
4691
  macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
4692
               dest, dest, BFD_RELOC_LO16);
4693
  relax_switch ();
4694
  macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
4695
  relax_end ();
4696
}
4697
 
4698
static void
4699
add_got_offset_hilo (int dest, expressionS *local, int tmp)
4700
{
4701
  expressionS global;
4702
  int hold_mips_optimize;
4703
 
4704
  global.X_op = O_constant;
4705
  global.X_op_symbol = NULL;
4706
  global.X_add_symbol = NULL;
4707
  global.X_add_number = local->X_add_number;
4708
 
4709
  relax_start (local->X_add_symbol);
4710
  load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
4711
  relax_switch ();
4712
  /* Set mips_optimize around the lui instruction to avoid
4713
     inserting an unnecessary nop after the lw.  */
4714
  hold_mips_optimize = mips_optimize;
4715
  mips_optimize = 2;
4716
  macro_build_lui (&global, tmp);
4717
  mips_optimize = hold_mips_optimize;
4718
  macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
4719
  relax_end ();
4720
 
4721
  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
4722
}
4723
 
4724
/*
4725
 *                      Build macros
4726
 *   This routine implements the seemingly endless macro or synthesized
4727
 * instructions and addressing modes in the mips assembly language. Many
4728
 * of these macros are simple and are similar to each other. These could
4729
 * probably be handled by some kind of table or grammar approach instead of
4730
 * this verbose method. Others are not simple macros but are more like
4731
 * optimizing code generation.
4732
 *   One interesting optimization is when several store macros appear
4733
 * consecutively that would load AT with the upper half of the same address.
4734
 * The ensuing load upper instructions are ommited. This implies some kind
4735
 * of global optimization. We currently only optimize within a single macro.
4736
 *   For many of the load and store macros if the address is specified as a
4737
 * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4738
 * first load register 'at' with zero and use it as the base register. The
4739
 * mips assembler simply uses register $zero. Just one tiny optimization
4740
 * we're missing.
4741
 */
4742
static void
4743
macro (struct mips_cl_insn *ip)
4744
{
4745
  unsigned int treg, sreg, dreg, breg;
4746
  unsigned int tempreg;
4747
  int mask;
4748
  int used_at = 0;
4749
  expressionS expr1;
4750
  const char *s;
4751
  const char *s2;
4752
  const char *fmt;
4753
  int likely = 0;
4754
  int dbl = 0;
4755
  int coproc = 0;
4756
  int lr = 0;
4757
  int imm = 0;
4758
  int call = 0;
4759
  int off;
4760
  offsetT maxnum;
4761
  bfd_reloc_code_real_type r;
4762
  int hold_mips_optimize;
4763
 
4764
  gas_assert (! mips_opts.mips16);
4765
 
4766
  treg = (ip->insn_opcode >> 16) & 0x1f;
4767
  dreg = (ip->insn_opcode >> 11) & 0x1f;
4768
  sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
4769
  mask = ip->insn_mo->mask;
4770
 
4771
  expr1.X_op = O_constant;
4772
  expr1.X_op_symbol = NULL;
4773
  expr1.X_add_symbol = NULL;
4774
  expr1.X_add_number = 1;
4775
 
4776
  switch (mask)
4777
    {
4778
    case M_DABS:
4779
      dbl = 1;
4780
    case M_ABS:
4781
      /* bgez $a0,.+12
4782
         move v0,$a0
4783
         sub v0,$zero,$a0
4784
         */
4785
 
4786
      start_noreorder ();
4787
 
4788
      expr1.X_add_number = 8;
4789
      macro_build (&expr1, "bgez", "s,p", sreg);
4790
      if (dreg == sreg)
4791
        macro_build (NULL, "nop", "", 0);
4792
      else
4793
        move_register (dreg, sreg);
4794
      macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
4795
 
4796
      end_noreorder ();
4797
      break;
4798
 
4799
    case M_ADD_I:
4800
      s = "addi";
4801
      s2 = "add";
4802
      goto do_addi;
4803
    case M_ADDU_I:
4804
      s = "addiu";
4805
      s2 = "addu";
4806
      goto do_addi;
4807
    case M_DADD_I:
4808
      dbl = 1;
4809
      s = "daddi";
4810
      s2 = "dadd";
4811
      goto do_addi;
4812
    case M_DADDU_I:
4813
      dbl = 1;
4814
      s = "daddiu";
4815
      s2 = "daddu";
4816
    do_addi:
4817
      if (imm_expr.X_op == O_constant
4818
          && imm_expr.X_add_number >= -0x8000
4819
          && imm_expr.X_add_number < 0x8000)
4820
        {
4821
          macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
4822
          break;
4823
        }
4824
      used_at = 1;
4825
      load_register (AT, &imm_expr, dbl);
4826
      macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4827
      break;
4828
 
4829
    case M_AND_I:
4830
      s = "andi";
4831
      s2 = "and";
4832
      goto do_bit;
4833
    case M_OR_I:
4834
      s = "ori";
4835
      s2 = "or";
4836
      goto do_bit;
4837
    case M_NOR_I:
4838
      s = "";
4839
      s2 = "nor";
4840
      goto do_bit;
4841
    case M_XOR_I:
4842
      s = "xori";
4843
      s2 = "xor";
4844
    do_bit:
4845
      if (imm_expr.X_op == O_constant
4846
          && imm_expr.X_add_number >= 0
4847
          && imm_expr.X_add_number < 0x10000)
4848
        {
4849
          if (mask != M_NOR_I)
4850
            macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
4851
          else
4852
            {
4853
              macro_build (&imm_expr, "ori", "t,r,i",
4854
                           treg, sreg, BFD_RELOC_LO16);
4855
              macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
4856
            }
4857
          break;
4858
        }
4859
 
4860
      used_at = 1;
4861
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4862
      macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4863
      break;
4864
 
4865
    case M_BALIGN:
4866
      switch (imm_expr.X_add_number)
4867
        {
4868
        case 0:
4869
          macro_build (NULL, "nop", "");
4870
          break;
4871
        case 2:
4872
          macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
4873
          break;
4874
        default:
4875
          macro_build (NULL, "balign", "t,s,2", treg, sreg,
4876
                       (int)imm_expr.X_add_number);
4877
          break;
4878
        }
4879
      break;
4880
 
4881
    case M_BEQ_I:
4882
      s = "beq";
4883
      goto beq_i;
4884
    case M_BEQL_I:
4885
      s = "beql";
4886
      likely = 1;
4887
      goto beq_i;
4888
    case M_BNE_I:
4889
      s = "bne";
4890
      goto beq_i;
4891
    case M_BNEL_I:
4892
      s = "bnel";
4893
      likely = 1;
4894
    beq_i:
4895
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4896
        {
4897
          macro_build (&offset_expr, s, "s,t,p", sreg, 0);
4898
          break;
4899
        }
4900
      used_at = 1;
4901
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4902
      macro_build (&offset_expr, s, "s,t,p", sreg, AT);
4903
      break;
4904
 
4905
    case M_BGEL:
4906
      likely = 1;
4907
    case M_BGE:
4908
      if (treg == 0)
4909
        {
4910
          macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4911
          break;
4912
        }
4913
      if (sreg == 0)
4914
        {
4915
          macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
4916
          break;
4917
        }
4918
      used_at = 1;
4919
      macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4920
      macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4921
      break;
4922
 
4923
    case M_BGTL_I:
4924
      likely = 1;
4925
    case M_BGT_I:
4926
      /* check for > max integer */
4927
      maxnum = 0x7fffffff;
4928
      if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4929
        {
4930
          maxnum <<= 16;
4931
          maxnum |= 0xffff;
4932
          maxnum <<= 16;
4933
          maxnum |= 0xffff;
4934
        }
4935
      if (imm_expr.X_op == O_constant
4936
          && imm_expr.X_add_number >= maxnum
4937
          && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4938
        {
4939
        do_false:
4940
          /* result is always false */
4941
          if (! likely)
4942
            macro_build (NULL, "nop", "", 0);
4943
          else
4944
            macro_build (&offset_expr, "bnel", "s,t,p", 0, 0);
4945
          break;
4946
        }
4947
      if (imm_expr.X_op != O_constant)
4948
        as_bad (_("Unsupported large constant"));
4949
      ++imm_expr.X_add_number;
4950
      /* FALLTHROUGH */
4951
    case M_BGE_I:
4952
    case M_BGEL_I:
4953
      if (mask == M_BGEL_I)
4954
        likely = 1;
4955
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4956
        {
4957
          macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4958
          break;
4959
        }
4960
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4961
        {
4962
          macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4963
          break;
4964
        }
4965
      maxnum = 0x7fffffff;
4966
      if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4967
        {
4968
          maxnum <<= 16;
4969
          maxnum |= 0xffff;
4970
          maxnum <<= 16;
4971
          maxnum |= 0xffff;
4972
        }
4973
      maxnum = - maxnum - 1;
4974
      if (imm_expr.X_op == O_constant
4975
          && imm_expr.X_add_number <= maxnum
4976
          && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4977
        {
4978
        do_true:
4979
          /* result is always true */
4980
          as_warn (_("Branch %s is always true"), ip->insn_mo->name);
4981
          macro_build (&offset_expr, "b", "p");
4982
          break;
4983
        }
4984
      used_at = 1;
4985
      set_at (sreg, 0);
4986
      macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4987
      break;
4988
 
4989
    case M_BGEUL:
4990
      likely = 1;
4991
    case M_BGEU:
4992
      if (treg == 0)
4993
        goto do_true;
4994
      if (sreg == 0)
4995
        {
4996
          macro_build (&offset_expr, likely ? "beql" : "beq",
4997
                       "s,t,p", 0, treg);
4998
          break;
4999
        }
5000
      used_at = 1;
5001
      macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
5002
      macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
5003
      break;
5004
 
5005
    case M_BGTUL_I:
5006
      likely = 1;
5007
    case M_BGTU_I:
5008
      if (sreg == 0
5009
          || (HAVE_32BIT_GPRS
5010
              && imm_expr.X_op == O_constant
5011
              && imm_expr.X_add_number == (offsetT) 0xffffffff))
5012
        goto do_false;
5013
      if (imm_expr.X_op != O_constant)
5014
        as_bad (_("Unsupported large constant"));
5015
      ++imm_expr.X_add_number;
5016
      /* FALLTHROUGH */
5017
    case M_BGEU_I:
5018
    case M_BGEUL_I:
5019
      if (mask == M_BGEUL_I)
5020
        likely = 1;
5021
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5022
        goto do_true;
5023
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5024
        {
5025
          macro_build (&offset_expr, likely ? "bnel" : "bne",
5026
                       "s,t,p", sreg, 0);
5027
          break;
5028
        }
5029
      used_at = 1;
5030
      set_at (sreg, 1);
5031
      macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
5032
      break;
5033
 
5034
    case M_BGTL:
5035
      likely = 1;
5036
    case M_BGT:
5037
      if (treg == 0)
5038
        {
5039
          macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
5040
          break;
5041
        }
5042
      if (sreg == 0)
5043
        {
5044
          macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
5045
          break;
5046
        }
5047
      used_at = 1;
5048
      macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
5049
      macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5050
      break;
5051
 
5052
    case M_BGTUL:
5053
      likely = 1;
5054
    case M_BGTU:
5055
      if (treg == 0)
5056
        {
5057
          macro_build (&offset_expr, likely ? "bnel" : "bne",
5058
                       "s,t,p", sreg, 0);
5059
          break;
5060
        }
5061
      if (sreg == 0)
5062
        goto do_false;
5063
      used_at = 1;
5064
      macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
5065
      macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5066
      break;
5067
 
5068
    case M_BLEL:
5069
      likely = 1;
5070
    case M_BLE:
5071
      if (treg == 0)
5072
        {
5073
          macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
5074
          break;
5075
        }
5076
      if (sreg == 0)
5077
        {
5078
          macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
5079
          break;
5080
        }
5081
      used_at = 1;
5082
      macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
5083
      macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
5084
      break;
5085
 
5086
    case M_BLEL_I:
5087
      likely = 1;
5088
    case M_BLE_I:
5089
      maxnum = 0x7fffffff;
5090
      if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
5091
        {
5092
          maxnum <<= 16;
5093
          maxnum |= 0xffff;
5094
          maxnum <<= 16;
5095
          maxnum |= 0xffff;
5096
        }
5097
      if (imm_expr.X_op == O_constant
5098
          && imm_expr.X_add_number >= maxnum
5099
          && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5100
        goto do_true;
5101
      if (imm_expr.X_op != O_constant)
5102
        as_bad (_("Unsupported large constant"));
5103
      ++imm_expr.X_add_number;
5104
      /* FALLTHROUGH */
5105
    case M_BLT_I:
5106
    case M_BLTL_I:
5107
      if (mask == M_BLTL_I)
5108
        likely = 1;
5109
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5110
        {
5111
          macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
5112
          break;
5113
        }
5114
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5115
        {
5116
          macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
5117
          break;
5118
        }
5119
      used_at = 1;
5120
      set_at (sreg, 0);
5121
      macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5122
      break;
5123
 
5124
    case M_BLEUL:
5125
      likely = 1;
5126
    case M_BLEU:
5127
      if (treg == 0)
5128
        {
5129
          macro_build (&offset_expr, likely ? "beql" : "beq",
5130
                       "s,t,p", sreg, 0);
5131
          break;
5132
        }
5133
      if (sreg == 0)
5134
        goto do_true;
5135
      used_at = 1;
5136
      macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
5137
      macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
5138
      break;
5139
 
5140
    case M_BLEUL_I:
5141
      likely = 1;
5142
    case M_BLEU_I:
5143
      if (sreg == 0
5144
          || (HAVE_32BIT_GPRS
5145
              && imm_expr.X_op == O_constant
5146
              && imm_expr.X_add_number == (offsetT) 0xffffffff))
5147
        goto do_true;
5148
      if (imm_expr.X_op != O_constant)
5149
        as_bad (_("Unsupported large constant"));
5150
      ++imm_expr.X_add_number;
5151
      /* FALLTHROUGH */
5152
    case M_BLTU_I:
5153
    case M_BLTUL_I:
5154
      if (mask == M_BLTUL_I)
5155
        likely = 1;
5156
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5157
        goto do_false;
5158
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5159
        {
5160
          macro_build (&offset_expr, likely ? "beql" : "beq",
5161
                       "s,t,p", sreg, 0);
5162
          break;
5163
        }
5164
      used_at = 1;
5165
      set_at (sreg, 1);
5166
      macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5167
      break;
5168
 
5169
    case M_BLTL:
5170
      likely = 1;
5171
    case M_BLT:
5172
      if (treg == 0)
5173
        {
5174
          macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
5175
          break;
5176
        }
5177
      if (sreg == 0)
5178
        {
5179
          macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
5180
          break;
5181
        }
5182
      used_at = 1;
5183
      macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
5184
      macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5185
      break;
5186
 
5187
    case M_BLTUL:
5188
      likely = 1;
5189
    case M_BLTU:
5190
      if (treg == 0)
5191
        goto do_false;
5192
      if (sreg == 0)
5193
        {
5194
          macro_build (&offset_expr, likely ? "bnel" : "bne",
5195
                       "s,t,p", 0, treg);
5196
          break;
5197
        }
5198
      used_at = 1;
5199
      macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
5200
      macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5201
      break;
5202
 
5203
    case M_DEXT:
5204
      {
5205
        unsigned long pos;
5206
        unsigned long size;
5207
 
5208
        if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5209
          {
5210
            as_bad (_("Unsupported large constant"));
5211
            pos = size = 1;
5212
          }
5213
        else
5214
          {
5215
            pos = (unsigned long) imm_expr.X_add_number;
5216
            size = (unsigned long) imm2_expr.X_add_number;
5217
          }
5218
 
5219
        if (pos > 63)
5220
          {
5221
            as_bad (_("Improper position (%lu)"), pos);
5222
            pos = 1;
5223
          }
5224
        if (size == 0 || size > 64
5225
            || (pos + size - 1) > 63)
5226
          {
5227
            as_bad (_("Improper extract size (%lu, position %lu)"),
5228
                    size, pos);
5229
            size = 1;
5230
          }
5231
 
5232
        if (size <= 32 && pos < 32)
5233
          {
5234
            s = "dext";
5235
            fmt = "t,r,+A,+C";
5236
          }
5237
        else if (size <= 32)
5238
          {
5239
            s = "dextu";
5240
            fmt = "t,r,+E,+H";
5241
          }
5242
        else
5243
          {
5244
            s = "dextm";
5245
            fmt = "t,r,+A,+G";
5246
          }
5247
        macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos, size - 1);
5248
      }
5249
      break;
5250
 
5251
    case M_DINS:
5252
      {
5253
        unsigned long pos;
5254
        unsigned long size;
5255
 
5256
        if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5257
          {
5258
            as_bad (_("Unsupported large constant"));
5259
            pos = size = 1;
5260
          }
5261
        else
5262
          {
5263
            pos = (unsigned long) imm_expr.X_add_number;
5264
            size = (unsigned long) imm2_expr.X_add_number;
5265
          }
5266
 
5267
        if (pos > 63)
5268
          {
5269
            as_bad (_("Improper position (%lu)"), pos);
5270
            pos = 1;
5271
          }
5272
        if (size == 0 || size > 64
5273
            || (pos + size - 1) > 63)
5274
          {
5275
            as_bad (_("Improper insert size (%lu, position %lu)"),
5276
                    size, pos);
5277
            size = 1;
5278
          }
5279
 
5280
        if (pos < 32 && (pos + size - 1) < 32)
5281
          {
5282
            s = "dins";
5283
            fmt = "t,r,+A,+B";
5284
          }
5285
        else if (pos >= 32)
5286
          {
5287
            s = "dinsu";
5288
            fmt = "t,r,+E,+F";
5289
          }
5290
        else
5291
          {
5292
            s = "dinsm";
5293
            fmt = "t,r,+A,+F";
5294
          }
5295
        macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
5296
                     (int) (pos + size - 1));
5297
      }
5298
      break;
5299
 
5300
    case M_DDIV_3:
5301
      dbl = 1;
5302
    case M_DIV_3:
5303
      s = "mflo";
5304
      goto do_div3;
5305
    case M_DREM_3:
5306
      dbl = 1;
5307
    case M_REM_3:
5308
      s = "mfhi";
5309
    do_div3:
5310
      if (treg == 0)
5311
        {
5312
          as_warn (_("Divide by zero."));
5313
          if (mips_trap)
5314
            macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5315
          else
5316
            macro_build (NULL, "break", "c", 7);
5317
          break;
5318
        }
5319
 
5320
      start_noreorder ();
5321
      if (mips_trap)
5322
        {
5323
          macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5324
          macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5325
        }
5326
      else
5327
        {
5328
          expr1.X_add_number = 8;
5329
          macro_build (&expr1, "bne", "s,t,p", treg, 0);
5330
          macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5331
          macro_build (NULL, "break", "c", 7);
5332
        }
5333
      expr1.X_add_number = -1;
5334
      used_at = 1;
5335
      load_register (AT, &expr1, dbl);
5336
      expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
5337
      macro_build (&expr1, "bne", "s,t,p", treg, AT);
5338
      if (dbl)
5339
        {
5340
          expr1.X_add_number = 1;
5341
          load_register (AT, &expr1, dbl);
5342
          macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
5343
        }
5344
      else
5345
        {
5346
          expr1.X_add_number = 0x80000000;
5347
          macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
5348
        }
5349
      if (mips_trap)
5350
        {
5351
          macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
5352
          /* We want to close the noreorder block as soon as possible, so
5353
             that later insns are available for delay slot filling.  */
5354
          end_noreorder ();
5355
        }
5356
      else
5357
        {
5358
          expr1.X_add_number = 8;
5359
          macro_build (&expr1, "bne", "s,t,p", sreg, AT);
5360
          macro_build (NULL, "nop", "", 0);
5361
 
5362
          /* We want to close the noreorder block as soon as possible, so
5363
             that later insns are available for delay slot filling.  */
5364
          end_noreorder ();
5365
 
5366
          macro_build (NULL, "break", "c", 6);
5367
        }
5368
      macro_build (NULL, s, "d", dreg);
5369
      break;
5370
 
5371
    case M_DIV_3I:
5372
      s = "div";
5373
      s2 = "mflo";
5374
      goto do_divi;
5375
    case M_DIVU_3I:
5376
      s = "divu";
5377
      s2 = "mflo";
5378
      goto do_divi;
5379
    case M_REM_3I:
5380
      s = "div";
5381
      s2 = "mfhi";
5382
      goto do_divi;
5383
    case M_REMU_3I:
5384
      s = "divu";
5385
      s2 = "mfhi";
5386
      goto do_divi;
5387
    case M_DDIV_3I:
5388
      dbl = 1;
5389
      s = "ddiv";
5390
      s2 = "mflo";
5391
      goto do_divi;
5392
    case M_DDIVU_3I:
5393
      dbl = 1;
5394
      s = "ddivu";
5395
      s2 = "mflo";
5396
      goto do_divi;
5397
    case M_DREM_3I:
5398
      dbl = 1;
5399
      s = "ddiv";
5400
      s2 = "mfhi";
5401
      goto do_divi;
5402
    case M_DREMU_3I:
5403
      dbl = 1;
5404
      s = "ddivu";
5405
      s2 = "mfhi";
5406
    do_divi:
5407
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5408
        {
5409
          as_warn (_("Divide by zero."));
5410
          if (mips_trap)
5411
            macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5412
          else
5413
            macro_build (NULL, "break", "c", 7);
5414
          break;
5415
        }
5416
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5417
        {
5418
          if (strcmp (s2, "mflo") == 0)
5419
            move_register (dreg, sreg);
5420
          else
5421
            move_register (dreg, 0);
5422
          break;
5423
        }
5424
      if (imm_expr.X_op == O_constant
5425
          && imm_expr.X_add_number == -1
5426
          && s[strlen (s) - 1] != 'u')
5427
        {
5428
          if (strcmp (s2, "mflo") == 0)
5429
            {
5430
              macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
5431
            }
5432
          else
5433
            move_register (dreg, 0);
5434
          break;
5435
        }
5436
 
5437
      used_at = 1;
5438
      load_register (AT, &imm_expr, dbl);
5439
      macro_build (NULL, s, "z,s,t", sreg, AT);
5440
      macro_build (NULL, s2, "d", dreg);
5441
      break;
5442
 
5443
    case M_DIVU_3:
5444
      s = "divu";
5445
      s2 = "mflo";
5446
      goto do_divu3;
5447
    case M_REMU_3:
5448
      s = "divu";
5449
      s2 = "mfhi";
5450
      goto do_divu3;
5451
    case M_DDIVU_3:
5452
      s = "ddivu";
5453
      s2 = "mflo";
5454
      goto do_divu3;
5455
    case M_DREMU_3:
5456
      s = "ddivu";
5457
      s2 = "mfhi";
5458
    do_divu3:
5459
      start_noreorder ();
5460
      if (mips_trap)
5461
        {
5462
          macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5463
          macro_build (NULL, s, "z,s,t", sreg, treg);
5464
          /* We want to close the noreorder block as soon as possible, so
5465
             that later insns are available for delay slot filling.  */
5466
          end_noreorder ();
5467
        }
5468
      else
5469
        {
5470
          expr1.X_add_number = 8;
5471
          macro_build (&expr1, "bne", "s,t,p", treg, 0);
5472
          macro_build (NULL, s, "z,s,t", sreg, treg);
5473
 
5474
          /* We want to close the noreorder block as soon as possible, so
5475
             that later insns are available for delay slot filling.  */
5476
          end_noreorder ();
5477
          macro_build (NULL, "break", "c", 7);
5478
        }
5479
      macro_build (NULL, s2, "d", dreg);
5480
      break;
5481
 
5482
    case M_DLCA_AB:
5483
      dbl = 1;
5484
    case M_LCA_AB:
5485
      call = 1;
5486
      goto do_la;
5487
    case M_DLA_AB:
5488
      dbl = 1;
5489
    case M_LA_AB:
5490
    do_la:
5491
      /* Load the address of a symbol into a register.  If breg is not
5492
         zero, we then add a base register to it.  */
5493
 
5494
      if (dbl && HAVE_32BIT_GPRS)
5495
        as_warn (_("dla used to load 32-bit register"));
5496
 
5497
      if (! dbl && HAVE_64BIT_OBJECTS)
5498
        as_warn (_("la used to load 64-bit address"));
5499
 
5500
      if (offset_expr.X_op == O_constant
5501
          && offset_expr.X_add_number >= -0x8000
5502
          && offset_expr.X_add_number < 0x8000)
5503
        {
5504
          macro_build (&offset_expr, ADDRESS_ADDI_INSN,
5505
                       "t,r,j", treg, sreg, BFD_RELOC_LO16);
5506
          break;
5507
        }
5508
 
5509
      if (mips_opts.at && (treg == breg))
5510
        {
5511
          tempreg = AT;
5512
          used_at = 1;
5513
        }
5514
      else
5515
        {
5516
          tempreg = treg;
5517
        }
5518
 
5519
      if (offset_expr.X_op != O_symbol
5520
          && offset_expr.X_op != O_constant)
5521
        {
5522
          as_bad (_("expression too complex"));
5523
          offset_expr.X_op = O_constant;
5524
        }
5525
 
5526
      if (offset_expr.X_op == O_constant)
5527
        load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
5528
      else if (mips_pic == NO_PIC)
5529
        {
5530
          /* If this is a reference to a GP relative symbol, we want
5531
               addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
5532
             Otherwise we want
5533
               lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
5534
               addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5535
             If we have a constant, we need two instructions anyhow,
5536
             so we may as well always use the latter form.
5537
 
5538
             With 64bit address space and a usable $at we want
5539
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5540
               lui      $at,<sym>               (BFD_RELOC_HI16_S)
5541
               daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5542
               daddiu   $at,<sym>               (BFD_RELOC_LO16)
5543
               dsll32   $tempreg,0
5544
               daddu    $tempreg,$tempreg,$at
5545
 
5546
             If $at is already in use, we use a path which is suboptimal
5547
             on superscalar processors.
5548
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5549
               daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5550
               dsll     $tempreg,16
5551
               daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
5552
               dsll     $tempreg,16
5553
               daddiu   $tempreg,<sym>          (BFD_RELOC_LO16)
5554
 
5555
             For GP relative symbols in 64bit address space we can use
5556
             the same sequence as in 32bit address space.  */
5557
          if (HAVE_64BIT_SYMBOLS)
5558
            {
5559
              if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5560
                  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5561
                {
5562
                  relax_start (offset_expr.X_add_symbol);
5563
                  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5564
                               tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5565
                  relax_switch ();
5566
                }
5567
 
5568
              if (used_at == 0 && mips_opts.at)
5569
                {
5570
                  macro_build (&offset_expr, "lui", "t,u",
5571
                               tempreg, BFD_RELOC_MIPS_HIGHEST);
5572
                  macro_build (&offset_expr, "lui", "t,u",
5573
                               AT, BFD_RELOC_HI16_S);
5574
                  macro_build (&offset_expr, "daddiu", "t,r,j",
5575
                               tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5576
                  macro_build (&offset_expr, "daddiu", "t,r,j",
5577
                               AT, AT, BFD_RELOC_LO16);
5578
                  macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
5579
                  macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
5580
                  used_at = 1;
5581
                }
5582
              else
5583
                {
5584
                  macro_build (&offset_expr, "lui", "t,u",
5585
                               tempreg, BFD_RELOC_MIPS_HIGHEST);
5586
                  macro_build (&offset_expr, "daddiu", "t,r,j",
5587
                               tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5588
                  macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5589
                  macro_build (&offset_expr, "daddiu", "t,r,j",
5590
                               tempreg, tempreg, BFD_RELOC_HI16_S);
5591
                  macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5592
                  macro_build (&offset_expr, "daddiu", "t,r,j",
5593
                               tempreg, tempreg, BFD_RELOC_LO16);
5594
                }
5595
 
5596
              if (mips_relax.sequence)
5597
                relax_end ();
5598
            }
5599
          else
5600
            {
5601
              if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5602
                  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5603
                {
5604
                  relax_start (offset_expr.X_add_symbol);
5605
                  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5606
                               tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5607
                  relax_switch ();
5608
                }
5609
              if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
5610
                as_bad (_("offset too large"));
5611
              macro_build_lui (&offset_expr, tempreg);
5612
              macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5613
                           tempreg, tempreg, BFD_RELOC_LO16);
5614
              if (mips_relax.sequence)
5615
                relax_end ();
5616
            }
5617
        }
5618
      else if (!mips_big_got && !HAVE_NEWABI)
5619
        {
5620
          int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5621
 
5622
          /* If this is a reference to an external symbol, and there
5623
             is no constant, we want
5624
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5625
             or for lca or if tempreg is PIC_CALL_REG
5626
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5627
             For a local symbol, we want
5628
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5629
               nop
5630
               addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5631
 
5632
             If we have a small constant, and this is a reference to
5633
             an external symbol, we want
5634
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5635
               nop
5636
               addiu    $tempreg,$tempreg,<constant>
5637
             For a local symbol, we want the same instruction
5638
             sequence, but we output a BFD_RELOC_LO16 reloc on the
5639
             addiu instruction.
5640
 
5641
             If we have a large constant, and this is a reference to
5642
             an external symbol, we want
5643
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5644
               lui      $at,<hiconstant>
5645
               addiu    $at,$at,<loconstant>
5646
               addu     $tempreg,$tempreg,$at
5647
             For a local symbol, we want the same instruction
5648
             sequence, but we output a BFD_RELOC_LO16 reloc on the
5649
             addiu instruction.
5650
           */
5651
 
5652
          if (offset_expr.X_add_number == 0)
5653
            {
5654
              if (mips_pic == SVR4_PIC
5655
                  && breg == 0
5656
                  && (call || tempreg == PIC_CALL_REG))
5657
                lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5658
 
5659
              relax_start (offset_expr.X_add_symbol);
5660
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5661
                           lw_reloc_type, mips_gp_register);
5662
              if (breg != 0)
5663
                {
5664
                  /* We're going to put in an addu instruction using
5665
                     tempreg, so we may as well insert the nop right
5666
                     now.  */
5667
                  load_delay_nop ();
5668
                }
5669
              relax_switch ();
5670
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5671
                           tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
5672
              load_delay_nop ();
5673
              macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5674
                           tempreg, tempreg, BFD_RELOC_LO16);
5675
              relax_end ();
5676
              /* FIXME: If breg == 0, and the next instruction uses
5677
                 $tempreg, then if this variant case is used an extra
5678
                 nop will be generated.  */
5679
            }
5680
          else if (offset_expr.X_add_number >= -0x8000
5681
                   && offset_expr.X_add_number < 0x8000)
5682
            {
5683
              load_got_offset (tempreg, &offset_expr);
5684
              load_delay_nop ();
5685
              add_got_offset (tempreg, &offset_expr);
5686
            }
5687
          else
5688
            {
5689
              expr1.X_add_number = offset_expr.X_add_number;
5690
              offset_expr.X_add_number =
5691
                ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
5692
              load_got_offset (tempreg, &offset_expr);
5693
              offset_expr.X_add_number = expr1.X_add_number;
5694
              /* If we are going to add in a base register, and the
5695
                 target register and the base register are the same,
5696
                 then we are using AT as a temporary register.  Since
5697
                 we want to load the constant into AT, we add our
5698
                 current AT (from the global offset table) and the
5699
                 register into the register now, and pretend we were
5700
                 not using a base register.  */
5701
              if (breg == treg)
5702
                {
5703
                  load_delay_nop ();
5704
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5705
                               treg, AT, breg);
5706
                  breg = 0;
5707
                  tempreg = treg;
5708
                }
5709
              add_got_offset_hilo (tempreg, &offset_expr, AT);
5710
              used_at = 1;
5711
            }
5712
        }
5713
      else if (!mips_big_got && HAVE_NEWABI)
5714
        {
5715
          int add_breg_early = 0;
5716
 
5717
          /* If this is a reference to an external, and there is no
5718
             constant, or local symbol (*), with or without a
5719
             constant, we want
5720
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5721
             or for lca or if tempreg is PIC_CALL_REG
5722
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5723
 
5724
             If we have a small constant, and this is a reference to
5725
             an external symbol, we want
5726
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5727
               addiu    $tempreg,$tempreg,<constant>
5728
 
5729
             If we have a large constant, and this is a reference to
5730
             an external symbol, we want
5731
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5732
               lui      $at,<hiconstant>
5733
               addiu    $at,$at,<loconstant>
5734
               addu     $tempreg,$tempreg,$at
5735
 
5736
             (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
5737
             local symbols, even though it introduces an additional
5738
             instruction.  */
5739
 
5740
          if (offset_expr.X_add_number)
5741
            {
5742
              expr1.X_add_number = offset_expr.X_add_number;
5743
              offset_expr.X_add_number = 0;
5744
 
5745
              relax_start (offset_expr.X_add_symbol);
5746
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5747
                           BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5748
 
5749
              if (expr1.X_add_number >= -0x8000
5750
                  && expr1.X_add_number < 0x8000)
5751
                {
5752
                  macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5753
                               tempreg, tempreg, BFD_RELOC_LO16);
5754
                }
5755
              else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5756
                {
5757
                  int dreg;
5758
 
5759
                  /* If we are going to add in a base register, and the
5760
                     target register and the base register are the same,
5761
                     then we are using AT as a temporary register.  Since
5762
                     we want to load the constant into AT, we add our
5763
                     current AT (from the global offset table) and the
5764
                     register into the register now, and pretend we were
5765
                     not using a base register.  */
5766
                  if (breg != treg)
5767
                    dreg = tempreg;
5768
                  else
5769
                    {
5770
                      gas_assert (tempreg == AT);
5771
                      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5772
                                   treg, AT, breg);
5773
                      dreg = treg;
5774
                      add_breg_early = 1;
5775
                    }
5776
 
5777
                  load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5778
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5779
                               dreg, dreg, AT);
5780
 
5781
                  used_at = 1;
5782
                }
5783
              else
5784
                as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5785
 
5786
              relax_switch ();
5787
              offset_expr.X_add_number = expr1.X_add_number;
5788
 
5789
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5790
                           BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5791
              if (add_breg_early)
5792
                {
5793
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5794
                               treg, tempreg, breg);
5795
                  breg = 0;
5796
                  tempreg = treg;
5797
                }
5798
              relax_end ();
5799
            }
5800
          else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
5801
            {
5802
              relax_start (offset_expr.X_add_symbol);
5803
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5804
                           BFD_RELOC_MIPS_CALL16, mips_gp_register);
5805
              relax_switch ();
5806
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5807
                           BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5808
              relax_end ();
5809
            }
5810
          else
5811
            {
5812
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5813
                           BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5814
            }
5815
        }
5816
      else if (mips_big_got && !HAVE_NEWABI)
5817
        {
5818
          int gpdelay;
5819
          int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5820
          int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5821
          int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5822
 
5823
          /* This is the large GOT case.  If this is a reference to an
5824
             external symbol, and there is no constant, we want
5825
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5826
               addu     $tempreg,$tempreg,$gp
5827
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5828
             or for lca or if tempreg is PIC_CALL_REG
5829
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
5830
               addu     $tempreg,$tempreg,$gp
5831
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5832
             For a local symbol, we want
5833
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5834
               nop
5835
               addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5836
 
5837
             If we have a small constant, and this is a reference to
5838
             an external symbol, we want
5839
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5840
               addu     $tempreg,$tempreg,$gp
5841
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5842
               nop
5843
               addiu    $tempreg,$tempreg,<constant>
5844
             For a local symbol, we want
5845
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5846
               nop
5847
               addiu    $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5848
 
5849
             If we have a large constant, and this is a reference to
5850
             an external symbol, we want
5851
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5852
               addu     $tempreg,$tempreg,$gp
5853
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5854
               lui      $at,<hiconstant>
5855
               addiu    $at,$at,<loconstant>
5856
               addu     $tempreg,$tempreg,$at
5857
             For a local symbol, we want
5858
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5859
               lui      $at,<hiconstant>
5860
               addiu    $at,$at,<loconstant>    (BFD_RELOC_LO16)
5861
               addu     $tempreg,$tempreg,$at
5862
          */
5863
 
5864
          expr1.X_add_number = offset_expr.X_add_number;
5865
          offset_expr.X_add_number = 0;
5866
          relax_start (offset_expr.X_add_symbol);
5867
          gpdelay = reg_needs_delay (mips_gp_register);
5868
          if (expr1.X_add_number == 0 && breg == 0
5869
              && (call || tempreg == PIC_CALL_REG))
5870
            {
5871
              lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5872
              lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5873
            }
5874
          macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5875
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5876
                       tempreg, tempreg, mips_gp_register);
5877
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5878
                       tempreg, lw_reloc_type, tempreg);
5879
          if (expr1.X_add_number == 0)
5880
            {
5881
              if (breg != 0)
5882
                {
5883
                  /* We're going to put in an addu instruction using
5884
                     tempreg, so we may as well insert the nop right
5885
                     now.  */
5886
                  load_delay_nop ();
5887
                }
5888
            }
5889
          else if (expr1.X_add_number >= -0x8000
5890
                   && expr1.X_add_number < 0x8000)
5891
            {
5892
              load_delay_nop ();
5893
              macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5894
                           tempreg, tempreg, BFD_RELOC_LO16);
5895
            }
5896
          else
5897
            {
5898
              int dreg;
5899
 
5900
              /* If we are going to add in a base register, and the
5901
                 target register and the base register are the same,
5902
                 then we are using AT as a temporary register.  Since
5903
                 we want to load the constant into AT, we add our
5904
                 current AT (from the global offset table) and the
5905
                 register into the register now, and pretend we were
5906
                 not using a base register.  */
5907
              if (breg != treg)
5908
                dreg = tempreg;
5909
              else
5910
                {
5911
                  gas_assert (tempreg == AT);
5912
                  load_delay_nop ();
5913
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5914
                               treg, AT, breg);
5915
                  dreg = treg;
5916
                }
5917
 
5918
              load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5919
              macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5920
 
5921
              used_at = 1;
5922
            }
5923
          offset_expr.X_add_number =
5924
            ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
5925
          relax_switch ();
5926
 
5927
          if (gpdelay)
5928
            {
5929
              /* This is needed because this instruction uses $gp, but
5930
                 the first instruction on the main stream does not.  */
5931
              macro_build (NULL, "nop", "");
5932
            }
5933
 
5934
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5935
                       local_reloc_type, mips_gp_register);
5936
          if (expr1.X_add_number >= -0x8000
5937
              && expr1.X_add_number < 0x8000)
5938
            {
5939
              load_delay_nop ();
5940
              macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5941
                           tempreg, tempreg, BFD_RELOC_LO16);
5942
              /* FIXME: If add_number is 0, and there was no base
5943
                 register, the external symbol case ended with a load,
5944
                 so if the symbol turns out to not be external, and
5945
                 the next instruction uses tempreg, an unnecessary nop
5946
                 will be inserted.  */
5947
            }
5948
          else
5949
            {
5950
              if (breg == treg)
5951
                {
5952
                  /* We must add in the base register now, as in the
5953
                     external symbol case.  */
5954
                  gas_assert (tempreg == AT);
5955
                  load_delay_nop ();
5956
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5957
                               treg, AT, breg);
5958
                  tempreg = treg;
5959
                  /* We set breg to 0 because we have arranged to add
5960
                     it in in both cases.  */
5961
                  breg = 0;
5962
                }
5963
 
5964
              macro_build_lui (&expr1, AT);
5965
              macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5966
                           AT, AT, BFD_RELOC_LO16);
5967
              macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5968
                           tempreg, tempreg, AT);
5969
              used_at = 1;
5970
            }
5971
          relax_end ();
5972
        }
5973
      else if (mips_big_got && HAVE_NEWABI)
5974
        {
5975
          int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5976
          int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5977
          int add_breg_early = 0;
5978
 
5979
          /* This is the large GOT case.  If this is a reference to an
5980
             external symbol, and there is no constant, we want
5981
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5982
               add      $tempreg,$tempreg,$gp
5983
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5984
             or for lca or if tempreg is PIC_CALL_REG
5985
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
5986
               add      $tempreg,$tempreg,$gp
5987
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5988
 
5989
             If we have a small constant, and this is a reference to
5990
             an external symbol, we want
5991
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5992
               add      $tempreg,$tempreg,$gp
5993
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5994
               addi     $tempreg,$tempreg,<constant>
5995
 
5996
             If we have a large constant, and this is a reference to
5997
             an external symbol, we want
5998
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5999
               addu     $tempreg,$tempreg,$gp
6000
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6001
               lui      $at,<hiconstant>
6002
               addi     $at,$at,<loconstant>
6003
               add      $tempreg,$tempreg,$at
6004
 
6005
             If we have NewABI, and we know it's a local symbol, we want
6006
               lw       $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
6007
               addiu    $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
6008
             otherwise we have to resort to GOT_HI16/GOT_LO16.  */
6009
 
6010
          relax_start (offset_expr.X_add_symbol);
6011
 
6012
          expr1.X_add_number = offset_expr.X_add_number;
6013
          offset_expr.X_add_number = 0;
6014
 
6015
          if (expr1.X_add_number == 0 && breg == 0
6016
              && (call || tempreg == PIC_CALL_REG))
6017
            {
6018
              lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
6019
              lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
6020
            }
6021
          macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
6022
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6023
                       tempreg, tempreg, mips_gp_register);
6024
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6025
                       tempreg, lw_reloc_type, tempreg);
6026
 
6027
          if (expr1.X_add_number == 0)
6028
            ;
6029
          else if (expr1.X_add_number >= -0x8000
6030
                   && expr1.X_add_number < 0x8000)
6031
            {
6032
              macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
6033
                           tempreg, tempreg, BFD_RELOC_LO16);
6034
            }
6035
          else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
6036
            {
6037
              int dreg;
6038
 
6039
              /* If we are going to add in a base register, and the
6040
                 target register and the base register are the same,
6041
                 then we are using AT as a temporary register.  Since
6042
                 we want to load the constant into AT, we add our
6043
                 current AT (from the global offset table) and the
6044
                 register into the register now, and pretend we were
6045
                 not using a base register.  */
6046
              if (breg != treg)
6047
                dreg = tempreg;
6048
              else
6049
                {
6050
                  gas_assert (tempreg == AT);
6051
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6052
                               treg, AT, breg);
6053
                  dreg = treg;
6054
                  add_breg_early = 1;
6055
                }
6056
 
6057
              load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
6058
              macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
6059
 
6060
              used_at = 1;
6061
            }
6062
          else
6063
            as_bad (_("PIC code offset overflow (max 32 signed bits)"));
6064
 
6065
          relax_switch ();
6066
          offset_expr.X_add_number = expr1.X_add_number;
6067
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6068
                       BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6069
          macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6070
                       tempreg, BFD_RELOC_MIPS_GOT_OFST);
6071
          if (add_breg_early)
6072
            {
6073
              macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6074
                           treg, tempreg, breg);
6075
              breg = 0;
6076
              tempreg = treg;
6077
            }
6078
          relax_end ();
6079
        }
6080
      else
6081
        abort ();
6082
 
6083
      if (breg != 0)
6084
        macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
6085
      break;
6086
 
6087
    case M_MSGSND:
6088
      {
6089
        unsigned long temp = (treg << 16) | (0x01);
6090
        macro_build (NULL, "c2", "C", temp);
6091
      }
6092
      /* AT is not used, just return */
6093
      return;
6094
 
6095
    case M_MSGLD:
6096
      {
6097
        unsigned long temp = (0x02);
6098
        macro_build (NULL, "c2", "C", temp);
6099
      }
6100
      /* AT is not used, just return */
6101
      return;
6102
 
6103
    case M_MSGLD_T:
6104
      {
6105
        unsigned long temp = (treg << 16) | (0x02);
6106
        macro_build (NULL, "c2", "C", temp);
6107
      }
6108
      /* AT is not used, just return */
6109
      return;
6110
 
6111
    case M_MSGWAIT:
6112
      macro_build (NULL, "c2", "C", 3);
6113
      /* AT is not used, just return */
6114
      return;
6115
 
6116
    case M_MSGWAIT_T:
6117
      {
6118
        unsigned long temp = (treg << 16) | 0x03;
6119
        macro_build (NULL, "c2", "C", temp);
6120
      }
6121
      /* AT is not used, just return */
6122
      return;
6123
 
6124
    case M_J_A:
6125
      /* The j instruction may not be used in PIC code, since it
6126
         requires an absolute address.  We convert it to a b
6127
         instruction.  */
6128
      if (mips_pic == NO_PIC)
6129
        macro_build (&offset_expr, "j", "a");
6130
      else
6131
        macro_build (&offset_expr, "b", "p");
6132
      break;
6133
 
6134
      /* The jal instructions must be handled as macros because when
6135
         generating PIC code they expand to multi-instruction
6136
         sequences.  Normally they are simple instructions.  */
6137
    case M_JAL_1:
6138
      dreg = RA;
6139
      /* Fall through.  */
6140
    case M_JAL_2:
6141
      if (mips_pic == NO_PIC)
6142
        macro_build (NULL, "jalr", "d,s", dreg, sreg);
6143
      else
6144
        {
6145
          if (sreg != PIC_CALL_REG)
6146
            as_warn (_("MIPS PIC call to register other than $25"));
6147
 
6148
          macro_build (NULL, "jalr", "d,s", dreg, sreg);
6149
          if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
6150
            {
6151
              if (mips_cprestore_offset < 0)
6152
                as_warn (_("No .cprestore pseudo-op used in PIC code"));
6153
              else
6154
                {
6155
                  if (! mips_frame_reg_valid)
6156
                    {
6157
                      as_warn (_("No .frame pseudo-op used in PIC code"));
6158
                      /* Quiet this warning.  */
6159
                      mips_frame_reg_valid = 1;
6160
                    }
6161
                  if (! mips_cprestore_valid)
6162
                    {
6163
                      as_warn (_("No .cprestore pseudo-op used in PIC code"));
6164
                      /* Quiet this warning.  */
6165
                      mips_cprestore_valid = 1;
6166
                    }
6167
                  expr1.X_add_number = mips_cprestore_offset;
6168
                  macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6169
                                                mips_gp_register,
6170
                                                mips_frame_reg,
6171
                                                HAVE_64BIT_ADDRESSES);
6172
                }
6173
            }
6174
        }
6175
 
6176
      break;
6177
 
6178
    case M_JAL_A:
6179
      if (mips_pic == NO_PIC)
6180
        macro_build (&offset_expr, "jal", "a");
6181
      else if (mips_pic == SVR4_PIC)
6182
        {
6183
          /* If this is a reference to an external symbol, and we are
6184
             using a small GOT, we want
6185
               lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
6186
               nop
6187
               jalr     $ra,$25
6188
               nop
6189
               lw       $gp,cprestore($sp)
6190
             The cprestore value is set using the .cprestore
6191
             pseudo-op.  If we are using a big GOT, we want
6192
               lui      $25,<sym>               (BFD_RELOC_MIPS_CALL_HI16)
6193
               addu     $25,$25,$gp
6194
               lw       $25,<sym>($25)          (BFD_RELOC_MIPS_CALL_LO16)
6195
               nop
6196
               jalr     $ra,$25
6197
               nop
6198
               lw       $gp,cprestore($sp)
6199
             If the symbol is not external, we want
6200
               lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6201
               nop
6202
               addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
6203
               jalr     $ra,$25
6204
               nop
6205
               lw $gp,cprestore($sp)
6206
 
6207
             For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
6208
             sequences above, minus nops, unless the symbol is local,
6209
             which enables us to use GOT_PAGE/GOT_OFST (big got) or
6210
             GOT_DISP.  */
6211
          if (HAVE_NEWABI)
6212
            {
6213
              if (! mips_big_got)
6214
                {
6215
                  relax_start (offset_expr.X_add_symbol);
6216
                  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6217
                               PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6218
                               mips_gp_register);
6219
                  relax_switch ();
6220
                  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6221
                               PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
6222
                               mips_gp_register);
6223
                  relax_end ();
6224
                }
6225
              else
6226
                {
6227
                  relax_start (offset_expr.X_add_symbol);
6228
                  macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6229
                               BFD_RELOC_MIPS_CALL_HI16);
6230
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6231
                               PIC_CALL_REG, mips_gp_register);
6232
                  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6233
                               PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6234
                               PIC_CALL_REG);
6235
                  relax_switch ();
6236
                  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6237
                               PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
6238
                               mips_gp_register);
6239
                  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6240
                               PIC_CALL_REG, PIC_CALL_REG,
6241
                               BFD_RELOC_MIPS_GOT_OFST);
6242
                  relax_end ();
6243
                }
6244
 
6245
              macro_build_jalr (&offset_expr);
6246
            }
6247
          else
6248
            {
6249
              relax_start (offset_expr.X_add_symbol);
6250
              if (! mips_big_got)
6251
                {
6252
                  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6253
                               PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6254
                               mips_gp_register);
6255
                  load_delay_nop ();
6256
                  relax_switch ();
6257
                }
6258
              else
6259
                {
6260
                  int gpdelay;
6261
 
6262
                  gpdelay = reg_needs_delay (mips_gp_register);
6263
                  macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6264
                               BFD_RELOC_MIPS_CALL_HI16);
6265
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6266
                               PIC_CALL_REG, mips_gp_register);
6267
                  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6268
                               PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6269
                               PIC_CALL_REG);
6270
                  load_delay_nop ();
6271
                  relax_switch ();
6272
                  if (gpdelay)
6273
                    macro_build (NULL, "nop", "");
6274
                }
6275
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6276
                           PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
6277
                           mips_gp_register);
6278
              load_delay_nop ();
6279
              macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6280
                           PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
6281
              relax_end ();
6282
              macro_build_jalr (&offset_expr);
6283
 
6284
              if (mips_cprestore_offset < 0)
6285
                as_warn (_("No .cprestore pseudo-op used in PIC code"));
6286
              else
6287
                {
6288
                  if (! mips_frame_reg_valid)
6289
                    {
6290
                      as_warn (_("No .frame pseudo-op used in PIC code"));
6291
                      /* Quiet this warning.  */
6292
                      mips_frame_reg_valid = 1;
6293
                    }
6294
                  if (! mips_cprestore_valid)
6295
                    {
6296
                      as_warn (_("No .cprestore pseudo-op used in PIC code"));
6297
                      /* Quiet this warning.  */
6298
                      mips_cprestore_valid = 1;
6299
                    }
6300
                  if (mips_opts.noreorder)
6301
                    macro_build (NULL, "nop", "");
6302
                  expr1.X_add_number = mips_cprestore_offset;
6303
                  macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6304
                                                mips_gp_register,
6305
                                                mips_frame_reg,
6306
                                                HAVE_64BIT_ADDRESSES);
6307
                }
6308
            }
6309
        }
6310
      else if (mips_pic == VXWORKS_PIC)
6311
        as_bad (_("Non-PIC jump used in PIC library"));
6312
      else
6313
        abort ();
6314
 
6315
      break;
6316
 
6317
    case M_LB_AB:
6318
      s = "lb";
6319
      goto ld;
6320
    case M_LBU_AB:
6321
      s = "lbu";
6322
      goto ld;
6323
    case M_LH_AB:
6324
      s = "lh";
6325
      goto ld;
6326
    case M_LHU_AB:
6327
      s = "lhu";
6328
      goto ld;
6329
    case M_LW_AB:
6330
      s = "lw";
6331
      goto ld;
6332
    case M_LWC0_AB:
6333
      s = "lwc0";
6334
      /* Itbl support may require additional care here.  */
6335
      coproc = 1;
6336
      goto ld;
6337
    case M_LWC1_AB:
6338
      s = "lwc1";
6339
      /* Itbl support may require additional care here.  */
6340
      coproc = 1;
6341
      goto ld;
6342
    case M_LWC2_AB:
6343
      s = "lwc2";
6344
      /* Itbl support may require additional care here.  */
6345
      coproc = 1;
6346
      goto ld;
6347
    case M_LWC3_AB:
6348
      s = "lwc3";
6349
      /* Itbl support may require additional care here.  */
6350
      coproc = 1;
6351
      goto ld;
6352
    case M_LWL_AB:
6353
      s = "lwl";
6354
      lr = 1;
6355
      goto ld;
6356
    case M_LWR_AB:
6357
      s = "lwr";
6358
      lr = 1;
6359
      goto ld;
6360
    case M_LDC1_AB:
6361
      s = "ldc1";
6362
      /* Itbl support may require additional care here.  */
6363
      coproc = 1;
6364
      goto ld;
6365
    case M_LDC2_AB:
6366
      s = "ldc2";
6367
      /* Itbl support may require additional care here.  */
6368
      coproc = 1;
6369
      goto ld;
6370
    case M_LDC3_AB:
6371
      s = "ldc3";
6372
      /* Itbl support may require additional care here.  */
6373
      coproc = 1;
6374
      goto ld;
6375
    case M_LDL_AB:
6376
      s = "ldl";
6377
      lr = 1;
6378
      goto ld;
6379
    case M_LDR_AB:
6380
      s = "ldr";
6381
      lr = 1;
6382
      goto ld;
6383
    case M_LL_AB:
6384
      s = "ll";
6385
      goto ld;
6386
    case M_LLD_AB:
6387
      s = "lld";
6388
      goto ld;
6389
    case M_LWU_AB:
6390
      s = "lwu";
6391
    ld:
6392
      if (breg == treg || coproc || lr)
6393
        {
6394
          tempreg = AT;
6395
          used_at = 1;
6396
        }
6397
      else
6398
        {
6399
          tempreg = treg;
6400
        }
6401
      goto ld_st;
6402
    case M_SB_AB:
6403
      s = "sb";
6404
      goto st;
6405
    case M_SH_AB:
6406
      s = "sh";
6407
      goto st;
6408
    case M_SW_AB:
6409
      s = "sw";
6410
      goto st;
6411
    case M_SWC0_AB:
6412
      s = "swc0";
6413
      /* Itbl support may require additional care here.  */
6414
      coproc = 1;
6415
      goto st;
6416
    case M_SWC1_AB:
6417
      s = "swc1";
6418
      /* Itbl support may require additional care here.  */
6419
      coproc = 1;
6420
      goto st;
6421
    case M_SWC2_AB:
6422
      s = "swc2";
6423
      /* Itbl support may require additional care here.  */
6424
      coproc = 1;
6425
      goto st;
6426
    case M_SWC3_AB:
6427
      s = "swc3";
6428
      /* Itbl support may require additional care here.  */
6429
      coproc = 1;
6430
      goto st;
6431
    case M_SWL_AB:
6432
      s = "swl";
6433
      goto st;
6434
    case M_SWR_AB:
6435
      s = "swr";
6436
      goto st;
6437
    case M_SC_AB:
6438
      s = "sc";
6439
      goto st;
6440
    case M_SCD_AB:
6441
      s = "scd";
6442
      goto st;
6443
    case M_CACHE_AB:
6444
      s = "cache";
6445
      goto st;
6446
    case M_SDC1_AB:
6447
      s = "sdc1";
6448
      coproc = 1;
6449
      /* Itbl support may require additional care here.  */
6450
      goto st;
6451
    case M_SDC2_AB:
6452
      s = "sdc2";
6453
      /* Itbl support may require additional care here.  */
6454
      coproc = 1;
6455
      goto st;
6456
    case M_SDC3_AB:
6457
      s = "sdc3";
6458
      /* Itbl support may require additional care here.  */
6459
      coproc = 1;
6460
      goto st;
6461
    case M_SDL_AB:
6462
      s = "sdl";
6463
      goto st;
6464
    case M_SDR_AB:
6465
      s = "sdr";
6466
    st:
6467
      tempreg = AT;
6468
      used_at = 1;
6469
    ld_st:
6470
      if (coproc
6471
          && NO_ISA_COP (mips_opts.arch)
6472
          && (ip->insn_mo->pinfo2 & (INSN2_M_FP_S | INSN2_M_FP_D)) == 0)
6473
        {
6474
          as_bad (_("opcode not supported on this processor: %s"),
6475
                  mips_cpu_info_from_arch (mips_opts.arch)->name);
6476
          break;
6477
        }
6478
 
6479
      /* Itbl support may require additional care here.  */
6480
      if (mask == M_LWC1_AB
6481
          || mask == M_SWC1_AB
6482
          || mask == M_LDC1_AB
6483
          || mask == M_SDC1_AB
6484
          || mask == M_L_DAB
6485
          || mask == M_S_DAB)
6486
        fmt = "T,o(b)";
6487
      else if (mask == M_CACHE_AB)
6488
        fmt = "k,o(b)";
6489
      else if (coproc)
6490
        fmt = "E,o(b)";
6491
      else
6492
        fmt = "t,o(b)";
6493
 
6494
      if (offset_expr.X_op != O_constant
6495
          && offset_expr.X_op != O_symbol)
6496
        {
6497
          as_bad (_("expression too complex"));
6498
          offset_expr.X_op = O_constant;
6499
        }
6500
 
6501
      if (HAVE_32BIT_ADDRESSES
6502
          && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6503
        {
6504
          char value [32];
6505
 
6506
          sprintf_vma (value, offset_expr.X_add_number);
6507
          as_bad (_("Number (0x%s) larger than 32 bits"), value);
6508
        }
6509
 
6510
      /* A constant expression in PIC code can be handled just as it
6511
         is in non PIC code.  */
6512
      if (offset_expr.X_op == O_constant)
6513
        {
6514
          expr1.X_add_number = ((offset_expr.X_add_number + 0x8000)
6515
                                & ~(bfd_vma) 0xffff);
6516
          normalize_address_expr (&expr1);
6517
          load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
6518
          if (breg != 0)
6519
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6520
                         tempreg, tempreg, breg);
6521
          macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6522
        }
6523
      else if (mips_pic == NO_PIC)
6524
        {
6525
          /* If this is a reference to a GP relative symbol, and there
6526
             is no base register, we want
6527
               <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6528
             Otherwise, if there is no base register, we want
6529
               lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6530
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6531
             If we have a constant, we need two instructions anyhow,
6532
             so we always use the latter form.
6533
 
6534
             If we have a base register, and this is a reference to a
6535
             GP relative symbol, we want
6536
               addu     $tempreg,$breg,$gp
6537
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
6538
             Otherwise we want
6539
               lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6540
               addu     $tempreg,$tempreg,$breg
6541
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6542
             With a constant we always use the latter case.
6543
 
6544
             With 64bit address space and no base register and $at usable,
6545
             we want
6546
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6547
               lui      $at,<sym>               (BFD_RELOC_HI16_S)
6548
               daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6549
               dsll32   $tempreg,0
6550
               daddu    $tempreg,$at
6551
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6552
             If we have a base register, we want
6553
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6554
               lui      $at,<sym>               (BFD_RELOC_HI16_S)
6555
               daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6556
               daddu    $at,$breg
6557
               dsll32   $tempreg,0
6558
               daddu    $tempreg,$at
6559
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6560
 
6561
             Without $at we can't generate the optimal path for superscalar
6562
             processors here since this would require two temporary registers.
6563
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6564
               daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6565
               dsll     $tempreg,16
6566
               daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6567
               dsll     $tempreg,16
6568
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6569
             If we have a base register, we want
6570
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6571
               daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6572
               dsll     $tempreg,16
6573
               daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6574
               dsll     $tempreg,16
6575
               daddu    $tempreg,$tempreg,$breg
6576
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6577
 
6578
             For GP relative symbols in 64bit address space we can use
6579
             the same sequence as in 32bit address space.  */
6580
          if (HAVE_64BIT_SYMBOLS)
6581
            {
6582
              if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6583
                  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6584
                {
6585
                  relax_start (offset_expr.X_add_symbol);
6586
                  if (breg == 0)
6587
                    {
6588
                      macro_build (&offset_expr, s, fmt, treg,
6589
                                   BFD_RELOC_GPREL16, mips_gp_register);
6590
                    }
6591
                  else
6592
                    {
6593
                      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6594
                                   tempreg, breg, mips_gp_register);
6595
                      macro_build (&offset_expr, s, fmt, treg,
6596
                                   BFD_RELOC_GPREL16, tempreg);
6597
                    }
6598
                  relax_switch ();
6599
                }
6600
 
6601
              if (used_at == 0 && mips_opts.at)
6602
                {
6603
                  macro_build (&offset_expr, "lui", "t,u", tempreg,
6604
                               BFD_RELOC_MIPS_HIGHEST);
6605
                  macro_build (&offset_expr, "lui", "t,u", AT,
6606
                               BFD_RELOC_HI16_S);
6607
                  macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6608
                               tempreg, BFD_RELOC_MIPS_HIGHER);
6609
                  if (breg != 0)
6610
                    macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
6611
                  macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
6612
                  macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
6613
                  macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
6614
                               tempreg);
6615
                  used_at = 1;
6616
                }
6617
              else
6618
                {
6619
                  macro_build (&offset_expr, "lui", "t,u", tempreg,
6620
                               BFD_RELOC_MIPS_HIGHEST);
6621
                  macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6622
                               tempreg, BFD_RELOC_MIPS_HIGHER);
6623
                  macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6624
                  macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6625
                               tempreg, BFD_RELOC_HI16_S);
6626
                  macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6627
                  if (breg != 0)
6628
                    macro_build (NULL, "daddu", "d,v,t",
6629
                                 tempreg, tempreg, breg);
6630
                  macro_build (&offset_expr, s, fmt, treg,
6631
                               BFD_RELOC_LO16, tempreg);
6632
                }
6633
 
6634
              if (mips_relax.sequence)
6635
                relax_end ();
6636
              break;
6637
            }
6638
 
6639
          if (breg == 0)
6640
            {
6641
              if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6642
                  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6643
                {
6644
                  relax_start (offset_expr.X_add_symbol);
6645
                  macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6646
                               mips_gp_register);
6647
                  relax_switch ();
6648
                }
6649
              macro_build_lui (&offset_expr, tempreg);
6650
              macro_build (&offset_expr, s, fmt, treg,
6651
                           BFD_RELOC_LO16, tempreg);
6652
              if (mips_relax.sequence)
6653
                relax_end ();
6654
            }
6655
          else
6656
            {
6657
              if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6658
                  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6659
                {
6660
                  relax_start (offset_expr.X_add_symbol);
6661
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6662
                               tempreg, breg, mips_gp_register);
6663
                  macro_build (&offset_expr, s, fmt, treg,
6664
                               BFD_RELOC_GPREL16, tempreg);
6665
                  relax_switch ();
6666
                }
6667
              macro_build_lui (&offset_expr, tempreg);
6668
              macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6669
                           tempreg, tempreg, breg);
6670
              macro_build (&offset_expr, s, fmt, treg,
6671
                           BFD_RELOC_LO16, tempreg);
6672
              if (mips_relax.sequence)
6673
                relax_end ();
6674
            }
6675
        }
6676
      else if (!mips_big_got)
6677
        {
6678
          int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6679
 
6680
          /* If this is a reference to an external symbol, we want
6681
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6682
               nop
6683
               <op>     $treg,0($tempreg)
6684
             Otherwise we want
6685
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6686
               nop
6687
               addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6688
               <op>     $treg,0($tempreg)
6689
 
6690
             For NewABI, we want
6691
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6692
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
6693
 
6694
             If there is a base register, we add it to $tempreg before
6695
             the <op>.  If there is a constant, we stick it in the
6696
             <op> instruction.  We don't handle constants larger than
6697
             16 bits, because we have no way to load the upper 16 bits
6698
             (actually, we could handle them for the subset of cases
6699
             in which we are not using $at).  */
6700
          gas_assert (offset_expr.X_op == O_symbol);
6701
          if (HAVE_NEWABI)
6702
            {
6703
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6704
                           BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6705
              if (breg != 0)
6706
                macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6707
                             tempreg, tempreg, breg);
6708
              macro_build (&offset_expr, s, fmt, treg,
6709
                           BFD_RELOC_MIPS_GOT_OFST, tempreg);
6710
              break;
6711
            }
6712
          expr1.X_add_number = offset_expr.X_add_number;
6713
          offset_expr.X_add_number = 0;
6714
          if (expr1.X_add_number < -0x8000
6715
              || expr1.X_add_number >= 0x8000)
6716
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6717
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6718
                       lw_reloc_type, mips_gp_register);
6719
          load_delay_nop ();
6720
          relax_start (offset_expr.X_add_symbol);
6721
          relax_switch ();
6722
          macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6723
                       tempreg, BFD_RELOC_LO16);
6724
          relax_end ();
6725
          if (breg != 0)
6726
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6727
                         tempreg, tempreg, breg);
6728
          macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6729
        }
6730
      else if (mips_big_got && !HAVE_NEWABI)
6731
        {
6732
          int gpdelay;
6733
 
6734
          /* If this is a reference to an external symbol, we want
6735
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6736
               addu     $tempreg,$tempreg,$gp
6737
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6738
               <op>     $treg,0($tempreg)
6739
             Otherwise we want
6740
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6741
               nop
6742
               addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6743
               <op>     $treg,0($tempreg)
6744
             If there is a base register, we add it to $tempreg before
6745
             the <op>.  If there is a constant, we stick it in the
6746
             <op> instruction.  We don't handle constants larger than
6747
             16 bits, because we have no way to load the upper 16 bits
6748
             (actually, we could handle them for the subset of cases
6749
             in which we are not using $at).  */
6750
          gas_assert (offset_expr.X_op == O_symbol);
6751
          expr1.X_add_number = offset_expr.X_add_number;
6752
          offset_expr.X_add_number = 0;
6753
          if (expr1.X_add_number < -0x8000
6754
              || expr1.X_add_number >= 0x8000)
6755
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6756
          gpdelay = reg_needs_delay (mips_gp_register);
6757
          relax_start (offset_expr.X_add_symbol);
6758
          macro_build (&offset_expr, "lui", "t,u", tempreg,
6759
                       BFD_RELOC_MIPS_GOT_HI16);
6760
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6761
                       mips_gp_register);
6762
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6763
                       BFD_RELOC_MIPS_GOT_LO16, tempreg);
6764
          relax_switch ();
6765
          if (gpdelay)
6766
            macro_build (NULL, "nop", "");
6767
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6768
                       BFD_RELOC_MIPS_GOT16, mips_gp_register);
6769
          load_delay_nop ();
6770
          macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6771
                       tempreg, BFD_RELOC_LO16);
6772
          relax_end ();
6773
 
6774
          if (breg != 0)
6775
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6776
                         tempreg, tempreg, breg);
6777
          macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6778
        }
6779
      else if (mips_big_got && HAVE_NEWABI)
6780
        {
6781
          /* If this is a reference to an external symbol, we want
6782
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6783
               add      $tempreg,$tempreg,$gp
6784
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6785
               <op>     $treg,<ofst>($tempreg)
6786
             Otherwise, for local symbols, we want:
6787
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6788
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
6789
          gas_assert (offset_expr.X_op == O_symbol);
6790
          expr1.X_add_number = offset_expr.X_add_number;
6791
          offset_expr.X_add_number = 0;
6792
          if (expr1.X_add_number < -0x8000
6793
              || expr1.X_add_number >= 0x8000)
6794
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6795
          relax_start (offset_expr.X_add_symbol);
6796
          macro_build (&offset_expr, "lui", "t,u", tempreg,
6797
                       BFD_RELOC_MIPS_GOT_HI16);
6798
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6799
                       mips_gp_register);
6800
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6801
                       BFD_RELOC_MIPS_GOT_LO16, tempreg);
6802
          if (breg != 0)
6803
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6804
                         tempreg, tempreg, breg);
6805
          macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6806
 
6807
          relax_switch ();
6808
          offset_expr.X_add_number = expr1.X_add_number;
6809
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6810
                       BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6811
          if (breg != 0)
6812
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6813
                         tempreg, tempreg, breg);
6814
          macro_build (&offset_expr, s, fmt, treg,
6815
                       BFD_RELOC_MIPS_GOT_OFST, tempreg);
6816
          relax_end ();
6817
        }
6818
      else
6819
        abort ();
6820
 
6821
      break;
6822
 
6823
    case M_LI:
6824
    case M_LI_S:
6825
      load_register (treg, &imm_expr, 0);
6826
      break;
6827
 
6828
    case M_DLI:
6829
      load_register (treg, &imm_expr, 1);
6830
      break;
6831
 
6832
    case M_LI_SS:
6833
      if (imm_expr.X_op == O_constant)
6834
        {
6835
          used_at = 1;
6836
          load_register (AT, &imm_expr, 0);
6837
          macro_build (NULL, "mtc1", "t,G", AT, treg);
6838
          break;
6839
        }
6840
      else
6841
        {
6842
          gas_assert (offset_expr.X_op == O_symbol
6843
                  && strcmp (segment_name (S_GET_SEGMENT
6844
                                           (offset_expr.X_add_symbol)),
6845
                             ".lit4") == 0
6846
                  && offset_expr.X_add_number == 0);
6847
          macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
6848
                       BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6849
          break;
6850
        }
6851
 
6852
    case M_LI_D:
6853
      /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
6854
         wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
6855
         order 32 bits of the value and the low order 32 bits are either
6856
         zero or in OFFSET_EXPR.  */
6857
      if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6858
        {
6859
          if (HAVE_64BIT_GPRS)
6860
            load_register (treg, &imm_expr, 1);
6861
          else
6862
            {
6863
              int hreg, lreg;
6864
 
6865
              if (target_big_endian)
6866
                {
6867
                  hreg = treg;
6868
                  lreg = treg + 1;
6869
                }
6870
              else
6871
                {
6872
                  hreg = treg + 1;
6873
                  lreg = treg;
6874
                }
6875
 
6876
              if (hreg <= 31)
6877
                load_register (hreg, &imm_expr, 0);
6878
              if (lreg <= 31)
6879
                {
6880
                  if (offset_expr.X_op == O_absent)
6881
                    move_register (lreg, 0);
6882
                  else
6883
                    {
6884
                      gas_assert (offset_expr.X_op == O_constant);
6885
                      load_register (lreg, &offset_expr, 0);
6886
                    }
6887
                }
6888
            }
6889
          break;
6890
        }
6891
 
6892
      /* We know that sym is in the .rdata section.  First we get the
6893
         upper 16 bits of the address.  */
6894
      if (mips_pic == NO_PIC)
6895
        {
6896
          macro_build_lui (&offset_expr, AT);
6897
          used_at = 1;
6898
        }
6899
      else
6900
        {
6901
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6902
                       BFD_RELOC_MIPS_GOT16, mips_gp_register);
6903
          used_at = 1;
6904
        }
6905
 
6906
      /* Now we load the register(s).  */
6907
      if (HAVE_64BIT_GPRS)
6908
        {
6909
          used_at = 1;
6910
          macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6911
        }
6912
      else
6913
        {
6914
          used_at = 1;
6915
          macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6916
          if (treg != RA)
6917
            {
6918
              /* FIXME: How in the world do we deal with the possible
6919
                 overflow here?  */
6920
              offset_expr.X_add_number += 4;
6921
              macro_build (&offset_expr, "lw", "t,o(b)",
6922
                           treg + 1, BFD_RELOC_LO16, AT);
6923
            }
6924
        }
6925
      break;
6926
 
6927
    case M_LI_DD:
6928
      /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
6929
         wide, IMM_EXPR is the entire value and the GPRs are known to be 64
6930
         bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
6931
         the value and the low order 32 bits are either zero or in
6932
         OFFSET_EXPR.  */
6933
      if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6934
        {
6935
          used_at = 1;
6936
          load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
6937
          if (HAVE_64BIT_FPRS)
6938
            {
6939
              gas_assert (HAVE_64BIT_GPRS);
6940
              macro_build (NULL, "dmtc1", "t,S", AT, treg);
6941
            }
6942
          else
6943
            {
6944
              macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
6945
              if (offset_expr.X_op == O_absent)
6946
                macro_build (NULL, "mtc1", "t,G", 0, treg);
6947
              else
6948
                {
6949
                  gas_assert (offset_expr.X_op == O_constant);
6950
                  load_register (AT, &offset_expr, 0);
6951
                  macro_build (NULL, "mtc1", "t,G", AT, treg);
6952
                }
6953
            }
6954
          break;
6955
        }
6956
 
6957
      gas_assert (offset_expr.X_op == O_symbol
6958
              && offset_expr.X_add_number == 0);
6959
      s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
6960
      if (strcmp (s, ".lit8") == 0)
6961
        {
6962
          if (mips_opts.isa != ISA_MIPS1)
6963
            {
6964
              macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
6965
                           BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6966
              break;
6967
            }
6968
          breg = mips_gp_register;
6969
          r = BFD_RELOC_MIPS_LITERAL;
6970
          goto dob;
6971
        }
6972
      else
6973
        {
6974
          gas_assert (strcmp (s, RDATA_SECTION_NAME) == 0);
6975
          used_at = 1;
6976
          if (mips_pic != NO_PIC)
6977
            macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6978
                         BFD_RELOC_MIPS_GOT16, mips_gp_register);
6979
          else
6980
            {
6981
              /* FIXME: This won't work for a 64 bit address.  */
6982
              macro_build_lui (&offset_expr, AT);
6983
            }
6984
 
6985
          if (mips_opts.isa != ISA_MIPS1)
6986
            {
6987
              macro_build (&offset_expr, "ldc1", "T,o(b)",
6988
                           treg, BFD_RELOC_LO16, AT);
6989
              break;
6990
            }
6991
          breg = AT;
6992
          r = BFD_RELOC_LO16;
6993
          goto dob;
6994
        }
6995
 
6996
    case M_L_DOB:
6997
      /* Even on a big endian machine $fn comes before $fn+1.  We have
6998
         to adjust when loading from memory.  */
6999
      r = BFD_RELOC_LO16;
7000
    dob:
7001
      gas_assert (mips_opts.isa == ISA_MIPS1);
7002
      macro_build (&offset_expr, "lwc1", "T,o(b)",
7003
                   target_big_endian ? treg + 1 : treg, r, breg);
7004
      /* FIXME: A possible overflow which I don't know how to deal
7005
         with.  */
7006
      offset_expr.X_add_number += 4;
7007
      macro_build (&offset_expr, "lwc1", "T,o(b)",
7008
                   target_big_endian ? treg : treg + 1, r, breg);
7009
      break;
7010
 
7011
    case M_L_DAB:
7012
      /*
7013
       * The MIPS assembler seems to check for X_add_number not
7014
       * being double aligned and generating:
7015
       *        lui     at,%hi(foo+1)
7016
       *        addu    at,at,v1
7017
       *        addiu   at,at,%lo(foo+1)
7018
       *        lwc1    f2,0(at)
7019
       *        lwc1    f3,4(at)
7020
       * But, the resulting address is the same after relocation so why
7021
       * generate the extra instruction?
7022
       */
7023
      /* Itbl support may require additional care here.  */
7024
      coproc = 1;
7025
      if (mips_opts.isa != ISA_MIPS1)
7026
        {
7027
          s = "ldc1";
7028
          goto ld;
7029
        }
7030
 
7031
      s = "lwc1";
7032
      fmt = "T,o(b)";
7033
      goto ldd_std;
7034
 
7035
    case M_S_DAB:
7036
      if (mips_opts.isa != ISA_MIPS1)
7037
        {
7038
          s = "sdc1";
7039
          goto st;
7040
        }
7041
 
7042
      s = "swc1";
7043
      fmt = "T,o(b)";
7044
      /* Itbl support may require additional care here.  */
7045
      coproc = 1;
7046
      goto ldd_std;
7047
 
7048
    case M_LD_AB:
7049
      if (HAVE_64BIT_GPRS)
7050
        {
7051
          s = "ld";
7052
          goto ld;
7053
        }
7054
 
7055
      s = "lw";
7056
      fmt = "t,o(b)";
7057
      goto ldd_std;
7058
 
7059
    case M_SD_AB:
7060
      if (HAVE_64BIT_GPRS)
7061
        {
7062
          s = "sd";
7063
          goto st;
7064
        }
7065
 
7066
      s = "sw";
7067
      fmt = "t,o(b)";
7068
 
7069
    ldd_std:
7070
      if (offset_expr.X_op != O_symbol
7071
          && offset_expr.X_op != O_constant)
7072
        {
7073
          as_bad (_("expression too complex"));
7074
          offset_expr.X_op = O_constant;
7075
        }
7076
 
7077
      if (HAVE_32BIT_ADDRESSES
7078
          && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
7079
        {
7080
          char value [32];
7081
 
7082
          sprintf_vma (value, offset_expr.X_add_number);
7083
          as_bad (_("Number (0x%s) larger than 32 bits"), value);
7084
        }
7085
 
7086
      /* Even on a big endian machine $fn comes before $fn+1.  We have
7087
         to adjust when loading from memory.  We set coproc if we must
7088
         load $fn+1 first.  */
7089
      /* Itbl support may require additional care here.  */
7090
      if (! target_big_endian)
7091
        coproc = 0;
7092
 
7093
      if (mips_pic == NO_PIC
7094
          || offset_expr.X_op == O_constant)
7095
        {
7096
          /* If this is a reference to a GP relative symbol, we want
7097
               <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
7098
               <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
7099
             If we have a base register, we use this
7100
               addu     $at,$breg,$gp
7101
               <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
7102
               <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
7103
             If this is not a GP relative symbol, we want
7104
               lui      $at,<sym>               (BFD_RELOC_HI16_S)
7105
               <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7106
               <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7107
             If there is a base register, we add it to $at after the
7108
             lui instruction.  If there is a constant, we always use
7109
             the last case.  */
7110
          if (offset_expr.X_op == O_symbol
7111
              && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7112
              && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7113
            {
7114
              relax_start (offset_expr.X_add_symbol);
7115
              if (breg == 0)
7116
                {
7117
                  tempreg = mips_gp_register;
7118
                }
7119
              else
7120
                {
7121
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7122
                               AT, breg, mips_gp_register);
7123
                  tempreg = AT;
7124
                  used_at = 1;
7125
                }
7126
 
7127
              /* Itbl support may require additional care here.  */
7128
              macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7129
                           BFD_RELOC_GPREL16, tempreg);
7130
              offset_expr.X_add_number += 4;
7131
 
7132
              /* Set mips_optimize to 2 to avoid inserting an
7133
                 undesired nop.  */
7134
              hold_mips_optimize = mips_optimize;
7135
              mips_optimize = 2;
7136
              /* Itbl support may require additional care here.  */
7137
              macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7138
                           BFD_RELOC_GPREL16, tempreg);
7139
              mips_optimize = hold_mips_optimize;
7140
 
7141
              relax_switch ();
7142
 
7143
              /* We just generated two relocs.  When tc_gen_reloc
7144
                 handles this case, it will skip the first reloc and
7145
                 handle the second.  The second reloc already has an
7146
                 extra addend of 4, which we added above.  We must
7147
                 subtract it out, and then subtract another 4 to make
7148
                 the first reloc come out right.  The second reloc
7149
                 will come out right because we are going to add 4 to
7150
                 offset_expr when we build its instruction below.
7151
 
7152
                 If we have a symbol, then we don't want to include
7153
                 the offset, because it will wind up being included
7154
                 when we generate the reloc.  */
7155
 
7156
              if (offset_expr.X_op == O_constant)
7157
                offset_expr.X_add_number -= 8;
7158
              else
7159
                {
7160
                  offset_expr.X_add_number = -4;
7161
                  offset_expr.X_op = O_constant;
7162
                }
7163
            }
7164
          used_at = 1;
7165
          macro_build_lui (&offset_expr, AT);
7166
          if (breg != 0)
7167
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7168
          /* Itbl support may require additional care here.  */
7169
          macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7170
                       BFD_RELOC_LO16, AT);
7171
          /* FIXME: How do we handle overflow here?  */
7172
          offset_expr.X_add_number += 4;
7173
          /* Itbl support may require additional care here.  */
7174
          macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7175
                       BFD_RELOC_LO16, AT);
7176
          if (mips_relax.sequence)
7177
            relax_end ();
7178
        }
7179
      else if (!mips_big_got)
7180
        {
7181
          /* If this is a reference to an external symbol, we want
7182
               lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7183
               nop
7184
               <op>     $treg,0($at)
7185
               <op>     $treg+1,4($at)
7186
             Otherwise we want
7187
               lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7188
               nop
7189
               <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7190
               <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7191
             If there is a base register we add it to $at before the
7192
             lwc1 instructions.  If there is a constant we include it
7193
             in the lwc1 instructions.  */
7194
          used_at = 1;
7195
          expr1.X_add_number = offset_expr.X_add_number;
7196
          if (expr1.X_add_number < -0x8000
7197
              || expr1.X_add_number >= 0x8000 - 4)
7198
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7199
          load_got_offset (AT, &offset_expr);
7200
          load_delay_nop ();
7201
          if (breg != 0)
7202
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7203
 
7204
          /* Set mips_optimize to 2 to avoid inserting an undesired
7205
             nop.  */
7206
          hold_mips_optimize = mips_optimize;
7207
          mips_optimize = 2;
7208
 
7209
          /* Itbl support may require additional care here.  */
7210
          relax_start (offset_expr.X_add_symbol);
7211
          macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7212
                       BFD_RELOC_LO16, AT);
7213
          expr1.X_add_number += 4;
7214
          macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7215
                       BFD_RELOC_LO16, AT);
7216
          relax_switch ();
7217
          macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7218
                       BFD_RELOC_LO16, AT);
7219
          offset_expr.X_add_number += 4;
7220
          macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7221
                       BFD_RELOC_LO16, AT);
7222
          relax_end ();
7223
 
7224
          mips_optimize = hold_mips_optimize;
7225
        }
7226
      else if (mips_big_got)
7227
        {
7228
          int gpdelay;
7229
 
7230
          /* If this is a reference to an external symbol, we want
7231
               lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
7232
               addu     $at,$at,$gp
7233
               lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
7234
               nop
7235
               <op>     $treg,0($at)
7236
               <op>     $treg+1,4($at)
7237
             Otherwise we want
7238
               lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7239
               nop
7240
               <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7241
               <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7242
             If there is a base register we add it to $at before the
7243
             lwc1 instructions.  If there is a constant we include it
7244
             in the lwc1 instructions.  */
7245
          used_at = 1;
7246
          expr1.X_add_number = offset_expr.X_add_number;
7247
          offset_expr.X_add_number = 0;
7248
          if (expr1.X_add_number < -0x8000
7249
              || expr1.X_add_number >= 0x8000 - 4)
7250
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7251
          gpdelay = reg_needs_delay (mips_gp_register);
7252
          relax_start (offset_expr.X_add_symbol);
7253
          macro_build (&offset_expr, "lui", "t,u",
7254
                       AT, BFD_RELOC_MIPS_GOT_HI16);
7255
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7256
                       AT, AT, mips_gp_register);
7257
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7258
                       AT, BFD_RELOC_MIPS_GOT_LO16, AT);
7259
          load_delay_nop ();
7260
          if (breg != 0)
7261
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7262
          /* Itbl support may require additional care here.  */
7263
          macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7264
                       BFD_RELOC_LO16, AT);
7265
          expr1.X_add_number += 4;
7266
 
7267
          /* Set mips_optimize to 2 to avoid inserting an undesired
7268
             nop.  */
7269
          hold_mips_optimize = mips_optimize;
7270
          mips_optimize = 2;
7271
          /* Itbl support may require additional care here.  */
7272
          macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7273
                       BFD_RELOC_LO16, AT);
7274
          mips_optimize = hold_mips_optimize;
7275
          expr1.X_add_number -= 4;
7276
 
7277
          relax_switch ();
7278
          offset_expr.X_add_number = expr1.X_add_number;
7279
          if (gpdelay)
7280
            macro_build (NULL, "nop", "");
7281
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7282
                       BFD_RELOC_MIPS_GOT16, mips_gp_register);
7283
          load_delay_nop ();
7284
          if (breg != 0)
7285
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7286
          /* Itbl support may require additional care here.  */
7287
          macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7288
                       BFD_RELOC_LO16, AT);
7289
          offset_expr.X_add_number += 4;
7290
 
7291
          /* Set mips_optimize to 2 to avoid inserting an undesired
7292
             nop.  */
7293
          hold_mips_optimize = mips_optimize;
7294
          mips_optimize = 2;
7295
          /* Itbl support may require additional care here.  */
7296
          macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7297
                       BFD_RELOC_LO16, AT);
7298
          mips_optimize = hold_mips_optimize;
7299
          relax_end ();
7300
        }
7301
      else
7302
        abort ();
7303
 
7304
      break;
7305
 
7306
    case M_LD_OB:
7307
      s = "lw";
7308
      goto sd_ob;
7309
    case M_SD_OB:
7310
      s = "sw";
7311
    sd_ob:
7312
      gas_assert (HAVE_32BIT_ADDRESSES);
7313
      macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7314
      offset_expr.X_add_number += 4;
7315
      macro_build (&offset_expr, s, "t,o(b)", treg + 1, BFD_RELOC_LO16, breg);
7316
      break;
7317
 
7318
   /* New code added to support COPZ instructions.
7319
      This code builds table entries out of the macros in mip_opcodes.
7320
      R4000 uses interlocks to handle coproc delays.
7321
      Other chips (like the R3000) require nops to be inserted for delays.
7322
 
7323
      FIXME: Currently, we require that the user handle delays.
7324
      In order to fill delay slots for non-interlocked chips,
7325
      we must have a way to specify delays based on the coprocessor.
7326
      Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
7327
      What are the side-effects of the cop instruction?
7328
      What cache support might we have and what are its effects?
7329
      Both coprocessor & memory require delays. how long???
7330
      What registers are read/set/modified?
7331
 
7332
      If an itbl is provided to interpret cop instructions,
7333
      this knowledge can be encoded in the itbl spec.  */
7334
 
7335
    case M_COP0:
7336
      s = "c0";
7337
      goto copz;
7338
    case M_COP1:
7339
      s = "c1";
7340
      goto copz;
7341
    case M_COP2:
7342
      s = "c2";
7343
      goto copz;
7344
    case M_COP3:
7345
      s = "c3";
7346
    copz:
7347
      if (NO_ISA_COP (mips_opts.arch)
7348
          && (ip->insn_mo->pinfo2 & INSN2_M_FP_S) == 0)
7349
        {
7350
          as_bad (_("opcode not supported on this processor: %s"),
7351
                  mips_cpu_info_from_arch (mips_opts.arch)->name);
7352
          break;
7353
        }
7354
 
7355
      /* For now we just do C (same as Cz).  The parameter will be
7356
         stored in insn_opcode by mips_ip.  */
7357
      macro_build (NULL, s, "C", ip->insn_opcode);
7358
      break;
7359
 
7360
    case M_MOVE:
7361
      move_register (dreg, sreg);
7362
      break;
7363
 
7364
#ifdef LOSING_COMPILER
7365
    default:
7366
      /* Try and see if this is a new itbl instruction.
7367
         This code builds table entries out of the macros in mip_opcodes.
7368
         FIXME: For now we just assemble the expression and pass it's
7369
         value along as a 32-bit immediate.
7370
         We may want to have the assembler assemble this value,
7371
         so that we gain the assembler's knowledge of delay slots,
7372
         symbols, etc.
7373
         Would it be more efficient to use mask (id) here? */
7374
      if (itbl_have_entries
7375
          && (immed_expr = itbl_assemble (ip->insn_mo->name, "")))
7376
        {
7377
          s = ip->insn_mo->name;
7378
          s2 = "cop3";
7379
          coproc = ITBL_DECODE_PNUM (immed_expr);;
7380
          macro_build (&immed_expr, s, "C");
7381
          break;
7382
        }
7383
      macro2 (ip);
7384
      break;
7385
    }
7386
  if (!mips_opts.at && used_at)
7387
    as_bad (_("Macro used $at after \".set noat\""));
7388
}
7389
 
7390
static void
7391
macro2 (struct mips_cl_insn *ip)
7392
{
7393
  unsigned int treg, sreg, dreg, breg;
7394
  unsigned int tempreg;
7395
  int mask;
7396
  int used_at;
7397
  expressionS expr1;
7398
  const char *s;
7399
  const char *s2;
7400
  const char *fmt;
7401
  int likely = 0;
7402
  int dbl = 0;
7403
  int coproc = 0;
7404
  int lr = 0;
7405
  int imm = 0;
7406
  int off;
7407
  offsetT maxnum;
7408
  bfd_reloc_code_real_type r;
7409
 
7410
  treg = (ip->insn_opcode >> 16) & 0x1f;
7411
  dreg = (ip->insn_opcode >> 11) & 0x1f;
7412
  sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
7413
  mask = ip->insn_mo->mask;
7414
 
7415
  expr1.X_op = O_constant;
7416
  expr1.X_op_symbol = NULL;
7417
  expr1.X_add_symbol = NULL;
7418
  expr1.X_add_number = 1;
7419
 
7420
  switch (mask)
7421
    {
7422
#endif /* LOSING_COMPILER */
7423
 
7424
    case M_DMUL:
7425
      dbl = 1;
7426
    case M_MUL:
7427
      macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7428
      macro_build (NULL, "mflo", "d", dreg);
7429
      break;
7430
 
7431
    case M_DMUL_I:
7432
      dbl = 1;
7433
    case M_MUL_I:
7434
      /* The MIPS assembler some times generates shifts and adds.  I'm
7435
         not trying to be that fancy. GCC should do this for us
7436
         anyway.  */
7437
      used_at = 1;
7438
      load_register (AT, &imm_expr, dbl);
7439
      macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
7440
      macro_build (NULL, "mflo", "d", dreg);
7441
      break;
7442
 
7443
    case M_DMULO_I:
7444
      dbl = 1;
7445
    case M_MULO_I:
7446
      imm = 1;
7447
      goto do_mulo;
7448
 
7449
    case M_DMULO:
7450
      dbl = 1;
7451
    case M_MULO:
7452
    do_mulo:
7453
      start_noreorder ();
7454
      used_at = 1;
7455
      if (imm)
7456
        load_register (AT, &imm_expr, dbl);
7457
      macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
7458
      macro_build (NULL, "mflo", "d", dreg);
7459
      macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
7460
      macro_build (NULL, "mfhi", "d", AT);
7461
      if (mips_trap)
7462
        macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
7463
      else
7464
        {
7465
          expr1.X_add_number = 8;
7466
          macro_build (&expr1, "beq", "s,t,p", dreg, AT);
7467
          macro_build (NULL, "nop", "", 0);
7468
          macro_build (NULL, "break", "c", 6);
7469
        }
7470
      end_noreorder ();
7471
      macro_build (NULL, "mflo", "d", dreg);
7472
      break;
7473
 
7474
    case M_DMULOU_I:
7475
      dbl = 1;
7476
    case M_MULOU_I:
7477
      imm = 1;
7478
      goto do_mulou;
7479
 
7480
    case M_DMULOU:
7481
      dbl = 1;
7482
    case M_MULOU:
7483
    do_mulou:
7484
      start_noreorder ();
7485
      used_at = 1;
7486
      if (imm)
7487
        load_register (AT, &imm_expr, dbl);
7488
      macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
7489
                   sreg, imm ? AT : treg);
7490
      macro_build (NULL, "mfhi", "d", AT);
7491
      macro_build (NULL, "mflo", "d", dreg);
7492
      if (mips_trap)
7493
        macro_build (NULL, "tne", "s,t,q", AT, 0, 6);
7494
      else
7495
        {
7496
          expr1.X_add_number = 8;
7497
          macro_build (&expr1, "beq", "s,t,p", AT, 0);
7498
          macro_build (NULL, "nop", "", 0);
7499
          macro_build (NULL, "break", "c", 6);
7500
        }
7501
      end_noreorder ();
7502
      break;
7503
 
7504
    case M_DROL:
7505
      if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7506
        {
7507
          if (dreg == sreg)
7508
            {
7509
              tempreg = AT;
7510
              used_at = 1;
7511
            }
7512
          else
7513
            {
7514
              tempreg = dreg;
7515
            }
7516
          macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7517
          macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
7518
          break;
7519
        }
7520
      used_at = 1;
7521
      macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7522
      macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
7523
      macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
7524
      macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7525
      break;
7526
 
7527
    case M_ROL:
7528
      if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7529
        {
7530
          if (dreg == sreg)
7531
            {
7532
              tempreg = AT;
7533
              used_at = 1;
7534
            }
7535
          else
7536
            {
7537
              tempreg = dreg;
7538
            }
7539
          macro_build (NULL, "negu", "d,w", tempreg, treg);
7540
          macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
7541
          break;
7542
        }
7543
      used_at = 1;
7544
      macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7545
      macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
7546
      macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
7547
      macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7548
      break;
7549
 
7550
    case M_DROL_I:
7551
      {
7552
        unsigned int rot;
7553
        char *l, *r;
7554
 
7555
        if (imm_expr.X_op != O_constant)
7556
          as_bad (_("Improper rotate count"));
7557
        rot = imm_expr.X_add_number & 0x3f;
7558
        if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7559
          {
7560
            rot = (64 - rot) & 0x3f;
7561
            if (rot >= 32)
7562
              macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7563
            else
7564
              macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7565
            break;
7566
          }
7567
        if (rot == 0)
7568
          {
7569
            macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7570
            break;
7571
          }
7572
        l = (rot < 0x20) ? "dsll" : "dsll32";
7573
        r = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7574
        rot &= 0x1f;
7575
        used_at = 1;
7576
        macro_build (NULL, l, "d,w,<", AT, sreg, rot);
7577
        macro_build (NULL, r, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7578
        macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7579
      }
7580
      break;
7581
 
7582
    case M_ROL_I:
7583
      {
7584
        unsigned int rot;
7585
 
7586
        if (imm_expr.X_op != O_constant)
7587
          as_bad (_("Improper rotate count"));
7588
        rot = imm_expr.X_add_number & 0x1f;
7589
        if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7590
          {
7591
            macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
7592
            break;
7593
          }
7594
        if (rot == 0)
7595
          {
7596
            macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7597
            break;
7598
          }
7599
        used_at = 1;
7600
        macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
7601
        macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7602
        macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7603
      }
7604
      break;
7605
 
7606
    case M_DROR:
7607
      if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7608
        {
7609
          macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
7610
          break;
7611
        }
7612
      used_at = 1;
7613
      macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7614
      macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
7615
      macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
7616
      macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7617
      break;
7618
 
7619
    case M_ROR:
7620
      if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7621
        {
7622
          macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
7623
          break;
7624
        }
7625
      used_at = 1;
7626
      macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7627
      macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7628
      macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7629
      macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7630
      break;
7631
 
7632
    case M_DROR_I:
7633
      {
7634
        unsigned int rot;
7635
        char *l, *r;
7636
 
7637
        if (imm_expr.X_op != O_constant)
7638
          as_bad (_("Improper rotate count"));
7639
        rot = imm_expr.X_add_number & 0x3f;
7640
        if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7641
          {
7642
            if (rot >= 32)
7643
              macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7644
            else
7645
              macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7646
            break;
7647
          }
7648
        if (rot == 0)
7649
          {
7650
            macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7651
            break;
7652
          }
7653
        r = (rot < 0x20) ? "dsrl" : "dsrl32";
7654
        l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7655
        rot &= 0x1f;
7656
        used_at = 1;
7657
        macro_build (NULL, r, "d,w,<", AT, sreg, rot);
7658
        macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7659
        macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7660
      }
7661
      break;
7662
 
7663
    case M_ROR_I:
7664
      {
7665
        unsigned int rot;
7666
 
7667
        if (imm_expr.X_op != O_constant)
7668
          as_bad (_("Improper rotate count"));
7669
        rot = imm_expr.X_add_number & 0x1f;
7670
        if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7671
          {
7672
            macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
7673
            break;
7674
          }
7675
        if (rot == 0)
7676
          {
7677
            macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7678
            break;
7679
          }
7680
        used_at = 1;
7681
        macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7682
        macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7683
        macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7684
      }
7685
      break;
7686
 
7687
    case M_S_DOB:
7688
      gas_assert (mips_opts.isa == ISA_MIPS1);
7689
      /* Even on a big endian machine $fn comes before $fn+1.  We have
7690
         to adjust when storing to memory.  */
7691
      macro_build (&offset_expr, "swc1", "T,o(b)",
7692
                   target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7693
      offset_expr.X_add_number += 4;
7694
      macro_build (&offset_expr, "swc1", "T,o(b)",
7695
                   target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7696
      break;
7697
 
7698
    case M_SEQ:
7699
      if (sreg == 0)
7700
        macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
7701
      else if (treg == 0)
7702
        macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7703
      else
7704
        {
7705
          macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7706
          macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7707
        }
7708
      break;
7709
 
7710
    case M_SEQ_I:
7711
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7712
        {
7713
          macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7714
          break;
7715
        }
7716
      if (sreg == 0)
7717
        {
7718
          as_warn (_("Instruction %s: result is always false"),
7719
                   ip->insn_mo->name);
7720
          move_register (dreg, 0);
7721
          break;
7722
        }
7723
      if (CPU_HAS_SEQ (mips_opts.arch)
7724
          && -512 <= imm_expr.X_add_number
7725
          && imm_expr.X_add_number < 512)
7726
        {
7727
          macro_build (NULL, "seqi", "t,r,+Q", dreg, sreg,
7728
                       (int) imm_expr.X_add_number);
7729
          break;
7730
        }
7731
      if (imm_expr.X_op == O_constant
7732
          && imm_expr.X_add_number >= 0
7733
          && imm_expr.X_add_number < 0x10000)
7734
        {
7735
          macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7736
        }
7737
      else if (imm_expr.X_op == O_constant
7738
               && imm_expr.X_add_number > -0x8000
7739
               && imm_expr.X_add_number < 0)
7740
        {
7741
          imm_expr.X_add_number = -imm_expr.X_add_number;
7742
          macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7743
                       "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7744
        }
7745
      else if (CPU_HAS_SEQ (mips_opts.arch))
7746
        {
7747
          used_at = 1;
7748
          load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7749
          macro_build (NULL, "seq", "d,v,t", dreg, sreg, AT);
7750
          break;
7751
        }
7752
      else
7753
        {
7754
          load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7755
          macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7756
          used_at = 1;
7757
        }
7758
      macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7759
      break;
7760
 
7761
    case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
7762
      s = "slt";
7763
      goto sge;
7764
    case M_SGEU:
7765
      s = "sltu";
7766
    sge:
7767
      macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
7768
      macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7769
      break;
7770
 
7771
    case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
7772
    case M_SGEU_I:
7773
      if (imm_expr.X_op == O_constant
7774
          && imm_expr.X_add_number >= -0x8000
7775
          && imm_expr.X_add_number < 0x8000)
7776
        {
7777
          macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
7778
                       dreg, sreg, BFD_RELOC_LO16);
7779
        }
7780
      else
7781
        {
7782
          load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7783
          macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
7784
                       dreg, sreg, AT);
7785
          used_at = 1;
7786
        }
7787
      macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7788
      break;
7789
 
7790
    case M_SGT:         /* sreg > treg  <==>  treg < sreg */
7791
      s = "slt";
7792
      goto sgt;
7793
    case M_SGTU:
7794
      s = "sltu";
7795
    sgt:
7796
      macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7797
      break;
7798
 
7799
    case M_SGT_I:               /* sreg > I  <==>  I < sreg */
7800
      s = "slt";
7801
      goto sgti;
7802
    case M_SGTU_I:
7803
      s = "sltu";
7804
    sgti:
7805
      used_at = 1;
7806
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7807
      macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7808
      break;
7809
 
7810
    case M_SLE: /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
7811
      s = "slt";
7812
      goto sle;
7813
    case M_SLEU:
7814
      s = "sltu";
7815
    sle:
7816
      macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7817
      macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7818
      break;
7819
 
7820
    case M_SLE_I:       /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
7821
      s = "slt";
7822
      goto slei;
7823
    case M_SLEU_I:
7824
      s = "sltu";
7825
    slei:
7826
      used_at = 1;
7827
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7828
      macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7829
      macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7830
      break;
7831
 
7832
    case M_SLT_I:
7833
      if (imm_expr.X_op == O_constant
7834
          && imm_expr.X_add_number >= -0x8000
7835
          && imm_expr.X_add_number < 0x8000)
7836
        {
7837
          macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7838
          break;
7839
        }
7840
      used_at = 1;
7841
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7842
      macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
7843
      break;
7844
 
7845
    case M_SLTU_I:
7846
      if (imm_expr.X_op == O_constant
7847
          && imm_expr.X_add_number >= -0x8000
7848
          && imm_expr.X_add_number < 0x8000)
7849
        {
7850
          macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
7851
                       BFD_RELOC_LO16);
7852
          break;
7853
        }
7854
      used_at = 1;
7855
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7856
      macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
7857
      break;
7858
 
7859
    case M_SNE:
7860
      if (sreg == 0)
7861
        macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
7862
      else if (treg == 0)
7863
        macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7864
      else
7865
        {
7866
          macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7867
          macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7868
        }
7869
      break;
7870
 
7871
    case M_SNE_I:
7872
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7873
        {
7874
          macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7875
          break;
7876
        }
7877
      if (sreg == 0)
7878
        {
7879
          as_warn (_("Instruction %s: result is always true"),
7880
                   ip->insn_mo->name);
7881
          macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
7882
                       dreg, 0, BFD_RELOC_LO16);
7883
          break;
7884
        }
7885
      if (CPU_HAS_SEQ (mips_opts.arch)
7886
          && -512 <= imm_expr.X_add_number
7887
          && imm_expr.X_add_number < 512)
7888
        {
7889
          macro_build (NULL, "snei", "t,r,+Q", dreg, sreg,
7890
                       (int) imm_expr.X_add_number);
7891
          break;
7892
        }
7893
      if (imm_expr.X_op == O_constant
7894
          && imm_expr.X_add_number >= 0
7895
          && imm_expr.X_add_number < 0x10000)
7896
        {
7897
          macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7898
        }
7899
      else if (imm_expr.X_op == O_constant
7900
               && imm_expr.X_add_number > -0x8000
7901
               && imm_expr.X_add_number < 0)
7902
        {
7903
          imm_expr.X_add_number = -imm_expr.X_add_number;
7904
          macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7905
                       "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7906
        }
7907
      else if (CPU_HAS_SEQ (mips_opts.arch))
7908
        {
7909
          used_at = 1;
7910
          load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7911
          macro_build (NULL, "sne", "d,v,t", dreg, sreg, AT);
7912
          break;
7913
        }
7914
      else
7915
        {
7916
          load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7917
          macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7918
          used_at = 1;
7919
        }
7920
      macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7921
      break;
7922
 
7923
    case M_DSUB_I:
7924
      dbl = 1;
7925
    case M_SUB_I:
7926
      if (imm_expr.X_op == O_constant
7927
          && imm_expr.X_add_number > -0x8000
7928
          && imm_expr.X_add_number <= 0x8000)
7929
        {
7930
          imm_expr.X_add_number = -imm_expr.X_add_number;
7931
          macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
7932
                       dreg, sreg, BFD_RELOC_LO16);
7933
          break;
7934
        }
7935
      used_at = 1;
7936
      load_register (AT, &imm_expr, dbl);
7937
      macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
7938
      break;
7939
 
7940
    case M_DSUBU_I:
7941
      dbl = 1;
7942
    case M_SUBU_I:
7943
      if (imm_expr.X_op == O_constant
7944
          && imm_expr.X_add_number > -0x8000
7945
          && imm_expr.X_add_number <= 0x8000)
7946
        {
7947
          imm_expr.X_add_number = -imm_expr.X_add_number;
7948
          macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
7949
                       dreg, sreg, BFD_RELOC_LO16);
7950
          break;
7951
        }
7952
      used_at = 1;
7953
      load_register (AT, &imm_expr, dbl);
7954
      macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
7955
      break;
7956
 
7957
    case M_TEQ_I:
7958
      s = "teq";
7959
      goto trap;
7960
    case M_TGE_I:
7961
      s = "tge";
7962
      goto trap;
7963
    case M_TGEU_I:
7964
      s = "tgeu";
7965
      goto trap;
7966
    case M_TLT_I:
7967
      s = "tlt";
7968
      goto trap;
7969
    case M_TLTU_I:
7970
      s = "tltu";
7971
      goto trap;
7972
    case M_TNE_I:
7973
      s = "tne";
7974
    trap:
7975
      used_at = 1;
7976
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7977
      macro_build (NULL, s, "s,t", sreg, AT);
7978
      break;
7979
 
7980
    case M_TRUNCWS:
7981
    case M_TRUNCWD:
7982
      gas_assert (mips_opts.isa == ISA_MIPS1);
7983
      used_at = 1;
7984
      sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
7985
      dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
7986
 
7987
      /*
7988
       * Is the double cfc1 instruction a bug in the mips assembler;
7989
       * or is there a reason for it?
7990
       */
7991
      start_noreorder ();
7992
      macro_build (NULL, "cfc1", "t,G", treg, RA);
7993
      macro_build (NULL, "cfc1", "t,G", treg, RA);
7994
      macro_build (NULL, "nop", "");
7995
      expr1.X_add_number = 3;
7996
      macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
7997
      expr1.X_add_number = 2;
7998
      macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
7999
      macro_build (NULL, "ctc1", "t,G", AT, RA);
8000
      macro_build (NULL, "nop", "");
8001
      macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
8002
                   dreg, sreg);
8003
      macro_build (NULL, "ctc1", "t,G", treg, RA);
8004
      macro_build (NULL, "nop", "");
8005
      end_noreorder ();
8006
      break;
8007
 
8008
    case M_ULH:
8009
      s = "lb";
8010
      goto ulh;
8011
    case M_ULHU:
8012
      s = "lbu";
8013
    ulh:
8014
      used_at = 1;
8015
      if (offset_expr.X_add_number >= 0x7fff)
8016
        as_bad (_("operand overflow"));
8017
      if (! target_big_endian)
8018
        ++offset_expr.X_add_number;
8019
      macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
8020
      if (! target_big_endian)
8021
        --offset_expr.X_add_number;
8022
      else
8023
        ++offset_expr.X_add_number;
8024
      macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8025
      macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
8026
      macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8027
      break;
8028
 
8029
    case M_ULD:
8030
      s = "ldl";
8031
      s2 = "ldr";
8032
      off = 7;
8033
      goto ulw;
8034
    case M_ULW:
8035
      s = "lwl";
8036
      s2 = "lwr";
8037
      off = 3;
8038
    ulw:
8039
      if (offset_expr.X_add_number >= 0x8000 - off)
8040
        as_bad (_("operand overflow"));
8041
      if (treg != breg)
8042
        tempreg = treg;
8043
      else
8044
        {
8045
          used_at = 1;
8046
          tempreg = AT;
8047
        }
8048
      if (! target_big_endian)
8049
        offset_expr.X_add_number += off;
8050
      macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
8051
      if (! target_big_endian)
8052
        offset_expr.X_add_number -= off;
8053
      else
8054
        offset_expr.X_add_number += off;
8055
      macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
8056
 
8057
      /* If necessary, move the result in tempreg the final destination.  */
8058
      if (treg == tempreg)
8059
        break;
8060
      /* Protect second load's delay slot.  */
8061
      load_delay_nop ();
8062
      move_register (treg, tempreg);
8063
      break;
8064
 
8065
    case M_ULD_A:
8066
      s = "ldl";
8067
      s2 = "ldr";
8068
      off = 7;
8069
      goto ulwa;
8070
    case M_ULW_A:
8071
      s = "lwl";
8072
      s2 = "lwr";
8073
      off = 3;
8074
    ulwa:
8075
      used_at = 1;
8076
      load_address (AT, &offset_expr, &used_at);
8077
      if (breg != 0)
8078
        macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8079
      if (! target_big_endian)
8080
        expr1.X_add_number = off;
8081
      else
8082
        expr1.X_add_number = 0;
8083
      macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8084
      if (! target_big_endian)
8085
        expr1.X_add_number = 0;
8086
      else
8087
        expr1.X_add_number = off;
8088
      macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8089
      break;
8090
 
8091
    case M_ULH_A:
8092
    case M_ULHU_A:
8093
      used_at = 1;
8094
      load_address (AT, &offset_expr, &used_at);
8095
      if (breg != 0)
8096
        macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8097
      if (target_big_endian)
8098
        expr1.X_add_number = 0;
8099
      macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
8100
                   treg, BFD_RELOC_LO16, AT);
8101
      if (target_big_endian)
8102
        expr1.X_add_number = 1;
8103
      else
8104
        expr1.X_add_number = 0;
8105
      macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8106
      macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8107
      macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8108
      break;
8109
 
8110
    case M_USH:
8111
      used_at = 1;
8112
      if (offset_expr.X_add_number >= 0x7fff)
8113
        as_bad (_("operand overflow"));
8114
      if (target_big_endian)
8115
        ++offset_expr.X_add_number;
8116
      macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8117
      macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
8118
      if (target_big_endian)
8119
        --offset_expr.X_add_number;
8120
      else
8121
        ++offset_expr.X_add_number;
8122
      macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
8123
      break;
8124
 
8125
    case M_USD:
8126
      s = "sdl";
8127
      s2 = "sdr";
8128
      off = 7;
8129
      goto usw;
8130
    case M_USW:
8131
      s = "swl";
8132
      s2 = "swr";
8133
      off = 3;
8134
    usw:
8135
      if (offset_expr.X_add_number >= 0x8000 - off)
8136
        as_bad (_("operand overflow"));
8137
      if (! target_big_endian)
8138
        offset_expr.X_add_number += off;
8139
      macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8140
      if (! target_big_endian)
8141
        offset_expr.X_add_number -= off;
8142
      else
8143
        offset_expr.X_add_number += off;
8144
      macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8145
      break;
8146
 
8147
    case M_USD_A:
8148
      s = "sdl";
8149
      s2 = "sdr";
8150
      off = 7;
8151
      goto uswa;
8152
    case M_USW_A:
8153
      s = "swl";
8154
      s2 = "swr";
8155
      off = 3;
8156
    uswa:
8157
      used_at = 1;
8158
      load_address (AT, &offset_expr, &used_at);
8159
      if (breg != 0)
8160
        macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8161
      if (! target_big_endian)
8162
        expr1.X_add_number = off;
8163
      else
8164
        expr1.X_add_number = 0;
8165
      macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8166
      if (! target_big_endian)
8167
        expr1.X_add_number = 0;
8168
      else
8169
        expr1.X_add_number = off;
8170
      macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8171
      break;
8172
 
8173
    case M_USH_A:
8174
      used_at = 1;
8175
      load_address (AT, &offset_expr, &used_at);
8176
      if (breg != 0)
8177
        macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8178
      if (! target_big_endian)
8179
        expr1.X_add_number = 0;
8180
      macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8181
      macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
8182
      if (! target_big_endian)
8183
        expr1.X_add_number = 1;
8184
      else
8185
        expr1.X_add_number = 0;
8186
      macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8187
      if (! target_big_endian)
8188
        expr1.X_add_number = 0;
8189
      else
8190
        expr1.X_add_number = 1;
8191
      macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8192
      macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8193
      macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8194
      break;
8195
 
8196
    default:
8197
      /* FIXME: Check if this is one of the itbl macros, since they
8198
         are added dynamically.  */
8199
      as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
8200
      break;
8201
    }
8202
  if (!mips_opts.at && used_at)
8203
    as_bad (_("Macro used $at after \".set noat\""));
8204
}
8205
 
8206
/* Implement macros in mips16 mode.  */
8207
 
8208
static void
8209
mips16_macro (struct mips_cl_insn *ip)
8210
{
8211
  int mask;
8212
  int xreg, yreg, zreg, tmp;
8213
  expressionS expr1;
8214
  int dbl;
8215
  const char *s, *s2, *s3;
8216
 
8217
  mask = ip->insn_mo->mask;
8218
 
8219
  xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
8220
  yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
8221
  zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
8222
 
8223
  expr1.X_op = O_constant;
8224
  expr1.X_op_symbol = NULL;
8225
  expr1.X_add_symbol = NULL;
8226
  expr1.X_add_number = 1;
8227
 
8228
  dbl = 0;
8229
 
8230
  switch (mask)
8231
    {
8232
    default:
8233
      internalError ();
8234
 
8235
    case M_DDIV_3:
8236
      dbl = 1;
8237
    case M_DIV_3:
8238
      s = "mflo";
8239
      goto do_div3;
8240
    case M_DREM_3:
8241
      dbl = 1;
8242
    case M_REM_3:
8243
      s = "mfhi";
8244
    do_div3:
8245
      start_noreorder ();
8246
      macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
8247
      expr1.X_add_number = 2;
8248
      macro_build (&expr1, "bnez", "x,p", yreg);
8249
      macro_build (NULL, "break", "6", 7);
8250
 
8251
      /* FIXME: The normal code checks for of -1 / -0x80000000 here,
8252
         since that causes an overflow.  We should do that as well,
8253
         but I don't see how to do the comparisons without a temporary
8254
         register.  */
8255
      end_noreorder ();
8256
      macro_build (NULL, s, "x", zreg);
8257
      break;
8258
 
8259
    case M_DIVU_3:
8260
      s = "divu";
8261
      s2 = "mflo";
8262
      goto do_divu3;
8263
    case M_REMU_3:
8264
      s = "divu";
8265
      s2 = "mfhi";
8266
      goto do_divu3;
8267
    case M_DDIVU_3:
8268
      s = "ddivu";
8269
      s2 = "mflo";
8270
      goto do_divu3;
8271
    case M_DREMU_3:
8272
      s = "ddivu";
8273
      s2 = "mfhi";
8274
    do_divu3:
8275
      start_noreorder ();
8276
      macro_build (NULL, s, "0,x,y", xreg, yreg);
8277
      expr1.X_add_number = 2;
8278
      macro_build (&expr1, "bnez", "x,p", yreg);
8279
      macro_build (NULL, "break", "6", 7);
8280
      end_noreorder ();
8281
      macro_build (NULL, s2, "x", zreg);
8282
      break;
8283
 
8284
    case M_DMUL:
8285
      dbl = 1;
8286
    case M_MUL:
8287
      macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
8288
      macro_build (NULL, "mflo", "x", zreg);
8289
      break;
8290
 
8291
    case M_DSUBU_I:
8292
      dbl = 1;
8293
      goto do_subu;
8294
    case M_SUBU_I:
8295
    do_subu:
8296
      if (imm_expr.X_op != O_constant)
8297
        as_bad (_("Unsupported large constant"));
8298
      imm_expr.X_add_number = -imm_expr.X_add_number;
8299
      macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
8300
      break;
8301
 
8302
    case M_SUBU_I_2:
8303
      if (imm_expr.X_op != O_constant)
8304
        as_bad (_("Unsupported large constant"));
8305
      imm_expr.X_add_number = -imm_expr.X_add_number;
8306
      macro_build (&imm_expr, "addiu", "x,k", xreg);
8307
      break;
8308
 
8309
    case M_DSUBU_I_2:
8310
      if (imm_expr.X_op != O_constant)
8311
        as_bad (_("Unsupported large constant"));
8312
      imm_expr.X_add_number = -imm_expr.X_add_number;
8313
      macro_build (&imm_expr, "daddiu", "y,j", yreg);
8314
      break;
8315
 
8316
    case M_BEQ:
8317
      s = "cmp";
8318
      s2 = "bteqz";
8319
      goto do_branch;
8320
    case M_BNE:
8321
      s = "cmp";
8322
      s2 = "btnez";
8323
      goto do_branch;
8324
    case M_BLT:
8325
      s = "slt";
8326
      s2 = "btnez";
8327
      goto do_branch;
8328
    case M_BLTU:
8329
      s = "sltu";
8330
      s2 = "btnez";
8331
      goto do_branch;
8332
    case M_BLE:
8333
      s = "slt";
8334
      s2 = "bteqz";
8335
      goto do_reverse_branch;
8336
    case M_BLEU:
8337
      s = "sltu";
8338
      s2 = "bteqz";
8339
      goto do_reverse_branch;
8340
    case M_BGE:
8341
      s = "slt";
8342
      s2 = "bteqz";
8343
      goto do_branch;
8344
    case M_BGEU:
8345
      s = "sltu";
8346
      s2 = "bteqz";
8347
      goto do_branch;
8348
    case M_BGT:
8349
      s = "slt";
8350
      s2 = "btnez";
8351
      goto do_reverse_branch;
8352
    case M_BGTU:
8353
      s = "sltu";
8354
      s2 = "btnez";
8355
 
8356
    do_reverse_branch:
8357
      tmp = xreg;
8358
      xreg = yreg;
8359
      yreg = tmp;
8360
 
8361
    do_branch:
8362
      macro_build (NULL, s, "x,y", xreg, yreg);
8363
      macro_build (&offset_expr, s2, "p");
8364
      break;
8365
 
8366
    case M_BEQ_I:
8367
      s = "cmpi";
8368
      s2 = "bteqz";
8369
      s3 = "x,U";
8370
      goto do_branch_i;
8371
    case M_BNE_I:
8372
      s = "cmpi";
8373
      s2 = "btnez";
8374
      s3 = "x,U";
8375
      goto do_branch_i;
8376
    case M_BLT_I:
8377
      s = "slti";
8378
      s2 = "btnez";
8379
      s3 = "x,8";
8380
      goto do_branch_i;
8381
    case M_BLTU_I:
8382
      s = "sltiu";
8383
      s2 = "btnez";
8384
      s3 = "x,8";
8385
      goto do_branch_i;
8386
    case M_BLE_I:
8387
      s = "slti";
8388
      s2 = "btnez";
8389
      s3 = "x,8";
8390
      goto do_addone_branch_i;
8391
    case M_BLEU_I:
8392
      s = "sltiu";
8393
      s2 = "btnez";
8394
      s3 = "x,8";
8395
      goto do_addone_branch_i;
8396
    case M_BGE_I:
8397
      s = "slti";
8398
      s2 = "bteqz";
8399
      s3 = "x,8";
8400
      goto do_branch_i;
8401
    case M_BGEU_I:
8402
      s = "sltiu";
8403
      s2 = "bteqz";
8404
      s3 = "x,8";
8405
      goto do_branch_i;
8406
    case M_BGT_I:
8407
      s = "slti";
8408
      s2 = "bteqz";
8409
      s3 = "x,8";
8410
      goto do_addone_branch_i;
8411
    case M_BGTU_I:
8412
      s = "sltiu";
8413
      s2 = "bteqz";
8414
      s3 = "x,8";
8415
 
8416
    do_addone_branch_i:
8417
      if (imm_expr.X_op != O_constant)
8418
        as_bad (_("Unsupported large constant"));
8419
      ++imm_expr.X_add_number;
8420
 
8421
    do_branch_i:
8422
      macro_build (&imm_expr, s, s3, xreg);
8423
      macro_build (&offset_expr, s2, "p");
8424
      break;
8425
 
8426
    case M_ABS:
8427
      expr1.X_add_number = 0;
8428
      macro_build (&expr1, "slti", "x,8", yreg);
8429
      if (xreg != yreg)
8430
        move_register (xreg, yreg);
8431
      expr1.X_add_number = 2;
8432
      macro_build (&expr1, "bteqz", "p");
8433
      macro_build (NULL, "neg", "x,w", xreg, xreg);
8434
    }
8435
}
8436
 
8437
/* For consistency checking, verify that all bits are specified either
8438
   by the match/mask part of the instruction definition, or by the
8439
   operand list.  */
8440
static int
8441
validate_mips_insn (const struct mips_opcode *opc)
8442
{
8443
  const char *p = opc->args;
8444
  char c;
8445
  unsigned long used_bits = opc->mask;
8446
 
8447
  if ((used_bits & opc->match) != opc->match)
8448
    {
8449
      as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8450
              opc->name, opc->args);
8451
      return 0;
8452
    }
8453
#define USE_BITS(mask,shift)    (used_bits |= ((mask) << (shift)))
8454
  while (*p)
8455
    switch (c = *p++)
8456
      {
8457
      case ',': break;
8458
      case '(': break;
8459
      case ')': break;
8460
      case '+':
8461
        switch (c = *p++)
8462
          {
8463
          case '1': USE_BITS (OP_MASK_UDI1,     OP_SH_UDI1);    break;
8464
          case '2': USE_BITS (OP_MASK_UDI2,     OP_SH_UDI2);    break;
8465
          case '3': USE_BITS (OP_MASK_UDI3,     OP_SH_UDI3);    break;
8466
          case '4': USE_BITS (OP_MASK_UDI4,     OP_SH_UDI4);    break;
8467
          case 'A': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8468
          case 'B': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8469
          case 'C': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8470
          case 'D': USE_BITS (OP_MASK_RD,       OP_SH_RD);
8471
                    USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8472
          case 'E': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8473
          case 'F': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8474
          case 'G': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8475
          case 'H': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8476
          case 'I': break;
8477
          case 't': USE_BITS (OP_MASK_RT,       OP_SH_RT);      break;
8478
          case 'T': USE_BITS (OP_MASK_RT,       OP_SH_RT);
8479
                    USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8480
          case 'x': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
8481
          case 'X': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
8482
          case 'p': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
8483
          case 'P': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
8484
          case 'Q': USE_BITS (OP_MASK_SEQI,     OP_SH_SEQI);    break;
8485
          case 's': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
8486
          case 'S': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
8487
 
8488
          default:
8489
            as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8490
                    c, opc->name, opc->args);
8491
            return 0;
8492
          }
8493
        break;
8494
      case '<': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8495
      case '>': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8496
      case 'A': break;
8497
      case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
8498
      case 'C': USE_BITS (OP_MASK_COPZ,         OP_SH_COPZ);    break;
8499
      case 'D': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8500
      case 'E': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8501
      case 'F': break;
8502
      case 'G': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8503
      case 'H': USE_BITS (OP_MASK_SEL,          OP_SH_SEL);     break;
8504
      case 'I': break;
8505
      case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
8506
      case 'K': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8507
      case 'L': break;
8508
      case 'M': USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
8509
      case 'N': USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
8510
      case 'O': USE_BITS (OP_MASK_ALN,          OP_SH_ALN);     break;
8511
      case 'Q': USE_BITS (OP_MASK_VSEL,         OP_SH_VSEL);
8512
                USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8513
      case 'R': USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
8514
      case 'S': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8515
      case 'T': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8516
      case 'V': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8517
      case 'W': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8518
      case 'X': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8519
      case 'Y': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8520
      case 'Z': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8521
      case 'a': USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
8522
      case 'b': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8523
      case 'c': USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
8524
      case 'd': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8525
      case 'f': break;
8526
      case 'h': USE_BITS (OP_MASK_PREFX,        OP_SH_PREFX);   break;
8527
      case 'i': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8528
      case 'j': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8529
      case 'k': USE_BITS (OP_MASK_CACHE,        OP_SH_CACHE);   break;
8530
      case 'l': break;
8531
      case 'o': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8532
      case 'p': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8533
      case 'q': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
8534
      case 'r': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8535
      case 's': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8536
      case 't': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8537
      case 'u': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8538
      case 'v': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8539
      case 'w': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8540
      case 'x': break;
8541
      case 'z': break;
8542
      case 'P': USE_BITS (OP_MASK_PERFREG,      OP_SH_PERFREG); break;
8543
      case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
8544
                USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8545
      case 'e': USE_BITS (OP_MASK_VECBYTE,      OP_SH_VECBYTE); break;
8546
      case '%': USE_BITS (OP_MASK_VECALIGN,     OP_SH_VECALIGN); break;
8547
      case '[': break;
8548
      case ']': break;
8549
      case '1': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8550
      case '2': USE_BITS (OP_MASK_BP,           OP_SH_BP);      break;
8551
      case '3': USE_BITS (OP_MASK_SA3,          OP_SH_SA3);     break;
8552
      case '4': USE_BITS (OP_MASK_SA4,          OP_SH_SA4);     break;
8553
      case '5': USE_BITS (OP_MASK_IMM8,         OP_SH_IMM8);    break;
8554
      case '6': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8555
      case '7': USE_BITS (OP_MASK_DSPACC,       OP_SH_DSPACC);  break;
8556
      case '8': USE_BITS (OP_MASK_WRDSP,        OP_SH_WRDSP);   break;
8557
      case '9': USE_BITS (OP_MASK_DSPACC_S,     OP_SH_DSPACC_S);break;
8558
      case '0': USE_BITS (OP_MASK_DSPSFT,       OP_SH_DSPSFT);  break;
8559
      case '\'': USE_BITS (OP_MASK_RDDSP,       OP_SH_RDDSP);   break;
8560
      case ':': USE_BITS (OP_MASK_DSPSFT_7,     OP_SH_DSPSFT_7);break;
8561
      case '@': USE_BITS (OP_MASK_IMM10,        OP_SH_IMM10);   break;
8562
      case '!': USE_BITS (OP_MASK_MT_U,         OP_SH_MT_U);    break;
8563
      case '$': USE_BITS (OP_MASK_MT_H,         OP_SH_MT_H);    break;
8564
      case '*': USE_BITS (OP_MASK_MTACC_T,      OP_SH_MTACC_T); break;
8565
      case '&': USE_BITS (OP_MASK_MTACC_D,      OP_SH_MTACC_D); break;
8566
      case 'g': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8567
      default:
8568
        as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8569
                c, opc->name, opc->args);
8570
        return 0;
8571
      }
8572
#undef USE_BITS
8573
  if (used_bits != 0xffffffff)
8574
    {
8575
      as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8576
              ~used_bits & 0xffffffff, opc->name, opc->args);
8577
      return 0;
8578
    }
8579
  return 1;
8580
}
8581
 
8582
/* UDI immediates.  */
8583
struct mips_immed {
8584
  char          type;
8585
  unsigned int  shift;
8586
  unsigned long mask;
8587
  const char *  desc;
8588
};
8589
 
8590
static const struct mips_immed mips_immed[] = {
8591
  { '1',        OP_SH_UDI1,     OP_MASK_UDI1,           0},
8592
  { '2',        OP_SH_UDI2,     OP_MASK_UDI2,           0},
8593
  { '3',        OP_SH_UDI3,     OP_MASK_UDI3,           0},
8594
  { '4',        OP_SH_UDI4,     OP_MASK_UDI4,           0},
8595
  { 0,0,0,0 }
8596
};
8597
 
8598
/* Check whether an odd floating-point register is allowed.  */
8599
static int
8600
mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
8601
{
8602
  const char *s = insn->name;
8603
 
8604
  if (insn->pinfo == INSN_MACRO)
8605
    /* Let a macro pass, we'll catch it later when it is expanded.  */
8606
    return 1;
8607
 
8608
  if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
8609
    {
8610
      /* Allow odd registers for single-precision ops.  */
8611
      switch (insn->pinfo & (FP_S | FP_D))
8612
        {
8613
        case FP_S:
8614
        case 0:
8615
          return 1;     /* both single precision - ok */
8616
        case FP_D:
8617
          return 0;      /* both double precision - fail */
8618
        default:
8619
          break;
8620
        }
8621
 
8622
      /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand.  */
8623
      s = strchr (insn->name, '.');
8624
      if (argnum == 2)
8625
        s = s != NULL ? strchr (s + 1, '.') : NULL;
8626
      return (s != NULL && (s[1] == 'w' || s[1] == 's'));
8627
    }
8628
 
8629
  /* Single-precision coprocessor loads and moves are OK too.  */
8630
  if ((insn->pinfo & FP_S)
8631
      && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
8632
                         | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
8633
    return 1;
8634
 
8635
  return 0;
8636
}
8637
 
8638
/* This routine assembles an instruction into its binary format.  As a
8639
   side effect, it sets one of the global variables imm_reloc or
8640
   offset_reloc to the type of relocation to do if one of the operands
8641
   is an address expression.  */
8642
 
8643
static void
8644
mips_ip (char *str, struct mips_cl_insn *ip)
8645
{
8646
  char *s;
8647
  const char *args;
8648
  char c = 0;
8649
  struct mips_opcode *insn;
8650
  char *argsStart;
8651
  unsigned int regno;
8652
  unsigned int lastregno = 0;
8653
  unsigned int lastpos = 0;
8654
  unsigned int limlo, limhi;
8655
  char *s_reset;
8656
  char save_c = 0;
8657
  offsetT min_range, max_range;
8658
  int argnum;
8659
  unsigned int rtype;
8660
 
8661
  insn_error = NULL;
8662
 
8663
  /* If the instruction contains a '.', we first try to match an instruction
8664
     including the '.'.  Then we try again without the '.'.  */
8665
  insn = NULL;
8666
  for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8667
    continue;
8668
 
8669
  /* If we stopped on whitespace, then replace the whitespace with null for
8670
     the call to hash_find.  Save the character we replaced just in case we
8671
     have to re-parse the instruction.  */
8672
  if (ISSPACE (*s))
8673
    {
8674
      save_c = *s;
8675
      *s++ = '\0';
8676
    }
8677
 
8678
  insn = (struct mips_opcode *) hash_find (op_hash, str);
8679
 
8680
  /* If we didn't find the instruction in the opcode table, try again, but
8681
     this time with just the instruction up to, but not including the
8682
     first '.'.  */
8683
  if (insn == NULL)
8684
    {
8685
      /* Restore the character we overwrite above (if any).  */
8686
      if (save_c)
8687
        *(--s) = save_c;
8688
 
8689
      /* Scan up to the first '.' or whitespace.  */
8690
      for (s = str;
8691
           *s != '\0' && *s != '.' && !ISSPACE (*s);
8692
           ++s)
8693
        continue;
8694
 
8695
      /* If we did not find a '.', then we can quit now.  */
8696
      if (*s != '.')
8697
        {
8698
          insn_error = _("unrecognized opcode");
8699
          return;
8700
        }
8701
 
8702
      /* Lookup the instruction in the hash table.  */
8703
      *s++ = '\0';
8704
      if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8705
        {
8706
          insn_error = _("unrecognized opcode");
8707
          return;
8708
        }
8709
    }
8710
 
8711
  argsStart = s;
8712
  for (;;)
8713
    {
8714
      bfd_boolean ok;
8715
 
8716
      gas_assert (strcmp (insn->name, str) == 0);
8717
 
8718
      ok = is_opcode_valid (insn, FALSE);
8719
      if (! ok)
8720
        {
8721
          if (insn + 1 < &mips_opcodes[NUMOPCODES]
8722
              && strcmp (insn->name, insn[1].name) == 0)
8723
            {
8724
              ++insn;
8725
              continue;
8726
            }
8727
          else
8728
            {
8729
              if (!insn_error)
8730
                {
8731
                  static char buf[100];
8732
                  sprintf (buf,
8733
                           _("opcode not supported on this processor: %s (%s)"),
8734
                           mips_cpu_info_from_arch (mips_opts.arch)->name,
8735
                           mips_cpu_info_from_isa (mips_opts.isa)->name);
8736
                  insn_error = buf;
8737
                }
8738
              if (save_c)
8739
                *(--s) = save_c;
8740
              return;
8741
            }
8742
        }
8743
 
8744
      create_insn (ip, insn);
8745
      insn_error = NULL;
8746
      argnum = 1;
8747
      lastregno = 0xffffffff;
8748
      for (args = insn->args;; ++args)
8749
        {
8750
          int is_mdmx;
8751
 
8752
          s += strspn (s, " \t");
8753
          is_mdmx = 0;
8754
          switch (*args)
8755
            {
8756
            case '\0':          /* end of args */
8757
              if (*s == '\0')
8758
                return;
8759
              break;
8760
 
8761
            case '2': /* dsp 2-bit unsigned immediate in bit 11 */
8762
              my_getExpression (&imm_expr, s);
8763
              check_absolute_expr (ip, &imm_expr);
8764
              if ((unsigned long) imm_expr.X_add_number != 1
8765
                  && (unsigned long) imm_expr.X_add_number != 3)
8766
                {
8767
                  as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
8768
                          (unsigned long) imm_expr.X_add_number);
8769
                }
8770
              INSERT_OPERAND (BP, *ip, imm_expr.X_add_number);
8771
              imm_expr.X_op = O_absent;
8772
              s = expr_end;
8773
              continue;
8774
 
8775
            case '3': /* dsp 3-bit unsigned immediate in bit 21 */
8776
              my_getExpression (&imm_expr, s);
8777
              check_absolute_expr (ip, &imm_expr);
8778
              if (imm_expr.X_add_number & ~OP_MASK_SA3)
8779
                {
8780
                  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8781
                          OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
8782
                }
8783
              INSERT_OPERAND (SA3, *ip, imm_expr.X_add_number);
8784
              imm_expr.X_op = O_absent;
8785
              s = expr_end;
8786
              continue;
8787
 
8788
            case '4': /* dsp 4-bit unsigned immediate in bit 21 */
8789
              my_getExpression (&imm_expr, s);
8790
              check_absolute_expr (ip, &imm_expr);
8791
              if (imm_expr.X_add_number & ~OP_MASK_SA4)
8792
                {
8793
                  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8794
                          OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
8795
                }
8796
              INSERT_OPERAND (SA4, *ip, imm_expr.X_add_number);
8797
              imm_expr.X_op = O_absent;
8798
              s = expr_end;
8799
              continue;
8800
 
8801
            case '5': /* dsp 8-bit unsigned immediate in bit 16 */
8802
              my_getExpression (&imm_expr, s);
8803
              check_absolute_expr (ip, &imm_expr);
8804
              if (imm_expr.X_add_number & ~OP_MASK_IMM8)
8805
                {
8806
                  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8807
                          OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
8808
                }
8809
              INSERT_OPERAND (IMM8, *ip, imm_expr.X_add_number);
8810
              imm_expr.X_op = O_absent;
8811
              s = expr_end;
8812
              continue;
8813
 
8814
            case '6': /* dsp 5-bit unsigned immediate in bit 21 */
8815
              my_getExpression (&imm_expr, s);
8816
              check_absolute_expr (ip, &imm_expr);
8817
              if (imm_expr.X_add_number & ~OP_MASK_RS)
8818
                {
8819
                  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8820
                          OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
8821
                }
8822
              INSERT_OPERAND (RS, *ip, imm_expr.X_add_number);
8823
              imm_expr.X_op = O_absent;
8824
              s = expr_end;
8825
              continue;
8826
 
8827
            case '7': /* four dsp accumulators in bits 11,12 */
8828
              if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8829
                  s[3] >= '0' && s[3] <= '3')
8830
                {
8831
                  regno = s[3] - '0';
8832
                  s += 4;
8833
                  INSERT_OPERAND (DSPACC, *ip, regno);
8834
                  continue;
8835
                }
8836
              else
8837
                as_bad (_("Invalid dsp acc register"));
8838
              break;
8839
 
8840
            case '8': /* dsp 6-bit unsigned immediate in bit 11 */
8841
              my_getExpression (&imm_expr, s);
8842
              check_absolute_expr (ip, &imm_expr);
8843
              if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
8844
                {
8845
                  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8846
                          OP_MASK_WRDSP,
8847
                          (unsigned long) imm_expr.X_add_number);
8848
                }
8849
              INSERT_OPERAND (WRDSP, *ip, imm_expr.X_add_number);
8850
              imm_expr.X_op = O_absent;
8851
              s = expr_end;
8852
              continue;
8853
 
8854
            case '9': /* four dsp accumulators in bits 21,22 */
8855
              if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8856
                  s[3] >= '0' && s[3] <= '3')
8857
                {
8858
                  regno = s[3] - '0';
8859
                  s += 4;
8860
                  INSERT_OPERAND (DSPACC_S, *ip, regno);
8861
                  continue;
8862
                }
8863
              else
8864
                as_bad (_("Invalid dsp acc register"));
8865
              break;
8866
 
8867
            case '0': /* dsp 6-bit signed immediate in bit 20 */
8868
              my_getExpression (&imm_expr, s);
8869
              check_absolute_expr (ip, &imm_expr);
8870
              min_range = -((OP_MASK_DSPSFT + 1) >> 1);
8871
              max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
8872
              if (imm_expr.X_add_number < min_range ||
8873
                  imm_expr.X_add_number > max_range)
8874
                {
8875
                  as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8876
                          (long) min_range, (long) max_range,
8877
                          (long) imm_expr.X_add_number);
8878
                }
8879
              INSERT_OPERAND (DSPSFT, *ip, imm_expr.X_add_number);
8880
              imm_expr.X_op = O_absent;
8881
              s = expr_end;
8882
              continue;
8883
 
8884
            case '\'': /* dsp 6-bit unsigned immediate in bit 16 */
8885
              my_getExpression (&imm_expr, s);
8886
              check_absolute_expr (ip, &imm_expr);
8887
              if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
8888
                {
8889
                  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8890
                          OP_MASK_RDDSP,
8891
                          (unsigned long) imm_expr.X_add_number);
8892
                }
8893
              INSERT_OPERAND (RDDSP, *ip, imm_expr.X_add_number);
8894
              imm_expr.X_op = O_absent;
8895
              s = expr_end;
8896
              continue;
8897
 
8898
            case ':': /* dsp 7-bit signed immediate in bit 19 */
8899
              my_getExpression (&imm_expr, s);
8900
              check_absolute_expr (ip, &imm_expr);
8901
              min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
8902
              max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
8903
              if (imm_expr.X_add_number < min_range ||
8904
                  imm_expr.X_add_number > max_range)
8905
                {
8906
                  as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8907
                          (long) min_range, (long) max_range,
8908
                          (long) imm_expr.X_add_number);
8909
                }
8910
              INSERT_OPERAND (DSPSFT_7, *ip, imm_expr.X_add_number);
8911
              imm_expr.X_op = O_absent;
8912
              s = expr_end;
8913
              continue;
8914
 
8915
            case '@': /* dsp 10-bit signed immediate in bit 16 */
8916
              my_getExpression (&imm_expr, s);
8917
              check_absolute_expr (ip, &imm_expr);
8918
              min_range = -((OP_MASK_IMM10 + 1) >> 1);
8919
              max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
8920
              if (imm_expr.X_add_number < min_range ||
8921
                  imm_expr.X_add_number > max_range)
8922
                {
8923
                  as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8924
                          (long) min_range, (long) max_range,
8925
                          (long) imm_expr.X_add_number);
8926
                }
8927
              INSERT_OPERAND (IMM10, *ip, imm_expr.X_add_number);
8928
              imm_expr.X_op = O_absent;
8929
              s = expr_end;
8930
              continue;
8931
 
8932
            case '!': /* MT usermode flag bit.  */
8933
              my_getExpression (&imm_expr, s);
8934
              check_absolute_expr (ip, &imm_expr);
8935
              if (imm_expr.X_add_number & ~OP_MASK_MT_U)
8936
                as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
8937
                        (unsigned long) imm_expr.X_add_number);
8938
              INSERT_OPERAND (MT_U, *ip, imm_expr.X_add_number);
8939
              imm_expr.X_op = O_absent;
8940
              s = expr_end;
8941
              continue;
8942
 
8943
            case '$': /* MT load high flag bit.  */
8944
              my_getExpression (&imm_expr, s);
8945
              check_absolute_expr (ip, &imm_expr);
8946
              if (imm_expr.X_add_number & ~OP_MASK_MT_H)
8947
                as_bad (_("MT load high bit not 0 or 1 (%lu)"),
8948
                        (unsigned long) imm_expr.X_add_number);
8949
              INSERT_OPERAND (MT_H, *ip, imm_expr.X_add_number);
8950
              imm_expr.X_op = O_absent;
8951
              s = expr_end;
8952
              continue;
8953
 
8954
            case '*': /* four dsp accumulators in bits 18,19 */
8955
              if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8956
                  s[3] >= '0' && s[3] <= '3')
8957
                {
8958
                  regno = s[3] - '0';
8959
                  s += 4;
8960
                  INSERT_OPERAND (MTACC_T, *ip, regno);
8961
                  continue;
8962
                }
8963
              else
8964
                as_bad (_("Invalid dsp/smartmips acc register"));
8965
              break;
8966
 
8967
            case '&': /* four dsp accumulators in bits 13,14 */
8968
              if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8969
                  s[3] >= '0' && s[3] <= '3')
8970
                {
8971
                  regno = s[3] - '0';
8972
                  s += 4;
8973
                  INSERT_OPERAND (MTACC_D, *ip, regno);
8974
                  continue;
8975
                }
8976
              else
8977
                as_bad (_("Invalid dsp/smartmips acc register"));
8978
              break;
8979
 
8980
            case ',':
8981
              ++argnum;
8982
              if (*s++ == *args)
8983
                continue;
8984
              s--;
8985
              switch (*++args)
8986
                {
8987
                case 'r':
8988
                case 'v':
8989
                  INSERT_OPERAND (RS, *ip, lastregno);
8990
                  continue;
8991
 
8992
                case 'w':
8993
                  INSERT_OPERAND (RT, *ip, lastregno);
8994
                  continue;
8995
 
8996
                case 'W':
8997
                  INSERT_OPERAND (FT, *ip, lastregno);
8998
                  continue;
8999
 
9000
                case 'V':
9001
                  INSERT_OPERAND (FS, *ip, lastregno);
9002
                  continue;
9003
                }
9004
              break;
9005
 
9006
            case '(':
9007
              /* Handle optional base register.
9008
                 Either the base register is omitted or
9009
                 we must have a left paren.  */
9010
              /* This is dependent on the next operand specifier
9011
                 is a base register specification.  */
9012
              gas_assert (args[1] == 'b' || args[1] == '5'
9013
                      || args[1] == '-' || args[1] == '4');
9014
              if (*s == '\0')
9015
                return;
9016
 
9017
            case ')':           /* these must match exactly */
9018
            case '[':
9019
            case ']':
9020
              if (*s++ == *args)
9021
                continue;
9022
              break;
9023
 
9024
            case '+':           /* Opcode extension character.  */
9025
              switch (*++args)
9026
                {
9027
                case '1':       /* UDI immediates.  */
9028
                case '2':
9029
                case '3':
9030
                case '4':
9031
                  {
9032
                    const struct mips_immed *imm = mips_immed;
9033
 
9034
                    while (imm->type && imm->type != *args)
9035
                      ++imm;
9036
                    if (! imm->type)
9037
                      internalError ();
9038
                    my_getExpression (&imm_expr, s);
9039
                    check_absolute_expr (ip, &imm_expr);
9040
                    if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
9041
                      {
9042
                        as_warn (_("Illegal %s number (%lu, 0x%lx)"),
9043
                                 imm->desc ? imm->desc : ip->insn_mo->name,
9044
                                 (unsigned long) imm_expr.X_add_number,
9045
                                 (unsigned long) imm_expr.X_add_number);
9046
                              imm_expr.X_add_number &= imm->mask;
9047
                      }
9048
                    ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
9049
                                        << imm->shift);
9050
                    imm_expr.X_op = O_absent;
9051
                    s = expr_end;
9052
                  }
9053
                  continue;
9054
 
9055
                case 'A':               /* ins/ext position, becomes LSB.  */
9056
                  limlo = 0;
9057
                  limhi = 31;
9058
                  goto do_lsb;
9059
                case 'E':
9060
                  limlo = 32;
9061
                  limhi = 63;
9062
                  goto do_lsb;
9063
do_lsb:
9064
                  my_getExpression (&imm_expr, s);
9065
                  check_absolute_expr (ip, &imm_expr);
9066
                  if ((unsigned long) imm_expr.X_add_number < limlo
9067
                      || (unsigned long) imm_expr.X_add_number > limhi)
9068
                    {
9069
                      as_bad (_("Improper position (%lu)"),
9070
                              (unsigned long) imm_expr.X_add_number);
9071
                      imm_expr.X_add_number = limlo;
9072
                    }
9073
                  lastpos = imm_expr.X_add_number;
9074
                  INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9075
                  imm_expr.X_op = O_absent;
9076
                  s = expr_end;
9077
                  continue;
9078
 
9079
                case 'B':               /* ins size, becomes MSB.  */
9080
                  limlo = 1;
9081
                  limhi = 32;
9082
                  goto do_msb;
9083
                case 'F':
9084
                  limlo = 33;
9085
                  limhi = 64;
9086
                  goto do_msb;
9087
do_msb:
9088
                  my_getExpression (&imm_expr, s);
9089
                  check_absolute_expr (ip, &imm_expr);
9090
                  /* Check for negative input so that small negative numbers
9091
                     will not succeed incorrectly.  The checks against
9092
                     (pos+size) transitively check "size" itself,
9093
                     assuming that "pos" is reasonable.  */
9094
                  if ((long) imm_expr.X_add_number < 0
9095
                      || ((unsigned long) imm_expr.X_add_number
9096
                          + lastpos) < limlo
9097
                      || ((unsigned long) imm_expr.X_add_number
9098
                          + lastpos) > limhi)
9099
                    {
9100
                      as_bad (_("Improper insert size (%lu, position %lu)"),
9101
                              (unsigned long) imm_expr.X_add_number,
9102
                              (unsigned long) lastpos);
9103
                      imm_expr.X_add_number = limlo - lastpos;
9104
                    }
9105
                  INSERT_OPERAND (INSMSB, *ip,
9106
                                 lastpos + imm_expr.X_add_number - 1);
9107
                  imm_expr.X_op = O_absent;
9108
                  s = expr_end;
9109
                  continue;
9110
 
9111
                case 'C':               /* ext size, becomes MSBD.  */
9112
                  limlo = 1;
9113
                  limhi = 32;
9114
                  goto do_msbd;
9115
                case 'G':
9116
                  limlo = 33;
9117
                  limhi = 64;
9118
                  goto do_msbd;
9119
                case 'H':
9120
                  limlo = 33;
9121
                  limhi = 64;
9122
                  goto do_msbd;
9123
do_msbd:
9124
                  my_getExpression (&imm_expr, s);
9125
                  check_absolute_expr (ip, &imm_expr);
9126
                  /* Check for negative input so that small negative numbers
9127
                     will not succeed incorrectly.  The checks against
9128
                     (pos+size) transitively check "size" itself,
9129
                     assuming that "pos" is reasonable.  */
9130
                  if ((long) imm_expr.X_add_number < 0
9131
                      || ((unsigned long) imm_expr.X_add_number
9132
                          + lastpos) < limlo
9133
                      || ((unsigned long) imm_expr.X_add_number
9134
                          + lastpos) > limhi)
9135
                    {
9136
                      as_bad (_("Improper extract size (%lu, position %lu)"),
9137
                              (unsigned long) imm_expr.X_add_number,
9138
                              (unsigned long) lastpos);
9139
                      imm_expr.X_add_number = limlo - lastpos;
9140
                    }
9141
                  INSERT_OPERAND (EXTMSBD, *ip, imm_expr.X_add_number - 1);
9142
                  imm_expr.X_op = O_absent;
9143
                  s = expr_end;
9144
                  continue;
9145
 
9146
                case 'D':
9147
                  /* +D is for disassembly only; never match.  */
9148
                  break;
9149
 
9150
                case 'I':
9151
                  /* "+I" is like "I", except that imm2_expr is used.  */
9152
                  my_getExpression (&imm2_expr, s);
9153
                  if (imm2_expr.X_op != O_big
9154
                      && imm2_expr.X_op != O_constant)
9155
                  insn_error = _("absolute expression required");
9156
                  if (HAVE_32BIT_GPRS)
9157
                    normalize_constant_expr (&imm2_expr);
9158
                  s = expr_end;
9159
                  continue;
9160
 
9161
                case 'T': /* Coprocessor register.  */
9162
                  /* +T is for disassembly only; never match.  */
9163
                  break;
9164
 
9165
                case 't': /* Coprocessor register number.  */
9166
                  if (s[0] == '$' && ISDIGIT (s[1]))
9167
                    {
9168
                      ++s;
9169
                      regno = 0;
9170
                      do
9171
                        {
9172
                          regno *= 10;
9173
                          regno += *s - '0';
9174
                          ++s;
9175
                        }
9176
                      while (ISDIGIT (*s));
9177
                      if (regno > 31)
9178
                        as_bad (_("Invalid register number (%d)"), regno);
9179
                      else
9180
                        {
9181
                          INSERT_OPERAND (RT, *ip, regno);
9182
                          continue;
9183
                        }
9184
                    }
9185
                  else
9186
                    as_bad (_("Invalid coprocessor 0 register number"));
9187
                  break;
9188
 
9189
                case 'x':
9190
                  /* bbit[01] and bbit[01]32 bit index.  Give error if index
9191
                     is not in the valid range.  */
9192
                  my_getExpression (&imm_expr, s);
9193
                  check_absolute_expr (ip, &imm_expr);
9194
                  if ((unsigned) imm_expr.X_add_number > 31)
9195
                    {
9196
                      as_bad (_("Improper bit index (%lu)"),
9197
                              (unsigned long) imm_expr.X_add_number);
9198
                      imm_expr.X_add_number = 0;
9199
                    }
9200
                  INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number);
9201
                  imm_expr.X_op = O_absent;
9202
                  s = expr_end;
9203
                  continue;
9204
 
9205
                case 'X':
9206
                  /* bbit[01] bit index when bbit is used but we generate
9207
                     bbit[01]32 because the index is over 32.  Move to the
9208
                     next candidate if index is not in the valid range.  */
9209
                  my_getExpression (&imm_expr, s);
9210
                  check_absolute_expr (ip, &imm_expr);
9211
                  if ((unsigned) imm_expr.X_add_number < 32
9212
                      || (unsigned) imm_expr.X_add_number > 63)
9213
                    break;
9214
                  INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number - 32);
9215
                  imm_expr.X_op = O_absent;
9216
                  s = expr_end;
9217
                  continue;
9218
 
9219
                case 'p':
9220
                  /* cins, cins32, exts and exts32 position field.  Give error
9221
                     if it's not in the valid range.  */
9222
                  my_getExpression (&imm_expr, s);
9223
                  check_absolute_expr (ip, &imm_expr);
9224
                  if ((unsigned) imm_expr.X_add_number > 31)
9225
                    {
9226
                      as_bad (_("Improper position (%lu)"),
9227
                              (unsigned long) imm_expr.X_add_number);
9228
                      imm_expr.X_add_number = 0;
9229
                    }
9230
                  /* Make the pos explicit to simplify +S.  */
9231
                  lastpos = imm_expr.X_add_number + 32;
9232
                  INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number);
9233
                  imm_expr.X_op = O_absent;
9234
                  s = expr_end;
9235
                  continue;
9236
 
9237
                case 'P':
9238
                  /* cins, cins32, exts and exts32 position field.  Move to
9239
                     the next candidate if it's not in the valid range.  */
9240
                  my_getExpression (&imm_expr, s);
9241
                  check_absolute_expr (ip, &imm_expr);
9242
                  if ((unsigned) imm_expr.X_add_number < 32
9243
                      || (unsigned) imm_expr.X_add_number > 63)
9244
                    break;
9245
                  lastpos = imm_expr.X_add_number;
9246
                  INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number - 32);
9247
                  imm_expr.X_op = O_absent;
9248
                  s = expr_end;
9249
                  continue;
9250
 
9251
                case 's':
9252
                  /* cins and exts length-minus-one field.  */
9253
                  my_getExpression (&imm_expr, s);
9254
                  check_absolute_expr (ip, &imm_expr);
9255
                  if ((unsigned long) imm_expr.X_add_number > 31)
9256
                    {
9257
                      as_bad (_("Improper size (%lu)"),
9258
                              (unsigned long) imm_expr.X_add_number);
9259
                      imm_expr.X_add_number = 0;
9260
                    }
9261
                  INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9262
                  imm_expr.X_op = O_absent;
9263
                  s = expr_end;
9264
                  continue;
9265
 
9266
                case 'S':
9267
                  /* cins32/exts32 and cins/exts aliasing cint32/exts32
9268
                     length-minus-one field.  */
9269
                  my_getExpression (&imm_expr, s);
9270
                  check_absolute_expr (ip, &imm_expr);
9271
                  if ((long) imm_expr.X_add_number < 0
9272
                      || (unsigned long) imm_expr.X_add_number + lastpos > 63)
9273
                    {
9274
                      as_bad (_("Improper size (%lu)"),
9275
                              (unsigned long) imm_expr.X_add_number);
9276
                      imm_expr.X_add_number = 0;
9277
                    }
9278
                  INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9279
                  imm_expr.X_op = O_absent;
9280
                  s = expr_end;
9281
                  continue;
9282
 
9283
                case 'Q':
9284
                  /* seqi/snei immediate field.  */
9285
                  my_getExpression (&imm_expr, s);
9286
                  check_absolute_expr (ip, &imm_expr);
9287
                  if ((long) imm_expr.X_add_number < -512
9288
                      || (long) imm_expr.X_add_number >= 512)
9289
                    {
9290
                      as_bad (_("Improper immediate (%ld)"),
9291
                               (long) imm_expr.X_add_number);
9292
                      imm_expr.X_add_number = 0;
9293
                    }
9294
                  INSERT_OPERAND (SEQI, *ip, imm_expr.X_add_number);
9295
                  imm_expr.X_op = O_absent;
9296
                  s = expr_end;
9297
                  continue;
9298
 
9299
                default:
9300
                  as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
9301
                    *args, insn->name, insn->args);
9302
                  /* Further processing is fruitless.  */
9303
                  return;
9304
                }
9305
              break;
9306
 
9307
            case '<':           /* must be at least one digit */
9308
              /*
9309
               * According to the manual, if the shift amount is greater
9310
               * than 31 or less than 0, then the shift amount should be
9311
               * mod 32.  In reality the mips assembler issues an error.
9312
               * We issue a warning and mask out all but the low 5 bits.
9313
               */
9314
              my_getExpression (&imm_expr, s);
9315
              check_absolute_expr (ip, &imm_expr);
9316
              if ((unsigned long) imm_expr.X_add_number > 31)
9317
                as_warn (_("Improper shift amount (%lu)"),
9318
                         (unsigned long) imm_expr.X_add_number);
9319
              INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9320
              imm_expr.X_op = O_absent;
9321
              s = expr_end;
9322
              continue;
9323
 
9324
            case '>':           /* shift amount minus 32 */
9325
              my_getExpression (&imm_expr, s);
9326
              check_absolute_expr (ip, &imm_expr);
9327
              if ((unsigned long) imm_expr.X_add_number < 32
9328
                  || (unsigned long) imm_expr.X_add_number > 63)
9329
                break;
9330
              INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number - 32);
9331
              imm_expr.X_op = O_absent;
9332
              s = expr_end;
9333
              continue;
9334
 
9335
            case 'k':           /* cache code */
9336
            case 'h':           /* prefx code */
9337
            case '1':           /* sync type */
9338
              my_getExpression (&imm_expr, s);
9339
              check_absolute_expr (ip, &imm_expr);
9340
              if ((unsigned long) imm_expr.X_add_number > 31)
9341
                as_warn (_("Invalid value for `%s' (%lu)"),
9342
                         ip->insn_mo->name,
9343
                         (unsigned long) imm_expr.X_add_number);
9344
              if (*args == 'k')
9345
                INSERT_OPERAND (CACHE, *ip, imm_expr.X_add_number);
9346
              else if (*args == 'h')
9347
                INSERT_OPERAND (PREFX, *ip, imm_expr.X_add_number);
9348
              else
9349
                INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9350
              imm_expr.X_op = O_absent;
9351
              s = expr_end;
9352
              continue;
9353
 
9354
            case 'c':           /* break code */
9355
              my_getExpression (&imm_expr, s);
9356
              check_absolute_expr (ip, &imm_expr);
9357
              if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE)
9358
                as_warn (_("Code for %s not in range 0..1023 (%lu)"),
9359
                         ip->insn_mo->name,
9360
                         (unsigned long) imm_expr.X_add_number);
9361
              INSERT_OPERAND (CODE, *ip, imm_expr.X_add_number);
9362
              imm_expr.X_op = O_absent;
9363
              s = expr_end;
9364
              continue;
9365
 
9366
            case 'q':           /* lower break code */
9367
              my_getExpression (&imm_expr, s);
9368
              check_absolute_expr (ip, &imm_expr);
9369
              if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE2)
9370
                as_warn (_("Lower code for %s not in range 0..1023 (%lu)"),
9371
                         ip->insn_mo->name,
9372
                         (unsigned long) imm_expr.X_add_number);
9373
              INSERT_OPERAND (CODE2, *ip, imm_expr.X_add_number);
9374
              imm_expr.X_op = O_absent;
9375
              s = expr_end;
9376
              continue;
9377
 
9378
            case 'B':           /* 20-bit syscall/break code.  */
9379
              my_getExpression (&imm_expr, s);
9380
              check_absolute_expr (ip, &imm_expr);
9381
              if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
9382
                as_warn (_("Code for %s not in range 0..1048575 (%lu)"),
9383
                         ip->insn_mo->name,
9384
                         (unsigned long) imm_expr.X_add_number);
9385
              INSERT_OPERAND (CODE20, *ip, imm_expr.X_add_number);
9386
              imm_expr.X_op = O_absent;
9387
              s = expr_end;
9388
              continue;
9389
 
9390
            case 'C':           /* Coprocessor code */
9391
              my_getExpression (&imm_expr, s);
9392
              check_absolute_expr (ip, &imm_expr);
9393
              if ((unsigned long) imm_expr.X_add_number > OP_MASK_COPZ)
9394
                {
9395
                  as_warn (_("Coproccesor code > 25 bits (%lu)"),
9396
                           (unsigned long) imm_expr.X_add_number);
9397
                  imm_expr.X_add_number &= OP_MASK_COPZ;
9398
                }
9399
              INSERT_OPERAND (COPZ, *ip, imm_expr.X_add_number);
9400
              imm_expr.X_op = O_absent;
9401
              s = expr_end;
9402
              continue;
9403
 
9404
            case 'J':           /* 19-bit wait code.  */
9405
              my_getExpression (&imm_expr, s);
9406
              check_absolute_expr (ip, &imm_expr);
9407
              if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
9408
                {
9409
                  as_warn (_("Illegal 19-bit code (%lu)"),
9410
                           (unsigned long) imm_expr.X_add_number);
9411
                  imm_expr.X_add_number &= OP_MASK_CODE19;
9412
                }
9413
              INSERT_OPERAND (CODE19, *ip, imm_expr.X_add_number);
9414
              imm_expr.X_op = O_absent;
9415
              s = expr_end;
9416
              continue;
9417
 
9418
            case 'P':           /* Performance register.  */
9419
              my_getExpression (&imm_expr, s);
9420
              check_absolute_expr (ip, &imm_expr);
9421
              if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
9422
                as_warn (_("Invalid performance register (%lu)"),
9423
                         (unsigned long) imm_expr.X_add_number);
9424
              INSERT_OPERAND (PERFREG, *ip, imm_expr.X_add_number);
9425
              imm_expr.X_op = O_absent;
9426
              s = expr_end;
9427
              continue;
9428
 
9429
            case 'G':           /* Coprocessor destination register.  */
9430
              if (((ip->insn_opcode >> OP_SH_OP) & OP_MASK_OP) == OP_OP_COP0)
9431
                ok = reg_lookup (&s, RTYPE_NUM | RTYPE_CP0, &regno);
9432
              else
9433
                ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9434
              INSERT_OPERAND (RD, *ip, regno);
9435
              if (ok)
9436
                {
9437
                  lastregno = regno;
9438
                  continue;
9439
                }
9440
              else
9441
                break;
9442
 
9443
            case 'b':           /* base register */
9444
            case 'd':           /* destination register */
9445
            case 's':           /* source register */
9446
            case 't':           /* target register */
9447
            case 'r':           /* both target and source */
9448
            case 'v':           /* both dest and source */
9449
            case 'w':           /* both dest and target */
9450
            case 'E':           /* coprocessor target register */
9451
            case 'K':           /* 'rdhwr' destination register */
9452
            case 'x':           /* ignore register name */
9453
            case 'z':           /* must be zero register */
9454
            case 'U':           /* destination register (clo/clz).  */
9455
            case 'g':           /* coprocessor destination register */
9456
              s_reset = s;
9457
              if (*args == 'E' || *args == 'K')
9458
                ok = reg_lookup (&s, RTYPE_NUM, &regno);
9459
              else
9460
                {
9461
                  ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9462
                  if (regno == AT && mips_opts.at)
9463
                    {
9464
                      if (mips_opts.at == ATREG)
9465
                        as_warn (_("used $at without \".set noat\""));
9466
                      else
9467
                        as_warn (_("used $%u with \".set at=$%u\""),
9468
                                 regno, mips_opts.at);
9469
                    }
9470
                }
9471
              if (ok)
9472
                {
9473
                  c = *args;
9474
                  if (*s == ' ')
9475
                    ++s;
9476
                  if (args[1] != *s)
9477
                    {
9478
                      if (c == 'r' || c == 'v' || c == 'w')
9479
                        {
9480
                          regno = lastregno;
9481
                          s = s_reset;
9482
                          ++args;
9483
                        }
9484
                    }
9485
                  /* 'z' only matches $0.  */
9486
                  if (c == 'z' && regno != 0)
9487
                    break;
9488
 
9489
                  if (c == 's' && !strncmp (ip->insn_mo->name, "jalr", 4))
9490
                    {
9491
                      if (regno == lastregno)
9492
                        {
9493
                          insn_error = _("source and destination must be different");
9494
                          continue;
9495
                        }
9496
                      if (regno == 31 && lastregno == 0xffffffff)
9497
                        {
9498
                          insn_error = _("a destination register must be supplied");
9499
                          continue;
9500
                        }
9501
                    }
9502
        /* Now that we have assembled one operand, we use the args string
9503
         * to figure out where it goes in the instruction.  */
9504
                  switch (c)
9505
                    {
9506
                    case 'r':
9507
                    case 's':
9508
                    case 'v':
9509
                    case 'b':
9510
                      INSERT_OPERAND (RS, *ip, regno);
9511
                      break;
9512
                    case 'd':
9513
                    case 'G':
9514
                    case 'K':
9515
                    case 'g':
9516
                      INSERT_OPERAND (RD, *ip, regno);
9517
                      break;
9518
                    case 'U':
9519
                      INSERT_OPERAND (RD, *ip, regno);
9520
                      INSERT_OPERAND (RT, *ip, regno);
9521
                      break;
9522
                    case 'w':
9523
                    case 't':
9524
                    case 'E':
9525
                      INSERT_OPERAND (RT, *ip, regno);
9526
                      break;
9527
                    case 'x':
9528
                      /* This case exists because on the r3000 trunc
9529
                         expands into a macro which requires a gp
9530
                         register.  On the r6000 or r4000 it is
9531
                         assembled into a single instruction which
9532
                         ignores the register.  Thus the insn version
9533
                         is MIPS_ISA2 and uses 'x', and the macro
9534
                         version is MIPS_ISA1 and uses 't'.  */
9535
                      break;
9536
                    case 'z':
9537
                      /* This case is for the div instruction, which
9538
                         acts differently if the destination argument
9539
                         is $0.  This only matches $0, and is checked
9540
                         outside the switch.  */
9541
                      break;
9542
                    case 'D':
9543
                      /* Itbl operand; not yet implemented. FIXME ?? */
9544
                      break;
9545
                      /* What about all other operands like 'i', which
9546
                         can be specified in the opcode table? */
9547
                    }
9548
                  lastregno = regno;
9549
                  continue;
9550
                }
9551
              switch (*args++)
9552
                {
9553
                case 'r':
9554
                case 'v':
9555
                  INSERT_OPERAND (RS, *ip, lastregno);
9556
                  continue;
9557
                case 'w':
9558
                  INSERT_OPERAND (RT, *ip, lastregno);
9559
                  continue;
9560
                }
9561
              break;
9562
 
9563
            case 'O':           /* MDMX alignment immediate constant.  */
9564
              my_getExpression (&imm_expr, s);
9565
              check_absolute_expr (ip, &imm_expr);
9566
              if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
9567
                as_warn (_("Improper align amount (%ld), using low bits"),
9568
                         (long) imm_expr.X_add_number);
9569
              INSERT_OPERAND (ALN, *ip, imm_expr.X_add_number);
9570
              imm_expr.X_op = O_absent;
9571
              s = expr_end;
9572
              continue;
9573
 
9574
            case 'Q':           /* MDMX vector, element sel, or const.  */
9575
              if (s[0] != '$')
9576
                {
9577
                  /* MDMX Immediate.  */
9578
                  my_getExpression (&imm_expr, s);
9579
                  check_absolute_expr (ip, &imm_expr);
9580
                  if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
9581
                    as_warn (_("Invalid MDMX Immediate (%ld)"),
9582
                             (long) imm_expr.X_add_number);
9583
                  INSERT_OPERAND (FT, *ip, imm_expr.X_add_number);
9584
                  if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9585
                    ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
9586
                  else
9587
                    ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
9588
                  imm_expr.X_op = O_absent;
9589
                  s = expr_end;
9590
                  continue;
9591
                }
9592
              /* Not MDMX Immediate.  Fall through.  */
9593
            case 'X':           /* MDMX destination register.  */
9594
            case 'Y':           /* MDMX source register.  */
9595
            case 'Z':           /* MDMX target register.  */
9596
              is_mdmx = 1;
9597
            case 'D':           /* floating point destination register */
9598
            case 'S':           /* floating point source register */
9599
            case 'T':           /* floating point target register */
9600
            case 'R':           /* floating point source register */
9601
            case 'V':
9602
            case 'W':
9603
              rtype = RTYPE_FPU;
9604
              if (is_mdmx
9605
                  || (mips_opts.ase_mdmx
9606
                      && (ip->insn_mo->pinfo & FP_D)
9607
                      && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
9608
                                                | INSN_COPROC_MEMORY_DELAY
9609
                                                | INSN_LOAD_COPROC_DELAY
9610
                                                | INSN_LOAD_MEMORY_DELAY
9611
                                                | INSN_STORE_MEMORY))))
9612
                rtype |= RTYPE_VEC;
9613
              s_reset = s;
9614
              if (reg_lookup (&s, rtype, &regno))
9615
                {
9616
                  if ((regno & 1) != 0
9617
                      && HAVE_32BIT_FPRS
9618
                      && ! mips_oddfpreg_ok (ip->insn_mo, argnum))
9619
                    as_warn (_("Float register should be even, was %d"),
9620
                             regno);
9621
 
9622
                  c = *args;
9623
                  if (*s == ' ')
9624
                    ++s;
9625
                  if (args[1] != *s)
9626
                    {
9627
                      if (c == 'V' || c == 'W')
9628
                        {
9629
                          regno = lastregno;
9630
                          s = s_reset;
9631
                          ++args;
9632
                        }
9633
                    }
9634
                  switch (c)
9635
                    {
9636
                    case 'D':
9637
                    case 'X':
9638
                      INSERT_OPERAND (FD, *ip, regno);
9639
                      break;
9640
                    case 'V':
9641
                    case 'S':
9642
                    case 'Y':
9643
                      INSERT_OPERAND (FS, *ip, regno);
9644
                      break;
9645
                    case 'Q':
9646
                      /* This is like 'Z', but also needs to fix the MDMX
9647
                         vector/scalar select bits.  Note that the
9648
                         scalar immediate case is handled above.  */
9649
                      if (*s == '[')
9650
                        {
9651
                          int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
9652
                          int max_el = (is_qh ? 3 : 7);
9653
                          s++;
9654
                          my_getExpression(&imm_expr, s);
9655
                          check_absolute_expr (ip, &imm_expr);
9656
                          s = expr_end;
9657
                          if (imm_expr.X_add_number > max_el)
9658
                            as_bad (_("Bad element selector %ld"),
9659
                                    (long) imm_expr.X_add_number);
9660
                          imm_expr.X_add_number &= max_el;
9661
                          ip->insn_opcode |= (imm_expr.X_add_number
9662
                                              << (OP_SH_VSEL +
9663
                                                  (is_qh ? 2 : 1)));
9664
                          imm_expr.X_op = O_absent;
9665
                          if (*s != ']')
9666
                            as_warn (_("Expecting ']' found '%s'"), s);
9667
                          else
9668
                            s++;
9669
                        }
9670
                      else
9671
                        {
9672
                          if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9673
                            ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
9674
                                                << OP_SH_VSEL);
9675
                          else
9676
                            ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
9677
                                                OP_SH_VSEL);
9678
                        }
9679
                      /* Fall through */
9680
                    case 'W':
9681
                    case 'T':
9682
                    case 'Z':
9683
                      INSERT_OPERAND (FT, *ip, regno);
9684
                      break;
9685
                    case 'R':
9686
                      INSERT_OPERAND (FR, *ip, regno);
9687
                      break;
9688
                    }
9689
                  lastregno = regno;
9690
                  continue;
9691
                }
9692
 
9693
              switch (*args++)
9694
                {
9695
                case 'V':
9696
                  INSERT_OPERAND (FS, *ip, lastregno);
9697
                  continue;
9698
                case 'W':
9699
                  INSERT_OPERAND (FT, *ip, lastregno);
9700
                  continue;
9701
                }
9702
              break;
9703
 
9704
            case 'I':
9705
              my_getExpression (&imm_expr, s);
9706
              if (imm_expr.X_op != O_big
9707
                  && imm_expr.X_op != O_constant)
9708
                insn_error = _("absolute expression required");
9709
              if (HAVE_32BIT_GPRS)
9710
                normalize_constant_expr (&imm_expr);
9711
              s = expr_end;
9712
              continue;
9713
 
9714
            case 'A':
9715
              my_getExpression (&offset_expr, s);
9716
              normalize_address_expr (&offset_expr);
9717
              *imm_reloc = BFD_RELOC_32;
9718
              s = expr_end;
9719
              continue;
9720
 
9721
            case 'F':
9722
            case 'L':
9723
            case 'f':
9724
            case 'l':
9725
              {
9726
                int f64;
9727
                int using_gprs;
9728
                char *save_in;
9729
                char *err;
9730
                unsigned char temp[8];
9731
                int len;
9732
                unsigned int length;
9733
                segT seg;
9734
                subsegT subseg;
9735
                char *p;
9736
 
9737
                /* These only appear as the last operand in an
9738
                   instruction, and every instruction that accepts
9739
                   them in any variant accepts them in all variants.
9740
                   This means we don't have to worry about backing out
9741
                   any changes if the instruction does not match.
9742
 
9743
                   The difference between them is the size of the
9744
                   floating point constant and where it goes.  For 'F'
9745
                   and 'L' the constant is 64 bits; for 'f' and 'l' it
9746
                   is 32 bits.  Where the constant is placed is based
9747
                   on how the MIPS assembler does things:
9748
                    F -- .rdata
9749
                    L -- .lit8
9750
                    f -- immediate value
9751
                    l -- .lit4
9752
 
9753
                    The .lit4 and .lit8 sections are only used if
9754
                    permitted by the -G argument.
9755
 
9756
                    The code below needs to know whether the target register
9757
                    is 32 or 64 bits wide.  It relies on the fact 'f' and
9758
                    'F' are used with GPR-based instructions and 'l' and
9759
                    'L' are used with FPR-based instructions.  */
9760
 
9761
                f64 = *args == 'F' || *args == 'L';
9762
                using_gprs = *args == 'F' || *args == 'f';
9763
 
9764
                save_in = input_line_pointer;
9765
                input_line_pointer = s;
9766
                err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
9767
                length = len;
9768
                s = input_line_pointer;
9769
                input_line_pointer = save_in;
9770
                if (err != NULL && *err != '\0')
9771
                  {
9772
                    as_bad (_("Bad floating point constant: %s"), err);
9773
                    memset (temp, '\0', sizeof temp);
9774
                    length = f64 ? 8 : 4;
9775
                  }
9776
 
9777
                gas_assert (length == (unsigned) (f64 ? 8 : 4));
9778
 
9779
                if (*args == 'f'
9780
                    || (*args == 'l'
9781
                        && (g_switch_value < 4
9782
                            || (temp[0] == 0 && temp[1] == 0)
9783
                            || (temp[2] == 0 && temp[3] == 0))))
9784
                  {
9785
                    imm_expr.X_op = O_constant;
9786
                    if (! target_big_endian)
9787
                      imm_expr.X_add_number = bfd_getl32 (temp);
9788
                    else
9789
                      imm_expr.X_add_number = bfd_getb32 (temp);
9790
                  }
9791
                else if (length > 4
9792
                         && ! mips_disable_float_construction
9793
                         /* Constants can only be constructed in GPRs and
9794
                            copied to FPRs if the GPRs are at least as wide
9795
                            as the FPRs.  Force the constant into memory if
9796
                            we are using 64-bit FPRs but the GPRs are only
9797
                            32 bits wide.  */
9798
                         && (using_gprs
9799
                             || ! (HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
9800
                         && ((temp[0] == 0 && temp[1] == 0)
9801
                             || (temp[2] == 0 && temp[3] == 0))
9802
                         && ((temp[4] == 0 && temp[5] == 0)
9803
                             || (temp[6] == 0 && temp[7] == 0)))
9804
                  {
9805
                    /* The value is simple enough to load with a couple of
9806
                       instructions.  If using 32-bit registers, set
9807
                       imm_expr to the high order 32 bits and offset_expr to
9808
                       the low order 32 bits.  Otherwise, set imm_expr to
9809
                       the entire 64 bit constant.  */
9810
                    if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
9811
                      {
9812
                        imm_expr.X_op = O_constant;
9813
                        offset_expr.X_op = O_constant;
9814
                        if (! target_big_endian)
9815
                          {
9816
                            imm_expr.X_add_number = bfd_getl32 (temp + 4);
9817
                            offset_expr.X_add_number = bfd_getl32 (temp);
9818
                          }
9819
                        else
9820
                          {
9821
                            imm_expr.X_add_number = bfd_getb32 (temp);
9822
                            offset_expr.X_add_number = bfd_getb32 (temp + 4);
9823
                          }
9824
                        if (offset_expr.X_add_number == 0)
9825
                          offset_expr.X_op = O_absent;
9826
                      }
9827
                    else if (sizeof (imm_expr.X_add_number) > 4)
9828
                      {
9829
                        imm_expr.X_op = O_constant;
9830
                        if (! target_big_endian)
9831
                          imm_expr.X_add_number = bfd_getl64 (temp);
9832
                        else
9833
                          imm_expr.X_add_number = bfd_getb64 (temp);
9834
                      }
9835
                    else
9836
                      {
9837
                        imm_expr.X_op = O_big;
9838
                        imm_expr.X_add_number = 4;
9839
                        if (! target_big_endian)
9840
                          {
9841
                            generic_bignum[0] = bfd_getl16 (temp);
9842
                            generic_bignum[1] = bfd_getl16 (temp + 2);
9843
                            generic_bignum[2] = bfd_getl16 (temp + 4);
9844
                            generic_bignum[3] = bfd_getl16 (temp + 6);
9845
                          }
9846
                        else
9847
                          {
9848
                            generic_bignum[0] = bfd_getb16 (temp + 6);
9849
                            generic_bignum[1] = bfd_getb16 (temp + 4);
9850
                            generic_bignum[2] = bfd_getb16 (temp + 2);
9851
                            generic_bignum[3] = bfd_getb16 (temp);
9852
                          }
9853
                      }
9854
                  }
9855
                else
9856
                  {
9857
                    const char *newname;
9858
                    segT new_seg;
9859
 
9860
                    /* Switch to the right section.  */
9861
                    seg = now_seg;
9862
                    subseg = now_subseg;
9863
                    switch (*args)
9864
                      {
9865
                      default: /* unused default case avoids warnings.  */
9866
                      case 'L':
9867
                        newname = RDATA_SECTION_NAME;
9868
                        if (g_switch_value >= 8)
9869
                          newname = ".lit8";
9870
                        break;
9871
                      case 'F':
9872
                        newname = RDATA_SECTION_NAME;
9873
                        break;
9874
                      case 'l':
9875
                        gas_assert (g_switch_value >= 4);
9876
                        newname = ".lit4";
9877
                        break;
9878
                      }
9879
                    new_seg = subseg_new (newname, (subsegT) 0);
9880
                    if (IS_ELF)
9881
                      bfd_set_section_flags (stdoutput, new_seg,
9882
                                             (SEC_ALLOC
9883
                                              | SEC_LOAD
9884
                                              | SEC_READONLY
9885
                                              | SEC_DATA));
9886
                    frag_align (*args == 'l' ? 2 : 3, 0, 0);
9887
                    if (IS_ELF && strncmp (TARGET_OS, "elf", 3) != 0)
9888
                      record_alignment (new_seg, 4);
9889
                    else
9890
                      record_alignment (new_seg, *args == 'l' ? 2 : 3);
9891
                    if (seg == now_seg)
9892
                      as_bad (_("Can't use floating point insn in this section"));
9893
 
9894
                    /* Set the argument to the current address in the
9895
                       section.  */
9896
                    offset_expr.X_op = O_symbol;
9897
                    offset_expr.X_add_symbol =
9898
                      symbol_new ("L0\001", now_seg,
9899
                                  (valueT) frag_now_fix (), frag_now);
9900
                    offset_expr.X_add_number = 0;
9901
 
9902
                    /* Put the floating point number into the section.  */
9903
                    p = frag_more ((int) length);
9904
                    memcpy (p, temp, length);
9905
 
9906
                    /* Switch back to the original section.  */
9907
                    subseg_set (seg, subseg);
9908
                  }
9909
              }
9910
              continue;
9911
 
9912
            case 'i':           /* 16 bit unsigned immediate */
9913
            case 'j':           /* 16 bit signed immediate */
9914
              *imm_reloc = BFD_RELOC_LO16;
9915
              if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
9916
                {
9917
                  int more;
9918
                  offsetT minval, maxval;
9919
 
9920
                  more = (insn + 1 < &mips_opcodes[NUMOPCODES]
9921
                          && strcmp (insn->name, insn[1].name) == 0);
9922
 
9923
                  /* If the expression was written as an unsigned number,
9924
                     only treat it as signed if there are no more
9925
                     alternatives.  */
9926
                  if (more
9927
                      && *args == 'j'
9928
                      && sizeof (imm_expr.X_add_number) <= 4
9929
                      && imm_expr.X_op == O_constant
9930
                      && imm_expr.X_add_number < 0
9931
                      && imm_expr.X_unsigned
9932
                      && HAVE_64BIT_GPRS)
9933
                    break;
9934
 
9935
                  /* For compatibility with older assemblers, we accept
9936
                     0x8000-0xffff as signed 16-bit numbers when only
9937
                     signed numbers are allowed.  */
9938
                  if (*args == 'i')
9939
                    minval = 0, maxval = 0xffff;
9940
                  else if (more)
9941
                    minval = -0x8000, maxval = 0x7fff;
9942
                  else
9943
                    minval = -0x8000, maxval = 0xffff;
9944
 
9945
                  if (imm_expr.X_op != O_constant
9946
                      || imm_expr.X_add_number < minval
9947
                      || imm_expr.X_add_number > maxval)
9948
                    {
9949
                      if (more)
9950
                        break;
9951
                      if (imm_expr.X_op == O_constant
9952
                          || imm_expr.X_op == O_big)
9953
                        as_bad (_("expression out of range"));
9954
                    }
9955
                }
9956
              s = expr_end;
9957
              continue;
9958
 
9959
            case 'o':           /* 16 bit offset */
9960
              /* Check whether there is only a single bracketed expression
9961
                 left.  If so, it must be the base register and the
9962
                 constant must be zero.  */
9963
              if (*s == '(' && strchr (s + 1, '(') == 0)
9964
                {
9965
                  offset_expr.X_op = O_constant;
9966
                  offset_expr.X_add_number = 0;
9967
                  continue;
9968
                }
9969
 
9970
              /* If this value won't fit into a 16 bit offset, then go
9971
                 find a macro that will generate the 32 bit offset
9972
                 code pattern.  */
9973
              if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
9974
                  && (offset_expr.X_op != O_constant
9975
                      || offset_expr.X_add_number >= 0x8000
9976
                      || offset_expr.X_add_number < -0x8000))
9977
                break;
9978
 
9979
              s = expr_end;
9980
              continue;
9981
 
9982
            case 'p':           /* pc relative offset */
9983
              *offset_reloc = BFD_RELOC_16_PCREL_S2;
9984
              my_getExpression (&offset_expr, s);
9985
              s = expr_end;
9986
              continue;
9987
 
9988
            case 'u':           /* upper 16 bits */
9989
              if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
9990
                  && imm_expr.X_op == O_constant
9991
                  && (imm_expr.X_add_number < 0
9992
                      || imm_expr.X_add_number >= 0x10000))
9993
                as_bad (_("lui expression not in range 0..65535"));
9994
              s = expr_end;
9995
              continue;
9996
 
9997
            case 'a':           /* 26 bit address */
9998
              my_getExpression (&offset_expr, s);
9999
              s = expr_end;
10000
              *offset_reloc = BFD_RELOC_MIPS_JMP;
10001
              continue;
10002
 
10003
            case 'N':           /* 3 bit branch condition code */
10004
            case 'M':           /* 3 bit compare condition code */
10005
              rtype = RTYPE_CCC;
10006
              if (ip->insn_mo->pinfo & (FP_D| FP_S))
10007
                rtype |= RTYPE_FCC;
10008
              if (!reg_lookup (&s, rtype, &regno))
10009
                break;
10010
              if ((strcmp(str + strlen(str) - 3, ".ps") == 0
10011
                   || strcmp(str + strlen(str) - 5, "any2f") == 0
10012
                   || strcmp(str + strlen(str) - 5, "any2t") == 0)
10013
                  && (regno & 1) != 0)
10014
                as_warn (_("Condition code register should be even for %s, was %d"),
10015
                         str, regno);
10016
              if ((strcmp(str + strlen(str) - 5, "any4f") == 0
10017
                   || strcmp(str + strlen(str) - 5, "any4t") == 0)
10018
                  && (regno & 3) != 0)
10019
                as_warn (_("Condition code register should be 0 or 4 for %s, was %d"),
10020
                         str, regno);
10021
              if (*args == 'N')
10022
                INSERT_OPERAND (BCC, *ip, regno);
10023
              else
10024
                INSERT_OPERAND (CCC, *ip, regno);
10025
              continue;
10026
 
10027
            case 'H':
10028
              if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
10029
                s += 2;
10030
              if (ISDIGIT (*s))
10031
                {
10032
                  c = 0;
10033
                  do
10034
                    {
10035
                      c *= 10;
10036
                      c += *s - '0';
10037
                      ++s;
10038
                    }
10039
                  while (ISDIGIT (*s));
10040
                }
10041
              else
10042
                c = 8; /* Invalid sel value.  */
10043
 
10044
              if (c > 7)
10045
                as_bad (_("invalid coprocessor sub-selection value (0-7)"));
10046
              ip->insn_opcode |= c;
10047
              continue;
10048
 
10049
            case 'e':
10050
              /* Must be at least one digit.  */
10051
              my_getExpression (&imm_expr, s);
10052
              check_absolute_expr (ip, &imm_expr);
10053
 
10054
              if ((unsigned long) imm_expr.X_add_number
10055
                  > (unsigned long) OP_MASK_VECBYTE)
10056
                {
10057
                  as_bad (_("bad byte vector index (%ld)"),
10058
                           (long) imm_expr.X_add_number);
10059
                  imm_expr.X_add_number = 0;
10060
                }
10061
 
10062
              INSERT_OPERAND (VECBYTE, *ip, imm_expr.X_add_number);
10063
              imm_expr.X_op = O_absent;
10064
              s = expr_end;
10065
              continue;
10066
 
10067
            case '%':
10068
              my_getExpression (&imm_expr, s);
10069
              check_absolute_expr (ip, &imm_expr);
10070
 
10071
              if ((unsigned long) imm_expr.X_add_number
10072
                  > (unsigned long) OP_MASK_VECALIGN)
10073
                {
10074
                  as_bad (_("bad byte vector index (%ld)"),
10075
                           (long) imm_expr.X_add_number);
10076
                  imm_expr.X_add_number = 0;
10077
                }
10078
 
10079
              INSERT_OPERAND (VECALIGN, *ip, imm_expr.X_add_number);
10080
              imm_expr.X_op = O_absent;
10081
              s = expr_end;
10082
              continue;
10083
 
10084
            default:
10085
              as_bad (_("bad char = '%c'\n"), *args);
10086
              internalError ();
10087
            }
10088
          break;
10089
        }
10090
      /* Args don't match.  */
10091
      if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
10092
          !strcmp (insn->name, insn[1].name))
10093
        {
10094
          ++insn;
10095
          s = argsStart;
10096
          insn_error = _("illegal operands");
10097
          continue;
10098
        }
10099
      if (save_c)
10100
        *(--argsStart) = save_c;
10101
      insn_error = _("illegal operands");
10102
      return;
10103
    }
10104
}
10105
 
10106
#define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
10107
 
10108
/* This routine assembles an instruction into its binary format when
10109
   assembling for the mips16.  As a side effect, it sets one of the
10110
   global variables imm_reloc or offset_reloc to the type of
10111
   relocation to do if one of the operands is an address expression.
10112
   It also sets mips16_small and mips16_ext if the user explicitly
10113
   requested a small or extended instruction.  */
10114
 
10115
static void
10116
mips16_ip (char *str, struct mips_cl_insn *ip)
10117
{
10118
  char *s;
10119
  const char *args;
10120
  struct mips_opcode *insn;
10121
  char *argsstart;
10122
  unsigned int regno;
10123
  unsigned int lastregno = 0;
10124
  char *s_reset;
10125
  size_t i;
10126
 
10127
  insn_error = NULL;
10128
 
10129
  mips16_small = FALSE;
10130
  mips16_ext = FALSE;
10131
 
10132
  for (s = str; ISLOWER (*s); ++s)
10133
    ;
10134
  switch (*s)
10135
    {
10136
    case '\0':
10137
      break;
10138
 
10139
    case ' ':
10140
      *s++ = '\0';
10141
      break;
10142
 
10143
    case '.':
10144
      if (s[1] == 't' && s[2] == ' ')
10145
        {
10146
          *s = '\0';
10147
          mips16_small = TRUE;
10148
          s += 3;
10149
          break;
10150
        }
10151
      else if (s[1] == 'e' && s[2] == ' ')
10152
        {
10153
          *s = '\0';
10154
          mips16_ext = TRUE;
10155
          s += 3;
10156
          break;
10157
        }
10158
      /* Fall through.  */
10159
    default:
10160
      insn_error = _("unknown opcode");
10161
      return;
10162
    }
10163
 
10164
  if (mips_opts.noautoextend && ! mips16_ext)
10165
    mips16_small = TRUE;
10166
 
10167
  if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
10168
    {
10169
      insn_error = _("unrecognized opcode");
10170
      return;
10171
    }
10172
 
10173
  argsstart = s;
10174
  for (;;)
10175
    {
10176
      bfd_boolean ok;
10177
 
10178
      gas_assert (strcmp (insn->name, str) == 0);
10179
 
10180
      ok = is_opcode_valid_16 (insn);
10181
      if (! ok)
10182
        {
10183
          if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
10184
              && strcmp (insn->name, insn[1].name) == 0)
10185
            {
10186
              ++insn;
10187
              continue;
10188
            }
10189
          else
10190
            {
10191
              if (!insn_error)
10192
                {
10193
                  static char buf[100];
10194
                  sprintf (buf,
10195
                           _("opcode not supported on this processor: %s (%s)"),
10196
                           mips_cpu_info_from_arch (mips_opts.arch)->name,
10197
                           mips_cpu_info_from_isa (mips_opts.isa)->name);
10198
                  insn_error = buf;
10199
                }
10200
              return;
10201
            }
10202
        }
10203
 
10204
      create_insn (ip, insn);
10205
      imm_expr.X_op = O_absent;
10206
      imm_reloc[0] = BFD_RELOC_UNUSED;
10207
      imm_reloc[1] = BFD_RELOC_UNUSED;
10208
      imm_reloc[2] = BFD_RELOC_UNUSED;
10209
      imm2_expr.X_op = O_absent;
10210
      offset_expr.X_op = O_absent;
10211
      offset_reloc[0] = BFD_RELOC_UNUSED;
10212
      offset_reloc[1] = BFD_RELOC_UNUSED;
10213
      offset_reloc[2] = BFD_RELOC_UNUSED;
10214
      for (args = insn->args; 1; ++args)
10215
        {
10216
          int c;
10217
 
10218
          if (*s == ' ')
10219
            ++s;
10220
 
10221
          /* In this switch statement we call break if we did not find
10222
             a match, continue if we did find a match, or return if we
10223
             are done.  */
10224
 
10225
          c = *args;
10226
          switch (c)
10227
            {
10228
            case '\0':
10229
              if (*s == '\0')
10230
                {
10231
                  /* Stuff the immediate value in now, if we can.  */
10232
                  if (imm_expr.X_op == O_constant
10233
                      && *imm_reloc > BFD_RELOC_UNUSED
10234
                      && *imm_reloc != BFD_RELOC_MIPS16_GOT16
10235
                      && *imm_reloc != BFD_RELOC_MIPS16_CALL16
10236
                      && insn->pinfo != INSN_MACRO)
10237
                    {
10238
                      valueT tmp;
10239
 
10240
                      switch (*offset_reloc)
10241
                        {
10242
                          case BFD_RELOC_MIPS16_HI16_S:
10243
                            tmp = (imm_expr.X_add_number + 0x8000) >> 16;
10244
                            break;
10245
 
10246
                          case BFD_RELOC_MIPS16_HI16:
10247
                            tmp = imm_expr.X_add_number >> 16;
10248
                            break;
10249
 
10250
                          case BFD_RELOC_MIPS16_LO16:
10251
                            tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
10252
                                  - 0x8000;
10253
                            break;
10254
 
10255
                          case BFD_RELOC_UNUSED:
10256
                            tmp = imm_expr.X_add_number;
10257
                            break;
10258
 
10259
                          default:
10260
                            internalError ();
10261
                        }
10262
                      *offset_reloc = BFD_RELOC_UNUSED;
10263
 
10264
                      mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
10265
                                    tmp, TRUE, mips16_small,
10266
                                    mips16_ext, &ip->insn_opcode,
10267
                                    &ip->use_extend, &ip->extend);
10268
                      imm_expr.X_op = O_absent;
10269
                      *imm_reloc = BFD_RELOC_UNUSED;
10270
                    }
10271
 
10272
                  return;
10273
                }
10274
              break;
10275
 
10276
            case ',':
10277
              if (*s++ == c)
10278
                continue;
10279
              s--;
10280
              switch (*++args)
10281
                {
10282
                case 'v':
10283
                  MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10284
                  continue;
10285
                case 'w':
10286
                  MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10287
                  continue;
10288
                }
10289
              break;
10290
 
10291
            case '(':
10292
            case ')':
10293
              if (*s++ == c)
10294
                continue;
10295
              break;
10296
 
10297
            case 'v':
10298
            case 'w':
10299
              if (s[0] != '$')
10300
                {
10301
                  if (c == 'v')
10302
                    MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10303
                  else
10304
                    MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10305
                  ++args;
10306
                  continue;
10307
                }
10308
              /* Fall through.  */
10309
            case 'x':
10310
            case 'y':
10311
            case 'z':
10312
            case 'Z':
10313
            case '0':
10314
            case 'S':
10315
            case 'R':
10316
            case 'X':
10317
            case 'Y':
10318
              s_reset = s;
10319
              if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
10320
                {
10321
                  if (c == 'v' || c == 'w')
10322
                    {
10323
                      if (c == 'v')
10324
                        MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10325
                      else
10326
                        MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10327
                      ++args;
10328
                      continue;
10329
                    }
10330
                  break;
10331
                }
10332
 
10333
              if (*s == ' ')
10334
                ++s;
10335
              if (args[1] != *s)
10336
                {
10337
                  if (c == 'v' || c == 'w')
10338
                    {
10339
                      regno = mips16_to_32_reg_map[lastregno];
10340
                      s = s_reset;
10341
                      ++args;
10342
                    }
10343
                }
10344
 
10345
              switch (c)
10346
                {
10347
                case 'x':
10348
                case 'y':
10349
                case 'z':
10350
                case 'v':
10351
                case 'w':
10352
                case 'Z':
10353
                  regno = mips32_to_16_reg_map[regno];
10354
                  break;
10355
 
10356
                case '0':
10357
                  if (regno != 0)
10358
                    regno = ILLEGAL_REG;
10359
                  break;
10360
 
10361
                case 'S':
10362
                  if (regno != SP)
10363
                    regno = ILLEGAL_REG;
10364
                  break;
10365
 
10366
                case 'R':
10367
                  if (regno != RA)
10368
                    regno = ILLEGAL_REG;
10369
                  break;
10370
 
10371
                case 'X':
10372
                case 'Y':
10373
                  if (regno == AT && mips_opts.at)
10374
                    {
10375
                      if (mips_opts.at == ATREG)
10376
                        as_warn (_("used $at without \".set noat\""));
10377
                      else
10378
                        as_warn (_("used $%u with \".set at=$%u\""),
10379
                                 regno, mips_opts.at);
10380
                    }
10381
                  break;
10382
 
10383
                default:
10384
                  internalError ();
10385
                }
10386
 
10387
              if (regno == ILLEGAL_REG)
10388
                break;
10389
 
10390
              switch (c)
10391
                {
10392
                case 'x':
10393
                case 'v':
10394
                  MIPS16_INSERT_OPERAND (RX, *ip, regno);
10395
                  break;
10396
                case 'y':
10397
                case 'w':
10398
                  MIPS16_INSERT_OPERAND (RY, *ip, regno);
10399
                  break;
10400
                case 'z':
10401
                  MIPS16_INSERT_OPERAND (RZ, *ip, regno);
10402
                  break;
10403
                case 'Z':
10404
                  MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
10405
                case '0':
10406
                case 'S':
10407
                case 'R':
10408
                  break;
10409
                case 'X':
10410
                  MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
10411
                  break;
10412
                case 'Y':
10413
                  regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
10414
                  MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
10415
                  break;
10416
                default:
10417
                  internalError ();
10418
                }
10419
 
10420
              lastregno = regno;
10421
              continue;
10422
 
10423
            case 'P':
10424
              if (strncmp (s, "$pc", 3) == 0)
10425
                {
10426
                  s += 3;
10427
                  continue;
10428
                }
10429
              break;
10430
 
10431
            case '5':
10432
            case 'H':
10433
            case 'W':
10434
            case 'D':
10435
            case 'j':
10436
            case 'V':
10437
            case 'C':
10438
            case 'U':
10439
            case 'k':
10440
            case 'K':
10441
              i = my_getSmallExpression (&imm_expr, imm_reloc, s);
10442
              if (i > 0)
10443
                {
10444
                  if (imm_expr.X_op != O_constant)
10445
                    {
10446
                      mips16_ext = TRUE;
10447
                      ip->use_extend = TRUE;
10448
                      ip->extend = 0;
10449
                    }
10450
                  else
10451
                    {
10452
                      /* We need to relax this instruction.  */
10453
                      *offset_reloc = *imm_reloc;
10454
                      *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10455
                    }
10456
                  s = expr_end;
10457
                  continue;
10458
                }
10459
              *imm_reloc = BFD_RELOC_UNUSED;
10460
              /* Fall through.  */
10461
            case '<':
10462
            case '>':
10463
            case '[':
10464
            case ']':
10465
            case '4':
10466
            case '8':
10467
              my_getExpression (&imm_expr, s);
10468
              if (imm_expr.X_op == O_register)
10469
                {
10470
                  /* What we thought was an expression turned out to
10471
                     be a register.  */
10472
 
10473
                  if (s[0] == '(' && args[1] == '(')
10474
                    {
10475
                      /* It looks like the expression was omitted
10476
                         before a register indirection, which means
10477
                         that the expression is implicitly zero.  We
10478
                         still set up imm_expr, so that we handle
10479
                         explicit extensions correctly.  */
10480
                      imm_expr.X_op = O_constant;
10481
                      imm_expr.X_add_number = 0;
10482
                      *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10483
                      continue;
10484
                    }
10485
 
10486
                  break;
10487
                }
10488
 
10489
              /* We need to relax this instruction.  */
10490
              *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10491
              s = expr_end;
10492
              continue;
10493
 
10494
            case 'p':
10495
            case 'q':
10496
            case 'A':
10497
            case 'B':
10498
            case 'E':
10499
              /* We use offset_reloc rather than imm_reloc for the PC
10500
                 relative operands.  This lets macros with both
10501
                 immediate and address operands work correctly.  */
10502
              my_getExpression (&offset_expr, s);
10503
 
10504
              if (offset_expr.X_op == O_register)
10505
                break;
10506
 
10507
              /* We need to relax this instruction.  */
10508
              *offset_reloc = (int) BFD_RELOC_UNUSED + c;
10509
              s = expr_end;
10510
              continue;
10511
 
10512
            case '6':           /* break code */
10513
              my_getExpression (&imm_expr, s);
10514
              check_absolute_expr (ip, &imm_expr);
10515
              if ((unsigned long) imm_expr.X_add_number > 63)
10516
                as_warn (_("Invalid value for `%s' (%lu)"),
10517
                         ip->insn_mo->name,
10518
                         (unsigned long) imm_expr.X_add_number);
10519
              MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
10520
              imm_expr.X_op = O_absent;
10521
              s = expr_end;
10522
              continue;
10523
 
10524
            case 'a':           /* 26 bit address */
10525
              my_getExpression (&offset_expr, s);
10526
              s = expr_end;
10527
              *offset_reloc = BFD_RELOC_MIPS16_JMP;
10528
              ip->insn_opcode <<= 16;
10529
              continue;
10530
 
10531
            case 'l':           /* register list for entry macro */
10532
            case 'L':           /* register list for exit macro */
10533
              {
10534
                int mask;
10535
 
10536
                if (c == 'l')
10537
                  mask = 0;
10538
                else
10539
                  mask = 7 << 3;
10540
                while (*s != '\0')
10541
                  {
10542
                    unsigned int freg, reg1, reg2;
10543
 
10544
                    while (*s == ' ' || *s == ',')
10545
                      ++s;
10546
                    if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10547
                      freg = 0;
10548
                    else if (reg_lookup (&s, RTYPE_FPU, &reg1))
10549
                      freg = 1;
10550
                    else
10551
                      {
10552
                        as_bad (_("can't parse register list"));
10553
                        break;
10554
                      }
10555
                    if (*s == ' ')
10556
                      ++s;
10557
                    if (*s != '-')
10558
                      reg2 = reg1;
10559
                    else
10560
                      {
10561
                        ++s;
10562
                        if (!reg_lookup (&s, freg ? RTYPE_FPU
10563
                                         : (RTYPE_GP | RTYPE_NUM), &reg2))
10564
                          {
10565
                            as_bad (_("invalid register list"));
10566
                            break;
10567
                          }
10568
                      }
10569
                    if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10570
                      {
10571
                        mask &= ~ (7 << 3);
10572
                        mask |= 5 << 3;
10573
                      }
10574
                    else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10575
                      {
10576
                        mask &= ~ (7 << 3);
10577
                        mask |= 6 << 3;
10578
                      }
10579
                    else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
10580
                      mask |= (reg2 - 3) << 3;
10581
                    else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
10582
                      mask |= (reg2 - 15) << 1;
10583
                    else if (reg1 == RA && reg2 == RA)
10584
                      mask |= 1;
10585
                    else
10586
                      {
10587
                        as_bad (_("invalid register list"));
10588
                        break;
10589
                      }
10590
                  }
10591
                /* The mask is filled in in the opcode table for the
10592
                   benefit of the disassembler.  We remove it before
10593
                   applying the actual mask.  */
10594
                ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
10595
                ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
10596
              }
10597
            continue;
10598
 
10599
            case 'm':           /* Register list for save insn.  */
10600
            case 'M':           /* Register list for restore insn.  */
10601
              {
10602
                int opcode = 0;
10603
                int framesz = 0, seen_framesz = 0;
10604
                int args = 0, statics = 0, sregs = 0;
10605
 
10606
                while (*s != '\0')
10607
                  {
10608
                    unsigned int reg1, reg2;
10609
 
10610
                    SKIP_SPACE_TABS (s);
10611
                    while (*s == ',')
10612
                      ++s;
10613
                    SKIP_SPACE_TABS (s);
10614
 
10615
                    my_getExpression (&imm_expr, s);
10616
                    if (imm_expr.X_op == O_constant)
10617
                      {
10618
                        /* Handle the frame size.  */
10619
                        if (seen_framesz)
10620
                          {
10621
                            as_bad (_("more than one frame size in list"));
10622
                            break;
10623
                          }
10624
                        seen_framesz = 1;
10625
                        framesz = imm_expr.X_add_number;
10626
                        imm_expr.X_op = O_absent;
10627
                        s = expr_end;
10628
                        continue;
10629
                      }
10630
 
10631
                    if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10632
                      {
10633
                        as_bad (_("can't parse register list"));
10634
                        break;
10635
                      }
10636
 
10637
                    while (*s == ' ')
10638
                      ++s;
10639
 
10640
                    if (*s != '-')
10641
                      reg2 = reg1;
10642
                    else
10643
                      {
10644
                        ++s;
10645
                        if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
10646
                            || reg2 < reg1)
10647
                          {
10648
                            as_bad (_("can't parse register list"));
10649
                            break;
10650
                          }
10651
                      }
10652
 
10653
                    while (reg1 <= reg2)
10654
                      {
10655
                        if (reg1 >= 4 && reg1 <= 7)
10656
                          {
10657
                            if (!seen_framesz)
10658
                                /* args $a0-$a3 */
10659
                                args |= 1 << (reg1 - 4);
10660
                            else
10661
                                /* statics $a0-$a3 */
10662
                                statics |= 1 << (reg1 - 4);
10663
                          }
10664
                        else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
10665
                          {
10666
                            /* $s0-$s8 */
10667
                            sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
10668
                          }
10669
                        else if (reg1 == 31)
10670
                          {
10671
                            /* Add $ra to insn.  */
10672
                            opcode |= 0x40;
10673
                          }
10674
                        else
10675
                          {
10676
                            as_bad (_("unexpected register in list"));
10677
                            break;
10678
                          }
10679
                        if (++reg1 == 24)
10680
                          reg1 = 30;
10681
                      }
10682
                  }
10683
 
10684
                /* Encode args/statics combination.  */
10685
                if (args & statics)
10686
                  as_bad (_("arg/static registers overlap"));
10687
                else if (args == 0xf)
10688
                  /* All $a0-$a3 are args.  */
10689
                  opcode |= MIPS16_ALL_ARGS << 16;
10690
                else if (statics == 0xf)
10691
                  /* All $a0-$a3 are statics.  */
10692
                  opcode |= MIPS16_ALL_STATICS << 16;
10693
                else
10694
                  {
10695
                    int narg = 0, nstat = 0;
10696
 
10697
                    /* Count arg registers.  */
10698
                    while (args & 0x1)
10699
                      {
10700
                        args >>= 1;
10701
                        narg++;
10702
                      }
10703
                    if (args != 0)
10704
                      as_bad (_("invalid arg register list"));
10705
 
10706
                    /* Count static registers.  */
10707
                    while (statics & 0x8)
10708
                      {
10709
                        statics = (statics << 1) & 0xf;
10710
                        nstat++;
10711
                      }
10712
                    if (statics != 0)
10713
                      as_bad (_("invalid static register list"));
10714
 
10715
                    /* Encode args/statics.  */
10716
                    opcode |= ((narg << 2) | nstat) << 16;
10717
                  }
10718
 
10719
                /* Encode $s0/$s1.  */
10720
                if (sregs & (1 << 0))            /* $s0 */
10721
                  opcode |= 0x20;
10722
                if (sregs & (1 << 1))           /* $s1 */
10723
                  opcode |= 0x10;
10724
                sregs >>= 2;
10725
 
10726
                if (sregs != 0)
10727
                  {
10728
                    /* Count regs $s2-$s8.  */
10729
                    int nsreg = 0;
10730
                    while (sregs & 1)
10731
                      {
10732
                        sregs >>= 1;
10733
                        nsreg++;
10734
                      }
10735
                    if (sregs != 0)
10736
                      as_bad (_("invalid static register list"));
10737
                    /* Encode $s2-$s8. */
10738
                    opcode |= nsreg << 24;
10739
                  }
10740
 
10741
                /* Encode frame size.  */
10742
                if (!seen_framesz)
10743
                  as_bad (_("missing frame size"));
10744
                else if ((framesz & 7) != 0 || framesz < 0
10745
                         || framesz > 0xff * 8)
10746
                  as_bad (_("invalid frame size"));
10747
                else if (framesz != 128 || (opcode >> 16) != 0)
10748
                  {
10749
                    framesz /= 8;
10750
                    opcode |= (((framesz & 0xf0) << 16)
10751
                             | (framesz & 0x0f));
10752
                  }
10753
 
10754
                /* Finally build the instruction.  */
10755
                if ((opcode >> 16) != 0 || framesz == 0)
10756
                  {
10757
                    ip->use_extend = TRUE;
10758
                    ip->extend = opcode >> 16;
10759
                  }
10760
                ip->insn_opcode |= opcode & 0x7f;
10761
              }
10762
            continue;
10763
 
10764
            case 'e':           /* extend code */
10765
              my_getExpression (&imm_expr, s);
10766
              check_absolute_expr (ip, &imm_expr);
10767
              if ((unsigned long) imm_expr.X_add_number > 0x7ff)
10768
                {
10769
                  as_warn (_("Invalid value for `%s' (%lu)"),
10770
                           ip->insn_mo->name,
10771
                           (unsigned long) imm_expr.X_add_number);
10772
                  imm_expr.X_add_number &= 0x7ff;
10773
                }
10774
              ip->insn_opcode |= imm_expr.X_add_number;
10775
              imm_expr.X_op = O_absent;
10776
              s = expr_end;
10777
              continue;
10778
 
10779
            default:
10780
              internalError ();
10781
            }
10782
          break;
10783
        }
10784
 
10785
      /* Args don't match.  */
10786
      if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
10787
          strcmp (insn->name, insn[1].name) == 0)
10788
        {
10789
          ++insn;
10790
          s = argsstart;
10791
          continue;
10792
        }
10793
 
10794
      insn_error = _("illegal operands");
10795
 
10796
      return;
10797
    }
10798
}
10799
 
10800
/* This structure holds information we know about a mips16 immediate
10801
   argument type.  */
10802
 
10803
struct mips16_immed_operand
10804
{
10805
  /* The type code used in the argument string in the opcode table.  */
10806
  int type;
10807
  /* The number of bits in the short form of the opcode.  */
10808
  int nbits;
10809
  /* The number of bits in the extended form of the opcode.  */
10810
  int extbits;
10811
  /* The amount by which the short form is shifted when it is used;
10812
     for example, the sw instruction has a shift count of 2.  */
10813
  int shift;
10814
  /* The amount by which the short form is shifted when it is stored
10815
     into the instruction code.  */
10816
  int op_shift;
10817
  /* Non-zero if the short form is unsigned.  */
10818
  int unsp;
10819
  /* Non-zero if the extended form is unsigned.  */
10820
  int extu;
10821
  /* Non-zero if the value is PC relative.  */
10822
  int pcrel;
10823
};
10824
 
10825
/* The mips16 immediate operand types.  */
10826
 
10827
static const struct mips16_immed_operand mips16_immed_operands[] =
10828
{
10829
  { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10830
  { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10831
  { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10832
  { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10833
  { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
10834
  { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
10835
  { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
10836
  { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
10837
  { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
10838
  { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
10839
  { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
10840
  { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
10841
  { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
10842
  { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
10843
  { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
10844
  { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
10845
  { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10846
  { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10847
  { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
10848
  { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
10849
  { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
10850
};
10851
 
10852
#define MIPS16_NUM_IMMED \
10853
  (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
10854
 
10855
/* Handle a mips16 instruction with an immediate value.  This or's the
10856
   small immediate value into *INSN.  It sets *USE_EXTEND to indicate
10857
   whether an extended value is needed; if one is needed, it sets
10858
   *EXTEND to the value.  The argument type is TYPE.  The value is VAL.
10859
   If SMALL is true, an unextended opcode was explicitly requested.
10860
   If EXT is true, an extended opcode was explicitly requested.  If
10861
   WARN is true, warn if EXT does not match reality.  */
10862
 
10863
static void
10864
mips16_immed (char *file, unsigned int line, int type, offsetT val,
10865
              bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
10866
              unsigned long *insn, bfd_boolean *use_extend,
10867
              unsigned short *extend)
10868
{
10869
  const struct mips16_immed_operand *op;
10870
  int mintiny, maxtiny;
10871
  bfd_boolean needext;
10872
 
10873
  op = mips16_immed_operands;
10874
  while (op->type != type)
10875
    {
10876
      ++op;
10877
      gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
10878
    }
10879
 
10880
  if (op->unsp)
10881
    {
10882
      if (type == '<' || type == '>' || type == '[' || type == ']')
10883
        {
10884
          mintiny = 1;
10885
          maxtiny = 1 << op->nbits;
10886
        }
10887
      else
10888
        {
10889
          mintiny = 0;
10890
          maxtiny = (1 << op->nbits) - 1;
10891
        }
10892
    }
10893
  else
10894
    {
10895
      mintiny = - (1 << (op->nbits - 1));
10896
      maxtiny = (1 << (op->nbits - 1)) - 1;
10897
    }
10898
 
10899
  /* Branch offsets have an implicit 0 in the lowest bit.  */
10900
  if (type == 'p' || type == 'q')
10901
    val /= 2;
10902
 
10903
  if ((val & ((1 << op->shift) - 1)) != 0
10904
      || val < (mintiny << op->shift)
10905
      || val > (maxtiny << op->shift))
10906
    needext = TRUE;
10907
  else
10908
    needext = FALSE;
10909
 
10910
  if (warn && ext && ! needext)
10911
    as_warn_where (file, line,
10912
                   _("extended operand requested but not required"));
10913
  if (small && needext)
10914
    as_bad_where (file, line, _("invalid unextended operand value"));
10915
 
10916
  if (small || (! ext && ! needext))
10917
    {
10918
      int insnval;
10919
 
10920
      *use_extend = FALSE;
10921
      insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
10922
      insnval <<= op->op_shift;
10923
      *insn |= insnval;
10924
    }
10925
  else
10926
    {
10927
      long minext, maxext;
10928
      int extval;
10929
 
10930
      if (op->extu)
10931
        {
10932
          minext = 0;
10933
          maxext = (1 << op->extbits) - 1;
10934
        }
10935
      else
10936
        {
10937
          minext = - (1 << (op->extbits - 1));
10938
          maxext = (1 << (op->extbits - 1)) - 1;
10939
        }
10940
      if (val < minext || val > maxext)
10941
        as_bad_where (file, line,
10942
                      _("operand value out of range for instruction"));
10943
 
10944
      *use_extend = TRUE;
10945
      if (op->extbits == 16)
10946
        {
10947
          extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
10948
          val &= 0x1f;
10949
        }
10950
      else if (op->extbits == 15)
10951
        {
10952
          extval = ((val >> 11) & 0xf) | (val & 0x7f0);
10953
          val &= 0xf;
10954
        }
10955
      else
10956
        {
10957
          extval = ((val & 0x1f) << 6) | (val & 0x20);
10958
          val = 0;
10959
        }
10960
 
10961
      *extend = (unsigned short) extval;
10962
      *insn |= val;
10963
    }
10964
}
10965
 
10966
struct percent_op_match
10967
{
10968
  const char *str;
10969
  bfd_reloc_code_real_type reloc;
10970
};
10971
 
10972
static const struct percent_op_match mips_percent_op[] =
10973
{
10974
  {"%lo", BFD_RELOC_LO16},
10975
#ifdef OBJ_ELF
10976
  {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
10977
  {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
10978
  {"%call16", BFD_RELOC_MIPS_CALL16},
10979
  {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
10980
  {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
10981
  {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
10982
  {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
10983
  {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
10984
  {"%got", BFD_RELOC_MIPS_GOT16},
10985
  {"%gp_rel", BFD_RELOC_GPREL16},
10986
  {"%half", BFD_RELOC_16},
10987
  {"%highest", BFD_RELOC_MIPS_HIGHEST},
10988
  {"%higher", BFD_RELOC_MIPS_HIGHER},
10989
  {"%neg", BFD_RELOC_MIPS_SUB},
10990
  {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
10991
  {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
10992
  {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
10993
  {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
10994
  {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
10995
  {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
10996
  {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
10997
#endif
10998
  {"%hi", BFD_RELOC_HI16_S}
10999
};
11000
 
11001
static const struct percent_op_match mips16_percent_op[] =
11002
{
11003
  {"%lo", BFD_RELOC_MIPS16_LO16},
11004
  {"%gprel", BFD_RELOC_MIPS16_GPREL},
11005
  {"%got", BFD_RELOC_MIPS16_GOT16},
11006
  {"%call16", BFD_RELOC_MIPS16_CALL16},
11007
  {"%hi", BFD_RELOC_MIPS16_HI16_S}
11008
};
11009
 
11010
 
11011
/* Return true if *STR points to a relocation operator.  When returning true,
11012
   move *STR over the operator and store its relocation code in *RELOC.
11013
   Leave both *STR and *RELOC alone when returning false.  */
11014
 
11015
static bfd_boolean
11016
parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
11017
{
11018
  const struct percent_op_match *percent_op;
11019
  size_t limit, i;
11020
 
11021
  if (mips_opts.mips16)
11022
    {
11023
      percent_op = mips16_percent_op;
11024
      limit = ARRAY_SIZE (mips16_percent_op);
11025
    }
11026
  else
11027
    {
11028
      percent_op = mips_percent_op;
11029
      limit = ARRAY_SIZE (mips_percent_op);
11030
    }
11031
 
11032
  for (i = 0; i < limit; i++)
11033
    if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
11034
      {
11035
        int len = strlen (percent_op[i].str);
11036
 
11037
        if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
11038
          continue;
11039
 
11040
        *str += strlen (percent_op[i].str);
11041
        *reloc = percent_op[i].reloc;
11042
 
11043
        /* Check whether the output BFD supports this relocation.
11044
           If not, issue an error and fall back on something safe.  */
11045
        if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
11046
          {
11047
            as_bad (_("relocation %s isn't supported by the current ABI"),
11048
                    percent_op[i].str);
11049
            *reloc = BFD_RELOC_UNUSED;
11050
          }
11051
        return TRUE;
11052
      }
11053
  return FALSE;
11054
}
11055
 
11056
 
11057
/* Parse string STR as a 16-bit relocatable operand.  Store the
11058
   expression in *EP and the relocations in the array starting
11059
   at RELOC.  Return the number of relocation operators used.
11060
 
11061
   On exit, EXPR_END points to the first character after the expression.  */
11062
 
11063
static size_t
11064
my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
11065
                       char *str)
11066
{
11067
  bfd_reloc_code_real_type reversed_reloc[3];
11068
  size_t reloc_index, i;
11069
  int crux_depth, str_depth;
11070
  char *crux;
11071
 
11072
  /* Search for the start of the main expression, recoding relocations
11073
     in REVERSED_RELOC.  End the loop with CRUX pointing to the start
11074
     of the main expression and with CRUX_DEPTH containing the number
11075
     of open brackets at that point.  */
11076
  reloc_index = -1;
11077
  str_depth = 0;
11078
  do
11079
    {
11080
      reloc_index++;
11081
      crux = str;
11082
      crux_depth = str_depth;
11083
 
11084
      /* Skip over whitespace and brackets, keeping count of the number
11085
         of brackets.  */
11086
      while (*str == ' ' || *str == '\t' || *str == '(')
11087
        if (*str++ == '(')
11088
          str_depth++;
11089
    }
11090
  while (*str == '%'
11091
         && reloc_index < (HAVE_NEWABI ? 3 : 1)
11092
         && parse_relocation (&str, &reversed_reloc[reloc_index]));
11093
 
11094
  my_getExpression (ep, crux);
11095
  str = expr_end;
11096
 
11097
  /* Match every open bracket.  */
11098
  while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
11099
    if (*str++ == ')')
11100
      crux_depth--;
11101
 
11102
  if (crux_depth > 0)
11103
    as_bad (_("unclosed '('"));
11104
 
11105
  expr_end = str;
11106
 
11107
  if (reloc_index != 0)
11108
    {
11109
      prev_reloc_op_frag = frag_now;
11110
      for (i = 0; i < reloc_index; i++)
11111
        reloc[i] = reversed_reloc[reloc_index - 1 - i];
11112
    }
11113
 
11114
  return reloc_index;
11115
}
11116
 
11117
static void
11118
my_getExpression (expressionS *ep, char *str)
11119
{
11120
  char *save_in;
11121
  valueT val;
11122
 
11123
  save_in = input_line_pointer;
11124
  input_line_pointer = str;
11125
  expression (ep);
11126
  expr_end = input_line_pointer;
11127
  input_line_pointer = save_in;
11128
 
11129
  /* If we are in mips16 mode, and this is an expression based on `.',
11130
     then we bump the value of the symbol by 1 since that is how other
11131
     text symbols are handled.  We don't bother to handle complex
11132
     expressions, just `.' plus or minus a constant.  */
11133
  if (mips_opts.mips16
11134
      && ep->X_op == O_symbol
11135
      && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
11136
      && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
11137
      && symbol_get_frag (ep->X_add_symbol) == frag_now
11138
      && symbol_constant_p (ep->X_add_symbol)
11139
      && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
11140
    S_SET_VALUE (ep->X_add_symbol, val + 1);
11141
}
11142
 
11143
char *
11144
md_atof (int type, char *litP, int *sizeP)
11145
{
11146
  return ieee_md_atof (type, litP, sizeP, target_big_endian);
11147
}
11148
 
11149
void
11150
md_number_to_chars (char *buf, valueT val, int n)
11151
{
11152
  if (target_big_endian)
11153
    number_to_chars_bigendian (buf, val, n);
11154
  else
11155
    number_to_chars_littleendian (buf, val, n);
11156
}
11157
 
11158
#ifdef OBJ_ELF
11159
static int support_64bit_objects(void)
11160
{
11161
  const char **list, **l;
11162
  int yes;
11163
 
11164
  list = bfd_target_list ();
11165
  for (l = list; *l != NULL; l++)
11166
#ifdef TE_TMIPS
11167
    /* This is traditional mips */
11168
    if (strcmp (*l, "elf64-tradbigmips") == 0
11169
        || strcmp (*l, "elf64-tradlittlemips") == 0)
11170
#else
11171
    if (strcmp (*l, "elf64-bigmips") == 0
11172
        || strcmp (*l, "elf64-littlemips") == 0)
11173
#endif
11174
      break;
11175
  yes = (*l != NULL);
11176
  free (list);
11177
  return yes;
11178
}
11179
#endif /* OBJ_ELF */
11180
 
11181
const char *md_shortopts = "O::g::G:";
11182
 
11183
enum options
11184
  {
11185
    OPTION_MARCH = OPTION_MD_BASE,
11186
    OPTION_MTUNE,
11187
    OPTION_MIPS1,
11188
    OPTION_MIPS2,
11189
    OPTION_MIPS3,
11190
    OPTION_MIPS4,
11191
    OPTION_MIPS5,
11192
    OPTION_MIPS32,
11193
    OPTION_MIPS64,
11194
    OPTION_MIPS32R2,
11195
    OPTION_MIPS64R2,
11196
    OPTION_MIPS16,
11197
    OPTION_NO_MIPS16,
11198
    OPTION_MIPS3D,
11199
    OPTION_NO_MIPS3D,
11200
    OPTION_MDMX,
11201
    OPTION_NO_MDMX,
11202
    OPTION_DSP,
11203
    OPTION_NO_DSP,
11204
    OPTION_MT,
11205
    OPTION_NO_MT,
11206
    OPTION_SMARTMIPS,
11207
    OPTION_NO_SMARTMIPS,
11208
    OPTION_DSPR2,
11209
    OPTION_NO_DSPR2,
11210
    OPTION_COMPAT_ARCH_BASE,
11211
    OPTION_M4650,
11212
    OPTION_NO_M4650,
11213
    OPTION_M4010,
11214
    OPTION_NO_M4010,
11215
    OPTION_M4100,
11216
    OPTION_NO_M4100,
11217
    OPTION_M3900,
11218
    OPTION_NO_M3900,
11219
    OPTION_M7000_HILO_FIX,
11220
    OPTION_MNO_7000_HILO_FIX,
11221
    OPTION_FIX_24K,
11222
    OPTION_NO_FIX_24K,
11223
    OPTION_FIX_VR4120,
11224
    OPTION_NO_FIX_VR4120,
11225
    OPTION_FIX_VR4130,
11226
    OPTION_NO_FIX_VR4130,
11227
    OPTION_TRAP,
11228
    OPTION_BREAK,
11229
    OPTION_EB,
11230
    OPTION_EL,
11231
    OPTION_FP32,
11232
    OPTION_GP32,
11233
    OPTION_CONSTRUCT_FLOATS,
11234
    OPTION_NO_CONSTRUCT_FLOATS,
11235
    OPTION_FP64,
11236
    OPTION_GP64,
11237
    OPTION_RELAX_BRANCH,
11238
    OPTION_NO_RELAX_BRANCH,
11239
    OPTION_MSHARED,
11240
    OPTION_MNO_SHARED,
11241
    OPTION_MSYM32,
11242
    OPTION_MNO_SYM32,
11243
    OPTION_SOFT_FLOAT,
11244
    OPTION_HARD_FLOAT,
11245
    OPTION_SINGLE_FLOAT,
11246
    OPTION_DOUBLE_FLOAT,
11247
    OPTION_32,
11248
#ifdef OBJ_ELF
11249
    OPTION_CALL_SHARED,
11250
    OPTION_CALL_NONPIC,
11251
    OPTION_NON_SHARED,
11252
    OPTION_XGOT,
11253
    OPTION_MABI,
11254
    OPTION_N32,
11255
    OPTION_64,
11256
    OPTION_MDEBUG,
11257
    OPTION_NO_MDEBUG,
11258
    OPTION_PDR,
11259
    OPTION_NO_PDR,
11260
    OPTION_MVXWORKS_PIC,
11261
#endif /* OBJ_ELF */
11262
    OPTION_END_OF_ENUM
11263
  };
11264
 
11265
struct option md_longopts[] =
11266
{
11267
  /* Options which specify architecture.  */
11268
  {"march", required_argument, NULL, OPTION_MARCH},
11269
  {"mtune", required_argument, NULL, OPTION_MTUNE},
11270
  {"mips0", no_argument, NULL, OPTION_MIPS1},
11271
  {"mips1", no_argument, NULL, OPTION_MIPS1},
11272
  {"mips2", no_argument, NULL, OPTION_MIPS2},
11273
  {"mips3", no_argument, NULL, OPTION_MIPS3},
11274
  {"mips4", no_argument, NULL, OPTION_MIPS4},
11275
  {"mips5", no_argument, NULL, OPTION_MIPS5},
11276
  {"mips32", no_argument, NULL, OPTION_MIPS32},
11277
  {"mips64", no_argument, NULL, OPTION_MIPS64},
11278
  {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
11279
  {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
11280
 
11281
  /* Options which specify Application Specific Extensions (ASEs).  */
11282
  {"mips16", no_argument, NULL, OPTION_MIPS16},
11283
  {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
11284
  {"mips3d", no_argument, NULL, OPTION_MIPS3D},
11285
  {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
11286
  {"mdmx", no_argument, NULL, OPTION_MDMX},
11287
  {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
11288
  {"mdsp", no_argument, NULL, OPTION_DSP},
11289
  {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
11290
  {"mmt", no_argument, NULL, OPTION_MT},
11291
  {"mno-mt", no_argument, NULL, OPTION_NO_MT},
11292
  {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
11293
  {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
11294
  {"mdspr2", no_argument, NULL, OPTION_DSPR2},
11295
  {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
11296
 
11297
  /* Old-style architecture options.  Don't add more of these.  */
11298
  {"m4650", no_argument, NULL, OPTION_M4650},
11299
  {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
11300
  {"m4010", no_argument, NULL, OPTION_M4010},
11301
  {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
11302
  {"m4100", no_argument, NULL, OPTION_M4100},
11303
  {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
11304
  {"m3900", no_argument, NULL, OPTION_M3900},
11305
  {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
11306
 
11307
  /* Options which enable bug fixes.  */
11308
  {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
11309
  {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11310
  {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11311
  {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
11312
  {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
11313
  {"mfix-vr4130",    no_argument, NULL, OPTION_FIX_VR4130},
11314
  {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
11315
  {"mfix-24k",    no_argument, NULL, OPTION_FIX_24K},
11316
  {"mno-fix-24k", no_argument, NULL, OPTION_NO_FIX_24K},
11317
 
11318
  /* Miscellaneous options.  */
11319
  {"trap", no_argument, NULL, OPTION_TRAP},
11320
  {"no-break", no_argument, NULL, OPTION_TRAP},
11321
  {"break", no_argument, NULL, OPTION_BREAK},
11322
  {"no-trap", no_argument, NULL, OPTION_BREAK},
11323
  {"EB", no_argument, NULL, OPTION_EB},
11324
  {"EL", no_argument, NULL, OPTION_EL},
11325
  {"mfp32", no_argument, NULL, OPTION_FP32},
11326
  {"mgp32", no_argument, NULL, OPTION_GP32},
11327
  {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
11328
  {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
11329
  {"mfp64", no_argument, NULL, OPTION_FP64},
11330
  {"mgp64", no_argument, NULL, OPTION_GP64},
11331
  {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
11332
  {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
11333
  {"mshared", no_argument, NULL, OPTION_MSHARED},
11334
  {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
11335
  {"msym32", no_argument, NULL, OPTION_MSYM32},
11336
  {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
11337
  {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
11338
  {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
11339
  {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
11340
  {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
11341
 
11342
  /* Strictly speaking this next option is ELF specific,
11343
     but we allow it for other ports as well in order to
11344
     make testing easier.  */
11345
  {"32",          no_argument, NULL, OPTION_32},
11346
 
11347
  /* ELF-specific options.  */
11348
#ifdef OBJ_ELF
11349
  {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
11350
  {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
11351
  {"call_nonpic", no_argument, NULL, OPTION_CALL_NONPIC},
11352
  {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
11353
  {"xgot",        no_argument, NULL, OPTION_XGOT},
11354
  {"mabi", required_argument, NULL, OPTION_MABI},
11355
  {"n32",         no_argument, NULL, OPTION_N32},
11356
  {"64",          no_argument, NULL, OPTION_64},
11357
  {"mdebug", no_argument, NULL, OPTION_MDEBUG},
11358
  {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
11359
  {"mpdr", no_argument, NULL, OPTION_PDR},
11360
  {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
11361
  {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
11362
#endif /* OBJ_ELF */
11363
 
11364
  {NULL, no_argument, NULL, 0}
11365
};
11366
size_t md_longopts_size = sizeof (md_longopts);
11367
 
11368
/* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
11369
   NEW_VALUE.  Warn if another value was already specified.  Note:
11370
   we have to defer parsing the -march and -mtune arguments in order
11371
   to handle 'from-abi' correctly, since the ABI might be specified
11372
   in a later argument.  */
11373
 
11374
static void
11375
mips_set_option_string (const char **string_ptr, const char *new_value)
11376
{
11377
  if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
11378
    as_warn (_("A different %s was already specified, is now %s"),
11379
             string_ptr == &mips_arch_string ? "-march" : "-mtune",
11380
             new_value);
11381
 
11382
  *string_ptr = new_value;
11383
}
11384
 
11385
int
11386
md_parse_option (int c, char *arg)
11387
{
11388
  switch (c)
11389
    {
11390
    case OPTION_CONSTRUCT_FLOATS:
11391
      mips_disable_float_construction = 0;
11392
      break;
11393
 
11394
    case OPTION_NO_CONSTRUCT_FLOATS:
11395
      mips_disable_float_construction = 1;
11396
      break;
11397
 
11398
    case OPTION_TRAP:
11399
      mips_trap = 1;
11400
      break;
11401
 
11402
    case OPTION_BREAK:
11403
      mips_trap = 0;
11404
      break;
11405
 
11406
    case OPTION_EB:
11407
      target_big_endian = 1;
11408
      break;
11409
 
11410
    case OPTION_EL:
11411
      target_big_endian = 0;
11412
      break;
11413
 
11414
    case 'O':
11415
      if (arg == NULL)
11416
        mips_optimize = 1;
11417
      else if (arg[0] == '0')
11418
        mips_optimize = 0;
11419
      else if (arg[0] == '1')
11420
        mips_optimize = 1;
11421
      else
11422
        mips_optimize = 2;
11423
      break;
11424
 
11425
    case 'g':
11426
      if (arg == NULL)
11427
        mips_debug = 2;
11428
      else
11429
        mips_debug = atoi (arg);
11430
      break;
11431
 
11432
    case OPTION_MIPS1:
11433
      file_mips_isa = ISA_MIPS1;
11434
      break;
11435
 
11436
    case OPTION_MIPS2:
11437
      file_mips_isa = ISA_MIPS2;
11438
      break;
11439
 
11440
    case OPTION_MIPS3:
11441
      file_mips_isa = ISA_MIPS3;
11442
      break;
11443
 
11444
    case OPTION_MIPS4:
11445
      file_mips_isa = ISA_MIPS4;
11446
      break;
11447
 
11448
    case OPTION_MIPS5:
11449
      file_mips_isa = ISA_MIPS5;
11450
      break;
11451
 
11452
    case OPTION_MIPS32:
11453
      file_mips_isa = ISA_MIPS32;
11454
      break;
11455
 
11456
    case OPTION_MIPS32R2:
11457
      file_mips_isa = ISA_MIPS32R2;
11458
      break;
11459
 
11460
    case OPTION_MIPS64R2:
11461
      file_mips_isa = ISA_MIPS64R2;
11462
      break;
11463
 
11464
    case OPTION_MIPS64:
11465
      file_mips_isa = ISA_MIPS64;
11466
      break;
11467
 
11468
    case OPTION_MTUNE:
11469
      mips_set_option_string (&mips_tune_string, arg);
11470
      break;
11471
 
11472
    case OPTION_MARCH:
11473
      mips_set_option_string (&mips_arch_string, arg);
11474
      break;
11475
 
11476
    case OPTION_M4650:
11477
      mips_set_option_string (&mips_arch_string, "4650");
11478
      mips_set_option_string (&mips_tune_string, "4650");
11479
      break;
11480
 
11481
    case OPTION_NO_M4650:
11482
      break;
11483
 
11484
    case OPTION_M4010:
11485
      mips_set_option_string (&mips_arch_string, "4010");
11486
      mips_set_option_string (&mips_tune_string, "4010");
11487
      break;
11488
 
11489
    case OPTION_NO_M4010:
11490
      break;
11491
 
11492
    case OPTION_M4100:
11493
      mips_set_option_string (&mips_arch_string, "4100");
11494
      mips_set_option_string (&mips_tune_string, "4100");
11495
      break;
11496
 
11497
    case OPTION_NO_M4100:
11498
      break;
11499
 
11500
    case OPTION_M3900:
11501
      mips_set_option_string (&mips_arch_string, "3900");
11502
      mips_set_option_string (&mips_tune_string, "3900");
11503
      break;
11504
 
11505
    case OPTION_NO_M3900:
11506
      break;
11507
 
11508
    case OPTION_MDMX:
11509
      mips_opts.ase_mdmx = 1;
11510
      break;
11511
 
11512
    case OPTION_NO_MDMX:
11513
      mips_opts.ase_mdmx = 0;
11514
      break;
11515
 
11516
    case OPTION_DSP:
11517
      mips_opts.ase_dsp = 1;
11518
      mips_opts.ase_dspr2 = 0;
11519
      break;
11520
 
11521
    case OPTION_NO_DSP:
11522
      mips_opts.ase_dsp = 0;
11523
      mips_opts.ase_dspr2 = 0;
11524
      break;
11525
 
11526
    case OPTION_DSPR2:
11527
      mips_opts.ase_dspr2 = 1;
11528
      mips_opts.ase_dsp = 1;
11529
      break;
11530
 
11531
    case OPTION_NO_DSPR2:
11532
      mips_opts.ase_dspr2 = 0;
11533
      mips_opts.ase_dsp = 0;
11534
      break;
11535
 
11536
    case OPTION_MT:
11537
      mips_opts.ase_mt = 1;
11538
      break;
11539
 
11540
    case OPTION_NO_MT:
11541
      mips_opts.ase_mt = 0;
11542
      break;
11543
 
11544
    case OPTION_MIPS16:
11545
      mips_opts.mips16 = 1;
11546
      mips_no_prev_insn ();
11547
      break;
11548
 
11549
    case OPTION_NO_MIPS16:
11550
      mips_opts.mips16 = 0;
11551
      mips_no_prev_insn ();
11552
      break;
11553
 
11554
    case OPTION_MIPS3D:
11555
      mips_opts.ase_mips3d = 1;
11556
      break;
11557
 
11558
    case OPTION_NO_MIPS3D:
11559
      mips_opts.ase_mips3d = 0;
11560
      break;
11561
 
11562
    case OPTION_SMARTMIPS:
11563
      mips_opts.ase_smartmips = 1;
11564
      break;
11565
 
11566
    case OPTION_NO_SMARTMIPS:
11567
      mips_opts.ase_smartmips = 0;
11568
      break;
11569
 
11570
    case OPTION_FIX_24K:
11571
      mips_fix_24k = 1;
11572
      break;
11573
 
11574
    case OPTION_NO_FIX_24K:
11575
      mips_fix_24k = 0;
11576
      break;
11577
 
11578
    case OPTION_FIX_VR4120:
11579
      mips_fix_vr4120 = 1;
11580
      break;
11581
 
11582
    case OPTION_NO_FIX_VR4120:
11583
      mips_fix_vr4120 = 0;
11584
      break;
11585
 
11586
    case OPTION_FIX_VR4130:
11587
      mips_fix_vr4130 = 1;
11588
      break;
11589
 
11590
    case OPTION_NO_FIX_VR4130:
11591
      mips_fix_vr4130 = 0;
11592
      break;
11593
 
11594
    case OPTION_RELAX_BRANCH:
11595
      mips_relax_branch = 1;
11596
      break;
11597
 
11598
    case OPTION_NO_RELAX_BRANCH:
11599
      mips_relax_branch = 0;
11600
      break;
11601
 
11602
    case OPTION_MSHARED:
11603
      mips_in_shared = TRUE;
11604
      break;
11605
 
11606
    case OPTION_MNO_SHARED:
11607
      mips_in_shared = FALSE;
11608
      break;
11609
 
11610
    case OPTION_MSYM32:
11611
      mips_opts.sym32 = TRUE;
11612
      break;
11613
 
11614
    case OPTION_MNO_SYM32:
11615
      mips_opts.sym32 = FALSE;
11616
      break;
11617
 
11618
#ifdef OBJ_ELF
11619
      /* When generating ELF code, we permit -KPIC and -call_shared to
11620
         select SVR4_PIC, and -non_shared to select no PIC.  This is
11621
         intended to be compatible with Irix 5.  */
11622
    case OPTION_CALL_SHARED:
11623
      if (!IS_ELF)
11624
        {
11625
          as_bad (_("-call_shared is supported only for ELF format"));
11626
          return 0;
11627
        }
11628
      mips_pic = SVR4_PIC;
11629
      mips_abicalls = TRUE;
11630
      break;
11631
 
11632
    case OPTION_CALL_NONPIC:
11633
      if (!IS_ELF)
11634
        {
11635
          as_bad (_("-call_nonpic is supported only for ELF format"));
11636
          return 0;
11637
        }
11638
      mips_pic = NO_PIC;
11639
      mips_abicalls = TRUE;
11640
      break;
11641
 
11642
    case OPTION_NON_SHARED:
11643
      if (!IS_ELF)
11644
        {
11645
          as_bad (_("-non_shared is supported only for ELF format"));
11646
          return 0;
11647
        }
11648
      mips_pic = NO_PIC;
11649
      mips_abicalls = FALSE;
11650
      break;
11651
 
11652
      /* The -xgot option tells the assembler to use 32 bit offsets
11653
         when accessing the got in SVR4_PIC mode.  It is for Irix
11654
         compatibility.  */
11655
    case OPTION_XGOT:
11656
      mips_big_got = 1;
11657
      break;
11658
#endif /* OBJ_ELF */
11659
 
11660
    case 'G':
11661
      g_switch_value = atoi (arg);
11662
      g_switch_seen = 1;
11663
      break;
11664
 
11665
      /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
11666
         and -mabi=64.  */
11667
    case OPTION_32:
11668
      if (IS_ELF)
11669
        mips_abi = O32_ABI;
11670
      /* We silently ignore -32 for non-ELF targets.  This greatly
11671
         simplifies the construction of the MIPS GAS test cases.  */
11672
      break;
11673
 
11674
#ifdef OBJ_ELF
11675
    case OPTION_N32:
11676
      if (!IS_ELF)
11677
        {
11678
          as_bad (_("-n32 is supported for ELF format only"));
11679
          return 0;
11680
        }
11681
      mips_abi = N32_ABI;
11682
      break;
11683
 
11684
    case OPTION_64:
11685
      if (!IS_ELF)
11686
        {
11687
          as_bad (_("-64 is supported for ELF format only"));
11688
          return 0;
11689
        }
11690
      mips_abi = N64_ABI;
11691
      if (!support_64bit_objects())
11692
        as_fatal (_("No compiled in support for 64 bit object file format"));
11693
      break;
11694
#endif /* OBJ_ELF */
11695
 
11696
    case OPTION_GP32:
11697
      file_mips_gp32 = 1;
11698
      break;
11699
 
11700
    case OPTION_GP64:
11701
      file_mips_gp32 = 0;
11702
      break;
11703
 
11704
    case OPTION_FP32:
11705
      file_mips_fp32 = 1;
11706
      break;
11707
 
11708
    case OPTION_FP64:
11709
      file_mips_fp32 = 0;
11710
      break;
11711
 
11712
    case OPTION_SINGLE_FLOAT:
11713
      file_mips_single_float = 1;
11714
      break;
11715
 
11716
    case OPTION_DOUBLE_FLOAT:
11717
      file_mips_single_float = 0;
11718
      break;
11719
 
11720
    case OPTION_SOFT_FLOAT:
11721
      file_mips_soft_float = 1;
11722
      break;
11723
 
11724
    case OPTION_HARD_FLOAT:
11725
      file_mips_soft_float = 0;
11726
      break;
11727
 
11728
#ifdef OBJ_ELF
11729
    case OPTION_MABI:
11730
      if (!IS_ELF)
11731
        {
11732
          as_bad (_("-mabi is supported for ELF format only"));
11733
          return 0;
11734
        }
11735
      if (strcmp (arg, "32") == 0)
11736
        mips_abi = O32_ABI;
11737
      else if (strcmp (arg, "o64") == 0)
11738
        mips_abi = O64_ABI;
11739
      else if (strcmp (arg, "n32") == 0)
11740
        mips_abi = N32_ABI;
11741
      else if (strcmp (arg, "64") == 0)
11742
        {
11743
          mips_abi = N64_ABI;
11744
          if (! support_64bit_objects())
11745
            as_fatal (_("No compiled in support for 64 bit object file "
11746
                        "format"));
11747
        }
11748
      else if (strcmp (arg, "eabi") == 0)
11749
        mips_abi = EABI_ABI;
11750
      else
11751
        {
11752
          as_fatal (_("invalid abi -mabi=%s"), arg);
11753
          return 0;
11754
        }
11755
      break;
11756
#endif /* OBJ_ELF */
11757
 
11758
    case OPTION_M7000_HILO_FIX:
11759
      mips_7000_hilo_fix = TRUE;
11760
      break;
11761
 
11762
    case OPTION_MNO_7000_HILO_FIX:
11763
      mips_7000_hilo_fix = FALSE;
11764
      break;
11765
 
11766
#ifdef OBJ_ELF
11767
    case OPTION_MDEBUG:
11768
      mips_flag_mdebug = TRUE;
11769
      break;
11770
 
11771
    case OPTION_NO_MDEBUG:
11772
      mips_flag_mdebug = FALSE;
11773
      break;
11774
 
11775
    case OPTION_PDR:
11776
      mips_flag_pdr = TRUE;
11777
      break;
11778
 
11779
    case OPTION_NO_PDR:
11780
      mips_flag_pdr = FALSE;
11781
      break;
11782
 
11783
    case OPTION_MVXWORKS_PIC:
11784
      mips_pic = VXWORKS_PIC;
11785
      break;
11786
#endif /* OBJ_ELF */
11787
 
11788
    default:
11789
      return 0;
11790
    }
11791
 
11792
  return 1;
11793
}
11794
 
11795
/* Set up globals to generate code for the ISA or processor
11796
   described by INFO.  */
11797
 
11798
static void
11799
mips_set_architecture (const struct mips_cpu_info *info)
11800
{
11801
  if (info != 0)
11802
    {
11803
      file_mips_arch = info->cpu;
11804
      mips_opts.arch = info->cpu;
11805
      mips_opts.isa = info->isa;
11806
    }
11807
}
11808
 
11809
 
11810
/* Likewise for tuning.  */
11811
 
11812
static void
11813
mips_set_tune (const struct mips_cpu_info *info)
11814
{
11815
  if (info != 0)
11816
    mips_tune = info->cpu;
11817
}
11818
 
11819
 
11820
void
11821
mips_after_parse_args (void)
11822
{
11823
  const struct mips_cpu_info *arch_info = 0;
11824
  const struct mips_cpu_info *tune_info = 0;
11825
 
11826
  /* GP relative stuff not working for PE */
11827
  if (strncmp (TARGET_OS, "pe", 2) == 0)
11828
    {
11829
      if (g_switch_seen && g_switch_value != 0)
11830
        as_bad (_("-G not supported in this configuration."));
11831
      g_switch_value = 0;
11832
    }
11833
 
11834
  if (mips_abi == NO_ABI)
11835
    mips_abi = MIPS_DEFAULT_ABI;
11836
 
11837
  /* The following code determines the architecture and register size.
11838
     Similar code was added to GCC 3.3 (see override_options() in
11839
     config/mips/mips.c).  The GAS and GCC code should be kept in sync
11840
     as much as possible.  */
11841
 
11842
  if (mips_arch_string != 0)
11843
    arch_info = mips_parse_cpu ("-march", mips_arch_string);
11844
 
11845
  if (file_mips_isa != ISA_UNKNOWN)
11846
    {
11847
      /* Handle -mipsN.  At this point, file_mips_isa contains the
11848
         ISA level specified by -mipsN, while arch_info->isa contains
11849
         the -march selection (if any).  */
11850
      if (arch_info != 0)
11851
        {
11852
          /* -march takes precedence over -mipsN, since it is more descriptive.
11853
             There's no harm in specifying both as long as the ISA levels
11854
             are the same.  */
11855
          if (file_mips_isa != arch_info->isa)
11856
            as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
11857
                    mips_cpu_info_from_isa (file_mips_isa)->name,
11858
                    mips_cpu_info_from_isa (arch_info->isa)->name);
11859
        }
11860
      else
11861
        arch_info = mips_cpu_info_from_isa (file_mips_isa);
11862
    }
11863
 
11864
  if (arch_info == 0)
11865
    arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
11866
 
11867
  if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
11868
    as_bad (_("-march=%s is not compatible with the selected ABI"),
11869
            arch_info->name);
11870
 
11871
  mips_set_architecture (arch_info);
11872
 
11873
  /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
11874
  if (mips_tune_string != 0)
11875
    tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
11876
 
11877
  if (tune_info == 0)
11878
    mips_set_tune (arch_info);
11879
  else
11880
    mips_set_tune (tune_info);
11881
 
11882
  if (file_mips_gp32 >= 0)
11883
    {
11884
      /* The user specified the size of the integer registers.  Make sure
11885
         it agrees with the ABI and ISA.  */
11886
      if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
11887
        as_bad (_("-mgp64 used with a 32-bit processor"));
11888
      else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
11889
        as_bad (_("-mgp32 used with a 64-bit ABI"));
11890
      else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
11891
        as_bad (_("-mgp64 used with a 32-bit ABI"));
11892
    }
11893
  else
11894
    {
11895
      /* Infer the integer register size from the ABI and processor.
11896
         Restrict ourselves to 32-bit registers if that's all the
11897
         processor has, or if the ABI cannot handle 64-bit registers.  */
11898
      file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
11899
                        || !ISA_HAS_64BIT_REGS (mips_opts.isa));
11900
    }
11901
 
11902
  switch (file_mips_fp32)
11903
    {
11904
    default:
11905
    case -1:
11906
      /* No user specified float register size.
11907
         ??? GAS treats single-float processors as though they had 64-bit
11908
         float registers (although it complains when double-precision
11909
         instructions are used).  As things stand, saying they have 32-bit
11910
         registers would lead to spurious "register must be even" messages.
11911
         So here we assume float registers are never smaller than the
11912
         integer ones.  */
11913
      if (file_mips_gp32 == 0)
11914
        /* 64-bit integer registers implies 64-bit float registers.  */
11915
        file_mips_fp32 = 0;
11916
      else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
11917
               && ISA_HAS_64BIT_FPRS (mips_opts.isa))
11918
        /* -mips3d and -mdmx imply 64-bit float registers, if possible.  */
11919
        file_mips_fp32 = 0;
11920
      else
11921
        /* 32-bit float registers.  */
11922
        file_mips_fp32 = 1;
11923
      break;
11924
 
11925
    /* The user specified the size of the float registers.  Check if it
11926
       agrees with the ABI and ISA.  */
11927
    case 0:
11928
      if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
11929
        as_bad (_("-mfp64 used with a 32-bit fpu"));
11930
      else if (ABI_NEEDS_32BIT_REGS (mips_abi)
11931
               && !ISA_HAS_MXHC1 (mips_opts.isa))
11932
        as_warn (_("-mfp64 used with a 32-bit ABI"));
11933
      break;
11934
    case 1:
11935
      if (ABI_NEEDS_64BIT_REGS (mips_abi))
11936
        as_warn (_("-mfp32 used with a 64-bit ABI"));
11937
      break;
11938
    }
11939
 
11940
  /* End of GCC-shared inference code.  */
11941
 
11942
  /* This flag is set when we have a 64-bit capable CPU but use only
11943
     32-bit wide registers.  Note that EABI does not use it.  */
11944
  if (ISA_HAS_64BIT_REGS (mips_opts.isa)
11945
      && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
11946
          || mips_abi == O32_ABI))
11947
    mips_32bitmode = 1;
11948
 
11949
  if (mips_opts.isa == ISA_MIPS1 && mips_trap)
11950
    as_bad (_("trap exception not supported at ISA 1"));
11951
 
11952
  /* If the selected architecture includes support for ASEs, enable
11953
     generation of code for them.  */
11954
  if (mips_opts.mips16 == -1)
11955
    mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
11956
  if (mips_opts.ase_mips3d == -1)
11957
    mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
11958
                            && file_mips_fp32 == 0) ? 1 : 0;
11959
  if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
11960
    as_bad (_("-mfp32 used with -mips3d"));
11961
 
11962
  if (mips_opts.ase_mdmx == -1)
11963
    mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
11964
                          && file_mips_fp32 == 0) ? 1 : 0;
11965
  if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
11966
    as_bad (_("-mfp32 used with -mdmx"));
11967
 
11968
  if (mips_opts.ase_smartmips == -1)
11969
    mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
11970
  if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
11971
    as_warn (_("%s ISA does not support SmartMIPS"),
11972
             mips_cpu_info_from_isa (mips_opts.isa)->name);
11973
 
11974
  if (mips_opts.ase_dsp == -1)
11975
    mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
11976
  if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
11977
    as_warn (_("%s ISA does not support DSP ASE"),
11978
             mips_cpu_info_from_isa (mips_opts.isa)->name);
11979
 
11980
  if (mips_opts.ase_dspr2 == -1)
11981
    {
11982
      mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
11983
      mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
11984
    }
11985
  if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
11986
    as_warn (_("%s ISA does not support DSP R2 ASE"),
11987
             mips_cpu_info_from_isa (mips_opts.isa)->name);
11988
 
11989
  if (mips_opts.ase_mt == -1)
11990
    mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
11991
  if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
11992
    as_warn (_("%s ISA does not support MT ASE"),
11993
             mips_cpu_info_from_isa (mips_opts.isa)->name);
11994
 
11995
  file_mips_isa = mips_opts.isa;
11996
  file_ase_mips16 = mips_opts.mips16;
11997
  file_ase_mips3d = mips_opts.ase_mips3d;
11998
  file_ase_mdmx = mips_opts.ase_mdmx;
11999
  file_ase_smartmips = mips_opts.ase_smartmips;
12000
  file_ase_dsp = mips_opts.ase_dsp;
12001
  file_ase_dspr2 = mips_opts.ase_dspr2;
12002
  file_ase_mt = mips_opts.ase_mt;
12003
  mips_opts.gp32 = file_mips_gp32;
12004
  mips_opts.fp32 = file_mips_fp32;
12005
  mips_opts.soft_float = file_mips_soft_float;
12006
  mips_opts.single_float = file_mips_single_float;
12007
 
12008
  if (mips_flag_mdebug < 0)
12009
    {
12010
#ifdef OBJ_MAYBE_ECOFF
12011
      if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
12012
        mips_flag_mdebug = 1;
12013
      else
12014
#endif /* OBJ_MAYBE_ECOFF */
12015
        mips_flag_mdebug = 0;
12016
    }
12017
}
12018
 
12019
void
12020
mips_init_after_args (void)
12021
{
12022
  /* initialize opcodes */
12023
  bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
12024
  mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
12025
}
12026
 
12027
long
12028
md_pcrel_from (fixS *fixP)
12029
{
12030
  valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
12031
  switch (fixP->fx_r_type)
12032
    {
12033
    case BFD_RELOC_16_PCREL_S2:
12034
    case BFD_RELOC_MIPS_JMP:
12035
      /* Return the address of the delay slot.  */
12036
      return addr + 4;
12037
    default:
12038
      /* We have no relocation type for PC relative MIPS16 instructions.  */
12039
      if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
12040
        as_bad_where (fixP->fx_file, fixP->fx_line,
12041
                      _("PC relative MIPS16 instruction references a different section"));
12042
      return addr;
12043
    }
12044
}
12045
 
12046
/* This is called before the symbol table is processed.  In order to
12047
   work with gcc when using mips-tfile, we must keep all local labels.
12048
   However, in other cases, we want to discard them.  If we were
12049
   called with -g, but we didn't see any debugging information, it may
12050
   mean that gcc is smuggling debugging information through to
12051
   mips-tfile, in which case we must generate all local labels.  */
12052
 
12053
void
12054
mips_frob_file_before_adjust (void)
12055
{
12056
#ifndef NO_ECOFF_DEBUGGING
12057
  if (ECOFF_DEBUGGING
12058
      && mips_debug != 0
12059
      && ! ecoff_debugging_seen)
12060
    flag_keep_locals = 1;
12061
#endif
12062
}
12063
 
12064
/* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
12065
   the corresponding LO16 reloc.  This is called before md_apply_fix and
12066
   tc_gen_reloc.  Unmatched relocs can only be generated by use of explicit
12067
   relocation operators.
12068
 
12069
   For our purposes, a %lo() expression matches a %got() or %hi()
12070
   expression if:
12071
 
12072
      (a) it refers to the same symbol; and
12073
      (b) the offset applied in the %lo() expression is no lower than
12074
          the offset applied in the %got() or %hi().
12075
 
12076
   (b) allows us to cope with code like:
12077
 
12078
        lui     $4,%hi(foo)
12079
        lh      $4,%lo(foo+2)($4)
12080
 
12081
   ...which is legal on RELA targets, and has a well-defined behaviour
12082
   if the user knows that adding 2 to "foo" will not induce a carry to
12083
   the high 16 bits.
12084
 
12085
   When several %lo()s match a particular %got() or %hi(), we use the
12086
   following rules to distinguish them:
12087
 
12088
     (1) %lo()s with smaller offsets are a better match than %lo()s with
12089
         higher offsets.
12090
 
12091
     (2) %lo()s with no matching %got() or %hi() are better than those
12092
         that already have a matching %got() or %hi().
12093
 
12094
     (3) later %lo()s are better than earlier %lo()s.
12095
 
12096
   These rules are applied in order.
12097
 
12098
   (1) means, among other things, that %lo()s with identical offsets are
12099
   chosen if they exist.
12100
 
12101
   (2) means that we won't associate several high-part relocations with
12102
   the same low-part relocation unless there's no alternative.  Having
12103
   several high parts for the same low part is a GNU extension; this rule
12104
   allows careful users to avoid it.
12105
 
12106
   (3) is purely cosmetic.  mips_hi_fixup_list is is in reverse order,
12107
   with the last high-part relocation being at the front of the list.
12108
   It therefore makes sense to choose the last matching low-part
12109
   relocation, all other things being equal.  It's also easier
12110
   to code that way.  */
12111
 
12112
void
12113
mips_frob_file (void)
12114
{
12115
  struct mips_hi_fixup *l;
12116
  bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
12117
 
12118
  for (l = mips_hi_fixup_list; l != NULL; l = l->next)
12119
    {
12120
      segment_info_type *seginfo;
12121
      bfd_boolean matched_lo_p;
12122
      fixS **hi_pos, **lo_pos, **pos;
12123
 
12124
      gas_assert (reloc_needs_lo_p (l->fixp->fx_r_type));
12125
 
12126
      /* If a GOT16 relocation turns out to be against a global symbol,
12127
         there isn't supposed to be a matching LO.  */
12128
      if (got16_reloc_p (l->fixp->fx_r_type)
12129
          && !pic_need_relax (l->fixp->fx_addsy, l->seg))
12130
        continue;
12131
 
12132
      /* Check quickly whether the next fixup happens to be a matching %lo.  */
12133
      if (fixup_has_matching_lo_p (l->fixp))
12134
        continue;
12135
 
12136
      seginfo = seg_info (l->seg);
12137
 
12138
      /* Set HI_POS to the position of this relocation in the chain.
12139
         Set LO_POS to the position of the chosen low-part relocation.
12140
         MATCHED_LO_P is true on entry to the loop if *POS is a low-part
12141
         relocation that matches an immediately-preceding high-part
12142
         relocation.  */
12143
      hi_pos = NULL;
12144
      lo_pos = NULL;
12145
      matched_lo_p = FALSE;
12146
      looking_for_rtype = matching_lo_reloc (l->fixp->fx_r_type);
12147
 
12148
      for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
12149
        {
12150
          if (*pos == l->fixp)
12151
            hi_pos = pos;
12152
 
12153
          if ((*pos)->fx_r_type == looking_for_rtype
12154
              && (*pos)->fx_addsy == l->fixp->fx_addsy
12155
              && (*pos)->fx_offset >= l->fixp->fx_offset
12156
              && (lo_pos == NULL
12157
                  || (*pos)->fx_offset < (*lo_pos)->fx_offset
12158
                  || (!matched_lo_p
12159
                      && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
12160
            lo_pos = pos;
12161
 
12162
          matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
12163
                          && fixup_has_matching_lo_p (*pos));
12164
        }
12165
 
12166
      /* If we found a match, remove the high-part relocation from its
12167
         current position and insert it before the low-part relocation.
12168
         Make the offsets match so that fixup_has_matching_lo_p()
12169
         will return true.
12170
 
12171
         We don't warn about unmatched high-part relocations since some
12172
         versions of gcc have been known to emit dead "lui ...%hi(...)"
12173
         instructions.  */
12174
      if (lo_pos != NULL)
12175
        {
12176
          l->fixp->fx_offset = (*lo_pos)->fx_offset;
12177
          if (l->fixp->fx_next != *lo_pos)
12178
            {
12179
              *hi_pos = l->fixp->fx_next;
12180
              l->fixp->fx_next = *lo_pos;
12181
              *lo_pos = l->fixp;
12182
            }
12183
        }
12184
    }
12185
}
12186
 
12187
/* We may have combined relocations without symbols in the N32/N64 ABI.
12188
   We have to prevent gas from dropping them.  */
12189
 
12190
int
12191
mips_force_relocation (fixS *fixp)
12192
{
12193
  if (generic_force_reloc (fixp))
12194
    return 1;
12195
 
12196
  if (HAVE_NEWABI
12197
      && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
12198
      && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
12199
          || hi16_reloc_p (fixp->fx_r_type)
12200
          || lo16_reloc_p (fixp->fx_r_type)))
12201
    return 1;
12202
 
12203
  return 0;
12204
}
12205
 
12206
/* Apply a fixup to the object file.  */
12207
 
12208
void
12209
md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
12210
{
12211
  bfd_byte *buf;
12212
  long insn;
12213
  reloc_howto_type *howto;
12214
 
12215
  /* We ignore generic BFD relocations we don't know about.  */
12216
  howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
12217
  if (! howto)
12218
    return;
12219
 
12220
  gas_assert (fixP->fx_size == 4
12221
          || fixP->fx_r_type == BFD_RELOC_16
12222
          || fixP->fx_r_type == BFD_RELOC_64
12223
          || fixP->fx_r_type == BFD_RELOC_CTOR
12224
          || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
12225
          || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
12226
          || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
12227
          || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
12228
 
12229
  buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
12230
 
12231
  gas_assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2);
12232
 
12233
  /* Don't treat parts of a composite relocation as done.  There are two
12234
     reasons for this:
12235
 
12236
     (1) The second and third parts will be against 0 (RSS_UNDEF) but
12237
         should nevertheless be emitted if the first part is.
12238
 
12239
     (2) In normal usage, composite relocations are never assembly-time
12240
         constants.  The easiest way of dealing with the pathological
12241
         exceptions is to generate a relocation against STN_UNDEF and
12242
         leave everything up to the linker.  */
12243
  if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
12244
    fixP->fx_done = 1;
12245
 
12246
  switch (fixP->fx_r_type)
12247
    {
12248
    case BFD_RELOC_MIPS_TLS_GD:
12249
    case BFD_RELOC_MIPS_TLS_LDM:
12250
    case BFD_RELOC_MIPS_TLS_DTPREL32:
12251
    case BFD_RELOC_MIPS_TLS_DTPREL64:
12252
    case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
12253
    case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
12254
    case BFD_RELOC_MIPS_TLS_GOTTPREL:
12255
    case BFD_RELOC_MIPS_TLS_TPREL_HI16:
12256
    case BFD_RELOC_MIPS_TLS_TPREL_LO16:
12257
      S_SET_THREAD_LOCAL (fixP->fx_addsy);
12258
      /* fall through */
12259
 
12260
    case BFD_RELOC_MIPS_JMP:
12261
    case BFD_RELOC_MIPS_SHIFT5:
12262
    case BFD_RELOC_MIPS_SHIFT6:
12263
    case BFD_RELOC_MIPS_GOT_DISP:
12264
    case BFD_RELOC_MIPS_GOT_PAGE:
12265
    case BFD_RELOC_MIPS_GOT_OFST:
12266
    case BFD_RELOC_MIPS_SUB:
12267
    case BFD_RELOC_MIPS_INSERT_A:
12268
    case BFD_RELOC_MIPS_INSERT_B:
12269
    case BFD_RELOC_MIPS_DELETE:
12270
    case BFD_RELOC_MIPS_HIGHEST:
12271
    case BFD_RELOC_MIPS_HIGHER:
12272
    case BFD_RELOC_MIPS_SCN_DISP:
12273
    case BFD_RELOC_MIPS_REL16:
12274
    case BFD_RELOC_MIPS_RELGOT:
12275
    case BFD_RELOC_MIPS_JALR:
12276
    case BFD_RELOC_HI16:
12277
    case BFD_RELOC_HI16_S:
12278
    case BFD_RELOC_GPREL16:
12279
    case BFD_RELOC_MIPS_LITERAL:
12280
    case BFD_RELOC_MIPS_CALL16:
12281
    case BFD_RELOC_MIPS_GOT16:
12282
    case BFD_RELOC_GPREL32:
12283
    case BFD_RELOC_MIPS_GOT_HI16:
12284
    case BFD_RELOC_MIPS_GOT_LO16:
12285
    case BFD_RELOC_MIPS_CALL_HI16:
12286
    case BFD_RELOC_MIPS_CALL_LO16:
12287
    case BFD_RELOC_MIPS16_GPREL:
12288
    case BFD_RELOC_MIPS16_GOT16:
12289
    case BFD_RELOC_MIPS16_CALL16:
12290
    case BFD_RELOC_MIPS16_HI16:
12291
    case BFD_RELOC_MIPS16_HI16_S:
12292
    case BFD_RELOC_MIPS16_JMP:
12293
      /* Nothing needed to do.  The value comes from the reloc entry.  */
12294
      break;
12295
 
12296
    case BFD_RELOC_64:
12297
      /* This is handled like BFD_RELOC_32, but we output a sign
12298
         extended value if we are only 32 bits.  */
12299
      if (fixP->fx_done)
12300
        {
12301
          if (8 <= sizeof (valueT))
12302
            md_number_to_chars ((char *) buf, *valP, 8);
12303
          else
12304
            {
12305
              valueT hiv;
12306
 
12307
              if ((*valP & 0x80000000) != 0)
12308
                hiv = 0xffffffff;
12309
              else
12310
                hiv = 0;
12311
              md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
12312
                                  *valP, 4);
12313
              md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
12314
                                  hiv, 4);
12315
            }
12316
        }
12317
      break;
12318
 
12319
    case BFD_RELOC_RVA:
12320
    case BFD_RELOC_32:
12321
    case BFD_RELOC_16:
12322
      /* If we are deleting this reloc entry, we must fill in the
12323
         value now.  This can happen if we have a .word which is not
12324
         resolved when it appears but is later defined.  */
12325
      if (fixP->fx_done)
12326
        md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
12327
      break;
12328
 
12329
    case BFD_RELOC_LO16:
12330
    case BFD_RELOC_MIPS16_LO16:
12331
      /* FIXME: Now that embedded-PIC is gone, some of this code/comment
12332
         may be safe to remove, but if so it's not obvious.  */
12333
      /* When handling an embedded PIC switch statement, we can wind
12334
         up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
12335
      if (fixP->fx_done)
12336
        {
12337
          if (*valP + 0x8000 > 0xffff)
12338
            as_bad_where (fixP->fx_file, fixP->fx_line,
12339
                          _("relocation overflow"));
12340
          if (target_big_endian)
12341
            buf += 2;
12342
          md_number_to_chars ((char *) buf, *valP, 2);
12343
        }
12344
      break;
12345
 
12346
    case BFD_RELOC_16_PCREL_S2:
12347
      if ((*valP & 0x3) != 0)
12348
        as_bad_where (fixP->fx_file, fixP->fx_line,
12349
                      _("Branch to misaligned address (%lx)"), (long) *valP);
12350
 
12351
      /* We need to save the bits in the instruction since fixup_segment()
12352
         might be deleting the relocation entry (i.e., a branch within
12353
         the current segment).  */
12354
      if (! fixP->fx_done)
12355
        break;
12356
 
12357
      /* Update old instruction data.  */
12358
      if (target_big_endian)
12359
        insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
12360
      else
12361
        insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
12362
 
12363
      if (*valP + 0x20000 <= 0x3ffff)
12364
        {
12365
          insn |= (*valP >> 2) & 0xffff;
12366
          md_number_to_chars ((char *) buf, insn, 4);
12367
        }
12368
      else if (mips_pic == NO_PIC
12369
               && fixP->fx_done
12370
               && fixP->fx_frag->fr_address >= text_section->vma
12371
               && (fixP->fx_frag->fr_address
12372
                   < text_section->vma + bfd_get_section_size (text_section))
12373
               && ((insn & 0xffff0000) == 0x10000000     /* beq $0,$0 */
12374
                   || (insn & 0xffff0000) == 0x04010000  /* bgez $0 */
12375
                   || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
12376
        {
12377
          /* The branch offset is too large.  If this is an
12378
             unconditional branch, and we are not generating PIC code,
12379
             we can convert it to an absolute jump instruction.  */
12380
          if ((insn & 0xffff0000) == 0x04110000)         /* bgezal $0 */
12381
            insn = 0x0c000000;  /* jal */
12382
          else
12383
            insn = 0x08000000;  /* j */
12384
          fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
12385
          fixP->fx_done = 0;
12386
          fixP->fx_addsy = section_symbol (text_section);
12387
          *valP += md_pcrel_from (fixP);
12388
          md_number_to_chars ((char *) buf, insn, 4);
12389
        }
12390
      else
12391
        {
12392
          /* If we got here, we have branch-relaxation disabled,
12393
             and there's nothing we can do to fix this instruction
12394
             without turning it into a longer sequence.  */
12395
          as_bad_where (fixP->fx_file, fixP->fx_line,
12396
                        _("Branch out of range"));
12397
        }
12398
      break;
12399
 
12400
    case BFD_RELOC_VTABLE_INHERIT:
12401
      fixP->fx_done = 0;
12402
      if (fixP->fx_addsy
12403
          && !S_IS_DEFINED (fixP->fx_addsy)
12404
          && !S_IS_WEAK (fixP->fx_addsy))
12405
        S_SET_WEAK (fixP->fx_addsy);
12406
      break;
12407
 
12408
    case BFD_RELOC_VTABLE_ENTRY:
12409
      fixP->fx_done = 0;
12410
      break;
12411
 
12412
    default:
12413
      internalError ();
12414
    }
12415
 
12416
  /* Remember value for tc_gen_reloc.  */
12417
  fixP->fx_addnumber = *valP;
12418
}
12419
 
12420
static symbolS *
12421
get_symbol (void)
12422
{
12423
  int c;
12424
  char *name;
12425
  symbolS *p;
12426
 
12427
  name = input_line_pointer;
12428
  c = get_symbol_end ();
12429
  p = (symbolS *) symbol_find_or_make (name);
12430
  *input_line_pointer = c;
12431
  return p;
12432
}
12433
 
12434
/* Align the current frag to a given power of two.  If a particular
12435
   fill byte should be used, FILL points to an integer that contains
12436
   that byte, otherwise FILL is null.
12437
 
12438
   The MIPS assembler also automatically adjusts any preceding
12439
   label.  */
12440
 
12441
static void
12442
mips_align (int to, int *fill, symbolS *label)
12443
{
12444
  mips_emit_delays ();
12445
  mips_record_mips16_mode ();
12446
  if (fill == NULL && subseg_text_p (now_seg))
12447
    frag_align_code (to, 0);
12448
  else
12449
    frag_align (to, fill ? *fill : 0, 0);
12450
  record_alignment (now_seg, to);
12451
  if (label != NULL)
12452
    {
12453
      gas_assert (S_GET_SEGMENT (label) == now_seg);
12454
      symbol_set_frag (label, frag_now);
12455
      S_SET_VALUE (label, (valueT) frag_now_fix ());
12456
    }
12457
}
12458
 
12459
/* Align to a given power of two.  .align 0 turns off the automatic
12460
   alignment used by the data creating pseudo-ops.  */
12461
 
12462
static void
12463
s_align (int x ATTRIBUTE_UNUSED)
12464
{
12465
  int temp, fill_value, *fill_ptr;
12466
  long max_alignment = 28;
12467
 
12468
  /* o Note that the assembler pulls down any immediately preceding label
12469
       to the aligned address.
12470
     o It's not documented but auto alignment is reinstated by
12471
       a .align pseudo instruction.
12472
     o Note also that after auto alignment is turned off the mips assembler
12473
       issues an error on attempt to assemble an improperly aligned data item.
12474
       We don't.  */
12475
 
12476
  temp = get_absolute_expression ();
12477
  if (temp > max_alignment)
12478
    as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
12479
  else if (temp < 0)
12480
    {
12481
      as_warn (_("Alignment negative: 0 assumed."));
12482
      temp = 0;
12483
    }
12484
  if (*input_line_pointer == ',')
12485
    {
12486
      ++input_line_pointer;
12487
      fill_value = get_absolute_expression ();
12488
      fill_ptr = &fill_value;
12489
    }
12490
  else
12491
    fill_ptr = 0;
12492
  if (temp)
12493
    {
12494
      segment_info_type *si = seg_info (now_seg);
12495
      struct insn_label_list *l = si->label_list;
12496
      /* Auto alignment should be switched on by next section change.  */
12497
      auto_align = 1;
12498
      mips_align (temp, fill_ptr, l != NULL ? l->label : NULL);
12499
    }
12500
  else
12501
    {
12502
      auto_align = 0;
12503
    }
12504
 
12505
  demand_empty_rest_of_line ();
12506
}
12507
 
12508
static void
12509
s_change_sec (int sec)
12510
{
12511
  segT seg;
12512
 
12513
#ifdef OBJ_ELF
12514
  /* The ELF backend needs to know that we are changing sections, so
12515
     that .previous works correctly.  We could do something like check
12516
     for an obj_section_change_hook macro, but that might be confusing
12517
     as it would not be appropriate to use it in the section changing
12518
     functions in read.c, since obj-elf.c intercepts those.  FIXME:
12519
     This should be cleaner, somehow.  */
12520
  if (IS_ELF)
12521
    obj_elf_section_change_hook ();
12522
#endif
12523
 
12524
  mips_emit_delays ();
12525
 
12526
  switch (sec)
12527
    {
12528
    case 't':
12529
      s_text (0);
12530
      break;
12531
    case 'd':
12532
      s_data (0);
12533
      break;
12534
    case 'b':
12535
      subseg_set (bss_section, (subsegT) get_absolute_expression ());
12536
      demand_empty_rest_of_line ();
12537
      break;
12538
 
12539
    case 'r':
12540
      seg = subseg_new (RDATA_SECTION_NAME,
12541
                        (subsegT) get_absolute_expression ());
12542
      if (IS_ELF)
12543
        {
12544
          bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
12545
                                                  | SEC_READONLY | SEC_RELOC
12546
                                                  | SEC_DATA));
12547
          if (strncmp (TARGET_OS, "elf", 3) != 0)
12548
            record_alignment (seg, 4);
12549
        }
12550
      demand_empty_rest_of_line ();
12551
      break;
12552
 
12553
    case 's':
12554
      seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
12555
      if (IS_ELF)
12556
        {
12557
          bfd_set_section_flags (stdoutput, seg,
12558
                                 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
12559
          if (strncmp (TARGET_OS, "elf", 3) != 0)
12560
            record_alignment (seg, 4);
12561
        }
12562
      demand_empty_rest_of_line ();
12563
      break;
12564
    }
12565
 
12566
  auto_align = 1;
12567
}
12568
 
12569
void
12570
s_change_section (int ignore ATTRIBUTE_UNUSED)
12571
{
12572
#ifdef OBJ_ELF
12573
  char *section_name;
12574
  char c;
12575
  char next_c = 0;
12576
  int section_type;
12577
  int section_flag;
12578
  int section_entry_size;
12579
  int section_alignment;
12580
 
12581
  if (!IS_ELF)
12582
    return;
12583
 
12584
  section_name = input_line_pointer;
12585
  c = get_symbol_end ();
12586
  if (c)
12587
    next_c = *(input_line_pointer + 1);
12588
 
12589
  /* Do we have .section Name<,"flags">?  */
12590
  if (c != ',' || (c == ',' && next_c == '"'))
12591
    {
12592
      /* just after name is now '\0'.  */
12593
      *input_line_pointer = c;
12594
      input_line_pointer = section_name;
12595
      obj_elf_section (ignore);
12596
      return;
12597
    }
12598
  input_line_pointer++;
12599
 
12600
  /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
12601
  if (c == ',')
12602
    section_type = get_absolute_expression ();
12603
  else
12604
    section_type = 0;
12605
  if (*input_line_pointer++ == ',')
12606
    section_flag = get_absolute_expression ();
12607
  else
12608
    section_flag = 0;
12609
  if (*input_line_pointer++ == ',')
12610
    section_entry_size = get_absolute_expression ();
12611
  else
12612
    section_entry_size = 0;
12613
  if (*input_line_pointer++ == ',')
12614
    section_alignment = get_absolute_expression ();
12615
  else
12616
    section_alignment = 0;
12617
 
12618
  section_name = xstrdup (section_name);
12619
 
12620
  /* When using the generic form of .section (as implemented by obj-elf.c),
12621
     there's no way to set the section type to SHT_MIPS_DWARF.  Users have
12622
     traditionally had to fall back on the more common @progbits instead.
12623
 
12624
     There's nothing really harmful in this, since bfd will correct
12625
     SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
12626
     means that, for backwards compatibility, the special_section entries
12627
     for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
12628
 
12629
     Even so, we shouldn't force users of the MIPS .section syntax to
12630
     incorrectly label the sections as SHT_PROGBITS.  The best compromise
12631
     seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
12632
     generic type-checking code.  */
12633
  if (section_type == SHT_MIPS_DWARF)
12634
    section_type = SHT_PROGBITS;
12635
 
12636
  obj_elf_change_section (section_name, section_type, section_flag,
12637
                          section_entry_size, 0, 0, 0);
12638
 
12639
  if (now_seg->name != section_name)
12640
    free (section_name);
12641
#endif /* OBJ_ELF */
12642
}
12643
 
12644
void
12645
mips_enable_auto_align (void)
12646
{
12647
  auto_align = 1;
12648
}
12649
 
12650
static void
12651
s_cons (int log_size)
12652
{
12653
  segment_info_type *si = seg_info (now_seg);
12654
  struct insn_label_list *l = si->label_list;
12655
  symbolS *label;
12656
 
12657
  label = l != NULL ? l->label : NULL;
12658
  mips_emit_delays ();
12659
  if (log_size > 0 && auto_align)
12660
    mips_align (log_size, 0, label);
12661
  mips_clear_insn_labels ();
12662
  cons (1 << log_size);
12663
}
12664
 
12665
static void
12666
s_float_cons (int type)
12667
{
12668
  segment_info_type *si = seg_info (now_seg);
12669
  struct insn_label_list *l = si->label_list;
12670
  symbolS *label;
12671
 
12672
  label = l != NULL ? l->label : NULL;
12673
 
12674
  mips_emit_delays ();
12675
 
12676
  if (auto_align)
12677
    {
12678
      if (type == 'd')
12679
        mips_align (3, 0, label);
12680
      else
12681
        mips_align (2, 0, label);
12682
    }
12683
 
12684
  mips_clear_insn_labels ();
12685
 
12686
  float_cons (type);
12687
}
12688
 
12689
/* Handle .globl.  We need to override it because on Irix 5 you are
12690
   permitted to say
12691
       .globl foo .text
12692
   where foo is an undefined symbol, to mean that foo should be
12693
   considered to be the address of a function.  */
12694
 
12695
static void
12696
s_mips_globl (int x ATTRIBUTE_UNUSED)
12697
{
12698
  char *name;
12699
  int c;
12700
  symbolS *symbolP;
12701
  flagword flag;
12702
 
12703
  do
12704
    {
12705
      name = input_line_pointer;
12706
      c = get_symbol_end ();
12707
      symbolP = symbol_find_or_make (name);
12708
      S_SET_EXTERNAL (symbolP);
12709
 
12710
      *input_line_pointer = c;
12711
      SKIP_WHITESPACE ();
12712
 
12713
      /* On Irix 5, every global symbol that is not explicitly labelled as
12714
         being a function is apparently labelled as being an object.  */
12715
      flag = BSF_OBJECT;
12716
 
12717
      if (!is_end_of_line[(unsigned char) *input_line_pointer]
12718
          && (*input_line_pointer != ','))
12719
        {
12720
          char *secname;
12721
          asection *sec;
12722
 
12723
          secname = input_line_pointer;
12724
          c = get_symbol_end ();
12725
          sec = bfd_get_section_by_name (stdoutput, secname);
12726
          if (sec == NULL)
12727
            as_bad (_("%s: no such section"), secname);
12728
          *input_line_pointer = c;
12729
 
12730
          if (sec != NULL && (sec->flags & SEC_CODE) != 0)
12731
            flag = BSF_FUNCTION;
12732
        }
12733
 
12734
      symbol_get_bfdsym (symbolP)->flags |= flag;
12735
 
12736
      c = *input_line_pointer;
12737
      if (c == ',')
12738
        {
12739
          input_line_pointer++;
12740
          SKIP_WHITESPACE ();
12741
          if (is_end_of_line[(unsigned char) *input_line_pointer])
12742
            c = '\n';
12743
        }
12744
    }
12745
  while (c == ',');
12746
 
12747
  demand_empty_rest_of_line ();
12748
}
12749
 
12750
static void
12751
s_option (int x ATTRIBUTE_UNUSED)
12752
{
12753
  char *opt;
12754
  char c;
12755
 
12756
  opt = input_line_pointer;
12757
  c = get_symbol_end ();
12758
 
12759
  if (*opt == 'O')
12760
    {
12761
      /* FIXME: What does this mean?  */
12762
    }
12763
  else if (strncmp (opt, "pic", 3) == 0)
12764
    {
12765
      int i;
12766
 
12767
      i = atoi (opt + 3);
12768
      if (i == 0)
12769
        mips_pic = NO_PIC;
12770
      else if (i == 2)
12771
        {
12772
        mips_pic = SVR4_PIC;
12773
          mips_abicalls = TRUE;
12774
        }
12775
      else
12776
        as_bad (_(".option pic%d not supported"), i);
12777
 
12778
      if (mips_pic == SVR4_PIC)
12779
        {
12780
          if (g_switch_seen && g_switch_value != 0)
12781
            as_warn (_("-G may not be used with SVR4 PIC code"));
12782
          g_switch_value = 0;
12783
          bfd_set_gp_size (stdoutput, 0);
12784
        }
12785
    }
12786
  else
12787
    as_warn (_("Unrecognized option \"%s\""), opt);
12788
 
12789
  *input_line_pointer = c;
12790
  demand_empty_rest_of_line ();
12791
}
12792
 
12793
/* This structure is used to hold a stack of .set values.  */
12794
 
12795
struct mips_option_stack
12796
{
12797
  struct mips_option_stack *next;
12798
  struct mips_set_options options;
12799
};
12800
 
12801
static struct mips_option_stack *mips_opts_stack;
12802
 
12803
/* Handle the .set pseudo-op.  */
12804
 
12805
static void
12806
s_mipsset (int x ATTRIBUTE_UNUSED)
12807
{
12808
  char *name = input_line_pointer, ch;
12809
 
12810
  while (!is_end_of_line[(unsigned char) *input_line_pointer])
12811
    ++input_line_pointer;
12812
  ch = *input_line_pointer;
12813
  *input_line_pointer = '\0';
12814
 
12815
  if (strcmp (name, "reorder") == 0)
12816
    {
12817
      if (mips_opts.noreorder)
12818
        end_noreorder ();
12819
    }
12820
  else if (strcmp (name, "noreorder") == 0)
12821
    {
12822
      if (!mips_opts.noreorder)
12823
        start_noreorder ();
12824
    }
12825
  else if (strncmp (name, "at=", 3) == 0)
12826
    {
12827
      char *s = name + 3;
12828
 
12829
      if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
12830
        as_bad (_("Unrecognized register name `%s'"), s);
12831
    }
12832
  else if (strcmp (name, "at") == 0)
12833
    {
12834
      mips_opts.at = ATREG;
12835
    }
12836
  else if (strcmp (name, "noat") == 0)
12837
    {
12838
      mips_opts.at = ZERO;
12839
    }
12840
  else if (strcmp (name, "macro") == 0)
12841
    {
12842
      mips_opts.warn_about_macros = 0;
12843
    }
12844
  else if (strcmp (name, "nomacro") == 0)
12845
    {
12846
      if (mips_opts.noreorder == 0)
12847
        as_bad (_("`noreorder' must be set before `nomacro'"));
12848
      mips_opts.warn_about_macros = 1;
12849
    }
12850
  else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
12851
    {
12852
      mips_opts.nomove = 0;
12853
    }
12854
  else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
12855
    {
12856
      mips_opts.nomove = 1;
12857
    }
12858
  else if (strcmp (name, "bopt") == 0)
12859
    {
12860
      mips_opts.nobopt = 0;
12861
    }
12862
  else if (strcmp (name, "nobopt") == 0)
12863
    {
12864
      mips_opts.nobopt = 1;
12865
    }
12866
  else if (strcmp (name, "gp=default") == 0)
12867
    mips_opts.gp32 = file_mips_gp32;
12868
  else if (strcmp (name, "gp=32") == 0)
12869
    mips_opts.gp32 = 1;
12870
  else if (strcmp (name, "gp=64") == 0)
12871
    {
12872
      if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
12873
        as_warn (_("%s isa does not support 64-bit registers"),
12874
                 mips_cpu_info_from_isa (mips_opts.isa)->name);
12875
      mips_opts.gp32 = 0;
12876
    }
12877
  else if (strcmp (name, "fp=default") == 0)
12878
    mips_opts.fp32 = file_mips_fp32;
12879
  else if (strcmp (name, "fp=32") == 0)
12880
    mips_opts.fp32 = 1;
12881
  else if (strcmp (name, "fp=64") == 0)
12882
    {
12883
      if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
12884
        as_warn (_("%s isa does not support 64-bit floating point registers"),
12885
                 mips_cpu_info_from_isa (mips_opts.isa)->name);
12886
      mips_opts.fp32 = 0;
12887
    }
12888
  else if (strcmp (name, "softfloat") == 0)
12889
    mips_opts.soft_float = 1;
12890
  else if (strcmp (name, "hardfloat") == 0)
12891
    mips_opts.soft_float = 0;
12892
  else if (strcmp (name, "singlefloat") == 0)
12893
    mips_opts.single_float = 1;
12894
  else if (strcmp (name, "doublefloat") == 0)
12895
    mips_opts.single_float = 0;
12896
  else if (strcmp (name, "mips16") == 0
12897
           || strcmp (name, "MIPS-16") == 0)
12898
    mips_opts.mips16 = 1;
12899
  else if (strcmp (name, "nomips16") == 0
12900
           || strcmp (name, "noMIPS-16") == 0)
12901
    mips_opts.mips16 = 0;
12902
  else if (strcmp (name, "smartmips") == 0)
12903
    {
12904
      if (!ISA_SUPPORTS_SMARTMIPS)
12905
        as_warn (_("%s ISA does not support SmartMIPS ASE"),
12906
                 mips_cpu_info_from_isa (mips_opts.isa)->name);
12907
      mips_opts.ase_smartmips = 1;
12908
    }
12909
  else if (strcmp (name, "nosmartmips") == 0)
12910
    mips_opts.ase_smartmips = 0;
12911
  else if (strcmp (name, "mips3d") == 0)
12912
    mips_opts.ase_mips3d = 1;
12913
  else if (strcmp (name, "nomips3d") == 0)
12914
    mips_opts.ase_mips3d = 0;
12915
  else if (strcmp (name, "mdmx") == 0)
12916
    mips_opts.ase_mdmx = 1;
12917
  else if (strcmp (name, "nomdmx") == 0)
12918
    mips_opts.ase_mdmx = 0;
12919
  else if (strcmp (name, "dsp") == 0)
12920
    {
12921
      if (!ISA_SUPPORTS_DSP_ASE)
12922
        as_warn (_("%s ISA does not support DSP ASE"),
12923
                 mips_cpu_info_from_isa (mips_opts.isa)->name);
12924
      mips_opts.ase_dsp = 1;
12925
      mips_opts.ase_dspr2 = 0;
12926
    }
12927
  else if (strcmp (name, "nodsp") == 0)
12928
    {
12929
      mips_opts.ase_dsp = 0;
12930
      mips_opts.ase_dspr2 = 0;
12931
    }
12932
  else if (strcmp (name, "dspr2") == 0)
12933
    {
12934
      if (!ISA_SUPPORTS_DSPR2_ASE)
12935
        as_warn (_("%s ISA does not support DSP R2 ASE"),
12936
                 mips_cpu_info_from_isa (mips_opts.isa)->name);
12937
      mips_opts.ase_dspr2 = 1;
12938
      mips_opts.ase_dsp = 1;
12939
    }
12940
  else if (strcmp (name, "nodspr2") == 0)
12941
    {
12942
      mips_opts.ase_dspr2 = 0;
12943
      mips_opts.ase_dsp = 0;
12944
    }
12945
  else if (strcmp (name, "mt") == 0)
12946
    {
12947
      if (!ISA_SUPPORTS_MT_ASE)
12948
        as_warn (_("%s ISA does not support MT ASE"),
12949
                 mips_cpu_info_from_isa (mips_opts.isa)->name);
12950
      mips_opts.ase_mt = 1;
12951
    }
12952
  else if (strcmp (name, "nomt") == 0)
12953
    mips_opts.ase_mt = 0;
12954
  else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
12955
    {
12956
      int reset = 0;
12957
 
12958
      /* Permit the user to change the ISA and architecture on the fly.
12959
         Needless to say, misuse can cause serious problems.  */
12960
      if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
12961
        {
12962
          reset = 1;
12963
          mips_opts.isa = file_mips_isa;
12964
          mips_opts.arch = file_mips_arch;
12965
        }
12966
      else if (strncmp (name, "arch=", 5) == 0)
12967
        {
12968
          const struct mips_cpu_info *p;
12969
 
12970
          p = mips_parse_cpu("internal use", name + 5);
12971
          if (!p)
12972
            as_bad (_("unknown architecture %s"), name + 5);
12973
          else
12974
            {
12975
              mips_opts.arch = p->cpu;
12976
              mips_opts.isa = p->isa;
12977
            }
12978
        }
12979
      else if (strncmp (name, "mips", 4) == 0)
12980
        {
12981
          const struct mips_cpu_info *p;
12982
 
12983
          p = mips_parse_cpu("internal use", name);
12984
          if (!p)
12985
            as_bad (_("unknown ISA level %s"), name + 4);
12986
          else
12987
            {
12988
              mips_opts.arch = p->cpu;
12989
              mips_opts.isa = p->isa;
12990
            }
12991
        }
12992
      else
12993
        as_bad (_("unknown ISA or architecture %s"), name);
12994
 
12995
      switch (mips_opts.isa)
12996
        {
12997
        case  0:
12998
          break;
12999
        case ISA_MIPS1:
13000
        case ISA_MIPS2:
13001
        case ISA_MIPS32:
13002
        case ISA_MIPS32R2:
13003
          mips_opts.gp32 = 1;
13004
          mips_opts.fp32 = 1;
13005
          break;
13006
        case ISA_MIPS3:
13007
        case ISA_MIPS4:
13008
        case ISA_MIPS5:
13009
        case ISA_MIPS64:
13010
        case ISA_MIPS64R2:
13011
          mips_opts.gp32 = 0;
13012
          mips_opts.fp32 = 0;
13013
          break;
13014
        default:
13015
          as_bad (_("unknown ISA level %s"), name + 4);
13016
          break;
13017
        }
13018
      if (reset)
13019
        {
13020
          mips_opts.gp32 = file_mips_gp32;
13021
          mips_opts.fp32 = file_mips_fp32;
13022
        }
13023
    }
13024
  else if (strcmp (name, "autoextend") == 0)
13025
    mips_opts.noautoextend = 0;
13026
  else if (strcmp (name, "noautoextend") == 0)
13027
    mips_opts.noautoextend = 1;
13028
  else if (strcmp (name, "push") == 0)
13029
    {
13030
      struct mips_option_stack *s;
13031
 
13032
      s = (struct mips_option_stack *) xmalloc (sizeof *s);
13033
      s->next = mips_opts_stack;
13034
      s->options = mips_opts;
13035
      mips_opts_stack = s;
13036
    }
13037
  else if (strcmp (name, "pop") == 0)
13038
    {
13039
      struct mips_option_stack *s;
13040
 
13041
      s = mips_opts_stack;
13042
      if (s == NULL)
13043
        as_bad (_(".set pop with no .set push"));
13044
      else
13045
        {
13046
          /* If we're changing the reorder mode we need to handle
13047
             delay slots correctly.  */
13048
          if (s->options.noreorder && ! mips_opts.noreorder)
13049
            start_noreorder ();
13050
          else if (! s->options.noreorder && mips_opts.noreorder)
13051
            end_noreorder ();
13052
 
13053
          mips_opts = s->options;
13054
          mips_opts_stack = s->next;
13055
          free (s);
13056
        }
13057
    }
13058
  else if (strcmp (name, "sym32") == 0)
13059
    mips_opts.sym32 = TRUE;
13060
  else if (strcmp (name, "nosym32") == 0)
13061
    mips_opts.sym32 = FALSE;
13062
  else if (strchr (name, ','))
13063
    {
13064
      /* Generic ".set" directive; use the generic handler.  */
13065
      *input_line_pointer = ch;
13066
      input_line_pointer = name;
13067
      s_set (0);
13068
      return;
13069
    }
13070
  else
13071
    {
13072
      as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
13073
    }
13074
  *input_line_pointer = ch;
13075
  demand_empty_rest_of_line ();
13076
}
13077
 
13078
/* Handle the .abicalls pseudo-op.  I believe this is equivalent to
13079
   .option pic2.  It means to generate SVR4 PIC calls.  */
13080
 
13081
static void
13082
s_abicalls (int ignore ATTRIBUTE_UNUSED)
13083
{
13084
  mips_pic = SVR4_PIC;
13085
  mips_abicalls = TRUE;
13086
 
13087
  if (g_switch_seen && g_switch_value != 0)
13088
    as_warn (_("-G may not be used with SVR4 PIC code"));
13089
  g_switch_value = 0;
13090
 
13091
  bfd_set_gp_size (stdoutput, 0);
13092
  demand_empty_rest_of_line ();
13093
}
13094
 
13095
/* Handle the .cpload pseudo-op.  This is used when generating SVR4
13096
   PIC code.  It sets the $gp register for the function based on the
13097
   function address, which is in the register named in the argument.
13098
   This uses a relocation against _gp_disp, which is handled specially
13099
   by the linker.  The result is:
13100
        lui     $gp,%hi(_gp_disp)
13101
        addiu   $gp,$gp,%lo(_gp_disp)
13102
        addu    $gp,$gp,.cpload argument
13103
   The .cpload argument is normally $25 == $t9.
13104
 
13105
   The -mno-shared option changes this to:
13106
        lui     $gp,%hi(__gnu_local_gp)
13107
        addiu   $gp,$gp,%lo(__gnu_local_gp)
13108
   and the argument is ignored.  This saves an instruction, but the
13109
   resulting code is not position independent; it uses an absolute
13110
   address for __gnu_local_gp.  Thus code assembled with -mno-shared
13111
   can go into an ordinary executable, but not into a shared library.  */
13112
 
13113
static void
13114
s_cpload (int ignore ATTRIBUTE_UNUSED)
13115
{
13116
  expressionS ex;
13117
  int reg;
13118
  int in_shared;
13119
 
13120
  /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13121
     .cpload is ignored.  */
13122
  if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13123
    {
13124
      s_ignore (0);
13125
      return;
13126
    }
13127
 
13128
  /* .cpload should be in a .set noreorder section.  */
13129
  if (mips_opts.noreorder == 0)
13130
    as_warn (_(".cpload not in noreorder section"));
13131
 
13132
  reg = tc_get_register (0);
13133
 
13134
  /* If we need to produce a 64-bit address, we are better off using
13135
     the default instruction sequence.  */
13136
  in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
13137
 
13138
  ex.X_op = O_symbol;
13139
  ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
13140
                                         "__gnu_local_gp");
13141
  ex.X_op_symbol = NULL;
13142
  ex.X_add_number = 0;
13143
 
13144
  /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
13145
  symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13146
 
13147
  macro_start ();
13148
  macro_build_lui (&ex, mips_gp_register);
13149
  macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13150
               mips_gp_register, BFD_RELOC_LO16);
13151
  if (in_shared)
13152
    macro_build (NULL, "addu", "d,v,t", mips_gp_register,
13153
                 mips_gp_register, reg);
13154
  macro_end ();
13155
 
13156
  demand_empty_rest_of_line ();
13157
}
13158
 
13159
/* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
13160
     .cpsetup $reg1, offset|$reg2, label
13161
 
13162
   If offset is given, this results in:
13163
     sd         $gp, offset($sp)
13164
     lui        $gp, %hi(%neg(%gp_rel(label)))
13165
     addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
13166
     daddu      $gp, $gp, $reg1
13167
 
13168
   If $reg2 is given, this results in:
13169
     daddu      $reg2, $gp, $0
13170
     lui        $gp, %hi(%neg(%gp_rel(label)))
13171
     addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
13172
     daddu      $gp, $gp, $reg1
13173
   $reg1 is normally $25 == $t9.
13174
 
13175
   The -mno-shared option replaces the last three instructions with
13176
        lui     $gp,%hi(_gp)
13177
        addiu   $gp,$gp,%lo(_gp)  */
13178
 
13179
static void
13180
s_cpsetup (int ignore ATTRIBUTE_UNUSED)
13181
{
13182
  expressionS ex_off;
13183
  expressionS ex_sym;
13184
  int reg1;
13185
 
13186
  /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
13187
     We also need NewABI support.  */
13188
  if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13189
    {
13190
      s_ignore (0);
13191
      return;
13192
    }
13193
 
13194
  reg1 = tc_get_register (0);
13195
  SKIP_WHITESPACE ();
13196
  if (*input_line_pointer != ',')
13197
    {
13198
      as_bad (_("missing argument separator ',' for .cpsetup"));
13199
      return;
13200
    }
13201
  else
13202
    ++input_line_pointer;
13203
  SKIP_WHITESPACE ();
13204
  if (*input_line_pointer == '$')
13205
    {
13206
      mips_cpreturn_register = tc_get_register (0);
13207
      mips_cpreturn_offset = -1;
13208
    }
13209
  else
13210
    {
13211
      mips_cpreturn_offset = get_absolute_expression ();
13212
      mips_cpreturn_register = -1;
13213
    }
13214
  SKIP_WHITESPACE ();
13215
  if (*input_line_pointer != ',')
13216
    {
13217
      as_bad (_("missing argument separator ',' for .cpsetup"));
13218
      return;
13219
    }
13220
  else
13221
    ++input_line_pointer;
13222
  SKIP_WHITESPACE ();
13223
  expression (&ex_sym);
13224
 
13225
  macro_start ();
13226
  if (mips_cpreturn_register == -1)
13227
    {
13228
      ex_off.X_op = O_constant;
13229
      ex_off.X_add_symbol = NULL;
13230
      ex_off.X_op_symbol = NULL;
13231
      ex_off.X_add_number = mips_cpreturn_offset;
13232
 
13233
      macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
13234
                   BFD_RELOC_LO16, SP);
13235
    }
13236
  else
13237
    macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
13238
                 mips_gp_register, 0);
13239
 
13240
  if (mips_in_shared || HAVE_64BIT_SYMBOLS)
13241
    {
13242
      macro_build (&ex_sym, "lui", "t,u", mips_gp_register,
13243
                   -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
13244
                   BFD_RELOC_HI16_S);
13245
 
13246
      macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
13247
                   mips_gp_register, -1, BFD_RELOC_GPREL16,
13248
                   BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
13249
 
13250
      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
13251
                   mips_gp_register, reg1);
13252
    }
13253
  else
13254
    {
13255
      expressionS ex;
13256
 
13257
      ex.X_op = O_symbol;
13258
      ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
13259
      ex.X_op_symbol = NULL;
13260
      ex.X_add_number = 0;
13261
 
13262
      /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
13263
      symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13264
 
13265
      macro_build_lui (&ex, mips_gp_register);
13266
      macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13267
                   mips_gp_register, BFD_RELOC_LO16);
13268
    }
13269
 
13270
  macro_end ();
13271
 
13272
  demand_empty_rest_of_line ();
13273
}
13274
 
13275
static void
13276
s_cplocal (int ignore ATTRIBUTE_UNUSED)
13277
{
13278
  /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
13279
     .cplocal is ignored.  */
13280
  if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13281
    {
13282
      s_ignore (0);
13283
      return;
13284
    }
13285
 
13286
  mips_gp_register = tc_get_register (0);
13287
  demand_empty_rest_of_line ();
13288
}
13289
 
13290
/* Handle the .cprestore pseudo-op.  This stores $gp into a given
13291
   offset from $sp.  The offset is remembered, and after making a PIC
13292
   call $gp is restored from that location.  */
13293
 
13294
static void
13295
s_cprestore (int ignore ATTRIBUTE_UNUSED)
13296
{
13297
  expressionS ex;
13298
 
13299
  /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13300
     .cprestore is ignored.  */
13301
  if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13302
    {
13303
      s_ignore (0);
13304
      return;
13305
    }
13306
 
13307
  mips_cprestore_offset = get_absolute_expression ();
13308
  mips_cprestore_valid = 1;
13309
 
13310
  ex.X_op = O_constant;
13311
  ex.X_add_symbol = NULL;
13312
  ex.X_op_symbol = NULL;
13313
  ex.X_add_number = mips_cprestore_offset;
13314
 
13315
  macro_start ();
13316
  macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
13317
                                SP, HAVE_64BIT_ADDRESSES);
13318
  macro_end ();
13319
 
13320
  demand_empty_rest_of_line ();
13321
}
13322
 
13323
/* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
13324
   was given in the preceding .cpsetup, it results in:
13325
     ld         $gp, offset($sp)
13326
 
13327
   If a register $reg2 was given there, it results in:
13328
     daddu      $gp, $reg2, $0  */
13329
 
13330
static void
13331
s_cpreturn (int ignore ATTRIBUTE_UNUSED)
13332
{
13333
  expressionS ex;
13334
 
13335
  /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
13336
     We also need NewABI support.  */
13337
  if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13338
    {
13339
      s_ignore (0);
13340
      return;
13341
    }
13342
 
13343
  macro_start ();
13344
  if (mips_cpreturn_register == -1)
13345
    {
13346
      ex.X_op = O_constant;
13347
      ex.X_add_symbol = NULL;
13348
      ex.X_op_symbol = NULL;
13349
      ex.X_add_number = mips_cpreturn_offset;
13350
 
13351
      macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
13352
    }
13353
  else
13354
    macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
13355
                 mips_cpreturn_register, 0);
13356
  macro_end ();
13357
 
13358
  demand_empty_rest_of_line ();
13359
}
13360
 
13361
/* Handle the .dtprelword and .dtpreldword pseudo-ops.  They generate
13362
   a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
13363
   use in DWARF debug information.  */
13364
 
13365
static void
13366
s_dtprel_internal (size_t bytes)
13367
{
13368
  expressionS ex;
13369
  char *p;
13370
 
13371
  expression (&ex);
13372
 
13373
  if (ex.X_op != O_symbol)
13374
    {
13375
      as_bad (_("Unsupported use of %s"), (bytes == 8
13376
                                           ? ".dtpreldword"
13377
                                           : ".dtprelword"));
13378
      ignore_rest_of_line ();
13379
    }
13380
 
13381
  p = frag_more (bytes);
13382
  md_number_to_chars (p, 0, bytes);
13383
  fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
13384
               (bytes == 8
13385
                ? BFD_RELOC_MIPS_TLS_DTPREL64
13386
                : BFD_RELOC_MIPS_TLS_DTPREL32));
13387
 
13388
  demand_empty_rest_of_line ();
13389
}
13390
 
13391
/* Handle .dtprelword.  */
13392
 
13393
static void
13394
s_dtprelword (int ignore ATTRIBUTE_UNUSED)
13395
{
13396
  s_dtprel_internal (4);
13397
}
13398
 
13399
/* Handle .dtpreldword.  */
13400
 
13401
static void
13402
s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
13403
{
13404
  s_dtprel_internal (8);
13405
}
13406
 
13407
/* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
13408
   code.  It sets the offset to use in gp_rel relocations.  */
13409
 
13410
static void
13411
s_gpvalue (int ignore ATTRIBUTE_UNUSED)
13412
{
13413
  /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
13414
     We also need NewABI support.  */
13415
  if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13416
    {
13417
      s_ignore (0);
13418
      return;
13419
    }
13420
 
13421
  mips_gprel_offset = get_absolute_expression ();
13422
 
13423
  demand_empty_rest_of_line ();
13424
}
13425
 
13426
/* Handle the .gpword pseudo-op.  This is used when generating PIC
13427
   code.  It generates a 32 bit GP relative reloc.  */
13428
 
13429
static void
13430
s_gpword (int ignore ATTRIBUTE_UNUSED)
13431
{
13432
  segment_info_type *si;
13433
  struct insn_label_list *l;
13434
  symbolS *label;
13435
  expressionS ex;
13436
  char *p;
13437
 
13438
  /* When not generating PIC code, this is treated as .word.  */
13439
  if (mips_pic != SVR4_PIC)
13440
    {
13441
      s_cons (2);
13442
      return;
13443
    }
13444
 
13445
  si = seg_info (now_seg);
13446
  l = si->label_list;
13447
  label = l != NULL ? l->label : NULL;
13448
  mips_emit_delays ();
13449
  if (auto_align)
13450
    mips_align (2, 0, label);
13451
  mips_clear_insn_labels ();
13452
 
13453
  expression (&ex);
13454
 
13455
  if (ex.X_op != O_symbol || ex.X_add_number != 0)
13456
    {
13457
      as_bad (_("Unsupported use of .gpword"));
13458
      ignore_rest_of_line ();
13459
    }
13460
 
13461
  p = frag_more (4);
13462
  md_number_to_chars (p, 0, 4);
13463
  fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13464
               BFD_RELOC_GPREL32);
13465
 
13466
  demand_empty_rest_of_line ();
13467
}
13468
 
13469
static void
13470
s_gpdword (int ignore ATTRIBUTE_UNUSED)
13471
{
13472
  segment_info_type *si;
13473
  struct insn_label_list *l;
13474
  symbolS *label;
13475
  expressionS ex;
13476
  char *p;
13477
 
13478
  /* When not generating PIC code, this is treated as .dword.  */
13479
  if (mips_pic != SVR4_PIC)
13480
    {
13481
      s_cons (3);
13482
      return;
13483
    }
13484
 
13485
  si = seg_info (now_seg);
13486
  l = si->label_list;
13487
  label = l != NULL ? l->label : NULL;
13488
  mips_emit_delays ();
13489
  if (auto_align)
13490
    mips_align (3, 0, label);
13491
  mips_clear_insn_labels ();
13492
 
13493
  expression (&ex);
13494
 
13495
  if (ex.X_op != O_symbol || ex.X_add_number != 0)
13496
    {
13497
      as_bad (_("Unsupported use of .gpdword"));
13498
      ignore_rest_of_line ();
13499
    }
13500
 
13501
  p = frag_more (8);
13502
  md_number_to_chars (p, 0, 8);
13503
  fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13504
               BFD_RELOC_GPREL32)->fx_tcbit = 1;
13505
 
13506
  /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
13507
  fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
13508
           FALSE, BFD_RELOC_64)->fx_tcbit = 1;
13509
 
13510
  demand_empty_rest_of_line ();
13511
}
13512
 
13513
/* Handle the .cpadd pseudo-op.  This is used when dealing with switch
13514
   tables in SVR4 PIC code.  */
13515
 
13516
static void
13517
s_cpadd (int ignore ATTRIBUTE_UNUSED)
13518
{
13519
  int reg;
13520
 
13521
  /* This is ignored when not generating SVR4 PIC code.  */
13522
  if (mips_pic != SVR4_PIC)
13523
    {
13524
      s_ignore (0);
13525
      return;
13526
    }
13527
 
13528
  /* Add $gp to the register named as an argument.  */
13529
  macro_start ();
13530
  reg = tc_get_register (0);
13531
  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
13532
  macro_end ();
13533
 
13534
  demand_empty_rest_of_line ();
13535
}
13536
 
13537
/* Handle the .insn pseudo-op.  This marks instruction labels in
13538
   mips16 mode.  This permits the linker to handle them specially,
13539
   such as generating jalx instructions when needed.  We also make
13540
   them odd for the duration of the assembly, in order to generate the
13541
   right sort of code.  We will make them even in the adjust_symtab
13542
   routine, while leaving them marked.  This is convenient for the
13543
   debugger and the disassembler.  The linker knows to make them odd
13544
   again.  */
13545
 
13546
static void
13547
s_insn (int ignore ATTRIBUTE_UNUSED)
13548
{
13549
  mips16_mark_labels ();
13550
 
13551
  demand_empty_rest_of_line ();
13552
}
13553
 
13554
/* Handle a .stabn directive.  We need these in order to mark a label
13555
   as being a mips16 text label correctly.  Sometimes the compiler
13556
   will emit a label, followed by a .stabn, and then switch sections.
13557
   If the label and .stabn are in mips16 mode, then the label is
13558
   really a mips16 text label.  */
13559
 
13560
static void
13561
s_mips_stab (int type)
13562
{
13563
  if (type == 'n')
13564
    mips16_mark_labels ();
13565
 
13566
  s_stab (type);
13567
}
13568
 
13569
/* Handle the .weakext pseudo-op as defined in Kane and Heinrich.  */
13570
 
13571
static void
13572
s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
13573
{
13574
  char *name;
13575
  int c;
13576
  symbolS *symbolP;
13577
  expressionS exp;
13578
 
13579
  name = input_line_pointer;
13580
  c = get_symbol_end ();
13581
  symbolP = symbol_find_or_make (name);
13582
  S_SET_WEAK (symbolP);
13583
  *input_line_pointer = c;
13584
 
13585
  SKIP_WHITESPACE ();
13586
 
13587
  if (! is_end_of_line[(unsigned char) *input_line_pointer])
13588
    {
13589
      if (S_IS_DEFINED (symbolP))
13590
        {
13591
          as_bad (_("ignoring attempt to redefine symbol %s"),
13592
                  S_GET_NAME (symbolP));
13593
          ignore_rest_of_line ();
13594
          return;
13595
        }
13596
 
13597
      if (*input_line_pointer == ',')
13598
        {
13599
          ++input_line_pointer;
13600
          SKIP_WHITESPACE ();
13601
        }
13602
 
13603
      expression (&exp);
13604
      if (exp.X_op != O_symbol)
13605
        {
13606
          as_bad (_("bad .weakext directive"));
13607
          ignore_rest_of_line ();
13608
          return;
13609
        }
13610
      symbol_set_value_expression (symbolP, &exp);
13611
    }
13612
 
13613
  demand_empty_rest_of_line ();
13614
}
13615
 
13616
/* Parse a register string into a number.  Called from the ECOFF code
13617
   to parse .frame.  The argument is non-zero if this is the frame
13618
   register, so that we can record it in mips_frame_reg.  */
13619
 
13620
int
13621
tc_get_register (int frame)
13622
{
13623
  unsigned int reg;
13624
 
13625
  SKIP_WHITESPACE ();
13626
  if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
13627
    reg = 0;
13628
  if (frame)
13629
    {
13630
      mips_frame_reg = reg != 0 ? reg : SP;
13631
      mips_frame_reg_valid = 1;
13632
      mips_cprestore_valid = 0;
13633
    }
13634
  return reg;
13635
}
13636
 
13637
valueT
13638
md_section_align (asection *seg, valueT addr)
13639
{
13640
  int align = bfd_get_section_alignment (stdoutput, seg);
13641
 
13642
  if (IS_ELF)
13643
    {
13644
      /* We don't need to align ELF sections to the full alignment.
13645
         However, Irix 5 may prefer that we align them at least to a 16
13646
         byte boundary.  We don't bother to align the sections if we
13647
         are targeted for an embedded system.  */
13648
      if (strncmp (TARGET_OS, "elf", 3) == 0)
13649
        return addr;
13650
      if (align > 4)
13651
        align = 4;
13652
    }
13653
 
13654
  return ((addr + (1 << align) - 1) & (-1 << align));
13655
}
13656
 
13657
/* Utility routine, called from above as well.  If called while the
13658
   input file is still being read, it's only an approximation.  (For
13659
   example, a symbol may later become defined which appeared to be
13660
   undefined earlier.)  */
13661
 
13662
static int
13663
nopic_need_relax (symbolS *sym, int before_relaxing)
13664
{
13665
  if (sym == 0)
13666
    return 0;
13667
 
13668
  if (g_switch_value > 0)
13669
    {
13670
      const char *symname;
13671
      int change;
13672
 
13673
      /* Find out whether this symbol can be referenced off the $gp
13674
         register.  It can be if it is smaller than the -G size or if
13675
         it is in the .sdata or .sbss section.  Certain symbols can
13676
         not be referenced off the $gp, although it appears as though
13677
         they can.  */
13678
      symname = S_GET_NAME (sym);
13679
      if (symname != (const char *) NULL
13680
          && (strcmp (symname, "eprol") == 0
13681
              || strcmp (symname, "etext") == 0
13682
              || strcmp (symname, "_gp") == 0
13683
              || strcmp (symname, "edata") == 0
13684
              || strcmp (symname, "_fbss") == 0
13685
              || strcmp (symname, "_fdata") == 0
13686
              || strcmp (symname, "_ftext") == 0
13687
              || strcmp (symname, "end") == 0
13688
              || strcmp (symname, "_gp_disp") == 0))
13689
        change = 1;
13690
      else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
13691
               && (0
13692
#ifndef NO_ECOFF_DEBUGGING
13693
                   || (symbol_get_obj (sym)->ecoff_extern_size != 0
13694
                       && (symbol_get_obj (sym)->ecoff_extern_size
13695
                           <= g_switch_value))
13696
#endif
13697
                   /* We must defer this decision until after the whole
13698
                      file has been read, since there might be a .extern
13699
                      after the first use of this symbol.  */
13700
                   || (before_relaxing
13701
#ifndef NO_ECOFF_DEBUGGING
13702
                       && symbol_get_obj (sym)->ecoff_extern_size == 0
13703
#endif
13704
                       && S_GET_VALUE (sym) == 0)
13705
                   || (S_GET_VALUE (sym) != 0
13706
                       && S_GET_VALUE (sym) <= g_switch_value)))
13707
        change = 0;
13708
      else
13709
        {
13710
          const char *segname;
13711
 
13712
          segname = segment_name (S_GET_SEGMENT (sym));
13713
          gas_assert (strcmp (segname, ".lit8") != 0
13714
                  && strcmp (segname, ".lit4") != 0);
13715
          change = (strcmp (segname, ".sdata") != 0
13716
                    && strcmp (segname, ".sbss") != 0
13717
                    && strncmp (segname, ".sdata.", 7) != 0
13718
                    && strncmp (segname, ".sbss.", 6) != 0
13719
                    && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
13720
                    && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
13721
        }
13722
      return change;
13723
    }
13724
  else
13725
    /* We are not optimizing for the $gp register.  */
13726
    return 1;
13727
}
13728
 
13729
 
13730
/* Return true if the given symbol should be considered local for SVR4 PIC.  */
13731
 
13732
static bfd_boolean
13733
pic_need_relax (symbolS *sym, asection *segtype)
13734
{
13735
  asection *symsec;
13736
 
13737
  /* Handle the case of a symbol equated to another symbol.  */
13738
  while (symbol_equated_reloc_p (sym))
13739
    {
13740
      symbolS *n;
13741
 
13742
      /* It's possible to get a loop here in a badly written program.  */
13743
      n = symbol_get_value_expression (sym)->X_add_symbol;
13744
      if (n == sym)
13745
        break;
13746
      sym = n;
13747
    }
13748
 
13749
  if (symbol_section_p (sym))
13750
    return TRUE;
13751
 
13752
  symsec = S_GET_SEGMENT (sym);
13753
 
13754
  /* This must duplicate the test in adjust_reloc_syms.  */
13755
  return (symsec != &bfd_und_section
13756
          && symsec != &bfd_abs_section
13757
          && !bfd_is_com_section (symsec)
13758
          && !s_is_linkonce (sym, segtype)
13759
#ifdef OBJ_ELF
13760
          /* A global or weak symbol is treated as external.  */
13761
          && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
13762
#endif
13763
          );
13764
}
13765
 
13766
 
13767
/* Given a mips16 variant frag FRAGP, return non-zero if it needs an
13768
   extended opcode.  SEC is the section the frag is in.  */
13769
 
13770
static int
13771
mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
13772
{
13773
  int type;
13774
  const struct mips16_immed_operand *op;
13775
  offsetT val;
13776
  int mintiny, maxtiny;
13777
  segT symsec;
13778
  fragS *sym_frag;
13779
 
13780
  if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
13781
    return 0;
13782
  if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
13783
    return 1;
13784
 
13785
  type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13786
  op = mips16_immed_operands;
13787
  while (op->type != type)
13788
    {
13789
      ++op;
13790
      gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
13791
    }
13792
 
13793
  if (op->unsp)
13794
    {
13795
      if (type == '<' || type == '>' || type == '[' || type == ']')
13796
        {
13797
          mintiny = 1;
13798
          maxtiny = 1 << op->nbits;
13799
        }
13800
      else
13801
        {
13802
          mintiny = 0;
13803
          maxtiny = (1 << op->nbits) - 1;
13804
        }
13805
    }
13806
  else
13807
    {
13808
      mintiny = - (1 << (op->nbits - 1));
13809
      maxtiny = (1 << (op->nbits - 1)) - 1;
13810
    }
13811
 
13812
  sym_frag = symbol_get_frag (fragp->fr_symbol);
13813
  val = S_GET_VALUE (fragp->fr_symbol);
13814
  symsec = S_GET_SEGMENT (fragp->fr_symbol);
13815
 
13816
  if (op->pcrel)
13817
    {
13818
      addressT addr;
13819
 
13820
      /* We won't have the section when we are called from
13821
         mips_relax_frag.  However, we will always have been called
13822
         from md_estimate_size_before_relax first.  If this is a
13823
         branch to a different section, we mark it as such.  If SEC is
13824
         NULL, and the frag is not marked, then it must be a branch to
13825
         the same section.  */
13826
      if (sec == NULL)
13827
        {
13828
          if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
13829
            return 1;
13830
        }
13831
      else
13832
        {
13833
          /* Must have been called from md_estimate_size_before_relax.  */
13834
          if (symsec != sec)
13835
            {
13836
              fragp->fr_subtype =
13837
                RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13838
 
13839
              /* FIXME: We should support this, and let the linker
13840
                 catch branches and loads that are out of range.  */
13841
              as_bad_where (fragp->fr_file, fragp->fr_line,
13842
                            _("unsupported PC relative reference to different section"));
13843
 
13844
              return 1;
13845
            }
13846
          if (fragp != sym_frag && sym_frag->fr_address == 0)
13847
            /* Assume non-extended on the first relaxation pass.
13848
               The address we have calculated will be bogus if this is
13849
               a forward branch to another frag, as the forward frag
13850
               will have fr_address == 0.  */
13851
            return 0;
13852
        }
13853
 
13854
      /* In this case, we know for sure that the symbol fragment is in
13855
         the same section.  If the relax_marker of the symbol fragment
13856
         differs from the relax_marker of this fragment, we have not
13857
         yet adjusted the symbol fragment fr_address.  We want to add
13858
         in STRETCH in order to get a better estimate of the address.
13859
         This particularly matters because of the shift bits.  */
13860
      if (stretch != 0
13861
          && sym_frag->relax_marker != fragp->relax_marker)
13862
        {
13863
          fragS *f;
13864
 
13865
          /* Adjust stretch for any alignment frag.  Note that if have
13866
             been expanding the earlier code, the symbol may be
13867
             defined in what appears to be an earlier frag.  FIXME:
13868
             This doesn't handle the fr_subtype field, which specifies
13869
             a maximum number of bytes to skip when doing an
13870
             alignment.  */
13871
          for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
13872
            {
13873
              if (f->fr_type == rs_align || f->fr_type == rs_align_code)
13874
                {
13875
                  if (stretch < 0)
13876
                    stretch = - ((- stretch)
13877
                                 & ~ ((1 << (int) f->fr_offset) - 1));
13878
                  else
13879
                    stretch &= ~ ((1 << (int) f->fr_offset) - 1);
13880
                  if (stretch == 0)
13881
                    break;
13882
                }
13883
            }
13884
          if (f != NULL)
13885
            val += stretch;
13886
        }
13887
 
13888
      addr = fragp->fr_address + fragp->fr_fix;
13889
 
13890
      /* The base address rules are complicated.  The base address of
13891
         a branch is the following instruction.  The base address of a
13892
         PC relative load or add is the instruction itself, but if it
13893
         is in a delay slot (in which case it can not be extended) use
13894
         the address of the instruction whose delay slot it is in.  */
13895
      if (type == 'p' || type == 'q')
13896
        {
13897
          addr += 2;
13898
 
13899
          /* If we are currently assuming that this frag should be
13900
             extended, then, the current address is two bytes
13901
             higher.  */
13902
          if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13903
            addr += 2;
13904
 
13905
          /* Ignore the low bit in the target, since it will be set
13906
             for a text label.  */
13907
          if ((val & 1) != 0)
13908
            --val;
13909
        }
13910
      else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13911
        addr -= 4;
13912
      else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13913
        addr -= 2;
13914
 
13915
      val -= addr & ~ ((1 << op->shift) - 1);
13916
 
13917
      /* Branch offsets have an implicit 0 in the lowest bit.  */
13918
      if (type == 'p' || type == 'q')
13919
        val /= 2;
13920
 
13921
      /* If any of the shifted bits are set, we must use an extended
13922
         opcode.  If the address depends on the size of this
13923
         instruction, this can lead to a loop, so we arrange to always
13924
         use an extended opcode.  We only check this when we are in
13925
         the main relaxation loop, when SEC is NULL.  */
13926
      if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
13927
        {
13928
          fragp->fr_subtype =
13929
            RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13930
          return 1;
13931
        }
13932
 
13933
      /* If we are about to mark a frag as extended because the value
13934
         is precisely maxtiny + 1, then there is a chance of an
13935
         infinite loop as in the following code:
13936
             la $4,foo
13937
             .skip      1020
13938
             .align     2
13939
           foo:
13940
         In this case when the la is extended, foo is 0x3fc bytes
13941
         away, so the la can be shrunk, but then foo is 0x400 away, so
13942
         the la must be extended.  To avoid this loop, we mark the
13943
         frag as extended if it was small, and is about to become
13944
         extended with a value of maxtiny + 1.  */
13945
      if (val == ((maxtiny + 1) << op->shift)
13946
          && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
13947
          && sec == NULL)
13948
        {
13949
          fragp->fr_subtype =
13950
            RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13951
          return 1;
13952
        }
13953
    }
13954
  else if (symsec != absolute_section && sec != NULL)
13955
    as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
13956
 
13957
  if ((val & ((1 << op->shift) - 1)) != 0
13958
      || val < (mintiny << op->shift)
13959
      || val > (maxtiny << op->shift))
13960
    return 1;
13961
  else
13962
    return 0;
13963
}
13964
 
13965
/* Compute the length of a branch sequence, and adjust the
13966
   RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
13967
   worst-case length is computed, with UPDATE being used to indicate
13968
   whether an unconditional (-1), branch-likely (+1) or regular (0)
13969
   branch is to be computed.  */
13970
static int
13971
relaxed_branch_length (fragS *fragp, asection *sec, int update)
13972
{
13973
  bfd_boolean toofar;
13974
  int length;
13975
 
13976
  if (fragp
13977
      && S_IS_DEFINED (fragp->fr_symbol)
13978
      && sec == S_GET_SEGMENT (fragp->fr_symbol))
13979
    {
13980
      addressT addr;
13981
      offsetT val;
13982
 
13983
      val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
13984
 
13985
      addr = fragp->fr_address + fragp->fr_fix + 4;
13986
 
13987
      val -= addr;
13988
 
13989
      toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
13990
    }
13991
  else if (fragp)
13992
    /* If the symbol is not defined or it's in a different segment,
13993
       assume the user knows what's going on and emit a short
13994
       branch.  */
13995
    toofar = FALSE;
13996
  else
13997
    toofar = TRUE;
13998
 
13999
  if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14000
    fragp->fr_subtype
14001
      = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp->fr_subtype),
14002
                             RELAX_BRANCH_LIKELY (fragp->fr_subtype),
14003
                             RELAX_BRANCH_LINK (fragp->fr_subtype),
14004
                             toofar);
14005
 
14006
  length = 4;
14007
  if (toofar)
14008
    {
14009
      if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
14010
        length += 8;
14011
 
14012
      if (mips_pic != NO_PIC)
14013
        {
14014
          /* Additional space for PIC loading of target address.  */
14015
          length += 8;
14016
          if (mips_opts.isa == ISA_MIPS1)
14017
            /* Additional space for $at-stabilizing nop.  */
14018
            length += 4;
14019
        }
14020
 
14021
      /* If branch is conditional.  */
14022
      if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
14023
        length += 8;
14024
    }
14025
 
14026
  return length;
14027
}
14028
 
14029
/* Estimate the size of a frag before relaxing.  Unless this is the
14030
   mips16, we are not really relaxing here, and the final size is
14031
   encoded in the subtype information.  For the mips16, we have to
14032
   decide whether we are using an extended opcode or not.  */
14033
 
14034
int
14035
md_estimate_size_before_relax (fragS *fragp, asection *segtype)
14036
{
14037
  int change;
14038
 
14039
  if (RELAX_BRANCH_P (fragp->fr_subtype))
14040
    {
14041
 
14042
      fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
14043
 
14044
      return fragp->fr_var;
14045
    }
14046
 
14047
  if (RELAX_MIPS16_P (fragp->fr_subtype))
14048
    /* We don't want to modify the EXTENDED bit here; it might get us
14049
       into infinite loops.  We change it only in mips_relax_frag().  */
14050
    return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
14051
 
14052
  if (mips_pic == NO_PIC)
14053
    change = nopic_need_relax (fragp->fr_symbol, 0);
14054
  else if (mips_pic == SVR4_PIC)
14055
    change = pic_need_relax (fragp->fr_symbol, segtype);
14056
  else if (mips_pic == VXWORKS_PIC)
14057
    /* For vxworks, GOT16 relocations never have a corresponding LO16.  */
14058
    change = 0;
14059
  else
14060
    abort ();
14061
 
14062
  if (change)
14063
    {
14064
      fragp->fr_subtype |= RELAX_USE_SECOND;
14065
      return -RELAX_FIRST (fragp->fr_subtype);
14066
    }
14067
  else
14068
    return -RELAX_SECOND (fragp->fr_subtype);
14069
}
14070
 
14071
/* This is called to see whether a reloc against a defined symbol
14072
   should be converted into a reloc against a section.  */
14073
 
14074
int
14075
mips_fix_adjustable (fixS *fixp)
14076
{
14077
  if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
14078
      || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14079
    return 0;
14080
 
14081
  if (fixp->fx_addsy == NULL)
14082
    return 1;
14083
 
14084
  /* If symbol SYM is in a mergeable section, relocations of the form
14085
     SYM + 0 can usually be made section-relative.  The mergeable data
14086
     is then identified by the section offset rather than by the symbol.
14087
 
14088
     However, if we're generating REL LO16 relocations, the offset is split
14089
     between the LO16 and parterning high part relocation.  The linker will
14090
     need to recalculate the complete offset in order to correctly identify
14091
     the merge data.
14092
 
14093
     The linker has traditionally not looked for the parterning high part
14094
     relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
14095
     placed anywhere.  Rather than break backwards compatibility by changing
14096
     this, it seems better not to force the issue, and instead keep the
14097
     original symbol.  This will work with either linker behavior.  */
14098
  if ((lo16_reloc_p (fixp->fx_r_type)
14099
       || reloc_needs_lo_p (fixp->fx_r_type))
14100
      && HAVE_IN_PLACE_ADDENDS
14101
      && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
14102
    return 0;
14103
 
14104
  /* There is no place to store an in-place offset for JALR relocations.  */
14105
  if (fixp->fx_r_type == BFD_RELOC_MIPS_JALR && HAVE_IN_PLACE_ADDENDS)
14106
    return 0;
14107
 
14108
#ifdef OBJ_ELF
14109
  /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
14110
     to a floating-point stub.  The same is true for non-R_MIPS16_26
14111
     relocations against MIPS16 functions; in this case, the stub becomes
14112
     the function's canonical address.
14113
 
14114
     Floating-point stubs are stored in unique .mips16.call.* or
14115
     .mips16.fn.* sections.  If a stub T for function F is in section S,
14116
     the first relocation in section S must be against F; this is how the
14117
     linker determines the target function.  All relocations that might
14118
     resolve to T must also be against F.  We therefore have the following
14119
     restrictions, which are given in an intentionally-redundant way:
14120
 
14121
       1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
14122
          symbols.
14123
 
14124
       2. We cannot reduce a stub's relocations against non-MIPS16 symbols
14125
          if that stub might be used.
14126
 
14127
       3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
14128
          symbols.
14129
 
14130
       4. We cannot reduce a stub's relocations against MIPS16 symbols if
14131
          that stub might be used.
14132
 
14133
     There is a further restriction:
14134
 
14135
       5. We cannot reduce R_MIPS16_26 relocations against MIPS16 symbols
14136
          on targets with in-place addends; the relocation field cannot
14137
          encode the low bit.
14138
 
14139
     For simplicity, we deal with (3)-(5) by not reducing _any_ relocation
14140
     against a MIPS16 symbol.
14141
 
14142
     We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
14143
     relocation against some symbol R, no relocation against R may be
14144
     reduced.  (Note that this deals with (2) as well as (1) because
14145
     relocations against global symbols will never be reduced on ELF
14146
     targets.)  This approach is a little simpler than trying to detect
14147
     stub sections, and gives the "all or nothing" per-symbol consistency
14148
     that we have for MIPS16 symbols.  */
14149
  if (IS_ELF
14150
      && fixp->fx_subsy == NULL
14151
      && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
14152
          || *symbol_get_tc (fixp->fx_addsy)))
14153
    return 0;
14154
#endif
14155
 
14156
  return 1;
14157
}
14158
 
14159
/* Translate internal representation of relocation info to BFD target
14160
   format.  */
14161
 
14162
arelent **
14163
tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
14164
{
14165
  static arelent *retval[4];
14166
  arelent *reloc;
14167
  bfd_reloc_code_real_type code;
14168
 
14169
  memset (retval, 0, sizeof(retval));
14170
  reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
14171
  reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
14172
  *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
14173
  reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
14174
 
14175
  if (fixp->fx_pcrel)
14176
    {
14177
      gas_assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2);
14178
 
14179
      /* At this point, fx_addnumber is "symbol offset - pcrel address".
14180
         Relocations want only the symbol offset.  */
14181
      reloc->addend = fixp->fx_addnumber + reloc->address;
14182
      if (!IS_ELF)
14183
        {
14184
          /* A gruesome hack which is a result of the gruesome gas
14185
             reloc handling.  What's worse, for COFF (as opposed to
14186
             ECOFF), we might need yet another copy of reloc->address.
14187
             See bfd_install_relocation.  */
14188
          reloc->addend += reloc->address;
14189
        }
14190
    }
14191
  else
14192
    reloc->addend = fixp->fx_addnumber;
14193
 
14194
  /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
14195
     entry to be used in the relocation's section offset.  */
14196
  if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14197
    {
14198
      reloc->address = reloc->addend;
14199
      reloc->addend = 0;
14200
    }
14201
 
14202
  code = fixp->fx_r_type;
14203
 
14204
  reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
14205
  if (reloc->howto == NULL)
14206
    {
14207
      as_bad_where (fixp->fx_file, fixp->fx_line,
14208
                    _("Can not represent %s relocation in this object file format"),
14209
                    bfd_get_reloc_code_name (code));
14210
      retval[0] = NULL;
14211
    }
14212
 
14213
  return retval;
14214
}
14215
 
14216
/* Relax a machine dependent frag.  This returns the amount by which
14217
   the current size of the frag should change.  */
14218
 
14219
int
14220
mips_relax_frag (asection *sec, fragS *fragp, long stretch)
14221
{
14222
  if (RELAX_BRANCH_P (fragp->fr_subtype))
14223
    {
14224
      offsetT old_var = fragp->fr_var;
14225
 
14226
      fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
14227
 
14228
      return fragp->fr_var - old_var;
14229
    }
14230
 
14231
  if (! RELAX_MIPS16_P (fragp->fr_subtype))
14232
    return 0;
14233
 
14234
  if (mips16_extended_frag (fragp, NULL, stretch))
14235
    {
14236
      if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14237
        return 0;
14238
      fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
14239
      return 2;
14240
    }
14241
  else
14242
    {
14243
      if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14244
        return 0;
14245
      fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
14246
      return -2;
14247
    }
14248
 
14249
  return 0;
14250
}
14251
 
14252
/* Convert a machine dependent frag.  */
14253
 
14254
void
14255
md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
14256
{
14257
  if (RELAX_BRANCH_P (fragp->fr_subtype))
14258
    {
14259
      bfd_byte *buf;
14260
      unsigned long insn;
14261
      expressionS exp;
14262
      fixS *fixp;
14263
 
14264
      buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
14265
 
14266
      if (target_big_endian)
14267
        insn = bfd_getb32 (buf);
14268
      else
14269
        insn = bfd_getl32 (buf);
14270
 
14271
      if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14272
        {
14273
          /* We generate a fixup instead of applying it right now
14274
             because, if there are linker relaxations, we're going to
14275
             need the relocations.  */
14276
          exp.X_op = O_symbol;
14277
          exp.X_add_symbol = fragp->fr_symbol;
14278
          exp.X_add_number = fragp->fr_offset;
14279
 
14280
          fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14281
                              4, &exp, TRUE, BFD_RELOC_16_PCREL_S2);
14282
          fixp->fx_file = fragp->fr_file;
14283
          fixp->fx_line = fragp->fr_line;
14284
 
14285
          md_number_to_chars ((char *) buf, insn, 4);
14286
          buf += 4;
14287
        }
14288
      else
14289
        {
14290
          int i;
14291
 
14292
          as_warn_where (fragp->fr_file, fragp->fr_line,
14293
                         _("relaxed out-of-range branch into a jump"));
14294
 
14295
          if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
14296
            goto uncond;
14297
 
14298
          if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14299
            {
14300
              /* Reverse the branch.  */
14301
              switch ((insn >> 28) & 0xf)
14302
                {
14303
                case 4:
14304
                  /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
14305
                     have the condition reversed by tweaking a single
14306
                     bit, and their opcodes all have 0x4???????.  */
14307
                  gas_assert ((insn & 0xf1000000) == 0x41000000);
14308
                  insn ^= 0x00010000;
14309
                  break;
14310
 
14311
                case 0:
14312
                  /* bltz       0x04000000      bgez    0x04010000
14313
                     bltzal     0x04100000      bgezal  0x04110000  */
14314
                  gas_assert ((insn & 0xfc0e0000) == 0x04000000);
14315
                  insn ^= 0x00010000;
14316
                  break;
14317
 
14318
                case 1:
14319
                  /* beq        0x10000000      bne     0x14000000
14320
                     blez       0x18000000      bgtz    0x1c000000  */
14321
                  insn ^= 0x04000000;
14322
                  break;
14323
 
14324
                default:
14325
                  abort ();
14326
                }
14327
            }
14328
 
14329
          if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14330
            {
14331
              /* Clear the and-link bit.  */
14332
              gas_assert ((insn & 0xfc1c0000) == 0x04100000);
14333
 
14334
              /* bltzal         0x04100000      bgezal  0x04110000
14335
                 bltzall        0x04120000      bgezall 0x04130000  */
14336
              insn &= ~0x00100000;
14337
            }
14338
 
14339
          /* Branch over the branch (if the branch was likely) or the
14340
             full jump (not likely case).  Compute the offset from the
14341
             current instruction to branch to.  */
14342
          if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14343
            i = 16;
14344
          else
14345
            {
14346
              /* How many bytes in instructions we've already emitted?  */
14347
              i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14348
              /* How many bytes in instructions from here to the end?  */
14349
              i = fragp->fr_var - i;
14350
            }
14351
          /* Convert to instruction count.  */
14352
          i >>= 2;
14353
          /* Branch counts from the next instruction.  */
14354
          i--;
14355
          insn |= i;
14356
          /* Branch over the jump.  */
14357
          md_number_to_chars ((char *) buf, insn, 4);
14358
          buf += 4;
14359
 
14360
          /* nop */
14361
          md_number_to_chars ((char *) buf, 0, 4);
14362
          buf += 4;
14363
 
14364
          if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14365
            {
14366
              /* beql $0, $0, 2f */
14367
              insn = 0x50000000;
14368
              /* Compute the PC offset from the current instruction to
14369
                 the end of the variable frag.  */
14370
              /* How many bytes in instructions we've already emitted?  */
14371
              i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14372
              /* How many bytes in instructions from here to the end?  */
14373
              i = fragp->fr_var - i;
14374
              /* Convert to instruction count.  */
14375
              i >>= 2;
14376
              /* Don't decrement i, because we want to branch over the
14377
                 delay slot.  */
14378
 
14379
              insn |= i;
14380
              md_number_to_chars ((char *) buf, insn, 4);
14381
              buf += 4;
14382
 
14383
              md_number_to_chars ((char *) buf, 0, 4);
14384
              buf += 4;
14385
            }
14386
 
14387
        uncond:
14388
          if (mips_pic == NO_PIC)
14389
            {
14390
              /* j or jal.  */
14391
              insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
14392
                      ? 0x0c000000 : 0x08000000);
14393
              exp.X_op = O_symbol;
14394
              exp.X_add_symbol = fragp->fr_symbol;
14395
              exp.X_add_number = fragp->fr_offset;
14396
 
14397
              fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14398
                                  4, &exp, FALSE, BFD_RELOC_MIPS_JMP);
14399
              fixp->fx_file = fragp->fr_file;
14400
              fixp->fx_line = fragp->fr_line;
14401
 
14402
              md_number_to_chars ((char *) buf, insn, 4);
14403
              buf += 4;
14404
            }
14405
          else
14406
            {
14407
              /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
14408
              insn = HAVE_64BIT_ADDRESSES ? 0xdf810000 : 0x8f810000;
14409
              exp.X_op = O_symbol;
14410
              exp.X_add_symbol = fragp->fr_symbol;
14411
              exp.X_add_number = fragp->fr_offset;
14412
 
14413
              if (fragp->fr_offset)
14414
                {
14415
                  exp.X_add_symbol = make_expr_symbol (&exp);
14416
                  exp.X_add_number = 0;
14417
                }
14418
 
14419
              fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14420
                                  4, &exp, FALSE, BFD_RELOC_MIPS_GOT16);
14421
              fixp->fx_file = fragp->fr_file;
14422
              fixp->fx_line = fragp->fr_line;
14423
 
14424
              md_number_to_chars ((char *) buf, insn, 4);
14425
              buf += 4;
14426
 
14427
              if (mips_opts.isa == ISA_MIPS1)
14428
                {
14429
                  /* nop */
14430
                  md_number_to_chars ((char *) buf, 0, 4);
14431
                  buf += 4;
14432
                }
14433
 
14434
              /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
14435
              insn = HAVE_64BIT_ADDRESSES ? 0x64210000 : 0x24210000;
14436
 
14437
              fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14438
                                  4, &exp, FALSE, BFD_RELOC_LO16);
14439
              fixp->fx_file = fragp->fr_file;
14440
              fixp->fx_line = fragp->fr_line;
14441
 
14442
              md_number_to_chars ((char *) buf, insn, 4);
14443
              buf += 4;
14444
 
14445
              /* j(al)r $at.  */
14446
              if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14447
                insn = 0x0020f809;
14448
              else
14449
                insn = 0x00200008;
14450
 
14451
              md_number_to_chars ((char *) buf, insn, 4);
14452
              buf += 4;
14453
            }
14454
        }
14455
 
14456
      gas_assert (buf == (bfd_byte *)fragp->fr_literal
14457
              + fragp->fr_fix + fragp->fr_var);
14458
 
14459
      fragp->fr_fix += fragp->fr_var;
14460
 
14461
      return;
14462
    }
14463
 
14464
  if (RELAX_MIPS16_P (fragp->fr_subtype))
14465
    {
14466
      int type;
14467
      const struct mips16_immed_operand *op;
14468
      bfd_boolean small, ext;
14469
      offsetT val;
14470
      bfd_byte *buf;
14471
      unsigned long insn;
14472
      bfd_boolean use_extend;
14473
      unsigned short extend;
14474
 
14475
      type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14476
      op = mips16_immed_operands;
14477
      while (op->type != type)
14478
        ++op;
14479
 
14480
      if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14481
        {
14482
          small = FALSE;
14483
          ext = TRUE;
14484
        }
14485
      else
14486
        {
14487
          small = TRUE;
14488
          ext = FALSE;
14489
        }
14490
 
14491
      resolve_symbol_value (fragp->fr_symbol);
14492
      val = S_GET_VALUE (fragp->fr_symbol);
14493
      if (op->pcrel)
14494
        {
14495
          addressT addr;
14496
 
14497
          addr = fragp->fr_address + fragp->fr_fix;
14498
 
14499
          /* The rules for the base address of a PC relative reloc are
14500
             complicated; see mips16_extended_frag.  */
14501
          if (type == 'p' || type == 'q')
14502
            {
14503
              addr += 2;
14504
              if (ext)
14505
                addr += 2;
14506
              /* Ignore the low bit in the target, since it will be
14507
                 set for a text label.  */
14508
              if ((val & 1) != 0)
14509
                --val;
14510
            }
14511
          else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14512
            addr -= 4;
14513
          else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14514
            addr -= 2;
14515
 
14516
          addr &= ~ (addressT) ((1 << op->shift) - 1);
14517
          val -= addr;
14518
 
14519
          /* Make sure the section winds up with the alignment we have
14520
             assumed.  */
14521
          if (op->shift > 0)
14522
            record_alignment (asec, op->shift);
14523
        }
14524
 
14525
      if (ext
14526
          && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
14527
              || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
14528
        as_warn_where (fragp->fr_file, fragp->fr_line,
14529
                       _("extended instruction in delay slot"));
14530
 
14531
      buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
14532
 
14533
      if (target_big_endian)
14534
        insn = bfd_getb16 (buf);
14535
      else
14536
        insn = bfd_getl16 (buf);
14537
 
14538
      mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
14539
                    RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
14540
                    small, ext, &insn, &use_extend, &extend);
14541
 
14542
      if (use_extend)
14543
        {
14544
          md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
14545
          fragp->fr_fix += 2;
14546
          buf += 2;
14547
        }
14548
 
14549
      md_number_to_chars ((char *) buf, insn, 2);
14550
      fragp->fr_fix += 2;
14551
      buf += 2;
14552
    }
14553
  else
14554
    {
14555
      int first, second;
14556
      fixS *fixp;
14557
 
14558
      first = RELAX_FIRST (fragp->fr_subtype);
14559
      second = RELAX_SECOND (fragp->fr_subtype);
14560
      fixp = (fixS *) fragp->fr_opcode;
14561
 
14562
      /* Possibly emit a warning if we've chosen the longer option.  */
14563
      if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
14564
          == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
14565
        {
14566
          const char *msg = macro_warning (fragp->fr_subtype);
14567
          if (msg != 0)
14568
            as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
14569
        }
14570
 
14571
      /* Go through all the fixups for the first sequence.  Disable them
14572
         (by marking them as done) if we're going to use the second
14573
         sequence instead.  */
14574
      while (fixp
14575
             && fixp->fx_frag == fragp
14576
             && fixp->fx_where < fragp->fr_fix - second)
14577
        {
14578
          if (fragp->fr_subtype & RELAX_USE_SECOND)
14579
            fixp->fx_done = 1;
14580
          fixp = fixp->fx_next;
14581
        }
14582
 
14583
      /* Go through the fixups for the second sequence.  Disable them if
14584
         we're going to use the first sequence, otherwise adjust their
14585
         addresses to account for the relaxation.  */
14586
      while (fixp && fixp->fx_frag == fragp)
14587
        {
14588
          if (fragp->fr_subtype & RELAX_USE_SECOND)
14589
            fixp->fx_where -= first;
14590
          else
14591
            fixp->fx_done = 1;
14592
          fixp = fixp->fx_next;
14593
        }
14594
 
14595
      /* Now modify the frag contents.  */
14596
      if (fragp->fr_subtype & RELAX_USE_SECOND)
14597
        {
14598
          char *start;
14599
 
14600
          start = fragp->fr_literal + fragp->fr_fix - first - second;
14601
          memmove (start, start + first, second);
14602
          fragp->fr_fix -= first;
14603
        }
14604
      else
14605
        fragp->fr_fix -= second;
14606
    }
14607
}
14608
 
14609
#ifdef OBJ_ELF
14610
 
14611
/* This function is called after the relocs have been generated.
14612
   We've been storing mips16 text labels as odd.  Here we convert them
14613
   back to even for the convenience of the debugger.  */
14614
 
14615
void
14616
mips_frob_file_after_relocs (void)
14617
{
14618
  asymbol **syms;
14619
  unsigned int count, i;
14620
 
14621
  if (!IS_ELF)
14622
    return;
14623
 
14624
  syms = bfd_get_outsymbols (stdoutput);
14625
  count = bfd_get_symcount (stdoutput);
14626
  for (i = 0; i < count; i++, syms++)
14627
    {
14628
      if (ELF_ST_IS_MIPS16 (elf_symbol (*syms)->internal_elf_sym.st_other)
14629
          && ((*syms)->value & 1) != 0)
14630
        {
14631
          (*syms)->value &= ~1;
14632
          /* If the symbol has an odd size, it was probably computed
14633
             incorrectly, so adjust that as well.  */
14634
          if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
14635
            ++elf_symbol (*syms)->internal_elf_sym.st_size;
14636
        }
14637
    }
14638
}
14639
 
14640
#endif
14641
 
14642
/* This function is called whenever a label is defined.  It is used
14643
   when handling branch delays; if a branch has a label, we assume we
14644
   can not move it.  */
14645
 
14646
void
14647
mips_define_label (symbolS *sym)
14648
{
14649
  segment_info_type *si = seg_info (now_seg);
14650
  struct insn_label_list *l;
14651
 
14652
  if (free_insn_labels == NULL)
14653
    l = (struct insn_label_list *) xmalloc (sizeof *l);
14654
  else
14655
    {
14656
      l = free_insn_labels;
14657
      free_insn_labels = l->next;
14658
    }
14659
 
14660
  l->label = sym;
14661
  l->next = si->label_list;
14662
  si->label_list = l;
14663
 
14664
#ifdef OBJ_ELF
14665
  dwarf2_emit_label (sym);
14666
#endif
14667
}
14668
 
14669
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14670
 
14671
/* Some special processing for a MIPS ELF file.  */
14672
 
14673
void
14674
mips_elf_final_processing (void)
14675
{
14676
  /* Write out the register information.  */
14677
  if (mips_abi != N64_ABI)
14678
    {
14679
      Elf32_RegInfo s;
14680
 
14681
      s.ri_gprmask = mips_gprmask;
14682
      s.ri_cprmask[0] = mips_cprmask[0];
14683
      s.ri_cprmask[1] = mips_cprmask[1];
14684
      s.ri_cprmask[2] = mips_cprmask[2];
14685
      s.ri_cprmask[3] = mips_cprmask[3];
14686
      /* The gp_value field is set by the MIPS ELF backend.  */
14687
 
14688
      bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
14689
                                       ((Elf32_External_RegInfo *)
14690
                                        mips_regmask_frag));
14691
    }
14692
  else
14693
    {
14694
      Elf64_Internal_RegInfo s;
14695
 
14696
      s.ri_gprmask = mips_gprmask;
14697
      s.ri_pad = 0;
14698
      s.ri_cprmask[0] = mips_cprmask[0];
14699
      s.ri_cprmask[1] = mips_cprmask[1];
14700
      s.ri_cprmask[2] = mips_cprmask[2];
14701
      s.ri_cprmask[3] = mips_cprmask[3];
14702
      /* The gp_value field is set by the MIPS ELF backend.  */
14703
 
14704
      bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
14705
                                       ((Elf64_External_RegInfo *)
14706
                                        mips_regmask_frag));
14707
    }
14708
 
14709
  /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
14710
     sort of BFD interface for this.  */
14711
  if (mips_any_noreorder)
14712
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
14713
  if (mips_pic != NO_PIC)
14714
    {
14715
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
14716
      elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14717
    }
14718
  if (mips_abicalls)
14719
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14720
 
14721
  /* Set MIPS ELF flags for ASEs.  */
14722
  /* We may need to define a new flag for DSP ASE, and set this flag when
14723
     file_ase_dsp is true.  */
14724
  /* Same for DSP R2.  */
14725
  /* We may need to define a new flag for MT ASE, and set this flag when
14726
     file_ase_mt is true.  */
14727
  if (file_ase_mips16)
14728
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
14729
#if 0 /* XXX FIXME */
14730
  if (file_ase_mips3d)
14731
    elf_elfheader (stdoutput)->e_flags |= ???;
14732
#endif
14733
  if (file_ase_mdmx)
14734
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
14735
 
14736
  /* Set the MIPS ELF ABI flags.  */
14737
  if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
14738
    elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
14739
  else if (mips_abi == O64_ABI)
14740
    elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
14741
  else if (mips_abi == EABI_ABI)
14742
    {
14743
      if (!file_mips_gp32)
14744
        elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
14745
      else
14746
        elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
14747
    }
14748
  else if (mips_abi == N32_ABI)
14749
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
14750
 
14751
  /* Nothing to do for N64_ABI.  */
14752
 
14753
  if (mips_32bitmode)
14754
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
14755
 
14756
#if 0 /* XXX FIXME */
14757
  /* 32 bit code with 64 bit FP registers.  */
14758
  if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
14759
    elf_elfheader (stdoutput)->e_flags |= ???;
14760
#endif
14761
}
14762
 
14763
#endif /* OBJ_ELF || OBJ_MAYBE_ELF */
14764
 
14765
typedef struct proc {
14766
  symbolS *func_sym;
14767
  symbolS *func_end_sym;
14768
  unsigned long reg_mask;
14769
  unsigned long reg_offset;
14770
  unsigned long fpreg_mask;
14771
  unsigned long fpreg_offset;
14772
  unsigned long frame_offset;
14773
  unsigned long frame_reg;
14774
  unsigned long pc_reg;
14775
} procS;
14776
 
14777
static procS cur_proc;
14778
static procS *cur_proc_ptr;
14779
static int numprocs;
14780
 
14781
/* Implement NOP_OPCODE.  We encode a MIPS16 nop as "1" and a normal
14782
   nop as "0".  */
14783
 
14784
char
14785
mips_nop_opcode (void)
14786
{
14787
  return seg_info (now_seg)->tc_segment_info_data.mips16;
14788
}
14789
 
14790
/* Fill in an rs_align_code fragment.  This only needs to do something
14791
   for MIPS16 code, where 0 is not a nop.  */
14792
 
14793
void
14794
mips_handle_align (fragS *fragp)
14795
{
14796
  char *p;
14797
 
14798
  if (fragp->fr_type != rs_align_code)
14799
    return;
14800
 
14801
  p = fragp->fr_literal + fragp->fr_fix;
14802
  if (*p)
14803
    {
14804
      int bytes;
14805
 
14806
      bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
14807
      if (bytes & 1)
14808
        {
14809
          *p++ = 0;
14810
          fragp->fr_fix++;
14811
        }
14812
      md_number_to_chars (p, mips16_nop_insn.insn_opcode, 2);
14813
      fragp->fr_var = 2;
14814
    }
14815
}
14816
 
14817
static void
14818
md_obj_begin (void)
14819
{
14820
}
14821
 
14822
static void
14823
md_obj_end (void)
14824
{
14825
  /* Check for premature end, nesting errors, etc.  */
14826
  if (cur_proc_ptr)
14827
    as_warn (_("missing .end at end of assembly"));
14828
}
14829
 
14830
static long
14831
get_number (void)
14832
{
14833
  int negative = 0;
14834
  long val = 0;
14835
 
14836
  if (*input_line_pointer == '-')
14837
    {
14838
      ++input_line_pointer;
14839
      negative = 1;
14840
    }
14841
  if (!ISDIGIT (*input_line_pointer))
14842
    as_bad (_("expected simple number"));
14843
  if (input_line_pointer[0] == '0')
14844
    {
14845
      if (input_line_pointer[1] == 'x')
14846
        {
14847
          input_line_pointer += 2;
14848
          while (ISXDIGIT (*input_line_pointer))
14849
            {
14850
              val <<= 4;
14851
              val |= hex_value (*input_line_pointer++);
14852
            }
14853
          return negative ? -val : val;
14854
        }
14855
      else
14856
        {
14857
          ++input_line_pointer;
14858
          while (ISDIGIT (*input_line_pointer))
14859
            {
14860
              val <<= 3;
14861
              val |= *input_line_pointer++ - '0';
14862
            }
14863
          return negative ? -val : val;
14864
        }
14865
    }
14866
  if (!ISDIGIT (*input_line_pointer))
14867
    {
14868
      printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
14869
              *input_line_pointer, *input_line_pointer);
14870
      as_warn (_("invalid number"));
14871
      return -1;
14872
    }
14873
  while (ISDIGIT (*input_line_pointer))
14874
    {
14875
      val *= 10;
14876
      val += *input_line_pointer++ - '0';
14877
    }
14878
  return negative ? -val : val;
14879
}
14880
 
14881
/* The .file directive; just like the usual .file directive, but there
14882
   is an initial number which is the ECOFF file index.  In the non-ECOFF
14883
   case .file implies DWARF-2.  */
14884
 
14885
static void
14886
s_mips_file (int x ATTRIBUTE_UNUSED)
14887
{
14888
  static int first_file_directive = 0;
14889
 
14890
  if (ECOFF_DEBUGGING)
14891
    {
14892
      get_number ();
14893
      s_app_file (0);
14894
    }
14895
  else
14896
    {
14897
      char *filename;
14898
 
14899
      filename = dwarf2_directive_file (0);
14900
 
14901
      /* Versions of GCC up to 3.1 start files with a ".file"
14902
         directive even for stabs output.  Make sure that this
14903
         ".file" is handled.  Note that you need a version of GCC
14904
         after 3.1 in order to support DWARF-2 on MIPS.  */
14905
      if (filename != NULL && ! first_file_directive)
14906
        {
14907
          (void) new_logical_line (filename, -1);
14908
          s_app_file_string (filename, 0);
14909
        }
14910
      first_file_directive = 1;
14911
    }
14912
}
14913
 
14914
/* The .loc directive, implying DWARF-2.  */
14915
 
14916
static void
14917
s_mips_loc (int x ATTRIBUTE_UNUSED)
14918
{
14919
  if (!ECOFF_DEBUGGING)
14920
    dwarf2_directive_loc (0);
14921
}
14922
 
14923
/* The .end directive.  */
14924
 
14925
static void
14926
s_mips_end (int x ATTRIBUTE_UNUSED)
14927
{
14928
  symbolS *p;
14929
 
14930
  /* Following functions need their own .frame and .cprestore directives.  */
14931
  mips_frame_reg_valid = 0;
14932
  mips_cprestore_valid = 0;
14933
 
14934
  if (!is_end_of_line[(unsigned char) *input_line_pointer])
14935
    {
14936
      p = get_symbol ();
14937
      demand_empty_rest_of_line ();
14938
    }
14939
  else
14940
    p = NULL;
14941
 
14942
  if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14943
    as_warn (_(".end not in text section"));
14944
 
14945
  if (!cur_proc_ptr)
14946
    {
14947
      as_warn (_(".end directive without a preceding .ent directive."));
14948
      demand_empty_rest_of_line ();
14949
      return;
14950
    }
14951
 
14952
  if (p != NULL)
14953
    {
14954
      gas_assert (S_GET_NAME (p));
14955
      if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
14956
        as_warn (_(".end symbol does not match .ent symbol."));
14957
 
14958
      if (debug_type == DEBUG_STABS)
14959
        stabs_generate_asm_endfunc (S_GET_NAME (p),
14960
                                    S_GET_NAME (p));
14961
    }
14962
  else
14963
    as_warn (_(".end directive missing or unknown symbol"));
14964
 
14965
#ifdef OBJ_ELF
14966
  /* Create an expression to calculate the size of the function.  */
14967
  if (p && cur_proc_ptr)
14968
    {
14969
      OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
14970
      expressionS *exp = xmalloc (sizeof (expressionS));
14971
 
14972
      obj->size = exp;
14973
      exp->X_op = O_subtract;
14974
      exp->X_add_symbol = symbol_temp_new_now ();
14975
      exp->X_op_symbol = p;
14976
      exp->X_add_number = 0;
14977
 
14978
      cur_proc_ptr->func_end_sym = exp->X_add_symbol;
14979
    }
14980
 
14981
  /* Generate a .pdr section.  */
14982
  if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
14983
    {
14984
      segT saved_seg = now_seg;
14985
      subsegT saved_subseg = now_subseg;
14986
      valueT dot;
14987
      expressionS exp;
14988
      char *fragp;
14989
 
14990
      dot = frag_now_fix ();
14991
 
14992
#ifdef md_flush_pending_output
14993
      md_flush_pending_output ();
14994
#endif
14995
 
14996
      gas_assert (pdr_seg);
14997
      subseg_set (pdr_seg, 0);
14998
 
14999
      /* Write the symbol.  */
15000
      exp.X_op = O_symbol;
15001
      exp.X_add_symbol = p;
15002
      exp.X_add_number = 0;
15003
      emit_expr (&exp, 4);
15004
 
15005
      fragp = frag_more (7 * 4);
15006
 
15007
      md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
15008
      md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
15009
      md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
15010
      md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
15011
      md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
15012
      md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
15013
      md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
15014
 
15015
      subseg_set (saved_seg, saved_subseg);
15016
    }
15017
#endif /* OBJ_ELF */
15018
 
15019
  cur_proc_ptr = NULL;
15020
}
15021
 
15022
/* The .aent and .ent directives.  */
15023
 
15024
static void
15025
s_mips_ent (int aent)
15026
{
15027
  symbolS *symbolP;
15028
 
15029
  symbolP = get_symbol ();
15030
  if (*input_line_pointer == ',')
15031
    ++input_line_pointer;
15032
  SKIP_WHITESPACE ();
15033
  if (ISDIGIT (*input_line_pointer)
15034
      || *input_line_pointer == '-')
15035
    get_number ();
15036
 
15037
  if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
15038
    as_warn (_(".ent or .aent not in text section."));
15039
 
15040
  if (!aent && cur_proc_ptr)
15041
    as_warn (_("missing .end"));
15042
 
15043
  if (!aent)
15044
    {
15045
      /* This function needs its own .frame and .cprestore directives.  */
15046
      mips_frame_reg_valid = 0;
15047
      mips_cprestore_valid = 0;
15048
 
15049
      cur_proc_ptr = &cur_proc;
15050
      memset (cur_proc_ptr, '\0', sizeof (procS));
15051
 
15052
      cur_proc_ptr->func_sym = symbolP;
15053
 
15054
      symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
15055
 
15056
      ++numprocs;
15057
 
15058
      if (debug_type == DEBUG_STABS)
15059
        stabs_generate_asm_func (S_GET_NAME (symbolP),
15060
                                 S_GET_NAME (symbolP));
15061
    }
15062
 
15063
  demand_empty_rest_of_line ();
15064
}
15065
 
15066
/* The .frame directive. If the mdebug section is present (IRIX 5 native)
15067
   then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
15068
   s_mips_frame is used so that we can set the PDR information correctly.
15069
   We can't use the ecoff routines because they make reference to the ecoff
15070
   symbol table (in the mdebug section).  */
15071
 
15072
static void
15073
s_mips_frame (int ignore ATTRIBUTE_UNUSED)
15074
{
15075
#ifdef OBJ_ELF
15076
  if (IS_ELF && !ECOFF_DEBUGGING)
15077
    {
15078
      long val;
15079
 
15080
      if (cur_proc_ptr == (procS *) NULL)
15081
        {
15082
          as_warn (_(".frame outside of .ent"));
15083
          demand_empty_rest_of_line ();
15084
          return;
15085
        }
15086
 
15087
      cur_proc_ptr->frame_reg = tc_get_register (1);
15088
 
15089
      SKIP_WHITESPACE ();
15090
      if (*input_line_pointer++ != ','
15091
          || get_absolute_expression_and_terminator (&val) != ',')
15092
        {
15093
          as_warn (_("Bad .frame directive"));
15094
          --input_line_pointer;
15095
          demand_empty_rest_of_line ();
15096
          return;
15097
        }
15098
 
15099
      cur_proc_ptr->frame_offset = val;
15100
      cur_proc_ptr->pc_reg = tc_get_register (0);
15101
 
15102
      demand_empty_rest_of_line ();
15103
    }
15104
  else
15105
#endif /* OBJ_ELF */
15106
    s_ignore (ignore);
15107
}
15108
 
15109
/* The .fmask and .mask directives. If the mdebug section is present
15110
   (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
15111
   embedded targets, s_mips_mask is used so that we can set the PDR
15112
   information correctly. We can't use the ecoff routines because they
15113
   make reference to the ecoff symbol table (in the mdebug section).  */
15114
 
15115
static void
15116
s_mips_mask (int reg_type)
15117
{
15118
#ifdef OBJ_ELF
15119
  if (IS_ELF && !ECOFF_DEBUGGING)
15120
    {
15121
      long mask, off;
15122
 
15123
      if (cur_proc_ptr == (procS *) NULL)
15124
        {
15125
          as_warn (_(".mask/.fmask outside of .ent"));
15126
          demand_empty_rest_of_line ();
15127
          return;
15128
        }
15129
 
15130
      if (get_absolute_expression_and_terminator (&mask) != ',')
15131
        {
15132
          as_warn (_("Bad .mask/.fmask directive"));
15133
          --input_line_pointer;
15134
          demand_empty_rest_of_line ();
15135
          return;
15136
        }
15137
 
15138
      off = get_absolute_expression ();
15139
 
15140
      if (reg_type == 'F')
15141
        {
15142
          cur_proc_ptr->fpreg_mask = mask;
15143
          cur_proc_ptr->fpreg_offset = off;
15144
        }
15145
      else
15146
        {
15147
          cur_proc_ptr->reg_mask = mask;
15148
          cur_proc_ptr->reg_offset = off;
15149
        }
15150
 
15151
      demand_empty_rest_of_line ();
15152
    }
15153
  else
15154
#endif /* OBJ_ELF */
15155
    s_ignore (reg_type);
15156
}
15157
 
15158
/* A table describing all the processors gas knows about.  Names are
15159
   matched in the order listed.
15160
 
15161
   To ease comparison, please keep this table in the same order as
15162
   gcc's mips_cpu_info_table[].  */
15163
static const struct mips_cpu_info mips_cpu_info_table[] =
15164
{
15165
  /* Entries for generic ISAs */
15166
  { "mips1",          MIPS_CPU_IS_ISA,          ISA_MIPS1,      CPU_R3000 },
15167
  { "mips2",          MIPS_CPU_IS_ISA,          ISA_MIPS2,      CPU_R6000 },
15168
  { "mips3",          MIPS_CPU_IS_ISA,          ISA_MIPS3,      CPU_R4000 },
15169
  { "mips4",          MIPS_CPU_IS_ISA,          ISA_MIPS4,      CPU_R8000 },
15170
  { "mips5",          MIPS_CPU_IS_ISA,          ISA_MIPS5,      CPU_MIPS5 },
15171
  { "mips32",         MIPS_CPU_IS_ISA,          ISA_MIPS32,     CPU_MIPS32 },
15172
  { "mips32r2",       MIPS_CPU_IS_ISA,          ISA_MIPS32R2,   CPU_MIPS32R2 },
15173
  { "mips64",         MIPS_CPU_IS_ISA,          ISA_MIPS64,     CPU_MIPS64 },
15174
  { "mips64r2",       MIPS_CPU_IS_ISA,          ISA_MIPS64R2,   CPU_MIPS64R2 },
15175
 
15176
  /* MIPS I */
15177
  { "r3000",          0,                 ISA_MIPS1,      CPU_R3000 },
15178
  { "r2000",          0,                 ISA_MIPS1,      CPU_R3000 },
15179
  { "r3900",          0,                 ISA_MIPS1,      CPU_R3900 },
15180
 
15181
  /* MIPS II */
15182
  { "r6000",          0,                 ISA_MIPS2,      CPU_R6000 },
15183
 
15184
  /* MIPS III */
15185
  { "r4000",          0,                 ISA_MIPS3,      CPU_R4000 },
15186
  { "r4010",          0,                 ISA_MIPS2,      CPU_R4010 },
15187
  { "vr4100",         0,                 ISA_MIPS3,      CPU_VR4100 },
15188
  { "vr4111",         0,                 ISA_MIPS3,      CPU_R4111 },
15189
  { "vr4120",         0,                 ISA_MIPS3,      CPU_VR4120 },
15190
  { "vr4130",         0,                 ISA_MIPS3,      CPU_VR4120 },
15191
  { "vr4181",         0,                 ISA_MIPS3,      CPU_R4111 },
15192
  { "vr4300",         0,                 ISA_MIPS3,      CPU_R4300 },
15193
  { "r4400",          0,                 ISA_MIPS3,      CPU_R4400 },
15194
  { "r4600",          0,                 ISA_MIPS3,      CPU_R4600 },
15195
  { "orion",          0,                 ISA_MIPS3,      CPU_R4600 },
15196
  { "r4650",          0,                 ISA_MIPS3,      CPU_R4650 },
15197
  /* ST Microelectronics Loongson 2E and 2F cores */
15198
  { "loongson2e",     0,                 ISA_MIPS3,   CPU_LOONGSON_2E },
15199
  { "loongson2f",     0,                 ISA_MIPS3,   CPU_LOONGSON_2F },
15200
 
15201
  /* MIPS IV */
15202
  { "r8000",          0,                 ISA_MIPS4,      CPU_R8000 },
15203
  { "r10000",         0,                 ISA_MIPS4,      CPU_R10000 },
15204
  { "r12000",         0,                 ISA_MIPS4,      CPU_R12000 },
15205
  { "r14000",         0,                 ISA_MIPS4,      CPU_R14000 },
15206
  { "r16000",         0,                 ISA_MIPS4,      CPU_R16000 },
15207
  { "vr5000",         0,                 ISA_MIPS4,      CPU_R5000 },
15208
  { "vr5400",         0,                 ISA_MIPS4,      CPU_VR5400 },
15209
  { "vr5500",         0,                 ISA_MIPS4,      CPU_VR5500 },
15210
  { "rm5200",         0,                 ISA_MIPS4,      CPU_R5000 },
15211
  { "rm5230",         0,                 ISA_MIPS4,      CPU_R5000 },
15212
  { "rm5231",         0,                 ISA_MIPS4,      CPU_R5000 },
15213
  { "rm5261",         0,                 ISA_MIPS4,      CPU_R5000 },
15214
  { "rm5721",         0,                 ISA_MIPS4,      CPU_R5000 },
15215
  { "rm7000",         0,                 ISA_MIPS4,      CPU_RM7000 },
15216
  { "rm9000",         0,                 ISA_MIPS4,      CPU_RM9000 },
15217
 
15218
  /* MIPS 32 */
15219
  { "4kc",            0,                 ISA_MIPS32,     CPU_MIPS32 },
15220
  { "4km",            0,                 ISA_MIPS32,     CPU_MIPS32 },
15221
  { "4kp",            0,                 ISA_MIPS32,     CPU_MIPS32 },
15222
  { "4ksc",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32,     CPU_MIPS32 },
15223
 
15224
  /* MIPS 32 Release 2 */
15225
  { "4kec",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15226
  { "4kem",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15227
  { "4kep",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15228
  { "4ksd",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32R2,   CPU_MIPS32R2 },
15229
  { "m4k",            0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15230
  { "m4kp",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15231
  { "24kc",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15232
  { "24kf2_1",        0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15233
  { "24kf",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15234
  { "24kf1_1",        0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15235
  /* Deprecated forms of the above.  */
15236
  { "24kfx",          0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15237
  { "24kx",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15238
  /* 24KE is a 24K with DSP ASE, other ASEs are optional.  */
15239
  { "24kec",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15240
  { "24kef2_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15241
  { "24kef",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15242
  { "24kef1_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15243
  /* Deprecated forms of the above.  */
15244
  { "24kefx",         MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15245
  { "24kex",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15246
  /* 34K is a 24K with DSP and MT ASE, other ASEs are optional.  */
15247
  { "34kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15248
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15249
  { "34kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15250
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15251
  { "34kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15252
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15253
  { "34kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15254
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15255
  /* Deprecated forms of the above.  */
15256
  { "34kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15257
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15258
  { "34kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15259
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15260
  /* 74K with DSP and DSPR2 ASE, other ASEs are optional.  */
15261
  { "74kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15262
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15263
  { "74kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15264
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15265
  { "74kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15266
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15267
  { "74kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15268
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15269
  { "74kf3_2",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15270
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15271
  /* Deprecated forms of the above.  */
15272
  { "74kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15273
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15274
  { "74kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15275
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15276
  /* 1004K cores are multiprocessor versions of the 34K.  */
15277
  { "1004kc",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15278
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15279
  { "1004kf2_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15280
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15281
  { "1004kf",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15282
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15283
  { "1004kf1_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15284
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
15285
 
15286
  /* MIPS 64 */
15287
  { "5kc",            0,                 ISA_MIPS64,     CPU_MIPS64 },
15288
  { "5kf",            0,                 ISA_MIPS64,     CPU_MIPS64 },
15289
  { "20kc",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
15290
  { "25kf",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
15291
 
15292
  /* Broadcom SB-1 CPU core */
15293
  { "sb1",            MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15294
                                                ISA_MIPS64,     CPU_SB1 },
15295
  /* Broadcom SB-1A CPU core */
15296
  { "sb1a",           MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15297
                                                ISA_MIPS64,     CPU_SB1 },
15298
 
15299
  /* MIPS 64 Release 2 */
15300
 
15301
  /* Cavium Networks Octeon CPU core */
15302
  { "octeon",         0,      ISA_MIPS64R2,   CPU_OCTEON },
15303
 
15304
  /* RMI Xlr */
15305
  { "xlr",            0,      ISA_MIPS64,     CPU_XLR },
15306
 
15307
  /* End marker */
15308
  { NULL, 0, 0, 0 }
15309
};
15310
 
15311
 
15312
/* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
15313
   with a final "000" replaced by "k".  Ignore case.
15314
 
15315
   Note: this function is shared between GCC and GAS.  */
15316
 
15317
static bfd_boolean
15318
mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
15319
{
15320
  while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
15321
    given++, canonical++;
15322
 
15323
  return ((*given == 0 && *canonical == 0)
15324
          || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
15325
}
15326
 
15327
 
15328
/* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
15329
   CPU name.  We've traditionally allowed a lot of variation here.
15330
 
15331
   Note: this function is shared between GCC and GAS.  */
15332
 
15333
static bfd_boolean
15334
mips_matching_cpu_name_p (const char *canonical, const char *given)
15335
{
15336
  /* First see if the name matches exactly, or with a final "000"
15337
     turned into "k".  */
15338
  if (mips_strict_matching_cpu_name_p (canonical, given))
15339
    return TRUE;
15340
 
15341
  /* If not, try comparing based on numerical designation alone.
15342
     See if GIVEN is an unadorned number, or 'r' followed by a number.  */
15343
  if (TOLOWER (*given) == 'r')
15344
    given++;
15345
  if (!ISDIGIT (*given))
15346
    return FALSE;
15347
 
15348
  /* Skip over some well-known prefixes in the canonical name,
15349
     hoping to find a number there too.  */
15350
  if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
15351
    canonical += 2;
15352
  else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
15353
    canonical += 2;
15354
  else if (TOLOWER (canonical[0]) == 'r')
15355
    canonical += 1;
15356
 
15357
  return mips_strict_matching_cpu_name_p (canonical, given);
15358
}
15359
 
15360
 
15361
/* Parse an option that takes the name of a processor as its argument.
15362
   OPTION is the name of the option and CPU_STRING is the argument.
15363
   Return the corresponding processor enumeration if the CPU_STRING is
15364
   recognized, otherwise report an error and return null.
15365
 
15366
   A similar function exists in GCC.  */
15367
 
15368
static const struct mips_cpu_info *
15369
mips_parse_cpu (const char *option, const char *cpu_string)
15370
{
15371
  const struct mips_cpu_info *p;
15372
 
15373
  /* 'from-abi' selects the most compatible architecture for the given
15374
     ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
15375
     EABIs, we have to decide whether we're using the 32-bit or 64-bit
15376
     version.  Look first at the -mgp options, if given, otherwise base
15377
     the choice on MIPS_DEFAULT_64BIT.
15378
 
15379
     Treat NO_ABI like the EABIs.  One reason to do this is that the
15380
     plain 'mips' and 'mips64' configs have 'from-abi' as their default
15381
     architecture.  This code picks MIPS I for 'mips' and MIPS III for
15382
     'mips64', just as we did in the days before 'from-abi'.  */
15383
  if (strcasecmp (cpu_string, "from-abi") == 0)
15384
    {
15385
      if (ABI_NEEDS_32BIT_REGS (mips_abi))
15386
        return mips_cpu_info_from_isa (ISA_MIPS1);
15387
 
15388
      if (ABI_NEEDS_64BIT_REGS (mips_abi))
15389
        return mips_cpu_info_from_isa (ISA_MIPS3);
15390
 
15391
      if (file_mips_gp32 >= 0)
15392
        return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
15393
 
15394
      return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
15395
                                     ? ISA_MIPS3
15396
                                     : ISA_MIPS1);
15397
    }
15398
 
15399
  /* 'default' has traditionally been a no-op.  Probably not very useful.  */
15400
  if (strcasecmp (cpu_string, "default") == 0)
15401
    return 0;
15402
 
15403
  for (p = mips_cpu_info_table; p->name != 0; p++)
15404
    if (mips_matching_cpu_name_p (p->name, cpu_string))
15405
      return p;
15406
 
15407
  as_bad (_("Bad value (%s) for %s"), cpu_string, option);
15408
  return 0;
15409
}
15410
 
15411
/* Return the canonical processor information for ISA (a member of the
15412
   ISA_MIPS* enumeration).  */
15413
 
15414
static const struct mips_cpu_info *
15415
mips_cpu_info_from_isa (int isa)
15416
{
15417
  int i;
15418
 
15419
  for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15420
    if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
15421
        && isa == mips_cpu_info_table[i].isa)
15422
      return (&mips_cpu_info_table[i]);
15423
 
15424
  return NULL;
15425
}
15426
 
15427
static const struct mips_cpu_info *
15428
mips_cpu_info_from_arch (int arch)
15429
{
15430
  int i;
15431
 
15432
  for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15433
    if (arch == mips_cpu_info_table[i].cpu)
15434
      return (&mips_cpu_info_table[i]);
15435
 
15436
  return NULL;
15437
}
15438
 
15439
static void
15440
show (FILE *stream, const char *string, int *col_p, int *first_p)
15441
{
15442
  if (*first_p)
15443
    {
15444
      fprintf (stream, "%24s", "");
15445
      *col_p = 24;
15446
    }
15447
  else
15448
    {
15449
      fprintf (stream, ", ");
15450
      *col_p += 2;
15451
    }
15452
 
15453
  if (*col_p + strlen (string) > 72)
15454
    {
15455
      fprintf (stream, "\n%24s", "");
15456
      *col_p = 24;
15457
    }
15458
 
15459
  fprintf (stream, "%s", string);
15460
  *col_p += strlen (string);
15461
 
15462
  *first_p = 0;
15463
}
15464
 
15465
void
15466
md_show_usage (FILE *stream)
15467
{
15468
  int column, first;
15469
  size_t i;
15470
 
15471
  fprintf (stream, _("\
15472
MIPS options:\n\
15473
-EB                     generate big endian output\n\
15474
-EL                     generate little endian output\n\
15475
-g, -g2                 do not remove unneeded NOPs or swap branches\n\
15476
-G NUM                  allow referencing objects up to NUM bytes\n\
15477
                        implicitly with the gp register [default 8]\n"));
15478
  fprintf (stream, _("\
15479
-mips1                  generate MIPS ISA I instructions\n\
15480
-mips2                  generate MIPS ISA II instructions\n\
15481
-mips3                  generate MIPS ISA III instructions\n\
15482
-mips4                  generate MIPS ISA IV instructions\n\
15483
-mips5                  generate MIPS ISA V instructions\n\
15484
-mips32                 generate MIPS32 ISA instructions\n\
15485
-mips32r2               generate MIPS32 release 2 ISA instructions\n\
15486
-mips64                 generate MIPS64 ISA instructions\n\
15487
-mips64r2               generate MIPS64 release 2 ISA instructions\n\
15488
-march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
15489
 
15490
  first = 1;
15491
 
15492
  for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15493
    show (stream, mips_cpu_info_table[i].name, &column, &first);
15494
  show (stream, "from-abi", &column, &first);
15495
  fputc ('\n', stream);
15496
 
15497
  fprintf (stream, _("\
15498
-mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
15499
-no-mCPU                don't generate code specific to CPU.\n\
15500
                        For -mCPU and -no-mCPU, CPU must be one of:\n"));
15501
 
15502
  first = 1;
15503
 
15504
  show (stream, "3900", &column, &first);
15505
  show (stream, "4010", &column, &first);
15506
  show (stream, "4100", &column, &first);
15507
  show (stream, "4650", &column, &first);
15508
  fputc ('\n', stream);
15509
 
15510
  fprintf (stream, _("\
15511
-mips16                 generate mips16 instructions\n\
15512
-no-mips16              do not generate mips16 instructions\n"));
15513
  fprintf (stream, _("\
15514
-msmartmips             generate smartmips instructions\n\
15515
-mno-smartmips          do not generate smartmips instructions\n"));
15516
  fprintf (stream, _("\
15517
-mdsp                   generate DSP instructions\n\
15518
-mno-dsp                do not generate DSP instructions\n"));
15519
  fprintf (stream, _("\
15520
-mdspr2                 generate DSP R2 instructions\n\
15521
-mno-dspr2              do not generate DSP R2 instructions\n"));
15522
  fprintf (stream, _("\
15523
-mmt                    generate MT instructions\n\
15524
-mno-mt                 do not generate MT instructions\n"));
15525
  fprintf (stream, _("\
15526
-mfix-vr4120            work around certain VR4120 errata\n\
15527
-mfix-vr4130            work around VR4130 mflo/mfhi errata\n\
15528
-mfix-24k               insert a nop after ERET and DERET instructions\n\
15529
-mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
15530
-mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
15531
-msym32                 assume all symbols have 32-bit values\n\
15532
-O0                     remove unneeded NOPs, do not swap branches\n\
15533
-O                      remove unneeded NOPs and swap branches\n\
15534
--trap, --no-break      trap exception on div by 0 and mult overflow\n\
15535
--break, --no-trap      break exception on div by 0 and mult overflow\n"));
15536
  fprintf (stream, _("\
15537
-mhard-float            allow floating-point instructions\n\
15538
-msoft-float            do not allow floating-point instructions\n\
15539
-msingle-float          only allow 32-bit floating-point operations\n\
15540
-mdouble-float          allow 32-bit and 64-bit floating-point operations\n\
15541
--[no-]construct-floats [dis]allow floating point values to be constructed\n"
15542
                     ));
15543
#ifdef OBJ_ELF
15544
  fprintf (stream, _("\
15545
-KPIC, -call_shared     generate SVR4 position independent code\n\
15546
-call_nonpic            generate non-PIC code that can operate with DSOs\n\
15547
-mvxworks-pic           generate VxWorks position independent code\n\
15548
-non_shared             do not generate code that can operate with DSOs\n\
15549
-xgot                   assume a 32 bit GOT\n\
15550
-mpdr, -mno-pdr         enable/disable creation of .pdr sections\n\
15551
-mshared, -mno-shared   disable/enable .cpload optimization for\n\
15552
                        position dependent (non shared) code\n\
15553
-mabi=ABI               create ABI conformant object file for:\n"));
15554
 
15555
  first = 1;
15556
 
15557
  show (stream, "32", &column, &first);
15558
  show (stream, "o64", &column, &first);
15559
  show (stream, "n32", &column, &first);
15560
  show (stream, "64", &column, &first);
15561
  show (stream, "eabi", &column, &first);
15562
 
15563
  fputc ('\n', stream);
15564
 
15565
  fprintf (stream, _("\
15566
-32                     create o32 ABI object file (default)\n\
15567
-n32                    create n32 ABI object file\n\
15568
-64                     create 64 ABI object file\n"));
15569
#endif
15570
}
15571
 
15572
enum dwarf2_format
15573
mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
15574
{
15575
  if (HAVE_64BIT_SYMBOLS)
15576
    {
15577
#ifdef TE_IRIX
15578
      return dwarf2_format_64bit_irix;
15579
#else
15580
      return dwarf2_format_64bit;
15581
#endif
15582
    }
15583
  else
15584
    return dwarf2_format_32bit;
15585
}
15586
 
15587
int
15588
mips_dwarf2_addr_size (void)
15589
{
15590
  if (HAVE_64BIT_OBJECTS)
15591
    return 8;
15592
  else
15593
    return 4;
15594
}
15595
 
15596
/* Standard calling conventions leave the CFA at SP on entry.  */
15597
void
15598
mips_cfi_frame_initial_instructions (void)
15599
{
15600
  cfi_add_CFA_def_cfa_register (SP);
15601
}
15602
 
15603
int
15604
tc_mips_regname_to_dw2regnum (char *regname)
15605
{
15606
  unsigned int regnum = -1;
15607
  unsigned int reg;
15608
 
15609
  if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
15610
    regnum = reg;
15611
 
15612
  return regnum;
15613
}

powered by: WebSVN 2.1.0

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