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

Subversion Repositories open8_urisc

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

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

Line No. Rev Author Line
1 16 khays
/* tc-mips.c -- assemble code for a MIPS chip.
2
   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3 163 khays
   2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
4 16 khays
   Free Software Foundation, Inc.
5
   Contributed by the OSF and Ralph Campbell.
6
   Written by Keith Knowles and Ralph Campbell, working independently.
7
   Modified for ECOFF and R4000 support by Ian Lance Taylor of Cygnus
8
   Support.
9
 
10
   This file is part of GAS.
11
 
12
   GAS is free software; you can redistribute it and/or modify
13
   it under the terms of the GNU General Public License as published by
14
   the Free Software Foundation; either version 3, or (at your option)
15
   any later version.
16
 
17
   GAS is distributed in the hope that it will be useful,
18
   but WITHOUT ANY WARRANTY; without even the implied warranty of
19
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20
   GNU General Public License for more details.
21
 
22
   You should have received a copy of the GNU General Public License
23
   along with GAS; see the file COPYING.  If not, write to the Free
24
   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
25
   02110-1301, USA.  */
26
 
27
#include "as.h"
28
#include "config.h"
29
#include "subsegs.h"
30
#include "safe-ctype.h"
31
 
32
#include "opcode/mips.h"
33
#include "itbl-ops.h"
34
#include "dwarf2dbg.h"
35
#include "dw2gencfi.h"
36
 
37
#ifdef DEBUG
38
#define DBG(x) printf x
39
#else
40
#define DBG(x)
41
#endif
42
 
43
#ifdef OBJ_MAYBE_ELF
44
/* Clean up namespace so we can include obj-elf.h too.  */
45
static int mips_output_flavor (void);
46
static int mips_output_flavor (void) { return OUTPUT_FLAVOR; }
47
#undef OBJ_PROCESS_STAB
48
#undef OUTPUT_FLAVOR
49
#undef S_GET_ALIGN
50
#undef S_GET_SIZE
51
#undef S_SET_ALIGN
52
#undef S_SET_SIZE
53
#undef obj_frob_file
54
#undef obj_frob_file_after_relocs
55
#undef obj_frob_symbol
56
#undef obj_pop_insert
57
#undef obj_sec_sym_ok_for_reloc
58
#undef OBJ_COPY_SYMBOL_ATTRIBUTES
59
 
60
#include "obj-elf.h"
61
/* Fix any of them that we actually care about.  */
62
#undef OUTPUT_FLAVOR
63
#define OUTPUT_FLAVOR mips_output_flavor()
64
#endif
65
 
66
#if defined (OBJ_ELF)
67
#include "elf/mips.h"
68
#endif
69
 
70
#ifndef ECOFF_DEBUGGING
71
#define NO_ECOFF_DEBUGGING
72
#define ECOFF_DEBUGGING 0
73
#endif
74
 
75
int mips_flag_mdebug = -1;
76
 
77
/* Control generation of .pdr sections.  Off by default on IRIX: the native
78
   linker doesn't know about and discards them, but relocations against them
79
   remain, leading to rld crashes.  */
80
#ifdef TE_IRIX
81
int mips_flag_pdr = FALSE;
82
#else
83
int mips_flag_pdr = TRUE;
84
#endif
85
 
86
#include "ecoff.h"
87
 
88
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
89
static char *mips_regmask_frag;
90
#endif
91
 
92
#define ZERO 0
93
#define ATREG 1
94 160 khays
#define S0  16
95
#define S7  23
96 16 khays
#define TREG 24
97
#define PIC_CALL_REG 25
98
#define KT0 26
99
#define KT1 27
100
#define GP  28
101
#define SP  29
102
#define FP  30
103
#define RA  31
104
 
105
#define ILLEGAL_REG (32)
106
 
107
#define AT  mips_opts.at
108
 
109
/* Allow override of standard little-endian ECOFF format.  */
110
 
111
#ifndef ECOFF_LITTLE_FORMAT
112
#define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
113
#endif
114
 
115
extern int target_big_endian;
116
 
117
/* The name of the readonly data section.  */
118
#define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
119
                            ? ".rdata" \
120
                            : OUTPUT_FLAVOR == bfd_target_coff_flavour \
121
                            ? ".rdata" \
122
                            : OUTPUT_FLAVOR == bfd_target_elf_flavour \
123
                            ? ".rodata" \
124
                            : (abort (), ""))
125
 
126 160 khays
/* Ways in which an instruction can be "appended" to the output.  */
127
enum append_method {
128
  /* Just add it normally.  */
129
  APPEND_ADD,
130
 
131
  /* Add it normally and then add a nop.  */
132
  APPEND_ADD_WITH_NOP,
133
 
134
  /* Turn an instruction with a delay slot into a "compact" version.  */
135
  APPEND_ADD_COMPACT,
136
 
137
  /* Insert the instruction before the last one.  */
138
  APPEND_SWAP
139
};
140
 
141 16 khays
/* Information about an instruction, including its format, operands
142
   and fixups.  */
143
struct mips_cl_insn
144
{
145
  /* The opcode's entry in mips_opcodes or mips16_opcodes.  */
146
  const struct mips_opcode *insn_mo;
147
 
148
  /* True if this is a mips16 instruction and if we want the extended
149
     form of INSN_MO.  */
150
  bfd_boolean use_extend;
151
 
152
  /* The 16-bit extension instruction to use when USE_EXTEND is true.  */
153
  unsigned short extend;
154
 
155
  /* The 16-bit or 32-bit bitstring of the instruction itself.  This is
156
     a copy of INSN_MO->match with the operands filled in.  */
157
  unsigned long insn_opcode;
158
 
159
  /* The frag that contains the instruction.  */
160
  struct frag *frag;
161
 
162
  /* The offset into FRAG of the first instruction byte.  */
163
  long where;
164
 
165
  /* The relocs associated with the instruction, if any.  */
166
  fixS *fixp[3];
167
 
168
  /* True if this entry cannot be moved from its current position.  */
169
  unsigned int fixed_p : 1;
170
 
171
  /* True if this instruction occurred in a .set noreorder block.  */
172
  unsigned int noreorder_p : 1;
173
 
174
  /* True for mips16 instructions that jump to an absolute address.  */
175
  unsigned int mips16_absolute_jump_p : 1;
176
 
177
  /* True if this instruction is complete.  */
178
  unsigned int complete_p : 1;
179
};
180
 
181
/* The ABI to use.  */
182
enum mips_abi_level
183
{
184
  NO_ABI = 0,
185
  O32_ABI,
186
  O64_ABI,
187
  N32_ABI,
188
  N64_ABI,
189
  EABI_ABI
190
};
191
 
192
/* MIPS ABI we are using for this output file.  */
193
static enum mips_abi_level mips_abi = NO_ABI;
194
 
195
/* Whether or not we have code that can call pic code.  */
196
int mips_abicalls = FALSE;
197
 
198
/* Whether or not we have code which can be put into a shared
199
   library.  */
200
static bfd_boolean mips_in_shared = TRUE;
201
 
202
/* This is the set of options which may be modified by the .set
203
   pseudo-op.  We use a struct so that .set push and .set pop are more
204
   reliable.  */
205
 
206
struct mips_set_options
207
{
208
  /* MIPS ISA (Instruction Set Architecture) level.  This is set to -1
209
     if it has not been initialized.  Changed by `.set mipsN', and the
210
     -mipsN command line option, and the default CPU.  */
211
  int isa;
212
  /* Enabled Application Specific Extensions (ASEs).  These are set to -1
213
     if they have not been initialized.  Changed by `.set <asename>', by
214
     command line options, and based on the default architecture.  */
215
  int ase_mips3d;
216
  int ase_mdmx;
217
  int ase_smartmips;
218
  int ase_dsp;
219
  int ase_dspr2;
220
  int ase_mt;
221 160 khays
  int ase_mcu;
222 16 khays
  /* Whether we are assembling for the mips16 processor.  0 if we are
223
     not, 1 if we are, and -1 if the value has not been initialized.
224
     Changed by `.set mips16' and `.set nomips16', and the -mips16 and
225
     -nomips16 command line options, and the default CPU.  */
226
  int mips16;
227 160 khays
  /* Whether we are assembling for the mipsMIPS ASE.  0 if we are not,
228
     1 if we are, and -1 if the value has not been initialized.  Changed
229
     by `.set micromips' and `.set nomicromips', and the -mmicromips
230
     and -mno-micromips command line options, and the default CPU.  */
231
  int micromips;
232 16 khays
  /* Non-zero if we should not reorder instructions.  Changed by `.set
233
     reorder' and `.set noreorder'.  */
234
  int noreorder;
235
  /* Non-zero if we should not permit the register designated "assembler
236
     temporary" to be used in instructions.  The value is the register
237
     number, normally $at ($1).  Changed by `.set at=REG', `.set noat'
238
     (same as `.set at=$0') and `.set at' (same as `.set at=$1').  */
239
  unsigned int at;
240
  /* Non-zero if we should warn when a macro instruction expands into
241
     more than one machine instruction.  Changed by `.set nomacro' and
242
     `.set macro'.  */
243
  int warn_about_macros;
244
  /* Non-zero if we should not move instructions.  Changed by `.set
245
     move', `.set volatile', `.set nomove', and `.set novolatile'.  */
246
  int nomove;
247
  /* Non-zero if we should not optimize branches by moving the target
248
     of the branch into the delay slot.  Actually, we don't perform
249
     this optimization anyhow.  Changed by `.set bopt' and `.set
250
     nobopt'.  */
251
  int nobopt;
252
  /* Non-zero if we should not autoextend mips16 instructions.
253
     Changed by `.set autoextend' and `.set noautoextend'.  */
254
  int noautoextend;
255
  /* Restrict general purpose registers and floating point registers
256
     to 32 bit.  This is initially determined when -mgp32 or -mfp32
257
     is passed but can changed if the assembler code uses .set mipsN.  */
258
  int gp32;
259
  int fp32;
260
  /* MIPS architecture (CPU) type.  Changed by .set arch=FOO, the -march
261
     command line option, and the default CPU.  */
262
  int arch;
263
  /* True if ".set sym32" is in effect.  */
264
  bfd_boolean sym32;
265
  /* True if floating-point operations are not allowed.  Changed by .set
266
     softfloat or .set hardfloat, by command line options -msoft-float or
267
     -mhard-float.  The default is false.  */
268
  bfd_boolean soft_float;
269
 
270
  /* True if only single-precision floating-point operations are allowed.
271
     Changed by .set singlefloat or .set doublefloat, command-line options
272
     -msingle-float or -mdouble-float.  The default is false.  */
273
  bfd_boolean single_float;
274
};
275
 
276
/* This is the struct we use to hold the current set of options.  Note
277
   that we must set the isa field to ISA_UNKNOWN and the ASE fields to
278
   -1 to indicate that they have not been initialized.  */
279
 
280
/* True if -mgp32 was passed.  */
281
static int file_mips_gp32 = -1;
282
 
283
/* True if -mfp32 was passed.  */
284
static int file_mips_fp32 = -1;
285
 
286
/* 1 if -msoft-float, 0 if -mhard-float.  The default is 0.  */
287
static int file_mips_soft_float = 0;
288
 
289
/* 1 if -msingle-float, 0 if -mdouble-float.  The default is 0.   */
290
static int file_mips_single_float = 0;
291
 
292
static struct mips_set_options mips_opts =
293
{
294
  /* isa */ ISA_UNKNOWN, /* ase_mips3d */ -1, /* ase_mdmx */ -1,
295
  /* ase_smartmips */ 0, /* ase_dsp */ -1, /* ase_dspr2 */ -1, /* ase_mt */ -1,
296 160 khays
  /* ase_mcu */ -1, /* mips16 */ -1, /* micromips */ -1, /* noreorder */ 0,
297
  /* at */ ATREG, /* warn_about_macros */ 0, /* nomove */ 0, /* nobopt */ 0,
298 16 khays
  /* noautoextend */ 0, /* gp32 */ 0, /* fp32 */ 0, /* arch */ CPU_UNKNOWN,
299
  /* sym32 */ FALSE, /* soft_float */ FALSE, /* single_float */ FALSE
300
};
301
 
302
/* These variables are filled in with the masks of registers used.
303
   The object format code reads them and puts them in the appropriate
304
   place.  */
305
unsigned long mips_gprmask;
306
unsigned long mips_cprmask[4];
307
 
308
/* MIPS ISA we are using for this output file.  */
309
static int file_mips_isa = ISA_UNKNOWN;
310
 
311
/* True if any MIPS16 code was produced.  */
312
static int file_ase_mips16;
313
 
314
#define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32               \
315
                              || mips_opts.isa == ISA_MIPS32R2          \
316
                              || mips_opts.isa == ISA_MIPS64            \
317
                              || mips_opts.isa == ISA_MIPS64R2)
318
 
319 160 khays
/* True if any microMIPS code was produced.  */
320
static int file_ase_micromips;
321
 
322 16 khays
/* True if we want to create R_MIPS_JALR for jalr $25.  */
323
#ifdef TE_IRIX
324
#define MIPS_JALR_HINT_P(EXPR) HAVE_NEWABI
325
#else
326
/* As a GNU extension, we use R_MIPS_JALR for o32 too.  However,
327
   because there's no place for any addend, the only acceptable
328
   expression is a bare symbol.  */
329
#define MIPS_JALR_HINT_P(EXPR) \
330
  (!HAVE_IN_PLACE_ADDENDS \
331
   || ((EXPR)->X_op == O_symbol && (EXPR)->X_add_number == 0))
332
#endif
333
 
334
/* True if -mips3d was passed or implied by arguments passed on the
335
   command line (e.g., by -march).  */
336
static int file_ase_mips3d;
337
 
338
/* True if -mdmx was passed or implied by arguments passed on the
339
   command line (e.g., by -march).  */
340
static int file_ase_mdmx;
341
 
342
/* True if -msmartmips was passed or implied by arguments passed on the
343
   command line (e.g., by -march).  */
344
static int file_ase_smartmips;
345
 
346
#define ISA_SUPPORTS_SMARTMIPS (mips_opts.isa == ISA_MIPS32             \
347
                                || mips_opts.isa == ISA_MIPS32R2)
348
 
349
/* True if -mdsp was passed or implied by arguments passed on the
350
   command line (e.g., by -march).  */
351
static int file_ase_dsp;
352
 
353
#define ISA_SUPPORTS_DSP_ASE (mips_opts.isa == ISA_MIPS32R2             \
354
                              || mips_opts.isa == ISA_MIPS64R2)
355
 
356
#define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
357
 
358
/* True if -mdspr2 was passed or implied by arguments passed on the
359
   command line (e.g., by -march).  */
360
static int file_ase_dspr2;
361
 
362
#define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2           \
363
                                || mips_opts.isa == ISA_MIPS64R2)
364
 
365
/* True if -mmt was passed or implied by arguments passed on the
366
   command line (e.g., by -march).  */
367
static int file_ase_mt;
368
 
369
#define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2              \
370
                             || mips_opts.isa == ISA_MIPS64R2)
371
 
372 160 khays
#define ISA_SUPPORTS_MCU_ASE (mips_opts.isa == ISA_MIPS32R2             \
373
                              || mips_opts.isa == ISA_MIPS64R2)
374
 
375 16 khays
/* The argument of the -march= flag.  The architecture we are assembling.  */
376
static int file_mips_arch = CPU_UNKNOWN;
377
static const char *mips_arch_string;
378
 
379
/* The argument of the -mtune= flag.  The architecture for which we
380
   are optimizing.  */
381
static int mips_tune = CPU_UNKNOWN;
382
static const char *mips_tune_string;
383
 
384
/* True when generating 32-bit code for a 64-bit processor.  */
385
static int mips_32bitmode = 0;
386
 
387
/* True if the given ABI requires 32-bit registers.  */
388
#define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
389
 
390
/* Likewise 64-bit registers.  */
391
#define ABI_NEEDS_64BIT_REGS(ABI)       \
392
  ((ABI) == N32_ABI                     \
393
   || (ABI) == N64_ABI                  \
394
   || (ABI) == O64_ABI)
395
 
396
/*  Return true if ISA supports 64 bit wide gp registers.  */
397
#define ISA_HAS_64BIT_REGS(ISA)         \
398
  ((ISA) == ISA_MIPS3                   \
399
   || (ISA) == ISA_MIPS4                \
400
   || (ISA) == ISA_MIPS5                \
401
   || (ISA) == ISA_MIPS64               \
402
   || (ISA) == ISA_MIPS64R2)
403
 
404
/*  Return true if ISA supports 64 bit wide float registers.  */
405
#define ISA_HAS_64BIT_FPRS(ISA)         \
406
  ((ISA) == ISA_MIPS3                   \
407
   || (ISA) == ISA_MIPS4                \
408
   || (ISA) == ISA_MIPS5                \
409
   || (ISA) == ISA_MIPS32R2             \
410
   || (ISA) == ISA_MIPS64               \
411
   || (ISA) == ISA_MIPS64R2)
412
 
413
/* Return true if ISA supports 64-bit right rotate (dror et al.)
414
   instructions.  */
415
#define ISA_HAS_DROR(ISA)               \
416 160 khays
  ((ISA) == ISA_MIPS64R2                \
417
   || (mips_opts.micromips              \
418
       && ISA_HAS_64BIT_REGS (ISA))     \
419
   )
420 16 khays
 
421
/* Return true if ISA supports 32-bit right rotate (ror et al.)
422
   instructions.  */
423
#define ISA_HAS_ROR(ISA)                \
424
  ((ISA) == ISA_MIPS32R2                \
425
   || (ISA) == ISA_MIPS64R2             \
426 160 khays
   || mips_opts.ase_smartmips           \
427
   || mips_opts.micromips               \
428
   )
429 16 khays
 
430
/* Return true if ISA supports single-precision floats in odd registers.  */
431
#define ISA_HAS_ODD_SINGLE_FPR(ISA)     \
432
  ((ISA) == ISA_MIPS32                  \
433
   || (ISA) == ISA_MIPS32R2             \
434
   || (ISA) == ISA_MIPS64               \
435
   || (ISA) == ISA_MIPS64R2)
436
 
437
/* Return true if ISA supports move to/from high part of a 64-bit
438
   floating-point register. */
439
#define ISA_HAS_MXHC1(ISA)              \
440
  ((ISA) == ISA_MIPS32R2                \
441
   || (ISA) == ISA_MIPS64R2)
442
 
443
#define HAVE_32BIT_GPRS                            \
444
    (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
445
 
446
#define HAVE_32BIT_FPRS                            \
447
    (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
448
 
449
#define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
450
#define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
451
 
452
#define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
453
 
454
#define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
455
 
456
/* True if relocations are stored in-place.  */
457
#define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
458
 
459
/* The ABI-derived address size.  */
460
#define HAVE_64BIT_ADDRESSES \
461
  (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
462
#define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
463
 
464
/* The size of symbolic constants (i.e., expressions of the form
465
   "SYMBOL" or "SYMBOL + OFFSET").  */
466
#define HAVE_32BIT_SYMBOLS \
467
  (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
468
#define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
469
 
470
/* Addresses are loaded in different ways, depending on the address size
471
   in use.  The n32 ABI Documentation also mandates the use of additions
472
   with overflow checking, but existing implementations don't follow it.  */
473
#define ADDRESS_ADD_INSN                                                \
474
   (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
475
 
476
#define ADDRESS_ADDI_INSN                                               \
477
   (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
478
 
479
#define ADDRESS_LOAD_INSN                                               \
480
   (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
481
 
482
#define ADDRESS_STORE_INSN                                              \
483
   (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
484
 
485
/* Return true if the given CPU supports the MIPS16 ASE.  */
486
#define CPU_HAS_MIPS16(cpu)                                             \
487
   (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0           \
488
    || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
489
 
490 160 khays
/* Return true if the given CPU supports the microMIPS ASE.  */
491
#define CPU_HAS_MICROMIPS(cpu)  0
492
 
493 16 khays
/* True if CPU has a dror instruction.  */
494
#define CPU_HAS_DROR(CPU)       ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
495
 
496
/* True if CPU has a ror instruction.  */
497
#define CPU_HAS_ROR(CPU)        CPU_HAS_DROR (CPU)
498
 
499
/* True if CPU has seq/sne and seqi/snei instructions.  */
500
#define CPU_HAS_SEQ(CPU)        ((CPU) == CPU_OCTEON)
501
 
502
/* True if CPU does not implement the all the coprocessor insns.  For these
503
   CPUs only those COP insns are accepted that are explicitly marked to be
504
   available on the CPU.  ISA membership for COP insns is ignored.  */
505
#define NO_ISA_COP(CPU)         ((CPU) == CPU_OCTEON)
506
 
507
/* True if mflo and mfhi can be immediately followed by instructions
508
   which write to the HI and LO registers.
509
 
510
   According to MIPS specifications, MIPS ISAs I, II, and III need
511
   (at least) two instructions between the reads of HI/LO and
512
   instructions which write them, and later ISAs do not.  Contradicting
513
   the MIPS specifications, some MIPS IV processor user manuals (e.g.
514
   the UM for the NEC Vr5000) document needing the instructions between
515
   HI/LO reads and writes, as well.  Therefore, we declare only MIPS32,
516
   MIPS64 and later ISAs to have the interlocks, plus any specific
517
   earlier-ISA CPUs for which CPU documentation declares that the
518
   instructions are really interlocked.  */
519
#define hilo_interlocks \
520
  (mips_opts.isa == ISA_MIPS32                        \
521
   || mips_opts.isa == ISA_MIPS32R2                   \
522
   || mips_opts.isa == ISA_MIPS64                     \
523
   || mips_opts.isa == ISA_MIPS64R2                   \
524
   || mips_opts.arch == CPU_R4010                     \
525
   || mips_opts.arch == CPU_R10000                    \
526
   || mips_opts.arch == CPU_R12000                    \
527
   || mips_opts.arch == CPU_R14000                    \
528
   || mips_opts.arch == CPU_R16000                    \
529
   || mips_opts.arch == CPU_RM7000                    \
530
   || mips_opts.arch == CPU_VR5500                    \
531 160 khays
   || mips_opts.micromips                             \
532 16 khays
   )
533
 
534
/* Whether the processor uses hardware interlocks to protect reads
535
   from the GPRs after they are loaded from memory, and thus does not
536
   require nops to be inserted.  This applies to instructions marked
537
   INSN_LOAD_MEMORY_DELAY.  These nops are only required at MIPS ISA
538 160 khays
   level I and microMIPS mode instructions are always interlocked.  */
539
#define gpr_interlocks                                \
540
  (mips_opts.isa != ISA_MIPS1                         \
541
   || mips_opts.arch == CPU_R3900                     \
542
   || mips_opts.micromips                             \
543
   )
544 16 khays
 
545
/* Whether the processor uses hardware interlocks to avoid delays
546
   required by coprocessor instructions, and thus does not require
547
   nops to be inserted.  This applies to instructions marked
548
   INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
549
   between instructions marked INSN_WRITE_COND_CODE and ones marked
550
   INSN_READ_COND_CODE.  These nops are only required at MIPS ISA
551 160 khays
   levels I, II, and III and microMIPS mode instructions are always
552
   interlocked.  */
553 16 khays
/* Itbl support may require additional care here.  */
554
#define cop_interlocks                                \
555
  ((mips_opts.isa != ISA_MIPS1                        \
556
    && mips_opts.isa != ISA_MIPS2                     \
557
    && mips_opts.isa != ISA_MIPS3)                    \
558
   || mips_opts.arch == CPU_R4300                     \
559 160 khays
   || mips_opts.micromips                             \
560 16 khays
   )
561
 
562
/* Whether the processor uses hardware interlocks to protect reads
563
   from coprocessor registers after they are loaded from memory, and
564
   thus does not require nops to be inserted.  This applies to
565
   instructions marked INSN_COPROC_MEMORY_DELAY.  These nops are only
566 160 khays
   requires at MIPS ISA level I and microMIPS mode instructions are
567
   always interlocked.  */
568
#define cop_mem_interlocks                            \
569
  (mips_opts.isa != ISA_MIPS1                         \
570
   || mips_opts.micromips                             \
571
   )
572 16 khays
 
573
/* Is this a mfhi or mflo instruction?  */
574
#define MF_HILO_INSN(PINFO) \
575
  ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
576
 
577
/* Returns true for a (non floating-point) coprocessor instruction.  Reading
578
   or writing the condition code is only possible on the coprocessors and
579
   these insns are not marked with INSN_COP.  Thus for these insns use the
580
   condition-code flags.  */
581
#define COP_INSN(PINFO)                                                 \
582
  (PINFO != INSN_MACRO                                                  \
583
   && ((PINFO) & (FP_S | FP_D)) == 0                                     \
584
   && ((PINFO) & (INSN_COP | INSN_READ_COND_CODE | INSN_WRITE_COND_CODE)))
585
 
586 160 khays
/* Whether code compression (either of the MIPS16 or the microMIPS ASEs)
587
   has been selected.  This implies, in particular, that addresses of text
588
   labels have their LSB set.  */
589
#define HAVE_CODE_COMPRESSION                                           \
590
  ((mips_opts.mips16 | mips_opts.micromips) != 0)
591
 
592 16 khays
/* MIPS PIC level.  */
593
 
594
enum mips_pic_level mips_pic;
595
 
596
/* 1 if we should generate 32 bit offsets from the $gp register in
597
   SVR4_PIC mode.  Currently has no meaning in other modes.  */
598
static int mips_big_got = 0;
599
 
600
/* 1 if trap instructions should used for overflow rather than break
601
   instructions.  */
602
static int mips_trap = 0;
603
 
604
/* 1 if double width floating point constants should not be constructed
605
   by assembling two single width halves into two single width floating
606
   point registers which just happen to alias the double width destination
607
   register.  On some architectures this aliasing can be disabled by a bit
608
   in the status register, and the setting of this bit cannot be determined
609
   automatically at assemble time.  */
610
static int mips_disable_float_construction;
611
 
612
/* Non-zero if any .set noreorder directives were used.  */
613
 
614
static int mips_any_noreorder;
615
 
616
/* Non-zero if nops should be inserted when the register referenced in
617
   an mfhi/mflo instruction is read in the next two instructions.  */
618
static int mips_7000_hilo_fix;
619
 
620
/* The size of objects in the small data section.  */
621
static unsigned int g_switch_value = 8;
622
/* Whether the -G option was used.  */
623
static int g_switch_seen = 0;
624
 
625
#define N_RMASK 0xc4
626
#define N_VFP   0xd4
627
 
628
/* If we can determine in advance that GP optimization won't be
629
   possible, we can skip the relaxation stuff that tries to produce
630
   GP-relative references.  This makes delay slot optimization work
631
   better.
632
 
633
   This function can only provide a guess, but it seems to work for
634
   gcc output.  It needs to guess right for gcc, otherwise gcc
635
   will put what it thinks is a GP-relative instruction in a branch
636
   delay slot.
637
 
638
   I don't know if a fix is needed for the SVR4_PIC mode.  I've only
639
   fixed it for the non-PIC mode.  KR 95/04/07  */
640
static int nopic_need_relax (symbolS *, int);
641
 
642
/* handle of the OPCODE hash table */
643
static struct hash_control *op_hash = NULL;
644
 
645
/* The opcode hash table we use for the mips16.  */
646
static struct hash_control *mips16_op_hash = NULL;
647
 
648 160 khays
/* The opcode hash table we use for the microMIPS ASE.  */
649
static struct hash_control *micromips_op_hash = NULL;
650
 
651 16 khays
/* This array holds the chars that always start a comment.  If the
652
    pre-processor is disabled, these aren't very useful */
653
const char comment_chars[] = "#";
654
 
655
/* This array holds the chars that only start a comment at the beginning of
656
   a line.  If the line seems to have the form '# 123 filename'
657
   .line and .file directives will appear in the pre-processed output */
658
/* Note that input_file.c hand checks for '#' at the beginning of the
659
   first line of the input file.  This is because the compiler outputs
660
   #NO_APP at the beginning of its output.  */
661
/* Also note that C style comments are always supported.  */
662
const char line_comment_chars[] = "#";
663
 
664
/* This array holds machine specific line separator characters.  */
665
const char line_separator_chars[] = ";";
666
 
667
/* Chars that can be used to separate mant from exp in floating point nums */
668
const char EXP_CHARS[] = "eE";
669
 
670
/* Chars that mean this number is a floating point constant */
671
/* As in 0f12.456 */
672
/* or    0d1.2345e12 */
673
const char FLT_CHARS[] = "rRsSfFdDxXpP";
674
 
675
/* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
676
   changed in read.c .  Ideally it shouldn't have to know about it at all,
677
   but nothing is ideal around here.
678
 */
679
 
680
static char *insn_error;
681
 
682
static int auto_align = 1;
683
 
684
/* When outputting SVR4 PIC code, the assembler needs to know the
685
   offset in the stack frame from which to restore the $gp register.
686
   This is set by the .cprestore pseudo-op, and saved in this
687
   variable.  */
688
static offsetT mips_cprestore_offset = -1;
689
 
690
/* Similar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
691
   more optimizations, it can use a register value instead of a memory-saved
692
   offset and even an other register than $gp as global pointer.  */
693
static offsetT mips_cpreturn_offset = -1;
694
static int mips_cpreturn_register = -1;
695
static int mips_gp_register = GP;
696
static int mips_gprel_offset = 0;
697
 
698
/* Whether mips_cprestore_offset has been set in the current function
699
   (or whether it has already been warned about, if not).  */
700
static int mips_cprestore_valid = 0;
701
 
702
/* This is the register which holds the stack frame, as set by the
703
   .frame pseudo-op.  This is needed to implement .cprestore.  */
704
static int mips_frame_reg = SP;
705
 
706
/* Whether mips_frame_reg has been set in the current function
707
   (or whether it has already been warned about, if not).  */
708
static int mips_frame_reg_valid = 0;
709
 
710
/* To output NOP instructions correctly, we need to keep information
711
   about the previous two instructions.  */
712
 
713
/* Whether we are optimizing.  The default value of 2 means to remove
714
   unneeded NOPs and swap branch instructions when possible.  A value
715
   of 1 means to not swap branches.  A value of 0 means to always
716
   insert NOPs.  */
717
static int mips_optimize = 2;
718
 
719
/* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
720
   equivalent to seeing no -g option at all.  */
721
static int mips_debug = 0;
722
 
723
/* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata.  */
724
#define MAX_VR4130_NOPS 4
725
 
726
/* The maximum number of NOPs needed to fill delay slots.  */
727
#define MAX_DELAY_NOPS 2
728
 
729
/* The maximum number of NOPs needed for any purpose.  */
730
#define MAX_NOPS 4
731
 
732
/* A list of previous instructions, with index 0 being the most recent.
733
   We need to look back MAX_NOPS instructions when filling delay slots
734
   or working around processor errata.  We need to look back one
735
   instruction further if we're thinking about using history[0] to
736
   fill a branch delay slot.  */
737
static struct mips_cl_insn history[1 + MAX_NOPS];
738
 
739
/* Nop instructions used by emit_nop.  */
740 160 khays
static struct mips_cl_insn nop_insn;
741
static struct mips_cl_insn mips16_nop_insn;
742
static struct mips_cl_insn micromips_nop16_insn;
743
static struct mips_cl_insn micromips_nop32_insn;
744 16 khays
 
745
/* The appropriate nop for the current mode.  */
746 160 khays
#define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn \
747
                  : (mips_opts.micromips ? &micromips_nop16_insn : &nop_insn))
748 16 khays
 
749 160 khays
/* The size of NOP_INSN in bytes.  */
750
#define NOP_INSN_SIZE (HAVE_CODE_COMPRESSION ? 2 : 4)
751
 
752 16 khays
/* If this is set, it points to a frag holding nop instructions which
753
   were inserted before the start of a noreorder section.  If those
754
   nops turn out to be unnecessary, the size of the frag can be
755
   decreased.  */
756
static fragS *prev_nop_frag;
757
 
758
/* The number of nop instructions we created in prev_nop_frag.  */
759
static int prev_nop_frag_holds;
760
 
761
/* The number of nop instructions that we know we need in
762
   prev_nop_frag.  */
763
static int prev_nop_frag_required;
764
 
765
/* The number of instructions we've seen since prev_nop_frag.  */
766
static int prev_nop_frag_since;
767
 
768
/* For ECOFF and ELF, relocations against symbols are done in two
769
   parts, with a HI relocation and a LO relocation.  Each relocation
770
   has only 16 bits of space to store an addend.  This means that in
771
   order for the linker to handle carries correctly, it must be able
772
   to locate both the HI and the LO relocation.  This means that the
773
   relocations must appear in order in the relocation table.
774
 
775
   In order to implement this, we keep track of each unmatched HI
776
   relocation.  We then sort them so that they immediately precede the
777
   corresponding LO relocation.  */
778
 
779
struct mips_hi_fixup
780
{
781
  /* Next HI fixup.  */
782
  struct mips_hi_fixup *next;
783
  /* This fixup.  */
784
  fixS *fixp;
785
  /* The section this fixup is in.  */
786
  segT seg;
787
};
788
 
789
/* The list of unmatched HI relocs.  */
790
 
791
static struct mips_hi_fixup *mips_hi_fixup_list;
792
 
793
/* The frag containing the last explicit relocation operator.
794
   Null if explicit relocations have not been used.  */
795
 
796
static fragS *prev_reloc_op_frag;
797
 
798
/* Map normal MIPS register numbers to mips16 register numbers.  */
799
 
800
#define X ILLEGAL_REG
801
static const int mips32_to_16_reg_map[] =
802
{
803
  X, X, 2, 3, 4, 5, 6, 7,
804
  X, X, X, X, X, X, X, X,
805
  0, 1, X, X, X, X, X, X,
806
  X, X, X, X, X, X, X, X
807
};
808
#undef X
809
 
810
/* Map mips16 register numbers to normal MIPS register numbers.  */
811
 
812
static const unsigned int mips16_to_32_reg_map[] =
813
{
814
  16, 17, 2, 3, 4, 5, 6, 7
815
};
816
 
817 160 khays
/* Map normal MIPS register numbers to microMIPS register numbers.  */
818
 
819
#define mips32_to_micromips_reg_b_map   mips32_to_16_reg_map
820
#define mips32_to_micromips_reg_c_map   mips32_to_16_reg_map
821
#define mips32_to_micromips_reg_d_map   mips32_to_16_reg_map
822
#define mips32_to_micromips_reg_e_map   mips32_to_16_reg_map
823
#define mips32_to_micromips_reg_f_map   mips32_to_16_reg_map
824
#define mips32_to_micromips_reg_g_map   mips32_to_16_reg_map
825
#define mips32_to_micromips_reg_l_map   mips32_to_16_reg_map
826
 
827
#define X ILLEGAL_REG
828
/* reg type h: 4, 5, 6.  */
829
static const int mips32_to_micromips_reg_h_map[] =
830
{
831
  X, X, X, X, 4, 5, 6, X,
832
  X, X, X, X, X, X, X, X,
833
  X, X, X, X, X, X, X, X,
834
  X, X, X, X, X, X, X, X
835
};
836
 
837
/* reg type m: 0, 17, 2, 3, 16, 18, 19, 20.  */
838
static const int mips32_to_micromips_reg_m_map[] =
839
{
840
  0, X, 2, 3, X, X, X, X,
841
  X, X, X, X, X, X, X, X,
842
  4, 1, 5, 6, 7, X, X, X,
843
  X, X, X, X, X, X, X, X
844
};
845
 
846
/* reg type q: 0, 2-7. 17.  */
847
static const int mips32_to_micromips_reg_q_map[] =
848
{
849
  0, X, 2, 3, 4, 5, 6, 7,
850
  X, X, X, X, X, X, X, X,
851
  X, 1, X, X, X, X, X, X,
852
  X, X, X, X, X, X, X, X
853
};
854
 
855
#define mips32_to_micromips_reg_n_map  mips32_to_micromips_reg_m_map
856
#undef X
857
 
858
/* Map microMIPS register numbers to normal MIPS register numbers.  */
859
 
860
#define micromips_to_32_reg_b_map       mips16_to_32_reg_map
861
#define micromips_to_32_reg_c_map       mips16_to_32_reg_map
862
#define micromips_to_32_reg_d_map       mips16_to_32_reg_map
863
#define micromips_to_32_reg_e_map       mips16_to_32_reg_map
864
#define micromips_to_32_reg_f_map       mips16_to_32_reg_map
865
#define micromips_to_32_reg_g_map       mips16_to_32_reg_map
866
 
867
/* The microMIPS registers with type h.  */
868
static const unsigned int micromips_to_32_reg_h_map[] =
869
{
870
  5, 5, 6, 4, 4, 4, 4, 4
871
};
872
 
873
/* The microMIPS registers with type i.  */
874
static const unsigned int micromips_to_32_reg_i_map[] =
875
{
876
  6, 7, 7, 21, 22, 5, 6, 7
877
};
878
 
879
#define micromips_to_32_reg_l_map       mips16_to_32_reg_map
880
 
881
/* The microMIPS registers with type m.  */
882
static const unsigned int micromips_to_32_reg_m_map[] =
883
{
884
  0, 17, 2, 3, 16, 18, 19, 20
885
};
886
 
887
#define micromips_to_32_reg_n_map      micromips_to_32_reg_m_map
888
 
889
/* The microMIPS registers with type q.  */
890
static const unsigned int micromips_to_32_reg_q_map[] =
891
{
892
  0, 17, 2, 3, 4, 5, 6, 7
893
};
894
 
895
/* microMIPS imm type B.  */
896
static const int micromips_imm_b_map[] =
897
{
898
  1, 4, 8, 12, 16, 20, 24, -1
899
};
900
 
901
/* microMIPS imm type C.  */
902
static const int micromips_imm_c_map[] =
903
{
904
  128, 1, 2, 3, 4, 7, 8, 15, 16, 31, 32, 63, 64, 255, 32768, 65535
905
};
906
 
907 16 khays
/* Classifies the kind of instructions we're interested in when
908
   implementing -mfix-vr4120.  */
909
enum fix_vr4120_class
910
{
911
  FIX_VR4120_MACC,
912
  FIX_VR4120_DMACC,
913
  FIX_VR4120_MULT,
914
  FIX_VR4120_DMULT,
915
  FIX_VR4120_DIV,
916
  FIX_VR4120_MTHILO,
917
  NUM_FIX_VR4120_CLASSES
918
};
919
 
920
/* ...likewise -mfix-loongson2f-jump.  */
921
static bfd_boolean mips_fix_loongson2f_jump;
922
 
923
/* ...likewise -mfix-loongson2f-nop.  */
924
static bfd_boolean mips_fix_loongson2f_nop;
925
 
926
/* True if -mfix-loongson2f-nop or -mfix-loongson2f-jump passed.  */
927
static bfd_boolean mips_fix_loongson2f;
928
 
929
/* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
930
   there must be at least one other instruction between an instruction
931
   of type X and an instruction of type Y.  */
932
static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
933
 
934
/* True if -mfix-vr4120 is in force.  */
935
static int mips_fix_vr4120;
936
 
937
/* ...likewise -mfix-vr4130.  */
938
static int mips_fix_vr4130;
939
 
940
/* ...likewise -mfix-24k.  */
941
static int mips_fix_24k;
942
 
943
/* ...likewise -mfix-cn63xxp1 */
944
static bfd_boolean mips_fix_cn63xxp1;
945
 
946
/* We don't relax branches by default, since this causes us to expand
947
   `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
948
   fail to compute the offset before expanding the macro to the most
949
   efficient expansion.  */
950
 
951
static int mips_relax_branch;
952
 
953
/* The expansion of many macros depends on the type of symbol that
954
   they refer to.  For example, when generating position-dependent code,
955
   a macro that refers to a symbol may have two different expansions,
956
   one which uses GP-relative addresses and one which uses absolute
957
   addresses.  When generating SVR4-style PIC, a macro may have
958
   different expansions for local and global symbols.
959
 
960
   We handle these situations by generating both sequences and putting
961
   them in variant frags.  In position-dependent code, the first sequence
962
   will be the GP-relative one and the second sequence will be the
963
   absolute one.  In SVR4 PIC, the first sequence will be for global
964
   symbols and the second will be for local symbols.
965
 
966
   The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
967
   SECOND are the lengths of the two sequences in bytes.  These fields
968
   can be extracted using RELAX_FIRST() and RELAX_SECOND().  In addition,
969
   the subtype has the following flags:
970
 
971
   RELAX_USE_SECOND
972
        Set if it has been decided that we should use the second
973
        sequence instead of the first.
974
 
975
   RELAX_SECOND_LONGER
976
        Set in the first variant frag if the macro's second implementation
977
        is longer than its first.  This refers to the macro as a whole,
978
        not an individual relaxation.
979
 
980
   RELAX_NOMACRO
981
        Set in the first variant frag if the macro appeared in a .set nomacro
982
        block and if one alternative requires a warning but the other does not.
983
 
984
   RELAX_DELAY_SLOT
985
        Like RELAX_NOMACRO, but indicates that the macro appears in a branch
986
        delay slot.
987
 
988 160 khays
   RELAX_DELAY_SLOT_16BIT
989
        Like RELAX_DELAY_SLOT, but indicates that the delay slot requires a
990
        16-bit instruction.
991
 
992
   RELAX_DELAY_SLOT_SIZE_FIRST
993
        Like RELAX_DELAY_SLOT, but indicates that the first implementation of
994
        the macro is of the wrong size for the branch delay slot.
995
 
996
   RELAX_DELAY_SLOT_SIZE_SECOND
997
        Like RELAX_DELAY_SLOT, but indicates that the second implementation of
998
        the macro is of the wrong size for the branch delay slot.
999
 
1000 16 khays
   The frag's "opcode" points to the first fixup for relaxable code.
1001
 
1002
   Relaxable macros are generated using a sequence such as:
1003
 
1004
      relax_start (SYMBOL);
1005
      ... generate first expansion ...
1006
      relax_switch ();
1007
      ... generate second expansion ...
1008
      relax_end ();
1009
 
1010
   The code and fixups for the unwanted alternative are discarded
1011
   by md_convert_frag.  */
1012
#define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
1013
 
1014
#define RELAX_FIRST(X) (((X) >> 8) & 0xff)
1015
#define RELAX_SECOND(X) ((X) & 0xff)
1016
#define RELAX_USE_SECOND 0x10000
1017
#define RELAX_SECOND_LONGER 0x20000
1018
#define RELAX_NOMACRO 0x40000
1019
#define RELAX_DELAY_SLOT 0x80000
1020 160 khays
#define RELAX_DELAY_SLOT_16BIT 0x100000
1021
#define RELAX_DELAY_SLOT_SIZE_FIRST 0x200000
1022
#define RELAX_DELAY_SLOT_SIZE_SECOND 0x400000
1023 16 khays
 
1024
/* Branch without likely bit.  If label is out of range, we turn:
1025
 
1026
        beq reg1, reg2, label
1027
        delay slot
1028
 
1029
   into
1030
 
1031
        bne reg1, reg2, 0f
1032
        nop
1033
        j label
1034
     0: delay slot
1035
 
1036
   with the following opcode replacements:
1037
 
1038
        beq <-> bne
1039
        blez <-> bgtz
1040
        bltz <-> bgez
1041
        bc1f <-> bc1t
1042
 
1043
        bltzal <-> bgezal  (with jal label instead of j label)
1044
 
1045
   Even though keeping the delay slot instruction in the delay slot of
1046
   the branch would be more efficient, it would be very tricky to do
1047
   correctly, because we'd have to introduce a variable frag *after*
1048
   the delay slot instruction, and expand that instead.  Let's do it
1049
   the easy way for now, even if the branch-not-taken case now costs
1050
   one additional instruction.  Out-of-range branches are not supposed
1051
   to be common, anyway.
1052
 
1053
   Branch likely.  If label is out of range, we turn:
1054
 
1055
        beql reg1, reg2, label
1056
        delay slot (annulled if branch not taken)
1057
 
1058
   into
1059
 
1060
        beql reg1, reg2, 1f
1061
        nop
1062
        beql $0, $0, 2f
1063
        nop
1064
     1: j[al] label
1065
        delay slot (executed only if branch taken)
1066
     2:
1067
 
1068
   It would be possible to generate a shorter sequence by losing the
1069
   likely bit, generating something like:
1070
 
1071
        bne reg1, reg2, 0f
1072
        nop
1073
        j[al] label
1074
        delay slot (executed only if branch taken)
1075
     0:
1076
 
1077
        beql -> bne
1078
        bnel -> beq
1079
        blezl -> bgtz
1080
        bgtzl -> blez
1081
        bltzl -> bgez
1082
        bgezl -> bltz
1083
        bc1fl -> bc1t
1084
        bc1tl -> bc1f
1085
 
1086
        bltzall -> bgezal  (with jal label instead of j label)
1087
        bgezall -> bltzal  (ditto)
1088
 
1089
 
1090
   but it's not clear that it would actually improve performance.  */
1091
#define RELAX_BRANCH_ENCODE(at, uncond, likely, link, toofar)   \
1092
  ((relax_substateT)                                            \
1093
   (0xc0000000                                                  \
1094
    | ((at) & 0x1f)                                             \
1095
    | ((toofar) ? 0x20 : 0)                                      \
1096
    | ((link) ? 0x40 : 0)                                        \
1097
    | ((likely) ? 0x80 : 0)                                      \
1098
    | ((uncond) ? 0x100 : 0)))
1099
#define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
1100
#define RELAX_BRANCH_UNCOND(i) (((i) & 0x100) != 0)
1101
#define RELAX_BRANCH_LIKELY(i) (((i) & 0x80) != 0)
1102
#define RELAX_BRANCH_LINK(i) (((i) & 0x40) != 0)
1103
#define RELAX_BRANCH_TOOFAR(i) (((i) & 0x20) != 0)
1104
#define RELAX_BRANCH_AT(i) ((i) & 0x1f)
1105
 
1106
/* For mips16 code, we use an entirely different form of relaxation.
1107
   mips16 supports two versions of most instructions which take
1108
   immediate values: a small one which takes some small value, and a
1109
   larger one which takes a 16 bit value.  Since branches also follow
1110
   this pattern, relaxing these values is required.
1111
 
1112
   We can assemble both mips16 and normal MIPS code in a single
1113
   object.  Therefore, we need to support this type of relaxation at
1114
   the same time that we support the relaxation described above.  We
1115
   use the high bit of the subtype field to distinguish these cases.
1116
 
1117
   The information we store for this type of relaxation is the
1118
   argument code found in the opcode file for this relocation, whether
1119
   the user explicitly requested a small or extended form, and whether
1120
   the relocation is in a jump or jal delay slot.  That tells us the
1121
   size of the value, and how it should be stored.  We also store
1122
   whether the fragment is considered to be extended or not.  We also
1123
   store whether this is known to be a branch to a different section,
1124
   whether we have tried to relax this frag yet, and whether we have
1125
   ever extended a PC relative fragment because of a shift count.  */
1126
#define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
1127
  (0x80000000                                                   \
1128
   | ((type) & 0xff)                                            \
1129
   | ((small) ? 0x100 : 0)                                       \
1130
   | ((ext) ? 0x200 : 0)                                 \
1131
   | ((dslot) ? 0x400 : 0)                                       \
1132
   | ((jal_dslot) ? 0x800 : 0))
1133
#define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
1134
#define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
1135
#define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
1136
#define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
1137
#define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
1138
#define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
1139
#define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
1140
#define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
1141
#define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
1142
#define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
1143
#define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
1144
#define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
1145
 
1146 160 khays
/* For microMIPS code, we use relaxation similar to one we use for
1147
   MIPS16 code.  Some instructions that take immediate values support
1148
   two encodings: a small one which takes some small value, and a
1149
   larger one which takes a 16 bit value.  As some branches also follow
1150
   this pattern, relaxing these values is required.
1151
 
1152
   We can assemble both microMIPS and normal MIPS code in a single
1153
   object.  Therefore, we need to support this type of relaxation at
1154
   the same time that we support the relaxation described above.  We
1155
   use one of the high bits of the subtype field to distinguish these
1156
   cases.
1157
 
1158
   The information we store for this type of relaxation is the argument
1159
   code found in the opcode file for this relocation, the register
1160
   selected as the assembler temporary, whether the branch is
1161
   unconditional, whether it is compact, whether it stores the link
1162
   address implicitly in $ra, whether relaxation of out-of-range 32-bit
1163
   branches to a sequence of instructions is enabled, and whether the
1164
   displacement of a branch is too large to fit as an immediate argument
1165
   of a 16-bit and a 32-bit branch, respectively.  */
1166
#define RELAX_MICROMIPS_ENCODE(type, at, uncond, compact, link, \
1167
                               relax32, toofar16, toofar32)     \
1168
  (0x40000000                                                   \
1169
   | ((type) & 0xff)                                            \
1170
   | (((at) & 0x1f) << 8)                                       \
1171
   | ((uncond) ? 0x2000 : 0)                                     \
1172
   | ((compact) ? 0x4000 : 0)                                    \
1173
   | ((link) ? 0x8000 : 0)                                       \
1174
   | ((relax32) ? 0x10000 : 0)                                   \
1175
   | ((toofar16) ? 0x20000 : 0)                                  \
1176
   | ((toofar32) ? 0x40000 : 0))
1177
#define RELAX_MICROMIPS_P(i) (((i) & 0xc0000000) == 0x40000000)
1178
#define RELAX_MICROMIPS_TYPE(i) ((i) & 0xff)
1179
#define RELAX_MICROMIPS_AT(i) (((i) >> 8) & 0x1f)
1180
#define RELAX_MICROMIPS_UNCOND(i) (((i) & 0x2000) != 0)
1181
#define RELAX_MICROMIPS_COMPACT(i) (((i) & 0x4000) != 0)
1182
#define RELAX_MICROMIPS_LINK(i) (((i) & 0x8000) != 0)
1183
#define RELAX_MICROMIPS_RELAX32(i) (((i) & 0x10000) != 0)
1184
 
1185
#define RELAX_MICROMIPS_TOOFAR16(i) (((i) & 0x20000) != 0)
1186
#define RELAX_MICROMIPS_MARK_TOOFAR16(i) ((i) | 0x20000)
1187
#define RELAX_MICROMIPS_CLEAR_TOOFAR16(i) ((i) & ~0x20000)
1188
#define RELAX_MICROMIPS_TOOFAR32(i) (((i) & 0x40000) != 0)
1189
#define RELAX_MICROMIPS_MARK_TOOFAR32(i) ((i) | 0x40000)
1190
#define RELAX_MICROMIPS_CLEAR_TOOFAR32(i) ((i) & ~0x40000)
1191
 
1192 16 khays
/* Is the given value a sign-extended 32-bit value?  */
1193
#define IS_SEXT_32BIT_NUM(x)                                            \
1194
  (((x) &~ (offsetT) 0x7fffffff) == 0                                    \
1195
   || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
1196
 
1197
/* Is the given value a sign-extended 16-bit value?  */
1198
#define IS_SEXT_16BIT_NUM(x)                                            \
1199
  (((x) &~ (offsetT) 0x7fff) == 0                                        \
1200
   || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
1201
 
1202 160 khays
/* Is the given value a sign-extended 12-bit value?  */
1203
#define IS_SEXT_12BIT_NUM(x)                                            \
1204
  (((((x) & 0xfff) ^ 0x800LL) - 0x800LL) == (x))
1205
 
1206 16 khays
/* Is the given value a zero-extended 32-bit value?  Or a negated one?  */
1207
#define IS_ZEXT_32BIT_NUM(x)                                            \
1208
  (((x) &~ (offsetT) 0xffffffff) == 0                                    \
1209
   || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
1210
 
1211
/* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
1212
   VALUE << SHIFT.  VALUE is evaluated exactly once.  */
1213
#define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
1214
  (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
1215
              | (((VALUE) & (MASK)) << (SHIFT)))
1216
 
1217
/* Extract bits MASK << SHIFT from STRUCT and shift them right
1218
   SHIFT places.  */
1219
#define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
1220
  (((STRUCT) >> (SHIFT)) & (MASK))
1221
 
1222
/* Change INSN's opcode so that the operand given by FIELD has value VALUE.
1223
   INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
1224
 
1225
   include/opcode/mips.h specifies operand fields using the macros
1226
   OP_MASK_<FIELD> and OP_SH_<FIELD>.  The MIPS16 equivalents start
1227
   with "MIPS16OP" instead of "OP".  */
1228 160 khays
#define INSERT_OPERAND(MICROMIPS, FIELD, INSN, VALUE) \
1229
  do \
1230
    if (!(MICROMIPS)) \
1231
      INSERT_BITS ((INSN).insn_opcode, VALUE, \
1232
                   OP_MASK_##FIELD, OP_SH_##FIELD); \
1233
    else \
1234
      INSERT_BITS ((INSN).insn_opcode, VALUE, \
1235
                   MICROMIPSOP_MASK_##FIELD, MICROMIPSOP_SH_##FIELD); \
1236
  while (0)
1237 16 khays
#define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
1238
  INSERT_BITS ((INSN).insn_opcode, VALUE, \
1239
                MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
1240
 
1241
/* Extract the operand given by FIELD from mips_cl_insn INSN.  */
1242 160 khays
#define EXTRACT_OPERAND(MICROMIPS, FIELD, INSN) \
1243
  (!(MICROMIPS) \
1244
   ? EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD) \
1245
   : EXTRACT_BITS ((INSN).insn_opcode, \
1246
                   MICROMIPSOP_MASK_##FIELD, MICROMIPSOP_SH_##FIELD))
1247 16 khays
#define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
1248
  EXTRACT_BITS ((INSN).insn_opcode, \
1249
                MIPS16OP_MASK_##FIELD, \
1250
                MIPS16OP_SH_##FIELD)
1251
 
1252 160 khays
/* Whether or not we are emitting a branch-likely macro.  */
1253
static bfd_boolean emit_branch_likely_macro = FALSE;
1254
 
1255 16 khays
/* Global variables used when generating relaxable macros.  See the
1256
   comment above RELAX_ENCODE for more details about how relaxation
1257
   is used.  */
1258
static struct {
1259
  /* 0 if we're not emitting a relaxable macro.
1260
     1 if we're emitting the first of the two relaxation alternatives.
1261
     2 if we're emitting the second alternative.  */
1262
  int sequence;
1263
 
1264
  /* The first relaxable fixup in the current frag.  (In other words,
1265
     the first fixup that refers to relaxable code.)  */
1266
  fixS *first_fixup;
1267
 
1268
  /* sizes[0] says how many bytes of the first alternative are stored in
1269
     the current frag.  Likewise sizes[1] for the second alternative.  */
1270
  unsigned int sizes[2];
1271
 
1272
  /* The symbol on which the choice of sequence depends.  */
1273
  symbolS *symbol;
1274
} mips_relax;
1275
 
1276
/* Global variables used to decide whether a macro needs a warning.  */
1277
static struct {
1278
  /* True if the macro is in a branch delay slot.  */
1279
  bfd_boolean delay_slot_p;
1280
 
1281 160 khays
  /* Set to the length in bytes required if the macro is in a delay slot
1282
     that requires a specific length of instruction, otherwise zero.  */
1283
  unsigned int delay_slot_length;
1284
 
1285 16 khays
  /* For relaxable macros, sizes[0] is the length of the first alternative
1286
     in bytes and sizes[1] is the length of the second alternative.
1287
     For non-relaxable macros, both elements give the length of the
1288
     macro in bytes.  */
1289
  unsigned int sizes[2];
1290
 
1291 160 khays
  /* For relaxable macros, first_insn_sizes[0] is the length of the first
1292
     instruction of the first alternative in bytes and first_insn_sizes[1]
1293
     is the length of the first instruction of the second alternative.
1294
     For non-relaxable macros, both elements give the length of the first
1295
     instruction in bytes.
1296
 
1297
     Set to zero if we haven't yet seen the first instruction.  */
1298
  unsigned int first_insn_sizes[2];
1299
 
1300
  /* For relaxable macros, insns[0] is the number of instructions for the
1301
     first alternative and insns[1] is the number of instructions for the
1302
     second alternative.
1303
 
1304
     For non-relaxable macros, both elements give the number of
1305
     instructions for the macro.  */
1306
  unsigned int insns[2];
1307
 
1308 16 khays
  /* The first variant frag for this macro.  */
1309
  fragS *first_frag;
1310
} mips_macro_warning;
1311
 
1312
/* Prototypes for static functions.  */
1313
 
1314
#define internalError()                                                 \
1315
    as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
1316
 
1317
enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
1318
 
1319
static void append_insn
1320 160 khays
  (struct mips_cl_insn *, expressionS *, bfd_reloc_code_real_type *,
1321
   bfd_boolean expansionp);
1322 16 khays
static void mips_no_prev_insn (void);
1323
static void macro_build (expressionS *, const char *, const char *, ...);
1324
static void mips16_macro_build
1325
  (expressionS *, const char *, const char *, va_list *);
1326
static void load_register (int, expressionS *, int);
1327
static void macro_start (void);
1328
static void macro_end (void);
1329
static void macro (struct mips_cl_insn * ip);
1330
static void mips16_macro (struct mips_cl_insn * ip);
1331
static void mips_ip (char *str, struct mips_cl_insn * ip);
1332
static void mips16_ip (char *str, struct mips_cl_insn * ip);
1333
static void mips16_immed
1334
  (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
1335
   unsigned long *, bfd_boolean *, unsigned short *);
1336
static size_t my_getSmallExpression
1337
  (expressionS *, bfd_reloc_code_real_type *, char *);
1338
static void my_getExpression (expressionS *, char *);
1339
static void s_align (int);
1340
static void s_change_sec (int);
1341
static void s_change_section (int);
1342
static void s_cons (int);
1343
static void s_float_cons (int);
1344
static void s_mips_globl (int);
1345
static void s_option (int);
1346
static void s_mipsset (int);
1347
static void s_abicalls (int);
1348
static void s_cpload (int);
1349
static void s_cpsetup (int);
1350
static void s_cplocal (int);
1351
static void s_cprestore (int);
1352
static void s_cpreturn (int);
1353
static void s_dtprelword (int);
1354
static void s_dtpreldword (int);
1355
static void s_gpvalue (int);
1356
static void s_gpword (int);
1357
static void s_gpdword (int);
1358
static void s_cpadd (int);
1359
static void s_insn (int);
1360
static void md_obj_begin (void);
1361
static void md_obj_end (void);
1362
static void s_mips_ent (int);
1363
static void s_mips_end (int);
1364
static void s_mips_frame (int);
1365
static void s_mips_mask (int reg_type);
1366
static void s_mips_stab (int);
1367
static void s_mips_weakext (int);
1368
static void s_mips_file (int);
1369
static void s_mips_loc (int);
1370
static bfd_boolean pic_need_relax (symbolS *, asection *);
1371
static int relaxed_branch_length (fragS *, asection *, int);
1372
static int validate_mips_insn (const struct mips_opcode *);
1373 160 khays
static int validate_micromips_insn (const struct mips_opcode *);
1374
static int relaxed_micromips_16bit_branch_length (fragS *, asection *, int);
1375
static int relaxed_micromips_32bit_branch_length (fragS *, asection *, int);
1376 16 khays
 
1377
/* Table and functions used to map between CPU/ISA names, and
1378
   ISA levels, and CPU numbers.  */
1379
 
1380
struct mips_cpu_info
1381
{
1382
  const char *name;           /* CPU or ISA name.  */
1383
  int flags;                  /* ASEs available, or ISA flag.  */
1384
  int isa;                    /* ISA level.  */
1385
  int cpu;                    /* CPU number (default CPU if ISA).  */
1386
};
1387
 
1388
#define MIPS_CPU_IS_ISA         0x0001  /* Is this an ISA?  (If 0, a CPU.) */
1389
#define MIPS_CPU_ASE_SMARTMIPS  0x0002  /* CPU implements SmartMIPS ASE */
1390
#define MIPS_CPU_ASE_DSP        0x0004  /* CPU implements DSP ASE */
1391
#define MIPS_CPU_ASE_MT         0x0008  /* CPU implements MT ASE */
1392
#define MIPS_CPU_ASE_MIPS3D     0x0010  /* CPU implements MIPS-3D ASE */
1393
#define MIPS_CPU_ASE_MDMX       0x0020  /* CPU implements MDMX ASE */
1394
#define MIPS_CPU_ASE_DSPR2      0x0040  /* CPU implements DSP R2 ASE */
1395 160 khays
#define MIPS_CPU_ASE_MCU        0x0080  /* CPU implements MCU ASE */
1396 16 khays
 
1397
static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1398
static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1399
static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1400
 
1401
/* Pseudo-op table.
1402
 
1403
   The following pseudo-ops from the Kane and Heinrich MIPS book
1404
   should be defined here, but are currently unsupported: .alias,
1405
   .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1406
 
1407
   The following pseudo-ops from the Kane and Heinrich MIPS book are
1408
   specific to the type of debugging information being generated, and
1409
   should be defined by the object format: .aent, .begin, .bend,
1410
   .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1411
   .vreg.
1412
 
1413
   The following pseudo-ops from the Kane and Heinrich MIPS book are
1414
   not MIPS CPU specific, but are also not specific to the object file
1415
   format.  This file is probably the best place to define them, but
1416
   they are not currently supported: .asm0, .endr, .lab, .struct.  */
1417
 
1418
static const pseudo_typeS mips_pseudo_table[] =
1419
{
1420
  /* MIPS specific pseudo-ops.  */
1421
  {"option", s_option, 0},
1422
  {"set", s_mipsset, 0},
1423
  {"rdata", s_change_sec, 'r'},
1424
  {"sdata", s_change_sec, 's'},
1425
  {"livereg", s_ignore, 0},
1426
  {"abicalls", s_abicalls, 0},
1427
  {"cpload", s_cpload, 0},
1428
  {"cpsetup", s_cpsetup, 0},
1429
  {"cplocal", s_cplocal, 0},
1430
  {"cprestore", s_cprestore, 0},
1431
  {"cpreturn", s_cpreturn, 0},
1432
  {"dtprelword", s_dtprelword, 0},
1433
  {"dtpreldword", s_dtpreldword, 0},
1434
  {"gpvalue", s_gpvalue, 0},
1435
  {"gpword", s_gpword, 0},
1436
  {"gpdword", s_gpdword, 0},
1437
  {"cpadd", s_cpadd, 0},
1438
  {"insn", s_insn, 0},
1439
 
1440
  /* Relatively generic pseudo-ops that happen to be used on MIPS
1441
     chips.  */
1442
  {"asciiz", stringer, 8 + 1},
1443
  {"bss", s_change_sec, 'b'},
1444
  {"err", s_err, 0},
1445
  {"half", s_cons, 1},
1446
  {"dword", s_cons, 3},
1447
  {"weakext", s_mips_weakext, 0},
1448
  {"origin", s_org, 0},
1449
  {"repeat", s_rept, 0},
1450
 
1451
  /* For MIPS this is non-standard, but we define it for consistency.  */
1452
  {"sbss", s_change_sec, 'B'},
1453
 
1454
  /* These pseudo-ops are defined in read.c, but must be overridden
1455
     here for one reason or another.  */
1456
  {"align", s_align, 0},
1457
  {"byte", s_cons, 0},
1458
  {"data", s_change_sec, 'd'},
1459
  {"double", s_float_cons, 'd'},
1460
  {"float", s_float_cons, 'f'},
1461
  {"globl", s_mips_globl, 0},
1462
  {"global", s_mips_globl, 0},
1463
  {"hword", s_cons, 1},
1464
  {"int", s_cons, 2},
1465
  {"long", s_cons, 2},
1466
  {"octa", s_cons, 4},
1467
  {"quad", s_cons, 3},
1468
  {"section", s_change_section, 0},
1469
  {"short", s_cons, 1},
1470
  {"single", s_float_cons, 'f'},
1471
  {"stabn", s_mips_stab, 'n'},
1472
  {"text", s_change_sec, 't'},
1473
  {"word", s_cons, 2},
1474
 
1475
  { "extern", ecoff_directive_extern, 0},
1476
 
1477
  { NULL, NULL, 0 },
1478
};
1479
 
1480
static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1481
{
1482
  /* These pseudo-ops should be defined by the object file format.
1483
     However, a.out doesn't support them, so we have versions here.  */
1484
  {"aent", s_mips_ent, 1},
1485
  {"bgnb", s_ignore, 0},
1486
  {"end", s_mips_end, 0},
1487
  {"endb", s_ignore, 0},
1488
  {"ent", s_mips_ent, 0},
1489
  {"file", s_mips_file, 0},
1490
  {"fmask", s_mips_mask, 'F'},
1491
  {"frame", s_mips_frame, 0},
1492
  {"loc", s_mips_loc, 0},
1493
  {"mask", s_mips_mask, 'R'},
1494
  {"verstamp", s_ignore, 0},
1495
  { NULL, NULL, 0 },
1496
};
1497
 
1498
/* Export the ABI address size for use by TC_ADDRESS_BYTES for the
1499
   purpose of the `.dc.a' internal pseudo-op.  */
1500
 
1501
int
1502
mips_address_bytes (void)
1503
{
1504
  return HAVE_64BIT_ADDRESSES ? 8 : 4;
1505
}
1506
 
1507
extern void pop_insert (const pseudo_typeS *);
1508
 
1509
void
1510
mips_pop_insert (void)
1511
{
1512
  pop_insert (mips_pseudo_table);
1513
  if (! ECOFF_DEBUGGING)
1514
    pop_insert (mips_nonecoff_pseudo_table);
1515
}
1516
 
1517
/* Symbols labelling the current insn.  */
1518
 
1519
struct insn_label_list
1520
{
1521
  struct insn_label_list *next;
1522
  symbolS *label;
1523
};
1524
 
1525
static struct insn_label_list *free_insn_labels;
1526
#define label_list tc_segment_info_data.labels
1527
 
1528
static void mips_clear_insn_labels (void);
1529 160 khays
static void mips_mark_labels (void);
1530
static void mips_compressed_mark_labels (void);
1531 16 khays
 
1532
static inline void
1533
mips_clear_insn_labels (void)
1534
{
1535
  register struct insn_label_list **pl;
1536
  segment_info_type *si;
1537
 
1538
  if (now_seg)
1539
    {
1540
      for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1541
        ;
1542
 
1543
      si = seg_info (now_seg);
1544
      *pl = si->label_list;
1545
      si->label_list = NULL;
1546
    }
1547
}
1548
 
1549 160 khays
/* Mark instruction labels in MIPS16/microMIPS mode.  */
1550
 
1551
static inline void
1552
mips_mark_labels (void)
1553
{
1554
  if (HAVE_CODE_COMPRESSION)
1555
    mips_compressed_mark_labels ();
1556
}
1557 16 khays
 
1558
static char *expr_end;
1559
 
1560
/* Expressions which appear in instructions.  These are set by
1561
   mips_ip.  */
1562
 
1563
static expressionS imm_expr;
1564
static expressionS imm2_expr;
1565
static expressionS offset_expr;
1566
 
1567
/* Relocs associated with imm_expr and offset_expr.  */
1568
 
1569
static bfd_reloc_code_real_type imm_reloc[3]
1570
  = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1571
static bfd_reloc_code_real_type offset_reloc[3]
1572
  = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1573
 
1574 160 khays
/* This is set to the resulting size of the instruction to be produced
1575
   by mips16_ip if an explicit extension is used or by mips_ip if an
1576
   explicit size is supplied.  */
1577 16 khays
 
1578 160 khays
static unsigned int forced_insn_length;
1579 16 khays
 
1580
#ifdef OBJ_ELF
1581
/* The pdr segment for per procedure frame/regmask info.  Not used for
1582
   ECOFF debugging.  */
1583
 
1584
static segT pdr_seg;
1585
#endif
1586
 
1587
/* The default target format to use.  */
1588
 
1589
#if defined (TE_FreeBSD)
1590
#define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips-freebsd"
1591
#elif defined (TE_TMIPS)
1592
#define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips"
1593
#else
1594
#define ELF_TARGET(PREFIX, ENDIAN) PREFIX ENDIAN "mips"
1595
#endif
1596
 
1597
const char *
1598
mips_target_format (void)
1599
{
1600
  switch (OUTPUT_FLAVOR)
1601
    {
1602
    case bfd_target_ecoff_flavour:
1603
      return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1604
    case bfd_target_coff_flavour:
1605
      return "pe-mips";
1606
    case bfd_target_elf_flavour:
1607
#ifdef TE_VXWORKS
1608
      if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1609
        return (target_big_endian
1610
                ? "elf32-bigmips-vxworks"
1611
                : "elf32-littlemips-vxworks");
1612
#endif
1613
      return (target_big_endian
1614
              ? (HAVE_64BIT_OBJECTS
1615
                 ? ELF_TARGET ("elf64-", "big")
1616
                 : (HAVE_NEWABI
1617
                    ? ELF_TARGET ("elf32-n", "big")
1618
                    : ELF_TARGET ("elf32-", "big")))
1619
              : (HAVE_64BIT_OBJECTS
1620
                 ? ELF_TARGET ("elf64-", "little")
1621
                 : (HAVE_NEWABI
1622
                    ? ELF_TARGET ("elf32-n", "little")
1623
                    : ELF_TARGET ("elf32-", "little"))));
1624
    default:
1625
      abort ();
1626
      return NULL;
1627
    }
1628
}
1629
 
1630 160 khays
/* Return the length of a microMIPS instruction in bytes.  If bits of
1631
   the mask beyond the low 16 are 0, then it is a 16-bit instruction.
1632
   Otherwise assume a 32-bit instruction; 48-bit instructions (0x1f
1633
   major opcode) will require further modifications to the opcode
1634
   table.  */
1635
 
1636
static inline unsigned int
1637
micromips_insn_length (const struct mips_opcode *mo)
1638
{
1639
  return (mo->mask >> 16) == 0 ? 2 : 4;
1640
}
1641
 
1642 16 khays
/* Return the length of instruction INSN.  */
1643
 
1644
static inline unsigned int
1645
insn_length (const struct mips_cl_insn *insn)
1646
{
1647 160 khays
  if (mips_opts.micromips)
1648
    return micromips_insn_length (insn->insn_mo);
1649
  else if (mips_opts.mips16)
1650
    return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1651
  else
1652 16 khays
    return 4;
1653
}
1654
 
1655
/* Initialise INSN from opcode entry MO.  Leave its position unspecified.  */
1656
 
1657
static void
1658
create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1659
{
1660
  size_t i;
1661
 
1662
  insn->insn_mo = mo;
1663
  insn->use_extend = FALSE;
1664
  insn->extend = 0;
1665
  insn->insn_opcode = mo->match;
1666
  insn->frag = NULL;
1667
  insn->where = 0;
1668
  for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1669
    insn->fixp[i] = NULL;
1670
  insn->fixed_p = (mips_opts.noreorder > 0);
1671
  insn->noreorder_p = (mips_opts.noreorder > 0);
1672
  insn->mips16_absolute_jump_p = 0;
1673
  insn->complete_p = 0;
1674
}
1675
 
1676 160 khays
/* Record the current MIPS16/microMIPS mode in now_seg.  */
1677 16 khays
 
1678
static void
1679 160 khays
mips_record_compressed_mode (void)
1680 16 khays
{
1681
  segment_info_type *si;
1682
 
1683
  si = seg_info (now_seg);
1684
  if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
1685
    si->tc_segment_info_data.mips16 = mips_opts.mips16;
1686 160 khays
  if (si->tc_segment_info_data.micromips != mips_opts.micromips)
1687
    si->tc_segment_info_data.micromips = mips_opts.micromips;
1688 16 khays
}
1689
 
1690
/* Install INSN at the location specified by its "frag" and "where" fields.  */
1691
 
1692
static void
1693
install_insn (const struct mips_cl_insn *insn)
1694
{
1695
  char *f = insn->frag->fr_literal + insn->where;
1696 160 khays
  if (!HAVE_CODE_COMPRESSION)
1697 16 khays
    md_number_to_chars (f, insn->insn_opcode, 4);
1698 160 khays
  else if (mips_opts.micromips)
1699
    {
1700
      unsigned int length = insn_length (insn);
1701
      if (length == 2)
1702
        md_number_to_chars (f, insn->insn_opcode, 2);
1703
      else if (length == 4)
1704
        {
1705
          md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1706
          f += 2;
1707
          md_number_to_chars (f, insn->insn_opcode & 0xffff, 2);
1708
        }
1709
      else
1710
        as_bad (_("48-bit microMIPS instructions are not supported"));
1711
    }
1712 16 khays
  else if (insn->mips16_absolute_jump_p)
1713
    {
1714
      md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1715
      md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1716
    }
1717
  else
1718
    {
1719
      if (insn->use_extend)
1720
        {
1721
          md_number_to_chars (f, 0xf000 | insn->extend, 2);
1722
          f += 2;
1723
        }
1724
      md_number_to_chars (f, insn->insn_opcode, 2);
1725
    }
1726 160 khays
  mips_record_compressed_mode ();
1727 16 khays
}
1728
 
1729
/* Move INSN to offset WHERE in FRAG.  Adjust the fixups accordingly
1730
   and install the opcode in the new location.  */
1731
 
1732
static void
1733
move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1734
{
1735
  size_t i;
1736
 
1737
  insn->frag = frag;
1738
  insn->where = where;
1739
  for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1740
    if (insn->fixp[i] != NULL)
1741
      {
1742
        insn->fixp[i]->fx_frag = frag;
1743
        insn->fixp[i]->fx_where = where;
1744
      }
1745
  install_insn (insn);
1746
}
1747
 
1748
/* Add INSN to the end of the output.  */
1749
 
1750
static void
1751
add_fixed_insn (struct mips_cl_insn *insn)
1752
{
1753
  char *f = frag_more (insn_length (insn));
1754
  move_insn (insn, frag_now, f - frag_now->fr_literal);
1755
}
1756
 
1757
/* Start a variant frag and move INSN to the start of the variant part,
1758
   marking it as fixed.  The other arguments are as for frag_var.  */
1759
 
1760
static void
1761
add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1762
                  relax_substateT subtype, symbolS *symbol, offsetT offset)
1763
{
1764
  frag_grow (max_chars);
1765
  move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1766
  insn->fixed_p = 1;
1767
  frag_var (rs_machine_dependent, max_chars, var,
1768
            subtype, symbol, offset, NULL);
1769
}
1770
 
1771
/* Insert N copies of INSN into the history buffer, starting at
1772
   position FIRST.  Neither FIRST nor N need to be clipped.  */
1773
 
1774
static void
1775
insert_into_history (unsigned int first, unsigned int n,
1776
                     const struct mips_cl_insn *insn)
1777
{
1778
  if (mips_relax.sequence != 2)
1779
    {
1780
      unsigned int i;
1781
 
1782
      for (i = ARRAY_SIZE (history); i-- > first;)
1783
        if (i >= first + n)
1784
          history[i] = history[i - n];
1785
        else
1786
          history[i] = *insn;
1787
    }
1788
}
1789
 
1790
/* Initialize vr4120_conflicts.  There is a bit of duplication here:
1791
   the idea is to make it obvious at a glance that each errata is
1792
   included.  */
1793
 
1794
static void
1795
init_vr4120_conflicts (void)
1796
{
1797
#define CONFLICT(FIRST, SECOND) \
1798
    vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1799
 
1800
  /* Errata 21 - [D]DIV[U] after [D]MACC */
1801
  CONFLICT (MACC, DIV);
1802
  CONFLICT (DMACC, DIV);
1803
 
1804
  /* Errata 23 - Continuous DMULT[U]/DMACC instructions.  */
1805
  CONFLICT (DMULT, DMULT);
1806
  CONFLICT (DMULT, DMACC);
1807
  CONFLICT (DMACC, DMULT);
1808
  CONFLICT (DMACC, DMACC);
1809
 
1810
  /* Errata 24 - MT{LO,HI} after [D]MACC */
1811
  CONFLICT (MACC, MTHILO);
1812
  CONFLICT (DMACC, MTHILO);
1813
 
1814
  /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1815
     instruction is executed immediately after a MACC or DMACC
1816
     instruction, the result of [either instruction] is incorrect."  */
1817
  CONFLICT (MACC, MULT);
1818
  CONFLICT (MACC, DMULT);
1819
  CONFLICT (DMACC, MULT);
1820
  CONFLICT (DMACC, DMULT);
1821
 
1822
  /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1823
     executed immediately after a DMULT, DMULTU, DIV, DIVU,
1824
     DDIV or DDIVU instruction, the result of the MACC or
1825
     DMACC instruction is incorrect.".  */
1826
  CONFLICT (DMULT, MACC);
1827
  CONFLICT (DMULT, DMACC);
1828
  CONFLICT (DIV, MACC);
1829
  CONFLICT (DIV, DMACC);
1830
 
1831
#undef CONFLICT
1832
}
1833
 
1834
struct regname {
1835
  const char *name;
1836
  unsigned int num;
1837
};
1838
 
1839
#define RTYPE_MASK      0x1ff00
1840
#define RTYPE_NUM       0x00100
1841
#define RTYPE_FPU       0x00200
1842
#define RTYPE_FCC       0x00400
1843
#define RTYPE_VEC       0x00800
1844
#define RTYPE_GP        0x01000
1845
#define RTYPE_CP0       0x02000
1846
#define RTYPE_PC        0x04000
1847
#define RTYPE_ACC       0x08000
1848
#define RTYPE_CCC       0x10000
1849
#define RNUM_MASK       0x000ff
1850
#define RWARN           0x80000
1851
 
1852
#define GENERIC_REGISTER_NUMBERS \
1853
    {"$0",      RTYPE_NUM | 0},  \
1854
    {"$1",      RTYPE_NUM | 1},  \
1855
    {"$2",      RTYPE_NUM | 2},  \
1856
    {"$3",      RTYPE_NUM | 3},  \
1857
    {"$4",      RTYPE_NUM | 4},  \
1858
    {"$5",      RTYPE_NUM | 5},  \
1859
    {"$6",      RTYPE_NUM | 6},  \
1860
    {"$7",      RTYPE_NUM | 7},  \
1861
    {"$8",      RTYPE_NUM | 8},  \
1862
    {"$9",      RTYPE_NUM | 9},  \
1863
    {"$10",     RTYPE_NUM | 10}, \
1864
    {"$11",     RTYPE_NUM | 11}, \
1865
    {"$12",     RTYPE_NUM | 12}, \
1866
    {"$13",     RTYPE_NUM | 13}, \
1867
    {"$14",     RTYPE_NUM | 14}, \
1868
    {"$15",     RTYPE_NUM | 15}, \
1869
    {"$16",     RTYPE_NUM | 16}, \
1870
    {"$17",     RTYPE_NUM | 17}, \
1871
    {"$18",     RTYPE_NUM | 18}, \
1872
    {"$19",     RTYPE_NUM | 19}, \
1873
    {"$20",     RTYPE_NUM | 20}, \
1874
    {"$21",     RTYPE_NUM | 21}, \
1875
    {"$22",     RTYPE_NUM | 22}, \
1876
    {"$23",     RTYPE_NUM | 23}, \
1877
    {"$24",     RTYPE_NUM | 24}, \
1878
    {"$25",     RTYPE_NUM | 25}, \
1879
    {"$26",     RTYPE_NUM | 26}, \
1880
    {"$27",     RTYPE_NUM | 27}, \
1881
    {"$28",     RTYPE_NUM | 28}, \
1882
    {"$29",     RTYPE_NUM | 29}, \
1883
    {"$30",     RTYPE_NUM | 30}, \
1884
    {"$31",     RTYPE_NUM | 31}
1885
 
1886
#define FPU_REGISTER_NAMES       \
1887
    {"$f0",     RTYPE_FPU | 0},  \
1888
    {"$f1",     RTYPE_FPU | 1},  \
1889
    {"$f2",     RTYPE_FPU | 2},  \
1890
    {"$f3",     RTYPE_FPU | 3},  \
1891
    {"$f4",     RTYPE_FPU | 4},  \
1892
    {"$f5",     RTYPE_FPU | 5},  \
1893
    {"$f6",     RTYPE_FPU | 6},  \
1894
    {"$f7",     RTYPE_FPU | 7},  \
1895
    {"$f8",     RTYPE_FPU | 8},  \
1896
    {"$f9",     RTYPE_FPU | 9},  \
1897
    {"$f10",    RTYPE_FPU | 10}, \
1898
    {"$f11",    RTYPE_FPU | 11}, \
1899
    {"$f12",    RTYPE_FPU | 12}, \
1900
    {"$f13",    RTYPE_FPU | 13}, \
1901
    {"$f14",    RTYPE_FPU | 14}, \
1902
    {"$f15",    RTYPE_FPU | 15}, \
1903
    {"$f16",    RTYPE_FPU | 16}, \
1904
    {"$f17",    RTYPE_FPU | 17}, \
1905
    {"$f18",    RTYPE_FPU | 18}, \
1906
    {"$f19",    RTYPE_FPU | 19}, \
1907
    {"$f20",    RTYPE_FPU | 20}, \
1908
    {"$f21",    RTYPE_FPU | 21}, \
1909
    {"$f22",    RTYPE_FPU | 22}, \
1910
    {"$f23",    RTYPE_FPU | 23}, \
1911
    {"$f24",    RTYPE_FPU | 24}, \
1912
    {"$f25",    RTYPE_FPU | 25}, \
1913
    {"$f26",    RTYPE_FPU | 26}, \
1914
    {"$f27",    RTYPE_FPU | 27}, \
1915
    {"$f28",    RTYPE_FPU | 28}, \
1916
    {"$f29",    RTYPE_FPU | 29}, \
1917
    {"$f30",    RTYPE_FPU | 30}, \
1918
    {"$f31",    RTYPE_FPU | 31}
1919
 
1920
#define FPU_CONDITION_CODE_NAMES \
1921
    {"$fcc0",   RTYPE_FCC | 0},  \
1922
    {"$fcc1",   RTYPE_FCC | 1},  \
1923
    {"$fcc2",   RTYPE_FCC | 2},  \
1924
    {"$fcc3",   RTYPE_FCC | 3},  \
1925
    {"$fcc4",   RTYPE_FCC | 4},  \
1926
    {"$fcc5",   RTYPE_FCC | 5},  \
1927
    {"$fcc6",   RTYPE_FCC | 6},  \
1928
    {"$fcc7",   RTYPE_FCC | 7}
1929
 
1930
#define COPROC_CONDITION_CODE_NAMES         \
1931
    {"$cc0",    RTYPE_FCC | RTYPE_CCC | 0}, \
1932
    {"$cc1",    RTYPE_FCC | RTYPE_CCC | 1}, \
1933
    {"$cc2",    RTYPE_FCC | RTYPE_CCC | 2}, \
1934
    {"$cc3",    RTYPE_FCC | RTYPE_CCC | 3}, \
1935
    {"$cc4",    RTYPE_FCC | RTYPE_CCC | 4}, \
1936
    {"$cc5",    RTYPE_FCC | RTYPE_CCC | 5}, \
1937
    {"$cc6",    RTYPE_FCC | RTYPE_CCC | 6}, \
1938
    {"$cc7",    RTYPE_FCC | RTYPE_CCC | 7}
1939
 
1940
#define N32N64_SYMBOLIC_REGISTER_NAMES \
1941
    {"$a4",     RTYPE_GP | 8},  \
1942
    {"$a5",     RTYPE_GP | 9},  \
1943
    {"$a6",     RTYPE_GP | 10}, \
1944
    {"$a7",     RTYPE_GP | 11}, \
1945
    {"$ta0",    RTYPE_GP | 8},  /* alias for $a4 */ \
1946
    {"$ta1",    RTYPE_GP | 9},  /* alias for $a5 */ \
1947
    {"$ta2",    RTYPE_GP | 10}, /* alias for $a6 */ \
1948
    {"$ta3",    RTYPE_GP | 11}, /* alias for $a7 */ \
1949
    {"$t0",     RTYPE_GP | 12}, \
1950
    {"$t1",     RTYPE_GP | 13}, \
1951
    {"$t2",     RTYPE_GP | 14}, \
1952
    {"$t3",     RTYPE_GP | 15}
1953
 
1954
#define O32_SYMBOLIC_REGISTER_NAMES \
1955
    {"$t0",     RTYPE_GP | 8},  \
1956
    {"$t1",     RTYPE_GP | 9},  \
1957
    {"$t2",     RTYPE_GP | 10}, \
1958
    {"$t3",     RTYPE_GP | 11}, \
1959
    {"$t4",     RTYPE_GP | 12}, \
1960
    {"$t5",     RTYPE_GP | 13}, \
1961
    {"$t6",     RTYPE_GP | 14}, \
1962
    {"$t7",     RTYPE_GP | 15}, \
1963
    {"$ta0",    RTYPE_GP | 12}, /* alias for $t4 */ \
1964
    {"$ta1",    RTYPE_GP | 13}, /* alias for $t5 */ \
1965
    {"$ta2",    RTYPE_GP | 14}, /* alias for $t6 */ \
1966
    {"$ta3",    RTYPE_GP | 15}  /* alias for $t7 */
1967
 
1968
/* Remaining symbolic register names */
1969
#define SYMBOLIC_REGISTER_NAMES \
1970
    {"$zero",   RTYPE_GP | 0},  \
1971
    {"$at",     RTYPE_GP | 1},  \
1972
    {"$AT",     RTYPE_GP | 1},  \
1973
    {"$v0",     RTYPE_GP | 2},  \
1974
    {"$v1",     RTYPE_GP | 3},  \
1975
    {"$a0",     RTYPE_GP | 4},  \
1976
    {"$a1",     RTYPE_GP | 5},  \
1977
    {"$a2",     RTYPE_GP | 6},  \
1978
    {"$a3",     RTYPE_GP | 7},  \
1979
    {"$s0",     RTYPE_GP | 16}, \
1980
    {"$s1",     RTYPE_GP | 17}, \
1981
    {"$s2",     RTYPE_GP | 18}, \
1982
    {"$s3",     RTYPE_GP | 19}, \
1983
    {"$s4",     RTYPE_GP | 20}, \
1984
    {"$s5",     RTYPE_GP | 21}, \
1985
    {"$s6",     RTYPE_GP | 22}, \
1986
    {"$s7",     RTYPE_GP | 23}, \
1987
    {"$t8",     RTYPE_GP | 24}, \
1988
    {"$t9",     RTYPE_GP | 25}, \
1989
    {"$k0",     RTYPE_GP | 26}, \
1990
    {"$kt0",    RTYPE_GP | 26}, \
1991
    {"$k1",     RTYPE_GP | 27}, \
1992
    {"$kt1",    RTYPE_GP | 27}, \
1993
    {"$gp",     RTYPE_GP | 28}, \
1994
    {"$sp",     RTYPE_GP | 29}, \
1995
    {"$s8",     RTYPE_GP | 30}, \
1996
    {"$fp",     RTYPE_GP | 30}, \
1997
    {"$ra",     RTYPE_GP | 31}
1998
 
1999
#define MIPS16_SPECIAL_REGISTER_NAMES \
2000
    {"$pc",     RTYPE_PC | 0}
2001
 
2002
#define MDMX_VECTOR_REGISTER_NAMES \
2003
    /* {"$v0",  RTYPE_VEC | 0},  clash with REG 2 above */ \
2004
    /* {"$v1",  RTYPE_VEC | 1},  clash with REG 3 above */ \
2005
    {"$v2",     RTYPE_VEC | 2},  \
2006
    {"$v3",     RTYPE_VEC | 3},  \
2007
    {"$v4",     RTYPE_VEC | 4},  \
2008
    {"$v5",     RTYPE_VEC | 5},  \
2009
    {"$v6",     RTYPE_VEC | 6},  \
2010
    {"$v7",     RTYPE_VEC | 7},  \
2011
    {"$v8",     RTYPE_VEC | 8},  \
2012
    {"$v9",     RTYPE_VEC | 9},  \
2013
    {"$v10",    RTYPE_VEC | 10}, \
2014
    {"$v11",    RTYPE_VEC | 11}, \
2015
    {"$v12",    RTYPE_VEC | 12}, \
2016
    {"$v13",    RTYPE_VEC | 13}, \
2017
    {"$v14",    RTYPE_VEC | 14}, \
2018
    {"$v15",    RTYPE_VEC | 15}, \
2019
    {"$v16",    RTYPE_VEC | 16}, \
2020
    {"$v17",    RTYPE_VEC | 17}, \
2021
    {"$v18",    RTYPE_VEC | 18}, \
2022
    {"$v19",    RTYPE_VEC | 19}, \
2023
    {"$v20",    RTYPE_VEC | 20}, \
2024
    {"$v21",    RTYPE_VEC | 21}, \
2025
    {"$v22",    RTYPE_VEC | 22}, \
2026
    {"$v23",    RTYPE_VEC | 23}, \
2027
    {"$v24",    RTYPE_VEC | 24}, \
2028
    {"$v25",    RTYPE_VEC | 25}, \
2029
    {"$v26",    RTYPE_VEC | 26}, \
2030
    {"$v27",    RTYPE_VEC | 27}, \
2031
    {"$v28",    RTYPE_VEC | 28}, \
2032
    {"$v29",    RTYPE_VEC | 29}, \
2033
    {"$v30",    RTYPE_VEC | 30}, \
2034
    {"$v31",    RTYPE_VEC | 31}
2035
 
2036
#define MIPS_DSP_ACCUMULATOR_NAMES \
2037
    {"$ac0",    RTYPE_ACC | 0}, \
2038
    {"$ac1",    RTYPE_ACC | 1}, \
2039
    {"$ac2",    RTYPE_ACC | 2}, \
2040
    {"$ac3",    RTYPE_ACC | 3}
2041
 
2042
static const struct regname reg_names[] = {
2043
  GENERIC_REGISTER_NUMBERS,
2044
  FPU_REGISTER_NAMES,
2045
  FPU_CONDITION_CODE_NAMES,
2046
  COPROC_CONDITION_CODE_NAMES,
2047
 
2048
  /* The $txx registers depends on the abi,
2049
     these will be added later into the symbol table from
2050
     one of the tables below once mips_abi is set after
2051
     parsing of arguments from the command line. */
2052
  SYMBOLIC_REGISTER_NAMES,
2053
 
2054
  MIPS16_SPECIAL_REGISTER_NAMES,
2055
  MDMX_VECTOR_REGISTER_NAMES,
2056
  MIPS_DSP_ACCUMULATOR_NAMES,
2057
  {0, 0}
2058
};
2059
 
2060
static const struct regname reg_names_o32[] = {
2061
  O32_SYMBOLIC_REGISTER_NAMES,
2062
  {0, 0}
2063
};
2064
 
2065
static const struct regname reg_names_n32n64[] = {
2066
  N32N64_SYMBOLIC_REGISTER_NAMES,
2067
  {0, 0}
2068
};
2069
 
2070 160 khays
/* Check if S points at a valid register specifier according to TYPES.
2071
   If so, then return 1, advance S to consume the specifier and store
2072
   the register's number in REGNOP, otherwise return 0.  */
2073
 
2074 16 khays
static int
2075
reg_lookup (char **s, unsigned int types, unsigned int *regnop)
2076
{
2077
  symbolS *symbolP;
2078
  char *e;
2079
  char save_c;
2080
  int reg = -1;
2081
 
2082
  /* Find end of name.  */
2083
  e = *s;
2084
  if (is_name_beginner (*e))
2085
    ++e;
2086
  while (is_part_of_name (*e))
2087
    ++e;
2088
 
2089
  /* Terminate name.  */
2090
  save_c = *e;
2091
  *e = '\0';
2092
 
2093
  /* Look for a register symbol.  */
2094
  if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
2095
    {
2096
      int r = S_GET_VALUE (symbolP);
2097
      if (r & types)
2098
        reg = r & RNUM_MASK;
2099
      else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
2100
        /* Convert GP reg $v0/1 to MDMX reg $v0/1!  */
2101
        reg = (r & RNUM_MASK) - 2;
2102
    }
2103
  /* Else see if this is a register defined in an itbl entry.  */
2104
  else if ((types & RTYPE_GP) && itbl_have_entries)
2105
    {
2106
      char *n = *s;
2107
      unsigned long r;
2108
 
2109
      if (*n == '$')
2110
        ++n;
2111
      if (itbl_get_reg_val (n, &r))
2112
        reg = r & RNUM_MASK;
2113
    }
2114
 
2115
  /* Advance to next token if a register was recognised.  */
2116
  if (reg >= 0)
2117
    *s = e;
2118
  else if (types & RWARN)
2119
    as_warn (_("Unrecognized register name `%s'"), *s);
2120
 
2121
  *e = save_c;
2122
  if (regnop)
2123
    *regnop = reg;
2124
  return reg >= 0;
2125
}
2126
 
2127 160 khays
/* Check if S points at a valid register list according to TYPES.
2128
   If so, then return 1, advance S to consume the list and store
2129
   the registers present on the list as a bitmask of ones in REGLISTP,
2130
   otherwise return 0.  A valid list comprises a comma-separated
2131
   enumeration of valid single registers and/or dash-separated
2132
   contiguous register ranges as determined by their numbers.
2133
 
2134
   As a special exception if one of s0-s7 registers is specified as
2135
   the range's lower delimiter and s8 (fp) is its upper one, then no
2136
   registers whose numbers place them between s7 and s8 (i.e. $24-$29)
2137
   are selected; they have to be listed separately if needed.  */
2138
 
2139
static int
2140
reglist_lookup (char **s, unsigned int types, unsigned int *reglistp)
2141
{
2142
  unsigned int reglist = 0;
2143
  unsigned int lastregno;
2144
  bfd_boolean ok = TRUE;
2145
  unsigned int regmask;
2146
  char *s_endlist = *s;
2147
  char *s_reset = *s;
2148
  unsigned int regno;
2149
 
2150
  while (reg_lookup (s, types, &regno))
2151
    {
2152
      lastregno = regno;
2153
      if (**s == '-')
2154
        {
2155
          (*s)++;
2156
          ok = reg_lookup (s, types, &lastregno);
2157
          if (ok && lastregno < regno)
2158
            ok = FALSE;
2159
          if (!ok)
2160
            break;
2161
        }
2162
 
2163
      if (lastregno == FP && regno >= S0 && regno <= S7)
2164
        {
2165
          lastregno = S7;
2166
          reglist |= 1 << FP;
2167
        }
2168
      regmask = 1 << lastregno;
2169
      regmask = (regmask << 1) - 1;
2170
      regmask ^= (1 << regno) - 1;
2171
      reglist |= regmask;
2172
 
2173
      s_endlist = *s;
2174
      if (**s != ',')
2175
        break;
2176
      (*s)++;
2177
    }
2178
 
2179
  if (ok)
2180
    *s = s_endlist;
2181
  else
2182
    *s = s_reset;
2183
  if (reglistp)
2184
    *reglistp = reglist;
2185
  return ok && reglist != 0;
2186
}
2187
 
2188 16 khays
/* Return TRUE if opcode MO is valid on the currently selected ISA and
2189
   architecture.  Use is_opcode_valid_16 for MIPS16 opcodes.  */
2190
 
2191
static bfd_boolean
2192
is_opcode_valid (const struct mips_opcode *mo)
2193
{
2194
  int isa = mips_opts.isa;
2195
  int fp_s, fp_d;
2196
 
2197
  if (mips_opts.ase_mdmx)
2198
    isa |= INSN_MDMX;
2199
  if (mips_opts.ase_dsp)
2200
    isa |= INSN_DSP;
2201
  if (mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
2202
    isa |= INSN_DSP64;
2203
  if (mips_opts.ase_dspr2)
2204
    isa |= INSN_DSPR2;
2205
  if (mips_opts.ase_mt)
2206
    isa |= INSN_MT;
2207
  if (mips_opts.ase_mips3d)
2208
    isa |= INSN_MIPS3D;
2209
  if (mips_opts.ase_smartmips)
2210
    isa |= INSN_SMARTMIPS;
2211 160 khays
  if (mips_opts.ase_mcu)
2212
    isa |= INSN_MCU;
2213 16 khays
 
2214
  /* Don't accept instructions based on the ISA if the CPU does not implement
2215
     all the coprocessor insns. */
2216
  if (NO_ISA_COP (mips_opts.arch)
2217
      && COP_INSN (mo->pinfo))
2218
    isa = 0;
2219
 
2220
  if (!OPCODE_IS_MEMBER (mo, isa, mips_opts.arch))
2221
    return FALSE;
2222
 
2223
  /* Check whether the instruction or macro requires single-precision or
2224
     double-precision floating-point support.  Note that this information is
2225
     stored differently in the opcode table for insns and macros.  */
2226
  if (mo->pinfo == INSN_MACRO)
2227
    {
2228
      fp_s = mo->pinfo2 & INSN2_M_FP_S;
2229
      fp_d = mo->pinfo2 & INSN2_M_FP_D;
2230
    }
2231
  else
2232
    {
2233
      fp_s = mo->pinfo & FP_S;
2234
      fp_d = mo->pinfo & FP_D;
2235
    }
2236
 
2237
  if (fp_d && (mips_opts.soft_float || mips_opts.single_float))
2238
    return FALSE;
2239
 
2240
  if (fp_s && mips_opts.soft_float)
2241
    return FALSE;
2242
 
2243
  return TRUE;
2244
}
2245
 
2246
/* Return TRUE if the MIPS16 opcode MO is valid on the currently
2247
   selected ISA and architecture.  */
2248
 
2249
static bfd_boolean
2250
is_opcode_valid_16 (const struct mips_opcode *mo)
2251
{
2252
  return OPCODE_IS_MEMBER (mo, mips_opts.isa, mips_opts.arch) ? TRUE : FALSE;
2253
}
2254
 
2255 160 khays
/* Return TRUE if the size of the microMIPS opcode MO matches one
2256
   explicitly requested.  Always TRUE in the standard MIPS mode.  */
2257
 
2258
static bfd_boolean
2259
is_size_valid (const struct mips_opcode *mo)
2260
{
2261
  if (!mips_opts.micromips)
2262
    return TRUE;
2263
 
2264
  if (!forced_insn_length)
2265
    return TRUE;
2266
  if (mo->pinfo == INSN_MACRO)
2267
    return FALSE;
2268
  return forced_insn_length == micromips_insn_length (mo);
2269
}
2270
 
2271
/* Return TRUE if the microMIPS opcode MO is valid for the delay slot
2272
   of the preceding instruction.  Always TRUE in the standard MIPS mode.  */
2273
 
2274
static bfd_boolean
2275
is_delay_slot_valid (const struct mips_opcode *mo)
2276
{
2277
  if (!mips_opts.micromips)
2278
    return TRUE;
2279
 
2280
  if (mo->pinfo == INSN_MACRO)
2281
    return TRUE;
2282
  if ((history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT) != 0
2283
      && micromips_insn_length (mo) != 4)
2284
    return FALSE;
2285
  if ((history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0
2286
      && micromips_insn_length (mo) != 2)
2287
    return FALSE;
2288
 
2289
  return TRUE;
2290
}
2291
 
2292 16 khays
/* This function is called once, at assembler startup time.  It should set up
2293
   all the tables, etc. that the MD part of the assembler will need.  */
2294
 
2295
void
2296
md_begin (void)
2297
{
2298
  const char *retval = NULL;
2299
  int i = 0;
2300
  int broken = 0;
2301
 
2302
  if (mips_pic != NO_PIC)
2303
    {
2304
      if (g_switch_seen && g_switch_value != 0)
2305
        as_bad (_("-G may not be used in position-independent code"));
2306
      g_switch_value = 0;
2307
    }
2308
 
2309
  if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
2310
    as_warn (_("Could not set architecture and machine"));
2311
 
2312
  op_hash = hash_new ();
2313
 
2314
  for (i = 0; i < NUMOPCODES;)
2315
    {
2316
      const char *name = mips_opcodes[i].name;
2317
 
2318
      retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
2319
      if (retval != NULL)
2320
        {
2321
          fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
2322
                   mips_opcodes[i].name, retval);
2323
          /* Probably a memory allocation problem?  Give up now.  */
2324
          as_fatal (_("Broken assembler.  No assembly attempted."));
2325
        }
2326
      do
2327
        {
2328
          if (mips_opcodes[i].pinfo != INSN_MACRO)
2329
            {
2330
              if (!validate_mips_insn (&mips_opcodes[i]))
2331
                broken = 1;
2332
              if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
2333
                {
2334
                  create_insn (&nop_insn, mips_opcodes + i);
2335
                  if (mips_fix_loongson2f_nop)
2336
                    nop_insn.insn_opcode = LOONGSON2F_NOP_INSN;
2337
                  nop_insn.fixed_p = 1;
2338
                }
2339
            }
2340
          ++i;
2341
        }
2342
      while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
2343
    }
2344
 
2345
  mips16_op_hash = hash_new ();
2346
 
2347
  i = 0;
2348
  while (i < bfd_mips16_num_opcodes)
2349
    {
2350
      const char *name = mips16_opcodes[i].name;
2351
 
2352
      retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
2353
      if (retval != NULL)
2354
        as_fatal (_("internal: can't hash `%s': %s"),
2355
                  mips16_opcodes[i].name, retval);
2356
      do
2357
        {
2358
          if (mips16_opcodes[i].pinfo != INSN_MACRO
2359
              && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
2360
                  != mips16_opcodes[i].match))
2361
            {
2362
              fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
2363
                       mips16_opcodes[i].name, mips16_opcodes[i].args);
2364
              broken = 1;
2365
            }
2366
          if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
2367
            {
2368
              create_insn (&mips16_nop_insn, mips16_opcodes + i);
2369
              mips16_nop_insn.fixed_p = 1;
2370
            }
2371
          ++i;
2372
        }
2373
      while (i < bfd_mips16_num_opcodes
2374
             && strcmp (mips16_opcodes[i].name, name) == 0);
2375
    }
2376
 
2377 160 khays
  micromips_op_hash = hash_new ();
2378
 
2379
  i = 0;
2380
  while (i < bfd_micromips_num_opcodes)
2381
    {
2382
      const char *name = micromips_opcodes[i].name;
2383
 
2384
      retval = hash_insert (micromips_op_hash, name,
2385
                            (void *) &micromips_opcodes[i]);
2386
      if (retval != NULL)
2387
        as_fatal (_("internal: can't hash `%s': %s"),
2388
                  micromips_opcodes[i].name, retval);
2389
      do
2390
        if (micromips_opcodes[i].pinfo != INSN_MACRO)
2391
          {
2392
            struct mips_cl_insn *micromips_nop_insn;
2393
 
2394
            if (!validate_micromips_insn (&micromips_opcodes[i]))
2395
              broken = 1;
2396
 
2397
            if (micromips_insn_length (micromips_opcodes + i) == 2)
2398
              micromips_nop_insn = &micromips_nop16_insn;
2399
            else if (micromips_insn_length (micromips_opcodes + i) == 4)
2400
              micromips_nop_insn = &micromips_nop32_insn;
2401
            else
2402
              continue;
2403
 
2404
            if (micromips_nop_insn->insn_mo == NULL
2405
                && strcmp (name, "nop") == 0)
2406
              {
2407
                create_insn (micromips_nop_insn, micromips_opcodes + i);
2408
                micromips_nop_insn->fixed_p = 1;
2409
              }
2410
          }
2411
      while (++i < bfd_micromips_num_opcodes
2412
             && strcmp (micromips_opcodes[i].name, name) == 0);
2413
    }
2414
 
2415 16 khays
  if (broken)
2416
    as_fatal (_("Broken assembler.  No assembly attempted."));
2417
 
2418
  /* We add all the general register names to the symbol table.  This
2419
     helps us detect invalid uses of them.  */
2420
  for (i = 0; reg_names[i].name; i++)
2421
    symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
2422
                                     reg_names[i].num, /* & RNUM_MASK, */
2423
                                     &zero_address_frag));
2424
  if (HAVE_NEWABI)
2425
    for (i = 0; reg_names_n32n64[i].name; i++)
2426
      symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
2427
                                       reg_names_n32n64[i].num, /* & RNUM_MASK, */
2428
                                       &zero_address_frag));
2429
  else
2430
    for (i = 0; reg_names_o32[i].name; i++)
2431
      symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
2432
                                       reg_names_o32[i].num, /* & RNUM_MASK, */
2433
                                       &zero_address_frag));
2434
 
2435
  mips_no_prev_insn ();
2436
 
2437
  mips_gprmask = 0;
2438
  mips_cprmask[0] = 0;
2439
  mips_cprmask[1] = 0;
2440
  mips_cprmask[2] = 0;
2441
  mips_cprmask[3] = 0;
2442
 
2443
  /* set the default alignment for the text section (2**2) */
2444
  record_alignment (text_section, 2);
2445
 
2446
  bfd_set_gp_size (stdoutput, g_switch_value);
2447
 
2448
#ifdef OBJ_ELF
2449
  if (IS_ELF)
2450
    {
2451
      /* On a native system other than VxWorks, sections must be aligned
2452
         to 16 byte boundaries.  When configured for an embedded ELF
2453
         target, we don't bother.  */
2454
      if (strncmp (TARGET_OS, "elf", 3) != 0
2455
          && strncmp (TARGET_OS, "vxworks", 7) != 0)
2456
        {
2457
          (void) bfd_set_section_alignment (stdoutput, text_section, 4);
2458
          (void) bfd_set_section_alignment (stdoutput, data_section, 4);
2459
          (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
2460
        }
2461
 
2462
      /* Create a .reginfo section for register masks and a .mdebug
2463
         section for debugging information.  */
2464
      {
2465
        segT seg;
2466
        subsegT subseg;
2467
        flagword flags;
2468
        segT sec;
2469
 
2470
        seg = now_seg;
2471
        subseg = now_subseg;
2472
 
2473
        /* The ABI says this section should be loaded so that the
2474
           running program can access it.  However, we don't load it
2475
           if we are configured for an embedded target */
2476
        flags = SEC_READONLY | SEC_DATA;
2477
        if (strncmp (TARGET_OS, "elf", 3) != 0)
2478
          flags |= SEC_ALLOC | SEC_LOAD;
2479
 
2480
        if (mips_abi != N64_ABI)
2481
          {
2482
            sec = subseg_new (".reginfo", (subsegT) 0);
2483
 
2484
            bfd_set_section_flags (stdoutput, sec, flags);
2485
            bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
2486
 
2487
            mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
2488
          }
2489
        else
2490
          {
2491
            /* The 64-bit ABI uses a .MIPS.options section rather than
2492
               .reginfo section.  */
2493
            sec = subseg_new (".MIPS.options", (subsegT) 0);
2494
            bfd_set_section_flags (stdoutput, sec, flags);
2495
            bfd_set_section_alignment (stdoutput, sec, 3);
2496
 
2497
            /* Set up the option header.  */
2498
            {
2499
              Elf_Internal_Options opthdr;
2500
              char *f;
2501
 
2502
              opthdr.kind = ODK_REGINFO;
2503
              opthdr.size = (sizeof (Elf_External_Options)
2504
                             + sizeof (Elf64_External_RegInfo));
2505
              opthdr.section = 0;
2506
              opthdr.info = 0;
2507
              f = frag_more (sizeof (Elf_External_Options));
2508
              bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
2509
                                             (Elf_External_Options *) f);
2510
 
2511
              mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
2512
            }
2513
          }
2514
 
2515
        if (ECOFF_DEBUGGING)
2516
          {
2517
            sec = subseg_new (".mdebug", (subsegT) 0);
2518
            (void) bfd_set_section_flags (stdoutput, sec,
2519
                                          SEC_HAS_CONTENTS | SEC_READONLY);
2520
            (void) bfd_set_section_alignment (stdoutput, sec, 2);
2521
          }
2522
        else if (mips_flag_pdr)
2523
          {
2524
            pdr_seg = subseg_new (".pdr", (subsegT) 0);
2525
            (void) bfd_set_section_flags (stdoutput, pdr_seg,
2526
                                          SEC_READONLY | SEC_RELOC
2527
                                          | SEC_DEBUGGING);
2528
            (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
2529
          }
2530
 
2531
        subseg_set (seg, subseg);
2532
      }
2533
    }
2534
#endif /* OBJ_ELF */
2535
 
2536
  if (! ECOFF_DEBUGGING)
2537
    md_obj_begin ();
2538
 
2539
  if (mips_fix_vr4120)
2540
    init_vr4120_conflicts ();
2541
}
2542
 
2543
void
2544
md_mips_end (void)
2545
{
2546 160 khays
  mips_emit_delays ();
2547 16 khays
  if (! ECOFF_DEBUGGING)
2548
    md_obj_end ();
2549
}
2550
 
2551
void
2552
md_assemble (char *str)
2553
{
2554
  struct mips_cl_insn insn;
2555
  bfd_reloc_code_real_type unused_reloc[3]
2556
    = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
2557
 
2558
  imm_expr.X_op = O_absent;
2559
  imm2_expr.X_op = O_absent;
2560
  offset_expr.X_op = O_absent;
2561
  imm_reloc[0] = BFD_RELOC_UNUSED;
2562
  imm_reloc[1] = BFD_RELOC_UNUSED;
2563
  imm_reloc[2] = BFD_RELOC_UNUSED;
2564
  offset_reloc[0] = BFD_RELOC_UNUSED;
2565
  offset_reloc[1] = BFD_RELOC_UNUSED;
2566
  offset_reloc[2] = BFD_RELOC_UNUSED;
2567
 
2568
  if (mips_opts.mips16)
2569
    mips16_ip (str, &insn);
2570
  else
2571
    {
2572
      mips_ip (str, &insn);
2573
      DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
2574
            str, insn.insn_opcode));
2575
    }
2576
 
2577
  if (insn_error)
2578
    {
2579
      as_bad ("%s `%s'", insn_error, str);
2580
      return;
2581
    }
2582
 
2583
  if (insn.insn_mo->pinfo == INSN_MACRO)
2584
    {
2585
      macro_start ();
2586
      if (mips_opts.mips16)
2587
        mips16_macro (&insn);
2588
      else
2589
        macro (&insn);
2590
      macro_end ();
2591
    }
2592
  else
2593
    {
2594
      if (imm_expr.X_op != O_absent)
2595 160 khays
        append_insn (&insn, &imm_expr, imm_reloc, FALSE);
2596 16 khays
      else if (offset_expr.X_op != O_absent)
2597 160 khays
        append_insn (&insn, &offset_expr, offset_reloc, FALSE);
2598 16 khays
      else
2599 160 khays
        append_insn (&insn, NULL, unused_reloc, FALSE);
2600 16 khays
    }
2601
}
2602
 
2603
/* Convenience functions for abstracting away the differences between
2604
   MIPS16 and non-MIPS16 relocations.  */
2605
 
2606
static inline bfd_boolean
2607
mips16_reloc_p (bfd_reloc_code_real_type reloc)
2608
{
2609
  switch (reloc)
2610
    {
2611
    case BFD_RELOC_MIPS16_JMP:
2612
    case BFD_RELOC_MIPS16_GPREL:
2613
    case BFD_RELOC_MIPS16_GOT16:
2614
    case BFD_RELOC_MIPS16_CALL16:
2615
    case BFD_RELOC_MIPS16_HI16_S:
2616
    case BFD_RELOC_MIPS16_HI16:
2617
    case BFD_RELOC_MIPS16_LO16:
2618
      return TRUE;
2619
 
2620
    default:
2621
      return FALSE;
2622
    }
2623
}
2624
 
2625
static inline bfd_boolean
2626 160 khays
micromips_reloc_p (bfd_reloc_code_real_type reloc)
2627
{
2628
  switch (reloc)
2629
    {
2630
    case BFD_RELOC_MICROMIPS_7_PCREL_S1:
2631
    case BFD_RELOC_MICROMIPS_10_PCREL_S1:
2632
    case BFD_RELOC_MICROMIPS_16_PCREL_S1:
2633
    case BFD_RELOC_MICROMIPS_GPREL16:
2634
    case BFD_RELOC_MICROMIPS_JMP:
2635
    case BFD_RELOC_MICROMIPS_HI16:
2636
    case BFD_RELOC_MICROMIPS_HI16_S:
2637
    case BFD_RELOC_MICROMIPS_LO16:
2638
    case BFD_RELOC_MICROMIPS_LITERAL:
2639
    case BFD_RELOC_MICROMIPS_GOT16:
2640
    case BFD_RELOC_MICROMIPS_CALL16:
2641
    case BFD_RELOC_MICROMIPS_GOT_HI16:
2642
    case BFD_RELOC_MICROMIPS_GOT_LO16:
2643
    case BFD_RELOC_MICROMIPS_CALL_HI16:
2644
    case BFD_RELOC_MICROMIPS_CALL_LO16:
2645
    case BFD_RELOC_MICROMIPS_SUB:
2646
    case BFD_RELOC_MICROMIPS_GOT_PAGE:
2647
    case BFD_RELOC_MICROMIPS_GOT_OFST:
2648
    case BFD_RELOC_MICROMIPS_GOT_DISP:
2649
    case BFD_RELOC_MICROMIPS_HIGHEST:
2650
    case BFD_RELOC_MICROMIPS_HIGHER:
2651
    case BFD_RELOC_MICROMIPS_SCN_DISP:
2652
    case BFD_RELOC_MICROMIPS_JALR:
2653
      return TRUE;
2654
 
2655
    default:
2656
      return FALSE;
2657
    }
2658
}
2659
 
2660
static inline bfd_boolean
2661
jmp_reloc_p (bfd_reloc_code_real_type reloc)
2662
{
2663
  return reloc == BFD_RELOC_MIPS_JMP || reloc == BFD_RELOC_MICROMIPS_JMP;
2664
}
2665
 
2666
static inline bfd_boolean
2667 16 khays
got16_reloc_p (bfd_reloc_code_real_type reloc)
2668
{
2669 160 khays
  return (reloc == BFD_RELOC_MIPS_GOT16 || reloc == BFD_RELOC_MIPS16_GOT16
2670
          || reloc == BFD_RELOC_MICROMIPS_GOT16);
2671 16 khays
}
2672
 
2673
static inline bfd_boolean
2674
hi16_reloc_p (bfd_reloc_code_real_type reloc)
2675
{
2676 160 khays
  return (reloc == BFD_RELOC_HI16_S || reloc == BFD_RELOC_MIPS16_HI16_S
2677
          || reloc == BFD_RELOC_MICROMIPS_HI16_S);
2678 16 khays
}
2679
 
2680
static inline bfd_boolean
2681
lo16_reloc_p (bfd_reloc_code_real_type reloc)
2682
{
2683 160 khays
  return (reloc == BFD_RELOC_LO16 || reloc == BFD_RELOC_MIPS16_LO16
2684
          || reloc == BFD_RELOC_MICROMIPS_LO16);
2685 16 khays
}
2686
 
2687 160 khays
static inline bfd_boolean
2688
jalr_reloc_p (bfd_reloc_code_real_type reloc)
2689
{
2690
  return reloc == BFD_RELOC_MIPS_JALR || reloc == BFD_RELOC_MICROMIPS_JALR;
2691
}
2692
 
2693 16 khays
/* Return true if the given relocation might need a matching %lo().
2694
   This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2695
   need a matching %lo() when applied to local symbols.  */
2696
 
2697
static inline bfd_boolean
2698
reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
2699
{
2700
  return (HAVE_IN_PLACE_ADDENDS
2701
          && (hi16_reloc_p (reloc)
2702
              /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2703
                 all GOT16 relocations evaluate to "G".  */
2704
              || (got16_reloc_p (reloc) && mips_pic != VXWORKS_PIC)));
2705
}
2706
 
2707
/* Return the type of %lo() reloc needed by RELOC, given that
2708
   reloc_needs_lo_p.  */
2709
 
2710
static inline bfd_reloc_code_real_type
2711
matching_lo_reloc (bfd_reloc_code_real_type reloc)
2712
{
2713 160 khays
  return (mips16_reloc_p (reloc) ? BFD_RELOC_MIPS16_LO16
2714
          : (micromips_reloc_p (reloc) ? BFD_RELOC_MICROMIPS_LO16
2715
             : BFD_RELOC_LO16));
2716 16 khays
}
2717
 
2718
/* Return true if the given fixup is followed by a matching R_MIPS_LO16
2719
   relocation.  */
2720
 
2721
static inline bfd_boolean
2722
fixup_has_matching_lo_p (fixS *fixp)
2723
{
2724
  return (fixp->fx_next != NULL
2725
          && fixp->fx_next->fx_r_type == matching_lo_reloc (fixp->fx_r_type)
2726
          && fixp->fx_addsy == fixp->fx_next->fx_addsy
2727
          && fixp->fx_offset == fixp->fx_next->fx_offset);
2728
}
2729
 
2730
/* This function returns true if modifying a register requires a
2731
   delay.  */
2732
 
2733
static int
2734
reg_needs_delay (unsigned int reg)
2735
{
2736
  unsigned long prev_pinfo;
2737
 
2738
  prev_pinfo = history[0].insn_mo->pinfo;
2739
  if (! mips_opts.noreorder
2740
      && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2741
           && ! gpr_interlocks)
2742
          || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2743
              && ! cop_interlocks)))
2744
    {
2745
      /* A load from a coprocessor or from memory.  All load delays
2746
         delay the use of general register rt for one instruction.  */
2747
      /* Itbl support may require additional care here.  */
2748
      know (prev_pinfo & INSN_WRITE_GPR_T);
2749 160 khays
      if (reg == EXTRACT_OPERAND (mips_opts.micromips, RT, history[0]))
2750 16 khays
        return 1;
2751
    }
2752
 
2753
  return 0;
2754
}
2755
 
2756
/* Move all labels in insn_labels to the current insertion point.  */
2757
 
2758
static void
2759
mips_move_labels (void)
2760
{
2761
  segment_info_type *si = seg_info (now_seg);
2762
  struct insn_label_list *l;
2763
  valueT val;
2764
 
2765
  for (l = si->label_list; l != NULL; l = l->next)
2766
    {
2767
      gas_assert (S_GET_SEGMENT (l->label) == now_seg);
2768
      symbol_set_frag (l->label, frag_now);
2769
      val = (valueT) frag_now_fix ();
2770 160 khays
      /* MIPS16/microMIPS text labels are stored as odd.  */
2771
      if (HAVE_CODE_COMPRESSION)
2772 16 khays
        ++val;
2773
      S_SET_VALUE (l->label, val);
2774
    }
2775
}
2776
 
2777
static bfd_boolean
2778
s_is_linkonce (symbolS *sym, segT from_seg)
2779
{
2780
  bfd_boolean linkonce = FALSE;
2781
  segT symseg = S_GET_SEGMENT (sym);
2782
 
2783
  if (symseg != from_seg && !S_IS_LOCAL (sym))
2784
    {
2785
      if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
2786
        linkonce = TRUE;
2787
#ifdef OBJ_ELF
2788
      /* The GNU toolchain uses an extension for ELF: a section
2789
         beginning with the magic string .gnu.linkonce is a
2790
         linkonce section.  */
2791
      if (strncmp (segment_name (symseg), ".gnu.linkonce",
2792
                   sizeof ".gnu.linkonce" - 1) == 0)
2793
        linkonce = TRUE;
2794
#endif
2795
    }
2796
  return linkonce;
2797
}
2798
 
2799 160 khays
/* Mark instruction labels in MIPS16/microMIPS mode.  This permits the
2800
   linker to handle them specially, such as generating jalx instructions
2801
   when needed.  We also make them odd for the duration of the assembly,
2802
   in order to generate the right sort of code.  We will make them even
2803 16 khays
   in the adjust_symtab routine, while leaving them marked.  This is
2804
   convenient for the debugger and the disassembler.  The linker knows
2805
   to make them odd again.  */
2806
 
2807
static void
2808 160 khays
mips_compressed_mark_labels (void)
2809 16 khays
{
2810
  segment_info_type *si = seg_info (now_seg);
2811
  struct insn_label_list *l;
2812
 
2813 160 khays
  gas_assert (HAVE_CODE_COMPRESSION);
2814 16 khays
 
2815
  for (l = si->label_list; l != NULL; l = l->next)
2816
   {
2817
      symbolS *label = l->label;
2818
 
2819
#if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
2820
      if (IS_ELF)
2821 160 khays
        {
2822
          if (mips_opts.mips16)
2823
            S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label)));
2824
          else
2825
            S_SET_OTHER (label, ELF_ST_SET_MICROMIPS (S_GET_OTHER (label)));
2826
        }
2827 16 khays
#endif
2828
      if ((S_GET_VALUE (label) & 1) == 0
2829
        /* Don't adjust the address if the label is global or weak, or
2830
           in a link-once section, since we'll be emitting symbol reloc
2831
           references to it which will be patched up by the linker, and
2832 160 khays
           the final value of the symbol may or may not be MIPS16/microMIPS.  */
2833 16 khays
          && ! S_IS_WEAK (label)
2834
          && ! S_IS_EXTERNAL (label)
2835
          && ! s_is_linkonce (label, now_seg))
2836
        S_SET_VALUE (label, S_GET_VALUE (label) | 1);
2837
    }
2838
}
2839
 
2840
/* End the current frag.  Make it a variant frag and record the
2841
   relaxation info.  */
2842
 
2843
static void
2844
relax_close_frag (void)
2845
{
2846
  mips_macro_warning.first_frag = frag_now;
2847
  frag_var (rs_machine_dependent, 0, 0,
2848
            RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
2849
            mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2850
 
2851
  memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2852
  mips_relax.first_fixup = 0;
2853
}
2854
 
2855
/* Start a new relaxation sequence whose expansion depends on SYMBOL.
2856
   See the comment above RELAX_ENCODE for more details.  */
2857
 
2858
static void
2859
relax_start (symbolS *symbol)
2860
{
2861
  gas_assert (mips_relax.sequence == 0);
2862
  mips_relax.sequence = 1;
2863
  mips_relax.symbol = symbol;
2864
}
2865
 
2866
/* Start generating the second version of a relaxable sequence.
2867
   See the comment above RELAX_ENCODE for more details.  */
2868
 
2869
static void
2870
relax_switch (void)
2871
{
2872
  gas_assert (mips_relax.sequence == 1);
2873
  mips_relax.sequence = 2;
2874
}
2875
 
2876
/* End the current relaxable sequence.  */
2877
 
2878
static void
2879
relax_end (void)
2880
{
2881
  gas_assert (mips_relax.sequence == 2);
2882
  relax_close_frag ();
2883
  mips_relax.sequence = 0;
2884
}
2885
 
2886 160 khays
/* Return true if IP is a delayed branch or jump.  */
2887
 
2888
static inline bfd_boolean
2889
delayed_branch_p (const struct mips_cl_insn *ip)
2890
{
2891
  return (ip->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2892
                                | INSN_COND_BRANCH_DELAY
2893
                                | INSN_COND_BRANCH_LIKELY)) != 0;
2894
}
2895
 
2896
/* Return true if IP is a compact branch or jump.  */
2897
 
2898
static inline bfd_boolean
2899
compact_branch_p (const struct mips_cl_insn *ip)
2900
{
2901
  if (mips_opts.mips16)
2902
    return (ip->insn_mo->pinfo & (MIPS16_INSN_UNCOND_BRANCH
2903
                                  | MIPS16_INSN_COND_BRANCH)) != 0;
2904
  else
2905
    return (ip->insn_mo->pinfo2 & (INSN2_UNCOND_BRANCH
2906
                                   | INSN2_COND_BRANCH)) != 0;
2907
}
2908
 
2909
/* Return true if IP is an unconditional branch or jump.  */
2910
 
2911
static inline bfd_boolean
2912
uncond_branch_p (const struct mips_cl_insn *ip)
2913
{
2914
  return ((ip->insn_mo->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0
2915
          || (mips_opts.mips16
2916
              ? (ip->insn_mo->pinfo & MIPS16_INSN_UNCOND_BRANCH) != 0
2917
              : (ip->insn_mo->pinfo2 & INSN2_UNCOND_BRANCH) != 0));
2918
}
2919
 
2920
/* Return true if IP is a branch-likely instruction.  */
2921
 
2922
static inline bfd_boolean
2923
branch_likely_p (const struct mips_cl_insn *ip)
2924
{
2925
  return (ip->insn_mo->pinfo & INSN_COND_BRANCH_LIKELY) != 0;
2926
}
2927
 
2928
/* Return the type of nop that should be used to fill the delay slot
2929
   of delayed branch IP.  */
2930
 
2931
static struct mips_cl_insn *
2932
get_delay_slot_nop (const struct mips_cl_insn *ip)
2933
{
2934
  if (mips_opts.micromips
2935
      && (ip->insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
2936
    return &micromips_nop32_insn;
2937
  return NOP_INSN;
2938
}
2939
 
2940
/* Return the mask of core registers that IP reads or writes.  */
2941
 
2942
static unsigned int
2943
gpr_mod_mask (const struct mips_cl_insn *ip)
2944
{
2945
  unsigned long pinfo2;
2946
  unsigned int mask;
2947
 
2948
  mask = 0;
2949
  pinfo2 = ip->insn_mo->pinfo2;
2950
  if (mips_opts.micromips)
2951
    {
2952
      if (pinfo2 & INSN2_MOD_GPR_MD)
2953
        mask |= 1 << micromips_to_32_reg_d_map[EXTRACT_OPERAND (1, MD, *ip)];
2954
      if (pinfo2 & INSN2_MOD_GPR_MF)
2955
        mask |= 1 << micromips_to_32_reg_f_map[EXTRACT_OPERAND (1, MF, *ip)];
2956
      if (pinfo2 & INSN2_MOD_SP)
2957
        mask |= 1 << SP;
2958
    }
2959
  return mask;
2960
}
2961
 
2962
/* Return the mask of core registers that IP reads.  */
2963
 
2964
static unsigned int
2965
gpr_read_mask (const struct mips_cl_insn *ip)
2966
{
2967
  unsigned long pinfo, pinfo2;
2968
  unsigned int mask;
2969
 
2970
  mask = gpr_mod_mask (ip);
2971
  pinfo = ip->insn_mo->pinfo;
2972
  pinfo2 = ip->insn_mo->pinfo2;
2973
  if (mips_opts.mips16)
2974
    {
2975
      if (pinfo & MIPS16_INSN_READ_X)
2976
        mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)];
2977
      if (pinfo & MIPS16_INSN_READ_Y)
2978
        mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)];
2979
      if (pinfo & MIPS16_INSN_READ_T)
2980
        mask |= 1 << TREG;
2981
      if (pinfo & MIPS16_INSN_READ_SP)
2982
        mask |= 1 << SP;
2983
      if (pinfo & MIPS16_INSN_READ_31)
2984
        mask |= 1 << RA;
2985
      if (pinfo & MIPS16_INSN_READ_Z)
2986
        mask |= 1 << (mips16_to_32_reg_map
2987
                      [MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]);
2988
      if (pinfo & MIPS16_INSN_READ_GPR_X)
2989
        mask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
2990
    }
2991
  else
2992
    {
2993
      if (pinfo2 & INSN2_READ_GPR_D)
2994
        mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
2995
      if (pinfo & INSN_READ_GPR_T)
2996
        mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
2997
      if (pinfo & INSN_READ_GPR_S)
2998
        mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
2999
      if (pinfo2 & INSN2_READ_GP)
3000
        mask |= 1 << GP;
3001
      if (pinfo2 & INSN2_READ_GPR_31)
3002
        mask |= 1 << RA;
3003
      if (pinfo2 & INSN2_READ_GPR_Z)
3004
        mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RZ, *ip);
3005
    }
3006
  if (mips_opts.micromips)
3007
    {
3008
      if (pinfo2 & INSN2_READ_GPR_MC)
3009
        mask |= 1 << micromips_to_32_reg_c_map[EXTRACT_OPERAND (1, MC, *ip)];
3010
      if (pinfo2 & INSN2_READ_GPR_ME)
3011
        mask |= 1 << micromips_to_32_reg_e_map[EXTRACT_OPERAND (1, ME, *ip)];
3012
      if (pinfo2 & INSN2_READ_GPR_MG)
3013
        mask |= 1 << micromips_to_32_reg_g_map[EXTRACT_OPERAND (1, MG, *ip)];
3014
      if (pinfo2 & INSN2_READ_GPR_MJ)
3015
        mask |= 1 << EXTRACT_OPERAND (1, MJ, *ip);
3016
      if (pinfo2 & INSN2_READ_GPR_MMN)
3017
        {
3018
          mask |= 1 << micromips_to_32_reg_m_map[EXTRACT_OPERAND (1, MM, *ip)];
3019
          mask |= 1 << micromips_to_32_reg_n_map[EXTRACT_OPERAND (1, MN, *ip)];
3020
        }
3021
      if (pinfo2 & INSN2_READ_GPR_MP)
3022
        mask |= 1 << EXTRACT_OPERAND (1, MP, *ip);
3023
      if (pinfo2 & INSN2_READ_GPR_MQ)
3024
        mask |= 1 << micromips_to_32_reg_q_map[EXTRACT_OPERAND (1, MQ, *ip)];
3025
    }
3026
  /* Don't include register 0.  */
3027
  return mask & ~1;
3028
}
3029
 
3030
/* Return the mask of core registers that IP writes.  */
3031
 
3032
static unsigned int
3033
gpr_write_mask (const struct mips_cl_insn *ip)
3034
{
3035
  unsigned long pinfo, pinfo2;
3036
  unsigned int mask;
3037
 
3038
  mask = gpr_mod_mask (ip);
3039
  pinfo = ip->insn_mo->pinfo;
3040
  pinfo2 = ip->insn_mo->pinfo2;
3041
  if (mips_opts.mips16)
3042
    {
3043
      if (pinfo & MIPS16_INSN_WRITE_X)
3044
        mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)];
3045
      if (pinfo & MIPS16_INSN_WRITE_Y)
3046
        mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)];
3047
      if (pinfo & MIPS16_INSN_WRITE_Z)
3048
        mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RZ, *ip)];
3049
      if (pinfo & MIPS16_INSN_WRITE_T)
3050
        mask |= 1 << TREG;
3051
      if (pinfo & MIPS16_INSN_WRITE_SP)
3052
        mask |= 1 << SP;
3053
      if (pinfo & MIPS16_INSN_WRITE_31)
3054
        mask |= 1 << RA;
3055
      if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
3056
        mask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
3057
    }
3058
  else
3059
    {
3060
      if (pinfo & INSN_WRITE_GPR_D)
3061
        mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
3062
      if (pinfo & INSN_WRITE_GPR_T)
3063
        mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
3064
      if (pinfo & INSN_WRITE_GPR_S)
3065
        mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
3066
      if (pinfo & INSN_WRITE_GPR_31)
3067
        mask |= 1 << RA;
3068
      if (pinfo2 & INSN2_WRITE_GPR_Z)
3069
        mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, RZ, *ip);
3070
    }
3071
  if (mips_opts.micromips)
3072
    {
3073
      if (pinfo2 & INSN2_WRITE_GPR_MB)
3074
        mask |= 1 << micromips_to_32_reg_b_map[EXTRACT_OPERAND (1, MB, *ip)];
3075
      if (pinfo2 & INSN2_WRITE_GPR_MHI)
3076
        {
3077
          mask |= 1 << micromips_to_32_reg_h_map[EXTRACT_OPERAND (1, MH, *ip)];
3078
          mask |= 1 << micromips_to_32_reg_i_map[EXTRACT_OPERAND (1, MI, *ip)];
3079
        }
3080
      if (pinfo2 & INSN2_WRITE_GPR_MJ)
3081
        mask |= 1 << EXTRACT_OPERAND (1, MJ, *ip);
3082
      if (pinfo2 & INSN2_WRITE_GPR_MP)
3083
        mask |= 1 << EXTRACT_OPERAND (1, MP, *ip);
3084
    }
3085
  /* Don't include register 0.  */
3086
  return mask & ~1;
3087
}
3088
 
3089
/* Return the mask of floating-point registers that IP reads.  */
3090
 
3091
static unsigned int
3092
fpr_read_mask (const struct mips_cl_insn *ip)
3093
{
3094
  unsigned long pinfo, pinfo2;
3095
  unsigned int mask;
3096
 
3097
  mask = 0;
3098
  pinfo = ip->insn_mo->pinfo;
3099
  pinfo2 = ip->insn_mo->pinfo2;
3100
  if (!mips_opts.mips16)
3101
    {
3102
      if (pinfo2 & INSN2_READ_FPR_D)
3103
        mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FD, *ip);
3104
      if (pinfo & INSN_READ_FPR_S)
3105
        mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FS, *ip);
3106
      if (pinfo & INSN_READ_FPR_T)
3107
        mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FT, *ip);
3108
      if (pinfo & INSN_READ_FPR_R)
3109
        mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FR, *ip);
3110
      if (pinfo2 & INSN2_READ_FPR_Z)
3111
        mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FZ, *ip);
3112
    }
3113
  /* Conservatively treat all operands to an FP_D instruction are doubles.
3114
     (This is overly pessimistic for things like cvt.d.s.)  */
3115
  if (HAVE_32BIT_FPRS && (pinfo & FP_D))
3116
    mask |= mask << 1;
3117
  return mask;
3118
}
3119
 
3120
/* Return the mask of floating-point registers that IP writes.  */
3121
 
3122
static unsigned int
3123
fpr_write_mask (const struct mips_cl_insn *ip)
3124
{
3125
  unsigned long pinfo, pinfo2;
3126
  unsigned int mask;
3127
 
3128
  mask = 0;
3129
  pinfo = ip->insn_mo->pinfo;
3130
  pinfo2 = ip->insn_mo->pinfo2;
3131
  if (!mips_opts.mips16)
3132
    {
3133
      if (pinfo & INSN_WRITE_FPR_D)
3134
        mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FD, *ip);
3135
      if (pinfo & INSN_WRITE_FPR_S)
3136
        mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FS, *ip);
3137
      if (pinfo & INSN_WRITE_FPR_T)
3138
        mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FT, *ip);
3139
      if (pinfo2 & INSN2_WRITE_FPR_Z)
3140
        mask |= 1 << EXTRACT_OPERAND (mips_opts.micromips, FZ, *ip);
3141
    }
3142
  /* Conservatively treat all operands to an FP_D instruction are doubles.
3143
     (This is overly pessimistic for things like cvt.s.d.)  */
3144
  if (HAVE_32BIT_FPRS && (pinfo & FP_D))
3145
    mask |= mask << 1;
3146
  return mask;
3147
}
3148
 
3149 16 khays
/* Classify an instruction according to the FIX_VR4120_* enumeration.
3150
   Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
3151
   by VR4120 errata.  */
3152
 
3153
static unsigned int
3154
classify_vr4120_insn (const char *name)
3155
{
3156
  if (strncmp (name, "macc", 4) == 0)
3157
    return FIX_VR4120_MACC;
3158
  if (strncmp (name, "dmacc", 5) == 0)
3159
    return FIX_VR4120_DMACC;
3160
  if (strncmp (name, "mult", 4) == 0)
3161
    return FIX_VR4120_MULT;
3162
  if (strncmp (name, "dmult", 5) == 0)
3163
    return FIX_VR4120_DMULT;
3164
  if (strstr (name, "div"))
3165
    return FIX_VR4120_DIV;
3166
  if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
3167
    return FIX_VR4120_MTHILO;
3168
  return NUM_FIX_VR4120_CLASSES;
3169
}
3170
 
3171
#define INSN_ERET  0x42000018
3172
#define INSN_DERET 0x4200001f
3173
 
3174
/* Return the number of instructions that must separate INSN1 and INSN2,
3175
   where INSN1 is the earlier instruction.  Return the worst-case value
3176
   for any INSN2 if INSN2 is null.  */
3177
 
3178
static unsigned int
3179
insns_between (const struct mips_cl_insn *insn1,
3180
               const struct mips_cl_insn *insn2)
3181
{
3182
  unsigned long pinfo1, pinfo2;
3183 160 khays
  unsigned int mask;
3184 16 khays
 
3185
  /* This function needs to know which pinfo flags are set for INSN2
3186
     and which registers INSN2 uses.  The former is stored in PINFO2 and
3187 160 khays
     the latter is tested via INSN2_USES_GPR.  If INSN2 is null, PINFO2
3188
     will have every flag set and INSN2_USES_GPR will always return true.  */
3189 16 khays
  pinfo1 = insn1->insn_mo->pinfo;
3190
  pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
3191
 
3192 160 khays
#define INSN2_USES_GPR(REG) \
3193
  (insn2 == NULL || (gpr_read_mask (insn2) & (1U << (REG))) != 0)
3194 16 khays
 
3195
  /* For most targets, write-after-read dependencies on the HI and LO
3196
     registers must be separated by at least two instructions.  */
3197
  if (!hilo_interlocks)
3198
    {
3199
      if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
3200
        return 2;
3201
      if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
3202
        return 2;
3203
    }
3204
 
3205
  /* If we're working around r7000 errata, there must be two instructions
3206
     between an mfhi or mflo and any instruction that uses the result.  */
3207
  if (mips_7000_hilo_fix
3208 160 khays
      && !mips_opts.micromips
3209 16 khays
      && MF_HILO_INSN (pinfo1)
3210 160 khays
      && INSN2_USES_GPR (EXTRACT_OPERAND (0, RD, *insn1)))
3211 16 khays
    return 2;
3212
 
3213
  /* If we're working around 24K errata, one instruction is required
3214
     if an ERET or DERET is followed by a branch instruction.  */
3215 160 khays
  if (mips_fix_24k && !mips_opts.micromips)
3216 16 khays
    {
3217
      if (insn1->insn_opcode == INSN_ERET
3218
          || insn1->insn_opcode == INSN_DERET)
3219
        {
3220
          if (insn2 == NULL
3221
              || insn2->insn_opcode == INSN_ERET
3222
              || insn2->insn_opcode == INSN_DERET
3223 160 khays
              || delayed_branch_p (insn2))
3224 16 khays
            return 1;
3225
        }
3226
    }
3227
 
3228
  /* If working around VR4120 errata, check for combinations that need
3229
     a single intervening instruction.  */
3230 160 khays
  if (mips_fix_vr4120 && !mips_opts.micromips)
3231 16 khays
    {
3232
      unsigned int class1, class2;
3233
 
3234
      class1 = classify_vr4120_insn (insn1->insn_mo->name);
3235
      if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
3236
        {
3237
          if (insn2 == NULL)
3238
            return 1;
3239
          class2 = classify_vr4120_insn (insn2->insn_mo->name);
3240
          if (vr4120_conflicts[class1] & (1 << class2))
3241
            return 1;
3242
        }
3243
    }
3244
 
3245 160 khays
  if (!HAVE_CODE_COMPRESSION)
3246 16 khays
    {
3247
      /* Check for GPR or coprocessor load delays.  All such delays
3248
         are on the RT register.  */
3249
      /* Itbl support may require additional care here.  */
3250
      if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
3251
          || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
3252
        {
3253
          know (pinfo1 & INSN_WRITE_GPR_T);
3254 160 khays
          if (INSN2_USES_GPR (EXTRACT_OPERAND (0, RT, *insn1)))
3255 16 khays
            return 1;
3256
        }
3257
 
3258
      /* Check for generic coprocessor hazards.
3259
 
3260
         This case is not handled very well.  There is no special
3261
         knowledge of CP0 handling, and the coprocessors other than
3262
         the floating point unit are not distinguished at all.  */
3263
      /* Itbl support may require additional care here. FIXME!
3264
         Need to modify this to include knowledge about
3265
         user specified delays!  */
3266
      else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
3267
               || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
3268
        {
3269
          /* Handle cases where INSN1 writes to a known general coprocessor
3270
             register.  There must be a one instruction delay before INSN2
3271
             if INSN2 reads that register, otherwise no delay is needed.  */
3272 160 khays
          mask = fpr_write_mask (insn1);
3273
          if (mask != 0)
3274 16 khays
            {
3275 160 khays
              if (!insn2 || (mask & fpr_read_mask (insn2)) != 0)
3276 16 khays
                return 1;
3277
            }
3278
          else
3279
            {
3280
              /* Read-after-write dependencies on the control registers
3281
                 require a two-instruction gap.  */
3282
              if ((pinfo1 & INSN_WRITE_COND_CODE)
3283
                  && (pinfo2 & INSN_READ_COND_CODE))
3284
                return 2;
3285
 
3286
              /* We don't know exactly what INSN1 does.  If INSN2 is
3287
                 also a coprocessor instruction, assume there must be
3288
                 a one instruction gap.  */
3289
              if (pinfo2 & INSN_COP)
3290
                return 1;
3291
            }
3292
        }
3293
 
3294
      /* Check for read-after-write dependencies on the coprocessor
3295
         control registers in cases where INSN1 does not need a general
3296
         coprocessor delay.  This means that INSN1 is a floating point
3297
         comparison instruction.  */
3298
      /* Itbl support may require additional care here.  */
3299
      else if (!cop_interlocks
3300
               && (pinfo1 & INSN_WRITE_COND_CODE)
3301
               && (pinfo2 & INSN_READ_COND_CODE))
3302
        return 1;
3303
    }
3304
 
3305 160 khays
#undef INSN2_USES_GPR
3306 16 khays
 
3307
  return 0;
3308
}
3309
 
3310
/* Return the number of nops that would be needed to work around the
3311
   VR4130 mflo/mfhi errata if instruction INSN immediately followed
3312 160 khays
   the MAX_VR4130_NOPS instructions described by HIST.  Ignore hazards
3313
   that are contained within the first IGNORE instructions of HIST.  */
3314 16 khays
 
3315
static int
3316 160 khays
nops_for_vr4130 (int ignore, const struct mips_cl_insn *hist,
3317 16 khays
                 const struct mips_cl_insn *insn)
3318
{
3319 160 khays
  int i, j;
3320
  unsigned int mask;
3321 16 khays
 
3322
  /* Check if the instruction writes to HI or LO.  MTHI and MTLO
3323
     are not affected by the errata.  */
3324
  if (insn != 0
3325
      && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
3326
          || strcmp (insn->insn_mo->name, "mtlo") == 0
3327
          || strcmp (insn->insn_mo->name, "mthi") == 0))
3328
    return 0;
3329
 
3330
  /* Search for the first MFLO or MFHI.  */
3331
  for (i = 0; i < MAX_VR4130_NOPS; i++)
3332
    if (MF_HILO_INSN (hist[i].insn_mo->pinfo))
3333
      {
3334
        /* Extract the destination register.  */
3335 160 khays
        mask = gpr_write_mask (&hist[i]);
3336 16 khays
 
3337
        /* No nops are needed if INSN reads that register.  */
3338 160 khays
        if (insn != NULL && (gpr_read_mask (insn) & mask) != 0)
3339 16 khays
          return 0;
3340
 
3341
        /* ...or if any of the intervening instructions do.  */
3342
        for (j = 0; j < i; j++)
3343 160 khays
          if (gpr_read_mask (&hist[j]) & mask)
3344 16 khays
            return 0;
3345
 
3346 160 khays
        if (i >= ignore)
3347
          return MAX_VR4130_NOPS - i;
3348 16 khays
      }
3349
  return 0;
3350
}
3351
 
3352
#define BASE_REG_EQ(INSN1, INSN2)       \
3353
  ((((INSN1) >> OP_SH_RS) & OP_MASK_RS) \
3354
      == (((INSN2) >> OP_SH_RS) & OP_MASK_RS))
3355
 
3356
/* Return the minimum alignment for this store instruction.  */
3357
 
3358
static int
3359
fix_24k_align_to (const struct mips_opcode *mo)
3360
{
3361
  if (strcmp (mo->name, "sh") == 0)
3362
    return 2;
3363
 
3364
  if (strcmp (mo->name, "swc1") == 0
3365
      || strcmp (mo->name, "swc2") == 0
3366
      || strcmp (mo->name, "sw") == 0
3367
      || strcmp (mo->name, "sc") == 0
3368
      || strcmp (mo->name, "s.s") == 0)
3369
    return 4;
3370
 
3371
  if (strcmp (mo->name, "sdc1") == 0
3372
      || strcmp (mo->name, "sdc2") == 0
3373
      || strcmp (mo->name, "s.d") == 0)
3374
    return 8;
3375
 
3376
  /* sb, swl, swr */
3377
  return 1;
3378
}
3379
 
3380
struct fix_24k_store_info
3381
  {
3382
    /* Immediate offset, if any, for this store instruction.  */
3383
    short off;
3384
    /* Alignment required by this store instruction.  */
3385
    int align_to;
3386
    /* True for register offsets.  */
3387
    int register_offset;
3388
  };
3389
 
3390
/* Comparison function used by qsort.  */
3391
 
3392
static int
3393
fix_24k_sort (const void *a, const void *b)
3394
{
3395
  const struct fix_24k_store_info *pos1 = a;
3396
  const struct fix_24k_store_info *pos2 = b;
3397
 
3398
  return (pos1->off - pos2->off);
3399
}
3400
 
3401
/* INSN is a store instruction.  Try to record the store information
3402
   in STINFO.  Return false if the information isn't known.  */
3403
 
3404
static bfd_boolean
3405
fix_24k_record_store_info (struct fix_24k_store_info *stinfo,
3406 160 khays
                           const struct mips_cl_insn *insn)
3407 16 khays
{
3408
  /* The instruction must have a known offset.  */
3409
  if (!insn->complete_p || !strstr (insn->insn_mo->args, "o("))
3410
    return FALSE;
3411
 
3412
  stinfo->off = (insn->insn_opcode >> OP_SH_IMMEDIATE) & OP_MASK_IMMEDIATE;
3413
  stinfo->align_to = fix_24k_align_to (insn->insn_mo);
3414
  return TRUE;
3415
}
3416
 
3417 160 khays
/* Return the number of nops that would be needed to work around the 24k
3418
   "lost data on stores during refill" errata if instruction INSN
3419
   immediately followed the 2 instructions described by HIST.
3420
   Ignore hazards that are contained within the first IGNORE
3421
   instructions of HIST.
3422 16 khays
 
3423 160 khays
   Problem: The FSB (fetch store buffer) acts as an intermediate buffer
3424
   for the data cache refills and store data. The following describes
3425
   the scenario where the store data could be lost.
3426
 
3427
   * A data cache miss, due to either a load or a store, causing fill
3428
     data to be supplied by the memory subsystem
3429
   * The first three doublewords of fill data are returned and written
3430
     into the cache
3431
   * A sequence of four stores occurs in consecutive cycles around the
3432
     final doubleword of the fill:
3433
   * Store A
3434
   * Store B
3435
   * Store C
3436
   * Zero, One or more instructions
3437
   * Store D
3438
 
3439
   The four stores A-D must be to different doublewords of the line that
3440
   is being filled. The fourth instruction in the sequence above permits
3441
   the fill of the final doubleword to be transferred from the FSB into
3442
   the cache. In the sequence above, the stores may be either integer
3443
   (sb, sh, sw, swr, swl, sc) or coprocessor (swc1/swc2, sdc1/sdc2,
3444
   swxc1, sdxc1, suxc1) stores, as long as the four stores are to
3445
   different doublewords on the line. If the floating point unit is
3446
   running in 1:2 mode, it is not possible to create the sequence above
3447
   using only floating point store instructions.
3448
 
3449 16 khays
   In this case, the cache line being filled is incorrectly marked
3450
   invalid, thereby losing the data from any store to the line that
3451
   occurs between the original miss and the completion of the five
3452
   cycle sequence shown above.
3453
 
3454 160 khays
   The workarounds are:
3455 16 khays
 
3456 160 khays
   * Run the data cache in write-through mode.
3457
   * Insert a non-store instruction between
3458
     Store A and Store B or Store B and Store C.  */
3459 16 khays
 
3460
static int
3461 160 khays
nops_for_24k (int ignore, const struct mips_cl_insn *hist,
3462 16 khays
              const struct mips_cl_insn *insn)
3463
{
3464
  struct fix_24k_store_info pos[3];
3465
  int align, i, base_offset;
3466
 
3467 160 khays
  if (ignore >= 2)
3468 16 khays
    return 0;
3469
 
3470 160 khays
  /* If the previous instruction wasn't a store, there's nothing to
3471
     worry about.  */
3472 16 khays
  if ((hist[0].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
3473
    return 0;
3474
 
3475 160 khays
  /* If the instructions after the previous one are unknown, we have
3476
     to assume the worst.  */
3477
  if (!insn)
3478 16 khays
    return 1;
3479
 
3480 160 khays
  /* Check whether we are dealing with three consecutive stores.  */
3481
  if ((insn->insn_mo->pinfo & INSN_STORE_MEMORY) == 0
3482
      || (hist[1].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
3483 16 khays
    return 0;
3484
 
3485
  /* If we don't know the relationship between the store addresses,
3486
     assume the worst.  */
3487 160 khays
  if (!BASE_REG_EQ (insn->insn_opcode, hist[0].insn_opcode)
3488 16 khays
      || !BASE_REG_EQ (insn->insn_opcode, hist[1].insn_opcode))
3489
    return 1;
3490
 
3491
  if (!fix_24k_record_store_info (&pos[0], insn)
3492
      || !fix_24k_record_store_info (&pos[1], &hist[0])
3493
      || !fix_24k_record_store_info (&pos[2], &hist[1]))
3494
    return 1;
3495
 
3496
  qsort (&pos, 3, sizeof (struct fix_24k_store_info), fix_24k_sort);
3497
 
3498
  /* Pick a value of ALIGN and X such that all offsets are adjusted by
3499
     X bytes and such that the base register + X is known to be aligned
3500
     to align bytes.  */
3501
 
3502
  if (((insn->insn_opcode >> OP_SH_RS) & OP_MASK_RS) == SP)
3503
    align = 8;
3504
  else
3505
    {
3506
      align = pos[0].align_to;
3507
      base_offset = pos[0].off;
3508
      for (i = 1; i < 3; i++)
3509
        if (align < pos[i].align_to)
3510
          {
3511
            align = pos[i].align_to;
3512
            base_offset = pos[i].off;
3513
          }
3514
      for (i = 0; i < 3; i++)
3515
        pos[i].off -= base_offset;
3516
    }
3517
 
3518
  pos[0].off &= ~align + 1;
3519
  pos[1].off &= ~align + 1;
3520
  pos[2].off &= ~align + 1;
3521
 
3522
  /* If any two stores write to the same chunk, they also write to the
3523
     same doubleword.  The offsets are still sorted at this point.  */
3524
  if (pos[0].off == pos[1].off || pos[1].off == pos[2].off)
3525
    return 0;
3526
 
3527
  /* A range of at least 9 bytes is needed for the stores to be in
3528
     non-overlapping doublewords.  */
3529
  if (pos[2].off - pos[0].off <= 8)
3530
    return 0;
3531
 
3532
  if (pos[2].off - pos[1].off >= 24
3533
      || pos[1].off - pos[0].off >= 24
3534
      || pos[2].off - pos[0].off >= 32)
3535
    return 0;
3536
 
3537
  return 1;
3538
}
3539
 
3540
/* Return the number of nops that would be needed if instruction INSN
3541
   immediately followed the MAX_NOPS instructions given by HIST,
3542 160 khays
   where HIST[0] is the most recent instruction.  Ignore hazards
3543
   between INSN and the first IGNORE instructions in HIST.
3544 16 khays
 
3545 160 khays
   If INSN is null, return the worse-case number of nops for any
3546
   instruction.  */
3547
 
3548 16 khays
static int
3549 160 khays
nops_for_insn (int ignore, const struct mips_cl_insn *hist,
3550 16 khays
               const struct mips_cl_insn *insn)
3551
{
3552
  int i, nops, tmp_nops;
3553
 
3554
  nops = 0;
3555 160 khays
  for (i = ignore; i < MAX_DELAY_NOPS; i++)
3556 16 khays
    {
3557
      tmp_nops = insns_between (hist + i, insn) - i;
3558
      if (tmp_nops > nops)
3559
        nops = tmp_nops;
3560
    }
3561
 
3562 160 khays
  if (mips_fix_vr4130 && !mips_opts.micromips)
3563 16 khays
    {
3564 160 khays
      tmp_nops = nops_for_vr4130 (ignore, hist, insn);
3565 16 khays
      if (tmp_nops > nops)
3566
        nops = tmp_nops;
3567
    }
3568
 
3569 160 khays
  if (mips_fix_24k && !mips_opts.micromips)
3570 16 khays
    {
3571 160 khays
      tmp_nops = nops_for_24k (ignore, hist, insn);
3572 16 khays
      if (tmp_nops > nops)
3573
        nops = tmp_nops;
3574
    }
3575
 
3576
  return nops;
3577
}
3578
 
3579
/* The variable arguments provide NUM_INSNS extra instructions that
3580
   might be added to HIST.  Return the largest number of nops that
3581 160 khays
   would be needed after the extended sequence, ignoring hazards
3582
   in the first IGNORE instructions.  */
3583 16 khays
 
3584
static int
3585 160 khays
nops_for_sequence (int num_insns, int ignore,
3586
                   const struct mips_cl_insn *hist, ...)
3587 16 khays
{
3588
  va_list args;
3589
  struct mips_cl_insn buffer[MAX_NOPS];
3590
  struct mips_cl_insn *cursor;
3591
  int nops;
3592
 
3593
  va_start (args, hist);
3594
  cursor = buffer + num_insns;
3595
  memcpy (cursor, hist, (MAX_NOPS - num_insns) * sizeof (*cursor));
3596
  while (cursor > buffer)
3597
    *--cursor = *va_arg (args, const struct mips_cl_insn *);
3598
 
3599 160 khays
  nops = nops_for_insn (ignore, buffer, NULL);
3600 16 khays
  va_end (args);
3601
  return nops;
3602
}
3603
 
3604
/* Like nops_for_insn, but if INSN is a branch, take into account the
3605
   worst-case delay for the branch target.  */
3606
 
3607
static int
3608 160 khays
nops_for_insn_or_target (int ignore, const struct mips_cl_insn *hist,
3609 16 khays
                         const struct mips_cl_insn *insn)
3610
{
3611
  int nops, tmp_nops;
3612
 
3613 160 khays
  nops = nops_for_insn (ignore, hist, insn);
3614
  if (delayed_branch_p (insn))
3615 16 khays
    {
3616 160 khays
      tmp_nops = nops_for_sequence (2, ignore ? ignore + 2 : 0,
3617
                                    hist, insn, get_delay_slot_nop (insn));
3618 16 khays
      if (tmp_nops > nops)
3619
        nops = tmp_nops;
3620
    }
3621 160 khays
  else if (compact_branch_p (insn))
3622 16 khays
    {
3623 160 khays
      tmp_nops = nops_for_sequence (1, ignore ? ignore + 1 : 0, hist, insn);
3624 16 khays
      if (tmp_nops > nops)
3625
        nops = tmp_nops;
3626
    }
3627
  return nops;
3628
}
3629
 
3630
/* Fix NOP issue: Replace nops by "or at,at,zero".  */
3631
 
3632
static void
3633
fix_loongson2f_nop (struct mips_cl_insn * ip)
3634
{
3635 160 khays
  gas_assert (!HAVE_CODE_COMPRESSION);
3636 16 khays
  if (strcmp (ip->insn_mo->name, "nop") == 0)
3637
    ip->insn_opcode = LOONGSON2F_NOP_INSN;
3638
}
3639
 
3640
/* Fix Jump Issue: Eliminate instruction fetch from outside 256M region
3641
                   jr target pc &= 'hffff_ffff_cfff_ffff.  */
3642
 
3643
static void
3644
fix_loongson2f_jump (struct mips_cl_insn * ip)
3645
{
3646 160 khays
  gas_assert (!HAVE_CODE_COMPRESSION);
3647 16 khays
  if (strcmp (ip->insn_mo->name, "j") == 0
3648
      || strcmp (ip->insn_mo->name, "jr") == 0
3649
      || strcmp (ip->insn_mo->name, "jalr") == 0)
3650
    {
3651
      int sreg;
3652
      expressionS ep;
3653
 
3654
      if (! mips_opts.at)
3655
        return;
3656
 
3657 160 khays
      sreg = EXTRACT_OPERAND (0, RS, *ip);
3658 16 khays
      if (sreg == ZERO || sreg == KT0 || sreg == KT1 || sreg == ATREG)
3659
        return;
3660
 
3661
      ep.X_op = O_constant;
3662
      ep.X_add_number = 0xcfff0000;
3663
      macro_build (&ep, "lui", "t,u", ATREG, BFD_RELOC_HI16);
3664
      ep.X_add_number = 0xffff;
3665
      macro_build (&ep, "ori", "t,r,i", ATREG, ATREG, BFD_RELOC_LO16);
3666
      macro_build (NULL, "and", "d,v,t", sreg, sreg, ATREG);
3667
    }
3668
}
3669
 
3670
static void
3671
fix_loongson2f (struct mips_cl_insn * ip)
3672
{
3673
  if (mips_fix_loongson2f_nop)
3674
    fix_loongson2f_nop (ip);
3675
 
3676
  if (mips_fix_loongson2f_jump)
3677
    fix_loongson2f_jump (ip);
3678
}
3679
 
3680 160 khays
/* IP is a branch that has a delay slot, and we need to fill it
3681
   automatically.   Return true if we can do that by swapping IP
3682
   with the previous instruction.  */
3683
 
3684
static bfd_boolean
3685
can_swap_branch_p (struct mips_cl_insn *ip)
3686
{
3687
  unsigned long pinfo, pinfo2, prev_pinfo, prev_pinfo2;
3688
  unsigned int gpr_read, gpr_write, prev_gpr_read, prev_gpr_write;
3689
 
3690
  /* -O2 and above is required for this optimization.  */
3691
  if (mips_optimize < 2)
3692
    return FALSE;
3693
 
3694
  /* If we have seen .set volatile or .set nomove, don't optimize.  */
3695
  if (mips_opts.nomove)
3696
    return FALSE;
3697
 
3698
  /* We can't swap if the previous instruction's position is fixed.  */
3699
  if (history[0].fixed_p)
3700
    return FALSE;
3701
 
3702
  /* If the previous previous insn was in a .set noreorder, we can't
3703
     swap.  Actually, the MIPS assembler will swap in this situation.
3704
     However, gcc configured -with-gnu-as will generate code like
3705
 
3706
        .set    noreorder
3707
        lw      $4,XXX
3708
        .set    reorder
3709
        INSN
3710
        bne     $4,$0,foo
3711
 
3712
     in which we can not swap the bne and INSN.  If gcc is not configured
3713
     -with-gnu-as, it does not output the .set pseudo-ops.  */
3714
  if (history[1].noreorder_p)
3715
    return FALSE;
3716
 
3717
  /* If the previous instruction had a fixup in mips16 mode, we can not swap.
3718
     This means that the previous instruction was a 4-byte one anyhow.  */
3719
  if (mips_opts.mips16 && history[0].fixp[0])
3720
    return FALSE;
3721
 
3722
  /* If the branch is itself the target of a branch, we can not swap.
3723
     We cheat on this; all we check for is whether there is a label on
3724
     this instruction.  If there are any branches to anything other than
3725
     a label, users must use .set noreorder.  */
3726
  if (seg_info (now_seg)->label_list)
3727
    return FALSE;
3728
 
3729
  /* If the previous instruction is in a variant frag other than this
3730
     branch's one, we cannot do the swap.  This does not apply to
3731 163 khays
     MIPS16 code, which uses variant frags for different purposes.  */
3732
  if (!mips_opts.mips16
3733 160 khays
      && history[0].frag
3734
      && history[0].frag->fr_type == rs_machine_dependent)
3735
    return FALSE;
3736
 
3737
  /* We do not swap with instructions that cannot architecturally
3738
     be placed in a branch delay slot, such as SYNC or ERET.  We
3739
     also refrain from swapping with a trap instruction, since it
3740
     complicates trap handlers to have the trap instruction be in
3741
     a delay slot.  */
3742
  prev_pinfo = history[0].insn_mo->pinfo;
3743
  if (prev_pinfo & INSN_NO_DELAY_SLOT)
3744
    return FALSE;
3745
 
3746
  /* Check for conflicts between the branch and the instructions
3747
     before the candidate delay slot.  */
3748
  if (nops_for_insn (0, history + 1, ip) > 0)
3749
    return FALSE;
3750
 
3751
  /* Check for conflicts between the swapped sequence and the
3752
     target of the branch.  */
3753
  if (nops_for_sequence (2, 0, history + 1, ip, history) > 0)
3754
    return FALSE;
3755
 
3756
  /* If the branch reads a register that the previous
3757
     instruction sets, we can not swap.  */
3758
  gpr_read = gpr_read_mask (ip);
3759
  prev_gpr_write = gpr_write_mask (&history[0]);
3760
  if (gpr_read & prev_gpr_write)
3761
    return FALSE;
3762
 
3763
  /* If the branch writes a register that the previous
3764
     instruction sets, we can not swap.  */
3765
  gpr_write = gpr_write_mask (ip);
3766
  if (gpr_write & prev_gpr_write)
3767
    return FALSE;
3768
 
3769
  /* If the branch writes a register that the previous
3770
     instruction reads, we can not swap.  */
3771
  prev_gpr_read = gpr_read_mask (&history[0]);
3772
  if (gpr_write & prev_gpr_read)
3773
    return FALSE;
3774
 
3775
  /* If one instruction sets a condition code and the
3776
     other one uses a condition code, we can not swap.  */
3777
  pinfo = ip->insn_mo->pinfo;
3778
  if ((pinfo & INSN_READ_COND_CODE)
3779
      && (prev_pinfo & INSN_WRITE_COND_CODE))
3780
    return FALSE;
3781
  if ((pinfo & INSN_WRITE_COND_CODE)
3782
      && (prev_pinfo & INSN_READ_COND_CODE))
3783
    return FALSE;
3784
 
3785
  /* If the previous instruction uses the PC, we can not swap.  */
3786
  prev_pinfo2 = history[0].insn_mo->pinfo2;
3787
  if (mips_opts.mips16 && (prev_pinfo & MIPS16_INSN_READ_PC))
3788
    return FALSE;
3789
  if (mips_opts.micromips && (prev_pinfo2 & INSN2_READ_PC))
3790
    return FALSE;
3791
 
3792
  /* If the previous instruction has an incorrect size for a fixed
3793
     branch delay slot in microMIPS mode, we cannot swap.  */
3794
  pinfo2 = ip->insn_mo->pinfo2;
3795
  if (mips_opts.micromips
3796
      && (pinfo2 & INSN2_BRANCH_DELAY_16BIT)
3797
      && insn_length (history) != 2)
3798
    return FALSE;
3799
  if (mips_opts.micromips
3800
      && (pinfo2 & INSN2_BRANCH_DELAY_32BIT)
3801
      && insn_length (history) != 4)
3802
    return FALSE;
3803
 
3804
  return TRUE;
3805
}
3806
 
3807
/* Decide how we should add IP to the instruction stream.  */
3808
 
3809
static enum append_method
3810
get_append_method (struct mips_cl_insn *ip)
3811
{
3812
  unsigned long pinfo;
3813
 
3814
  /* The relaxed version of a macro sequence must be inherently
3815
     hazard-free.  */
3816
  if (mips_relax.sequence == 2)
3817
    return APPEND_ADD;
3818
 
3819
  /* We must not dabble with instructions in a ".set norerorder" block.  */
3820
  if (mips_opts.noreorder)
3821
    return APPEND_ADD;
3822
 
3823
  /* Otherwise, it's our responsibility to fill branch delay slots.  */
3824
  if (delayed_branch_p (ip))
3825
    {
3826
      if (!branch_likely_p (ip) && can_swap_branch_p (ip))
3827
        return APPEND_SWAP;
3828
 
3829
      pinfo = ip->insn_mo->pinfo;
3830
      if (mips_opts.mips16
3831
          && ISA_SUPPORTS_MIPS16E
3832
          && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31)))
3833
        return APPEND_ADD_COMPACT;
3834
 
3835
      return APPEND_ADD_WITH_NOP;
3836
    }
3837
 
3838
  return APPEND_ADD;
3839
}
3840
 
3841
/* IP is a MIPS16 instruction whose opcode we have just changed.
3842
   Point IP->insn_mo to the new opcode's definition.  */
3843
 
3844
static void
3845
find_altered_mips16_opcode (struct mips_cl_insn *ip)
3846
{
3847
  const struct mips_opcode *mo, *end;
3848
 
3849
  end = &mips16_opcodes[bfd_mips16_num_opcodes];
3850
  for (mo = ip->insn_mo; mo < end; mo++)
3851
    if ((ip->insn_opcode & mo->mask) == mo->match)
3852
      {
3853
        ip->insn_mo = mo;
3854
        return;
3855
      }
3856
  abort ();
3857
}
3858
 
3859
/* For microMIPS macros, we need to generate a local number label
3860
   as the target of branches.  */
3861
#define MICROMIPS_LABEL_CHAR            '\037'
3862
static unsigned long micromips_target_label;
3863
static char micromips_target_name[32];
3864
 
3865
static char *
3866
micromips_label_name (void)
3867
{
3868
  char *p = micromips_target_name;
3869
  char symbol_name_temporary[24];
3870
  unsigned long l;
3871
  int i;
3872
 
3873
  if (*p)
3874
    return p;
3875
 
3876
  i = 0;
3877
  l = micromips_target_label;
3878
#ifdef LOCAL_LABEL_PREFIX
3879
  *p++ = LOCAL_LABEL_PREFIX;
3880
#endif
3881
  *p++ = 'L';
3882
  *p++ = MICROMIPS_LABEL_CHAR;
3883
  do
3884
    {
3885
      symbol_name_temporary[i++] = l % 10 + '0';
3886
      l /= 10;
3887
    }
3888
  while (l != 0);
3889
  while (i > 0)
3890
    *p++ = symbol_name_temporary[--i];
3891
  *p = '\0';
3892
 
3893
  return micromips_target_name;
3894
}
3895
 
3896
static void
3897
micromips_label_expr (expressionS *label_expr)
3898
{
3899
  label_expr->X_op = O_symbol;
3900
  label_expr->X_add_symbol = symbol_find_or_make (micromips_label_name ());
3901
  label_expr->X_add_number = 0;
3902
}
3903
 
3904
static void
3905
micromips_label_inc (void)
3906
{
3907
  micromips_target_label++;
3908
  *micromips_target_name = '\0';
3909
}
3910
 
3911
static void
3912
micromips_add_label (void)
3913
{
3914
  symbolS *s;
3915
 
3916
  s = colon (micromips_label_name ());
3917
  micromips_label_inc ();
3918
#if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
3919
  if (IS_ELF)
3920
    S_SET_OTHER (s, ELF_ST_SET_MICROMIPS (S_GET_OTHER (s)));
3921 163 khays
#else
3922
  (void) s;
3923 160 khays
#endif
3924
}
3925
 
3926
/* If assembling microMIPS code, then return the microMIPS reloc
3927
   corresponding to the requested one if any.  Otherwise return
3928
   the reloc unchanged.  */
3929
 
3930
static bfd_reloc_code_real_type
3931
micromips_map_reloc (bfd_reloc_code_real_type reloc)
3932
{
3933
  static const bfd_reloc_code_real_type relocs[][2] =
3934
    {
3935
      /* Keep sorted incrementally by the left-hand key.  */
3936
      { BFD_RELOC_16_PCREL_S2, BFD_RELOC_MICROMIPS_16_PCREL_S1 },
3937
      { BFD_RELOC_GPREL16, BFD_RELOC_MICROMIPS_GPREL16 },
3938
      { BFD_RELOC_MIPS_JMP, BFD_RELOC_MICROMIPS_JMP },
3939
      { BFD_RELOC_HI16, BFD_RELOC_MICROMIPS_HI16 },
3940
      { BFD_RELOC_HI16_S, BFD_RELOC_MICROMIPS_HI16_S },
3941
      { BFD_RELOC_LO16, BFD_RELOC_MICROMIPS_LO16 },
3942
      { BFD_RELOC_MIPS_LITERAL, BFD_RELOC_MICROMIPS_LITERAL },
3943
      { BFD_RELOC_MIPS_GOT16, BFD_RELOC_MICROMIPS_GOT16 },
3944
      { BFD_RELOC_MIPS_CALL16, BFD_RELOC_MICROMIPS_CALL16 },
3945
      { BFD_RELOC_MIPS_GOT_HI16, BFD_RELOC_MICROMIPS_GOT_HI16 },
3946
      { BFD_RELOC_MIPS_GOT_LO16, BFD_RELOC_MICROMIPS_GOT_LO16 },
3947
      { BFD_RELOC_MIPS_CALL_HI16, BFD_RELOC_MICROMIPS_CALL_HI16 },
3948
      { BFD_RELOC_MIPS_CALL_LO16, BFD_RELOC_MICROMIPS_CALL_LO16 },
3949
      { BFD_RELOC_MIPS_SUB, BFD_RELOC_MICROMIPS_SUB },
3950
      { BFD_RELOC_MIPS_GOT_PAGE, BFD_RELOC_MICROMIPS_GOT_PAGE },
3951
      { BFD_RELOC_MIPS_GOT_OFST, BFD_RELOC_MICROMIPS_GOT_OFST },
3952
      { BFD_RELOC_MIPS_GOT_DISP, BFD_RELOC_MICROMIPS_GOT_DISP },
3953
      { BFD_RELOC_MIPS_HIGHEST, BFD_RELOC_MICROMIPS_HIGHEST },
3954
      { BFD_RELOC_MIPS_HIGHER, BFD_RELOC_MICROMIPS_HIGHER },
3955
      { BFD_RELOC_MIPS_SCN_DISP, BFD_RELOC_MICROMIPS_SCN_DISP },
3956
      { BFD_RELOC_MIPS_TLS_GD, BFD_RELOC_MICROMIPS_TLS_GD },
3957
      { BFD_RELOC_MIPS_TLS_LDM, BFD_RELOC_MICROMIPS_TLS_LDM },
3958
      { BFD_RELOC_MIPS_TLS_DTPREL_HI16, BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16 },
3959
      { BFD_RELOC_MIPS_TLS_DTPREL_LO16, BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16 },
3960
      { BFD_RELOC_MIPS_TLS_GOTTPREL, BFD_RELOC_MICROMIPS_TLS_GOTTPREL },
3961
      { BFD_RELOC_MIPS_TLS_TPREL_HI16, BFD_RELOC_MICROMIPS_TLS_TPREL_HI16 },
3962
      { BFD_RELOC_MIPS_TLS_TPREL_LO16, BFD_RELOC_MICROMIPS_TLS_TPREL_LO16 }
3963
    };
3964
  bfd_reloc_code_real_type r;
3965
  size_t i;
3966
 
3967
  if (!mips_opts.micromips)
3968
    return reloc;
3969
  for (i = 0; i < ARRAY_SIZE (relocs); i++)
3970
    {
3971
      r = relocs[i][0];
3972
      if (r > reloc)
3973
        return reloc;
3974
      if (r == reloc)
3975
        return relocs[i][1];
3976
    }
3977
  return reloc;
3978
}
3979
 
3980 16 khays
/* Output an instruction.  IP is the instruction information.
3981
   ADDRESS_EXPR is an operand of the instruction to be used with
3982 160 khays
   RELOC_TYPE.  EXPANSIONP is true if the instruction is part of
3983
   a macro expansion.  */
3984 16 khays
 
3985
static void
3986
append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
3987 160 khays
             bfd_reloc_code_real_type *reloc_type, bfd_boolean expansionp)
3988 16 khays
{
3989 160 khays
  unsigned long prev_pinfo2, pinfo;
3990 16 khays
  bfd_boolean relaxed_branch = FALSE;
3991 160 khays
  enum append_method method;
3992
  bfd_boolean relax32;
3993
  int branch_disp;
3994 16 khays
 
3995 160 khays
  if (mips_fix_loongson2f && !HAVE_CODE_COMPRESSION)
3996 16 khays
    fix_loongson2f (ip);
3997
 
3998 160 khays
  mips_mark_labels ();
3999 16 khays
 
4000
  file_ase_mips16 |= mips_opts.mips16;
4001 160 khays
  file_ase_micromips |= mips_opts.micromips;
4002 16 khays
 
4003
  prev_pinfo2 = history[0].insn_mo->pinfo2;
4004
  pinfo = ip->insn_mo->pinfo;
4005
 
4006 160 khays
  if (mips_opts.micromips
4007
      && !expansionp
4008
      && (((prev_pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0
4009
           && micromips_insn_length (ip->insn_mo) != 2)
4010
          || ((prev_pinfo2 & INSN2_BRANCH_DELAY_32BIT) != 0
4011
              && micromips_insn_length (ip->insn_mo) != 4)))
4012
    as_warn (_("Wrong size instruction in a %u-bit branch delay slot"),
4013
             (prev_pinfo2 & INSN2_BRANCH_DELAY_16BIT) != 0 ? 16 : 32);
4014
 
4015 16 khays
  if (address_expr == NULL)
4016
    ip->complete_p = 1;
4017
  else if (*reloc_type <= BFD_RELOC_UNUSED
4018
           && address_expr->X_op == O_constant)
4019
    {
4020
      unsigned int tmp;
4021
 
4022
      ip->complete_p = 1;
4023
      switch (*reloc_type)
4024
        {
4025
        case BFD_RELOC_32:
4026
          ip->insn_opcode |= address_expr->X_add_number;
4027
          break;
4028
 
4029
        case BFD_RELOC_MIPS_HIGHEST:
4030
          tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
4031
          ip->insn_opcode |= tmp & 0xffff;
4032
          break;
4033
 
4034
        case BFD_RELOC_MIPS_HIGHER:
4035
          tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
4036
          ip->insn_opcode |= tmp & 0xffff;
4037
          break;
4038
 
4039
        case BFD_RELOC_HI16_S:
4040
          tmp = (address_expr->X_add_number + 0x8000) >> 16;
4041
          ip->insn_opcode |= tmp & 0xffff;
4042
          break;
4043
 
4044
        case BFD_RELOC_HI16:
4045
          ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
4046
          break;
4047
 
4048
        case BFD_RELOC_UNUSED:
4049
        case BFD_RELOC_LO16:
4050
        case BFD_RELOC_MIPS_GOT_DISP:
4051
          ip->insn_opcode |= address_expr->X_add_number & 0xffff;
4052
          break;
4053
 
4054
        case BFD_RELOC_MIPS_JMP:
4055 160 khays
          {
4056
            int shift;
4057
 
4058
            shift = mips_opts.micromips ? 1 : 2;
4059
            if ((address_expr->X_add_number & ((1 << shift) - 1)) != 0)
4060
              as_bad (_("jump to misaligned address (0x%lx)"),
4061
                      (unsigned long) address_expr->X_add_number);
4062
            ip->insn_opcode |= ((address_expr->X_add_number >> shift)
4063
                                & 0x3ffffff);
4064
            ip->complete_p = 0;
4065
          }
4066 16 khays
          break;
4067
 
4068
        case BFD_RELOC_MIPS16_JMP:
4069
          if ((address_expr->X_add_number & 3) != 0)
4070
            as_bad (_("jump to misaligned address (0x%lx)"),
4071
                    (unsigned long) address_expr->X_add_number);
4072
          ip->insn_opcode |=
4073
            (((address_expr->X_add_number & 0x7c0000) << 3)
4074
               | ((address_expr->X_add_number & 0xf800000) >> 7)
4075
               | ((address_expr->X_add_number & 0x3fffc) >> 2));
4076
          ip->complete_p = 0;
4077
          break;
4078
 
4079
        case BFD_RELOC_16_PCREL_S2:
4080 160 khays
          {
4081
            int shift;
4082
 
4083
            shift = mips_opts.micromips ? 1 : 2;
4084
            if ((address_expr->X_add_number & ((1 << shift) - 1)) != 0)
4085
              as_bad (_("branch to misaligned address (0x%lx)"),
4086
                      (unsigned long) address_expr->X_add_number);
4087
            if (!mips_relax_branch)
4088
              {
4089
                if ((address_expr->X_add_number + (1 << (shift + 15)))
4090
                    & ~((1 << (shift + 16)) - 1))
4091
                  as_bad (_("branch address range overflow (0x%lx)"),
4092
                          (unsigned long) address_expr->X_add_number);
4093
                ip->insn_opcode |= ((address_expr->X_add_number >> shift)
4094
                                    & 0xffff);
4095
              }
4096
            ip->complete_p = 0;
4097
          }
4098 16 khays
          break;
4099
 
4100
        default:
4101
          internalError ();
4102
        }
4103
    }
4104
 
4105
  if (mips_relax.sequence != 2 && !mips_opts.noreorder)
4106
    {
4107
      /* There are a lot of optimizations we could do that we don't.
4108
         In particular, we do not, in general, reorder instructions.
4109
         If you use gcc with optimization, it will reorder
4110
         instructions and generally do much more optimization then we
4111
         do here; repeating all that work in the assembler would only
4112
         benefit hand written assembly code, and does not seem worth
4113
         it.  */
4114
      int nops = (mips_optimize == 0
4115 160 khays
                  ? nops_for_insn (0, history, NULL)
4116
                  : nops_for_insn_or_target (0, history, ip));
4117 16 khays
      if (nops > 0)
4118
        {
4119
          fragS *old_frag;
4120
          unsigned long old_frag_offset;
4121
          int i;
4122
 
4123
          old_frag = frag_now;
4124
          old_frag_offset = frag_now_fix ();
4125
 
4126
          for (i = 0; i < nops; i++)
4127 160 khays
            add_fixed_insn (NOP_INSN);
4128
          insert_into_history (0, nops, NOP_INSN);
4129 16 khays
 
4130
          if (listing)
4131
            {
4132
              listing_prev_line ();
4133
              /* We may be at the start of a variant frag.  In case we
4134
                 are, make sure there is enough space for the frag
4135
                 after the frags created by listing_prev_line.  The
4136
                 argument to frag_grow here must be at least as large
4137
                 as the argument to all other calls to frag_grow in
4138
                 this file.  We don't have to worry about being in the
4139
                 middle of a variant frag, because the variants insert
4140
                 all needed nop instructions themselves.  */
4141
              frag_grow (40);
4142
            }
4143
 
4144
          mips_move_labels ();
4145
 
4146
#ifndef NO_ECOFF_DEBUGGING
4147
          if (ECOFF_DEBUGGING)
4148
            ecoff_fix_loc (old_frag, old_frag_offset);
4149
#endif
4150
        }
4151
    }
4152
  else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
4153
    {
4154 160 khays
      int nops;
4155
 
4156
      /* Work out how many nops in prev_nop_frag are needed by IP,
4157
         ignoring hazards generated by the first prev_nop_frag_since
4158
         instructions.  */
4159
      nops = nops_for_insn_or_target (prev_nop_frag_since, history, ip);
4160 16 khays
      gas_assert (nops <= prev_nop_frag_holds);
4161
 
4162
      /* Enforce NOPS as a minimum.  */
4163
      if (nops > prev_nop_frag_required)
4164
        prev_nop_frag_required = nops;
4165
 
4166
      if (prev_nop_frag_holds == prev_nop_frag_required)
4167
        {
4168
          /* Settle for the current number of nops.  Update the history
4169
             accordingly (for the benefit of any future .set reorder code).  */
4170
          prev_nop_frag = NULL;
4171
          insert_into_history (prev_nop_frag_since,
4172
                               prev_nop_frag_holds, NOP_INSN);
4173
        }
4174
      else
4175
        {
4176
          /* Allow this instruction to replace one of the nops that was
4177
             tentatively added to prev_nop_frag.  */
4178 160 khays
          prev_nop_frag->fr_fix -= NOP_INSN_SIZE;
4179 16 khays
          prev_nop_frag_holds--;
4180
          prev_nop_frag_since++;
4181
        }
4182
    }
4183
 
4184 160 khays
  method = get_append_method (ip);
4185
  branch_disp = method == APPEND_SWAP ? insn_length (history) : 0;
4186
 
4187 16 khays
#ifdef OBJ_ELF
4188
  /* The value passed to dwarf2_emit_insn is the distance between
4189
     the beginning of the current instruction and the address that
4190 160 khays
     should be recorded in the debug tables.  This is normally the
4191
     current address.
4192
 
4193
     For MIPS16/microMIPS debug info we want to use ISA-encoded
4194
     addresses, so we use -1 for an address higher by one than the
4195
     current one.
4196
 
4197
     If the instruction produced is a branch that we will swap with
4198
     the preceding instruction, then we add the displacement by which
4199
     the branch will be moved backwards.  This is more appropriate
4200
     and for MIPS16/microMIPS code also prevents a debugger from
4201
     placing a breakpoint in the middle of the branch (and corrupting
4202
     code if software breakpoints are used).  */
4203
  dwarf2_emit_insn ((HAVE_CODE_COMPRESSION ? -1 : 0) + branch_disp);
4204 16 khays
#endif
4205
 
4206 160 khays
  relax32 = (mips_relax_branch
4207
             /* Don't try branch relaxation within .set nomacro, or within
4208
                .set noat if we use $at for PIC computations.  If it turns
4209
                out that the branch was out-of-range, we'll get an error.  */
4210
             && !mips_opts.warn_about_macros
4211
             && (mips_opts.at || mips_pic == NO_PIC)
4212
             /* Don't relax BPOSGE32/64 as they have no complementing
4213
                branches.  */
4214
             && !(ip->insn_mo->membership & (INSN_DSP64 | INSN_DSP)));
4215 16 khays
 
4216 160 khays
  if (!HAVE_CODE_COMPRESSION
4217
      && address_expr
4218
      && relax32
4219 16 khays
      && *reloc_type == BFD_RELOC_16_PCREL_S2
4220 160 khays
      && delayed_branch_p (ip))
4221 16 khays
    {
4222
      relaxed_branch = TRUE;
4223
      add_relaxed_insn (ip, (relaxed_branch_length
4224
                             (NULL, NULL,
4225 160 khays
                              uncond_branch_p (ip) ? -1
4226
                              : branch_likely_p (ip) ? 1
4227 16 khays
                              : 0)), 4,
4228
                        RELAX_BRANCH_ENCODE
4229
                        (AT,
4230 160 khays
                         uncond_branch_p (ip),
4231
                         branch_likely_p (ip),
4232 16 khays
                         pinfo & INSN_WRITE_GPR_31,
4233
                         0),
4234
                        address_expr->X_add_symbol,
4235
                        address_expr->X_add_number);
4236
      *reloc_type = BFD_RELOC_UNUSED;
4237
    }
4238 160 khays
  else if (mips_opts.micromips
4239
           && address_expr
4240
           && ((relax32 && *reloc_type == BFD_RELOC_16_PCREL_S2)
4241
               || *reloc_type > BFD_RELOC_UNUSED)
4242
           && (delayed_branch_p (ip) || compact_branch_p (ip))
4243
           /* Don't try branch relaxation when users specify
4244
              16-bit/32-bit instructions.  */
4245
           && !forced_insn_length)
4246 16 khays
    {
4247 160 khays
      bfd_boolean relax16 = *reloc_type > BFD_RELOC_UNUSED;
4248
      int type = relax16 ? *reloc_type - BFD_RELOC_UNUSED : 0;
4249
      int uncond = uncond_branch_p (ip) ? -1 : 0;
4250
      int compact = compact_branch_p (ip);
4251
      int al = pinfo & INSN_WRITE_GPR_31;
4252
      int length32;
4253
 
4254
      gas_assert (address_expr != NULL);
4255
      gas_assert (!mips_relax.sequence);
4256
 
4257
      relaxed_branch = TRUE;
4258
      length32 = relaxed_micromips_32bit_branch_length (NULL, NULL, uncond);
4259
      add_relaxed_insn (ip, relax32 ? length32 : 4, relax16 ? 2 : 4,
4260
                        RELAX_MICROMIPS_ENCODE (type, AT, uncond, compact, al,
4261
                                                relax32, 0, 0),
4262
                        address_expr->X_add_symbol,
4263
                        address_expr->X_add_number);
4264
      *reloc_type = BFD_RELOC_UNUSED;
4265
    }
4266
  else if (mips_opts.mips16 && *reloc_type > BFD_RELOC_UNUSED)
4267
    {
4268 16 khays
      /* We need to set up a variant frag.  */
4269 160 khays
      gas_assert (address_expr != NULL);
4270 16 khays
      add_relaxed_insn (ip, 4, 0,
4271
                        RELAX_MIPS16_ENCODE
4272
                        (*reloc_type - BFD_RELOC_UNUSED,
4273 160 khays
                         forced_insn_length == 2, forced_insn_length == 4,
4274
                         delayed_branch_p (&history[0]),
4275 16 khays
                         history[0].mips16_absolute_jump_p),
4276
                        make_expr_symbol (address_expr), 0);
4277
    }
4278
  else if (mips_opts.mips16
4279
           && ! ip->use_extend
4280
           && *reloc_type != BFD_RELOC_MIPS16_JMP)
4281
    {
4282 160 khays
      if (!delayed_branch_p (ip))
4283 16 khays
        /* Make sure there is enough room to swap this instruction with
4284
           a following jump instruction.  */
4285
        frag_grow (6);
4286
      add_fixed_insn (ip);
4287
    }
4288
  else
4289
    {
4290
      if (mips_opts.mips16
4291
          && mips_opts.noreorder
4292 160 khays
          && delayed_branch_p (&history[0]))
4293 16 khays
        as_warn (_("extended instruction in delay slot"));
4294
 
4295
      if (mips_relax.sequence)
4296
        {
4297
          /* If we've reached the end of this frag, turn it into a variant
4298
             frag and record the information for the instructions we've
4299
             written so far.  */
4300
          if (frag_room () < 4)
4301
            relax_close_frag ();
4302 160 khays
          mips_relax.sizes[mips_relax.sequence - 1] += insn_length (ip);
4303 16 khays
        }
4304
 
4305
      if (mips_relax.sequence != 2)
4306 160 khays
        {
4307
          if (mips_macro_warning.first_insn_sizes[0] == 0)
4308
            mips_macro_warning.first_insn_sizes[0] = insn_length (ip);
4309
          mips_macro_warning.sizes[0] += insn_length (ip);
4310
          mips_macro_warning.insns[0]++;
4311
        }
4312 16 khays
      if (mips_relax.sequence != 1)
4313 160 khays
        {
4314
          if (mips_macro_warning.first_insn_sizes[1] == 0)
4315
            mips_macro_warning.first_insn_sizes[1] = insn_length (ip);
4316
          mips_macro_warning.sizes[1] += insn_length (ip);
4317
          mips_macro_warning.insns[1]++;
4318
        }
4319 16 khays
 
4320
      if (mips_opts.mips16)
4321
        {
4322
          ip->fixed_p = 1;
4323
          ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
4324
        }
4325
      add_fixed_insn (ip);
4326
    }
4327
 
4328 160 khays
  if (!ip->complete_p && *reloc_type < BFD_RELOC_UNUSED)
4329 16 khays
    {
4330 160 khays
      bfd_reloc_code_real_type final_type[3];
4331
      reloc_howto_type *howto0;
4332
      reloc_howto_type *howto;
4333
      int i;
4334
 
4335
      /* Perform any necessary conversion to microMIPS relocations
4336
         and find out how many relocations there actually are.  */
4337
      for (i = 0; i < 3 && reloc_type[i] != BFD_RELOC_UNUSED; i++)
4338
        final_type[i] = micromips_map_reloc (reloc_type[i]);
4339
 
4340
      /* In a compound relocation, it is the final (outermost)
4341
         operator that determines the relocated field.  */
4342
      howto = howto0 = bfd_reloc_type_lookup (stdoutput, final_type[i - 1]);
4343
 
4344
      if (howto == NULL)
4345 16 khays
        {
4346 160 khays
          /* To reproduce this failure try assembling gas/testsuites/
4347
             gas/mips/mips16-intermix.s with a mips-ecoff targeted
4348
             assembler.  */
4349
          as_bad (_("Unsupported MIPS relocation number %d"),
4350
                  final_type[i - 1]);
4351
          howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_16);
4352
        }
4353 16 khays
 
4354 160 khays
      if (i > 1)
4355
        howto0 = bfd_reloc_type_lookup (stdoutput, final_type[0]);
4356
      ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
4357
                                 bfd_get_reloc_size (howto),
4358
                                 address_expr,
4359
                                 howto0 && howto0->pc_relative,
4360
                                 final_type[0]);
4361 16 khays
 
4362 160 khays
      /* Tag symbols that have a R_MIPS16_26 relocation against them.  */
4363
      if (final_type[0] == BFD_RELOC_MIPS16_JMP && ip->fixp[0]->fx_addsy)
4364
        *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
4365 16 khays
 
4366 160 khays
      /* These relocations can have an addend that won't fit in
4367
         4 octets for 64bit assembly.  */
4368
      if (HAVE_64BIT_GPRS
4369
          && ! howto->partial_inplace
4370
          && (reloc_type[0] == BFD_RELOC_16
4371
              || reloc_type[0] == BFD_RELOC_32
4372
              || reloc_type[0] == BFD_RELOC_MIPS_JMP
4373
              || reloc_type[0] == BFD_RELOC_GPREL16
4374
              || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
4375
              || reloc_type[0] == BFD_RELOC_GPREL32
4376
              || reloc_type[0] == BFD_RELOC_64
4377
              || reloc_type[0] == BFD_RELOC_CTOR
4378
              || reloc_type[0] == BFD_RELOC_MIPS_SUB
4379
              || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
4380
              || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
4381
              || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
4382
              || reloc_type[0] == BFD_RELOC_MIPS_REL16
4383
              || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
4384
              || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
4385
              || hi16_reloc_p (reloc_type[0])
4386
              || lo16_reloc_p (reloc_type[0])))
4387
        ip->fixp[0]->fx_no_overflow = 1;
4388 16 khays
 
4389 160 khays
      if (mips_relax.sequence)
4390
        {
4391
          if (mips_relax.first_fixup == 0)
4392
            mips_relax.first_fixup = ip->fixp[0];
4393
        }
4394
      else if (reloc_needs_lo_p (*reloc_type))
4395
        {
4396
          struct mips_hi_fixup *hi_fixup;
4397 16 khays
 
4398 160 khays
          /* Reuse the last entry if it already has a matching %lo.  */
4399
          hi_fixup = mips_hi_fixup_list;
4400
          if (hi_fixup == 0
4401
              || !fixup_has_matching_lo_p (hi_fixup->fixp))
4402 16 khays
            {
4403 160 khays
              hi_fixup = ((struct mips_hi_fixup *)
4404
                          xmalloc (sizeof (struct mips_hi_fixup)));
4405
              hi_fixup->next = mips_hi_fixup_list;
4406
              mips_hi_fixup_list = hi_fixup;
4407 16 khays
            }
4408 160 khays
          hi_fixup->fixp = ip->fixp[0];
4409
          hi_fixup->seg = now_seg;
4410
        }
4411 16 khays
 
4412 160 khays
      /* Add fixups for the second and third relocations, if given.
4413
         Note that the ABI allows the second relocation to be
4414
         against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC.  At the
4415
         moment we only use RSS_UNDEF, but we could add support
4416
         for the others if it ever becomes necessary.  */
4417
      for (i = 1; i < 3; i++)
4418
        if (reloc_type[i] != BFD_RELOC_UNUSED)
4419
          {
4420
            ip->fixp[i] = fix_new (ip->frag, ip->where,
4421
                                   ip->fixp[0]->fx_size, NULL, 0,
4422
                                   FALSE, final_type[i]);
4423 16 khays
 
4424 160 khays
            /* Use fx_tcbit to mark compound relocs.  */
4425
            ip->fixp[0]->fx_tcbit = 1;
4426
            ip->fixp[i]->fx_tcbit = 1;
4427
          }
4428 16 khays
    }
4429
  install_insn (ip);
4430
 
4431
  /* Update the register mask information.  */
4432 160 khays
  mips_gprmask |= gpr_read_mask (ip) | gpr_write_mask (ip);
4433
  mips_cprmask[1] |= fpr_read_mask (ip) | fpr_write_mask (ip);
4434 16 khays
 
4435 160 khays
  switch (method)
4436 16 khays
    {
4437 160 khays
    case APPEND_ADD:
4438
      insert_into_history (0, 1, ip);
4439
      break;
4440 16 khays
 
4441 160 khays
    case APPEND_ADD_WITH_NOP:
4442
      {
4443
        struct mips_cl_insn *nop;
4444
 
4445 16 khays
        insert_into_history (0, 1, ip);
4446 160 khays
        nop = get_delay_slot_nop (ip);
4447
        add_fixed_insn (nop);
4448
        insert_into_history (0, 1, nop);
4449
        if (mips_relax.sequence)
4450
          mips_relax.sizes[mips_relax.sequence - 1] += insn_length (nop);
4451
      }
4452
      break;
4453
 
4454
    case APPEND_ADD_COMPACT:
4455
      /* Convert MIPS16 jr/jalr into a "compact" jump.  */
4456
      gas_assert (mips_opts.mips16);
4457
      ip->insn_opcode |= 0x0080;
4458
      find_altered_mips16_opcode (ip);
4459
      install_insn (ip);
4460
      insert_into_history (0, 1, ip);
4461
      break;
4462
 
4463
    case APPEND_SWAP:
4464
      {
4465
        struct mips_cl_insn delay = history[0];
4466
        if (mips_opts.mips16)
4467
          {
4468
            know (delay.frag == ip->frag);
4469
            move_insn (ip, delay.frag, delay.where);
4470
            move_insn (&delay, ip->frag, ip->where + insn_length (ip));
4471
          }
4472
        else if (relaxed_branch)
4473
          {
4474
            /* Add the delay slot instruction to the end of the
4475
               current frag and shrink the fixed part of the
4476
               original frag.  If the branch occupies the tail of
4477
               the latter, move it backwards to cover the gap.  */
4478
            delay.frag->fr_fix -= branch_disp;
4479
            if (delay.frag == ip->frag)
4480
              move_insn (ip, ip->frag, ip->where - branch_disp);
4481
            add_fixed_insn (&delay);
4482
          }
4483
        else
4484
          {
4485
            move_insn (&delay, ip->frag,
4486
                       ip->where - branch_disp + insn_length (ip));
4487
            move_insn (ip, history[0].frag, history[0].where);
4488
          }
4489
        history[0] = *ip;
4490
        delay.fixed_p = 1;
4491
        insert_into_history (0, 1, &delay);
4492
      }
4493
      break;
4494 16 khays
    }
4495
 
4496 160 khays
  /* If we have just completed an unconditional branch, clear the history.  */
4497
  if ((delayed_branch_p (&history[1]) && uncond_branch_p (&history[1]))
4498
      || (compact_branch_p (&history[0]) && uncond_branch_p (&history[0])))
4499
    mips_no_prev_insn ();
4500
 
4501
  /* We need to emit a label at the end of branch-likely macros.  */
4502
  if (emit_branch_likely_macro)
4503
    {
4504
      emit_branch_likely_macro = FALSE;
4505
      micromips_add_label ();
4506
    }
4507
 
4508 16 khays
  /* We just output an insn, so the next one doesn't have a label.  */
4509
  mips_clear_insn_labels ();
4510
}
4511
 
4512
/* Forget that there was any previous instruction or label.  */
4513
 
4514
static void
4515
mips_no_prev_insn (void)
4516
{
4517
  prev_nop_frag = NULL;
4518
  insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
4519
  mips_clear_insn_labels ();
4520
}
4521
 
4522
/* This function must be called before we emit something other than
4523
   instructions.  It is like mips_no_prev_insn except that it inserts
4524
   any NOPS that might be needed by previous instructions.  */
4525
 
4526
void
4527
mips_emit_delays (void)
4528
{
4529
  if (! mips_opts.noreorder)
4530
    {
4531 160 khays
      int nops = nops_for_insn (0, history, NULL);
4532 16 khays
      if (nops > 0)
4533
        {
4534
          while (nops-- > 0)
4535
            add_fixed_insn (NOP_INSN);
4536
          mips_move_labels ();
4537
        }
4538
    }
4539
  mips_no_prev_insn ();
4540
}
4541
 
4542
/* Start a (possibly nested) noreorder block.  */
4543
 
4544
static void
4545
start_noreorder (void)
4546
{
4547
  if (mips_opts.noreorder == 0)
4548
    {
4549
      unsigned int i;
4550
      int nops;
4551
 
4552
      /* None of the instructions before the .set noreorder can be moved.  */
4553
      for (i = 0; i < ARRAY_SIZE (history); i++)
4554
        history[i].fixed_p = 1;
4555
 
4556
      /* Insert any nops that might be needed between the .set noreorder
4557
         block and the previous instructions.  We will later remove any
4558
         nops that turn out not to be needed.  */
4559 160 khays
      nops = nops_for_insn (0, history, NULL);
4560 16 khays
      if (nops > 0)
4561
        {
4562
          if (mips_optimize != 0)
4563
            {
4564
              /* Record the frag which holds the nop instructions, so
4565
                 that we can remove them if we don't need them.  */
4566 160 khays
              frag_grow (nops * NOP_INSN_SIZE);
4567 16 khays
              prev_nop_frag = frag_now;
4568
              prev_nop_frag_holds = nops;
4569
              prev_nop_frag_required = 0;
4570
              prev_nop_frag_since = 0;
4571
            }
4572
 
4573
          for (; nops > 0; --nops)
4574
            add_fixed_insn (NOP_INSN);
4575
 
4576
          /* Move on to a new frag, so that it is safe to simply
4577
             decrease the size of prev_nop_frag.  */
4578
          frag_wane (frag_now);
4579
          frag_new (0);
4580
          mips_move_labels ();
4581
        }
4582 160 khays
      mips_mark_labels ();
4583 16 khays
      mips_clear_insn_labels ();
4584
    }
4585
  mips_opts.noreorder++;
4586
  mips_any_noreorder = 1;
4587
}
4588
 
4589
/* End a nested noreorder block.  */
4590
 
4591
static void
4592
end_noreorder (void)
4593
{
4594
  mips_opts.noreorder--;
4595
  if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
4596
    {
4597
      /* Commit to inserting prev_nop_frag_required nops and go back to
4598
         handling nop insertion the .set reorder way.  */
4599
      prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
4600 160 khays
                                * NOP_INSN_SIZE);
4601 16 khays
      insert_into_history (prev_nop_frag_since,
4602
                           prev_nop_frag_required, NOP_INSN);
4603
      prev_nop_frag = NULL;
4604
    }
4605
}
4606
 
4607
/* Set up global variables for the start of a new macro.  */
4608
 
4609
static void
4610
macro_start (void)
4611
{
4612
  memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
4613 160 khays
  memset (&mips_macro_warning.first_insn_sizes, 0,
4614
          sizeof (mips_macro_warning.first_insn_sizes));
4615
  memset (&mips_macro_warning.insns, 0, sizeof (mips_macro_warning.insns));
4616 16 khays
  mips_macro_warning.delay_slot_p = (mips_opts.noreorder
4617 160 khays
                                     && delayed_branch_p (&history[0]));
4618
  switch (history[0].insn_mo->pinfo2
4619
          & (INSN2_BRANCH_DELAY_32BIT | INSN2_BRANCH_DELAY_16BIT))
4620
    {
4621
    case INSN2_BRANCH_DELAY_32BIT:
4622
      mips_macro_warning.delay_slot_length = 4;
4623
      break;
4624
    case INSN2_BRANCH_DELAY_16BIT:
4625
      mips_macro_warning.delay_slot_length = 2;
4626
      break;
4627
    default:
4628
      mips_macro_warning.delay_slot_length = 0;
4629
      break;
4630
    }
4631
  mips_macro_warning.first_frag = NULL;
4632 16 khays
}
4633
 
4634 160 khays
/* Given that a macro is longer than one instruction or of the wrong size,
4635
   return the appropriate warning for it.  Return null if no warning is
4636
   needed.  SUBTYPE is a bitmask of RELAX_DELAY_SLOT, RELAX_DELAY_SLOT_16BIT,
4637
   RELAX_DELAY_SLOT_SIZE_FIRST, RELAX_DELAY_SLOT_SIZE_SECOND,
4638
   and RELAX_NOMACRO.  */
4639 16 khays
 
4640
static const char *
4641
macro_warning (relax_substateT subtype)
4642
{
4643
  if (subtype & RELAX_DELAY_SLOT)
4644
    return _("Macro instruction expanded into multiple instructions"
4645
             " in a branch delay slot");
4646
  else if (subtype & RELAX_NOMACRO)
4647
    return _("Macro instruction expanded into multiple instructions");
4648 160 khays
  else if (subtype & (RELAX_DELAY_SLOT_SIZE_FIRST
4649
                      | RELAX_DELAY_SLOT_SIZE_SECOND))
4650
    return ((subtype & RELAX_DELAY_SLOT_16BIT)
4651
            ? _("Macro instruction expanded into a wrong size instruction"
4652
                " in a 16-bit branch delay slot")
4653
            : _("Macro instruction expanded into a wrong size instruction"
4654
                " in a 32-bit branch delay slot"));
4655 16 khays
  else
4656
    return 0;
4657
}
4658
 
4659
/* Finish up a macro.  Emit warnings as appropriate.  */
4660
 
4661
static void
4662
macro_end (void)
4663
{
4664 160 khays
  /* Relaxation warning flags.  */
4665
  relax_substateT subtype = 0;
4666
 
4667
  /* Check delay slot size requirements.  */
4668
  if (mips_macro_warning.delay_slot_length == 2)
4669
    subtype |= RELAX_DELAY_SLOT_16BIT;
4670
  if (mips_macro_warning.delay_slot_length != 0)
4671 16 khays
    {
4672 160 khays
      if (mips_macro_warning.delay_slot_length
4673
          != mips_macro_warning.first_insn_sizes[0])
4674
        subtype |= RELAX_DELAY_SLOT_SIZE_FIRST;
4675
      if (mips_macro_warning.delay_slot_length
4676
          != mips_macro_warning.first_insn_sizes[1])
4677
        subtype |= RELAX_DELAY_SLOT_SIZE_SECOND;
4678
    }
4679 16 khays
 
4680 160 khays
  /* Check instruction count requirements.  */
4681
  if (mips_macro_warning.insns[0] > 1 || mips_macro_warning.insns[1] > 1)
4682
    {
4683
      if (mips_macro_warning.insns[1] > mips_macro_warning.insns[0])
4684 16 khays
        subtype |= RELAX_SECOND_LONGER;
4685
      if (mips_opts.warn_about_macros)
4686
        subtype |= RELAX_NOMACRO;
4687
      if (mips_macro_warning.delay_slot_p)
4688
        subtype |= RELAX_DELAY_SLOT;
4689 160 khays
    }
4690 16 khays
 
4691 160 khays
  /* If both alternatives fail to fill a delay slot correctly,
4692
     emit the warning now.  */
4693
  if ((subtype & RELAX_DELAY_SLOT_SIZE_FIRST) != 0
4694
      && (subtype & RELAX_DELAY_SLOT_SIZE_SECOND) != 0)
4695
    {
4696
      relax_substateT s;
4697
      const char *msg;
4698
 
4699
      s = subtype & (RELAX_DELAY_SLOT_16BIT
4700
                     | RELAX_DELAY_SLOT_SIZE_FIRST
4701
                     | RELAX_DELAY_SLOT_SIZE_SECOND);
4702
      msg = macro_warning (s);
4703
      if (msg != NULL)
4704
        as_warn ("%s", msg);
4705
      subtype &= ~s;
4706 16 khays
    }
4707 160 khays
 
4708
  /* If both implementations are longer than 1 instruction, then emit the
4709
     warning now.  */
4710
  if (mips_macro_warning.insns[0] > 1 && mips_macro_warning.insns[1] > 1)
4711
    {
4712
      relax_substateT s;
4713
      const char *msg;
4714
 
4715
      s = subtype & (RELAX_SECOND_LONGER | RELAX_NOMACRO | RELAX_DELAY_SLOT);
4716
      msg = macro_warning (s);
4717
      if (msg != NULL)
4718
        as_warn ("%s", msg);
4719
      subtype &= ~s;
4720
    }
4721
 
4722
  /* If any flags still set, then one implementation might need a warning
4723
     and the other either will need one of a different kind or none at all.
4724
     Pass any remaining flags over to relaxation.  */
4725
  if (mips_macro_warning.first_frag != NULL)
4726
    mips_macro_warning.first_frag->fr_subtype |= subtype;
4727 16 khays
}
4728
 
4729 160 khays
/* Instruction operand formats used in macros that vary between
4730
   standard MIPS and microMIPS code.  */
4731
 
4732
static const char * const brk_fmt[2] = { "c", "mF" };
4733
static const char * const cop12_fmt[2] = { "E,o(b)", "E,~(b)" };
4734
static const char * const jalr_fmt[2] = { "d,s", "t,s" };
4735
static const char * const lui_fmt[2] = { "t,u", "s,u" };
4736
static const char * const mem12_fmt[2] = { "t,o(b)", "t,~(b)" };
4737
static const char * const mfhl_fmt[2] = { "d", "mj" };
4738
static const char * const shft_fmt[2] = { "d,w,<", "t,r,<" };
4739
static const char * const trap_fmt[2] = { "s,t,q", "s,t,|" };
4740
 
4741
#define BRK_FMT (brk_fmt[mips_opts.micromips])
4742
#define COP12_FMT (cop12_fmt[mips_opts.micromips])
4743
#define JALR_FMT (jalr_fmt[mips_opts.micromips])
4744
#define LUI_FMT (lui_fmt[mips_opts.micromips])
4745
#define MEM12_FMT (mem12_fmt[mips_opts.micromips])
4746
#define MFHL_FMT (mfhl_fmt[mips_opts.micromips])
4747
#define SHFT_FMT (shft_fmt[mips_opts.micromips])
4748
#define TRAP_FMT (trap_fmt[mips_opts.micromips])
4749
 
4750 16 khays
/* Read a macro's relocation codes from *ARGS and store them in *R.
4751
   The first argument in *ARGS will be either the code for a single
4752
   relocation or -1 followed by the three codes that make up a
4753
   composite relocation.  */
4754
 
4755
static void
4756
macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
4757
{
4758
  int i, next;
4759
 
4760
  next = va_arg (*args, int);
4761
  if (next >= 0)
4762
    r[0] = (bfd_reloc_code_real_type) next;
4763
  else
4764
    for (i = 0; i < 3; i++)
4765
      r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
4766
}
4767
 
4768
/* Build an instruction created by a macro expansion.  This is passed
4769
   a pointer to the count of instructions created so far, an
4770
   expression, the name of the instruction to build, an operand format
4771
   string, and corresponding arguments.  */
4772
 
4773
static void
4774
macro_build (expressionS *ep, const char *name, const char *fmt, ...)
4775
{
4776 160 khays
  const struct mips_opcode *mo = NULL;
4777
  bfd_reloc_code_real_type r[3];
4778
  const struct mips_opcode *amo;
4779
  struct hash_control *hash;
4780 16 khays
  struct mips_cl_insn insn;
4781
  va_list args;
4782
 
4783
  va_start (args, fmt);
4784
 
4785
  if (mips_opts.mips16)
4786
    {
4787
      mips16_macro_build (ep, name, fmt, &args);
4788
      va_end (args);
4789
      return;
4790
    }
4791
 
4792
  r[0] = BFD_RELOC_UNUSED;
4793
  r[1] = BFD_RELOC_UNUSED;
4794
  r[2] = BFD_RELOC_UNUSED;
4795 160 khays
  hash = mips_opts.micromips ? micromips_op_hash : op_hash;
4796
  amo = (struct mips_opcode *) hash_find (hash, name);
4797
  gas_assert (amo);
4798
  gas_assert (strcmp (name, amo->name) == 0);
4799 16 khays
 
4800 160 khays
  do
4801 16 khays
    {
4802
      /* Search until we get a match for NAME.  It is assumed here that
4803 160 khays
         macros will never generate MDMX, MIPS-3D, or MT instructions.
4804
         We try to match an instruction that fulfils the branch delay
4805
         slot instruction length requirement (if any) of the previous
4806
         instruction.  While doing this we record the first instruction
4807
         seen that matches all the other conditions and use it anyway
4808
         if the requirement cannot be met; we will issue an appropriate
4809
         warning later on.  */
4810
      if (strcmp (fmt, amo->args) == 0
4811
          && amo->pinfo != INSN_MACRO
4812
          && is_opcode_valid (amo)
4813
          && is_size_valid (amo))
4814
        {
4815
          if (is_delay_slot_valid (amo))
4816
            {
4817
              mo = amo;
4818
              break;
4819
            }
4820
          else if (!mo)
4821
            mo = amo;
4822
        }
4823 16 khays
 
4824 160 khays
      ++amo;
4825
      gas_assert (amo->name);
4826 16 khays
    }
4827 160 khays
  while (strcmp (name, amo->name) == 0);
4828 16 khays
 
4829 160 khays
  gas_assert (mo);
4830 16 khays
  create_insn (&insn, mo);
4831
  for (;;)
4832
    {
4833
      switch (*fmt++)
4834
        {
4835
        case '\0':
4836
          break;
4837
 
4838
        case ',':
4839
        case '(':
4840
        case ')':
4841
          continue;
4842
 
4843
        case '+':
4844
          switch (*fmt++)
4845
            {
4846
            case 'A':
4847
            case 'E':
4848 160 khays
              INSERT_OPERAND (mips_opts.micromips,
4849
                              EXTLSB, insn, va_arg (args, int));
4850 16 khays
              continue;
4851
 
4852
            case 'B':
4853
            case 'F':
4854
              /* Note that in the macro case, these arguments are already
4855
                 in MSB form.  (When handling the instruction in the
4856
                 non-macro case, these arguments are sizes from which
4857
                 MSB values must be calculated.)  */
4858 160 khays
              INSERT_OPERAND (mips_opts.micromips,
4859
                              INSMSB, insn, va_arg (args, int));
4860 16 khays
              continue;
4861
 
4862
            case 'C':
4863
            case 'G':
4864
            case 'H':
4865
              /* Note that in the macro case, these arguments are already
4866
                 in MSBD form.  (When handling the instruction in the
4867
                 non-macro case, these arguments are sizes from which
4868
                 MSBD values must be calculated.)  */
4869 160 khays
              INSERT_OPERAND (mips_opts.micromips,
4870
                              EXTMSBD, insn, va_arg (args, int));
4871 16 khays
              continue;
4872
 
4873
            case 'Q':
4874 160 khays
              gas_assert (!mips_opts.micromips);
4875
              INSERT_OPERAND (0, SEQI, insn, va_arg (args, int));
4876 16 khays
              continue;
4877
 
4878
            default:
4879
              internalError ();
4880
            }
4881
          continue;
4882
 
4883
        case '2':
4884 160 khays
          gas_assert (!mips_opts.micromips);
4885
          INSERT_OPERAND (0, BP, insn, va_arg (args, int));
4886 16 khays
          continue;
4887
 
4888 160 khays
        case 'n':
4889
          gas_assert (mips_opts.micromips);
4890 16 khays
        case 't':
4891
        case 'w':
4892
        case 'E':
4893 160 khays
          INSERT_OPERAND (mips_opts.micromips, RT, insn, va_arg (args, int));
4894 16 khays
          continue;
4895
 
4896
        case 'c':
4897 160 khays
          gas_assert (!mips_opts.micromips);
4898
          INSERT_OPERAND (0, CODE, insn, va_arg (args, int));
4899 16 khays
          continue;
4900
 
4901 160 khays
        case 'W':
4902
          gas_assert (!mips_opts.micromips);
4903 16 khays
        case 'T':
4904 160 khays
          INSERT_OPERAND (mips_opts.micromips, FT, insn, va_arg (args, int));
4905 16 khays
          continue;
4906
 
4907
        case 'G':
4908 160 khays
          if (mips_opts.micromips)
4909
            INSERT_OPERAND (1, RS, insn, va_arg (args, int));
4910
          else
4911
            INSERT_OPERAND (0, RD, insn, va_arg (args, int));
4912
          continue;
4913
 
4914 16 khays
        case 'K':
4915 160 khays
          gas_assert (!mips_opts.micromips);
4916
        case 'd':
4917
          INSERT_OPERAND (mips_opts.micromips, RD, insn, va_arg (args, int));
4918 16 khays
          continue;
4919
 
4920
        case 'U':
4921 160 khays
          gas_assert (!mips_opts.micromips);
4922 16 khays
          {
4923
            int tmp = va_arg (args, int);
4924
 
4925 160 khays
            INSERT_OPERAND (0, RT, insn, tmp);
4926
            INSERT_OPERAND (0, RD, insn, tmp);
4927 16 khays
          }
4928 160 khays
          continue;
4929 16 khays
 
4930
        case 'V':
4931
        case 'S':
4932 160 khays
          gas_assert (!mips_opts.micromips);
4933
          INSERT_OPERAND (0, FS, insn, va_arg (args, int));
4934 16 khays
          continue;
4935
 
4936
        case 'z':
4937
          continue;
4938
 
4939
        case '<':
4940 160 khays
          INSERT_OPERAND (mips_opts.micromips,
4941
                          SHAMT, insn, va_arg (args, int));
4942 16 khays
          continue;
4943
 
4944
        case 'D':
4945 160 khays
          gas_assert (!mips_opts.micromips);
4946
          INSERT_OPERAND (0, FD, insn, va_arg (args, int));
4947 16 khays
          continue;
4948
 
4949
        case 'B':
4950 160 khays
          gas_assert (!mips_opts.micromips);
4951
          INSERT_OPERAND (0, CODE20, insn, va_arg (args, int));
4952 16 khays
          continue;
4953
 
4954
        case 'J':
4955 160 khays
          gas_assert (!mips_opts.micromips);
4956
          INSERT_OPERAND (0, CODE19, insn, va_arg (args, int));
4957 16 khays
          continue;
4958
 
4959
        case 'q':
4960 160 khays
          gas_assert (!mips_opts.micromips);
4961
          INSERT_OPERAND (0, CODE2, insn, va_arg (args, int));
4962 16 khays
          continue;
4963
 
4964
        case 'b':
4965
        case 's':
4966
        case 'r':
4967
        case 'v':
4968 160 khays
          INSERT_OPERAND (mips_opts.micromips, RS, insn, va_arg (args, int));
4969 16 khays
          continue;
4970
 
4971
        case 'i':
4972
        case 'j':
4973
          macro_read_relocs (&args, r);
4974
          gas_assert (*r == BFD_RELOC_GPREL16
4975
                      || *r == BFD_RELOC_MIPS_HIGHER
4976
                      || *r == BFD_RELOC_HI16_S
4977
                      || *r == BFD_RELOC_LO16
4978
                      || *r == BFD_RELOC_MIPS_GOT_OFST);
4979
          continue;
4980
 
4981
        case 'o':
4982
          macro_read_relocs (&args, r);
4983
          continue;
4984
 
4985
        case 'u':
4986
          macro_read_relocs (&args, r);
4987
          gas_assert (ep != NULL
4988
                      && (ep->X_op == O_constant
4989
                          || (ep->X_op == O_symbol
4990
                              && (*r == BFD_RELOC_MIPS_HIGHEST
4991
                                  || *r == BFD_RELOC_HI16_S
4992
                                  || *r == BFD_RELOC_HI16
4993
                                  || *r == BFD_RELOC_GPREL16
4994
                                  || *r == BFD_RELOC_MIPS_GOT_HI16
4995
                                  || *r == BFD_RELOC_MIPS_CALL_HI16))));
4996
          continue;
4997
 
4998
        case 'p':
4999
          gas_assert (ep != NULL);
5000
 
5001
          /*
5002
           * This allows macro() to pass an immediate expression for
5003
           * creating short branches without creating a symbol.
5004
           *
5005
           * We don't allow branch relaxation for these branches, as
5006
           * they should only appear in ".set nomacro" anyway.
5007
           */
5008
          if (ep->X_op == O_constant)
5009
            {
5010 160 khays
              /* For microMIPS we always use relocations for branches.
5011
                 So we should not resolve immediate values.  */
5012
              gas_assert (!mips_opts.micromips);
5013
 
5014 16 khays
              if ((ep->X_add_number & 3) != 0)
5015
                as_bad (_("branch to misaligned address (0x%lx)"),
5016
                        (unsigned long) ep->X_add_number);
5017
              if ((ep->X_add_number + 0x20000) & ~0x3ffff)
5018
                as_bad (_("branch address range overflow (0x%lx)"),
5019
                        (unsigned long) ep->X_add_number);
5020
              insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
5021
              ep = NULL;
5022
            }
5023
          else
5024
            *r = BFD_RELOC_16_PCREL_S2;
5025
          continue;
5026
 
5027
        case 'a':
5028
          gas_assert (ep != NULL);
5029
          *r = BFD_RELOC_MIPS_JMP;
5030
          continue;
5031
 
5032
        case 'C':
5033 160 khays
          gas_assert (!mips_opts.micromips);
5034
          INSERT_OPERAND (0, COPZ, insn, va_arg (args, unsigned long));
5035 16 khays
          continue;
5036
 
5037
        case 'k':
5038 160 khays
          INSERT_OPERAND (mips_opts.micromips,
5039
                          CACHE, insn, va_arg (args, unsigned long));
5040 16 khays
          continue;
5041
 
5042 160 khays
        case '|':
5043
          gas_assert (mips_opts.micromips);
5044
          INSERT_OPERAND (1, TRAP, insn, va_arg (args, int));
5045
          continue;
5046
 
5047
        case '.':
5048
          gas_assert (mips_opts.micromips);
5049
          INSERT_OPERAND (1, OFFSET10, insn, va_arg (args, int));
5050
          continue;
5051
 
5052
        case '\\':
5053
          INSERT_OPERAND (mips_opts.micromips,
5054
                          3BITPOS, insn, va_arg (args, unsigned int));
5055
          continue;
5056
 
5057
        case '~':
5058
          INSERT_OPERAND (mips_opts.micromips,
5059
                          OFFSET12, insn, va_arg (args, unsigned long));
5060
          continue;
5061
 
5062
        case 'N':
5063
          gas_assert (mips_opts.micromips);
5064
          INSERT_OPERAND (1, BCC, insn, va_arg (args, int));
5065
          continue;
5066
 
5067
        case 'm':       /* Opcode extension character.  */
5068
          gas_assert (mips_opts.micromips);
5069
          switch (*fmt++)
5070
            {
5071
            case 'j':
5072
              INSERT_OPERAND (1, MJ, insn, va_arg (args, int));
5073
              break;
5074
 
5075
            case 'p':
5076
              INSERT_OPERAND (1, MP, insn, va_arg (args, int));
5077
              break;
5078
 
5079
            case 'F':
5080
              INSERT_OPERAND (1, IMMF, insn, va_arg (args, int));
5081
              break;
5082
 
5083
            default:
5084
              internalError ();
5085
            }
5086
          continue;
5087
 
5088 16 khays
        default:
5089
          internalError ();
5090
        }
5091
      break;
5092
    }
5093
  va_end (args);
5094
  gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
5095
 
5096 160 khays
  append_insn (&insn, ep, r, TRUE);
5097 16 khays
}
5098
 
5099
static void
5100
mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
5101
                    va_list *args)
5102
{
5103
  struct mips_opcode *mo;
5104
  struct mips_cl_insn insn;
5105
  bfd_reloc_code_real_type r[3]
5106
    = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
5107
 
5108
  mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
5109
  gas_assert (mo);
5110
  gas_assert (strcmp (name, mo->name) == 0);
5111
 
5112
  while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
5113
    {
5114
      ++mo;
5115
      gas_assert (mo->name);
5116
      gas_assert (strcmp (name, mo->name) == 0);
5117
    }
5118
 
5119
  create_insn (&insn, mo);
5120
  for (;;)
5121
    {
5122
      int c;
5123
 
5124
      c = *fmt++;
5125
      switch (c)
5126
        {
5127
        case '\0':
5128
          break;
5129
 
5130
        case ',':
5131
        case '(':
5132
        case ')':
5133
          continue;
5134
 
5135
        case 'y':
5136
        case 'w':
5137
          MIPS16_INSERT_OPERAND (RY, insn, va_arg (*args, int));
5138
          continue;
5139
 
5140
        case 'x':
5141
        case 'v':
5142
          MIPS16_INSERT_OPERAND (RX, insn, va_arg (*args, int));
5143
          continue;
5144
 
5145
        case 'z':
5146
          MIPS16_INSERT_OPERAND (RZ, insn, va_arg (*args, int));
5147
          continue;
5148
 
5149
        case 'Z':
5150
          MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (*args, int));
5151
          continue;
5152
 
5153
        case '0':
5154
        case 'S':
5155
        case 'P':
5156
        case 'R':
5157
          continue;
5158
 
5159
        case 'X':
5160
          MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (*args, int));
5161
          continue;
5162
 
5163
        case 'Y':
5164
          {
5165
            int regno;
5166
 
5167
            regno = va_arg (*args, int);
5168
            regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
5169
            MIPS16_INSERT_OPERAND (REG32R, insn, regno);
5170
          }
5171
          continue;
5172
 
5173
        case '<':
5174
        case '>':
5175
        case '4':
5176
        case '5':
5177
        case 'H':
5178
        case 'W':
5179
        case 'D':
5180
        case 'j':
5181
        case '8':
5182
        case 'V':
5183
        case 'C':
5184
        case 'U':
5185
        case 'k':
5186
        case 'K':
5187
        case 'p':
5188
        case 'q':
5189
          {
5190
            gas_assert (ep != NULL);
5191
 
5192
            if (ep->X_op != O_constant)
5193
              *r = (int) BFD_RELOC_UNUSED + c;
5194
            else
5195
              {
5196
                mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
5197
                              FALSE, &insn.insn_opcode, &insn.use_extend,
5198
                              &insn.extend);
5199
                ep = NULL;
5200
                *r = BFD_RELOC_UNUSED;
5201
              }
5202
          }
5203
          continue;
5204
 
5205
        case '6':
5206
          MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (*args, int));
5207
          continue;
5208
        }
5209
 
5210
      break;
5211
    }
5212
 
5213
  gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
5214
 
5215 160 khays
  append_insn (&insn, ep, r, TRUE);
5216 16 khays
}
5217
 
5218
/*
5219
 * Sign-extend 32-bit mode constants that have bit 31 set and all
5220
 * higher bits unset.
5221
 */
5222
static void
5223
normalize_constant_expr (expressionS *ex)
5224
{
5225
  if (ex->X_op == O_constant
5226
      && IS_ZEXT_32BIT_NUM (ex->X_add_number))
5227
    ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
5228
                        - 0x80000000);
5229
}
5230
 
5231
/*
5232
 * Sign-extend 32-bit mode address offsets that have bit 31 set and
5233
 * all higher bits unset.
5234
 */
5235
static void
5236
normalize_address_expr (expressionS *ex)
5237
{
5238
  if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
5239
        || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
5240
      && IS_ZEXT_32BIT_NUM (ex->X_add_number))
5241
    ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
5242
                        - 0x80000000);
5243
}
5244
 
5245
/*
5246
 * Generate a "jalr" instruction with a relocation hint to the called
5247
 * function.  This occurs in NewABI PIC code.
5248
 */
5249
static void
5250 160 khays
macro_build_jalr (expressionS *ep, int cprestore)
5251 16 khays
{
5252 160 khays
  static const bfd_reloc_code_real_type jalr_relocs[2]
5253
    = { BFD_RELOC_MIPS_JALR, BFD_RELOC_MICROMIPS_JALR };
5254
  bfd_reloc_code_real_type jalr_reloc = jalr_relocs[mips_opts.micromips];
5255
  const char *jalr;
5256 16 khays
  char *f = NULL;
5257
 
5258
  if (MIPS_JALR_HINT_P (ep))
5259
    {
5260
      frag_grow (8);
5261
      f = frag_more (0);
5262
    }
5263 160 khays
  if (!mips_opts.micromips)
5264
    macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
5265
  else
5266
    {
5267
      jalr = mips_opts.noreorder && !cprestore ? "jalr" : "jalrs";
5268
      if (MIPS_JALR_HINT_P (ep))
5269
        macro_build (NULL, jalr, "t,s", RA, PIC_CALL_REG);
5270
      else
5271
        macro_build (NULL, jalr, "mj", PIC_CALL_REG);
5272
    }
5273 16 khays
  if (MIPS_JALR_HINT_P (ep))
5274 160 khays
    fix_new_exp (frag_now, f - frag_now->fr_literal, 4, ep, FALSE, jalr_reloc);
5275 16 khays
}
5276
 
5277
/*
5278
 * Generate a "lui" instruction.
5279
 */
5280
static void
5281
macro_build_lui (expressionS *ep, int regnum)
5282
{
5283
  gas_assert (! mips_opts.mips16);
5284
 
5285 160 khays
  if (ep->X_op != O_constant)
5286 16 khays
    {
5287
      gas_assert (ep->X_op == O_symbol);
5288
      /* _gp_disp is a special case, used from s_cpload.
5289
         __gnu_local_gp is used if mips_no_shared.  */
5290
      gas_assert (mips_pic == NO_PIC
5291
              || (! HAVE_NEWABI
5292
                  && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
5293
              || (! mips_in_shared
5294
                  && strcmp (S_GET_NAME (ep->X_add_symbol),
5295
                             "__gnu_local_gp") == 0));
5296
    }
5297
 
5298 160 khays
  macro_build (ep, "lui", LUI_FMT, regnum, BFD_RELOC_HI16_S);
5299 16 khays
}
5300
 
5301
/* Generate a sequence of instructions to do a load or store from a constant
5302
   offset off of a base register (breg) into/from a target register (treg),
5303
   using AT if necessary.  */
5304
static void
5305
macro_build_ldst_constoffset (expressionS *ep, const char *op,
5306
                              int treg, int breg, int dbl)
5307
{
5308
  gas_assert (ep->X_op == O_constant);
5309
 
5310
  /* Sign-extending 32-bit constants makes their handling easier.  */
5311
  if (!dbl)
5312
    normalize_constant_expr (ep);
5313
 
5314
  /* Right now, this routine can only handle signed 32-bit constants.  */
5315
  if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
5316
    as_warn (_("operand overflow"));
5317
 
5318
  if (IS_SEXT_16BIT_NUM(ep->X_add_number))
5319
    {
5320
      /* Signed 16-bit offset will fit in the op.  Easy!  */
5321
      macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
5322
    }
5323
  else
5324
    {
5325
      /* 32-bit offset, need multiple instructions and AT, like:
5326
           lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
5327
           addu     $tempreg,$tempreg,$breg
5328
           <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
5329
         to handle the complete offset.  */
5330
      macro_build_lui (ep, AT);
5331
      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
5332
      macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
5333
 
5334
      if (!mips_opts.at)
5335
        as_bad (_("Macro used $at after \".set noat\""));
5336
    }
5337
}
5338
 
5339
/*                      set_at()
5340
 * Generates code to set the $at register to true (one)
5341
 * if reg is less than the immediate expression.
5342
 */
5343
static void
5344
set_at (int reg, int unsignedp)
5345
{
5346
  if (imm_expr.X_op == O_constant
5347
      && imm_expr.X_add_number >= -0x8000
5348
      && imm_expr.X_add_number < 0x8000)
5349
    macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
5350
                 AT, reg, BFD_RELOC_LO16);
5351
  else
5352
    {
5353
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
5354
      macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
5355
    }
5356
}
5357
 
5358
/* Warn if an expression is not a constant.  */
5359
 
5360
static void
5361
check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
5362
{
5363
  if (ex->X_op == O_big)
5364
    as_bad (_("unsupported large constant"));
5365
  else if (ex->X_op != O_constant)
5366
    as_bad (_("Instruction %s requires absolute expression"),
5367
            ip->insn_mo->name);
5368
 
5369
  if (HAVE_32BIT_GPRS)
5370
    normalize_constant_expr (ex);
5371
}
5372
 
5373
/* Count the leading zeroes by performing a binary chop. This is a
5374
   bulky bit of source, but performance is a LOT better for the
5375
   majority of values than a simple loop to count the bits:
5376
       for (lcnt = 0; (lcnt < 32); lcnt++)
5377
         if ((v) & (1 << (31 - lcnt)))
5378
           break;
5379
  However it is not code size friendly, and the gain will drop a bit
5380
  on certain cached systems.
5381
*/
5382
#define COUNT_TOP_ZEROES(v)             \
5383
  (((v) & ~0xffff) == 0                 \
5384
   ? ((v) & ~0xff) == 0                 \
5385
     ? ((v) & ~0xf) == 0                \
5386
       ? ((v) & ~0x3) == 0              \
5387
         ? ((v) & ~0x1) == 0            \
5388
           ? !(v)                       \
5389
             ? 32                       \
5390
             : 31                       \
5391
           : 30                         \
5392
         : ((v) & ~0x7) == 0            \
5393
           ? 29                         \
5394
           : 28                         \
5395
       : ((v) & ~0x3f) == 0             \
5396
         ? ((v) & ~0x1f) == 0           \
5397
           ? 27                         \
5398
           : 26                         \
5399
         : ((v) & ~0x7f) == 0           \
5400
           ? 25                         \
5401
           : 24                         \
5402
     : ((v) & ~0xfff) == 0              \
5403
       ? ((v) & ~0x3ff) == 0            \
5404
         ? ((v) & ~0x1ff) == 0          \
5405
           ? 23                         \
5406
           : 22                         \
5407
         : ((v) & ~0x7ff) == 0          \
5408
           ? 21                         \
5409
           : 20                         \
5410
       : ((v) & ~0x3fff) == 0           \
5411
         ? ((v) & ~0x1fff) == 0         \
5412
           ? 19                         \
5413
           : 18                         \
5414
         : ((v) & ~0x7fff) == 0         \
5415
           ? 17                         \
5416
           : 16                         \
5417
   : ((v) & ~0xffffff) == 0             \
5418
     ? ((v) & ~0xfffff) == 0            \
5419
       ? ((v) & ~0x3ffff) == 0          \
5420
         ? ((v) & ~0x1ffff) == 0        \
5421
           ? 15                         \
5422
           : 14                         \
5423
         : ((v) & ~0x7ffff) == 0        \
5424
           ? 13                         \
5425
           : 12                         \
5426
       : ((v) & ~0x3fffff) == 0         \
5427
         ? ((v) & ~0x1fffff) == 0       \
5428
           ? 11                         \
5429
           : 10                         \
5430
         : ((v) & ~0x7fffff) == 0       \
5431
           ? 9                          \
5432
           : 8                          \
5433
     : ((v) & ~0xfffffff) == 0          \
5434
       ? ((v) & ~0x3ffffff) == 0        \
5435
         ? ((v) & ~0x1ffffff) == 0      \
5436
           ? 7                          \
5437
           : 6                          \
5438
         : ((v) & ~0x7ffffff) == 0      \
5439
           ? 5                          \
5440
           : 4                          \
5441
       : ((v) & ~0x3fffffff) == 0       \
5442
         ? ((v) & ~0x1fffffff) == 0     \
5443
           ? 3                          \
5444
           : 2                          \
5445
         : ((v) & ~0x7fffffff) == 0     \
5446
           ? 1                          \
5447
           : 0)
5448
 
5449
/*                      load_register()
5450
 *  This routine generates the least number of instructions necessary to load
5451
 *  an absolute expression value into a register.
5452
 */
5453
static void
5454
load_register (int reg, expressionS *ep, int dbl)
5455
{
5456
  int freg;
5457
  expressionS hi32, lo32;
5458
 
5459
  if (ep->X_op != O_big)
5460
    {
5461
      gas_assert (ep->X_op == O_constant);
5462
 
5463
      /* Sign-extending 32-bit constants makes their handling easier.  */
5464
      if (!dbl)
5465
        normalize_constant_expr (ep);
5466
 
5467
      if (IS_SEXT_16BIT_NUM (ep->X_add_number))
5468
        {
5469
          /* We can handle 16 bit signed values with an addiu to
5470
             $zero.  No need to ever use daddiu here, since $zero and
5471
             the result are always correct in 32 bit mode.  */
5472
          macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5473
          return;
5474
        }
5475
      else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
5476
        {
5477
          /* We can handle 16 bit unsigned values with an ori to
5478
             $zero.  */
5479
          macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
5480
          return;
5481
        }
5482
      else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
5483
        {
5484
          /* 32 bit values require an lui.  */
5485 160 khays
          macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
5486 16 khays
          if ((ep->X_add_number & 0xffff) != 0)
5487
            macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
5488
          return;
5489
        }
5490
    }
5491
 
5492
  /* The value is larger than 32 bits.  */
5493
 
5494
  if (!dbl || HAVE_32BIT_GPRS)
5495
    {
5496
      char value[32];
5497
 
5498
      sprintf_vma (value, ep->X_add_number);
5499
      as_bad (_("Number (0x%s) larger than 32 bits"), value);
5500
      macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5501
      return;
5502
    }
5503
 
5504
  if (ep->X_op != O_big)
5505
    {
5506
      hi32 = *ep;
5507
      hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
5508
      hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
5509
      hi32.X_add_number &= 0xffffffff;
5510
      lo32 = *ep;
5511
      lo32.X_add_number &= 0xffffffff;
5512
    }
5513
  else
5514
    {
5515
      gas_assert (ep->X_add_number > 2);
5516
      if (ep->X_add_number == 3)
5517
        generic_bignum[3] = 0;
5518
      else if (ep->X_add_number > 4)
5519
        as_bad (_("Number larger than 64 bits"));
5520
      lo32.X_op = O_constant;
5521
      lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
5522
      hi32.X_op = O_constant;
5523
      hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
5524
    }
5525
 
5526
  if (hi32.X_add_number == 0)
5527
    freg = 0;
5528
  else
5529
    {
5530
      int shift, bit;
5531
      unsigned long hi, lo;
5532
 
5533
      if (hi32.X_add_number == (offsetT) 0xffffffff)
5534
        {
5535
          if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
5536
            {
5537
              macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5538
              return;
5539
            }
5540
          if (lo32.X_add_number & 0x80000000)
5541
            {
5542 160 khays
              macro_build (&lo32, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
5543 16 khays
              if (lo32.X_add_number & 0xffff)
5544
                macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
5545
              return;
5546
            }
5547
        }
5548
 
5549
      /* Check for 16bit shifted constant.  We know that hi32 is
5550
         non-zero, so start the mask on the first bit of the hi32
5551
         value.  */
5552
      shift = 17;
5553
      do
5554
        {
5555
          unsigned long himask, lomask;
5556
 
5557
          if (shift < 32)
5558
            {
5559
              himask = 0xffff >> (32 - shift);
5560
              lomask = (0xffff << shift) & 0xffffffff;
5561
            }
5562
          else
5563
            {
5564
              himask = 0xffff << (shift - 32);
5565
              lomask = 0;
5566
            }
5567
          if ((hi32.X_add_number & ~(offsetT) himask) == 0
5568
              && (lo32.X_add_number & ~(offsetT) lomask) == 0)
5569
            {
5570
              expressionS tmp;
5571
 
5572
              tmp.X_op = O_constant;
5573
              if (shift < 32)
5574
                tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
5575
                                    | (lo32.X_add_number >> shift));
5576
              else
5577
                tmp.X_add_number = hi32.X_add_number >> (shift - 32);
5578
              macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
5579 160 khays
              macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", SHFT_FMT,
5580 16 khays
                           reg, reg, (shift >= 32) ? shift - 32 : shift);
5581
              return;
5582
            }
5583
          ++shift;
5584
        }
5585
      while (shift <= (64 - 16));
5586
 
5587
      /* Find the bit number of the lowest one bit, and store the
5588
         shifted value in hi/lo.  */
5589
      hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
5590
      lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
5591
      if (lo != 0)
5592
        {
5593
          bit = 0;
5594
          while ((lo & 1) == 0)
5595
            {
5596
              lo >>= 1;
5597
              ++bit;
5598
            }
5599
          lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
5600
          hi >>= bit;
5601
        }
5602
      else
5603
        {
5604
          bit = 32;
5605
          while ((hi & 1) == 0)
5606
            {
5607
              hi >>= 1;
5608
              ++bit;
5609
            }
5610
          lo = hi;
5611
          hi = 0;
5612
        }
5613
 
5614
      /* Optimize if the shifted value is a (power of 2) - 1.  */
5615
      if ((hi == 0 && ((lo + 1) & lo) == 0)
5616
          || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
5617
        {
5618
          shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
5619
          if (shift != 0)
5620
            {
5621
              expressionS tmp;
5622
 
5623
              /* This instruction will set the register to be all
5624
                 ones.  */
5625
              tmp.X_op = O_constant;
5626
              tmp.X_add_number = (offsetT) -1;
5627
              macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5628
              if (bit != 0)
5629
                {
5630
                  bit += shift;
5631 160 khays
                  macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", SHFT_FMT,
5632 16 khays
                               reg, reg, (bit >= 32) ? bit - 32 : bit);
5633
                }
5634 160 khays
              macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", SHFT_FMT,
5635 16 khays
                           reg, reg, (shift >= 32) ? shift - 32 : shift);
5636
              return;
5637
            }
5638
        }
5639
 
5640
      /* Sign extend hi32 before calling load_register, because we can
5641
         generally get better code when we load a sign extended value.  */
5642
      if ((hi32.X_add_number & 0x80000000) != 0)
5643
        hi32.X_add_number |= ~(offsetT) 0xffffffff;
5644
      load_register (reg, &hi32, 0);
5645
      freg = reg;
5646
    }
5647
  if ((lo32.X_add_number & 0xffff0000) == 0)
5648
    {
5649
      if (freg != 0)
5650
        {
5651 160 khays
          macro_build (NULL, "dsll32", SHFT_FMT, reg, freg, 0);
5652 16 khays
          freg = reg;
5653
        }
5654
    }
5655
  else
5656
    {
5657
      expressionS mid16;
5658
 
5659
      if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
5660
        {
5661 160 khays
          macro_build (&lo32, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
5662
          macro_build (NULL, "dsrl32", SHFT_FMT, reg, reg, 0);
5663 16 khays
          return;
5664
        }
5665
 
5666
      if (freg != 0)
5667
        {
5668 160 khays
          macro_build (NULL, "dsll", SHFT_FMT, reg, freg, 16);
5669 16 khays
          freg = reg;
5670
        }
5671
      mid16 = lo32;
5672
      mid16.X_add_number >>= 16;
5673
      macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
5674 160 khays
      macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
5675 16 khays
      freg = reg;
5676
    }
5677
  if ((lo32.X_add_number & 0xffff) != 0)
5678
    macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
5679
}
5680
 
5681
static inline void
5682
load_delay_nop (void)
5683
{
5684
  if (!gpr_interlocks)
5685
    macro_build (NULL, "nop", "");
5686
}
5687
 
5688
/* Load an address into a register.  */
5689
 
5690
static void
5691
load_address (int reg, expressionS *ep, int *used_at)
5692
{
5693
  if (ep->X_op != O_constant
5694
      && ep->X_op != O_symbol)
5695
    {
5696
      as_bad (_("expression too complex"));
5697
      ep->X_op = O_constant;
5698
    }
5699
 
5700
  if (ep->X_op == O_constant)
5701
    {
5702
      load_register (reg, ep, HAVE_64BIT_ADDRESSES);
5703
      return;
5704
    }
5705
 
5706
  if (mips_pic == NO_PIC)
5707
    {
5708
      /* If this is a reference to a GP relative symbol, we want
5709
           addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
5710
         Otherwise we want
5711
           lui          $reg,<sym>              (BFD_RELOC_HI16_S)
5712
           addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
5713
         If we have an addend, we always use the latter form.
5714
 
5715
         With 64bit address space and a usable $at we want
5716
           lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
5717
           lui          $at,<sym>               (BFD_RELOC_HI16_S)
5718
           daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
5719
           daddiu       $at,<sym>               (BFD_RELOC_LO16)
5720
           dsll32       $reg,0
5721
           daddu        $reg,$reg,$at
5722
 
5723
         If $at is already in use, we use a path which is suboptimal
5724
         on superscalar processors.
5725
           lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
5726
           daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
5727
           dsll         $reg,16
5728
           daddiu       $reg,<sym>              (BFD_RELOC_HI16_S)
5729
           dsll         $reg,16
5730
           daddiu       $reg,<sym>              (BFD_RELOC_LO16)
5731
 
5732
         For GP relative symbols in 64bit address space we can use
5733
         the same sequence as in 32bit address space.  */
5734
      if (HAVE_64BIT_SYMBOLS)
5735
        {
5736
          if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
5737
              && !nopic_need_relax (ep->X_add_symbol, 1))
5738
            {
5739
              relax_start (ep->X_add_symbol);
5740
              macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
5741
                           mips_gp_register, BFD_RELOC_GPREL16);
5742
              relax_switch ();
5743
            }
5744
 
5745
          if (*used_at == 0 && mips_opts.at)
5746
            {
5747 160 khays
              macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_HIGHEST);
5748
              macro_build (ep, "lui", LUI_FMT, AT, BFD_RELOC_HI16_S);
5749 16 khays
              macro_build (ep, "daddiu", "t,r,j", reg, reg,
5750
                           BFD_RELOC_MIPS_HIGHER);
5751
              macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
5752 160 khays
              macro_build (NULL, "dsll32", SHFT_FMT, reg, reg, 0);
5753 16 khays
              macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
5754
              *used_at = 1;
5755
            }
5756
          else
5757
            {
5758 160 khays
              macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_HIGHEST);
5759 16 khays
              macro_build (ep, "daddiu", "t,r,j", reg, reg,
5760
                           BFD_RELOC_MIPS_HIGHER);
5761 160 khays
              macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
5762 16 khays
              macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
5763 160 khays
              macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
5764 16 khays
              macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
5765
            }
5766
 
5767
          if (mips_relax.sequence)
5768
            relax_end ();
5769
        }
5770
      else
5771
        {
5772
          if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
5773
              && !nopic_need_relax (ep->X_add_symbol, 1))
5774
            {
5775
              relax_start (ep->X_add_symbol);
5776
              macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
5777
                           mips_gp_register, BFD_RELOC_GPREL16);
5778
              relax_switch ();
5779
            }
5780
          macro_build_lui (ep, reg);
5781
          macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
5782
                       reg, reg, BFD_RELOC_LO16);
5783
          if (mips_relax.sequence)
5784
            relax_end ();
5785
        }
5786
    }
5787
  else if (!mips_big_got)
5788
    {
5789
      expressionS ex;
5790
 
5791
      /* If this is a reference to an external symbol, we want
5792
           lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
5793
         Otherwise we want
5794
           lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
5795
           nop
5796
           addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
5797
         If there is a constant, it must be added in after.
5798
 
5799
         If we have NewABI, we want
5800
           lw           $reg,<sym+cst>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5801
         unless we're referencing a global symbol with a non-zero
5802
         offset, in which case cst must be added separately.  */
5803
      if (HAVE_NEWABI)
5804
        {
5805
          if (ep->X_add_number)
5806
            {
5807
              ex.X_add_number = ep->X_add_number;
5808
              ep->X_add_number = 0;
5809
              relax_start (ep->X_add_symbol);
5810
              macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
5811
                           BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5812
              if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
5813
                as_bad (_("PIC code offset overflow (max 16 signed bits)"));
5814
              ex.X_op = O_constant;
5815
              macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
5816
                           reg, reg, BFD_RELOC_LO16);
5817
              ep->X_add_number = ex.X_add_number;
5818
              relax_switch ();
5819
            }
5820
          macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
5821
                       BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5822
          if (mips_relax.sequence)
5823
            relax_end ();
5824
        }
5825
      else
5826
        {
5827
          ex.X_add_number = ep->X_add_number;
5828
          ep->X_add_number = 0;
5829
          macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
5830
                       BFD_RELOC_MIPS_GOT16, mips_gp_register);
5831
          load_delay_nop ();
5832
          relax_start (ep->X_add_symbol);
5833
          relax_switch ();
5834
          macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
5835
                       BFD_RELOC_LO16);
5836
          relax_end ();
5837
 
5838
          if (ex.X_add_number != 0)
5839
            {
5840
              if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
5841
                as_bad (_("PIC code offset overflow (max 16 signed bits)"));
5842
              ex.X_op = O_constant;
5843
              macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
5844
                           reg, reg, BFD_RELOC_LO16);
5845
            }
5846
        }
5847
    }
5848
  else if (mips_big_got)
5849
    {
5850
      expressionS ex;
5851
 
5852
      /* This is the large GOT case.  If this is a reference to an
5853
         external symbol, we want
5854
           lui          $reg,<sym>              (BFD_RELOC_MIPS_GOT_HI16)
5855
           addu         $reg,$reg,$gp
5856
           lw           $reg,<sym>($reg)        (BFD_RELOC_MIPS_GOT_LO16)
5857
 
5858
         Otherwise, for a reference to a local symbol in old ABI, we want
5859
           lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
5860
           nop
5861
           addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
5862
         If there is a constant, it must be added in after.
5863
 
5864
         In the NewABI, for local symbols, with or without offsets, we want:
5865
           lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
5866
           addiu        $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
5867
      */
5868
      if (HAVE_NEWABI)
5869
        {
5870
          ex.X_add_number = ep->X_add_number;
5871
          ep->X_add_number = 0;
5872
          relax_start (ep->X_add_symbol);
5873 160 khays
          macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_GOT_HI16);
5874 16 khays
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5875
                       reg, reg, mips_gp_register);
5876
          macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
5877
                       reg, BFD_RELOC_MIPS_GOT_LO16, reg);
5878
          if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
5879
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
5880
          else if (ex.X_add_number)
5881
            {
5882
              ex.X_op = O_constant;
5883
              macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
5884
                           BFD_RELOC_LO16);
5885
            }
5886
 
5887
          ep->X_add_number = ex.X_add_number;
5888
          relax_switch ();
5889
          macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
5890
                       BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
5891
          macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
5892
                       BFD_RELOC_MIPS_GOT_OFST);
5893
          relax_end ();
5894
        }
5895
      else
5896
        {
5897
          ex.X_add_number = ep->X_add_number;
5898
          ep->X_add_number = 0;
5899
          relax_start (ep->X_add_symbol);
5900 160 khays
          macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_GOT_HI16);
5901 16 khays
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5902
                       reg, reg, mips_gp_register);
5903
          macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
5904
                       reg, BFD_RELOC_MIPS_GOT_LO16, reg);
5905
          relax_switch ();
5906
          if (reg_needs_delay (mips_gp_register))
5907
            {
5908
              /* We need a nop before loading from $gp.  This special
5909
                 check is required because the lui which starts the main
5910
                 instruction stream does not refer to $gp, and so will not
5911
                 insert the nop which may be required.  */
5912
              macro_build (NULL, "nop", "");
5913
            }
5914
          macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
5915
                       BFD_RELOC_MIPS_GOT16, mips_gp_register);
5916
          load_delay_nop ();
5917
          macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
5918
                       BFD_RELOC_LO16);
5919
          relax_end ();
5920
 
5921
          if (ex.X_add_number != 0)
5922
            {
5923
              if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
5924
                as_bad (_("PIC code offset overflow (max 16 signed bits)"));
5925
              ex.X_op = O_constant;
5926
              macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
5927
                           BFD_RELOC_LO16);
5928
            }
5929
        }
5930
    }
5931
  else
5932
    abort ();
5933
 
5934
  if (!mips_opts.at && *used_at == 1)
5935
    as_bad (_("Macro used $at after \".set noat\""));
5936
}
5937
 
5938
/* Move the contents of register SOURCE into register DEST.  */
5939
 
5940
static void
5941
move_register (int dest, int source)
5942
{
5943 160 khays
  /* Prefer to use a 16-bit microMIPS instruction unless the previous
5944
     instruction specifically requires a 32-bit one.  */
5945
  if (mips_opts.micromips
5946
      && !(history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
5947 163 khays
    macro_build (NULL, "move", "mp,mj", dest, source);
5948 160 khays
  else
5949
    macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
5950
                 dest, source, 0);
5951 16 khays
}
5952
 
5953
/* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
5954
   LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
5955
   The two alternatives are:
5956
 
5957
   Global symbol                Local sybmol
5958
   -------------                ------------
5959
   lw DEST,%got(SYMBOL)         lw DEST,%got(SYMBOL + OFFSET)
5960
   ...                          ...
5961
   addiu DEST,DEST,OFFSET       addiu DEST,DEST,%lo(SYMBOL + OFFSET)
5962
 
5963
   load_got_offset emits the first instruction and add_got_offset
5964
   emits the second for a 16-bit offset or add_got_offset_hilo emits
5965
   a sequence to add a 32-bit offset using a scratch register.  */
5966
 
5967
static void
5968
load_got_offset (int dest, expressionS *local)
5969
{
5970
  expressionS global;
5971
 
5972
  global = *local;
5973
  global.X_add_number = 0;
5974
 
5975
  relax_start (local->X_add_symbol);
5976
  macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
5977
               BFD_RELOC_MIPS_GOT16, mips_gp_register);
5978
  relax_switch ();
5979
  macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
5980
               BFD_RELOC_MIPS_GOT16, mips_gp_register);
5981
  relax_end ();
5982
}
5983
 
5984
static void
5985
add_got_offset (int dest, expressionS *local)
5986
{
5987
  expressionS global;
5988
 
5989
  global.X_op = O_constant;
5990
  global.X_op_symbol = NULL;
5991
  global.X_add_symbol = NULL;
5992
  global.X_add_number = local->X_add_number;
5993
 
5994
  relax_start (local->X_add_symbol);
5995
  macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
5996
               dest, dest, BFD_RELOC_LO16);
5997
  relax_switch ();
5998
  macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
5999
  relax_end ();
6000
}
6001
 
6002
static void
6003
add_got_offset_hilo (int dest, expressionS *local, int tmp)
6004
{
6005
  expressionS global;
6006
  int hold_mips_optimize;
6007
 
6008
  global.X_op = O_constant;
6009
  global.X_op_symbol = NULL;
6010
  global.X_add_symbol = NULL;
6011
  global.X_add_number = local->X_add_number;
6012
 
6013
  relax_start (local->X_add_symbol);
6014
  load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
6015
  relax_switch ();
6016
  /* Set mips_optimize around the lui instruction to avoid
6017
     inserting an unnecessary nop after the lw.  */
6018
  hold_mips_optimize = mips_optimize;
6019
  mips_optimize = 2;
6020
  macro_build_lui (&global, tmp);
6021
  mips_optimize = hold_mips_optimize;
6022
  macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
6023
  relax_end ();
6024
 
6025
  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
6026
}
6027
 
6028 160 khays
/* Emit a sequence of instructions to emulate a branch likely operation.
6029
   BR is an ordinary branch corresponding to one to be emulated.  BRNEG
6030
   is its complementing branch with the original condition negated.
6031
   CALL is set if the original branch specified the link operation.
6032
   EP, FMT, SREG and TREG specify the usual macro_build() parameters.
6033
 
6034
   Code like this is produced in the noreorder mode:
6035
 
6036
        BRNEG   <args>, 1f
6037
         nop
6038
        b       <sym>
6039
         delay slot (executed only if branch taken)
6040
    1:
6041
 
6042
   or, if CALL is set:
6043
 
6044
        BRNEG   <args>, 1f
6045
         nop
6046
        bal     <sym>
6047
         delay slot (executed only if branch taken)
6048
    1:
6049
 
6050
   In the reorder mode the delay slot would be filled with a nop anyway,
6051
   so code produced is simply:
6052
 
6053
        BR      <args>, <sym>
6054
         nop
6055
 
6056
   This function is used when producing code for the microMIPS ASE that
6057
   does not implement branch likely instructions in hardware.  */
6058
 
6059
static void
6060
macro_build_branch_likely (const char *br, const char *brneg,
6061
                           int call, expressionS *ep, const char *fmt,
6062
                           unsigned int sreg, unsigned int treg)
6063
{
6064
  int noreorder = mips_opts.noreorder;
6065
  expressionS expr1;
6066
 
6067
  gas_assert (mips_opts.micromips);
6068
  start_noreorder ();
6069
  if (noreorder)
6070
    {
6071
      micromips_label_expr (&expr1);
6072
      macro_build (&expr1, brneg, fmt, sreg, treg);
6073
      macro_build (NULL, "nop", "");
6074
      macro_build (ep, call ? "bal" : "b", "p");
6075
 
6076
      /* Set to true so that append_insn adds a label.  */
6077
      emit_branch_likely_macro = TRUE;
6078
    }
6079
  else
6080
    {
6081
      macro_build (ep, br, fmt, sreg, treg);
6082
      macro_build (NULL, "nop", "");
6083
    }
6084
  end_noreorder ();
6085
}
6086
 
6087
/* Emit a coprocessor branch-likely macro specified by TYPE, using CC as
6088
   the condition code tested.  EP specifies the branch target.  */
6089
 
6090
static void
6091
macro_build_branch_ccl (int type, expressionS *ep, unsigned int cc)
6092
{
6093
  const int call = 0;
6094
  const char *brneg;
6095
  const char *br;
6096
 
6097
  switch (type)
6098
    {
6099
    case M_BC1FL:
6100
      br = "bc1f";
6101
      brneg = "bc1t";
6102
      break;
6103
    case M_BC1TL:
6104
      br = "bc1t";
6105
      brneg = "bc1f";
6106
      break;
6107
    case M_BC2FL:
6108
      br = "bc2f";
6109
      brneg = "bc2t";
6110
      break;
6111
    case M_BC2TL:
6112
      br = "bc2t";
6113
      brneg = "bc2f";
6114
      break;
6115
    default:
6116
      abort ();
6117
    }
6118
  macro_build_branch_likely (br, brneg, call, ep, "N,p", cc, ZERO);
6119
}
6120
 
6121
/* Emit a two-argument branch macro specified by TYPE, using SREG as
6122
   the register tested.  EP specifies the branch target.  */
6123
 
6124
static void
6125
macro_build_branch_rs (int type, expressionS *ep, unsigned int sreg)
6126
{
6127
  const char *brneg = NULL;
6128
  const char *br;
6129
  int call = 0;
6130
 
6131
  switch (type)
6132
    {
6133
    case M_BGEZ:
6134
      br = "bgez";
6135
      break;
6136
    case M_BGEZL:
6137
      br = mips_opts.micromips ? "bgez" : "bgezl";
6138
      brneg = "bltz";
6139
      break;
6140
    case M_BGEZALL:
6141
      gas_assert (mips_opts.micromips);
6142
      br = "bgezals";
6143
      brneg = "bltz";
6144
      call = 1;
6145
      break;
6146
    case M_BGTZ:
6147
      br = "bgtz";
6148
      break;
6149
    case M_BGTZL:
6150
      br = mips_opts.micromips ? "bgtz" : "bgtzl";
6151
      brneg = "blez";
6152
      break;
6153
    case M_BLEZ:
6154
      br = "blez";
6155
      break;
6156
    case M_BLEZL:
6157
      br = mips_opts.micromips ? "blez" : "blezl";
6158
      brneg = "bgtz";
6159
      break;
6160
    case M_BLTZ:
6161
      br = "bltz";
6162
      break;
6163
    case M_BLTZL:
6164
      br = mips_opts.micromips ? "bltz" : "bltzl";
6165
      brneg = "bgez";
6166
      break;
6167
    case M_BLTZALL:
6168
      gas_assert (mips_opts.micromips);
6169
      br = "bltzals";
6170
      brneg = "bgez";
6171
      call = 1;
6172
      break;
6173
    default:
6174
      abort ();
6175
    }
6176
  if (mips_opts.micromips && brneg)
6177
    macro_build_branch_likely (br, brneg, call, ep, "s,p", sreg, ZERO);
6178
  else
6179
    macro_build (ep, br, "s,p", sreg);
6180
}
6181
 
6182
/* Emit a three-argument branch macro specified by TYPE, using SREG and
6183
   TREG as the registers tested.  EP specifies the branch target.  */
6184
 
6185
static void
6186
macro_build_branch_rsrt (int type, expressionS *ep,
6187
                         unsigned int sreg, unsigned int treg)
6188
{
6189
  const char *brneg = NULL;
6190
  const int call = 0;
6191
  const char *br;
6192
 
6193
  switch (type)
6194
    {
6195
    case M_BEQ:
6196
    case M_BEQ_I:
6197
      br = "beq";
6198
      break;
6199
    case M_BEQL:
6200
    case M_BEQL_I:
6201
      br = mips_opts.micromips ? "beq" : "beql";
6202
      brneg = "bne";
6203
      break;
6204
    case M_BNE:
6205
    case M_BNE_I:
6206
      br = "bne";
6207
      break;
6208
    case M_BNEL:
6209
    case M_BNEL_I:
6210
      br = mips_opts.micromips ? "bne" : "bnel";
6211
      brneg = "beq";
6212
      break;
6213
    default:
6214
      abort ();
6215
    }
6216
  if (mips_opts.micromips && brneg)
6217
    macro_build_branch_likely (br, brneg, call, ep, "s,t,p", sreg, treg);
6218
  else
6219
    macro_build (ep, br, "s,t,p", sreg, treg);
6220
}
6221
 
6222 16 khays
/*
6223
 *                      Build macros
6224
 *   This routine implements the seemingly endless macro or synthesized
6225
 * instructions and addressing modes in the mips assembly language. Many
6226
 * of these macros are simple and are similar to each other. These could
6227
 * probably be handled by some kind of table or grammar approach instead of
6228
 * this verbose method. Others are not simple macros but are more like
6229
 * optimizing code generation.
6230
 *   One interesting optimization is when several store macros appear
6231
 * consecutively that would load AT with the upper half of the same address.
6232
 * The ensuing load upper instructions are ommited. This implies some kind
6233
 * of global optimization. We currently only optimize within a single macro.
6234
 *   For many of the load and store macros if the address is specified as a
6235
 * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
6236
 * first load register 'at' with zero and use it as the base register. The
6237
 * mips assembler simply uses register $zero. Just one tiny optimization
6238
 * we're missing.
6239
 */
6240
static void
6241
macro (struct mips_cl_insn *ip)
6242
{
6243
  unsigned int treg, sreg, dreg, breg;
6244
  unsigned int tempreg;
6245
  int mask;
6246
  int used_at = 0;
6247 160 khays
  expressionS label_expr;
6248 16 khays
  expressionS expr1;
6249 160 khays
  expressionS *ep;
6250 16 khays
  const char *s;
6251
  const char *s2;
6252
  const char *fmt;
6253
  int likely = 0;
6254 160 khays
  int coproc = 0;
6255
  int off12 = 0;
6256
  int call = 0;
6257
  int jals = 0;
6258 16 khays
  int dbl = 0;
6259
  int imm = 0;
6260 160 khays
  int ust = 0;
6261
  int lp = 0;
6262
  int ab = 0;
6263 16 khays
  int off;
6264
  offsetT maxnum;
6265
  bfd_reloc_code_real_type r;
6266
  int hold_mips_optimize;
6267
 
6268
  gas_assert (! mips_opts.mips16);
6269
 
6270 160 khays
  treg = EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
6271
  dreg = EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
6272
  sreg = breg = EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
6273 16 khays
  mask = ip->insn_mo->mask;
6274
 
6275 160 khays
  label_expr.X_op = O_constant;
6276
  label_expr.X_op_symbol = NULL;
6277
  label_expr.X_add_symbol = NULL;
6278
  label_expr.X_add_number = 0;
6279
 
6280 16 khays
  expr1.X_op = O_constant;
6281
  expr1.X_op_symbol = NULL;
6282
  expr1.X_add_symbol = NULL;
6283
  expr1.X_add_number = 1;
6284
 
6285
  switch (mask)
6286
    {
6287
    case M_DABS:
6288
      dbl = 1;
6289
    case M_ABS:
6290 160 khays
      /*    bgez    $a0,1f
6291
            move    v0,$a0
6292
            sub     v0,$zero,$a0
6293
         1:
6294
       */
6295 16 khays
 
6296
      start_noreorder ();
6297
 
6298 160 khays
      if (mips_opts.micromips)
6299
        micromips_label_expr (&label_expr);
6300
      else
6301
        label_expr.X_add_number = 8;
6302
      macro_build (&label_expr, "bgez", "s,p", sreg);
6303 16 khays
      if (dreg == sreg)
6304
        macro_build (NULL, "nop", "");
6305
      else
6306
        move_register (dreg, sreg);
6307
      macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
6308 160 khays
      if (mips_opts.micromips)
6309
        micromips_add_label ();
6310 16 khays
 
6311
      end_noreorder ();
6312
      break;
6313
 
6314
    case M_ADD_I:
6315
      s = "addi";
6316
      s2 = "add";
6317
      goto do_addi;
6318
    case M_ADDU_I:
6319
      s = "addiu";
6320
      s2 = "addu";
6321
      goto do_addi;
6322
    case M_DADD_I:
6323
      dbl = 1;
6324
      s = "daddi";
6325
      s2 = "dadd";
6326 160 khays
      if (!mips_opts.micromips)
6327
        goto do_addi;
6328
      if (imm_expr.X_op == O_constant
6329
          && imm_expr.X_add_number >= -0x200
6330
          && imm_expr.X_add_number < 0x200)
6331
        {
6332
          macro_build (NULL, s, "t,r,.", treg, sreg, imm_expr.X_add_number);
6333
          break;
6334
        }
6335
      goto do_addi_i;
6336 16 khays
    case M_DADDU_I:
6337
      dbl = 1;
6338
      s = "daddiu";
6339
      s2 = "daddu";
6340
    do_addi:
6341
      if (imm_expr.X_op == O_constant
6342
          && imm_expr.X_add_number >= -0x8000
6343
          && imm_expr.X_add_number < 0x8000)
6344
        {
6345
          macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
6346
          break;
6347
        }
6348 160 khays
    do_addi_i:
6349 16 khays
      used_at = 1;
6350
      load_register (AT, &imm_expr, dbl);
6351
      macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
6352
      break;
6353
 
6354
    case M_AND_I:
6355
      s = "andi";
6356
      s2 = "and";
6357
      goto do_bit;
6358
    case M_OR_I:
6359
      s = "ori";
6360
      s2 = "or";
6361
      goto do_bit;
6362
    case M_NOR_I:
6363
      s = "";
6364
      s2 = "nor";
6365
      goto do_bit;
6366
    case M_XOR_I:
6367
      s = "xori";
6368
      s2 = "xor";
6369
    do_bit:
6370
      if (imm_expr.X_op == O_constant
6371
          && imm_expr.X_add_number >= 0
6372
          && imm_expr.X_add_number < 0x10000)
6373
        {
6374
          if (mask != M_NOR_I)
6375
            macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
6376
          else
6377
            {
6378
              macro_build (&imm_expr, "ori", "t,r,i",
6379
                           treg, sreg, BFD_RELOC_LO16);
6380
              macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
6381
            }
6382
          break;
6383
        }
6384
 
6385
      used_at = 1;
6386
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
6387
      macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
6388
      break;
6389
 
6390
    case M_BALIGN:
6391
      switch (imm_expr.X_add_number)
6392
        {
6393
        case 0:
6394
          macro_build (NULL, "nop", "");
6395
          break;
6396
        case 2:
6397
          macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
6398
          break;
6399
        default:
6400
          macro_build (NULL, "balign", "t,s,2", treg, sreg,
6401
                       (int) imm_expr.X_add_number);
6402
          break;
6403
        }
6404
      break;
6405
 
6406 160 khays
    case M_BC1FL:
6407
    case M_BC1TL:
6408
    case M_BC2FL:
6409
    case M_BC2TL:
6410
      gas_assert (mips_opts.micromips);
6411
      macro_build_branch_ccl (mask, &offset_expr,
6412
                              EXTRACT_OPERAND (1, BCC, *ip));
6413
      break;
6414
 
6415 16 khays
    case M_BEQ_I:
6416
    case M_BEQL_I:
6417
    case M_BNE_I:
6418
    case M_BNEL_I:
6419
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6420 160 khays
        treg = 0;
6421
      else
6422 16 khays
        {
6423 160 khays
          treg = AT;
6424
          used_at = 1;
6425
          load_register (treg, &imm_expr, HAVE_64BIT_GPRS);
6426 16 khays
        }
6427 160 khays
      /* Fall through.  */
6428
    case M_BEQL:
6429
    case M_BNEL:
6430
      macro_build_branch_rsrt (mask, &offset_expr, sreg, treg);
6431 16 khays
      break;
6432
 
6433
    case M_BGEL:
6434
      likely = 1;
6435
    case M_BGE:
6436
      if (treg == 0)
6437 160 khays
        macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ, &offset_expr, sreg);
6438
      else if (sreg == 0)
6439
        macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, treg);
6440
      else
6441 16 khays
        {
6442 160 khays
          used_at = 1;
6443
          macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
6444
          macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6445
                                   &offset_expr, AT, ZERO);
6446 16 khays
        }
6447
      break;
6448
 
6449 160 khays
    case M_BGEZL:
6450
    case M_BGEZALL:
6451
    case M_BGTZL:
6452
    case M_BLEZL:
6453
    case M_BLTZL:
6454
    case M_BLTZALL:
6455
      macro_build_branch_rs (mask, &offset_expr, sreg);
6456
      break;
6457
 
6458 16 khays
    case M_BGTL_I:
6459
      likely = 1;
6460
    case M_BGT_I:
6461
      /* Check for > max integer.  */
6462
      maxnum = 0x7fffffff;
6463
      if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
6464
        {
6465
          maxnum <<= 16;
6466
          maxnum |= 0xffff;
6467
          maxnum <<= 16;
6468
          maxnum |= 0xffff;
6469
        }
6470
      if (imm_expr.X_op == O_constant
6471
          && imm_expr.X_add_number >= maxnum
6472
          && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
6473
        {
6474
        do_false:
6475
          /* Result is always false.  */
6476
          if (! likely)
6477
            macro_build (NULL, "nop", "");
6478
          else
6479 160 khays
            macro_build_branch_rsrt (M_BNEL, &offset_expr, ZERO, ZERO);
6480 16 khays
          break;
6481
        }
6482
      if (imm_expr.X_op != O_constant)
6483
        as_bad (_("Unsupported large constant"));
6484
      ++imm_expr.X_add_number;
6485
      /* FALLTHROUGH */
6486
    case M_BGE_I:
6487
    case M_BGEL_I:
6488
      if (mask == M_BGEL_I)
6489
        likely = 1;
6490
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6491
        {
6492 160 khays
          macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ,
6493
                                 &offset_expr, sreg);
6494 16 khays
          break;
6495
        }
6496
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6497
        {
6498 160 khays
          macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ,
6499
                                 &offset_expr, sreg);
6500 16 khays
          break;
6501
        }
6502
      maxnum = 0x7fffffff;
6503
      if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
6504
        {
6505
          maxnum <<= 16;
6506
          maxnum |= 0xffff;
6507
          maxnum <<= 16;
6508
          maxnum |= 0xffff;
6509
        }
6510
      maxnum = - maxnum - 1;
6511
      if (imm_expr.X_op == O_constant
6512
          && imm_expr.X_add_number <= maxnum
6513
          && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
6514
        {
6515
        do_true:
6516
          /* result is always true */
6517
          as_warn (_("Branch %s is always true"), ip->insn_mo->name);
6518
          macro_build (&offset_expr, "b", "p");
6519
          break;
6520
        }
6521
      used_at = 1;
6522
      set_at (sreg, 0);
6523 160 khays
      macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6524
                               &offset_expr, AT, ZERO);
6525 16 khays
      break;
6526
 
6527
    case M_BGEUL:
6528
      likely = 1;
6529
    case M_BGEU:
6530
      if (treg == 0)
6531
        goto do_true;
6532 160 khays
      else if (sreg == 0)
6533
        macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6534
                                 &offset_expr, ZERO, treg);
6535
      else
6536 16 khays
        {
6537 160 khays
          used_at = 1;
6538
          macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
6539
          macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6540
                                   &offset_expr, AT, ZERO);
6541 16 khays
        }
6542
      break;
6543
 
6544
    case M_BGTUL_I:
6545
      likely = 1;
6546
    case M_BGTU_I:
6547
      if (sreg == 0
6548
          || (HAVE_32BIT_GPRS
6549
              && imm_expr.X_op == O_constant
6550
              && imm_expr.X_add_number == -1))
6551
        goto do_false;
6552
      if (imm_expr.X_op != O_constant)
6553
        as_bad (_("Unsupported large constant"));
6554
      ++imm_expr.X_add_number;
6555
      /* FALLTHROUGH */
6556
    case M_BGEU_I:
6557
    case M_BGEUL_I:
6558
      if (mask == M_BGEUL_I)
6559
        likely = 1;
6560
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6561
        goto do_true;
6562 160 khays
      else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6563
        macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6564
                                 &offset_expr, sreg, ZERO);
6565
      else
6566 16 khays
        {
6567 160 khays
          used_at = 1;
6568
          set_at (sreg, 1);
6569
          macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6570
                                   &offset_expr, AT, ZERO);
6571 16 khays
        }
6572
      break;
6573
 
6574
    case M_BGTL:
6575
      likely = 1;
6576
    case M_BGT:
6577
      if (treg == 0)
6578 160 khays
        macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ, &offset_expr, sreg);
6579
      else if (sreg == 0)
6580
        macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, treg);
6581
      else
6582 16 khays
        {
6583 160 khays
          used_at = 1;
6584
          macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
6585
          macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6586
                                   &offset_expr, AT, ZERO);
6587 16 khays
        }
6588
      break;
6589
 
6590
    case M_BGTUL:
6591
      likely = 1;
6592
    case M_BGTU:
6593
      if (treg == 0)
6594 160 khays
        macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6595
                                 &offset_expr, sreg, ZERO);
6596
      else if (sreg == 0)
6597
        goto do_false;
6598
      else
6599 16 khays
        {
6600 160 khays
          used_at = 1;
6601
          macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
6602
          macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6603
                                   &offset_expr, AT, ZERO);
6604 16 khays
        }
6605
      break;
6606
 
6607
    case M_BLEL:
6608
      likely = 1;
6609
    case M_BLE:
6610
      if (treg == 0)
6611 160 khays
        macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, sreg);
6612
      else if (sreg == 0)
6613
        macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ, &offset_expr, treg);
6614
      else
6615 16 khays
        {
6616 160 khays
          used_at = 1;
6617
          macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
6618
          macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6619
                                   &offset_expr, AT, ZERO);
6620 16 khays
        }
6621
      break;
6622
 
6623
    case M_BLEL_I:
6624
      likely = 1;
6625
    case M_BLE_I:
6626
      maxnum = 0x7fffffff;
6627
      if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
6628
        {
6629
          maxnum <<= 16;
6630
          maxnum |= 0xffff;
6631
          maxnum <<= 16;
6632
          maxnum |= 0xffff;
6633
        }
6634
      if (imm_expr.X_op == O_constant
6635
          && imm_expr.X_add_number >= maxnum
6636
          && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
6637
        goto do_true;
6638
      if (imm_expr.X_op != O_constant)
6639
        as_bad (_("Unsupported large constant"));
6640
      ++imm_expr.X_add_number;
6641
      /* FALLTHROUGH */
6642
    case M_BLT_I:
6643
    case M_BLTL_I:
6644
      if (mask == M_BLTL_I)
6645
        likely = 1;
6646
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6647 160 khays
        macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, sreg);
6648
      else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6649
        macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, sreg);
6650
      else
6651 16 khays
        {
6652 160 khays
          used_at = 1;
6653
          set_at (sreg, 0);
6654
          macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6655
                                   &offset_expr, AT, ZERO);
6656 16 khays
        }
6657
      break;
6658
 
6659
    case M_BLEUL:
6660
      likely = 1;
6661
    case M_BLEU:
6662
      if (treg == 0)
6663 160 khays
        macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6664
                                 &offset_expr, sreg, ZERO);
6665
      else if (sreg == 0)
6666
        goto do_true;
6667
      else
6668 16 khays
        {
6669 160 khays
          used_at = 1;
6670
          macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
6671
          macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6672
                                   &offset_expr, AT, ZERO);
6673 16 khays
        }
6674
      break;
6675
 
6676
    case M_BLEUL_I:
6677
      likely = 1;
6678
    case M_BLEU_I:
6679
      if (sreg == 0
6680
          || (HAVE_32BIT_GPRS
6681
              && imm_expr.X_op == O_constant
6682
              && imm_expr.X_add_number == -1))
6683
        goto do_true;
6684
      if (imm_expr.X_op != O_constant)
6685
        as_bad (_("Unsupported large constant"));
6686
      ++imm_expr.X_add_number;
6687
      /* FALLTHROUGH */
6688
    case M_BLTU_I:
6689
    case M_BLTUL_I:
6690
      if (mask == M_BLTUL_I)
6691
        likely = 1;
6692
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6693
        goto do_false;
6694 160 khays
      else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6695
        macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6696
                                 &offset_expr, sreg, ZERO);
6697
      else
6698 16 khays
        {
6699 160 khays
          used_at = 1;
6700
          set_at (sreg, 1);
6701
          macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6702
                                   &offset_expr, AT, ZERO);
6703 16 khays
        }
6704
      break;
6705
 
6706
    case M_BLTL:
6707
      likely = 1;
6708
    case M_BLT:
6709
      if (treg == 0)
6710 160 khays
        macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, sreg);
6711
      else if (sreg == 0)
6712
        macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ, &offset_expr, treg);
6713
      else
6714 16 khays
        {
6715 160 khays
          used_at = 1;
6716
          macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
6717
          macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6718
                                   &offset_expr, AT, ZERO);
6719 16 khays
        }
6720
      break;
6721
 
6722
    case M_BLTUL:
6723
      likely = 1;
6724
    case M_BLTU:
6725
      if (treg == 0)
6726
        goto do_false;
6727 160 khays
      else if (sreg == 0)
6728
        macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6729
                                 &offset_expr, ZERO, treg);
6730
      else
6731 16 khays
        {
6732 160 khays
          used_at = 1;
6733
          macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
6734
          macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6735
                                   &offset_expr, AT, ZERO);
6736 16 khays
        }
6737
      break;
6738
 
6739
    case M_DEXT:
6740
      {
6741
        /* Use unsigned arithmetic.  */
6742
        addressT pos;
6743
        addressT size;
6744
 
6745
        if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
6746
          {
6747
            as_bad (_("Unsupported large constant"));
6748
            pos = size = 1;
6749
          }
6750
        else
6751
          {
6752
            pos = imm_expr.X_add_number;
6753
            size = imm2_expr.X_add_number;
6754
          }
6755
 
6756
        if (pos > 63)
6757
          {
6758
            as_bad (_("Improper position (%lu)"), (unsigned long) pos);
6759
            pos = 1;
6760
          }
6761
        if (size == 0 || size > 64 || (pos + size - 1) > 63)
6762
          {
6763
            as_bad (_("Improper extract size (%lu, position %lu)"),
6764
                    (unsigned long) size, (unsigned long) pos);
6765
            size = 1;
6766
          }
6767
 
6768
        if (size <= 32 && pos < 32)
6769
          {
6770
            s = "dext";
6771
            fmt = "t,r,+A,+C";
6772
          }
6773
        else if (size <= 32)
6774
          {
6775
            s = "dextu";
6776
            fmt = "t,r,+E,+H";
6777
          }
6778
        else
6779
          {
6780
            s = "dextm";
6781
            fmt = "t,r,+A,+G";
6782
          }
6783
        macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
6784
                     (int) (size - 1));
6785
      }
6786
      break;
6787
 
6788
    case M_DINS:
6789
      {
6790
        /* Use unsigned arithmetic.  */
6791
        addressT pos;
6792
        addressT size;
6793
 
6794
        if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
6795
          {
6796
            as_bad (_("Unsupported large constant"));
6797
            pos = size = 1;
6798
          }
6799
        else
6800
          {
6801
            pos = imm_expr.X_add_number;
6802
            size = imm2_expr.X_add_number;
6803
          }
6804
 
6805
        if (pos > 63)
6806
          {
6807
            as_bad (_("Improper position (%lu)"), (unsigned long) pos);
6808
            pos = 1;
6809
          }
6810
        if (size == 0 || size > 64 || (pos + size - 1) > 63)
6811
          {
6812
            as_bad (_("Improper insert size (%lu, position %lu)"),
6813
                    (unsigned long) size, (unsigned long) pos);
6814
            size = 1;
6815
          }
6816
 
6817
        if (pos < 32 && (pos + size - 1) < 32)
6818
          {
6819
            s = "dins";
6820
            fmt = "t,r,+A,+B";
6821
          }
6822
        else if (pos >= 32)
6823
          {
6824
            s = "dinsu";
6825
            fmt = "t,r,+E,+F";
6826
          }
6827
        else
6828
          {
6829
            s = "dinsm";
6830
            fmt = "t,r,+A,+F";
6831
          }
6832
        macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
6833
                     (int) (pos + size - 1));
6834
      }
6835
      break;
6836
 
6837
    case M_DDIV_3:
6838
      dbl = 1;
6839
    case M_DIV_3:
6840
      s = "mflo";
6841
      goto do_div3;
6842
    case M_DREM_3:
6843
      dbl = 1;
6844
    case M_REM_3:
6845
      s = "mfhi";
6846
    do_div3:
6847
      if (treg == 0)
6848
        {
6849
          as_warn (_("Divide by zero."));
6850
          if (mips_trap)
6851 160 khays
            macro_build (NULL, "teq", TRAP_FMT, ZERO, ZERO, 7);
6852 16 khays
          else
6853 160 khays
            macro_build (NULL, "break", BRK_FMT, 7);
6854 16 khays
          break;
6855
        }
6856
 
6857
      start_noreorder ();
6858
      if (mips_trap)
6859
        {
6860 160 khays
          macro_build (NULL, "teq", TRAP_FMT, treg, ZERO, 7);
6861 16 khays
          macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
6862
        }
6863
      else
6864
        {
6865 160 khays
          if (mips_opts.micromips)
6866
            micromips_label_expr (&label_expr);
6867
          else
6868
            label_expr.X_add_number = 8;
6869
          macro_build (&label_expr, "bne", "s,t,p", treg, ZERO);
6870 16 khays
          macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
6871 160 khays
          macro_build (NULL, "break", BRK_FMT, 7);
6872
          if (mips_opts.micromips)
6873
            micromips_add_label ();
6874 16 khays
        }
6875
      expr1.X_add_number = -1;
6876
      used_at = 1;
6877
      load_register (AT, &expr1, dbl);
6878 160 khays
      if (mips_opts.micromips)
6879
        micromips_label_expr (&label_expr);
6880
      else
6881
        label_expr.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
6882
      macro_build (&label_expr, "bne", "s,t,p", treg, AT);
6883 16 khays
      if (dbl)
6884
        {
6885
          expr1.X_add_number = 1;
6886
          load_register (AT, &expr1, dbl);
6887 160 khays
          macro_build (NULL, "dsll32", SHFT_FMT, AT, AT, 31);
6888 16 khays
        }
6889
      else
6890
        {
6891
          expr1.X_add_number = 0x80000000;
6892 160 khays
          macro_build (&expr1, "lui", LUI_FMT, AT, BFD_RELOC_HI16);
6893 16 khays
        }
6894
      if (mips_trap)
6895
        {
6896 160 khays
          macro_build (NULL, "teq", TRAP_FMT, sreg, AT, 6);
6897 16 khays
          /* We want to close the noreorder block as soon as possible, so
6898
             that later insns are available for delay slot filling.  */
6899
          end_noreorder ();
6900
        }
6901
      else
6902
        {
6903 160 khays
          if (mips_opts.micromips)
6904
            micromips_label_expr (&label_expr);
6905
          else
6906
            label_expr.X_add_number = 8;
6907
          macro_build (&label_expr, "bne", "s,t,p", sreg, AT);
6908 16 khays
          macro_build (NULL, "nop", "");
6909
 
6910
          /* We want to close the noreorder block as soon as possible, so
6911
             that later insns are available for delay slot filling.  */
6912
          end_noreorder ();
6913
 
6914 160 khays
          macro_build (NULL, "break", BRK_FMT, 6);
6915 16 khays
        }
6916 160 khays
      if (mips_opts.micromips)
6917
        micromips_add_label ();
6918
      macro_build (NULL, s, MFHL_FMT, dreg);
6919 16 khays
      break;
6920
 
6921
    case M_DIV_3I:
6922
      s = "div";
6923
      s2 = "mflo";
6924
      goto do_divi;
6925
    case M_DIVU_3I:
6926
      s = "divu";
6927
      s2 = "mflo";
6928
      goto do_divi;
6929
    case M_REM_3I:
6930
      s = "div";
6931
      s2 = "mfhi";
6932
      goto do_divi;
6933
    case M_REMU_3I:
6934
      s = "divu";
6935
      s2 = "mfhi";
6936
      goto do_divi;
6937
    case M_DDIV_3I:
6938
      dbl = 1;
6939
      s = "ddiv";
6940
      s2 = "mflo";
6941
      goto do_divi;
6942
    case M_DDIVU_3I:
6943
      dbl = 1;
6944
      s = "ddivu";
6945
      s2 = "mflo";
6946
      goto do_divi;
6947
    case M_DREM_3I:
6948
      dbl = 1;
6949
      s = "ddiv";
6950
      s2 = "mfhi";
6951
      goto do_divi;
6952
    case M_DREMU_3I:
6953
      dbl = 1;
6954
      s = "ddivu";
6955
      s2 = "mfhi";
6956
    do_divi:
6957
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6958
        {
6959
          as_warn (_("Divide by zero."));
6960
          if (mips_trap)
6961 160 khays
            macro_build (NULL, "teq", TRAP_FMT, ZERO, ZERO, 7);
6962 16 khays
          else
6963 160 khays
            macro_build (NULL, "break", BRK_FMT, 7);
6964 16 khays
          break;
6965
        }
6966
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6967
        {
6968
          if (strcmp (s2, "mflo") == 0)
6969
            move_register (dreg, sreg);
6970
          else
6971
            move_register (dreg, ZERO);
6972
          break;
6973
        }
6974
      if (imm_expr.X_op == O_constant
6975
          && imm_expr.X_add_number == -1
6976
          && s[strlen (s) - 1] != 'u')
6977
        {
6978
          if (strcmp (s2, "mflo") == 0)
6979
            {
6980
              macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
6981
            }
6982
          else
6983
            move_register (dreg, ZERO);
6984
          break;
6985
        }
6986
 
6987
      used_at = 1;
6988
      load_register (AT, &imm_expr, dbl);
6989
      macro_build (NULL, s, "z,s,t", sreg, AT);
6990 160 khays
      macro_build (NULL, s2, MFHL_FMT, dreg);
6991 16 khays
      break;
6992
 
6993
    case M_DIVU_3:
6994
      s = "divu";
6995
      s2 = "mflo";
6996
      goto do_divu3;
6997
    case M_REMU_3:
6998
      s = "divu";
6999
      s2 = "mfhi";
7000
      goto do_divu3;
7001
    case M_DDIVU_3:
7002
      s = "ddivu";
7003
      s2 = "mflo";
7004
      goto do_divu3;
7005
    case M_DREMU_3:
7006
      s = "ddivu";
7007
      s2 = "mfhi";
7008
    do_divu3:
7009
      start_noreorder ();
7010
      if (mips_trap)
7011
        {
7012 160 khays
          macro_build (NULL, "teq", TRAP_FMT, treg, ZERO, 7);
7013 16 khays
          macro_build (NULL, s, "z,s,t", sreg, treg);
7014
          /* We want to close the noreorder block as soon as possible, so
7015
             that later insns are available for delay slot filling.  */
7016
          end_noreorder ();
7017
        }
7018
      else
7019
        {
7020 160 khays
          if (mips_opts.micromips)
7021
            micromips_label_expr (&label_expr);
7022
          else
7023
            label_expr.X_add_number = 8;
7024
          macro_build (&label_expr, "bne", "s,t,p", treg, ZERO);
7025 16 khays
          macro_build (NULL, s, "z,s,t", sreg, treg);
7026
 
7027
          /* We want to close the noreorder block as soon as possible, so
7028
             that later insns are available for delay slot filling.  */
7029
          end_noreorder ();
7030 160 khays
          macro_build (NULL, "break", BRK_FMT, 7);
7031
          if (mips_opts.micromips)
7032
            micromips_add_label ();
7033 16 khays
        }
7034 160 khays
      macro_build (NULL, s2, MFHL_FMT, dreg);
7035 16 khays
      break;
7036
 
7037
    case M_DLCA_AB:
7038
      dbl = 1;
7039
    case M_LCA_AB:
7040
      call = 1;
7041
      goto do_la;
7042
    case M_DLA_AB:
7043
      dbl = 1;
7044
    case M_LA_AB:
7045
    do_la:
7046
      /* Load the address of a symbol into a register.  If breg is not
7047
         zero, we then add a base register to it.  */
7048
 
7049
      if (dbl && HAVE_32BIT_GPRS)
7050
        as_warn (_("dla used to load 32-bit register"));
7051
 
7052
      if (!dbl && HAVE_64BIT_OBJECTS)
7053
        as_warn (_("la used to load 64-bit address"));
7054
 
7055
      if (offset_expr.X_op == O_constant
7056
          && offset_expr.X_add_number >= -0x8000
7057
          && offset_expr.X_add_number < 0x8000)
7058
        {
7059
          macro_build (&offset_expr, ADDRESS_ADDI_INSN,
7060
                       "t,r,j", treg, sreg, BFD_RELOC_LO16);
7061
          break;
7062
        }
7063
 
7064
      if (mips_opts.at && (treg == breg))
7065
        {
7066
          tempreg = AT;
7067
          used_at = 1;
7068
        }
7069
      else
7070
        {
7071
          tempreg = treg;
7072
        }
7073
 
7074
      if (offset_expr.X_op != O_symbol
7075
          && offset_expr.X_op != O_constant)
7076
        {
7077
          as_bad (_("Expression too complex"));
7078
          offset_expr.X_op = O_constant;
7079
        }
7080
 
7081
      if (offset_expr.X_op == O_constant)
7082
        load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
7083
      else if (mips_pic == NO_PIC)
7084
        {
7085
          /* If this is a reference to a GP relative symbol, we want
7086
               addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
7087
             Otherwise we want
7088
               lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
7089
               addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7090
             If we have a constant, we need two instructions anyhow,
7091
             so we may as well always use the latter form.
7092
 
7093
             With 64bit address space and a usable $at we want
7094
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
7095
               lui      $at,<sym>               (BFD_RELOC_HI16_S)
7096
               daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
7097
               daddiu   $at,<sym>               (BFD_RELOC_LO16)
7098
               dsll32   $tempreg,0
7099
               daddu    $tempreg,$tempreg,$at
7100
 
7101
             If $at is already in use, we use a path which is suboptimal
7102
             on superscalar processors.
7103
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
7104
               daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
7105
               dsll     $tempreg,16
7106
               daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
7107
               dsll     $tempreg,16
7108
               daddiu   $tempreg,<sym>          (BFD_RELOC_LO16)
7109
 
7110
             For GP relative symbols in 64bit address space we can use
7111
             the same sequence as in 32bit address space.  */
7112
          if (HAVE_64BIT_SYMBOLS)
7113
            {
7114
              if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7115
                  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7116
                {
7117
                  relax_start (offset_expr.X_add_symbol);
7118
                  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7119
                               tempreg, mips_gp_register, BFD_RELOC_GPREL16);
7120
                  relax_switch ();
7121
                }
7122
 
7123
              if (used_at == 0 && mips_opts.at)
7124
                {
7125 160 khays
                  macro_build (&offset_expr, "lui", LUI_FMT,
7126 16 khays
                               tempreg, BFD_RELOC_MIPS_HIGHEST);
7127 160 khays
                  macro_build (&offset_expr, "lui", LUI_FMT,
7128 16 khays
                               AT, BFD_RELOC_HI16_S);
7129
                  macro_build (&offset_expr, "daddiu", "t,r,j",
7130
                               tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
7131
                  macro_build (&offset_expr, "daddiu", "t,r,j",
7132
                               AT, AT, BFD_RELOC_LO16);
7133 160 khays
                  macro_build (NULL, "dsll32", SHFT_FMT, tempreg, tempreg, 0);
7134 16 khays
                  macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
7135
                  used_at = 1;
7136
                }
7137
              else
7138
                {
7139 160 khays
                  macro_build (&offset_expr, "lui", LUI_FMT,
7140 16 khays
                               tempreg, BFD_RELOC_MIPS_HIGHEST);
7141
                  macro_build (&offset_expr, "daddiu", "t,r,j",
7142
                               tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
7143 160 khays
                  macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
7144 16 khays
                  macro_build (&offset_expr, "daddiu", "t,r,j",
7145
                               tempreg, tempreg, BFD_RELOC_HI16_S);
7146 160 khays
                  macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
7147 16 khays
                  macro_build (&offset_expr, "daddiu", "t,r,j",
7148
                               tempreg, tempreg, BFD_RELOC_LO16);
7149
                }
7150
 
7151
              if (mips_relax.sequence)
7152
                relax_end ();
7153
            }
7154
          else
7155
            {
7156
              if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7157
                  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7158
                {
7159
                  relax_start (offset_expr.X_add_symbol);
7160
                  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7161
                               tempreg, mips_gp_register, BFD_RELOC_GPREL16);
7162
                  relax_switch ();
7163
                }
7164
              if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
7165
                as_bad (_("Offset too large"));
7166
              macro_build_lui (&offset_expr, tempreg);
7167
              macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7168
                           tempreg, tempreg, BFD_RELOC_LO16);
7169
              if (mips_relax.sequence)
7170
                relax_end ();
7171
            }
7172
        }
7173
      else if (!mips_big_got && !HAVE_NEWABI)
7174
        {
7175
          int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
7176
 
7177
          /* If this is a reference to an external symbol, and there
7178
             is no constant, we want
7179
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7180
             or for lca or if tempreg is PIC_CALL_REG
7181
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
7182
             For a local symbol, we want
7183
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7184
               nop
7185
               addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7186
 
7187
             If we have a small constant, and this is a reference to
7188
             an external symbol, we want
7189
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7190
               nop
7191
               addiu    $tempreg,$tempreg,<constant>
7192
             For a local symbol, we want the same instruction
7193
             sequence, but we output a BFD_RELOC_LO16 reloc on the
7194
             addiu instruction.
7195
 
7196
             If we have a large constant, and this is a reference to
7197
             an external symbol, we want
7198
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7199
               lui      $at,<hiconstant>
7200
               addiu    $at,$at,<loconstant>
7201
               addu     $tempreg,$tempreg,$at
7202
             For a local symbol, we want the same instruction
7203
             sequence, but we output a BFD_RELOC_LO16 reloc on the
7204
             addiu instruction.
7205
           */
7206
 
7207
          if (offset_expr.X_add_number == 0)
7208
            {
7209
              if (mips_pic == SVR4_PIC
7210
                  && breg == 0
7211
                  && (call || tempreg == PIC_CALL_REG))
7212
                lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
7213
 
7214
              relax_start (offset_expr.X_add_symbol);
7215
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7216
                           lw_reloc_type, mips_gp_register);
7217
              if (breg != 0)
7218
                {
7219
                  /* We're going to put in an addu instruction using
7220
                     tempreg, so we may as well insert the nop right
7221
                     now.  */
7222
                  load_delay_nop ();
7223
                }
7224
              relax_switch ();
7225
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7226
                           tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
7227
              load_delay_nop ();
7228
              macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7229
                           tempreg, tempreg, BFD_RELOC_LO16);
7230
              relax_end ();
7231
              /* FIXME: If breg == 0, and the next instruction uses
7232
                 $tempreg, then if this variant case is used an extra
7233
                 nop will be generated.  */
7234
            }
7235
          else if (offset_expr.X_add_number >= -0x8000
7236
                   && offset_expr.X_add_number < 0x8000)
7237
            {
7238
              load_got_offset (tempreg, &offset_expr);
7239
              load_delay_nop ();
7240
              add_got_offset (tempreg, &offset_expr);
7241
            }
7242
          else
7243
            {
7244
              expr1.X_add_number = offset_expr.X_add_number;
7245
              offset_expr.X_add_number =
7246
                ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
7247
              load_got_offset (tempreg, &offset_expr);
7248
              offset_expr.X_add_number = expr1.X_add_number;
7249
              /* If we are going to add in a base register, and the
7250
                 target register and the base register are the same,
7251
                 then we are using AT as a temporary register.  Since
7252
                 we want to load the constant into AT, we add our
7253
                 current AT (from the global offset table) and the
7254
                 register into the register now, and pretend we were
7255
                 not using a base register.  */
7256
              if (breg == treg)
7257
                {
7258
                  load_delay_nop ();
7259
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7260
                               treg, AT, breg);
7261
                  breg = 0;
7262
                  tempreg = treg;
7263
                }
7264
              add_got_offset_hilo (tempreg, &offset_expr, AT);
7265
              used_at = 1;
7266
            }
7267
        }
7268
      else if (!mips_big_got && HAVE_NEWABI)
7269
        {
7270
          int add_breg_early = 0;
7271
 
7272
          /* If this is a reference to an external, and there is no
7273
             constant, or local symbol (*), with or without a
7274
             constant, we want
7275
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
7276
             or for lca or if tempreg is PIC_CALL_REG
7277
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
7278
 
7279
             If we have a small constant, and this is a reference to
7280
             an external symbol, we want
7281
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
7282
               addiu    $tempreg,$tempreg,<constant>
7283
 
7284
             If we have a large constant, and this is a reference to
7285
             an external symbol, we want
7286
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
7287
               lui      $at,<hiconstant>
7288
               addiu    $at,$at,<loconstant>
7289
               addu     $tempreg,$tempreg,$at
7290
 
7291
             (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
7292
             local symbols, even though it introduces an additional
7293
             instruction.  */
7294
 
7295
          if (offset_expr.X_add_number)
7296
            {
7297
              expr1.X_add_number = offset_expr.X_add_number;
7298
              offset_expr.X_add_number = 0;
7299
 
7300
              relax_start (offset_expr.X_add_symbol);
7301
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7302
                           BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7303
 
7304
              if (expr1.X_add_number >= -0x8000
7305
                  && expr1.X_add_number < 0x8000)
7306
                {
7307
                  macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
7308
                               tempreg, tempreg, BFD_RELOC_LO16);
7309
                }
7310
              else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
7311
                {
7312
                  /* If we are going to add in a base register, and the
7313
                     target register and the base register are the same,
7314
                     then we are using AT as a temporary register.  Since
7315
                     we want to load the constant into AT, we add our
7316
                     current AT (from the global offset table) and the
7317
                     register into the register now, and pretend we were
7318
                     not using a base register.  */
7319
                  if (breg != treg)
7320
                    dreg = tempreg;
7321
                  else
7322
                    {
7323
                      gas_assert (tempreg == AT);
7324
                      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7325
                                   treg, AT, breg);
7326
                      dreg = treg;
7327
                      add_breg_early = 1;
7328
                    }
7329
 
7330
                  load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
7331
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7332
                               dreg, dreg, AT);
7333
 
7334
                  used_at = 1;
7335
                }
7336
              else
7337
                as_bad (_("PIC code offset overflow (max 32 signed bits)"));
7338
 
7339
              relax_switch ();
7340
              offset_expr.X_add_number = expr1.X_add_number;
7341
 
7342
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7343
                           BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7344
              if (add_breg_early)
7345
                {
7346
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7347
                               treg, tempreg, breg);
7348
                  breg = 0;
7349
                  tempreg = treg;
7350
                }
7351
              relax_end ();
7352
            }
7353
          else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
7354
            {
7355
              relax_start (offset_expr.X_add_symbol);
7356
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7357
                           BFD_RELOC_MIPS_CALL16, mips_gp_register);
7358
              relax_switch ();
7359
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7360
                           BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7361
              relax_end ();
7362
            }
7363
          else
7364
            {
7365
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7366
                           BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7367
            }
7368
        }
7369
      else if (mips_big_got && !HAVE_NEWABI)
7370
        {
7371
          int gpdelay;
7372
          int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
7373
          int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
7374
          int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
7375
 
7376
          /* This is the large GOT case.  If this is a reference to an
7377
             external symbol, and there is no constant, we want
7378
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7379
               addu     $tempreg,$tempreg,$gp
7380
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7381
             or for lca or if tempreg is PIC_CALL_REG
7382
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
7383
               addu     $tempreg,$tempreg,$gp
7384
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
7385
             For a local symbol, we want
7386
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7387
               nop
7388
               addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7389
 
7390
             If we have a small constant, and this is a reference to
7391
             an external symbol, we want
7392
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7393
               addu     $tempreg,$tempreg,$gp
7394
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7395
               nop
7396
               addiu    $tempreg,$tempreg,<constant>
7397
             For a local symbol, we want
7398
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7399
               nop
7400
               addiu    $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
7401
 
7402
             If we have a large constant, and this is a reference to
7403
             an external symbol, we want
7404
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7405
               addu     $tempreg,$tempreg,$gp
7406
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7407
               lui      $at,<hiconstant>
7408
               addiu    $at,$at,<loconstant>
7409
               addu     $tempreg,$tempreg,$at
7410
             For a local symbol, we want
7411
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7412
               lui      $at,<hiconstant>
7413
               addiu    $at,$at,<loconstant>    (BFD_RELOC_LO16)
7414
               addu     $tempreg,$tempreg,$at
7415
          */
7416
 
7417
          expr1.X_add_number = offset_expr.X_add_number;
7418
          offset_expr.X_add_number = 0;
7419
          relax_start (offset_expr.X_add_symbol);
7420
          gpdelay = reg_needs_delay (mips_gp_register);
7421
          if (expr1.X_add_number == 0 && breg == 0
7422
              && (call || tempreg == PIC_CALL_REG))
7423
            {
7424
              lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
7425
              lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
7426
            }
7427 160 khays
          macro_build (&offset_expr, "lui", LUI_FMT, tempreg, lui_reloc_type);
7428 16 khays
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7429
                       tempreg, tempreg, mips_gp_register);
7430
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7431
                       tempreg, lw_reloc_type, tempreg);
7432
          if (expr1.X_add_number == 0)
7433
            {
7434
              if (breg != 0)
7435
                {
7436
                  /* We're going to put in an addu instruction using
7437
                     tempreg, so we may as well insert the nop right
7438
                     now.  */
7439
                  load_delay_nop ();
7440
                }
7441
            }
7442
          else if (expr1.X_add_number >= -0x8000
7443
                   && expr1.X_add_number < 0x8000)
7444
            {
7445
              load_delay_nop ();
7446
              macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
7447
                           tempreg, tempreg, BFD_RELOC_LO16);
7448
            }
7449
          else
7450
            {
7451
              /* If we are going to add in a base register, and the
7452
                 target register and the base register are the same,
7453
                 then we are using AT as a temporary register.  Since
7454
                 we want to load the constant into AT, we add our
7455
                 current AT (from the global offset table) and the
7456
                 register into the register now, and pretend we were
7457
                 not using a base register.  */
7458
              if (breg != treg)
7459
                dreg = tempreg;
7460
              else
7461
                {
7462
                  gas_assert (tempreg == AT);
7463
                  load_delay_nop ();
7464
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7465
                               treg, AT, breg);
7466
                  dreg = treg;
7467
                }
7468
 
7469
              load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
7470
              macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
7471
 
7472
              used_at = 1;
7473
            }
7474
          offset_expr.X_add_number =
7475
            ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
7476
          relax_switch ();
7477
 
7478
          if (gpdelay)
7479
            {
7480
              /* This is needed because this instruction uses $gp, but
7481
                 the first instruction on the main stream does not.  */
7482
              macro_build (NULL, "nop", "");
7483
            }
7484
 
7485
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7486
                       local_reloc_type, mips_gp_register);
7487
          if (expr1.X_add_number >= -0x8000
7488
              && expr1.X_add_number < 0x8000)
7489
            {
7490
              load_delay_nop ();
7491
              macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7492
                           tempreg, tempreg, BFD_RELOC_LO16);
7493
              /* FIXME: If add_number is 0, and there was no base
7494
                 register, the external symbol case ended with a load,
7495
                 so if the symbol turns out to not be external, and
7496
                 the next instruction uses tempreg, an unnecessary nop
7497
                 will be inserted.  */
7498
            }
7499
          else
7500
            {
7501
              if (breg == treg)
7502
                {
7503
                  /* We must add in the base register now, as in the
7504
                     external symbol case.  */
7505
                  gas_assert (tempreg == AT);
7506
                  load_delay_nop ();
7507
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7508
                               treg, AT, breg);
7509
                  tempreg = treg;
7510
                  /* We set breg to 0 because we have arranged to add
7511
                     it in in both cases.  */
7512
                  breg = 0;
7513
                }
7514
 
7515
              macro_build_lui (&expr1, AT);
7516
              macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7517
                           AT, AT, BFD_RELOC_LO16);
7518
              macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7519
                           tempreg, tempreg, AT);
7520
              used_at = 1;
7521
            }
7522
          relax_end ();
7523
        }
7524
      else if (mips_big_got && HAVE_NEWABI)
7525
        {
7526
          int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
7527
          int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
7528
          int add_breg_early = 0;
7529
 
7530
          /* This is the large GOT case.  If this is a reference to an
7531
             external symbol, and there is no constant, we want
7532
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7533
               add      $tempreg,$tempreg,$gp
7534
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7535
             or for lca or if tempreg is PIC_CALL_REG
7536
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
7537
               add      $tempreg,$tempreg,$gp
7538
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
7539
 
7540
             If we have a small constant, and this is a reference to
7541
             an external symbol, we want
7542
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7543
               add      $tempreg,$tempreg,$gp
7544
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7545
               addi     $tempreg,$tempreg,<constant>
7546
 
7547
             If we have a large constant, and this is a reference to
7548
             an external symbol, we want
7549
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7550
               addu     $tempreg,$tempreg,$gp
7551
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7552
               lui      $at,<hiconstant>
7553
               addi     $at,$at,<loconstant>
7554
               add      $tempreg,$tempreg,$at
7555
 
7556
             If we have NewABI, and we know it's a local symbol, we want
7557
               lw       $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
7558
               addiu    $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
7559
             otherwise we have to resort to GOT_HI16/GOT_LO16.  */
7560
 
7561
          relax_start (offset_expr.X_add_symbol);
7562
 
7563
          expr1.X_add_number = offset_expr.X_add_number;
7564
          offset_expr.X_add_number = 0;
7565
 
7566
          if (expr1.X_add_number == 0 && breg == 0
7567
              && (call || tempreg == PIC_CALL_REG))
7568
            {
7569
              lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
7570
              lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
7571
            }
7572 160 khays
          macro_build (&offset_expr, "lui", LUI_FMT, tempreg, lui_reloc_type);
7573 16 khays
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7574
                       tempreg, tempreg, mips_gp_register);
7575
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7576
                       tempreg, lw_reloc_type, tempreg);
7577
 
7578
          if (expr1.X_add_number == 0)
7579
            ;
7580
          else if (expr1.X_add_number >= -0x8000
7581
                   && expr1.X_add_number < 0x8000)
7582
            {
7583
              macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
7584
                           tempreg, tempreg, BFD_RELOC_LO16);
7585
            }
7586
          else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
7587
            {
7588
              /* If we are going to add in a base register, and the
7589
                 target register and the base register are the same,
7590
                 then we are using AT as a temporary register.  Since
7591
                 we want to load the constant into AT, we add our
7592
                 current AT (from the global offset table) and the
7593
                 register into the register now, and pretend we were
7594
                 not using a base register.  */
7595
              if (breg != treg)
7596
                dreg = tempreg;
7597
              else
7598
                {
7599
                  gas_assert (tempreg == AT);
7600
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7601
                               treg, AT, breg);
7602
                  dreg = treg;
7603
                  add_breg_early = 1;
7604
                }
7605
 
7606
              load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
7607
              macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
7608
 
7609
              used_at = 1;
7610
            }
7611
          else
7612
            as_bad (_("PIC code offset overflow (max 32 signed bits)"));
7613
 
7614
          relax_switch ();
7615
          offset_expr.X_add_number = expr1.X_add_number;
7616
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7617
                       BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
7618
          macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
7619
                       tempreg, BFD_RELOC_MIPS_GOT_OFST);
7620
          if (add_breg_early)
7621
            {
7622
              macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7623
                           treg, tempreg, breg);
7624
              breg = 0;
7625
              tempreg = treg;
7626
            }
7627
          relax_end ();
7628
        }
7629
      else
7630
        abort ();
7631
 
7632
      if (breg != 0)
7633
        macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
7634
      break;
7635
 
7636
    case M_MSGSND:
7637 160 khays
      gas_assert (!mips_opts.micromips);
7638 16 khays
      {
7639
        unsigned long temp = (treg << 16) | (0x01);
7640
        macro_build (NULL, "c2", "C", temp);
7641
      }
7642
      break;
7643
 
7644
    case M_MSGLD:
7645 160 khays
      gas_assert (!mips_opts.micromips);
7646 16 khays
      {
7647
        unsigned long temp = (0x02);
7648
        macro_build (NULL, "c2", "C", temp);
7649
      }
7650
      break;
7651
 
7652
    case M_MSGLD_T:
7653 160 khays
      gas_assert (!mips_opts.micromips);
7654 16 khays
      {
7655
        unsigned long temp = (treg << 16) | (0x02);
7656
        macro_build (NULL, "c2", "C", temp);
7657
      }
7658
      break;
7659
 
7660
    case M_MSGWAIT:
7661 160 khays
      gas_assert (!mips_opts.micromips);
7662 16 khays
      macro_build (NULL, "c2", "C", 3);
7663
      break;
7664
 
7665
    case M_MSGWAIT_T:
7666 160 khays
      gas_assert (!mips_opts.micromips);
7667 16 khays
      {
7668
        unsigned long temp = (treg << 16) | 0x03;
7669
        macro_build (NULL, "c2", "C", temp);
7670
      }
7671
      break;
7672
 
7673
    case M_J_A:
7674
      /* The j instruction may not be used in PIC code, since it
7675
         requires an absolute address.  We convert it to a b
7676
         instruction.  */
7677
      if (mips_pic == NO_PIC)
7678
        macro_build (&offset_expr, "j", "a");
7679
      else
7680
        macro_build (&offset_expr, "b", "p");
7681
      break;
7682
 
7683
      /* The jal instructions must be handled as macros because when
7684
         generating PIC code they expand to multi-instruction
7685
         sequences.  Normally they are simple instructions.  */
7686 160 khays
    case M_JALS_1:
7687
      dreg = RA;
7688
      /* Fall through.  */
7689
    case M_JALS_2:
7690
      gas_assert (mips_opts.micromips);
7691
      jals = 1;
7692
      goto jal;
7693 16 khays
    case M_JAL_1:
7694
      dreg = RA;
7695
      /* Fall through.  */
7696
    case M_JAL_2:
7697 160 khays
    jal:
7698 16 khays
      if (mips_pic == NO_PIC)
7699 160 khays
        {
7700
          s = jals ? "jalrs" : "jalr";
7701
          if (mips_opts.micromips && dreg == RA)
7702
            macro_build (NULL, s, "mj", sreg);
7703
          else
7704
            macro_build (NULL, s, JALR_FMT, dreg, sreg);
7705
        }
7706 16 khays
      else
7707
        {
7708 160 khays
          int cprestore = (mips_pic == SVR4_PIC && !HAVE_NEWABI
7709
                           && mips_cprestore_offset >= 0);
7710
 
7711 16 khays
          if (sreg != PIC_CALL_REG)
7712
            as_warn (_("MIPS PIC call to register other than $25"));
7713
 
7714 160 khays
          s = (mips_opts.micromips && (!mips_opts.noreorder || cprestore)
7715
               ? "jalrs" : "jalr");
7716
          if (mips_opts.micromips && dreg == RA)
7717
            macro_build (NULL, s, "mj", sreg);
7718
          else
7719
            macro_build (NULL, s, JALR_FMT, dreg, sreg);
7720 16 khays
          if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
7721
            {
7722
              if (mips_cprestore_offset < 0)
7723
                as_warn (_("No .cprestore pseudo-op used in PIC code"));
7724
              else
7725
                {
7726
                  if (!mips_frame_reg_valid)
7727
                    {
7728
                      as_warn (_("No .frame pseudo-op used in PIC code"));
7729
                      /* Quiet this warning.  */
7730
                      mips_frame_reg_valid = 1;
7731
                    }
7732
                  if (!mips_cprestore_valid)
7733
                    {
7734
                      as_warn (_("No .cprestore pseudo-op used in PIC code"));
7735
                      /* Quiet this warning.  */
7736
                      mips_cprestore_valid = 1;
7737
                    }
7738
                  if (mips_opts.noreorder)
7739
                    macro_build (NULL, "nop", "");
7740
                  expr1.X_add_number = mips_cprestore_offset;
7741
                  macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
7742
                                                mips_gp_register,
7743
                                                mips_frame_reg,
7744
                                                HAVE_64BIT_ADDRESSES);
7745
                }
7746
            }
7747
        }
7748
 
7749
      break;
7750
 
7751 160 khays
    case M_JALS_A:
7752
      gas_assert (mips_opts.micromips);
7753
      jals = 1;
7754
      /* Fall through.  */
7755 16 khays
    case M_JAL_A:
7756
      if (mips_pic == NO_PIC)
7757 160 khays
        macro_build (&offset_expr, jals ? "jals" : "jal", "a");
7758 16 khays
      else if (mips_pic == SVR4_PIC)
7759
        {
7760
          /* If this is a reference to an external symbol, and we are
7761
             using a small GOT, we want
7762
               lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
7763
               nop
7764
               jalr     $ra,$25
7765
               nop
7766
               lw       $gp,cprestore($sp)
7767
             The cprestore value is set using the .cprestore
7768
             pseudo-op.  If we are using a big GOT, we want
7769
               lui      $25,<sym>               (BFD_RELOC_MIPS_CALL_HI16)
7770
               addu     $25,$25,$gp
7771
               lw       $25,<sym>($25)          (BFD_RELOC_MIPS_CALL_LO16)
7772
               nop
7773
               jalr     $ra,$25
7774
               nop
7775
               lw       $gp,cprestore($sp)
7776
             If the symbol is not external, we want
7777
               lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7778
               nop
7779
               addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
7780
               jalr     $ra,$25
7781
               nop
7782
               lw $gp,cprestore($sp)
7783
 
7784
             For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
7785
             sequences above, minus nops, unless the symbol is local,
7786
             which enables us to use GOT_PAGE/GOT_OFST (big got) or
7787
             GOT_DISP.  */
7788
          if (HAVE_NEWABI)
7789
            {
7790
              if (!mips_big_got)
7791
                {
7792
                  relax_start (offset_expr.X_add_symbol);
7793
                  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7794
                               PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
7795
                               mips_gp_register);
7796
                  relax_switch ();
7797
                  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7798
                               PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
7799
                               mips_gp_register);
7800
                  relax_end ();
7801
                }
7802
              else
7803
                {
7804
                  relax_start (offset_expr.X_add_symbol);
7805 160 khays
                  macro_build (&offset_expr, "lui", LUI_FMT, PIC_CALL_REG,
7806 16 khays
                               BFD_RELOC_MIPS_CALL_HI16);
7807
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
7808
                               PIC_CALL_REG, mips_gp_register);
7809
                  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7810
                               PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
7811
                               PIC_CALL_REG);
7812
                  relax_switch ();
7813
                  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7814
                               PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
7815
                               mips_gp_register);
7816
                  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7817
                               PIC_CALL_REG, PIC_CALL_REG,
7818
                               BFD_RELOC_MIPS_GOT_OFST);
7819
                  relax_end ();
7820
                }
7821
 
7822 160 khays
              macro_build_jalr (&offset_expr, 0);
7823 16 khays
            }
7824
          else
7825
            {
7826
              relax_start (offset_expr.X_add_symbol);
7827
              if (!mips_big_got)
7828
                {
7829
                  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7830
                               PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
7831
                               mips_gp_register);
7832
                  load_delay_nop ();
7833
                  relax_switch ();
7834
                }
7835
              else
7836
                {
7837
                  int gpdelay;
7838
 
7839
                  gpdelay = reg_needs_delay (mips_gp_register);
7840 160 khays
                  macro_build (&offset_expr, "lui", LUI_FMT, PIC_CALL_REG,
7841 16 khays
                               BFD_RELOC_MIPS_CALL_HI16);
7842
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
7843
                               PIC_CALL_REG, mips_gp_register);
7844
                  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7845
                               PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
7846
                               PIC_CALL_REG);
7847
                  load_delay_nop ();
7848
                  relax_switch ();
7849
                  if (gpdelay)
7850
                    macro_build (NULL, "nop", "");
7851
                }
7852
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7853
                           PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
7854
                           mips_gp_register);
7855
              load_delay_nop ();
7856
              macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7857
                           PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
7858
              relax_end ();
7859 160 khays
              macro_build_jalr (&offset_expr, mips_cprestore_offset >= 0);
7860 16 khays
 
7861
              if (mips_cprestore_offset < 0)
7862
                as_warn (_("No .cprestore pseudo-op used in PIC code"));
7863
              else
7864
                {
7865
                  if (!mips_frame_reg_valid)
7866
                    {
7867
                      as_warn (_("No .frame pseudo-op used in PIC code"));
7868
                      /* Quiet this warning.  */
7869
                      mips_frame_reg_valid = 1;
7870
                    }
7871
                  if (!mips_cprestore_valid)
7872
                    {
7873
                      as_warn (_("No .cprestore pseudo-op used in PIC code"));
7874
                      /* Quiet this warning.  */
7875
                      mips_cprestore_valid = 1;
7876
                    }
7877
                  if (mips_opts.noreorder)
7878
                    macro_build (NULL, "nop", "");
7879
                  expr1.X_add_number = mips_cprestore_offset;
7880
                  macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
7881
                                                mips_gp_register,
7882
                                                mips_frame_reg,
7883
                                                HAVE_64BIT_ADDRESSES);
7884
                }
7885
            }
7886
        }
7887
      else if (mips_pic == VXWORKS_PIC)
7888
        as_bad (_("Non-PIC jump used in PIC library"));
7889
      else
7890
        abort ();
7891
 
7892
      break;
7893
 
7894 160 khays
    case M_ACLR_AB:
7895
      ab = 1;
7896
    case M_ACLR_OB:
7897
      s = "aclr";
7898
      treg = EXTRACT_OPERAND (mips_opts.micromips, 3BITPOS, *ip);
7899
      fmt = "\\,~(b)";
7900
      off12 = 1;
7901
      goto ld_st;
7902
    case M_ASET_AB:
7903
      ab = 1;
7904
    case M_ASET_OB:
7905
      s = "aset";
7906
      treg = EXTRACT_OPERAND (mips_opts.micromips, 3BITPOS, *ip);
7907
      fmt = "\\,~(b)";
7908
      off12 = 1;
7909
      goto ld_st;
7910 16 khays
    case M_LB_AB:
7911 160 khays
      ab = 1;
7912 16 khays
      s = "lb";
7913 160 khays
      fmt = "t,o(b)";
7914 16 khays
      goto ld;
7915
    case M_LBU_AB:
7916 160 khays
      ab = 1;
7917 16 khays
      s = "lbu";
7918 160 khays
      fmt = "t,o(b)";
7919 16 khays
      goto ld;
7920
    case M_LH_AB:
7921 160 khays
      ab = 1;
7922 16 khays
      s = "lh";
7923 160 khays
      fmt = "t,o(b)";
7924 16 khays
      goto ld;
7925
    case M_LHU_AB:
7926 160 khays
      ab = 1;
7927 16 khays
      s = "lhu";
7928 160 khays
      fmt = "t,o(b)";
7929 16 khays
      goto ld;
7930
    case M_LW_AB:
7931 160 khays
      ab = 1;
7932 16 khays
      s = "lw";
7933 160 khays
      fmt = "t,o(b)";
7934 16 khays
      goto ld;
7935
    case M_LWC0_AB:
7936 160 khays
      ab = 1;
7937
      gas_assert (!mips_opts.micromips);
7938 16 khays
      s = "lwc0";
7939 160 khays
      fmt = "E,o(b)";
7940 16 khays
      /* Itbl support may require additional care here.  */
7941
      coproc = 1;
7942 160 khays
      goto ld_st;
7943 16 khays
    case M_LWC1_AB:
7944 160 khays
      ab = 1;
7945 16 khays
      s = "lwc1";
7946 160 khays
      fmt = "T,o(b)";
7947 16 khays
      /* Itbl support may require additional care here.  */
7948
      coproc = 1;
7949 160 khays
      goto ld_st;
7950 16 khays
    case M_LWC2_AB:
7951 160 khays
      ab = 1;
7952
    case M_LWC2_OB:
7953 16 khays
      s = "lwc2";
7954 160 khays
      fmt = COP12_FMT;
7955
      off12 = mips_opts.micromips;
7956 16 khays
      /* Itbl support may require additional care here.  */
7957
      coproc = 1;
7958 160 khays
      goto ld_st;
7959 16 khays
    case M_LWC3_AB:
7960 160 khays
      ab = 1;
7961
      gas_assert (!mips_opts.micromips);
7962 16 khays
      s = "lwc3";
7963 160 khays
      fmt = "E,o(b)";
7964 16 khays
      /* Itbl support may require additional care here.  */
7965
      coproc = 1;
7966 160 khays
      goto ld_st;
7967 16 khays
    case M_LWL_AB:
7968 160 khays
      ab = 1;
7969
    case M_LWL_OB:
7970 16 khays
      s = "lwl";
7971 160 khays
      fmt = MEM12_FMT;
7972
      off12 = mips_opts.micromips;
7973
      goto ld_st;
7974 16 khays
    case M_LWR_AB:
7975 160 khays
      ab = 1;
7976
    case M_LWR_OB:
7977 16 khays
      s = "lwr";
7978 160 khays
      fmt = MEM12_FMT;
7979
      off12 = mips_opts.micromips;
7980
      goto ld_st;
7981 16 khays
    case M_LDC1_AB:
7982 160 khays
      ab = 1;
7983 16 khays
      s = "ldc1";
7984 160 khays
      fmt = "T,o(b)";
7985 16 khays
      /* Itbl support may require additional care here.  */
7986
      coproc = 1;
7987 160 khays
      goto ld_st;
7988 16 khays
    case M_LDC2_AB:
7989 160 khays
      ab = 1;
7990
    case M_LDC2_OB:
7991 16 khays
      s = "ldc2";
7992 160 khays
      fmt = COP12_FMT;
7993
      off12 = mips_opts.micromips;
7994 16 khays
      /* Itbl support may require additional care here.  */
7995
      coproc = 1;
7996 160 khays
      goto ld_st;
7997 16 khays
    case M_LDC3_AB:
7998 160 khays
      ab = 1;
7999 16 khays
      s = "ldc3";
8000 160 khays
      fmt = "E,o(b)";
8001 16 khays
      /* Itbl support may require additional care here.  */
8002
      coproc = 1;
8003 160 khays
      goto ld_st;
8004 16 khays
    case M_LDL_AB:
8005 160 khays
      ab = 1;
8006
    case M_LDL_OB:
8007 16 khays
      s = "ldl";
8008 160 khays
      fmt = MEM12_FMT;
8009
      off12 = mips_opts.micromips;
8010
      goto ld_st;
8011 16 khays
    case M_LDR_AB:
8012 160 khays
      ab = 1;
8013
    case M_LDR_OB:
8014 16 khays
      s = "ldr";
8015 160 khays
      fmt = MEM12_FMT;
8016
      off12 = mips_opts.micromips;
8017
      goto ld_st;
8018 16 khays
    case M_LL_AB:
8019 160 khays
      ab = 1;
8020
    case M_LL_OB:
8021 16 khays
      s = "ll";
8022 160 khays
      fmt = MEM12_FMT;
8023
      off12 = mips_opts.micromips;
8024 16 khays
      goto ld;
8025
    case M_LLD_AB:
8026 160 khays
      ab = 1;
8027
    case M_LLD_OB:
8028 16 khays
      s = "lld";
8029 160 khays
      fmt = MEM12_FMT;
8030
      off12 = mips_opts.micromips;
8031 16 khays
      goto ld;
8032
    case M_LWU_AB:
8033 160 khays
      ab = 1;
8034
    case M_LWU_OB:
8035 16 khays
      s = "lwu";
8036 160 khays
      fmt = MEM12_FMT;
8037
      off12 = mips_opts.micromips;
8038
      goto ld;
8039
    case M_LWP_AB:
8040
      ab = 1;
8041
    case M_LWP_OB:
8042
      gas_assert (mips_opts.micromips);
8043
      s = "lwp";
8044
      fmt = "t,~(b)";
8045
      off12 = 1;
8046
      lp = 1;
8047
      goto ld;
8048
    case M_LDP_AB:
8049
      ab = 1;
8050
    case M_LDP_OB:
8051
      gas_assert (mips_opts.micromips);
8052
      s = "ldp";
8053
      fmt = "t,~(b)";
8054
      off12 = 1;
8055
      lp = 1;
8056
      goto ld;
8057
    case M_LWM_AB:
8058
      ab = 1;
8059
    case M_LWM_OB:
8060
      gas_assert (mips_opts.micromips);
8061
      s = "lwm";
8062
      fmt = "n,~(b)";
8063
      off12 = 1;
8064
      goto ld_st;
8065
    case M_LDM_AB:
8066
      ab = 1;
8067
    case M_LDM_OB:
8068
      gas_assert (mips_opts.micromips);
8069
      s = "ldm";
8070
      fmt = "n,~(b)";
8071
      off12 = 1;
8072
      goto ld_st;
8073
 
8074 16 khays
    ld:
8075 160 khays
      if (breg == treg + lp)
8076
        goto ld_st;
8077 16 khays
      else
8078 160 khays
        tempreg = treg + lp;
8079
      goto ld_noat;
8080
 
8081 16 khays
    case M_SB_AB:
8082 160 khays
      ab = 1;
8083 16 khays
      s = "sb";
8084 160 khays
      fmt = "t,o(b)";
8085
      goto ld_st;
8086 16 khays
    case M_SH_AB:
8087 160 khays
      ab = 1;
8088 16 khays
      s = "sh";
8089 160 khays
      fmt = "t,o(b)";
8090
      goto ld_st;
8091 16 khays
    case M_SW_AB:
8092 160 khays
      ab = 1;
8093 16 khays
      s = "sw";
8094 160 khays
      fmt = "t,o(b)";
8095
      goto ld_st;
8096 16 khays
    case M_SWC0_AB:
8097 160 khays
      ab = 1;
8098
      gas_assert (!mips_opts.micromips);
8099 16 khays
      s = "swc0";
8100 160 khays
      fmt = "E,o(b)";
8101 16 khays
      /* Itbl support may require additional care here.  */
8102
      coproc = 1;
8103 160 khays
      goto ld_st;
8104 16 khays
    case M_SWC1_AB:
8105 160 khays
      ab = 1;
8106 16 khays
      s = "swc1";
8107 160 khays
      fmt = "T,o(b)";
8108 16 khays
      /* Itbl support may require additional care here.  */
8109
      coproc = 1;
8110 160 khays
      goto ld_st;
8111 16 khays
    case M_SWC2_AB:
8112 160 khays
      ab = 1;
8113
    case M_SWC2_OB:
8114 16 khays
      s = "swc2";
8115 160 khays
      fmt = COP12_FMT;
8116
      off12 = mips_opts.micromips;
8117 16 khays
      /* Itbl support may require additional care here.  */
8118
      coproc = 1;
8119 160 khays
      goto ld_st;
8120 16 khays
    case M_SWC3_AB:
8121 160 khays
      ab = 1;
8122
      gas_assert (!mips_opts.micromips);
8123 16 khays
      s = "swc3";
8124 160 khays
      fmt = "E,o(b)";
8125 16 khays
      /* Itbl support may require additional care here.  */
8126
      coproc = 1;
8127 160 khays
      goto ld_st;
8128 16 khays
    case M_SWL_AB:
8129 160 khays
      ab = 1;
8130
    case M_SWL_OB:
8131 16 khays
      s = "swl";
8132 160 khays
      fmt = MEM12_FMT;
8133
      off12 = mips_opts.micromips;
8134
      goto ld_st;
8135 16 khays
    case M_SWR_AB:
8136 160 khays
      ab = 1;
8137
    case M_SWR_OB:
8138 16 khays
      s = "swr";
8139 160 khays
      fmt = MEM12_FMT;
8140
      off12 = mips_opts.micromips;
8141
      goto ld_st;
8142 16 khays
    case M_SC_AB:
8143 160 khays
      ab = 1;
8144
    case M_SC_OB:
8145 16 khays
      s = "sc";
8146 160 khays
      fmt = MEM12_FMT;
8147
      off12 = mips_opts.micromips;
8148
      goto ld_st;
8149 16 khays
    case M_SCD_AB:
8150 160 khays
      ab = 1;
8151
    case M_SCD_OB:
8152 16 khays
      s = "scd";
8153 160 khays
      fmt = MEM12_FMT;
8154
      off12 = mips_opts.micromips;
8155
      goto ld_st;
8156 16 khays
    case M_CACHE_AB:
8157 160 khays
      ab = 1;
8158
    case M_CACHE_OB:
8159 16 khays
      s = "cache";
8160 160 khays
      fmt = mips_opts.micromips ? "k,~(b)" : "k,o(b)";
8161
      off12 = mips_opts.micromips;
8162
      goto ld_st;
8163 16 khays
    case M_PREF_AB:
8164 160 khays
      ab = 1;
8165
    case M_PREF_OB:
8166 16 khays
      s = "pref";
8167 160 khays
      fmt = !mips_opts.micromips ? "k,o(b)" : "k,~(b)";
8168
      off12 = mips_opts.micromips;
8169
      goto ld_st;
8170 16 khays
    case M_SDC1_AB:
8171 160 khays
      ab = 1;
8172 16 khays
      s = "sdc1";
8173 160 khays
      fmt = "T,o(b)";
8174 16 khays
      coproc = 1;
8175
      /* Itbl support may require additional care here.  */
8176 160 khays
      goto ld_st;
8177 16 khays
    case M_SDC2_AB:
8178 160 khays
      ab = 1;
8179
    case M_SDC2_OB:
8180 16 khays
      s = "sdc2";
8181 160 khays
      fmt = COP12_FMT;
8182
      off12 = mips_opts.micromips;
8183 16 khays
      /* Itbl support may require additional care here.  */
8184
      coproc = 1;
8185 160 khays
      goto ld_st;
8186 16 khays
    case M_SDC3_AB:
8187 160 khays
      ab = 1;
8188
      gas_assert (!mips_opts.micromips);
8189 16 khays
      s = "sdc3";
8190 160 khays
      fmt = "E,o(b)";
8191 16 khays
      /* Itbl support may require additional care here.  */
8192
      coproc = 1;
8193 160 khays
      goto ld_st;
8194 16 khays
    case M_SDL_AB:
8195 160 khays
      ab = 1;
8196
    case M_SDL_OB:
8197 16 khays
      s = "sdl";
8198 160 khays
      fmt = MEM12_FMT;
8199
      off12 = mips_opts.micromips;
8200
      goto ld_st;
8201 16 khays
    case M_SDR_AB:
8202 160 khays
      ab = 1;
8203
    case M_SDR_OB:
8204 16 khays
      s = "sdr";
8205 160 khays
      fmt = MEM12_FMT;
8206
      off12 = mips_opts.micromips;
8207
      goto ld_st;
8208
    case M_SWP_AB:
8209
      ab = 1;
8210
    case M_SWP_OB:
8211
      gas_assert (mips_opts.micromips);
8212
      s = "swp";
8213
      fmt = "t,~(b)";
8214
      off12 = 1;
8215
      goto ld_st;
8216
    case M_SDP_AB:
8217
      ab = 1;
8218
    case M_SDP_OB:
8219
      gas_assert (mips_opts.micromips);
8220
      s = "sdp";
8221
      fmt = "t,~(b)";
8222
      off12 = 1;
8223
      goto ld_st;
8224
    case M_SWM_AB:
8225
      ab = 1;
8226
    case M_SWM_OB:
8227
      gas_assert (mips_opts.micromips);
8228
      s = "swm";
8229
      fmt = "n,~(b)";
8230
      off12 = 1;
8231
      goto ld_st;
8232
    case M_SDM_AB:
8233
      ab = 1;
8234
    case M_SDM_OB:
8235
      gas_assert (mips_opts.micromips);
8236
      s = "sdm";
8237
      fmt = "n,~(b)";
8238
      off12 = 1;
8239
 
8240
    ld_st:
8241 16 khays
      tempreg = AT;
8242
      used_at = 1;
8243 160 khays
    ld_noat:
8244 16 khays
      if (coproc
8245
          && NO_ISA_COP (mips_opts.arch)
8246
          && (ip->insn_mo->pinfo2 & (INSN2_M_FP_S | INSN2_M_FP_D)) == 0)
8247
        {
8248
          as_bad (_("Opcode not supported on this processor: %s"),
8249
                  mips_cpu_info_from_arch (mips_opts.arch)->name);
8250
          break;
8251
        }
8252
 
8253
      if (offset_expr.X_op != O_constant
8254
          && offset_expr.X_op != O_symbol)
8255
        {
8256
          as_bad (_("Expression too complex"));
8257
          offset_expr.X_op = O_constant;
8258
        }
8259
 
8260
      if (HAVE_32BIT_ADDRESSES
8261
          && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
8262
        {
8263
          char value [32];
8264
 
8265
          sprintf_vma (value, offset_expr.X_add_number);
8266
          as_bad (_("Number (0x%s) larger than 32 bits"), value);
8267
        }
8268
 
8269
      /* A constant expression in PIC code can be handled just as it
8270
         is in non PIC code.  */
8271
      if (offset_expr.X_op == O_constant)
8272
        {
8273 160 khays
          int hipart = 0;
8274
 
8275 16 khays
          expr1.X_add_number = offset_expr.X_add_number;
8276
          normalize_address_expr (&expr1);
8277 160 khays
          if (!off12 && !IS_SEXT_16BIT_NUM (expr1.X_add_number))
8278 16 khays
            {
8279
              expr1.X_add_number = ((expr1.X_add_number + 0x8000)
8280
                                    & ~(bfd_vma) 0xffff);
8281 160 khays
              hipart = 1;
8282
            }
8283
          else if (off12 && !IS_SEXT_12BIT_NUM (expr1.X_add_number))
8284
            {
8285
              expr1.X_add_number = ((expr1.X_add_number + 0x800)
8286
                                    & ~(bfd_vma) 0xfff);
8287
              hipart = 1;
8288
            }
8289
          if (hipart)
8290
            {
8291 16 khays
              load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
8292
              if (breg != 0)
8293
                macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8294
                             tempreg, tempreg, breg);
8295
              breg = tempreg;
8296
            }
8297 160 khays
          if (!off12)
8298
            macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, breg);
8299
          else
8300
            macro_build (NULL, s, fmt,
8301
                         treg, (unsigned long) offset_expr.X_add_number, breg);
8302 16 khays
        }
8303 160 khays
      else if (off12)
8304
        {
8305
          /* A 12-bit offset field is too narrow to be used for a low-part
8306
             relocation, so load the whole address into the auxillary
8307
             register.  In the case of "A(b)" addresses, we first load
8308
             absolute address "A" into the register and then add base
8309
             register "b".  In the case of "o(b)" addresses, we simply
8310
             need to add 16-bit offset "o" to base register "b", and
8311
             offset_reloc already contains the relocations associated
8312
             with "o".  */
8313
          if (ab)
8314
            {
8315
              load_address (tempreg, &offset_expr, &used_at);
8316
              if (breg != 0)
8317
                macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8318
                             tempreg, tempreg, breg);
8319
            }
8320
          else
8321
            macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
8322
                         tempreg, breg, -1,
8323
                         offset_reloc[0], offset_reloc[1], offset_reloc[2]);
8324
          expr1.X_add_number = 0;
8325
          macro_build (NULL, s, fmt,
8326
                       treg, (unsigned long) expr1.X_add_number, tempreg);
8327
        }
8328 16 khays
      else if (mips_pic == NO_PIC)
8329
        {
8330
          /* If this is a reference to a GP relative symbol, and there
8331
             is no base register, we want
8332
               <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
8333
             Otherwise, if there is no base register, we want
8334
               lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
8335
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8336
             If we have a constant, we need two instructions anyhow,
8337
             so we always use the latter form.
8338
 
8339
             If we have a base register, and this is a reference to a
8340
             GP relative symbol, we want
8341
               addu     $tempreg,$breg,$gp
8342
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
8343
             Otherwise we want
8344
               lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
8345
               addu     $tempreg,$tempreg,$breg
8346
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8347
             With a constant we always use the latter case.
8348
 
8349
             With 64bit address space and no base register and $at usable,
8350
             we want
8351
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8352
               lui      $at,<sym>               (BFD_RELOC_HI16_S)
8353
               daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8354
               dsll32   $tempreg,0
8355
               daddu    $tempreg,$at
8356
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8357
             If we have a base register, we want
8358
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8359
               lui      $at,<sym>               (BFD_RELOC_HI16_S)
8360
               daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8361
               daddu    $at,$breg
8362
               dsll32   $tempreg,0
8363
               daddu    $tempreg,$at
8364
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8365
 
8366
             Without $at we can't generate the optimal path for superscalar
8367
             processors here since this would require two temporary registers.
8368
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8369
               daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8370
               dsll     $tempreg,16
8371
               daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
8372
               dsll     $tempreg,16
8373
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8374
             If we have a base register, we want
8375
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8376
               daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8377
               dsll     $tempreg,16
8378
               daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
8379
               dsll     $tempreg,16
8380
               daddu    $tempreg,$tempreg,$breg
8381
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8382
 
8383
             For GP relative symbols in 64bit address space we can use
8384
             the same sequence as in 32bit address space.  */
8385
          if (HAVE_64BIT_SYMBOLS)
8386
            {
8387
              if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
8388
                  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
8389
                {
8390
                  relax_start (offset_expr.X_add_symbol);
8391
                  if (breg == 0)
8392
                    {
8393
                      macro_build (&offset_expr, s, fmt, treg,
8394
                                   BFD_RELOC_GPREL16, mips_gp_register);
8395
                    }
8396
                  else
8397
                    {
8398
                      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8399
                                   tempreg, breg, mips_gp_register);
8400
                      macro_build (&offset_expr, s, fmt, treg,
8401
                                   BFD_RELOC_GPREL16, tempreg);
8402
                    }
8403
                  relax_switch ();
8404
                }
8405
 
8406
              if (used_at == 0 && mips_opts.at)
8407
                {
8408 160 khays
                  macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
8409 16 khays
                               BFD_RELOC_MIPS_HIGHEST);
8410 160 khays
                  macro_build (&offset_expr, "lui", LUI_FMT, AT,
8411 16 khays
                               BFD_RELOC_HI16_S);
8412
                  macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
8413
                               tempreg, BFD_RELOC_MIPS_HIGHER);
8414
                  if (breg != 0)
8415
                    macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
8416 160 khays
                  macro_build (NULL, "dsll32", SHFT_FMT, tempreg, tempreg, 0);
8417 16 khays
                  macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
8418
                  macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
8419
                               tempreg);
8420
                  used_at = 1;
8421
                }
8422
              else
8423
                {
8424 160 khays
                  macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
8425 16 khays
                               BFD_RELOC_MIPS_HIGHEST);
8426
                  macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
8427
                               tempreg, BFD_RELOC_MIPS_HIGHER);
8428 160 khays
                  macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
8429 16 khays
                  macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
8430
                               tempreg, BFD_RELOC_HI16_S);
8431 160 khays
                  macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
8432 16 khays
                  if (breg != 0)
8433
                    macro_build (NULL, "daddu", "d,v,t",
8434
                                 tempreg, tempreg, breg);
8435
                  macro_build (&offset_expr, s, fmt, treg,
8436
                               BFD_RELOC_LO16, tempreg);
8437
                }
8438
 
8439
              if (mips_relax.sequence)
8440
                relax_end ();
8441
              break;
8442
            }
8443
 
8444
          if (breg == 0)
8445
            {
8446
              if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
8447
                  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
8448
                {
8449
                  relax_start (offset_expr.X_add_symbol);
8450
                  macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
8451
                               mips_gp_register);
8452
                  relax_switch ();
8453
                }
8454
              macro_build_lui (&offset_expr, tempreg);
8455
              macro_build (&offset_expr, s, fmt, treg,
8456
                           BFD_RELOC_LO16, tempreg);
8457
              if (mips_relax.sequence)
8458
                relax_end ();
8459
            }
8460
          else
8461
            {
8462
              if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
8463
                  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
8464
                {
8465
                  relax_start (offset_expr.X_add_symbol);
8466
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8467
                               tempreg, breg, mips_gp_register);
8468
                  macro_build (&offset_expr, s, fmt, treg,
8469
                               BFD_RELOC_GPREL16, tempreg);
8470
                  relax_switch ();
8471
                }
8472
              macro_build_lui (&offset_expr, tempreg);
8473
              macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8474
                           tempreg, tempreg, breg);
8475
              macro_build (&offset_expr, s, fmt, treg,
8476
                           BFD_RELOC_LO16, tempreg);
8477
              if (mips_relax.sequence)
8478
                relax_end ();
8479
            }
8480
        }
8481
      else if (!mips_big_got)
8482
        {
8483
          int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
8484
 
8485
          /* If this is a reference to an external symbol, we want
8486
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
8487
               nop
8488
               <op>     $treg,0($tempreg)
8489
             Otherwise we want
8490
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
8491
               nop
8492
               addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
8493
               <op>     $treg,0($tempreg)
8494
 
8495
             For NewABI, we want
8496
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
8497
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
8498
 
8499
             If there is a base register, we add it to $tempreg before
8500
             the <op>.  If there is a constant, we stick it in the
8501
             <op> instruction.  We don't handle constants larger than
8502
             16 bits, because we have no way to load the upper 16 bits
8503
             (actually, we could handle them for the subset of cases
8504
             in which we are not using $at).  */
8505
          gas_assert (offset_expr.X_op == O_symbol);
8506
          if (HAVE_NEWABI)
8507
            {
8508
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8509
                           BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
8510
              if (breg != 0)
8511
                macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8512
                             tempreg, tempreg, breg);
8513
              macro_build (&offset_expr, s, fmt, treg,
8514
                           BFD_RELOC_MIPS_GOT_OFST, tempreg);
8515
              break;
8516
            }
8517
          expr1.X_add_number = offset_expr.X_add_number;
8518
          offset_expr.X_add_number = 0;
8519
          if (expr1.X_add_number < -0x8000
8520
              || expr1.X_add_number >= 0x8000)
8521
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
8522
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8523
                       lw_reloc_type, mips_gp_register);
8524
          load_delay_nop ();
8525
          relax_start (offset_expr.X_add_symbol);
8526
          relax_switch ();
8527
          macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
8528
                       tempreg, BFD_RELOC_LO16);
8529
          relax_end ();
8530
          if (breg != 0)
8531
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8532
                         tempreg, tempreg, breg);
8533
          macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
8534
        }
8535
      else if (mips_big_got && !HAVE_NEWABI)
8536
        {
8537
          int gpdelay;
8538
 
8539
          /* If this is a reference to an external symbol, we want
8540
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
8541
               addu     $tempreg,$tempreg,$gp
8542
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
8543
               <op>     $treg,0($tempreg)
8544
             Otherwise we want
8545
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
8546
               nop
8547
               addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
8548
               <op>     $treg,0($tempreg)
8549
             If there is a base register, we add it to $tempreg before
8550
             the <op>.  If there is a constant, we stick it in the
8551
             <op> instruction.  We don't handle constants larger than
8552
             16 bits, because we have no way to load the upper 16 bits
8553
             (actually, we could handle them for the subset of cases
8554
             in which we are not using $at).  */
8555
          gas_assert (offset_expr.X_op == O_symbol);
8556
          expr1.X_add_number = offset_expr.X_add_number;
8557
          offset_expr.X_add_number = 0;
8558
          if (expr1.X_add_number < -0x8000
8559
              || expr1.X_add_number >= 0x8000)
8560
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
8561
          gpdelay = reg_needs_delay (mips_gp_register);
8562
          relax_start (offset_expr.X_add_symbol);
8563 160 khays
          macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
8564 16 khays
                       BFD_RELOC_MIPS_GOT_HI16);
8565
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
8566
                       mips_gp_register);
8567
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8568
                       BFD_RELOC_MIPS_GOT_LO16, tempreg);
8569
          relax_switch ();
8570
          if (gpdelay)
8571
            macro_build (NULL, "nop", "");
8572
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8573
                       BFD_RELOC_MIPS_GOT16, mips_gp_register);
8574
          load_delay_nop ();
8575
          macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
8576
                       tempreg, BFD_RELOC_LO16);
8577
          relax_end ();
8578
 
8579
          if (breg != 0)
8580
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8581
                         tempreg, tempreg, breg);
8582
          macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
8583
        }
8584
      else if (mips_big_got && HAVE_NEWABI)
8585
        {
8586
          /* If this is a reference to an external symbol, we want
8587
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
8588
               add      $tempreg,$tempreg,$gp
8589
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
8590
               <op>     $treg,<ofst>($tempreg)
8591
             Otherwise, for local symbols, we want:
8592
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
8593
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
8594
          gas_assert (offset_expr.X_op == O_symbol);
8595
          expr1.X_add_number = offset_expr.X_add_number;
8596
          offset_expr.X_add_number = 0;
8597
          if (expr1.X_add_number < -0x8000
8598
              || expr1.X_add_number >= 0x8000)
8599
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
8600
          relax_start (offset_expr.X_add_symbol);
8601 160 khays
          macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
8602 16 khays
                       BFD_RELOC_MIPS_GOT_HI16);
8603
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
8604
                       mips_gp_register);
8605
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8606
                       BFD_RELOC_MIPS_GOT_LO16, tempreg);
8607
          if (breg != 0)
8608
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8609
                         tempreg, tempreg, breg);
8610
          macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
8611
 
8612
          relax_switch ();
8613
          offset_expr.X_add_number = expr1.X_add_number;
8614
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8615
                       BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
8616
          if (breg != 0)
8617
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8618
                         tempreg, tempreg, breg);
8619
          macro_build (&offset_expr, s, fmt, treg,
8620
                       BFD_RELOC_MIPS_GOT_OFST, tempreg);
8621
          relax_end ();
8622
        }
8623
      else
8624
        abort ();
8625
 
8626
      break;
8627
 
8628
    case M_LI:
8629
    case M_LI_S:
8630
      load_register (treg, &imm_expr, 0);
8631
      break;
8632
 
8633
    case M_DLI:
8634
      load_register (treg, &imm_expr, 1);
8635
      break;
8636
 
8637
    case M_LI_SS:
8638
      if (imm_expr.X_op == O_constant)
8639
        {
8640
          used_at = 1;
8641
          load_register (AT, &imm_expr, 0);
8642
          macro_build (NULL, "mtc1", "t,G", AT, treg);
8643
          break;
8644
        }
8645
      else
8646
        {
8647
          gas_assert (offset_expr.X_op == O_symbol
8648
                      && strcmp (segment_name (S_GET_SEGMENT
8649
                                               (offset_expr.X_add_symbol)),
8650
                                 ".lit4") == 0
8651
                      && offset_expr.X_add_number == 0);
8652
          macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
8653
                       BFD_RELOC_MIPS_LITERAL, mips_gp_register);
8654
          break;
8655
        }
8656
 
8657
    case M_LI_D:
8658
      /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
8659
         wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
8660
         order 32 bits of the value and the low order 32 bits are either
8661
         zero or in OFFSET_EXPR.  */
8662
      if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
8663
        {
8664
          if (HAVE_64BIT_GPRS)
8665
            load_register (treg, &imm_expr, 1);
8666
          else
8667
            {
8668
              int hreg, lreg;
8669
 
8670
              if (target_big_endian)
8671
                {
8672
                  hreg = treg;
8673
                  lreg = treg + 1;
8674
                }
8675
              else
8676
                {
8677
                  hreg = treg + 1;
8678
                  lreg = treg;
8679
                }
8680
 
8681
              if (hreg <= 31)
8682
                load_register (hreg, &imm_expr, 0);
8683
              if (lreg <= 31)
8684
                {
8685
                  if (offset_expr.X_op == O_absent)
8686
                    move_register (lreg, 0);
8687
                  else
8688
                    {
8689
                      gas_assert (offset_expr.X_op == O_constant);
8690
                      load_register (lreg, &offset_expr, 0);
8691
                    }
8692
                }
8693
            }
8694
          break;
8695
        }
8696
 
8697
      /* We know that sym is in the .rdata section.  First we get the
8698
         upper 16 bits of the address.  */
8699
      if (mips_pic == NO_PIC)
8700
        {
8701
          macro_build_lui (&offset_expr, AT);
8702
          used_at = 1;
8703
        }
8704
      else
8705
        {
8706
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
8707
                       BFD_RELOC_MIPS_GOT16, mips_gp_register);
8708
          used_at = 1;
8709
        }
8710
 
8711
      /* Now we load the register(s).  */
8712
      if (HAVE_64BIT_GPRS)
8713
        {
8714
          used_at = 1;
8715
          macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8716
        }
8717
      else
8718
        {
8719
          used_at = 1;
8720
          macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8721
          if (treg != RA)
8722
            {
8723
              /* FIXME: How in the world do we deal with the possible
8724
                 overflow here?  */
8725
              offset_expr.X_add_number += 4;
8726
              macro_build (&offset_expr, "lw", "t,o(b)",
8727
                           treg + 1, BFD_RELOC_LO16, AT);
8728
            }
8729
        }
8730
      break;
8731
 
8732
    case M_LI_DD:
8733
      /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
8734
         wide, IMM_EXPR is the entire value and the GPRs are known to be 64
8735
         bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
8736
         the value and the low order 32 bits are either zero or in
8737
         OFFSET_EXPR.  */
8738
      if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
8739
        {
8740
          used_at = 1;
8741
          load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
8742
          if (HAVE_64BIT_FPRS)
8743
            {
8744
              gas_assert (HAVE_64BIT_GPRS);
8745
              macro_build (NULL, "dmtc1", "t,S", AT, treg);
8746
            }
8747
          else
8748
            {
8749
              macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
8750
              if (offset_expr.X_op == O_absent)
8751
                macro_build (NULL, "mtc1", "t,G", 0, treg);
8752
              else
8753
                {
8754
                  gas_assert (offset_expr.X_op == O_constant);
8755
                  load_register (AT, &offset_expr, 0);
8756
                  macro_build (NULL, "mtc1", "t,G", AT, treg);
8757
                }
8758
            }
8759
          break;
8760
        }
8761
 
8762
      gas_assert (offset_expr.X_op == O_symbol
8763
                  && offset_expr.X_add_number == 0);
8764
      s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
8765
      if (strcmp (s, ".lit8") == 0)
8766
        {
8767 160 khays
          if (mips_opts.isa != ISA_MIPS1 || mips_opts.micromips)
8768 16 khays
            {
8769
              macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
8770
                           BFD_RELOC_MIPS_LITERAL, mips_gp_register);
8771
              break;
8772
            }
8773
          breg = mips_gp_register;
8774
          r = BFD_RELOC_MIPS_LITERAL;
8775
          goto dob;
8776
        }
8777
      else
8778
        {
8779
          gas_assert (strcmp (s, RDATA_SECTION_NAME) == 0);
8780
          used_at = 1;
8781
          if (mips_pic != NO_PIC)
8782
            macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
8783
                         BFD_RELOC_MIPS_GOT16, mips_gp_register);
8784
          else
8785
            {
8786
              /* FIXME: This won't work for a 64 bit address.  */
8787
              macro_build_lui (&offset_expr, AT);
8788
            }
8789
 
8790 160 khays
          if (mips_opts.isa != ISA_MIPS1 || mips_opts.micromips)
8791 16 khays
            {
8792
              macro_build (&offset_expr, "ldc1", "T,o(b)",
8793
                           treg, BFD_RELOC_LO16, AT);
8794
              break;
8795
            }
8796
          breg = AT;
8797
          r = BFD_RELOC_LO16;
8798
          goto dob;
8799
        }
8800
 
8801
    case M_L_DOB:
8802
      /* Even on a big endian machine $fn comes before $fn+1.  We have
8803
         to adjust when loading from memory.  */
8804
      r = BFD_RELOC_LO16;
8805
    dob:
8806 160 khays
      gas_assert (!mips_opts.micromips);
8807 16 khays
      gas_assert (mips_opts.isa == ISA_MIPS1);
8808
      macro_build (&offset_expr, "lwc1", "T,o(b)",
8809
                   target_big_endian ? treg + 1 : treg, r, breg);
8810
      /* FIXME: A possible overflow which I don't know how to deal
8811
         with.  */
8812
      offset_expr.X_add_number += 4;
8813
      macro_build (&offset_expr, "lwc1", "T,o(b)",
8814
                   target_big_endian ? treg : treg + 1, r, breg);
8815
      break;
8816
 
8817
    case M_S_DOB:
8818 160 khays
      gas_assert (!mips_opts.micromips);
8819 16 khays
      gas_assert (mips_opts.isa == ISA_MIPS1);
8820
      /* Even on a big endian machine $fn comes before $fn+1.  We have
8821
         to adjust when storing to memory.  */
8822
      macro_build (&offset_expr, "swc1", "T,o(b)",
8823
                   target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
8824
      offset_expr.X_add_number += 4;
8825
      macro_build (&offset_expr, "swc1", "T,o(b)",
8826
                   target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
8827
      break;
8828
 
8829
    case M_L_DAB:
8830 160 khays
      gas_assert (!mips_opts.micromips);
8831 16 khays
      /*
8832
       * The MIPS assembler seems to check for X_add_number not
8833
       * being double aligned and generating:
8834
       *        lui     at,%hi(foo+1)
8835
       *        addu    at,at,v1
8836
       *        addiu   at,at,%lo(foo+1)
8837
       *        lwc1    f2,0(at)
8838
       *        lwc1    f3,4(at)
8839
       * But, the resulting address is the same after relocation so why
8840
       * generate the extra instruction?
8841
       */
8842
      /* Itbl support may require additional care here.  */
8843
      coproc = 1;
8844 160 khays
      fmt = "T,o(b)";
8845 16 khays
      if (mips_opts.isa != ISA_MIPS1)
8846
        {
8847
          s = "ldc1";
8848 160 khays
          goto ld_st;
8849 16 khays
        }
8850
      s = "lwc1";
8851
      goto ldd_std;
8852
 
8853
    case M_S_DAB:
8854 160 khays
      gas_assert (!mips_opts.micromips);
8855
      /* Itbl support may require additional care here.  */
8856
      coproc = 1;
8857
      fmt = "T,o(b)";
8858 16 khays
      if (mips_opts.isa != ISA_MIPS1)
8859
        {
8860
          s = "sdc1";
8861 160 khays
          goto ld_st;
8862 16 khays
        }
8863
      s = "swc1";
8864
      goto ldd_std;
8865
 
8866
    case M_LD_AB:
8867 160 khays
      fmt = "t,o(b)";
8868 16 khays
      if (HAVE_64BIT_GPRS)
8869
        {
8870
          s = "ld";
8871
          goto ld;
8872
        }
8873
      s = "lw";
8874
      goto ldd_std;
8875
 
8876
    case M_SD_AB:
8877 160 khays
      fmt = "t,o(b)";
8878 16 khays
      if (HAVE_64BIT_GPRS)
8879
        {
8880
          s = "sd";
8881 160 khays
          goto ld_st;
8882 16 khays
        }
8883
      s = "sw";
8884
 
8885
    ldd_std:
8886
      if (offset_expr.X_op != O_symbol
8887
          && offset_expr.X_op != O_constant)
8888
        {
8889
          as_bad (_("Expression too complex"));
8890
          offset_expr.X_op = O_constant;
8891
        }
8892
 
8893
      if (HAVE_32BIT_ADDRESSES
8894
          && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
8895
        {
8896
          char value [32];
8897
 
8898
          sprintf_vma (value, offset_expr.X_add_number);
8899
          as_bad (_("Number (0x%s) larger than 32 bits"), value);
8900
        }
8901
 
8902
      /* Even on a big endian machine $fn comes before $fn+1.  We have
8903
         to adjust when loading from memory.  We set coproc if we must
8904
         load $fn+1 first.  */
8905
      /* Itbl support may require additional care here.  */
8906
      if (!target_big_endian)
8907
        coproc = 0;
8908
 
8909
      if (mips_pic == NO_PIC || offset_expr.X_op == O_constant)
8910
        {
8911
          /* If this is a reference to a GP relative symbol, we want
8912
               <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
8913
               <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
8914
             If we have a base register, we use this
8915
               addu     $at,$breg,$gp
8916
               <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
8917
               <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
8918
             If this is not a GP relative symbol, we want
8919
               lui      $at,<sym>               (BFD_RELOC_HI16_S)
8920
               <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
8921
               <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
8922
             If there is a base register, we add it to $at after the
8923
             lui instruction.  If there is a constant, we always use
8924
             the last case.  */
8925
          if (offset_expr.X_op == O_symbol
8926
              && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
8927
              && !nopic_need_relax (offset_expr.X_add_symbol, 1))
8928
            {
8929
              relax_start (offset_expr.X_add_symbol);
8930
              if (breg == 0)
8931
                {
8932
                  tempreg = mips_gp_register;
8933
                }
8934
              else
8935
                {
8936
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8937
                               AT, breg, mips_gp_register);
8938
                  tempreg = AT;
8939
                  used_at = 1;
8940
                }
8941
 
8942
              /* Itbl support may require additional care here.  */
8943
              macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
8944
                           BFD_RELOC_GPREL16, tempreg);
8945
              offset_expr.X_add_number += 4;
8946
 
8947
              /* Set mips_optimize to 2 to avoid inserting an
8948
                 undesired nop.  */
8949
              hold_mips_optimize = mips_optimize;
8950
              mips_optimize = 2;
8951
              /* Itbl support may require additional care here.  */
8952
              macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
8953
                           BFD_RELOC_GPREL16, tempreg);
8954
              mips_optimize = hold_mips_optimize;
8955
 
8956
              relax_switch ();
8957
 
8958
              offset_expr.X_add_number -= 4;
8959
            }
8960
          used_at = 1;
8961
          macro_build_lui (&offset_expr, AT);
8962
          if (breg != 0)
8963
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
8964
          /* Itbl support may require additional care here.  */
8965
          macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
8966
                       BFD_RELOC_LO16, AT);
8967
          /* FIXME: How do we handle overflow here?  */
8968
          offset_expr.X_add_number += 4;
8969
          /* Itbl support may require additional care here.  */
8970
          macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
8971
                       BFD_RELOC_LO16, AT);
8972
          if (mips_relax.sequence)
8973
            relax_end ();
8974
        }
8975
      else if (!mips_big_got)
8976
        {
8977
          /* If this is a reference to an external symbol, we want
8978
               lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
8979
               nop
8980
               <op>     $treg,0($at)
8981
               <op>     $treg+1,4($at)
8982
             Otherwise we want
8983
               lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
8984
               nop
8985
               <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
8986
               <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
8987
             If there is a base register we add it to $at before the
8988
             lwc1 instructions.  If there is a constant we include it
8989
             in the lwc1 instructions.  */
8990
          used_at = 1;
8991
          expr1.X_add_number = offset_expr.X_add_number;
8992
          if (expr1.X_add_number < -0x8000
8993
              || expr1.X_add_number >= 0x8000 - 4)
8994
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
8995
          load_got_offset (AT, &offset_expr);
8996
          load_delay_nop ();
8997
          if (breg != 0)
8998
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
8999
 
9000
          /* Set mips_optimize to 2 to avoid inserting an undesired
9001
             nop.  */
9002
          hold_mips_optimize = mips_optimize;
9003
          mips_optimize = 2;
9004
 
9005
          /* Itbl support may require additional care here.  */
9006
          relax_start (offset_expr.X_add_symbol);
9007
          macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
9008
                       BFD_RELOC_LO16, AT);
9009
          expr1.X_add_number += 4;
9010
          macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
9011
                       BFD_RELOC_LO16, AT);
9012
          relax_switch ();
9013
          macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9014
                       BFD_RELOC_LO16, AT);
9015
          offset_expr.X_add_number += 4;
9016
          macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9017
                       BFD_RELOC_LO16, AT);
9018
          relax_end ();
9019
 
9020
          mips_optimize = hold_mips_optimize;
9021
        }
9022
      else if (mips_big_got)
9023
        {
9024
          int gpdelay;
9025
 
9026
          /* If this is a reference to an external symbol, we want
9027
               lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
9028
               addu     $at,$at,$gp
9029
               lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
9030
               nop
9031
               <op>     $treg,0($at)
9032
               <op>     $treg+1,4($at)
9033
             Otherwise we want
9034
               lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
9035
               nop
9036
               <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
9037
               <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
9038
             If there is a base register we add it to $at before the
9039
             lwc1 instructions.  If there is a constant we include it
9040
             in the lwc1 instructions.  */
9041
          used_at = 1;
9042
          expr1.X_add_number = offset_expr.X_add_number;
9043
          offset_expr.X_add_number = 0;
9044
          if (expr1.X_add_number < -0x8000
9045
              || expr1.X_add_number >= 0x8000 - 4)
9046
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9047
          gpdelay = reg_needs_delay (mips_gp_register);
9048
          relax_start (offset_expr.X_add_symbol);
9049 160 khays
          macro_build (&offset_expr, "lui", LUI_FMT,
9050 16 khays
                       AT, BFD_RELOC_MIPS_GOT_HI16);
9051
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9052
                       AT, AT, mips_gp_register);
9053
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
9054
                       AT, BFD_RELOC_MIPS_GOT_LO16, AT);
9055
          load_delay_nop ();
9056
          if (breg != 0)
9057
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9058
          /* Itbl support may require additional care here.  */
9059
          macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
9060
                       BFD_RELOC_LO16, AT);
9061
          expr1.X_add_number += 4;
9062
 
9063
          /* Set mips_optimize to 2 to avoid inserting an undesired
9064
             nop.  */
9065
          hold_mips_optimize = mips_optimize;
9066
          mips_optimize = 2;
9067
          /* Itbl support may require additional care here.  */
9068
          macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
9069
                       BFD_RELOC_LO16, AT);
9070
          mips_optimize = hold_mips_optimize;
9071
          expr1.X_add_number -= 4;
9072
 
9073
          relax_switch ();
9074
          offset_expr.X_add_number = expr1.X_add_number;
9075
          if (gpdelay)
9076
            macro_build (NULL, "nop", "");
9077
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
9078
                       BFD_RELOC_MIPS_GOT16, mips_gp_register);
9079
          load_delay_nop ();
9080
          if (breg != 0)
9081
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9082
          /* Itbl support may require additional care here.  */
9083
          macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9084
                       BFD_RELOC_LO16, AT);
9085
          offset_expr.X_add_number += 4;
9086
 
9087
          /* Set mips_optimize to 2 to avoid inserting an undesired
9088
             nop.  */
9089
          hold_mips_optimize = mips_optimize;
9090
          mips_optimize = 2;
9091
          /* Itbl support may require additional care here.  */
9092
          macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9093
                       BFD_RELOC_LO16, AT);
9094
          mips_optimize = hold_mips_optimize;
9095
          relax_end ();
9096
        }
9097
      else
9098
        abort ();
9099
 
9100
      break;
9101
 
9102
    case M_LD_OB:
9103
      s = HAVE_64BIT_GPRS ? "ld" : "lw";
9104
      goto sd_ob;
9105
    case M_SD_OB:
9106
      s = HAVE_64BIT_GPRS ? "sd" : "sw";
9107
    sd_ob:
9108
      macro_build (&offset_expr, s, "t,o(b)", treg,
9109
                   -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
9110
                   breg);
9111
      if (!HAVE_64BIT_GPRS)
9112
        {
9113
          offset_expr.X_add_number += 4;
9114
          macro_build (&offset_expr, s, "t,o(b)", treg + 1,
9115
                       -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
9116
                       breg);
9117
        }
9118
      break;
9119
 
9120
   /* New code added to support COPZ instructions.
9121
      This code builds table entries out of the macros in mip_opcodes.
9122
      R4000 uses interlocks to handle coproc delays.
9123
      Other chips (like the R3000) require nops to be inserted for delays.
9124
 
9125
      FIXME: Currently, we require that the user handle delays.
9126
      In order to fill delay slots for non-interlocked chips,
9127
      we must have a way to specify delays based on the coprocessor.
9128
      Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
9129
      What are the side-effects of the cop instruction?
9130
      What cache support might we have and what are its effects?
9131
      Both coprocessor & memory require delays. how long???
9132
      What registers are read/set/modified?
9133
 
9134
      If an itbl is provided to interpret cop instructions,
9135
      this knowledge can be encoded in the itbl spec.  */
9136
 
9137
    case M_COP0:
9138
      s = "c0";
9139
      goto copz;
9140
    case M_COP1:
9141
      s = "c1";
9142
      goto copz;
9143
    case M_COP2:
9144
      s = "c2";
9145
      goto copz;
9146
    case M_COP3:
9147
      s = "c3";
9148
    copz:
9149 160 khays
      gas_assert (!mips_opts.micromips);
9150 16 khays
      if (NO_ISA_COP (mips_opts.arch)
9151
          && (ip->insn_mo->pinfo2 & INSN2_M_FP_S) == 0)
9152
        {
9153
          as_bad (_("opcode not supported on this processor: %s"),
9154
                  mips_cpu_info_from_arch (mips_opts.arch)->name);
9155
          break;
9156
        }
9157
 
9158
      /* For now we just do C (same as Cz).  The parameter will be
9159
         stored in insn_opcode by mips_ip.  */
9160
      macro_build (NULL, s, "C", ip->insn_opcode);
9161
      break;
9162
 
9163
    case M_MOVE:
9164
      move_register (dreg, sreg);
9165
      break;
9166
 
9167
    case M_DMUL:
9168
      dbl = 1;
9169
    case M_MUL:
9170
      macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
9171 160 khays
      macro_build (NULL, "mflo", MFHL_FMT, dreg);
9172 16 khays
      break;
9173
 
9174
    case M_DMUL_I:
9175
      dbl = 1;
9176
    case M_MUL_I:
9177
      /* The MIPS assembler some times generates shifts and adds.  I'm
9178
         not trying to be that fancy. GCC should do this for us
9179
         anyway.  */
9180
      used_at = 1;
9181
      load_register (AT, &imm_expr, dbl);
9182
      macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
9183 160 khays
      macro_build (NULL, "mflo", MFHL_FMT, dreg);
9184 16 khays
      break;
9185
 
9186
    case M_DMULO_I:
9187
      dbl = 1;
9188
    case M_MULO_I:
9189
      imm = 1;
9190
      goto do_mulo;
9191
 
9192
    case M_DMULO:
9193
      dbl = 1;
9194
    case M_MULO:
9195
    do_mulo:
9196
      start_noreorder ();
9197
      used_at = 1;
9198
      if (imm)
9199
        load_register (AT, &imm_expr, dbl);
9200
      macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
9201 160 khays
      macro_build (NULL, "mflo", MFHL_FMT, dreg);
9202
      macro_build (NULL, dbl ? "dsra32" : "sra", SHFT_FMT, dreg, dreg, RA);
9203
      macro_build (NULL, "mfhi", MFHL_FMT, AT);
9204 16 khays
      if (mips_trap)
9205 160 khays
        macro_build (NULL, "tne", TRAP_FMT, dreg, AT, 6);
9206 16 khays
      else
9207
        {
9208 160 khays
          if (mips_opts.micromips)
9209
            micromips_label_expr (&label_expr);
9210
          else
9211
            label_expr.X_add_number = 8;
9212
          macro_build (&label_expr, "beq", "s,t,p", dreg, AT);
9213 16 khays
          macro_build (NULL, "nop", "");
9214 160 khays
          macro_build (NULL, "break", BRK_FMT, 6);
9215
          if (mips_opts.micromips)
9216
            micromips_add_label ();
9217 16 khays
        }
9218
      end_noreorder ();
9219 160 khays
      macro_build (NULL, "mflo", MFHL_FMT, dreg);
9220 16 khays
      break;
9221
 
9222
    case M_DMULOU_I:
9223
      dbl = 1;
9224
    case M_MULOU_I:
9225
      imm = 1;
9226
      goto do_mulou;
9227
 
9228
    case M_DMULOU:
9229
      dbl = 1;
9230
    case M_MULOU:
9231
    do_mulou:
9232
      start_noreorder ();
9233
      used_at = 1;
9234
      if (imm)
9235
        load_register (AT, &imm_expr, dbl);
9236
      macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
9237
                   sreg, imm ? AT : treg);
9238 160 khays
      macro_build (NULL, "mfhi", MFHL_FMT, AT);
9239
      macro_build (NULL, "mflo", MFHL_FMT, dreg);
9240 16 khays
      if (mips_trap)
9241 160 khays
        macro_build (NULL, "tne", TRAP_FMT, AT, ZERO, 6);
9242 16 khays
      else
9243
        {
9244 160 khays
          if (mips_opts.micromips)
9245
            micromips_label_expr (&label_expr);
9246
          else
9247
            label_expr.X_add_number = 8;
9248
          macro_build (&label_expr, "beq", "s,t,p", AT, ZERO);
9249 16 khays
          macro_build (NULL, "nop", "");
9250 160 khays
          macro_build (NULL, "break", BRK_FMT, 6);
9251
          if (mips_opts.micromips)
9252
            micromips_add_label ();
9253 16 khays
        }
9254
      end_noreorder ();
9255
      break;
9256
 
9257
    case M_DROL:
9258
      if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9259
        {
9260
          if (dreg == sreg)
9261
            {
9262
              tempreg = AT;
9263
              used_at = 1;
9264
            }
9265
          else
9266
            {
9267
              tempreg = dreg;
9268
            }
9269
          macro_build (NULL, "dnegu", "d,w", tempreg, treg);
9270
          macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
9271
          break;
9272
        }
9273
      used_at = 1;
9274
      macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
9275
      macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
9276
      macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
9277
      macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9278
      break;
9279
 
9280
    case M_ROL:
9281
      if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9282
        {
9283
          if (dreg == sreg)
9284
            {
9285
              tempreg = AT;
9286
              used_at = 1;
9287
            }
9288
          else
9289
            {
9290
              tempreg = dreg;
9291
            }
9292
          macro_build (NULL, "negu", "d,w", tempreg, treg);
9293
          macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
9294
          break;
9295
        }
9296
      used_at = 1;
9297
      macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
9298
      macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
9299
      macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
9300
      macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9301
      break;
9302
 
9303
    case M_DROL_I:
9304
      {
9305
        unsigned int rot;
9306
        char *l;
9307
        char *rr;
9308
 
9309
        if (imm_expr.X_op != O_constant)
9310
          as_bad (_("Improper rotate count"));
9311
        rot = imm_expr.X_add_number & 0x3f;
9312
        if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9313
          {
9314
            rot = (64 - rot) & 0x3f;
9315
            if (rot >= 32)
9316 160 khays
              macro_build (NULL, "dror32", SHFT_FMT, dreg, sreg, rot - 32);
9317 16 khays
            else
9318 160 khays
              macro_build (NULL, "dror", SHFT_FMT, dreg, sreg, rot);
9319 16 khays
            break;
9320
          }
9321
        if (rot == 0)
9322
          {
9323 160 khays
            macro_build (NULL, "dsrl", SHFT_FMT, dreg, sreg, 0);
9324 16 khays
            break;
9325
          }
9326
        l = (rot < 0x20) ? "dsll" : "dsll32";
9327
        rr = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
9328
        rot &= 0x1f;
9329
        used_at = 1;
9330 160 khays
        macro_build (NULL, l, SHFT_FMT, AT, sreg, rot);
9331
        macro_build (NULL, rr, SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9332 16 khays
        macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9333
      }
9334
      break;
9335
 
9336
    case M_ROL_I:
9337
      {
9338
        unsigned int rot;
9339
 
9340
        if (imm_expr.X_op != O_constant)
9341
          as_bad (_("Improper rotate count"));
9342
        rot = imm_expr.X_add_number & 0x1f;
9343
        if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9344
          {
9345 160 khays
            macro_build (NULL, "ror", SHFT_FMT, dreg, sreg, (32 - rot) & 0x1f);
9346 16 khays
            break;
9347
          }
9348
        if (rot == 0)
9349
          {
9350 160 khays
            macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, 0);
9351 16 khays
            break;
9352
          }
9353
        used_at = 1;
9354 160 khays
        macro_build (NULL, "sll", SHFT_FMT, AT, sreg, rot);
9355
        macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9356 16 khays
        macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9357
      }
9358
      break;
9359
 
9360
    case M_DROR:
9361
      if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9362
        {
9363
          macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
9364
          break;
9365
        }
9366
      used_at = 1;
9367
      macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
9368
      macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
9369
      macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
9370
      macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9371
      break;
9372
 
9373
    case M_ROR:
9374
      if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9375
        {
9376
          macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
9377
          break;
9378
        }
9379
      used_at = 1;
9380
      macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
9381
      macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
9382
      macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
9383
      macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9384
      break;
9385
 
9386
    case M_DROR_I:
9387
      {
9388
        unsigned int rot;
9389
        char *l;
9390
        char *rr;
9391
 
9392
        if (imm_expr.X_op != O_constant)
9393
          as_bad (_("Improper rotate count"));
9394
        rot = imm_expr.X_add_number & 0x3f;
9395
        if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9396
          {
9397
            if (rot >= 32)
9398 160 khays
              macro_build (NULL, "dror32", SHFT_FMT, dreg, sreg, rot - 32);
9399 16 khays
            else
9400 160 khays
              macro_build (NULL, "dror", SHFT_FMT, dreg, sreg, rot);
9401 16 khays
            break;
9402
          }
9403
        if (rot == 0)
9404
          {
9405 160 khays
            macro_build (NULL, "dsrl", SHFT_FMT, dreg, sreg, 0);
9406 16 khays
            break;
9407
          }
9408
        rr = (rot < 0x20) ? "dsrl" : "dsrl32";
9409
        l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
9410
        rot &= 0x1f;
9411
        used_at = 1;
9412 160 khays
        macro_build (NULL, rr, SHFT_FMT, AT, sreg, rot);
9413
        macro_build (NULL, l, SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9414 16 khays
        macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9415
      }
9416
      break;
9417
 
9418
    case M_ROR_I:
9419
      {
9420
        unsigned int rot;
9421
 
9422
        if (imm_expr.X_op != O_constant)
9423
          as_bad (_("Improper rotate count"));
9424
        rot = imm_expr.X_add_number & 0x1f;
9425
        if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9426
          {
9427 160 khays
            macro_build (NULL, "ror", SHFT_FMT, dreg, sreg, rot);
9428 16 khays
            break;
9429
          }
9430
        if (rot == 0)
9431
          {
9432 160 khays
            macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, 0);
9433 16 khays
            break;
9434
          }
9435
        used_at = 1;
9436 160 khays
        macro_build (NULL, "srl", SHFT_FMT, AT, sreg, rot);
9437
        macro_build (NULL, "sll", SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9438 16 khays
        macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9439
      }
9440
      break;
9441
 
9442
    case M_SEQ:
9443
      if (sreg == 0)
9444
        macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
9445
      else if (treg == 0)
9446
        macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9447
      else
9448
        {
9449
          macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
9450
          macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
9451
        }
9452
      break;
9453
 
9454
    case M_SEQ_I:
9455
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
9456
        {
9457
          macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9458
          break;
9459
        }
9460
      if (sreg == 0)
9461
        {
9462
          as_warn (_("Instruction %s: result is always false"),
9463
                   ip->insn_mo->name);
9464
          move_register (dreg, 0);
9465
          break;
9466
        }
9467
      if (CPU_HAS_SEQ (mips_opts.arch)
9468
          && -512 <= imm_expr.X_add_number
9469
          && imm_expr.X_add_number < 512)
9470
        {
9471
          macro_build (NULL, "seqi", "t,r,+Q", dreg, sreg,
9472
                       (int) imm_expr.X_add_number);
9473
          break;
9474
        }
9475
      if (imm_expr.X_op == O_constant
9476
          && imm_expr.X_add_number >= 0
9477
          && imm_expr.X_add_number < 0x10000)
9478
        {
9479
          macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
9480
        }
9481
      else if (imm_expr.X_op == O_constant
9482
               && imm_expr.X_add_number > -0x8000
9483
               && imm_expr.X_add_number < 0)
9484
        {
9485
          imm_expr.X_add_number = -imm_expr.X_add_number;
9486
          macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
9487
                       "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9488
        }
9489
      else if (CPU_HAS_SEQ (mips_opts.arch))
9490
        {
9491
          used_at = 1;
9492
          load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9493
          macro_build (NULL, "seq", "d,v,t", dreg, sreg, AT);
9494
          break;
9495
        }
9496
      else
9497
        {
9498
          load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9499
          macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
9500
          used_at = 1;
9501
        }
9502
      macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
9503
      break;
9504
 
9505
    case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
9506
      s = "slt";
9507
      goto sge;
9508
    case M_SGEU:
9509
      s = "sltu";
9510
    sge:
9511
      macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
9512
      macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
9513
      break;
9514
 
9515
    case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
9516
    case M_SGEU_I:
9517
      if (imm_expr.X_op == O_constant
9518
          && imm_expr.X_add_number >= -0x8000
9519
          && imm_expr.X_add_number < 0x8000)
9520
        {
9521
          macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
9522
                       dreg, sreg, BFD_RELOC_LO16);
9523
        }
9524
      else
9525
        {
9526
          load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9527
          macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
9528
                       dreg, sreg, AT);
9529
          used_at = 1;
9530
        }
9531
      macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
9532
      break;
9533
 
9534
    case M_SGT:         /* sreg > treg  <==>  treg < sreg */
9535
      s = "slt";
9536
      goto sgt;
9537
    case M_SGTU:
9538
      s = "sltu";
9539
    sgt:
9540
      macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
9541
      break;
9542
 
9543
    case M_SGT_I:               /* sreg > I  <==>  I < sreg */
9544
      s = "slt";
9545
      goto sgti;
9546
    case M_SGTU_I:
9547
      s = "sltu";
9548
    sgti:
9549
      used_at = 1;
9550
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9551
      macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
9552
      break;
9553
 
9554
    case M_SLE: /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
9555
      s = "slt";
9556
      goto sle;
9557
    case M_SLEU:
9558
      s = "sltu";
9559
    sle:
9560
      macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
9561
      macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
9562
      break;
9563
 
9564
    case M_SLE_I:       /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
9565
      s = "slt";
9566
      goto slei;
9567
    case M_SLEU_I:
9568
      s = "sltu";
9569
    slei:
9570
      used_at = 1;
9571
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9572
      macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
9573
      macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
9574
      break;
9575
 
9576
    case M_SLT_I:
9577
      if (imm_expr.X_op == O_constant
9578
          && imm_expr.X_add_number >= -0x8000
9579
          && imm_expr.X_add_number < 0x8000)
9580
        {
9581
          macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9582
          break;
9583
        }
9584
      used_at = 1;
9585
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9586
      macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
9587
      break;
9588
 
9589
    case M_SLTU_I:
9590
      if (imm_expr.X_op == O_constant
9591
          && imm_expr.X_add_number >= -0x8000
9592
          && imm_expr.X_add_number < 0x8000)
9593
        {
9594
          macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
9595
                       BFD_RELOC_LO16);
9596
          break;
9597
        }
9598
      used_at = 1;
9599
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9600
      macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
9601
      break;
9602
 
9603
    case M_SNE:
9604
      if (sreg == 0)
9605
        macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
9606
      else if (treg == 0)
9607
        macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
9608
      else
9609
        {
9610
          macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
9611
          macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
9612
        }
9613
      break;
9614
 
9615
    case M_SNE_I:
9616
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
9617
        {
9618
          macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
9619
          break;
9620
        }
9621
      if (sreg == 0)
9622
        {
9623
          as_warn (_("Instruction %s: result is always true"),
9624
                   ip->insn_mo->name);
9625
          macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
9626
                       dreg, 0, BFD_RELOC_LO16);
9627
          break;
9628
        }
9629
      if (CPU_HAS_SEQ (mips_opts.arch)
9630
          && -512 <= imm_expr.X_add_number
9631
          && imm_expr.X_add_number < 512)
9632
        {
9633
          macro_build (NULL, "snei", "t,r,+Q", dreg, sreg,
9634
                       (int) imm_expr.X_add_number);
9635
          break;
9636
        }
9637
      if (imm_expr.X_op == O_constant
9638
          && imm_expr.X_add_number >= 0
9639
          && imm_expr.X_add_number < 0x10000)
9640
        {
9641
          macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
9642
        }
9643
      else if (imm_expr.X_op == O_constant
9644
               && imm_expr.X_add_number > -0x8000
9645
               && imm_expr.X_add_number < 0)
9646
        {
9647
          imm_expr.X_add_number = -imm_expr.X_add_number;
9648
          macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
9649
                       "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9650
        }
9651
      else if (CPU_HAS_SEQ (mips_opts.arch))
9652
        {
9653
          used_at = 1;
9654
          load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9655
          macro_build (NULL, "sne", "d,v,t", dreg, sreg, AT);
9656
          break;
9657
        }
9658
      else
9659
        {
9660
          load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9661
          macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
9662
          used_at = 1;
9663
        }
9664
      macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
9665
      break;
9666
 
9667 160 khays
    case M_SUB_I:
9668
      s = "addi";
9669
      s2 = "sub";
9670
      goto do_subi;
9671
    case M_SUBU_I:
9672
      s = "addiu";
9673
      s2 = "subu";
9674
      goto do_subi;
9675 16 khays
    case M_DSUB_I:
9676
      dbl = 1;
9677 160 khays
      s = "daddi";
9678
      s2 = "dsub";
9679
      if (!mips_opts.micromips)
9680
        goto do_subi;
9681 16 khays
      if (imm_expr.X_op == O_constant
9682 160 khays
          && imm_expr.X_add_number > -0x200
9683
          && imm_expr.X_add_number <= 0x200)
9684 16 khays
        {
9685 160 khays
          macro_build (NULL, s, "t,r,.", dreg, sreg, -imm_expr.X_add_number);
9686 16 khays
          break;
9687
        }
9688 160 khays
      goto do_subi_i;
9689 16 khays
    case M_DSUBU_I:
9690
      dbl = 1;
9691 160 khays
      s = "daddiu";
9692
      s2 = "dsubu";
9693
    do_subi:
9694 16 khays
      if (imm_expr.X_op == O_constant
9695
          && imm_expr.X_add_number > -0x8000
9696
          && imm_expr.X_add_number <= 0x8000)
9697
        {
9698
          imm_expr.X_add_number = -imm_expr.X_add_number;
9699 160 khays
          macro_build (&imm_expr, s, "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9700 16 khays
          break;
9701
        }
9702 160 khays
    do_subi_i:
9703 16 khays
      used_at = 1;
9704
      load_register (AT, &imm_expr, dbl);
9705 160 khays
      macro_build (NULL, s2, "d,v,t", dreg, sreg, AT);
9706 16 khays
      break;
9707
 
9708
    case M_TEQ_I:
9709
      s = "teq";
9710
      goto trap;
9711
    case M_TGE_I:
9712
      s = "tge";
9713
      goto trap;
9714
    case M_TGEU_I:
9715
      s = "tgeu";
9716
      goto trap;
9717
    case M_TLT_I:
9718
      s = "tlt";
9719
      goto trap;
9720
    case M_TLTU_I:
9721
      s = "tltu";
9722
      goto trap;
9723
    case M_TNE_I:
9724
      s = "tne";
9725
    trap:
9726
      used_at = 1;
9727
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9728
      macro_build (NULL, s, "s,t", sreg, AT);
9729
      break;
9730
 
9731
    case M_TRUNCWS:
9732
    case M_TRUNCWD:
9733 160 khays
      gas_assert (!mips_opts.micromips);
9734 16 khays
      gas_assert (mips_opts.isa == ISA_MIPS1);
9735
      used_at = 1;
9736
      sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
9737
      dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
9738
 
9739
      /*
9740
       * Is the double cfc1 instruction a bug in the mips assembler;
9741
       * or is there a reason for it?
9742
       */
9743
      start_noreorder ();
9744
      macro_build (NULL, "cfc1", "t,G", treg, RA);
9745
      macro_build (NULL, "cfc1", "t,G", treg, RA);
9746
      macro_build (NULL, "nop", "");
9747
      expr1.X_add_number = 3;
9748
      macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
9749
      expr1.X_add_number = 2;
9750
      macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
9751
      macro_build (NULL, "ctc1", "t,G", AT, RA);
9752
      macro_build (NULL, "nop", "");
9753
      macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
9754
                   dreg, sreg);
9755
      macro_build (NULL, "ctc1", "t,G", treg, RA);
9756
      macro_build (NULL, "nop", "");
9757
      end_noreorder ();
9758
      break;
9759
 
9760 160 khays
    case M_ULH_A:
9761
      ab = 1;
9762 16 khays
    case M_ULH:
9763
      s = "lb";
9764 160 khays
      s2 = "lbu";
9765
      off = 1;
9766
      goto uld_st;
9767
    case M_ULHU_A:
9768
      ab = 1;
9769 16 khays
    case M_ULHU:
9770
      s = "lbu";
9771 160 khays
      s2 = "lbu";
9772
      off = 1;
9773
      goto uld_st;
9774
    case M_ULW_A:
9775
      ab = 1;
9776
    case M_ULW:
9777
      s = "lwl";
9778
      s2 = "lwr";
9779
      off12 = mips_opts.micromips;
9780
      off = 3;
9781
      goto uld_st;
9782
    case M_ULD_A:
9783
      ab = 1;
9784 16 khays
    case M_ULD:
9785
      s = "ldl";
9786
      s2 = "ldr";
9787 160 khays
      off12 = mips_opts.micromips;
9788 16 khays
      off = 7;
9789 160 khays
      goto uld_st;
9790
    case M_USH_A:
9791
      ab = 1;
9792
    case M_USH:
9793
      s = "sb";
9794
      s2 = "sb";
9795
      off = 1;
9796
      ust = 1;
9797
      goto uld_st;
9798
    case M_USW_A:
9799
      ab = 1;
9800
    case M_USW:
9801
      s = "swl";
9802
      s2 = "swr";
9803
      off12 = mips_opts.micromips;
9804 16 khays
      off = 3;
9805 160 khays
      ust = 1;
9806
      goto uld_st;
9807
    case M_USD_A:
9808
      ab = 1;
9809
    case M_USD:
9810
      s = "sdl";
9811
      s2 = "sdr";
9812
      off12 = mips_opts.micromips;
9813
      off = 7;
9814
      ust = 1;
9815
 
9816
    uld_st:
9817
      if (!ab && offset_expr.X_add_number >= 0x8000 - off)
9818 16 khays
        as_bad (_("Operand overflow"));
9819 160 khays
 
9820
      ep = &offset_expr;
9821
      expr1.X_add_number = 0;
9822
      if (ab)
9823 16 khays
        {
9824
          used_at = 1;
9825
          tempreg = AT;
9826 160 khays
          load_address (tempreg, ep, &used_at);
9827
          if (breg != 0)
9828
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9829
                         tempreg, tempreg, breg);
9830
          breg = tempreg;
9831
          tempreg = treg;
9832
          ep = &expr1;
9833 16 khays
        }
9834 160 khays
      else if (off12
9835
               && (offset_expr.X_op != O_constant
9836
                   || !IS_SEXT_12BIT_NUM (offset_expr.X_add_number)
9837
                   || !IS_SEXT_12BIT_NUM (offset_expr.X_add_number + off)))
9838
        {
9839
          used_at = 1;
9840
          tempreg = AT;
9841
          macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", tempreg, breg,
9842
                       -1, offset_reloc[0], offset_reloc[1], offset_reloc[2]);
9843
          breg = tempreg;
9844
          tempreg = treg;
9845
          ep = &expr1;
9846
        }
9847
      else if (!ust && treg == breg)
9848
        {
9849
          used_at = 1;
9850
          tempreg = AT;
9851
        }
9852 16 khays
      else
9853 160 khays
        tempreg = treg;
9854 16 khays
 
9855 160 khays
      if (off == 1)
9856
        goto ulh_sh;
9857 16 khays
 
9858
      if (!target_big_endian)
9859 160 khays
        ep->X_add_number += off;
9860
      if (!off12)
9861
        macro_build (ep, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
9862 16 khays
      else
9863 160 khays
        macro_build (NULL, s, "t,~(b)",
9864
                     tempreg, (unsigned long) ep->X_add_number, breg);
9865
 
9866 16 khays
      if (!target_big_endian)
9867 160 khays
        ep->X_add_number -= off;
9868 16 khays
      else
9869 160 khays
        ep->X_add_number += off;
9870
      if (!off12)
9871
        macro_build (ep, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
9872
      else
9873
        macro_build (NULL, s2, "t,~(b)",
9874
                     tempreg, (unsigned long) ep->X_add_number, breg);
9875 16 khays
 
9876 160 khays
      /* If necessary, move the result in tempreg to the final destination.  */
9877
      if (!ust && treg != tempreg)
9878
        {
9879
          /* Protect second load's delay slot.  */
9880
          load_delay_nop ();
9881
          move_register (treg, tempreg);
9882
        }
9883 16 khays
      break;
9884
 
9885 160 khays
    ulh_sh:
9886 16 khays
      used_at = 1;
9887 160 khays
      if (target_big_endian == ust)
9888
        ep->X_add_number += off;
9889
      tempreg = ust || ab ? treg : AT;
9890
      macro_build (ep, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
9891 16 khays
 
9892 160 khays
      /* For halfword transfers we need a temporary register to shuffle
9893
         bytes.  Unfortunately for M_USH_A we have none available before
9894
         the next store as AT holds the base address.  We deal with this
9895
         case by clobbering TREG and then restoring it as with ULH.  */
9896
      tempreg = ust == ab ? treg : AT;
9897
      if (ust)
9898
        macro_build (NULL, "srl", SHFT_FMT, tempreg, treg, 8);
9899 16 khays
 
9900 160 khays
      if (target_big_endian == ust)
9901
        ep->X_add_number -= off;
9902 16 khays
      else
9903 160 khays
        ep->X_add_number += off;
9904
      macro_build (ep, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
9905 16 khays
 
9906 160 khays
      /* For M_USH_A re-retrieve the LSB.  */
9907
      if (ust && ab)
9908
        {
9909
          if (target_big_endian)
9910
            ep->X_add_number += off;
9911
          else
9912
            ep->X_add_number -= off;
9913
          macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
9914
        }
9915
      /* For ULH and M_USH_A OR the LSB in.  */
9916
      if (!ust || ab)
9917
        {
9918
          tempreg = !ab ? AT : treg;
9919
          macro_build (NULL, "sll", SHFT_FMT, tempreg, tempreg, 8);
9920
          macro_build (NULL, "or", "d,v,t", treg, treg, AT);
9921
        }
9922 16 khays
      break;
9923
 
9924
    default:
9925
      /* FIXME: Check if this is one of the itbl macros, since they
9926
         are added dynamically.  */
9927
      as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
9928
      break;
9929
    }
9930
  if (!mips_opts.at && used_at)
9931
    as_bad (_("Macro used $at after \".set noat\""));
9932
}
9933
 
9934
/* Implement macros in mips16 mode.  */
9935
 
9936
static void
9937
mips16_macro (struct mips_cl_insn *ip)
9938
{
9939
  int mask;
9940
  int xreg, yreg, zreg, tmp;
9941
  expressionS expr1;
9942
  int dbl;
9943
  const char *s, *s2, *s3;
9944
 
9945
  mask = ip->insn_mo->mask;
9946
 
9947
  xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
9948
  yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
9949
  zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
9950
 
9951
  expr1.X_op = O_constant;
9952
  expr1.X_op_symbol = NULL;
9953
  expr1.X_add_symbol = NULL;
9954
  expr1.X_add_number = 1;
9955
 
9956
  dbl = 0;
9957
 
9958
  switch (mask)
9959
    {
9960
    default:
9961
      internalError ();
9962
 
9963
    case M_DDIV_3:
9964
      dbl = 1;
9965
    case M_DIV_3:
9966
      s = "mflo";
9967
      goto do_div3;
9968
    case M_DREM_3:
9969
      dbl = 1;
9970
    case M_REM_3:
9971
      s = "mfhi";
9972
    do_div3:
9973
      start_noreorder ();
9974
      macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
9975
      expr1.X_add_number = 2;
9976
      macro_build (&expr1, "bnez", "x,p", yreg);
9977
      macro_build (NULL, "break", "6", 7);
9978
 
9979
      /* FIXME: The normal code checks for of -1 / -0x80000000 here,
9980
         since that causes an overflow.  We should do that as well,
9981
         but I don't see how to do the comparisons without a temporary
9982
         register.  */
9983
      end_noreorder ();
9984
      macro_build (NULL, s, "x", zreg);
9985
      break;
9986
 
9987
    case M_DIVU_3:
9988
      s = "divu";
9989
      s2 = "mflo";
9990
      goto do_divu3;
9991
    case M_REMU_3:
9992
      s = "divu";
9993
      s2 = "mfhi";
9994
      goto do_divu3;
9995
    case M_DDIVU_3:
9996
      s = "ddivu";
9997
      s2 = "mflo";
9998
      goto do_divu3;
9999
    case M_DREMU_3:
10000
      s = "ddivu";
10001
      s2 = "mfhi";
10002
    do_divu3:
10003
      start_noreorder ();
10004
      macro_build (NULL, s, "0,x,y", xreg, yreg);
10005
      expr1.X_add_number = 2;
10006
      macro_build (&expr1, "bnez", "x,p", yreg);
10007
      macro_build (NULL, "break", "6", 7);
10008
      end_noreorder ();
10009
      macro_build (NULL, s2, "x", zreg);
10010
      break;
10011
 
10012
    case M_DMUL:
10013
      dbl = 1;
10014
    case M_MUL:
10015
      macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
10016
      macro_build (NULL, "mflo", "x", zreg);
10017
      break;
10018
 
10019
    case M_DSUBU_I:
10020
      dbl = 1;
10021
      goto do_subu;
10022
    case M_SUBU_I:
10023
    do_subu:
10024
      if (imm_expr.X_op != O_constant)
10025
        as_bad (_("Unsupported large constant"));
10026
      imm_expr.X_add_number = -imm_expr.X_add_number;
10027
      macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
10028
      break;
10029
 
10030
    case M_SUBU_I_2:
10031
      if (imm_expr.X_op != O_constant)
10032
        as_bad (_("Unsupported large constant"));
10033
      imm_expr.X_add_number = -imm_expr.X_add_number;
10034
      macro_build (&imm_expr, "addiu", "x,k", xreg);
10035
      break;
10036
 
10037
    case M_DSUBU_I_2:
10038
      if (imm_expr.X_op != O_constant)
10039
        as_bad (_("Unsupported large constant"));
10040
      imm_expr.X_add_number = -imm_expr.X_add_number;
10041
      macro_build (&imm_expr, "daddiu", "y,j", yreg);
10042
      break;
10043
 
10044
    case M_BEQ:
10045
      s = "cmp";
10046
      s2 = "bteqz";
10047
      goto do_branch;
10048
    case M_BNE:
10049
      s = "cmp";
10050
      s2 = "btnez";
10051
      goto do_branch;
10052
    case M_BLT:
10053
      s = "slt";
10054
      s2 = "btnez";
10055
      goto do_branch;
10056
    case M_BLTU:
10057
      s = "sltu";
10058
      s2 = "btnez";
10059
      goto do_branch;
10060
    case M_BLE:
10061
      s = "slt";
10062
      s2 = "bteqz";
10063
      goto do_reverse_branch;
10064
    case M_BLEU:
10065
      s = "sltu";
10066
      s2 = "bteqz";
10067
      goto do_reverse_branch;
10068
    case M_BGE:
10069
      s = "slt";
10070
      s2 = "bteqz";
10071
      goto do_branch;
10072
    case M_BGEU:
10073
      s = "sltu";
10074
      s2 = "bteqz";
10075
      goto do_branch;
10076
    case M_BGT:
10077
      s = "slt";
10078
      s2 = "btnez";
10079
      goto do_reverse_branch;
10080
    case M_BGTU:
10081
      s = "sltu";
10082
      s2 = "btnez";
10083
 
10084
    do_reverse_branch:
10085
      tmp = xreg;
10086
      xreg = yreg;
10087
      yreg = tmp;
10088
 
10089
    do_branch:
10090
      macro_build (NULL, s, "x,y", xreg, yreg);
10091
      macro_build (&offset_expr, s2, "p");
10092
      break;
10093
 
10094
    case M_BEQ_I:
10095
      s = "cmpi";
10096
      s2 = "bteqz";
10097
      s3 = "x,U";
10098
      goto do_branch_i;
10099
    case M_BNE_I:
10100
      s = "cmpi";
10101
      s2 = "btnez";
10102
      s3 = "x,U";
10103
      goto do_branch_i;
10104
    case M_BLT_I:
10105
      s = "slti";
10106
      s2 = "btnez";
10107
      s3 = "x,8";
10108
      goto do_branch_i;
10109
    case M_BLTU_I:
10110
      s = "sltiu";
10111
      s2 = "btnez";
10112
      s3 = "x,8";
10113
      goto do_branch_i;
10114
    case M_BLE_I:
10115
      s = "slti";
10116
      s2 = "btnez";
10117
      s3 = "x,8";
10118
      goto do_addone_branch_i;
10119
    case M_BLEU_I:
10120
      s = "sltiu";
10121
      s2 = "btnez";
10122
      s3 = "x,8";
10123
      goto do_addone_branch_i;
10124
    case M_BGE_I:
10125
      s = "slti";
10126
      s2 = "bteqz";
10127
      s3 = "x,8";
10128
      goto do_branch_i;
10129
    case M_BGEU_I:
10130
      s = "sltiu";
10131
      s2 = "bteqz";
10132
      s3 = "x,8";
10133
      goto do_branch_i;
10134
    case M_BGT_I:
10135
      s = "slti";
10136
      s2 = "bteqz";
10137
      s3 = "x,8";
10138
      goto do_addone_branch_i;
10139
    case M_BGTU_I:
10140
      s = "sltiu";
10141
      s2 = "bteqz";
10142
      s3 = "x,8";
10143
 
10144
    do_addone_branch_i:
10145
      if (imm_expr.X_op != O_constant)
10146
        as_bad (_("Unsupported large constant"));
10147
      ++imm_expr.X_add_number;
10148
 
10149
    do_branch_i:
10150
      macro_build (&imm_expr, s, s3, xreg);
10151
      macro_build (&offset_expr, s2, "p");
10152
      break;
10153
 
10154
    case M_ABS:
10155
      expr1.X_add_number = 0;
10156
      macro_build (&expr1, "slti", "x,8", yreg);
10157
      if (xreg != yreg)
10158
        move_register (xreg, yreg);
10159
      expr1.X_add_number = 2;
10160
      macro_build (&expr1, "bteqz", "p");
10161
      macro_build (NULL, "neg", "x,w", xreg, xreg);
10162
    }
10163
}
10164
 
10165
/* For consistency checking, verify that all bits are specified either
10166
   by the match/mask part of the instruction definition, or by the
10167
   operand list.  */
10168
static int
10169
validate_mips_insn (const struct mips_opcode *opc)
10170
{
10171
  const char *p = opc->args;
10172
  char c;
10173
  unsigned long used_bits = opc->mask;
10174
 
10175
  if ((used_bits & opc->match) != opc->match)
10176
    {
10177
      as_bad (_("internal: bad mips opcode (mask error): %s %s"),
10178
              opc->name, opc->args);
10179
      return 0;
10180
    }
10181
#define USE_BITS(mask,shift)    (used_bits |= ((mask) << (shift)))
10182
  while (*p)
10183
    switch (c = *p++)
10184
      {
10185
      case ',': break;
10186
      case '(': break;
10187
      case ')': break;
10188
      case '+':
10189
        switch (c = *p++)
10190
          {
10191
          case '1': USE_BITS (OP_MASK_UDI1,     OP_SH_UDI1);    break;
10192
          case '2': USE_BITS (OP_MASK_UDI2,     OP_SH_UDI2);    break;
10193
          case '3': USE_BITS (OP_MASK_UDI3,     OP_SH_UDI3);    break;
10194
          case '4': USE_BITS (OP_MASK_UDI4,     OP_SH_UDI4);    break;
10195
          case 'A': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
10196
          case 'B': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
10197
          case 'C': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
10198
          case 'D': USE_BITS (OP_MASK_RD,       OP_SH_RD);
10199
                    USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
10200
          case 'E': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
10201
          case 'F': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
10202
          case 'G': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
10203
          case 'H': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
10204
          case 'I': break;
10205
          case 't': USE_BITS (OP_MASK_RT,       OP_SH_RT);      break;
10206
          case 'T': USE_BITS (OP_MASK_RT,       OP_SH_RT);
10207
                    USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
10208
          case 'x': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
10209
          case 'X': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
10210
          case 'p': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
10211
          case 'P': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
10212
          case 'Q': USE_BITS (OP_MASK_SEQI,     OP_SH_SEQI);    break;
10213
          case 's': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
10214
          case 'S': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
10215
          case 'z': USE_BITS (OP_MASK_RZ,       OP_SH_RZ);      break;
10216
          case 'Z': USE_BITS (OP_MASK_FZ,       OP_SH_FZ);      break;
10217
          case 'a': USE_BITS (OP_MASK_OFFSET_A, OP_SH_OFFSET_A); break;
10218
          case 'b': USE_BITS (OP_MASK_OFFSET_B, OP_SH_OFFSET_B); break;
10219
          case 'c': USE_BITS (OP_MASK_OFFSET_C, OP_SH_OFFSET_C); break;
10220
 
10221
          default:
10222
            as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
10223
                    c, opc->name, opc->args);
10224
            return 0;
10225
          }
10226
        break;
10227
      case '<': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
10228
      case '>': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
10229
      case 'A': break;
10230
      case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
10231
      case 'C': USE_BITS (OP_MASK_COPZ,         OP_SH_COPZ);    break;
10232
      case 'D': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
10233
      case 'E': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10234
      case 'F': break;
10235
      case 'G': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10236
      case 'H': USE_BITS (OP_MASK_SEL,          OP_SH_SEL);     break;
10237
      case 'I': break;
10238
      case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
10239
      case 'K': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10240
      case 'L': break;
10241
      case 'M': USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
10242
      case 'N': USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
10243
      case 'O': USE_BITS (OP_MASK_ALN,          OP_SH_ALN);     break;
10244
      case 'Q': USE_BITS (OP_MASK_VSEL,         OP_SH_VSEL);
10245
                USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10246
      case 'R': USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
10247
      case 'S': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
10248
      case 'T': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10249
      case 'V': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
10250
      case 'W': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10251
      case 'X': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
10252
      case 'Y': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
10253
      case 'Z': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10254
      case 'a': USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
10255
      case 'b': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10256
      case 'c': USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
10257
      case 'd': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10258
      case 'f': break;
10259
      case 'h': USE_BITS (OP_MASK_PREFX,        OP_SH_PREFX);   break;
10260
      case 'i': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
10261
      case 'j': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
10262
      case 'k': USE_BITS (OP_MASK_CACHE,        OP_SH_CACHE);   break;
10263
      case 'l': break;
10264
      case 'o': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
10265
      case 'p': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
10266
      case 'q': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
10267
      case 'r': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10268
      case 's': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10269
      case 't': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10270
      case 'u': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
10271
      case 'v': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10272
      case 'w': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10273
      case 'x': break;
10274
      case 'z': break;
10275
      case 'P': USE_BITS (OP_MASK_PERFREG,      OP_SH_PERFREG); break;
10276
      case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
10277
                USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10278
      case 'e': USE_BITS (OP_MASK_VECBYTE,      OP_SH_VECBYTE); break;
10279
      case '%': USE_BITS (OP_MASK_VECALIGN,     OP_SH_VECALIGN); break;
10280
      case '[': break;
10281
      case ']': break;
10282
      case '1': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
10283
      case '2': USE_BITS (OP_MASK_BP,           OP_SH_BP);      break;
10284
      case '3': USE_BITS (OP_MASK_SA3,          OP_SH_SA3);     break;
10285
      case '4': USE_BITS (OP_MASK_SA4,          OP_SH_SA4);     break;
10286
      case '5': USE_BITS (OP_MASK_IMM8,         OP_SH_IMM8);    break;
10287
      case '6': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10288
      case '7': USE_BITS (OP_MASK_DSPACC,       OP_SH_DSPACC);  break;
10289
      case '8': USE_BITS (OP_MASK_WRDSP,        OP_SH_WRDSP);   break;
10290
      case '9': USE_BITS (OP_MASK_DSPACC_S,     OP_SH_DSPACC_S);break;
10291
      case '0': USE_BITS (OP_MASK_DSPSFT,       OP_SH_DSPSFT);  break;
10292
      case '\'': USE_BITS (OP_MASK_RDDSP,       OP_SH_RDDSP);   break;
10293
      case ':': USE_BITS (OP_MASK_DSPSFT_7,     OP_SH_DSPSFT_7);break;
10294
      case '@': USE_BITS (OP_MASK_IMM10,        OP_SH_IMM10);   break;
10295
      case '!': USE_BITS (OP_MASK_MT_U,         OP_SH_MT_U);    break;
10296
      case '$': USE_BITS (OP_MASK_MT_H,         OP_SH_MT_H);    break;
10297
      case '*': USE_BITS (OP_MASK_MTACC_T,      OP_SH_MTACC_T); break;
10298
      case '&': USE_BITS (OP_MASK_MTACC_D,      OP_SH_MTACC_D); break;
10299 160 khays
      case '\\': USE_BITS (OP_MASK_3BITPOS,     OP_SH_3BITPOS); break;
10300
      case '~': USE_BITS (OP_MASK_OFFSET12,     OP_SH_OFFSET12); break;
10301 16 khays
      case 'g': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10302
      default:
10303
        as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
10304
                c, opc->name, opc->args);
10305
        return 0;
10306
      }
10307
#undef USE_BITS
10308
  if (used_bits != 0xffffffff)
10309
    {
10310
      as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
10311
              ~used_bits & 0xffffffff, opc->name, opc->args);
10312
      return 0;
10313
    }
10314
  return 1;
10315
}
10316
 
10317 160 khays
/* For consistency checking, verify that the length implied matches the
10318
   major opcode and that all bits are specified either by the match/mask
10319
   part of the instruction definition, or by the operand list.  */
10320
 
10321
static int
10322
validate_micromips_insn (const struct mips_opcode *opc)
10323
{
10324
  unsigned long match = opc->match;
10325
  unsigned long mask = opc->mask;
10326
  const char *p = opc->args;
10327
  unsigned long insn_bits;
10328
  unsigned long used_bits;
10329
  unsigned long major;
10330
  unsigned int length;
10331
  char e;
10332
  char c;
10333
 
10334
  if ((mask & match) != match)
10335
    {
10336
      as_bad (_("Internal error: bad microMIPS opcode (mask error): %s %s"),
10337
              opc->name, opc->args);
10338
      return 0;
10339
    }
10340
  length = micromips_insn_length (opc);
10341
  if (length != 2 && length != 4)
10342
    {
10343
      as_bad (_("Internal error: bad microMIPS opcode (incorrect length: %u): "
10344
                "%s %s"), length, opc->name, opc->args);
10345
      return 0;
10346
    }
10347
  major = match >> (10 + 8 * (length - 2));
10348
  if ((length == 2 && (major & 7) != 1 && (major & 6) != 2)
10349
      || (length == 4 && (major & 7) != 0 && (major & 4) != 4))
10350
    {
10351
      as_bad (_("Internal error: bad microMIPS opcode "
10352
                "(opcode/length mismatch): %s %s"), opc->name, opc->args);
10353
      return 0;
10354
    }
10355
 
10356
  /* Shift piecewise to avoid an overflow where unsigned long is 32-bit.  */
10357
  insn_bits = 1 << 4 * length;
10358
  insn_bits <<= 4 * length;
10359
  insn_bits -= 1;
10360
  used_bits = mask;
10361
#define USE_BITS(field) \
10362
  (used_bits |= MICROMIPSOP_MASK_##field << MICROMIPSOP_SH_##field)
10363
  while (*p)
10364
    switch (c = *p++)
10365
      {
10366
      case ',': break;
10367
      case '(': break;
10368
      case ')': break;
10369
      case '+':
10370
        e = c;
10371
        switch (c = *p++)
10372
          {
10373
          case 'A': USE_BITS (EXTLSB);  break;
10374
          case 'B': USE_BITS (INSMSB);  break;
10375
          case 'C': USE_BITS (EXTMSBD); break;
10376
          case 'D': USE_BITS (RS);      USE_BITS (SEL); break;
10377
          case 'E': USE_BITS (EXTLSB);  break;
10378
          case 'F': USE_BITS (INSMSB);  break;
10379
          case 'G': USE_BITS (EXTMSBD); break;
10380
          case 'H': USE_BITS (EXTMSBD); break;
10381
          default:
10382
            as_bad (_("Internal error: bad mips opcode "
10383
                      "(unknown extension operand type `%c%c'): %s %s"),
10384
                    e, c, opc->name, opc->args);
10385
            return 0;
10386
          }
10387
        break;
10388
      case 'm':
10389
        e = c;
10390
        switch (c = *p++)
10391
          {
10392
          case 'A': USE_BITS (IMMA);    break;
10393
          case 'B': USE_BITS (IMMB);    break;
10394
          case 'C': USE_BITS (IMMC);    break;
10395
          case 'D': USE_BITS (IMMD);    break;
10396
          case 'E': USE_BITS (IMME);    break;
10397
          case 'F': USE_BITS (IMMF);    break;
10398
          case 'G': USE_BITS (IMMG);    break;
10399
          case 'H': USE_BITS (IMMH);    break;
10400
          case 'I': USE_BITS (IMMI);    break;
10401
          case 'J': USE_BITS (IMMJ);    break;
10402
          case 'L': USE_BITS (IMML);    break;
10403
          case 'M': USE_BITS (IMMM);    break;
10404
          case 'N': USE_BITS (IMMN);    break;
10405
          case 'O': USE_BITS (IMMO);    break;
10406
          case 'P': USE_BITS (IMMP);    break;
10407
          case 'Q': USE_BITS (IMMQ);    break;
10408
          case 'U': USE_BITS (IMMU);    break;
10409
          case 'W': USE_BITS (IMMW);    break;
10410
          case 'X': USE_BITS (IMMX);    break;
10411
          case 'Y': USE_BITS (IMMY);    break;
10412
          case 'Z': break;
10413
          case 'a': break;
10414
          case 'b': USE_BITS (MB);      break;
10415
          case 'c': USE_BITS (MC);      break;
10416
          case 'd': USE_BITS (MD);      break;
10417
          case 'e': USE_BITS (ME);      break;
10418
          case 'f': USE_BITS (MF);      break;
10419
          case 'g': USE_BITS (MG);      break;
10420
          case 'h': USE_BITS (MH);      break;
10421
          case 'i': USE_BITS (MI);      break;
10422
          case 'j': USE_BITS (MJ);      break;
10423
          case 'l': USE_BITS (ML);      break;
10424
          case 'm': USE_BITS (MM);      break;
10425
          case 'n': USE_BITS (MN);      break;
10426
          case 'p': USE_BITS (MP);      break;
10427
          case 'q': USE_BITS (MQ);      break;
10428
          case 'r': break;
10429
          case 's': break;
10430
          case 't': break;
10431
          case 'x': break;
10432
          case 'y': break;
10433
          case 'z': break;
10434
          default:
10435
            as_bad (_("Internal error: bad mips opcode "
10436
                      "(unknown extension operand type `%c%c'): %s %s"),
10437
                    e, c, opc->name, opc->args);
10438
            return 0;
10439
          }
10440
        break;
10441
      case '.': USE_BITS (OFFSET10);    break;
10442
      case '1': USE_BITS (STYPE);       break;
10443
      case '<': USE_BITS (SHAMT);       break;
10444
      case '>': USE_BITS (SHAMT);       break;
10445
      case 'B': USE_BITS (CODE10);      break;
10446
      case 'C': USE_BITS (COPZ);        break;
10447
      case 'D': USE_BITS (FD);          break;
10448
      case 'E': USE_BITS (RT);          break;
10449
      case 'G': USE_BITS (RS);          break;
10450 163 khays
      case 'H': USE_BITS (SEL);         break;
10451 160 khays
      case 'K': USE_BITS (RS);          break;
10452
      case 'M': USE_BITS (CCC);         break;
10453
      case 'N': USE_BITS (BCC);         break;
10454
      case 'R': USE_BITS (FR);          break;
10455
      case 'S': USE_BITS (FS);          break;
10456
      case 'T': USE_BITS (FT);          break;
10457
      case 'V': USE_BITS (FS);          break;
10458
      case '\\': USE_BITS (3BITPOS);    break;
10459
      case 'a': USE_BITS (TARGET);      break;
10460
      case 'b': USE_BITS (RS);          break;
10461
      case 'c': USE_BITS (CODE);        break;
10462
      case 'd': USE_BITS (RD);          break;
10463
      case 'h': USE_BITS (PREFX);       break;
10464
      case 'i': USE_BITS (IMMEDIATE);   break;
10465
      case 'j': USE_BITS (DELTA);       break;
10466
      case 'k': USE_BITS (CACHE);       break;
10467
      case 'n': USE_BITS (RT);          break;
10468
      case 'o': USE_BITS (DELTA);       break;
10469
      case 'p': USE_BITS (DELTA);       break;
10470
      case 'q': USE_BITS (CODE2);       break;
10471
      case 'r': USE_BITS (RS);          break;
10472
      case 's': USE_BITS (RS);          break;
10473
      case 't': USE_BITS (RT);          break;
10474
      case 'u': USE_BITS (IMMEDIATE);   break;
10475
      case 'v': USE_BITS (RS);          break;
10476
      case 'w': USE_BITS (RT);          break;
10477
      case 'y': USE_BITS (RS3);         break;
10478
      case 'z': break;
10479
      case '|': USE_BITS (TRAP);        break;
10480
      case '~': USE_BITS (OFFSET12);    break;
10481
      default:
10482
        as_bad (_("Internal error: bad microMIPS opcode "
10483
                  "(unknown operand type `%c'): %s %s"),
10484
                c, opc->name, opc->args);
10485
        return 0;
10486
      }
10487
#undef USE_BITS
10488
  if (used_bits != insn_bits)
10489
    {
10490
      if (~used_bits & insn_bits)
10491
        as_bad (_("Internal error: bad microMIPS opcode "
10492
                  "(bits 0x%lx undefined): %s %s"),
10493
                ~used_bits & insn_bits, opc->name, opc->args);
10494
      if (used_bits & ~insn_bits)
10495
        as_bad (_("Internal error: bad microMIPS opcode "
10496
                  "(bits 0x%lx defined): %s %s"),
10497
                used_bits & ~insn_bits, opc->name, opc->args);
10498
      return 0;
10499
    }
10500
  return 1;
10501
}
10502
 
10503 16 khays
/* UDI immediates.  */
10504
struct mips_immed {
10505
  char          type;
10506
  unsigned int  shift;
10507
  unsigned long mask;
10508
  const char *  desc;
10509
};
10510
 
10511
static const struct mips_immed mips_immed[] = {
10512
  { '1',        OP_SH_UDI1,     OP_MASK_UDI1,           0},
10513
  { '2',        OP_SH_UDI2,     OP_MASK_UDI2,           0},
10514
  { '3',        OP_SH_UDI3,     OP_MASK_UDI3,           0},
10515
  { '4',        OP_SH_UDI4,     OP_MASK_UDI4,           0},
10516
  { 0,0,0,0 }
10517
};
10518
 
10519
/* Check whether an odd floating-point register is allowed.  */
10520
static int
10521
mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
10522
{
10523
  const char *s = insn->name;
10524
 
10525
  if (insn->pinfo == INSN_MACRO)
10526
    /* Let a macro pass, we'll catch it later when it is expanded.  */
10527
    return 1;
10528
 
10529
  if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
10530
    {
10531
      /* Allow odd registers for single-precision ops.  */
10532
      switch (insn->pinfo & (FP_S | FP_D))
10533
        {
10534
        case FP_S:
10535
        case 0:
10536
          return 1;     /* both single precision - ok */
10537
        case FP_D:
10538
          return 0;      /* both double precision - fail */
10539
        default:
10540
          break;
10541
        }
10542
 
10543
      /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand.  */
10544
      s = strchr (insn->name, '.');
10545
      if (argnum == 2)
10546
        s = s != NULL ? strchr (s + 1, '.') : NULL;
10547
      return (s != NULL && (s[1] == 'w' || s[1] == 's'));
10548
    }
10549
 
10550
  /* Single-precision coprocessor loads and moves are OK too.  */
10551
  if ((insn->pinfo & FP_S)
10552
      && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
10553
                         | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
10554
    return 1;
10555
 
10556
  return 0;
10557
}
10558
 
10559 160 khays
/* Check if EXPR is a constant between MIN (inclusive) and MAX (exclusive)
10560
   taking bits from BIT up.  */
10561
static int
10562
expr_const_in_range (expressionS *ep, offsetT min, offsetT max, int bit)
10563
{
10564
  return (ep->X_op == O_constant
10565
          && (ep->X_add_number & ((1 << bit) - 1)) == 0
10566
          && ep->X_add_number >= min << bit
10567
          && ep->X_add_number < max << bit);
10568
}
10569
 
10570 16 khays
/* This routine assembles an instruction into its binary format.  As a
10571
   side effect, it sets one of the global variables imm_reloc or
10572
   offset_reloc to the type of relocation to do if one of the operands
10573
   is an address expression.  */
10574
 
10575
static void
10576
mips_ip (char *str, struct mips_cl_insn *ip)
10577
{
10578 160 khays
  bfd_boolean wrong_delay_slot_insns = FALSE;
10579
  bfd_boolean need_delay_slot_ok = TRUE;
10580
  struct mips_opcode *firstinsn = NULL;
10581
  const struct mips_opcode *past;
10582
  struct hash_control *hash;
10583 16 khays
  char *s;
10584
  const char *args;
10585
  char c = 0;
10586
  struct mips_opcode *insn;
10587
  char *argsStart;
10588
  unsigned int regno;
10589
  unsigned int lastregno;
10590 160 khays
  unsigned int destregno = 0;
10591 16 khays
  unsigned int lastpos = 0;
10592
  unsigned int limlo, limhi;
10593
  char *s_reset;
10594
  offsetT min_range, max_range;
10595 160 khays
  long opend;
10596
  char *name;
10597 16 khays
  int argnum;
10598
  unsigned int rtype;
10599 160 khays
  char *dot;
10600
  long end;
10601 16 khays
 
10602
  insn_error = NULL;
10603
 
10604 160 khays
  if (mips_opts.micromips)
10605
    {
10606
      hash = micromips_op_hash;
10607
      past = &micromips_opcodes[bfd_micromips_num_opcodes];
10608
    }
10609
  else
10610
    {
10611
      hash = op_hash;
10612
      past = &mips_opcodes[NUMOPCODES];
10613
    }
10614
  forced_insn_length = 0;
10615 16 khays
  insn = NULL;
10616 160 khays
 
10617
  /* We first try to match an instruction up to a space or to the end.  */
10618
  for (end = 0; str[end] != '\0' && !ISSPACE (str[end]); end++)
10619 16 khays
    continue;
10620
 
10621 160 khays
  /* Make a copy of the instruction so that we can fiddle with it.  */
10622
  name = alloca (end + 1);
10623
  memcpy (name, str, end);
10624
  name[end] = '\0';
10625
 
10626
  for (;;)
10627 16 khays
    {
10628 160 khays
      insn = (struct mips_opcode *) hash_find (hash, name);
10629 16 khays
 
10630 160 khays
      if (insn != NULL || !mips_opts.micromips)
10631
        break;
10632
      if (forced_insn_length)
10633
        break;
10634 16 khays
 
10635 160 khays
      /* See if there's an instruction size override suffix,
10636
         either `16' or `32', at the end of the mnemonic proper,
10637
         that defines the operation, i.e. before the first `.'
10638
         character if any.  Strip it and retry.  */
10639
      dot = strchr (name, '.');
10640
      opend = dot != NULL ? dot - name : end;
10641
      if (opend < 3)
10642
        break;
10643
      if (name[opend - 2] == '1' && name[opend - 1] == '6')
10644
        forced_insn_length = 2;
10645
      else if (name[opend - 2] == '3' && name[opend - 1] == '2')
10646
        forced_insn_length = 4;
10647
      else
10648
        break;
10649
      memcpy (name + opend - 2, name + opend, end - opend + 1);
10650
    }
10651 16 khays
  if (insn == NULL)
10652
    {
10653 160 khays
      insn_error = _("Unrecognized opcode");
10654
      return;
10655 16 khays
    }
10656
 
10657 160 khays
  /* For microMIPS instructions placed in a fixed-length branch delay slot
10658
     we make up to two passes over the relevant fragment of the opcode
10659
     table.  First we try instructions that meet the delay slot's length
10660
     requirement.  If none matched, then we retry with the remaining ones
10661
     and if one matches, then we use it and then issue an appropriate
10662
     warning later on.  */
10663
  argsStart = s = str + end;
10664 16 khays
  for (;;)
10665
    {
10666 160 khays
      bfd_boolean delay_slot_ok;
10667
      bfd_boolean size_ok;
10668 16 khays
      bfd_boolean ok;
10669
 
10670 160 khays
      gas_assert (strcmp (insn->name, name) == 0);
10671 16 khays
 
10672
      ok = is_opcode_valid (insn);
10673 160 khays
      size_ok = is_size_valid (insn);
10674
      delay_slot_ok = is_delay_slot_valid (insn);
10675
      if (!delay_slot_ok && !wrong_delay_slot_insns)
10676 16 khays
        {
10677 160 khays
          firstinsn = insn;
10678
          wrong_delay_slot_insns = TRUE;
10679
        }
10680
      if (!ok || !size_ok || delay_slot_ok != need_delay_slot_ok)
10681
        {
10682
          static char buf[256];
10683
 
10684
          if (insn + 1 < past && strcmp (insn->name, insn[1].name) == 0)
10685 16 khays
            {
10686
              ++insn;
10687
              continue;
10688
            }
10689 160 khays
          if (wrong_delay_slot_insns && need_delay_slot_ok)
10690 16 khays
            {
10691 160 khays
              gas_assert (firstinsn);
10692
              need_delay_slot_ok = FALSE;
10693
              past = insn + 1;
10694
              insn = firstinsn;
10695
              continue;
10696 16 khays
            }
10697 160 khays
 
10698
          if (insn_error)
10699
            return;
10700
 
10701
          if (!ok)
10702
            sprintf (buf, _("opcode not supported on this processor: %s (%s)"),
10703
                     mips_cpu_info_from_arch (mips_opts.arch)->name,
10704
                     mips_cpu_info_from_isa (mips_opts.isa)->name);
10705
          else
10706
            sprintf (buf, _("Unrecognized %u-bit version of microMIPS opcode"),
10707
                     8 * forced_insn_length);
10708
          insn_error = buf;
10709
 
10710
          return;
10711 16 khays
        }
10712
 
10713
      create_insn (ip, insn);
10714
      insn_error = NULL;
10715
      argnum = 1;
10716
      lastregno = 0xffffffff;
10717
      for (args = insn->args;; ++args)
10718
        {
10719
          int is_mdmx;
10720
 
10721
          s += strspn (s, " \t");
10722
          is_mdmx = 0;
10723
          switch (*args)
10724
            {
10725
            case '\0':          /* end of args */
10726
              if (*s == '\0')
10727
                return;
10728
              break;
10729
 
10730
            case '2': /* DSP 2-bit unsigned immediate in bit 11.  */
10731 160 khays
              gas_assert (!mips_opts.micromips);
10732 16 khays
              my_getExpression (&imm_expr, s);
10733
              check_absolute_expr (ip, &imm_expr);
10734
              if ((unsigned long) imm_expr.X_add_number != 1
10735
                  && (unsigned long) imm_expr.X_add_number != 3)
10736
                {
10737
                  as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
10738
                          (unsigned long) imm_expr.X_add_number);
10739
                }
10740 160 khays
              INSERT_OPERAND (0, BP, *ip, imm_expr.X_add_number);
10741 16 khays
              imm_expr.X_op = O_absent;
10742
              s = expr_end;
10743
              continue;
10744
 
10745
            case '3': /* DSP 3-bit unsigned immediate in bit 21.  */
10746 160 khays
              gas_assert (!mips_opts.micromips);
10747 16 khays
              my_getExpression (&imm_expr, s);
10748
              check_absolute_expr (ip, &imm_expr);
10749
              if (imm_expr.X_add_number & ~OP_MASK_SA3)
10750
                {
10751
                  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
10752
                          OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
10753
                }
10754 160 khays
              INSERT_OPERAND (0, SA3, *ip, imm_expr.X_add_number);
10755 16 khays
              imm_expr.X_op = O_absent;
10756
              s = expr_end;
10757
              continue;
10758
 
10759
            case '4': /* DSP 4-bit unsigned immediate in bit 21.  */
10760 160 khays
              gas_assert (!mips_opts.micromips);
10761 16 khays
              my_getExpression (&imm_expr, s);
10762
              check_absolute_expr (ip, &imm_expr);
10763
              if (imm_expr.X_add_number & ~OP_MASK_SA4)
10764
                {
10765
                  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
10766
                          OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
10767
                }
10768 160 khays
              INSERT_OPERAND (0, SA4, *ip, imm_expr.X_add_number);
10769 16 khays
              imm_expr.X_op = O_absent;
10770
              s = expr_end;
10771
              continue;
10772
 
10773
            case '5': /* DSP 8-bit unsigned immediate in bit 16.  */
10774 160 khays
              gas_assert (!mips_opts.micromips);
10775 16 khays
              my_getExpression (&imm_expr, s);
10776
              check_absolute_expr (ip, &imm_expr);
10777
              if (imm_expr.X_add_number & ~OP_MASK_IMM8)
10778
                {
10779
                  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
10780
                          OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
10781
                }
10782 160 khays
              INSERT_OPERAND (0, IMM8, *ip, imm_expr.X_add_number);
10783 16 khays
              imm_expr.X_op = O_absent;
10784
              s = expr_end;
10785
              continue;
10786
 
10787
            case '6': /* DSP 5-bit unsigned immediate in bit 21.  */
10788 160 khays
              gas_assert (!mips_opts.micromips);
10789 16 khays
              my_getExpression (&imm_expr, s);
10790
              check_absolute_expr (ip, &imm_expr);
10791
              if (imm_expr.X_add_number & ~OP_MASK_RS)
10792
                {
10793
                  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
10794
                          OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
10795
                }
10796 160 khays
              INSERT_OPERAND (0, RS, *ip, imm_expr.X_add_number);
10797 16 khays
              imm_expr.X_op = O_absent;
10798
              s = expr_end;
10799
              continue;
10800
 
10801
            case '7': /* Four DSP accumulators in bits 11,12.  */
10802 160 khays
              gas_assert (!mips_opts.micromips);
10803 16 khays
              if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
10804
                  s[3] >= '0' && s[3] <= '3')
10805
                {
10806
                  regno = s[3] - '0';
10807
                  s += 4;
10808 160 khays
                  INSERT_OPERAND (0, DSPACC, *ip, regno);
10809 16 khays
                  continue;
10810
                }
10811
              else
10812
                as_bad (_("Invalid dsp acc register"));
10813
              break;
10814
 
10815
            case '8': /* DSP 6-bit unsigned immediate in bit 11.  */
10816 160 khays
              gas_assert (!mips_opts.micromips);
10817 16 khays
              my_getExpression (&imm_expr, s);
10818
              check_absolute_expr (ip, &imm_expr);
10819
              if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
10820
                {
10821
                  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
10822
                          OP_MASK_WRDSP,
10823
                          (unsigned long) imm_expr.X_add_number);
10824
                }
10825 160 khays
              INSERT_OPERAND (0, WRDSP, *ip, imm_expr.X_add_number);
10826 16 khays
              imm_expr.X_op = O_absent;
10827
              s = expr_end;
10828
              continue;
10829
 
10830
            case '9': /* Four DSP accumulators in bits 21,22.  */
10831 160 khays
              gas_assert (!mips_opts.micromips);
10832 16 khays
              if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
10833
                  s[3] >= '0' && s[3] <= '3')
10834
                {
10835
                  regno = s[3] - '0';
10836
                  s += 4;
10837 160 khays
                  INSERT_OPERAND (0, DSPACC_S, *ip, regno);
10838 16 khays
                  continue;
10839
                }
10840
              else
10841
                as_bad (_("Invalid dsp acc register"));
10842
              break;
10843
 
10844
            case '0': /* DSP 6-bit signed immediate in bit 20.  */
10845 160 khays
              gas_assert (!mips_opts.micromips);
10846 16 khays
              my_getExpression (&imm_expr, s);
10847
              check_absolute_expr (ip, &imm_expr);
10848
              min_range = -((OP_MASK_DSPSFT + 1) >> 1);
10849
              max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
10850
              if (imm_expr.X_add_number < min_range ||
10851
                  imm_expr.X_add_number > max_range)
10852
                {
10853
                  as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
10854
                          (long) min_range, (long) max_range,
10855
                          (long) imm_expr.X_add_number);
10856
                }
10857 160 khays
              INSERT_OPERAND (0, DSPSFT, *ip, imm_expr.X_add_number);
10858 16 khays
              imm_expr.X_op = O_absent;
10859
              s = expr_end;
10860
              continue;
10861
 
10862
            case '\'': /* DSP 6-bit unsigned immediate in bit 16.  */
10863 160 khays
              gas_assert (!mips_opts.micromips);
10864 16 khays
              my_getExpression (&imm_expr, s);
10865
              check_absolute_expr (ip, &imm_expr);
10866
              if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
10867
                {
10868
                  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
10869
                          OP_MASK_RDDSP,
10870
                          (unsigned long) imm_expr.X_add_number);
10871
                }
10872 160 khays
              INSERT_OPERAND (0, RDDSP, *ip, imm_expr.X_add_number);
10873 16 khays
              imm_expr.X_op = O_absent;
10874
              s = expr_end;
10875
              continue;
10876
 
10877
            case ':': /* DSP 7-bit signed immediate in bit 19.  */
10878 160 khays
              gas_assert (!mips_opts.micromips);
10879 16 khays
              my_getExpression (&imm_expr, s);
10880
              check_absolute_expr (ip, &imm_expr);
10881
              min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
10882
              max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
10883
              if (imm_expr.X_add_number < min_range ||
10884
                  imm_expr.X_add_number > max_range)
10885
                {
10886
                  as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
10887
                          (long) min_range, (long) max_range,
10888
                          (long) imm_expr.X_add_number);
10889
                }
10890 160 khays
              INSERT_OPERAND (0, DSPSFT_7, *ip, imm_expr.X_add_number);
10891 16 khays
              imm_expr.X_op = O_absent;
10892
              s = expr_end;
10893
              continue;
10894
 
10895
            case '@': /* DSP 10-bit signed immediate in bit 16.  */
10896 160 khays
              gas_assert (!mips_opts.micromips);
10897 16 khays
              my_getExpression (&imm_expr, s);
10898
              check_absolute_expr (ip, &imm_expr);
10899
              min_range = -((OP_MASK_IMM10 + 1) >> 1);
10900
              max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
10901
              if (imm_expr.X_add_number < min_range ||
10902
                  imm_expr.X_add_number > max_range)
10903
                {
10904
                  as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
10905
                          (long) min_range, (long) max_range,
10906
                          (long) imm_expr.X_add_number);
10907
                }
10908 160 khays
              INSERT_OPERAND (0, IMM10, *ip, imm_expr.X_add_number);
10909 16 khays
              imm_expr.X_op = O_absent;
10910
              s = expr_end;
10911
              continue;
10912
 
10913
            case '!': /* MT usermode flag bit.  */
10914 160 khays
              gas_assert (!mips_opts.micromips);
10915 16 khays
              my_getExpression (&imm_expr, s);
10916
              check_absolute_expr (ip, &imm_expr);
10917
              if (imm_expr.X_add_number & ~OP_MASK_MT_U)
10918
                as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
10919
                        (unsigned long) imm_expr.X_add_number);
10920 160 khays
              INSERT_OPERAND (0, MT_U, *ip, imm_expr.X_add_number);
10921 16 khays
              imm_expr.X_op = O_absent;
10922
              s = expr_end;
10923
              continue;
10924
 
10925
            case '$': /* MT load high flag bit.  */
10926 160 khays
              gas_assert (!mips_opts.micromips);
10927 16 khays
              my_getExpression (&imm_expr, s);
10928
              check_absolute_expr (ip, &imm_expr);
10929
              if (imm_expr.X_add_number & ~OP_MASK_MT_H)
10930
                as_bad (_("MT load high bit not 0 or 1 (%lu)"),
10931
                        (unsigned long) imm_expr.X_add_number);
10932 160 khays
              INSERT_OPERAND (0, MT_H, *ip, imm_expr.X_add_number);
10933 16 khays
              imm_expr.X_op = O_absent;
10934
              s = expr_end;
10935
              continue;
10936
 
10937
            case '*': /* Four DSP accumulators in bits 18,19.  */
10938 160 khays
              gas_assert (!mips_opts.micromips);
10939 16 khays
              if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
10940
                  s[3] >= '0' && s[3] <= '3')
10941
                {
10942
                  regno = s[3] - '0';
10943
                  s += 4;
10944 160 khays
                  INSERT_OPERAND (0, MTACC_T, *ip, regno);
10945 16 khays
                  continue;
10946
                }
10947
              else
10948
                as_bad (_("Invalid dsp/smartmips acc register"));
10949
              break;
10950
 
10951
            case '&': /* Four DSP accumulators in bits 13,14.  */
10952 160 khays
              gas_assert (!mips_opts.micromips);
10953 16 khays
              if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
10954
                  s[3] >= '0' && s[3] <= '3')
10955
                {
10956
                  regno = s[3] - '0';
10957
                  s += 4;
10958 160 khays
                  INSERT_OPERAND (0, MTACC_D, *ip, regno);
10959 16 khays
                  continue;
10960
                }
10961
              else
10962
                as_bad (_("Invalid dsp/smartmips acc register"));
10963
              break;
10964
 
10965 160 khays
            case '\\':          /* 3-bit bit position.  */
10966
              {
10967
                unsigned long mask = (!mips_opts.micromips
10968
                                      ? OP_MASK_3BITPOS
10969
                                      : MICROMIPSOP_MASK_3BITPOS);
10970
 
10971
                my_getExpression (&imm_expr, s);
10972
                check_absolute_expr (ip, &imm_expr);
10973
                if ((unsigned long) imm_expr.X_add_number > mask)
10974
                  as_warn (_("Bit position for %s not in range 0..%lu (%lu)"),
10975
                           ip->insn_mo->name,
10976
                           mask, (unsigned long) imm_expr.X_add_number);
10977
                INSERT_OPERAND (mips_opts.micromips,
10978
                                3BITPOS, *ip, imm_expr.X_add_number);
10979
                imm_expr.X_op = O_absent;
10980
                s = expr_end;
10981
              }
10982
              continue;
10983
 
10984 16 khays
            case ',':
10985
              ++argnum;
10986
              if (*s++ == *args)
10987
                continue;
10988
              s--;
10989
              switch (*++args)
10990
                {
10991
                case 'r':
10992
                case 'v':
10993 160 khays
                  INSERT_OPERAND (mips_opts.micromips, RS, *ip, lastregno);
10994 16 khays
                  continue;
10995
 
10996
                case 'w':
10997 160 khays
                  INSERT_OPERAND (mips_opts.micromips, RT, *ip, lastregno);
10998 16 khays
                  continue;
10999
 
11000
                case 'W':
11001 160 khays
                  gas_assert (!mips_opts.micromips);
11002
                  INSERT_OPERAND (0, FT, *ip, lastregno);
11003 16 khays
                  continue;
11004
 
11005
                case 'V':
11006 160 khays
                  INSERT_OPERAND (mips_opts.micromips, FS, *ip, lastregno);
11007 16 khays
                  continue;
11008
                }
11009
              break;
11010
 
11011
            case '(':
11012
              /* Handle optional base register.
11013
                 Either the base register is omitted or
11014
                 we must have a left paren.  */
11015
              /* This is dependent on the next operand specifier
11016
                 is a base register specification.  */
11017 160 khays
              gas_assert (args[1] == 'b'
11018
                          || (mips_opts.micromips
11019
                              && args[1] == 'm'
11020
                              && (args[2] == 'l' || args[2] == 'n'
11021
                                  || args[2] == 's' || args[2] == 'a')));
11022
              if (*s == '\0' && args[1] == 'b')
11023 16 khays
                return;
11024 160 khays
              /* Fall through.  */
11025 16 khays
 
11026
            case ')':           /* These must match exactly.  */
11027 160 khays
              if (*s++ == *args)
11028
                continue;
11029
              break;
11030
 
11031
            case '[':           /* These must match exactly.  */
11032 16 khays
            case ']':
11033 160 khays
              gas_assert (!mips_opts.micromips);
11034 16 khays
              if (*s++ == *args)
11035
                continue;
11036
              break;
11037
 
11038
            case '+':           /* Opcode extension character.  */
11039
              switch (*++args)
11040
                {
11041
                case '1':       /* UDI immediates.  */
11042
                case '2':
11043
                case '3':
11044
                case '4':
11045 160 khays
                  gas_assert (!mips_opts.micromips);
11046 16 khays
                  {
11047
                    const struct mips_immed *imm = mips_immed;
11048
 
11049
                    while (imm->type && imm->type != *args)
11050
                      ++imm;
11051
                    if (! imm->type)
11052
                      internalError ();
11053
                    my_getExpression (&imm_expr, s);
11054
                    check_absolute_expr (ip, &imm_expr);
11055
                    if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
11056
                      {
11057
                        as_warn (_("Illegal %s number (%lu, 0x%lx)"),
11058
                                 imm->desc ? imm->desc : ip->insn_mo->name,
11059
                                 (unsigned long) imm_expr.X_add_number,
11060
                                 (unsigned long) imm_expr.X_add_number);
11061
                        imm_expr.X_add_number &= imm->mask;
11062
                      }
11063
                    ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
11064
                                        << imm->shift);
11065
                    imm_expr.X_op = O_absent;
11066
                    s = expr_end;
11067
                  }
11068
                  continue;
11069
 
11070
                case 'A':               /* ins/ext position, becomes LSB.  */
11071
                  limlo = 0;
11072
                  limhi = 31;
11073
                  goto do_lsb;
11074
                case 'E':
11075
                  limlo = 32;
11076
                  limhi = 63;
11077
                  goto do_lsb;
11078
                do_lsb:
11079
                  my_getExpression (&imm_expr, s);
11080
                  check_absolute_expr (ip, &imm_expr);
11081
                  if ((unsigned long) imm_expr.X_add_number < limlo
11082
                      || (unsigned long) imm_expr.X_add_number > limhi)
11083
                    {
11084
                      as_bad (_("Improper position (%lu)"),
11085
                              (unsigned long) imm_expr.X_add_number);
11086
                      imm_expr.X_add_number = limlo;
11087
                    }
11088
                  lastpos = imm_expr.X_add_number;
11089 160 khays
                  INSERT_OPERAND (mips_opts.micromips,
11090
                                  EXTLSB, *ip, imm_expr.X_add_number);
11091 16 khays
                  imm_expr.X_op = O_absent;
11092
                  s = expr_end;
11093
                  continue;
11094
 
11095
                case 'B':               /* ins size, becomes MSB.  */
11096
                  limlo = 1;
11097
                  limhi = 32;
11098
                  goto do_msb;
11099
                case 'F':
11100
                  limlo = 33;
11101
                  limhi = 64;
11102
                  goto do_msb;
11103
                do_msb:
11104
                  my_getExpression (&imm_expr, s);
11105
                  check_absolute_expr (ip, &imm_expr);
11106
                  /* Check for negative input so that small negative numbers
11107
                     will not succeed incorrectly.  The checks against
11108
                     (pos+size) transitively check "size" itself,
11109
                     assuming that "pos" is reasonable.  */
11110
                  if ((long) imm_expr.X_add_number < 0
11111
                      || ((unsigned long) imm_expr.X_add_number
11112
                          + lastpos) < limlo
11113
                      || ((unsigned long) imm_expr.X_add_number
11114
                          + lastpos) > limhi)
11115
                    {
11116
                      as_bad (_("Improper insert size (%lu, position %lu)"),
11117
                              (unsigned long) imm_expr.X_add_number,
11118
                              (unsigned long) lastpos);
11119
                      imm_expr.X_add_number = limlo - lastpos;
11120
                    }
11121 160 khays
                  INSERT_OPERAND (mips_opts.micromips, INSMSB, *ip,
11122
                                  lastpos + imm_expr.X_add_number - 1);
11123 16 khays
                  imm_expr.X_op = O_absent;
11124
                  s = expr_end;
11125
                  continue;
11126
 
11127
                case 'C':               /* ext size, becomes MSBD.  */
11128
                  limlo = 1;
11129
                  limhi = 32;
11130
                  goto do_msbd;
11131
                case 'G':
11132
                  limlo = 33;
11133
                  limhi = 64;
11134
                  goto do_msbd;
11135
                case 'H':
11136
                  limlo = 33;
11137
                  limhi = 64;
11138
                  goto do_msbd;
11139
                do_msbd:
11140
                  my_getExpression (&imm_expr, s);
11141
                  check_absolute_expr (ip, &imm_expr);
11142
                  /* Check for negative input so that small negative numbers
11143
                     will not succeed incorrectly.  The checks against
11144
                     (pos+size) transitively check "size" itself,
11145
                     assuming that "pos" is reasonable.  */
11146
                  if ((long) imm_expr.X_add_number < 0
11147
                      || ((unsigned long) imm_expr.X_add_number
11148
                          + lastpos) < limlo
11149
                      || ((unsigned long) imm_expr.X_add_number
11150
                          + lastpos) > limhi)
11151
                    {
11152
                      as_bad (_("Improper extract size (%lu, position %lu)"),
11153
                              (unsigned long) imm_expr.X_add_number,
11154
                              (unsigned long) lastpos);
11155
                      imm_expr.X_add_number = limlo - lastpos;
11156
                    }
11157 160 khays
                  INSERT_OPERAND (mips_opts.micromips,
11158
                                  EXTMSBD, *ip, imm_expr.X_add_number - 1);
11159 16 khays
                  imm_expr.X_op = O_absent;
11160
                  s = expr_end;
11161
                  continue;
11162
 
11163
                case 'D':
11164
                  /* +D is for disassembly only; never match.  */
11165
                  break;
11166
 
11167
                case 'I':
11168
                  /* "+I" is like "I", except that imm2_expr is used.  */
11169
                  my_getExpression (&imm2_expr, s);
11170
                  if (imm2_expr.X_op != O_big
11171
                      && imm2_expr.X_op != O_constant)
11172
                  insn_error = _("absolute expression required");
11173
                  if (HAVE_32BIT_GPRS)
11174
                    normalize_constant_expr (&imm2_expr);
11175
                  s = expr_end;
11176
                  continue;
11177
 
11178
                case 'T': /* Coprocessor register.  */
11179 160 khays
                  gas_assert (!mips_opts.micromips);
11180 16 khays
                  /* +T is for disassembly only; never match.  */
11181
                  break;
11182
 
11183
                case 't': /* Coprocessor register number.  */
11184 160 khays
                  gas_assert (!mips_opts.micromips);
11185 16 khays
                  if (s[0] == '$' && ISDIGIT (s[1]))
11186
                    {
11187
                      ++s;
11188
                      regno = 0;
11189
                      do
11190
                        {
11191
                          regno *= 10;
11192
                          regno += *s - '0';
11193
                          ++s;
11194
                        }
11195
                      while (ISDIGIT (*s));
11196
                      if (regno > 31)
11197
                        as_bad (_("Invalid register number (%d)"), regno);
11198
                      else
11199
                        {
11200 160 khays
                          INSERT_OPERAND (0, RT, *ip, regno);
11201 16 khays
                          continue;
11202
                        }
11203
                    }
11204
                  else
11205
                    as_bad (_("Invalid coprocessor 0 register number"));
11206
                  break;
11207
 
11208
                case 'x':
11209
                  /* bbit[01] and bbit[01]32 bit index.  Give error if index
11210
                     is not in the valid range.  */
11211 160 khays
                  gas_assert (!mips_opts.micromips);
11212 16 khays
                  my_getExpression (&imm_expr, s);
11213
                  check_absolute_expr (ip, &imm_expr);
11214
                  if ((unsigned) imm_expr.X_add_number > 31)
11215
                    {
11216
                      as_bad (_("Improper bit index (%lu)"),
11217
                              (unsigned long) imm_expr.X_add_number);
11218
                      imm_expr.X_add_number = 0;
11219
                    }
11220 160 khays
                  INSERT_OPERAND (0, BBITIND, *ip, imm_expr.X_add_number);
11221 16 khays
                  imm_expr.X_op = O_absent;
11222
                  s = expr_end;
11223
                  continue;
11224
 
11225
                case 'X':
11226
                  /* bbit[01] bit index when bbit is used but we generate
11227
                     bbit[01]32 because the index is over 32.  Move to the
11228
                     next candidate if index is not in the valid range.  */
11229 160 khays
                  gas_assert (!mips_opts.micromips);
11230 16 khays
                  my_getExpression (&imm_expr, s);
11231
                  check_absolute_expr (ip, &imm_expr);
11232
                  if ((unsigned) imm_expr.X_add_number < 32
11233
                      || (unsigned) imm_expr.X_add_number > 63)
11234
                    break;
11235 160 khays
                  INSERT_OPERAND (0, BBITIND, *ip, imm_expr.X_add_number - 32);
11236 16 khays
                  imm_expr.X_op = O_absent;
11237
                  s = expr_end;
11238
                  continue;
11239
 
11240
                case 'p':
11241
                  /* cins, cins32, exts and exts32 position field.  Give error
11242
                     if it's not in the valid range.  */
11243 160 khays
                  gas_assert (!mips_opts.micromips);
11244 16 khays
                  my_getExpression (&imm_expr, s);
11245
                  check_absolute_expr (ip, &imm_expr);
11246
                  if ((unsigned) imm_expr.X_add_number > 31)
11247
                    {
11248
                      as_bad (_("Improper position (%lu)"),
11249
                              (unsigned long) imm_expr.X_add_number);
11250
                      imm_expr.X_add_number = 0;
11251
                    }
11252
                  /* Make the pos explicit to simplify +S.  */
11253
                  lastpos = imm_expr.X_add_number + 32;
11254 160 khays
                  INSERT_OPERAND (0, CINSPOS, *ip, imm_expr.X_add_number);
11255 16 khays
                  imm_expr.X_op = O_absent;
11256
                  s = expr_end;
11257
                  continue;
11258
 
11259
                case 'P':
11260
                  /* cins, cins32, exts and exts32 position field.  Move to
11261
                     the next candidate if it's not in the valid range.  */
11262 160 khays
                  gas_assert (!mips_opts.micromips);
11263 16 khays
                  my_getExpression (&imm_expr, s);
11264
                  check_absolute_expr (ip, &imm_expr);
11265
                  if ((unsigned) imm_expr.X_add_number < 32
11266
                      || (unsigned) imm_expr.X_add_number > 63)
11267
                    break;
11268
                  lastpos = imm_expr.X_add_number;
11269 160 khays
                  INSERT_OPERAND (0, CINSPOS, *ip, imm_expr.X_add_number - 32);
11270 16 khays
                  imm_expr.X_op = O_absent;
11271
                  s = expr_end;
11272
                  continue;
11273
 
11274
                case 's':
11275
                  /* cins and exts length-minus-one field.  */
11276 160 khays
                  gas_assert (!mips_opts.micromips);
11277 16 khays
                  my_getExpression (&imm_expr, s);
11278
                  check_absolute_expr (ip, &imm_expr);
11279
                  if ((unsigned long) imm_expr.X_add_number > 31)
11280
                    {
11281
                      as_bad (_("Improper size (%lu)"),
11282
                              (unsigned long) imm_expr.X_add_number);
11283
                      imm_expr.X_add_number = 0;
11284
                    }
11285 160 khays
                  INSERT_OPERAND (0, CINSLM1, *ip, imm_expr.X_add_number);
11286 16 khays
                  imm_expr.X_op = O_absent;
11287
                  s = expr_end;
11288
                  continue;
11289
 
11290
                case 'S':
11291
                  /* cins32/exts32 and cins/exts aliasing cint32/exts32
11292
                     length-minus-one field.  */
11293 160 khays
                  gas_assert (!mips_opts.micromips);
11294 16 khays
                  my_getExpression (&imm_expr, s);
11295
                  check_absolute_expr (ip, &imm_expr);
11296
                  if ((long) imm_expr.X_add_number < 0
11297
                      || (unsigned long) imm_expr.X_add_number + lastpos > 63)
11298
                    {
11299
                      as_bad (_("Improper size (%lu)"),
11300
                              (unsigned long) imm_expr.X_add_number);
11301
                      imm_expr.X_add_number = 0;
11302
                    }
11303 160 khays
                  INSERT_OPERAND (0, CINSLM1, *ip, imm_expr.X_add_number);
11304 16 khays
                  imm_expr.X_op = O_absent;
11305
                  s = expr_end;
11306
                  continue;
11307
 
11308
                case 'Q':
11309
                  /* seqi/snei immediate field.  */
11310 160 khays
                  gas_assert (!mips_opts.micromips);
11311 16 khays
                  my_getExpression (&imm_expr, s);
11312
                  check_absolute_expr (ip, &imm_expr);
11313
                  if ((long) imm_expr.X_add_number < -512
11314
                      || (long) imm_expr.X_add_number >= 512)
11315
                    {
11316
                      as_bad (_("Improper immediate (%ld)"),
11317
                               (long) imm_expr.X_add_number);
11318
                      imm_expr.X_add_number = 0;
11319
                    }
11320 160 khays
                  INSERT_OPERAND (0, SEQI, *ip, imm_expr.X_add_number);
11321 16 khays
                  imm_expr.X_op = O_absent;
11322
                  s = expr_end;
11323
                  continue;
11324
 
11325
                case 'a': /* 8-bit signed offset in bit 6 */
11326 160 khays
                  gas_assert (!mips_opts.micromips);
11327 16 khays
                  my_getExpression (&imm_expr, s);
11328
                  check_absolute_expr (ip, &imm_expr);
11329
                  min_range = -((OP_MASK_OFFSET_A + 1) >> 1);
11330
                  max_range = ((OP_MASK_OFFSET_A + 1) >> 1) - 1;
11331
                  if (imm_expr.X_add_number < min_range
11332
                      || imm_expr.X_add_number > max_range)
11333
                    {
11334
                      as_bad (_("Offset not in range %ld..%ld (%ld)"),
11335
                              (long) min_range, (long) max_range,
11336
                              (long) imm_expr.X_add_number);
11337
                    }
11338 160 khays
                  INSERT_OPERAND (0, OFFSET_A, *ip, imm_expr.X_add_number);
11339 16 khays
                  imm_expr.X_op = O_absent;
11340
                  s = expr_end;
11341
                  continue;
11342
 
11343
                case 'b': /* 8-bit signed offset in bit 3 */
11344 160 khays
                  gas_assert (!mips_opts.micromips);
11345 16 khays
                  my_getExpression (&imm_expr, s);
11346
                  check_absolute_expr (ip, &imm_expr);
11347
                  min_range = -((OP_MASK_OFFSET_B + 1) >> 1);
11348
                  max_range = ((OP_MASK_OFFSET_B + 1) >> 1) - 1;
11349
                  if (imm_expr.X_add_number < min_range
11350
                      || imm_expr.X_add_number > max_range)
11351
                    {
11352
                      as_bad (_("Offset not in range %ld..%ld (%ld)"),
11353
                              (long) min_range, (long) max_range,
11354
                              (long) imm_expr.X_add_number);
11355
                    }
11356 160 khays
                  INSERT_OPERAND (0, OFFSET_B, *ip, imm_expr.X_add_number);
11357 16 khays
                  imm_expr.X_op = O_absent;
11358
                  s = expr_end;
11359
                  continue;
11360
 
11361
                case 'c': /* 9-bit signed offset in bit 6 */
11362 160 khays
                  gas_assert (!mips_opts.micromips);
11363 16 khays
                  my_getExpression (&imm_expr, s);
11364
                  check_absolute_expr (ip, &imm_expr);
11365
                  min_range = -((OP_MASK_OFFSET_C + 1) >> 1);
11366
                  max_range = ((OP_MASK_OFFSET_C + 1) >> 1) - 1;
11367
                  /* We check the offset range before adjusted.  */
11368
                  min_range <<= 4;
11369
                  max_range <<= 4;
11370
                  if (imm_expr.X_add_number < min_range
11371
                      || imm_expr.X_add_number > max_range)
11372
                    {
11373
                      as_bad (_("Offset not in range %ld..%ld (%ld)"),
11374
                              (long) min_range, (long) max_range,
11375
                              (long) imm_expr.X_add_number);
11376
                    }
11377
                  if (imm_expr.X_add_number & 0xf)
11378
                    {
11379
                      as_bad (_("Offset not 16 bytes alignment (%ld)"),
11380
                              (long) imm_expr.X_add_number);
11381
                    }
11382
                  /* Right shift 4 bits to adjust the offset operand.  */
11383 160 khays
                  INSERT_OPERAND (0, OFFSET_C, *ip,
11384
                                  imm_expr.X_add_number >> 4);
11385 16 khays
                  imm_expr.X_op = O_absent;
11386
                  s = expr_end;
11387
                  continue;
11388
 
11389
                case 'z':
11390 160 khays
                  gas_assert (!mips_opts.micromips);
11391 16 khays
                  if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
11392
                    break;
11393
                  if (regno == AT && mips_opts.at)
11394
                    {
11395
                      if (mips_opts.at == ATREG)
11396
                        as_warn (_("used $at without \".set noat\""));
11397
                      else
11398
                        as_warn (_("used $%u with \".set at=$%u\""),
11399
                                 regno, mips_opts.at);
11400
                    }
11401 160 khays
                  INSERT_OPERAND (0, RZ, *ip, regno);
11402 16 khays
                  continue;
11403
 
11404
                case 'Z':
11405 160 khays
                  gas_assert (!mips_opts.micromips);
11406 16 khays
                  if (!reg_lookup (&s, RTYPE_FPU, &regno))
11407
                    break;
11408 160 khays
                  INSERT_OPERAND (0, FZ, *ip, regno);
11409 16 khays
                  continue;
11410
 
11411
                default:
11412 160 khays
                  as_bad (_("Internal error: bad %s opcode "
11413 16 khays
                            "(unknown extension operand type `+%c'): %s %s"),
11414 160 khays
                          mips_opts.micromips ? "microMIPS" : "MIPS",
11415 16 khays
                          *args, insn->name, insn->args);
11416
                  /* Further processing is fruitless.  */
11417
                  return;
11418
                }
11419
              break;
11420
 
11421 160 khays
            case '.':           /* 10-bit offset.  */
11422
              gas_assert (mips_opts.micromips);
11423
            case '~':           /* 12-bit offset.  */
11424
              {
11425
                int shift = *args == '.' ? 9 : 11;
11426
                size_t i;
11427
 
11428
                /* Check whether there is only a single bracketed expression
11429
                   left.  If so, it must be the base register and the
11430
                   constant must be zero.  */
11431
                if (*s == '(' && strchr (s + 1, '(') == 0)
11432
                  continue;
11433
 
11434
                /* If this value won't fit into the offset, then go find
11435
                   a macro that will generate a 16- or 32-bit offset code
11436
                   pattern.  */
11437
                i = my_getSmallExpression (&imm_expr, imm_reloc, s);
11438
                if ((i == 0 && (imm_expr.X_op != O_constant
11439
                                || imm_expr.X_add_number >= 1 << shift
11440
                                || imm_expr.X_add_number < -1 << shift))
11441
                    || i > 0)
11442
                  {
11443
                    imm_expr.X_op = O_absent;
11444
                    break;
11445
                  }
11446
                if (shift == 9)
11447
                  INSERT_OPERAND (1, OFFSET10, *ip, imm_expr.X_add_number);
11448
                else
11449
                  INSERT_OPERAND (mips_opts.micromips,
11450
                                  OFFSET12, *ip, imm_expr.X_add_number);
11451
                imm_expr.X_op = O_absent;
11452
                s = expr_end;
11453
              }
11454
              continue;
11455
 
11456 16 khays
            case '<':           /* must be at least one digit */
11457
              /*
11458
               * According to the manual, if the shift amount is greater
11459
               * than 31 or less than 0, then the shift amount should be
11460
               * mod 32.  In reality the mips assembler issues an error.
11461
               * We issue a warning and mask out all but the low 5 bits.
11462
               */
11463
              my_getExpression (&imm_expr, s);
11464
              check_absolute_expr (ip, &imm_expr);
11465
              if ((unsigned long) imm_expr.X_add_number > 31)
11466
                as_warn (_("Improper shift amount (%lu)"),
11467
                         (unsigned long) imm_expr.X_add_number);
11468 160 khays
              INSERT_OPERAND (mips_opts.micromips,
11469
                              SHAMT, *ip, imm_expr.X_add_number);
11470 16 khays
              imm_expr.X_op = O_absent;
11471
              s = expr_end;
11472
              continue;
11473
 
11474
            case '>':           /* shift amount minus 32 */
11475
              my_getExpression (&imm_expr, s);
11476
              check_absolute_expr (ip, &imm_expr);
11477
              if ((unsigned long) imm_expr.X_add_number < 32
11478
                  || (unsigned long) imm_expr.X_add_number > 63)
11479
                break;
11480 160 khays
              INSERT_OPERAND (mips_opts.micromips,
11481
                              SHAMT, *ip, imm_expr.X_add_number - 32);
11482 16 khays
              imm_expr.X_op = O_absent;
11483
              s = expr_end;
11484
              continue;
11485
 
11486
            case 'k':           /* CACHE code.  */
11487
            case 'h':           /* PREFX code.  */
11488
            case '1':           /* SYNC type.  */
11489
              my_getExpression (&imm_expr, s);
11490
              check_absolute_expr (ip, &imm_expr);
11491
              if ((unsigned long) imm_expr.X_add_number > 31)
11492
                as_warn (_("Invalid value for `%s' (%lu)"),
11493
                         ip->insn_mo->name,
11494
                         (unsigned long) imm_expr.X_add_number);
11495 160 khays
              switch (*args)
11496 16 khays
                {
11497 160 khays
                case 'k':
11498
                  if (mips_fix_cn63xxp1
11499
                      && !mips_opts.micromips
11500
                      && strcmp ("pref", insn->name) == 0)
11501 16 khays
                    switch (imm_expr.X_add_number)
11502
                      {
11503
                      case 5:
11504
                      case 25:
11505
                      case 26:
11506
                      case 27:
11507
                      case 28:
11508
                      case 29:
11509
                      case 30:
11510
                      case 31:  /* These are ok.  */
11511
                        break;
11512
 
11513
                      default:  /* The rest must be changed to 28.  */
11514
                        imm_expr.X_add_number = 28;
11515
                        break;
11516
                      }
11517 160 khays
                  INSERT_OPERAND (mips_opts.micromips,
11518
                                  CACHE, *ip, imm_expr.X_add_number);
11519
                  break;
11520
                case 'h':
11521
                  INSERT_OPERAND (mips_opts.micromips,
11522
                                  PREFX, *ip, imm_expr.X_add_number);
11523
                  break;
11524
                case '1':
11525
                  INSERT_OPERAND (mips_opts.micromips,
11526
                                  STYPE, *ip, imm_expr.X_add_number);
11527
                  break;
11528 16 khays
                }
11529
              imm_expr.X_op = O_absent;
11530
              s = expr_end;
11531
              continue;
11532
 
11533
            case 'c':           /* BREAK code.  */
11534 160 khays
              {
11535
                unsigned long mask = (mips_opts.micromips
11536
                                      ? MICROMIPSOP_MASK_CODE
11537
                                      : OP_MASK_CODE);
11538
 
11539
                my_getExpression (&imm_expr, s);
11540
                check_absolute_expr (ip, &imm_expr);
11541
                if ((unsigned long) imm_expr.X_add_number > mask)
11542
                  as_warn (_("Code for %s not in range 0..%lu (%lu)"),
11543
                           ip->insn_mo->name,
11544
                           mask, (unsigned long) imm_expr.X_add_number);
11545
                INSERT_OPERAND (mips_opts.micromips,
11546
                                CODE, *ip, imm_expr.X_add_number);
11547
                imm_expr.X_op = O_absent;
11548
                s = expr_end;
11549
              }
11550 16 khays
              continue;
11551
 
11552
            case 'q':           /* Lower BREAK code.  */
11553 160 khays
              {
11554
                unsigned long mask = (mips_opts.micromips
11555
                                      ? MICROMIPSOP_MASK_CODE2
11556
                                      : OP_MASK_CODE2);
11557
 
11558
                my_getExpression (&imm_expr, s);
11559
                check_absolute_expr (ip, &imm_expr);
11560
                if ((unsigned long) imm_expr.X_add_number > mask)
11561
                  as_warn (_("Lower code for %s not in range 0..%lu (%lu)"),
11562
                           ip->insn_mo->name,
11563
                           mask, (unsigned long) imm_expr.X_add_number);
11564
                INSERT_OPERAND (mips_opts.micromips,
11565
                                CODE2, *ip, imm_expr.X_add_number);
11566
                imm_expr.X_op = O_absent;
11567
                s = expr_end;
11568
              }
11569 16 khays
              continue;
11570
 
11571 160 khays
            case 'B':           /* 20- or 10-bit syscall/break/wait code.  */
11572
              {
11573
                unsigned long mask = (mips_opts.micromips
11574
                                      ? MICROMIPSOP_MASK_CODE10
11575
                                      : OP_MASK_CODE20);
11576
 
11577
                my_getExpression (&imm_expr, s);
11578
                check_absolute_expr (ip, &imm_expr);
11579
                if ((unsigned long) imm_expr.X_add_number > mask)
11580
                  as_warn (_("Code for %s not in range 0..%lu (%lu)"),
11581
                           ip->insn_mo->name,
11582
                           mask, (unsigned long) imm_expr.X_add_number);
11583
                if (mips_opts.micromips)
11584
                  INSERT_OPERAND (1, CODE10, *ip, imm_expr.X_add_number);
11585
                else
11586
                  INSERT_OPERAND (0, CODE20, *ip, imm_expr.X_add_number);
11587
                imm_expr.X_op = O_absent;
11588
                s = expr_end;
11589
              }
11590 16 khays
              continue;
11591
 
11592 160 khays
            case 'C':           /* 25- or 23-bit coprocessor code.  */
11593
              {
11594
                unsigned long mask = (mips_opts.micromips
11595
                                      ? MICROMIPSOP_MASK_COPZ
11596
                                      : OP_MASK_COPZ);
11597
 
11598
                my_getExpression (&imm_expr, s);
11599
                check_absolute_expr (ip, &imm_expr);
11600
                if ((unsigned long) imm_expr.X_add_number > mask)
11601
                  as_warn (_("Coproccesor code > %u bits (%lu)"),
11602
                           mips_opts.micromips ? 23U : 25U,
11603 16 khays
                           (unsigned long) imm_expr.X_add_number);
11604 160 khays
                INSERT_OPERAND (mips_opts.micromips,
11605
                                COPZ, *ip, imm_expr.X_add_number);
11606
                imm_expr.X_op = O_absent;
11607
                s = expr_end;
11608
              }
11609 16 khays
              continue;
11610
 
11611 160 khays
            case 'J':           /* 19-bit WAIT code.  */
11612
              gas_assert (!mips_opts.micromips);
11613 16 khays
              my_getExpression (&imm_expr, s);
11614
              check_absolute_expr (ip, &imm_expr);
11615
              if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
11616 160 khays
                {
11617
                  as_warn (_("Illegal 19-bit code (%lu)"),
11618 16 khays
                           (unsigned long) imm_expr.X_add_number);
11619 160 khays
                  imm_expr.X_add_number &= OP_MASK_CODE19;
11620
                }
11621
              INSERT_OPERAND (0, CODE19, *ip, imm_expr.X_add_number);
11622 16 khays
              imm_expr.X_op = O_absent;
11623
              s = expr_end;
11624
              continue;
11625
 
11626
            case 'P':           /* Performance register.  */
11627 160 khays
              gas_assert (!mips_opts.micromips);
11628 16 khays
              my_getExpression (&imm_expr, s);
11629
              check_absolute_expr (ip, &imm_expr);
11630
              if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
11631
                as_warn (_("Invalid performance register (%lu)"),
11632
                         (unsigned long) imm_expr.X_add_number);
11633 160 khays
              INSERT_OPERAND (0, PERFREG, *ip, imm_expr.X_add_number);
11634 16 khays
              imm_expr.X_op = O_absent;
11635
              s = expr_end;
11636
              continue;
11637
 
11638
            case 'G':           /* Coprocessor destination register.  */
11639 160 khays
              {
11640
                unsigned long opcode = ip->insn_opcode;
11641
                unsigned long mask;
11642
                unsigned int types;
11643
                int cop0;
11644 16 khays
 
11645 160 khays
                if (mips_opts.micromips)
11646
                  {
11647
                    mask = ~((MICROMIPSOP_MASK_RT << MICROMIPSOP_SH_RT)
11648
                             | (MICROMIPSOP_MASK_RS << MICROMIPSOP_SH_RS)
11649
                             | (MICROMIPSOP_MASK_SEL << MICROMIPSOP_SH_SEL));
11650
                    opcode &= mask;
11651
                    switch (opcode)
11652
                      {
11653
                      case 0x000000fc:                          /* mfc0  */
11654
                      case 0x000002fc:                          /* mtc0  */
11655
                      case 0x580000fc:                          /* dmfc0 */
11656
                      case 0x580002fc:                          /* dmtc0 */
11657
                        cop0 = 1;
11658
                        break;
11659
                      default:
11660
                        cop0 = 0;
11661
                        break;
11662
                      }
11663
                  }
11664
                else
11665
                  {
11666
                    opcode = (opcode >> OP_SH_OP) & OP_MASK_OP;
11667
                    cop0 = opcode == OP_OP_COP0;
11668
                  }
11669
                types = RTYPE_NUM | (cop0 ? RTYPE_CP0 : RTYPE_GP);
11670
                ok = reg_lookup (&s, types, &regno);
11671
                if (mips_opts.micromips)
11672
                  INSERT_OPERAND (1, RS, *ip, regno);
11673
                else
11674
                  INSERT_OPERAND (0, RD, *ip, regno);
11675
                if (ok)
11676
                  {
11677
                    lastregno = regno;
11678
                    continue;
11679
                  }
11680
              }
11681
              break;
11682
 
11683
            case 'y':           /* ALNV.PS source register.  */
11684
              gas_assert (mips_opts.micromips);
11685
              goto do_reg;
11686
            case 'x':           /* Ignore register name.  */
11687
            case 'U':           /* Destination register (CLO/CLZ).  */
11688
            case 'g':           /* Coprocessor destination register.  */
11689
              gas_assert (!mips_opts.micromips);
11690 16 khays
            case 'b':           /* Base register.  */
11691
            case 'd':           /* Destination register.  */
11692
            case 's':           /* Source register.  */
11693
            case 't':           /* Target register.  */
11694
            case 'r':           /* Both target and source.  */
11695
            case 'v':           /* Both dest and source.  */
11696
            case 'w':           /* Both dest and target.  */
11697
            case 'E':           /* Coprocessor target register.  */
11698
            case 'K':           /* RDHWR destination register.  */
11699
            case 'z':           /* Must be zero register.  */
11700 160 khays
            do_reg:
11701 16 khays
              s_reset = s;
11702
              if (*args == 'E' || *args == 'K')
11703
                ok = reg_lookup (&s, RTYPE_NUM, &regno);
11704
              else
11705
                {
11706
                  ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
11707
                  if (regno == AT && mips_opts.at)
11708
                    {
11709
                      if (mips_opts.at == ATREG)
11710
                        as_warn (_("Used $at without \".set noat\""));
11711
                      else
11712
                        as_warn (_("Used $%u with \".set at=$%u\""),
11713
                                 regno, mips_opts.at);
11714
                    }
11715
                }
11716
              if (ok)
11717
                {
11718
                  c = *args;
11719
                  if (*s == ' ')
11720
                    ++s;
11721
                  if (args[1] != *s)
11722
                    {
11723
                      if (c == 'r' || c == 'v' || c == 'w')
11724
                        {
11725
                          regno = lastregno;
11726
                          s = s_reset;
11727
                          ++args;
11728
                        }
11729
                    }
11730
                  /* 'z' only matches $0.  */
11731
                  if (c == 'z' && regno != 0)
11732
                    break;
11733
 
11734
                  if (c == 's' && !strncmp (ip->insn_mo->name, "jalr", 4))
11735
                    {
11736
                      if (regno == lastregno)
11737
                        {
11738
                          insn_error
11739
                            = _("Source and destination must be different");
11740
                          continue;
11741
                        }
11742
                      if (regno == 31 && lastregno == 0xffffffff)
11743
                        {
11744
                          insn_error
11745
                            = _("A destination register must be supplied");
11746
                          continue;
11747
                        }
11748
                    }
11749
                  /* Now that we have assembled one operand, we use the args
11750
                     string to figure out where it goes in the instruction.  */
11751
                  switch (c)
11752
                    {
11753
                    case 'r':
11754
                    case 's':
11755
                    case 'v':
11756
                    case 'b':
11757 160 khays
                      INSERT_OPERAND (mips_opts.micromips, RS, *ip, regno);
11758 16 khays
                      break;
11759 160 khays
 
11760
                    case 'K':
11761
                      if (mips_opts.micromips)
11762
                        INSERT_OPERAND (1, RS, *ip, regno);
11763
                      else
11764
                        INSERT_OPERAND (0, RD, *ip, regno);
11765
                      break;
11766
 
11767 16 khays
                    case 'd':
11768
                    case 'g':
11769 160 khays
                      INSERT_OPERAND (mips_opts.micromips, RD, *ip, regno);
11770 16 khays
                      break;
11771 160 khays
 
11772 16 khays
                    case 'U':
11773 160 khays
                      gas_assert (!mips_opts.micromips);
11774
                      INSERT_OPERAND (0, RD, *ip, regno);
11775
                      INSERT_OPERAND (0, RT, *ip, regno);
11776 16 khays
                      break;
11777 160 khays
 
11778 16 khays
                    case 'w':
11779
                    case 't':
11780
                    case 'E':
11781 160 khays
                      INSERT_OPERAND (mips_opts.micromips, RT, *ip, regno);
11782 16 khays
                      break;
11783 160 khays
 
11784
                    case 'y':
11785
                      gas_assert (mips_opts.micromips);
11786
                      INSERT_OPERAND (1, RS3, *ip, regno);
11787
                      break;
11788
 
11789 16 khays
                    case 'x':
11790
                      /* This case exists because on the r3000 trunc
11791
                         expands into a macro which requires a gp
11792
                         register.  On the r6000 or r4000 it is
11793
                         assembled into a single instruction which
11794
                         ignores the register.  Thus the insn version
11795
                         is MIPS_ISA2 and uses 'x', and the macro
11796
                         version is MIPS_ISA1 and uses 't'.  */
11797
                      break;
11798 160 khays
 
11799 16 khays
                    case 'z':
11800
                      /* This case is for the div instruction, which
11801
                         acts differently if the destination argument
11802
                         is $0.  This only matches $0, and is checked
11803
                         outside the switch.  */
11804
                      break;
11805
                    }
11806
                  lastregno = regno;
11807
                  continue;
11808
                }
11809
              switch (*args++)
11810
                {
11811
                case 'r':
11812
                case 'v':
11813 160 khays
                  INSERT_OPERAND (mips_opts.micromips, RS, *ip, lastregno);
11814 16 khays
                  continue;
11815 160 khays
 
11816 16 khays
                case 'w':
11817 160 khays
                  INSERT_OPERAND (mips_opts.micromips, RT, *ip, lastregno);
11818 16 khays
                  continue;
11819
                }
11820
              break;
11821
 
11822
            case 'O':           /* MDMX alignment immediate constant.  */
11823 160 khays
              gas_assert (!mips_opts.micromips);
11824 16 khays
              my_getExpression (&imm_expr, s);
11825
              check_absolute_expr (ip, &imm_expr);
11826
              if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
11827
                as_warn (_("Improper align amount (%ld), using low bits"),
11828
                         (long) imm_expr.X_add_number);
11829 160 khays
              INSERT_OPERAND (0, ALN, *ip, imm_expr.X_add_number);
11830 16 khays
              imm_expr.X_op = O_absent;
11831
              s = expr_end;
11832
              continue;
11833
 
11834
            case 'Q':           /* MDMX vector, element sel, or const.  */
11835
              if (s[0] != '$')
11836
                {
11837
                  /* MDMX Immediate.  */
11838 160 khays
                  gas_assert (!mips_opts.micromips);
11839 16 khays
                  my_getExpression (&imm_expr, s);
11840
                  check_absolute_expr (ip, &imm_expr);
11841
                  if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
11842
                    as_warn (_("Invalid MDMX Immediate (%ld)"),
11843
                             (long) imm_expr.X_add_number);
11844 160 khays
                  INSERT_OPERAND (0, FT, *ip, imm_expr.X_add_number);
11845 16 khays
                  if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
11846
                    ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
11847
                  else
11848
                    ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
11849
                  imm_expr.X_op = O_absent;
11850
                  s = expr_end;
11851
                  continue;
11852
                }
11853
              /* Not MDMX Immediate.  Fall through.  */
11854
            case 'X':           /* MDMX destination register.  */
11855
            case 'Y':           /* MDMX source register.  */
11856
            case 'Z':           /* MDMX target register.  */
11857
              is_mdmx = 1;
11858 160 khays
            case 'W':
11859
              gas_assert (!mips_opts.micromips);
11860 16 khays
            case 'D':           /* Floating point destination register.  */
11861
            case 'S':           /* Floating point source register.  */
11862
            case 'T':           /* Floating point target register.  */
11863
            case 'R':           /* Floating point source register.  */
11864
            case 'V':
11865
              rtype = RTYPE_FPU;
11866
              if (is_mdmx
11867
                  || (mips_opts.ase_mdmx
11868
                      && (ip->insn_mo->pinfo & FP_D)
11869
                      && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
11870
                                                | INSN_COPROC_MEMORY_DELAY
11871
                                                | INSN_LOAD_COPROC_DELAY
11872
                                                | INSN_LOAD_MEMORY_DELAY
11873
                                                | INSN_STORE_MEMORY))))
11874
                rtype |= RTYPE_VEC;
11875
              s_reset = s;
11876
              if (reg_lookup (&s, rtype, &regno))
11877
                {
11878
                  if ((regno & 1) != 0
11879
                      && HAVE_32BIT_FPRS
11880
                      && !mips_oddfpreg_ok (ip->insn_mo, argnum))
11881
                    as_warn (_("Float register should be even, was %d"),
11882
                             regno);
11883
 
11884
                  c = *args;
11885
                  if (*s == ' ')
11886
                    ++s;
11887
                  if (args[1] != *s)
11888
                    {
11889
                      if (c == 'V' || c == 'W')
11890
                        {
11891
                          regno = lastregno;
11892
                          s = s_reset;
11893
                          ++args;
11894
                        }
11895
                    }
11896
                  switch (c)
11897
                    {
11898
                    case 'D':
11899
                    case 'X':
11900 160 khays
                      INSERT_OPERAND (mips_opts.micromips, FD, *ip, regno);
11901 16 khays
                      break;
11902 160 khays
 
11903 16 khays
                    case 'V':
11904
                    case 'S':
11905
                    case 'Y':
11906 160 khays
                      INSERT_OPERAND (mips_opts.micromips, FS, *ip, regno);
11907 16 khays
                      break;
11908 160 khays
 
11909 16 khays
                    case 'Q':
11910
                      /* This is like 'Z', but also needs to fix the MDMX
11911
                         vector/scalar select bits.  Note that the
11912
                         scalar immediate case is handled above.  */
11913
                      if (*s == '[')
11914
                        {
11915
                          int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
11916
                          int max_el = (is_qh ? 3 : 7);
11917
                          s++;
11918
                          my_getExpression(&imm_expr, s);
11919
                          check_absolute_expr (ip, &imm_expr);
11920
                          s = expr_end;
11921
                          if (imm_expr.X_add_number > max_el)
11922
                            as_bad (_("Bad element selector %ld"),
11923
                                    (long) imm_expr.X_add_number);
11924
                          imm_expr.X_add_number &= max_el;
11925
                          ip->insn_opcode |= (imm_expr.X_add_number
11926
                                              << (OP_SH_VSEL +
11927
                                                  (is_qh ? 2 : 1)));
11928
                          imm_expr.X_op = O_absent;
11929
                          if (*s != ']')
11930
                            as_warn (_("Expecting ']' found '%s'"), s);
11931
                          else
11932
                            s++;
11933
                        }
11934
                      else
11935
                        {
11936
                          if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
11937
                            ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
11938
                                                << OP_SH_VSEL);
11939
                          else
11940
                            ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
11941
                                                OP_SH_VSEL);
11942
                        }
11943
                      /* Fall through.  */
11944
                    case 'W':
11945
                    case 'T':
11946
                    case 'Z':
11947 160 khays
                      INSERT_OPERAND (mips_opts.micromips, FT, *ip, regno);
11948 16 khays
                      break;
11949 160 khays
 
11950 16 khays
                    case 'R':
11951 160 khays
                      INSERT_OPERAND (mips_opts.micromips, FR, *ip, regno);
11952 16 khays
                      break;
11953
                    }
11954
                  lastregno = regno;
11955
                  continue;
11956
                }
11957
 
11958
              switch (*args++)
11959
                {
11960
                case 'V':
11961 160 khays
                  INSERT_OPERAND (mips_opts.micromips, FS, *ip, lastregno);
11962 16 khays
                  continue;
11963 160 khays
 
11964 16 khays
                case 'W':
11965 160 khays
                  INSERT_OPERAND (mips_opts.micromips, FT, *ip, lastregno);
11966 16 khays
                  continue;
11967
                }
11968
              break;
11969
 
11970
            case 'I':
11971
              my_getExpression (&imm_expr, s);
11972
              if (imm_expr.X_op != O_big
11973
                  && imm_expr.X_op != O_constant)
11974
                insn_error = _("absolute expression required");
11975
              if (HAVE_32BIT_GPRS)
11976
                normalize_constant_expr (&imm_expr);
11977
              s = expr_end;
11978
              continue;
11979
 
11980
            case 'A':
11981
              my_getExpression (&offset_expr, s);
11982
              normalize_address_expr (&offset_expr);
11983
              *imm_reloc = BFD_RELOC_32;
11984
              s = expr_end;
11985
              continue;
11986
 
11987
            case 'F':
11988
            case 'L':
11989
            case 'f':
11990
            case 'l':
11991
              {
11992
                int f64;
11993
                int using_gprs;
11994
                char *save_in;
11995
                char *err;
11996
                unsigned char temp[8];
11997
                int len;
11998
                unsigned int length;
11999
                segT seg;
12000
                subsegT subseg;
12001
                char *p;
12002
 
12003
                /* These only appear as the last operand in an
12004
                   instruction, and every instruction that accepts
12005
                   them in any variant accepts them in all variants.
12006
                   This means we don't have to worry about backing out
12007
                   any changes if the instruction does not match.
12008
 
12009
                   The difference between them is the size of the
12010
                   floating point constant and where it goes.  For 'F'
12011
                   and 'L' the constant is 64 bits; for 'f' and 'l' it
12012
                   is 32 bits.  Where the constant is placed is based
12013
                   on how the MIPS assembler does things:
12014
                    F -- .rdata
12015
                    L -- .lit8
12016
                    f -- immediate value
12017
                    l -- .lit4
12018
 
12019
                    The .lit4 and .lit8 sections are only used if
12020
                    permitted by the -G argument.
12021
 
12022
                    The code below needs to know whether the target register
12023
                    is 32 or 64 bits wide.  It relies on the fact 'f' and
12024
                    'F' are used with GPR-based instructions and 'l' and
12025
                    'L' are used with FPR-based instructions.  */
12026
 
12027
                f64 = *args == 'F' || *args == 'L';
12028
                using_gprs = *args == 'F' || *args == 'f';
12029
 
12030
                save_in = input_line_pointer;
12031
                input_line_pointer = s;
12032
                err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
12033
                length = len;
12034
                s = input_line_pointer;
12035
                input_line_pointer = save_in;
12036
                if (err != NULL && *err != '\0')
12037
                  {
12038
                    as_bad (_("Bad floating point constant: %s"), err);
12039
                    memset (temp, '\0', sizeof temp);
12040
                    length = f64 ? 8 : 4;
12041
                  }
12042
 
12043
                gas_assert (length == (unsigned) (f64 ? 8 : 4));
12044
 
12045
                if (*args == 'f'
12046
                    || (*args == 'l'
12047
                        && (g_switch_value < 4
12048
                            || (temp[0] == 0 && temp[1] == 0)
12049
                            || (temp[2] == 0 && temp[3] == 0))))
12050
                  {
12051
                    imm_expr.X_op = O_constant;
12052
                    if (!target_big_endian)
12053
                      imm_expr.X_add_number = bfd_getl32 (temp);
12054
                    else
12055
                      imm_expr.X_add_number = bfd_getb32 (temp);
12056
                  }
12057
                else if (length > 4
12058
                         && !mips_disable_float_construction
12059
                         /* Constants can only be constructed in GPRs and
12060
                            copied to FPRs if the GPRs are at least as wide
12061
                            as the FPRs.  Force the constant into memory if
12062
                            we are using 64-bit FPRs but the GPRs are only
12063
                            32 bits wide.  */
12064
                         && (using_gprs
12065
                             || !(HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
12066
                         && ((temp[0] == 0 && temp[1] == 0)
12067
                             || (temp[2] == 0 && temp[3] == 0))
12068
                         && ((temp[4] == 0 && temp[5] == 0)
12069
                             || (temp[6] == 0 && temp[7] == 0)))
12070
                  {
12071
                    /* The value is simple enough to load with a couple of
12072
                       instructions.  If using 32-bit registers, set
12073
                       imm_expr to the high order 32 bits and offset_expr to
12074
                       the low order 32 bits.  Otherwise, set imm_expr to
12075
                       the entire 64 bit constant.  */
12076
                    if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
12077
                      {
12078
                        imm_expr.X_op = O_constant;
12079
                        offset_expr.X_op = O_constant;
12080
                        if (!target_big_endian)
12081
                          {
12082
                            imm_expr.X_add_number = bfd_getl32 (temp + 4);
12083
                            offset_expr.X_add_number = bfd_getl32 (temp);
12084
                          }
12085
                        else
12086
                          {
12087
                            imm_expr.X_add_number = bfd_getb32 (temp);
12088
                            offset_expr.X_add_number = bfd_getb32 (temp + 4);
12089
                          }
12090
                        if (offset_expr.X_add_number == 0)
12091
                          offset_expr.X_op = O_absent;
12092
                      }
12093
                    else if (sizeof (imm_expr.X_add_number) > 4)
12094
                      {
12095
                        imm_expr.X_op = O_constant;
12096
                        if (!target_big_endian)
12097
                          imm_expr.X_add_number = bfd_getl64 (temp);
12098
                        else
12099
                          imm_expr.X_add_number = bfd_getb64 (temp);
12100
                      }
12101
                    else
12102
                      {
12103
                        imm_expr.X_op = O_big;
12104
                        imm_expr.X_add_number = 4;
12105
                        if (!target_big_endian)
12106
                          {
12107
                            generic_bignum[0] = bfd_getl16 (temp);
12108
                            generic_bignum[1] = bfd_getl16 (temp + 2);
12109
                            generic_bignum[2] = bfd_getl16 (temp + 4);
12110
                            generic_bignum[3] = bfd_getl16 (temp + 6);
12111
                          }
12112
                        else
12113
                          {
12114
                            generic_bignum[0] = bfd_getb16 (temp + 6);
12115
                            generic_bignum[1] = bfd_getb16 (temp + 4);
12116
                            generic_bignum[2] = bfd_getb16 (temp + 2);
12117
                            generic_bignum[3] = bfd_getb16 (temp);
12118
                          }
12119
                      }
12120
                  }
12121
                else
12122
                  {
12123
                    const char *newname;
12124
                    segT new_seg;
12125
 
12126
                    /* Switch to the right section.  */
12127
                    seg = now_seg;
12128
                    subseg = now_subseg;
12129
                    switch (*args)
12130
                      {
12131
                      default: /* unused default case avoids warnings.  */
12132
                      case 'L':
12133
                        newname = RDATA_SECTION_NAME;
12134
                        if (g_switch_value >= 8)
12135
                          newname = ".lit8";
12136
                        break;
12137
                      case 'F':
12138
                        newname = RDATA_SECTION_NAME;
12139
                        break;
12140
                      case 'l':
12141
                        gas_assert (g_switch_value >= 4);
12142
                        newname = ".lit4";
12143
                        break;
12144
                      }
12145
                    new_seg = subseg_new (newname, (subsegT) 0);
12146
                    if (IS_ELF)
12147
                      bfd_set_section_flags (stdoutput, new_seg,
12148
                                             (SEC_ALLOC
12149
                                              | SEC_LOAD
12150
                                              | SEC_READONLY
12151
                                              | SEC_DATA));
12152
                    frag_align (*args == 'l' ? 2 : 3, 0, 0);
12153
                    if (IS_ELF && strncmp (TARGET_OS, "elf", 3) != 0)
12154
                      record_alignment (new_seg, 4);
12155
                    else
12156
                      record_alignment (new_seg, *args == 'l' ? 2 : 3);
12157
                    if (seg == now_seg)
12158
                      as_bad (_("Can't use floating point insn in this section"));
12159
 
12160
                    /* Set the argument to the current address in the
12161
                       section.  */
12162
                    offset_expr.X_op = O_symbol;
12163
                    offset_expr.X_add_symbol = symbol_temp_new_now ();
12164
                    offset_expr.X_add_number = 0;
12165
 
12166
                    /* Put the floating point number into the section.  */
12167
                    p = frag_more ((int) length);
12168
                    memcpy (p, temp, length);
12169
 
12170
                    /* Switch back to the original section.  */
12171
                    subseg_set (seg, subseg);
12172
                  }
12173
              }
12174
              continue;
12175
 
12176
            case 'i':           /* 16-bit unsigned immediate.  */
12177
            case 'j':           /* 16-bit signed immediate.  */
12178
              *imm_reloc = BFD_RELOC_LO16;
12179
              if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
12180
                {
12181
                  int more;
12182
                  offsetT minval, maxval;
12183
 
12184 160 khays
                  more = (insn + 1 < past
12185 16 khays
                          && strcmp (insn->name, insn[1].name) == 0);
12186
 
12187
                  /* If the expression was written as an unsigned number,
12188
                     only treat it as signed if there are no more
12189
                     alternatives.  */
12190
                  if (more
12191
                      && *args == 'j'
12192
                      && sizeof (imm_expr.X_add_number) <= 4
12193
                      && imm_expr.X_op == O_constant
12194
                      && imm_expr.X_add_number < 0
12195
                      && imm_expr.X_unsigned
12196
                      && HAVE_64BIT_GPRS)
12197
                    break;
12198
 
12199
                  /* For compatibility with older assemblers, we accept
12200
                     0x8000-0xffff as signed 16-bit numbers when only
12201
                     signed numbers are allowed.  */
12202
                  if (*args == 'i')
12203
                    minval = 0, maxval = 0xffff;
12204
                  else if (more)
12205
                    minval = -0x8000, maxval = 0x7fff;
12206
                  else
12207
                    minval = -0x8000, maxval = 0xffff;
12208
 
12209
                  if (imm_expr.X_op != O_constant
12210
                      || imm_expr.X_add_number < minval
12211
                      || imm_expr.X_add_number > maxval)
12212
                    {
12213
                      if (more)
12214
                        break;
12215
                      if (imm_expr.X_op == O_constant
12216
                          || imm_expr.X_op == O_big)
12217
                        as_bad (_("Expression out of range"));
12218
                    }
12219
                }
12220
              s = expr_end;
12221
              continue;
12222
 
12223
            case 'o':           /* 16-bit offset.  */
12224
              offset_reloc[0] = BFD_RELOC_LO16;
12225
              offset_reloc[1] = BFD_RELOC_UNUSED;
12226
              offset_reloc[2] = BFD_RELOC_UNUSED;
12227
 
12228
              /* Check whether there is only a single bracketed expression
12229
                 left.  If so, it must be the base register and the
12230
                 constant must be zero.  */
12231
              if (*s == '(' && strchr (s + 1, '(') == 0)
12232
                {
12233
                  offset_expr.X_op = O_constant;
12234
                  offset_expr.X_add_number = 0;
12235
                  continue;
12236
                }
12237
 
12238
              /* If this value won't fit into a 16 bit offset, then go
12239
                 find a macro that will generate the 32 bit offset
12240
                 code pattern.  */
12241
              if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
12242
                  && (offset_expr.X_op != O_constant
12243
                      || offset_expr.X_add_number >= 0x8000
12244
                      || offset_expr.X_add_number < -0x8000))
12245
                break;
12246
 
12247
              s = expr_end;
12248
              continue;
12249
 
12250
            case 'p':           /* PC-relative offset.  */
12251
              *offset_reloc = BFD_RELOC_16_PCREL_S2;
12252
              my_getExpression (&offset_expr, s);
12253
              s = expr_end;
12254
              continue;
12255
 
12256
            case 'u':           /* Upper 16 bits.  */
12257
              if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
12258
                  && imm_expr.X_op == O_constant
12259
                  && (imm_expr.X_add_number < 0
12260
                      || imm_expr.X_add_number >= 0x10000))
12261
                as_bad (_("lui expression (%lu) not in range 0..65535"),
12262
                        (unsigned long) imm_expr.X_add_number);
12263
              s = expr_end;
12264
              continue;
12265
 
12266
            case 'a':           /* 26-bit address.  */
12267 160 khays
              *offset_reloc = BFD_RELOC_MIPS_JMP;
12268 16 khays
              my_getExpression (&offset_expr, s);
12269
              s = expr_end;
12270
              continue;
12271
 
12272
            case 'N':           /* 3-bit branch condition code.  */
12273
            case 'M':           /* 3-bit compare condition code.  */
12274
              rtype = RTYPE_CCC;
12275
              if (ip->insn_mo->pinfo & (FP_D | FP_S))
12276
                rtype |= RTYPE_FCC;
12277
              if (!reg_lookup (&s, rtype, &regno))
12278
                break;
12279
              if ((strcmp (str + strlen (str) - 3, ".ps") == 0
12280
                   || strcmp (str + strlen (str) - 5, "any2f") == 0
12281
                   || strcmp (str + strlen (str) - 5, "any2t") == 0)
12282
                  && (regno & 1) != 0)
12283
                as_warn (_("Condition code register should be even for %s, "
12284
                           "was %d"),
12285
                         str, regno);
12286
              if ((strcmp (str + strlen (str) - 5, "any4f") == 0
12287
                   || strcmp (str + strlen (str) - 5, "any4t") == 0)
12288
                  && (regno & 3) != 0)
12289
                as_warn (_("Condition code register should be 0 or 4 for %s, "
12290
                           "was %d"),
12291
                         str, regno);
12292
              if (*args == 'N')
12293 160 khays
                INSERT_OPERAND (mips_opts.micromips, BCC, *ip, regno);
12294 16 khays
              else
12295 160 khays
                INSERT_OPERAND (mips_opts.micromips, CCC, *ip, regno);
12296 16 khays
              continue;
12297
 
12298
            case 'H':
12299
              if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
12300
                s += 2;
12301
              if (ISDIGIT (*s))
12302
                {
12303
                  c = 0;
12304
                  do
12305
                    {
12306
                      c *= 10;
12307
                      c += *s - '0';
12308
                      ++s;
12309
                    }
12310
                  while (ISDIGIT (*s));
12311
                }
12312
              else
12313
                c = 8; /* Invalid sel value.  */
12314
 
12315
              if (c > 7)
12316
                as_bad (_("Invalid coprocessor sub-selection value (0-7)"));
12317 160 khays
              INSERT_OPERAND (mips_opts.micromips, SEL, *ip, c);
12318 16 khays
              continue;
12319
 
12320
            case 'e':
12321 160 khays
              gas_assert (!mips_opts.micromips);
12322 16 khays
              /* Must be at least one digit.  */
12323
              my_getExpression (&imm_expr, s);
12324
              check_absolute_expr (ip, &imm_expr);
12325
 
12326
              if ((unsigned long) imm_expr.X_add_number
12327
                  > (unsigned long) OP_MASK_VECBYTE)
12328
                {
12329
                  as_bad (_("bad byte vector index (%ld)"),
12330
                           (long) imm_expr.X_add_number);
12331
                  imm_expr.X_add_number = 0;
12332
                }
12333
 
12334 160 khays
              INSERT_OPERAND (0, VECBYTE, *ip, imm_expr.X_add_number);
12335 16 khays
              imm_expr.X_op = O_absent;
12336
              s = expr_end;
12337
              continue;
12338
 
12339
            case '%':
12340 160 khays
              gas_assert (!mips_opts.micromips);
12341 16 khays
              my_getExpression (&imm_expr, s);
12342
              check_absolute_expr (ip, &imm_expr);
12343
 
12344
              if ((unsigned long) imm_expr.X_add_number
12345
                  > (unsigned long) OP_MASK_VECALIGN)
12346
                {
12347
                  as_bad (_("bad byte vector index (%ld)"),
12348
                           (long) imm_expr.X_add_number);
12349
                  imm_expr.X_add_number = 0;
12350
                }
12351
 
12352 160 khays
              INSERT_OPERAND (0, VECALIGN, *ip, imm_expr.X_add_number);
12353 16 khays
              imm_expr.X_op = O_absent;
12354
              s = expr_end;
12355
              continue;
12356
 
12357 160 khays
            case 'm':           /* Opcode extension character.  */
12358
              gas_assert (mips_opts.micromips);
12359
              c = *++args;
12360
              switch (c)
12361
                {
12362
                case 'r':
12363
                  if (strncmp (s, "$pc", 3) == 0)
12364
                    {
12365
                      s += 3;
12366
                      continue;
12367
                    }
12368
                  break;
12369
 
12370
                case 'a':
12371
                case 'b':
12372
                case 'c':
12373
                case 'd':
12374
                case 'e':
12375
                case 'f':
12376
                case 'g':
12377
                case 'h':
12378
                case 'i':
12379
                case 'j':
12380
                case 'l':
12381
                case 'm':
12382
                case 'n':
12383
                case 'p':
12384
                case 'q':
12385
                case 's':
12386
                case 't':
12387
                case 'x':
12388
                case 'y':
12389
                case 'z':
12390
                  s_reset = s;
12391
                  ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
12392
                  if (regno == AT && mips_opts.at)
12393
                    {
12394
                      if (mips_opts.at == ATREG)
12395
                        as_warn (_("Used $at without \".set noat\""));
12396
                      else
12397
                        as_warn (_("Used $%u with \".set at=$%u\""),
12398
                                 regno, mips_opts.at);
12399
                    }
12400
                  if (!ok)
12401
                    {
12402
                      if (c == 'c')
12403
                        {
12404
                          gas_assert (args[1] == ',');
12405
                          regno = lastregno;
12406
                          ++args;
12407
                        }
12408
                      else if (c == 't')
12409
                        {
12410
                          gas_assert (args[1] == ',');
12411
                          ++args;
12412
                          continue;                     /* Nothing to do.  */
12413
                        }
12414
                      else
12415
                        break;
12416
                    }
12417
 
12418
                  if (c == 'j' && !strncmp (ip->insn_mo->name, "jalr", 4))
12419
                    {
12420
                      if (regno == lastregno)
12421
                        {
12422
                          insn_error
12423
                            = _("Source and destination must be different");
12424
                          continue;
12425
                        }
12426
                      if (regno == 31 && lastregno == 0xffffffff)
12427
                        {
12428
                          insn_error
12429
                            = _("A destination register must be supplied");
12430
                          continue;
12431
                        }
12432
                    }
12433
 
12434
                  if (*s == ' ')
12435
                    ++s;
12436
                  if (args[1] != *s)
12437
                    {
12438
                      if (c == 'e')
12439
                        {
12440
                          gas_assert (args[1] == ',');
12441
                          regno = lastregno;
12442
                          s = s_reset;
12443
                          ++args;
12444
                        }
12445
                      else if (c == 't')
12446
                        {
12447
                          gas_assert (args[1] == ',');
12448
                          s = s_reset;
12449
                          ++args;
12450
                          continue;                     /* Nothing to do.  */
12451
                        }
12452
                    }
12453
 
12454
                  /* Make sure regno is the same as lastregno.  */
12455
                  if (c == 't' && regno != lastregno)
12456
                    break;
12457
 
12458
                  /* Make sure regno is the same as destregno.  */
12459
                  if (c == 'x' && regno != destregno)
12460
                    break;
12461
 
12462
                  /* We need to save regno, before regno maps to the
12463
                     microMIPS register encoding.  */
12464
                  lastregno = regno;
12465
 
12466
                  if (c == 'f')
12467
                    destregno = regno;
12468
 
12469
                  switch (c)
12470
                    {
12471
                      case 'a':
12472
                        if (regno != GP)
12473
                          regno = ILLEGAL_REG;
12474
                        break;
12475
 
12476
                      case 'b':
12477
                        regno = mips32_to_micromips_reg_b_map[regno];
12478
                        break;
12479
 
12480
                      case 'c':
12481
                        regno = mips32_to_micromips_reg_c_map[regno];
12482
                        break;
12483
 
12484
                      case 'd':
12485
                        regno = mips32_to_micromips_reg_d_map[regno];
12486
                        break;
12487
 
12488
                      case 'e':
12489
                        regno = mips32_to_micromips_reg_e_map[regno];
12490
                        break;
12491
 
12492
                      case 'f':
12493
                        regno = mips32_to_micromips_reg_f_map[regno];
12494
                        break;
12495
 
12496
                      case 'g':
12497
                        regno = mips32_to_micromips_reg_g_map[regno];
12498
                        break;
12499
 
12500
                      case 'h':
12501
                        regno = mips32_to_micromips_reg_h_map[regno];
12502
                        break;
12503
 
12504
                      case 'i':
12505
                        switch (EXTRACT_OPERAND (1, MI, *ip))
12506
                          {
12507
                            case 4:
12508
                              if (regno == 21)
12509
                                regno = 3;
12510
                              else if (regno == 22)
12511
                                regno = 4;
12512
                              else if (regno == 5)
12513
                                regno = 5;
12514
                              else if (regno == 6)
12515
                                regno = 6;
12516
                              else if (regno == 7)
12517
                                regno = 7;
12518
                              else
12519
                                regno = ILLEGAL_REG;
12520
                              break;
12521
 
12522
                            case 5:
12523
                              if (regno == 6)
12524
                                regno = 0;
12525
                              else if (regno == 7)
12526
                                regno = 1;
12527
                              else
12528
                                regno = ILLEGAL_REG;
12529
                              break;
12530
 
12531
                            case 6:
12532
                              if (regno == 7)
12533
                                regno = 2;
12534
                              else
12535
                                regno = ILLEGAL_REG;
12536
                              break;
12537
 
12538
                            default:
12539
                              regno = ILLEGAL_REG;
12540
                              break;
12541
                          }
12542
                        break;
12543
 
12544
                      case 'l':
12545
                        regno = mips32_to_micromips_reg_l_map[regno];
12546
                        break;
12547
 
12548
                      case 'm':
12549
                        regno = mips32_to_micromips_reg_m_map[regno];
12550
                        break;
12551
 
12552
                      case 'n':
12553
                        regno = mips32_to_micromips_reg_n_map[regno];
12554
                        break;
12555
 
12556
                      case 'q':
12557
                        regno = mips32_to_micromips_reg_q_map[regno];
12558
                        break;
12559
 
12560
                      case 's':
12561
                        if (regno != SP)
12562
                          regno = ILLEGAL_REG;
12563
                        break;
12564
 
12565
                      case 'y':
12566
                        if (regno != 31)
12567
                          regno = ILLEGAL_REG;
12568
                        break;
12569
 
12570
                      case 'z':
12571
                        if (regno != ZERO)
12572
                          regno = ILLEGAL_REG;
12573
                        break;
12574
 
12575
                      case 'j': /* Do nothing.  */
12576
                      case 'p':
12577
                      case 't':
12578
                      case 'x':
12579
                        break;
12580
 
12581
                      default:
12582
                        internalError ();
12583
                    }
12584
 
12585
                  if (regno == ILLEGAL_REG)
12586
                    break;
12587
 
12588
                  switch (c)
12589
                    {
12590
                      case 'b':
12591
                        INSERT_OPERAND (1, MB, *ip, regno);
12592
                        break;
12593
 
12594
                      case 'c':
12595
                        INSERT_OPERAND (1, MC, *ip, regno);
12596
                        break;
12597
 
12598
                      case 'd':
12599
                        INSERT_OPERAND (1, MD, *ip, regno);
12600
                        break;
12601
 
12602
                      case 'e':
12603
                        INSERT_OPERAND (1, ME, *ip, regno);
12604
                        break;
12605
 
12606
                      case 'f':
12607
                        INSERT_OPERAND (1, MF, *ip, regno);
12608
                        break;
12609
 
12610
                      case 'g':
12611
                        INSERT_OPERAND (1, MG, *ip, regno);
12612
                        break;
12613
 
12614
                      case 'h':
12615
                        INSERT_OPERAND (1, MH, *ip, regno);
12616
                        break;
12617
 
12618
                      case 'i':
12619
                        INSERT_OPERAND (1, MI, *ip, regno);
12620
                        break;
12621
 
12622
                      case 'j':
12623
                        INSERT_OPERAND (1, MJ, *ip, regno);
12624
                        break;
12625
 
12626
                      case 'l':
12627
                        INSERT_OPERAND (1, ML, *ip, regno);
12628
                        break;
12629
 
12630
                      case 'm':
12631
                        INSERT_OPERAND (1, MM, *ip, regno);
12632
                        break;
12633
 
12634
                      case 'n':
12635
                        INSERT_OPERAND (1, MN, *ip, regno);
12636
                        break;
12637
 
12638
                      case 'p':
12639
                        INSERT_OPERAND (1, MP, *ip, regno);
12640
                        break;
12641
 
12642
                      case 'q':
12643
                        INSERT_OPERAND (1, MQ, *ip, regno);
12644
                        break;
12645
 
12646
                      case 'a': /* Do nothing.  */
12647
                      case 's': /* Do nothing.  */
12648
                      case 't': /* Do nothing.  */
12649
                      case 'x': /* Do nothing.  */
12650
                      case 'y': /* Do nothing.  */
12651
                      case 'z': /* Do nothing.  */
12652
                        break;
12653
 
12654
                      default:
12655
                        internalError ();
12656
                    }
12657
                  continue;
12658
 
12659
                case 'A':
12660
                  {
12661
                    bfd_reloc_code_real_type r[3];
12662
                    expressionS ep;
12663
                    int imm;
12664
 
12665
                    /* Check whether there is only a single bracketed
12666
                       expression left.  If so, it must be the base register
12667
                       and the constant must be zero.  */
12668
                    if (*s == '(' && strchr (s + 1, '(') == 0)
12669
                      {
12670
                        INSERT_OPERAND (1, IMMA, *ip, 0);
12671
                        continue;
12672
                      }
12673
 
12674
                    if (my_getSmallExpression (&ep, r, s) > 0
12675
                        || !expr_const_in_range (&ep, -64, 64, 2))
12676
                      break;
12677
 
12678
                    imm = ep.X_add_number >> 2;
12679
                    INSERT_OPERAND (1, IMMA, *ip, imm);
12680
                  }
12681
                  s = expr_end;
12682
                  continue;
12683
 
12684
                case 'B':
12685
                  {
12686
                    bfd_reloc_code_real_type r[3];
12687
                    expressionS ep;
12688
                    int imm;
12689
 
12690
                    if (my_getSmallExpression (&ep, r, s) > 0
12691
                        || ep.X_op != O_constant)
12692
                      break;
12693
 
12694
                    for (imm = 0; imm < 8; imm++)
12695
                      if (micromips_imm_b_map[imm] == ep.X_add_number)
12696
                        break;
12697
                    if (imm >= 8)
12698
                      break;
12699
 
12700
                    INSERT_OPERAND (1, IMMB, *ip, imm);
12701
                  }
12702
                  s = expr_end;
12703
                  continue;
12704
 
12705
                case 'C':
12706
                  {
12707
                    bfd_reloc_code_real_type r[3];
12708
                    expressionS ep;
12709
                    int imm;
12710
 
12711
                    if (my_getSmallExpression (&ep, r, s) > 0
12712
                        || ep.X_op != O_constant)
12713
                      break;
12714
 
12715
                    for (imm = 0; imm < 16; imm++)
12716
                      if (micromips_imm_c_map[imm] == ep.X_add_number)
12717
                        break;
12718
                    if (imm >= 16)
12719
                      break;
12720
 
12721
                    INSERT_OPERAND (1, IMMC, *ip, imm);
12722
                  }
12723
                  s = expr_end;
12724
                  continue;
12725
 
12726
                case 'D':       /* pc relative offset */
12727
                case 'E':       /* pc relative offset */
12728
                  my_getExpression (&offset_expr, s);
12729
                  if (offset_expr.X_op == O_register)
12730
                    break;
12731
 
12732
                  if (!forced_insn_length)
12733
                    *offset_reloc = (int) BFD_RELOC_UNUSED + c;
12734
                  else if (c == 'D')
12735
                    *offset_reloc = BFD_RELOC_MICROMIPS_10_PCREL_S1;
12736
                  else
12737
                    *offset_reloc = BFD_RELOC_MICROMIPS_7_PCREL_S1;
12738
                  s = expr_end;
12739
                  continue;
12740
 
12741
                case 'F':
12742
                  {
12743
                    bfd_reloc_code_real_type r[3];
12744
                    expressionS ep;
12745
                    int imm;
12746
 
12747
                    if (my_getSmallExpression (&ep, r, s) > 0
12748
                        || !expr_const_in_range (&ep, 0, 16, 0))
12749
                      break;
12750
 
12751
                    imm = ep.X_add_number;
12752
                    INSERT_OPERAND (1, IMMF, *ip, imm);
12753
                  }
12754
                  s = expr_end;
12755
                  continue;
12756
 
12757
                case 'G':
12758
                  {
12759
                    bfd_reloc_code_real_type r[3];
12760
                    expressionS ep;
12761
                    int imm;
12762
 
12763
                    /* Check whether there is only a single bracketed
12764
                       expression left.  If so, it must be the base register
12765
                       and the constant must be zero.  */
12766
                    if (*s == '(' && strchr (s + 1, '(') == 0)
12767
                      {
12768
                        INSERT_OPERAND (1, IMMG, *ip, 0);
12769
                        continue;
12770
                      }
12771
 
12772
                    if (my_getSmallExpression (&ep, r, s) > 0
12773
                        || !expr_const_in_range (&ep, -1, 15, 0))
12774
                      break;
12775
 
12776
                    imm = ep.X_add_number & 15;
12777
                    INSERT_OPERAND (1, IMMG, *ip, imm);
12778
                  }
12779
                  s = expr_end;
12780
                  continue;
12781
 
12782
                case 'H':
12783
                  {
12784
                    bfd_reloc_code_real_type r[3];
12785
                    expressionS ep;
12786
                    int imm;
12787
 
12788
                    /* Check whether there is only a single bracketed
12789
                       expression left.  If so, it must be the base register
12790
                       and the constant must be zero.  */
12791
                    if (*s == '(' && strchr (s + 1, '(') == 0)
12792
                      {
12793
                        INSERT_OPERAND (1, IMMH, *ip, 0);
12794
                        continue;
12795
                      }
12796
 
12797
                    if (my_getSmallExpression (&ep, r, s) > 0
12798
                        || !expr_const_in_range (&ep, 0, 16, 1))
12799
                      break;
12800
 
12801
                    imm = ep.X_add_number >> 1;
12802
                    INSERT_OPERAND (1, IMMH, *ip, imm);
12803
                  }
12804
                  s = expr_end;
12805
                  continue;
12806
 
12807
                case 'I':
12808
                  {
12809
                    bfd_reloc_code_real_type r[3];
12810
                    expressionS ep;
12811
                    int imm;
12812
 
12813
                    if (my_getSmallExpression (&ep, r, s) > 0
12814
                        || !expr_const_in_range (&ep, -1, 127, 0))
12815
                      break;
12816
 
12817
                    imm = ep.X_add_number & 127;
12818
                    INSERT_OPERAND (1, IMMI, *ip, imm);
12819
                  }
12820
                  s = expr_end;
12821
                  continue;
12822
 
12823
                case 'J':
12824
                  {
12825
                    bfd_reloc_code_real_type r[3];
12826
                    expressionS ep;
12827
                    int imm;
12828
 
12829
                    /* Check whether there is only a single bracketed
12830
                       expression left.  If so, it must be the base register
12831
                       and the constant must be zero.  */
12832
                    if (*s == '(' && strchr (s + 1, '(') == 0)
12833
                      {
12834
                        INSERT_OPERAND (1, IMMJ, *ip, 0);
12835
                        continue;
12836
                      }
12837
 
12838
                    if (my_getSmallExpression (&ep, r, s) > 0
12839
                        || !expr_const_in_range (&ep, 0, 16, 2))
12840
                      break;
12841
 
12842
                    imm = ep.X_add_number >> 2;
12843
                    INSERT_OPERAND (1, IMMJ, *ip, imm);
12844
                  }
12845
                  s = expr_end;
12846
                  continue;
12847
 
12848
                case 'L':
12849
                  {
12850
                    bfd_reloc_code_real_type r[3];
12851
                    expressionS ep;
12852
                    int imm;
12853
 
12854
                    /* Check whether there is only a single bracketed
12855
                       expression left.  If so, it must be the base register
12856
                       and the constant must be zero.  */
12857
                    if (*s == '(' && strchr (s + 1, '(') == 0)
12858
                      {
12859
                        INSERT_OPERAND (1, IMML, *ip, 0);
12860
                        continue;
12861
                      }
12862
 
12863
                    if (my_getSmallExpression (&ep, r, s) > 0
12864
                        || !expr_const_in_range (&ep, 0, 16, 0))
12865
                      break;
12866
 
12867
                    imm = ep.X_add_number;
12868
                    INSERT_OPERAND (1, IMML, *ip, imm);
12869
                  }
12870
                  s = expr_end;
12871
                  continue;
12872
 
12873
                case 'M':
12874
                  {
12875
                    bfd_reloc_code_real_type r[3];
12876
                    expressionS ep;
12877
                    int imm;
12878
 
12879
                    if (my_getSmallExpression (&ep, r, s) > 0
12880
                        || !expr_const_in_range (&ep, 1, 9, 0))
12881
                      break;
12882
 
12883
                    imm = ep.X_add_number & 7;
12884
                    INSERT_OPERAND (1, IMMM, *ip, imm);
12885
                  }
12886
                  s = expr_end;
12887
                  continue;
12888
 
12889
                case 'N':       /* Register list for lwm and swm.  */
12890
                  {
12891
                    /* A comma-separated list of registers and/or
12892
                       dash-separated contiguous ranges including
12893
                       both ra and a set of one or more registers
12894
                       starting at s0 up to s3 which have to be
12895
                       consecutive, e.g.:
12896
 
12897
                       s0, ra
12898
                       s0, s1, ra, s2, s3
12899
                       s0-s2, ra
12900
 
12901
                       and any permutations of these.  */
12902
                    unsigned int reglist;
12903
                    int imm;
12904
 
12905
                    if (!reglist_lookup (&s, RTYPE_NUM | RTYPE_GP, &reglist))
12906
                      break;
12907
 
12908
                    if ((reglist & 0xfff1ffff) != 0x80010000)
12909
                      break;
12910
 
12911
                    reglist = (reglist >> 17) & 7;
12912
                    reglist += 1;
12913
                    if ((reglist & -reglist) != reglist)
12914
                      break;
12915
 
12916
                    imm = ffs (reglist) - 1;
12917
                    INSERT_OPERAND (1, IMMN, *ip, imm);
12918
                  }
12919
                  continue;
12920
 
12921
                case 'O':       /* sdbbp 4-bit code.  */
12922
                  {
12923
                    bfd_reloc_code_real_type r[3];
12924
                    expressionS ep;
12925
                    int imm;
12926
 
12927
                    if (my_getSmallExpression (&ep, r, s) > 0
12928
                        || !expr_const_in_range (&ep, 0, 16, 0))
12929
                      break;
12930
 
12931
                    imm = ep.X_add_number;
12932
                    INSERT_OPERAND (1, IMMO, *ip, imm);
12933
                  }
12934
                  s = expr_end;
12935
                  continue;
12936
 
12937
                case 'P':
12938
                  {
12939
                    bfd_reloc_code_real_type r[3];
12940
                    expressionS ep;
12941
                    int imm;
12942
 
12943
                    if (my_getSmallExpression (&ep, r, s) > 0
12944
                        || !expr_const_in_range (&ep, 0, 32, 2))
12945
                      break;
12946
 
12947
                    imm = ep.X_add_number >> 2;
12948
                    INSERT_OPERAND (1, IMMP, *ip, imm);
12949
                  }
12950
                  s = expr_end;
12951
                  continue;
12952
 
12953
                case 'Q':
12954
                  {
12955
                    bfd_reloc_code_real_type r[3];
12956
                    expressionS ep;
12957
                    int imm;
12958
 
12959
                    if (my_getSmallExpression (&ep, r, s) > 0
12960
                        || !expr_const_in_range (&ep, -0x400000, 0x400000, 2))
12961
                      break;
12962
 
12963
                    imm = ep.X_add_number >> 2;
12964
                    INSERT_OPERAND (1, IMMQ, *ip, imm);
12965
                  }
12966
                  s = expr_end;
12967
                  continue;
12968
 
12969
                case 'U':
12970
                  {
12971
                    bfd_reloc_code_real_type r[3];
12972
                    expressionS ep;
12973
                    int imm;
12974
 
12975
                    /* Check whether there is only a single bracketed
12976
                       expression left.  If so, it must be the base register
12977
                       and the constant must be zero.  */
12978
                    if (*s == '(' && strchr (s + 1, '(') == 0)
12979
                      {
12980
                        INSERT_OPERAND (1, IMMU, *ip, 0);
12981
                        continue;
12982
                      }
12983
 
12984
                    if (my_getSmallExpression (&ep, r, s) > 0
12985
                        || !expr_const_in_range (&ep, 0, 32, 2))
12986
                      break;
12987
 
12988
                    imm = ep.X_add_number >> 2;
12989
                    INSERT_OPERAND (1, IMMU, *ip, imm);
12990
                  }
12991
                  s = expr_end;
12992
                  continue;
12993
 
12994
                case 'W':
12995
                  {
12996
                    bfd_reloc_code_real_type r[3];
12997
                    expressionS ep;
12998
                    int imm;
12999
 
13000
                    if (my_getSmallExpression (&ep, r, s) > 0
13001
                        || !expr_const_in_range (&ep, 0, 64, 2))
13002
                      break;
13003
 
13004
                    imm = ep.X_add_number >> 2;
13005
                    INSERT_OPERAND (1, IMMW, *ip, imm);
13006
                  }
13007
                  s = expr_end;
13008
                  continue;
13009
 
13010
                case 'X':
13011
                  {
13012
                    bfd_reloc_code_real_type r[3];
13013
                    expressionS ep;
13014
                    int imm;
13015
 
13016
                    if (my_getSmallExpression (&ep, r, s) > 0
13017
                        || !expr_const_in_range (&ep, -8, 8, 0))
13018
                      break;
13019
 
13020
                    imm = ep.X_add_number;
13021
                    INSERT_OPERAND (1, IMMX, *ip, imm);
13022
                  }
13023
                  s = expr_end;
13024
                  continue;
13025
 
13026
                case 'Y':
13027
                  {
13028
                    bfd_reloc_code_real_type r[3];
13029
                    expressionS ep;
13030
                    int imm;
13031
 
13032
                    if (my_getSmallExpression (&ep, r, s) > 0
13033
                        || expr_const_in_range (&ep, -2, 2, 2)
13034
                        || !expr_const_in_range (&ep, -258, 258, 2))
13035
                      break;
13036
 
13037
                    imm = ep.X_add_number >> 2;
13038
                    imm = ((imm >> 1) & ~0xff) | (imm & 0xff);
13039
                    INSERT_OPERAND (1, IMMY, *ip, imm);
13040
                  }
13041
                  s = expr_end;
13042
                  continue;
13043
 
13044
                case 'Z':
13045
                  {
13046
                    bfd_reloc_code_real_type r[3];
13047
                    expressionS ep;
13048
 
13049
                    if (my_getSmallExpression (&ep, r, s) > 0
13050
                        || !expr_const_in_range (&ep, 0, 1, 0))
13051
                      break;
13052
                  }
13053
                  s = expr_end;
13054
                  continue;
13055
 
13056
                default:
13057
                  as_bad (_("Internal error: bad microMIPS opcode "
13058
                            "(unknown extension operand type `m%c'): %s %s"),
13059
                          *args, insn->name, insn->args);
13060
                  /* Further processing is fruitless.  */
13061
                  return;
13062
                }
13063
              break;
13064
 
13065
            case 'n':           /* Register list for 32-bit lwm and swm.  */
13066
              gas_assert (mips_opts.micromips);
13067
              {
13068
                /* A comma-separated list of registers and/or
13069
                   dash-separated contiguous ranges including
13070
                   at least one of ra and a set of one or more
13071
                   registers starting at s0 up to s7 and then
13072
                   s8 which have to be consecutive, e.g.:
13073
 
13074
                   ra
13075
                   s0
13076
                   ra, s0, s1, s2
13077
                   s0-s8
13078
                   s0-s5, ra
13079
 
13080
                   and any permutations of these.  */
13081
                unsigned int reglist;
13082
                int imm;
13083
                int ra;
13084
 
13085
                if (!reglist_lookup (&s, RTYPE_NUM | RTYPE_GP, &reglist))
13086
                  break;
13087
 
13088
                if ((reglist & 0x3f00ffff) != 0)
13089
                  break;
13090
 
13091
                ra = (reglist >> 27) & 0x10;
13092
                reglist = ((reglist >> 22) & 0x100) | ((reglist >> 16) & 0xff);
13093
                reglist += 1;
13094
                if ((reglist & -reglist) != reglist)
13095
                  break;
13096
 
13097
                imm = (ffs (reglist) - 1) | ra;
13098
                INSERT_OPERAND (1, RT, *ip, imm);
13099
                imm_expr.X_op = O_absent;
13100
              }
13101
              continue;
13102
 
13103
            case '|':           /* 4-bit trap code.  */
13104
              gas_assert (mips_opts.micromips);
13105
              my_getExpression (&imm_expr, s);
13106
              check_absolute_expr (ip, &imm_expr);
13107
              if ((unsigned long) imm_expr.X_add_number
13108
                  > MICROMIPSOP_MASK_TRAP)
13109
                as_bad (_("Trap code (%lu) for %s not in 0..15 range"),
13110
                        (unsigned long) imm_expr.X_add_number,
13111
                        ip->insn_mo->name);
13112
              INSERT_OPERAND (1, TRAP, *ip, imm_expr.X_add_number);
13113
              imm_expr.X_op = O_absent;
13114
              s = expr_end;
13115
              continue;
13116
 
13117 16 khays
            default:
13118
              as_bad (_("Bad char = '%c'\n"), *args);
13119
              internalError ();
13120
            }
13121
          break;
13122
        }
13123
      /* Args don't match.  */
13124 160 khays
      s = argsStart;
13125
      insn_error = _("Illegal operands");
13126
      if (insn + 1 < past && !strcmp (insn->name, insn[1].name))
13127 16 khays
        {
13128
          ++insn;
13129
          continue;
13130
        }
13131 160 khays
      else if (wrong_delay_slot_insns && need_delay_slot_ok)
13132
        {
13133
          gas_assert (firstinsn);
13134
          need_delay_slot_ok = FALSE;
13135
          past = insn + 1;
13136
          insn = firstinsn;
13137
          continue;
13138
        }
13139 16 khays
      return;
13140
    }
13141
}
13142
 
13143
#define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
13144
 
13145
/* This routine assembles an instruction into its binary format when
13146
   assembling for the mips16.  As a side effect, it sets one of the
13147 160 khays
   global variables imm_reloc or offset_reloc to the type of relocation
13148
   to do if one of the operands is an address expression.  It also sets
13149
   forced_insn_length to the resulting instruction size in bytes if the
13150
   user explicitly requested a small or extended instruction.  */
13151 16 khays
 
13152
static void
13153
mips16_ip (char *str, struct mips_cl_insn *ip)
13154
{
13155
  char *s;
13156
  const char *args;
13157
  struct mips_opcode *insn;
13158
  char *argsstart;
13159
  unsigned int regno;
13160
  unsigned int lastregno = 0;
13161
  char *s_reset;
13162
  size_t i;
13163
 
13164
  insn_error = NULL;
13165
 
13166 160 khays
  forced_insn_length = 0;
13167 16 khays
 
13168
  for (s = str; ISLOWER (*s); ++s)
13169
    ;
13170
  switch (*s)
13171
    {
13172
    case '\0':
13173
      break;
13174
 
13175
    case ' ':
13176
      *s++ = '\0';
13177
      break;
13178
 
13179
    case '.':
13180
      if (s[1] == 't' && s[2] == ' ')
13181
        {
13182
          *s = '\0';
13183 160 khays
          forced_insn_length = 2;
13184 16 khays
          s += 3;
13185
          break;
13186
        }
13187
      else if (s[1] == 'e' && s[2] == ' ')
13188
        {
13189
          *s = '\0';
13190 160 khays
          forced_insn_length = 4;
13191 16 khays
          s += 3;
13192
          break;
13193
        }
13194
      /* Fall through.  */
13195
    default:
13196
      insn_error = _("unknown opcode");
13197
      return;
13198
    }
13199
 
13200 160 khays
  if (mips_opts.noautoextend && !forced_insn_length)
13201
    forced_insn_length = 2;
13202 16 khays
 
13203
  if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
13204
    {
13205
      insn_error = _("unrecognized opcode");
13206
      return;
13207
    }
13208
 
13209
  argsstart = s;
13210
  for (;;)
13211
    {
13212
      bfd_boolean ok;
13213
 
13214
      gas_assert (strcmp (insn->name, str) == 0);
13215
 
13216
      ok = is_opcode_valid_16 (insn);
13217
      if (! ok)
13218
        {
13219
          if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
13220
              && strcmp (insn->name, insn[1].name) == 0)
13221
            {
13222
              ++insn;
13223
              continue;
13224
            }
13225
          else
13226
            {
13227
              if (!insn_error)
13228
                {
13229
                  static char buf[100];
13230
                  sprintf (buf,
13231
                           _("opcode not supported on this processor: %s (%s)"),
13232
                           mips_cpu_info_from_arch (mips_opts.arch)->name,
13233
                           mips_cpu_info_from_isa (mips_opts.isa)->name);
13234
                  insn_error = buf;
13235
                }
13236
              return;
13237
            }
13238
        }
13239
 
13240
      create_insn (ip, insn);
13241
      imm_expr.X_op = O_absent;
13242
      imm_reloc[0] = BFD_RELOC_UNUSED;
13243
      imm_reloc[1] = BFD_RELOC_UNUSED;
13244
      imm_reloc[2] = BFD_RELOC_UNUSED;
13245
      imm2_expr.X_op = O_absent;
13246
      offset_expr.X_op = O_absent;
13247
      offset_reloc[0] = BFD_RELOC_UNUSED;
13248
      offset_reloc[1] = BFD_RELOC_UNUSED;
13249
      offset_reloc[2] = BFD_RELOC_UNUSED;
13250
      for (args = insn->args; 1; ++args)
13251
        {
13252
          int c;
13253
 
13254
          if (*s == ' ')
13255
            ++s;
13256
 
13257
          /* In this switch statement we call break if we did not find
13258
             a match, continue if we did find a match, or return if we
13259
             are done.  */
13260
 
13261
          c = *args;
13262
          switch (c)
13263
            {
13264
            case '\0':
13265
              if (*s == '\0')
13266
                {
13267
                  /* Stuff the immediate value in now, if we can.  */
13268
                  if (imm_expr.X_op == O_constant
13269
                      && *imm_reloc > BFD_RELOC_UNUSED
13270
                      && *imm_reloc != BFD_RELOC_MIPS16_GOT16
13271
                      && *imm_reloc != BFD_RELOC_MIPS16_CALL16
13272
                      && insn->pinfo != INSN_MACRO)
13273
                    {
13274
                      valueT tmp;
13275
 
13276
                      switch (*offset_reloc)
13277
                        {
13278
                          case BFD_RELOC_MIPS16_HI16_S:
13279
                            tmp = (imm_expr.X_add_number + 0x8000) >> 16;
13280
                            break;
13281
 
13282
                          case BFD_RELOC_MIPS16_HI16:
13283
                            tmp = imm_expr.X_add_number >> 16;
13284
                            break;
13285
 
13286
                          case BFD_RELOC_MIPS16_LO16:
13287
                            tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
13288
                                  - 0x8000;
13289
                            break;
13290
 
13291
                          case BFD_RELOC_UNUSED:
13292
                            tmp = imm_expr.X_add_number;
13293
                            break;
13294
 
13295
                          default:
13296
                            internalError ();
13297
                        }
13298
                      *offset_reloc = BFD_RELOC_UNUSED;
13299
 
13300
                      mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
13301 160 khays
                                    tmp, TRUE, forced_insn_length == 2,
13302
                                    forced_insn_length == 4, &ip->insn_opcode,
13303 16 khays
                                    &ip->use_extend, &ip->extend);
13304
                      imm_expr.X_op = O_absent;
13305
                      *imm_reloc = BFD_RELOC_UNUSED;
13306
                    }
13307
 
13308
                  return;
13309
                }
13310
              break;
13311
 
13312
            case ',':
13313
              if (*s++ == c)
13314
                continue;
13315
              s--;
13316
              switch (*++args)
13317
                {
13318
                case 'v':
13319
                  MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
13320
                  continue;
13321
                case 'w':
13322
                  MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
13323
                  continue;
13324
                }
13325
              break;
13326
 
13327
            case '(':
13328
            case ')':
13329
              if (*s++ == c)
13330
                continue;
13331
              break;
13332
 
13333
            case 'v':
13334
            case 'w':
13335
              if (s[0] != '$')
13336
                {
13337
                  if (c == 'v')
13338
                    MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
13339
                  else
13340
                    MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
13341
                  ++args;
13342
                  continue;
13343
                }
13344
              /* Fall through.  */
13345
            case 'x':
13346
            case 'y':
13347
            case 'z':
13348
            case 'Z':
13349
            case '0':
13350
            case 'S':
13351
            case 'R':
13352
            case 'X':
13353
            case 'Y':
13354
              s_reset = s;
13355
              if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
13356
                {
13357
                  if (c == 'v' || c == 'w')
13358
                    {
13359
                      if (c == 'v')
13360
                        MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
13361
                      else
13362
                        MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
13363
                      ++args;
13364
                      continue;
13365
                    }
13366
                  break;
13367
                }
13368
 
13369
              if (*s == ' ')
13370
                ++s;
13371
              if (args[1] != *s)
13372
                {
13373
                  if (c == 'v' || c == 'w')
13374
                    {
13375
                      regno = mips16_to_32_reg_map[lastregno];
13376
                      s = s_reset;
13377
                      ++args;
13378
                    }
13379
                }
13380
 
13381
              switch (c)
13382
                {
13383
                case 'x':
13384
                case 'y':
13385
                case 'z':
13386
                case 'v':
13387
                case 'w':
13388
                case 'Z':
13389
                  regno = mips32_to_16_reg_map[regno];
13390
                  break;
13391
 
13392
                case '0':
13393
                  if (regno != 0)
13394
                    regno = ILLEGAL_REG;
13395
                  break;
13396
 
13397
                case 'S':
13398
                  if (regno != SP)
13399
                    regno = ILLEGAL_REG;
13400
                  break;
13401
 
13402
                case 'R':
13403
                  if (regno != RA)
13404
                    regno = ILLEGAL_REG;
13405
                  break;
13406
 
13407
                case 'X':
13408
                case 'Y':
13409
                  if (regno == AT && mips_opts.at)
13410
                    {
13411
                      if (mips_opts.at == ATREG)
13412
                        as_warn (_("used $at without \".set noat\""));
13413
                      else
13414
                        as_warn (_("used $%u with \".set at=$%u\""),
13415
                                 regno, mips_opts.at);
13416
                    }
13417
                  break;
13418
 
13419
                default:
13420
                  internalError ();
13421
                }
13422
 
13423
              if (regno == ILLEGAL_REG)
13424
                break;
13425
 
13426
              switch (c)
13427
                {
13428
                case 'x':
13429
                case 'v':
13430
                  MIPS16_INSERT_OPERAND (RX, *ip, regno);
13431
                  break;
13432
                case 'y':
13433
                case 'w':
13434
                  MIPS16_INSERT_OPERAND (RY, *ip, regno);
13435
                  break;
13436
                case 'z':
13437
                  MIPS16_INSERT_OPERAND (RZ, *ip, regno);
13438
                  break;
13439
                case 'Z':
13440
                  MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
13441
                case '0':
13442
                case 'S':
13443
                case 'R':
13444
                  break;
13445
                case 'X':
13446
                  MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
13447
                  break;
13448
                case 'Y':
13449
                  regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
13450
                  MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
13451
                  break;
13452
                default:
13453
                  internalError ();
13454
                }
13455
 
13456
              lastregno = regno;
13457
              continue;
13458
 
13459
            case 'P':
13460
              if (strncmp (s, "$pc", 3) == 0)
13461
                {
13462
                  s += 3;
13463
                  continue;
13464
                }
13465
              break;
13466
 
13467
            case '5':
13468
            case 'H':
13469
            case 'W':
13470
            case 'D':
13471
            case 'j':
13472
            case 'V':
13473
            case 'C':
13474
            case 'U':
13475
            case 'k':
13476
            case 'K':
13477
              i = my_getSmallExpression (&imm_expr, imm_reloc, s);
13478
              if (i > 0)
13479
                {
13480
                  if (imm_expr.X_op != O_constant)
13481
                    {
13482 160 khays
                      forced_insn_length = 4;
13483 16 khays
                      ip->use_extend = TRUE;
13484
                      ip->extend = 0;
13485
                    }
13486
                  else
13487
                    {
13488
                      /* We need to relax this instruction.  */
13489
                      *offset_reloc = *imm_reloc;
13490
                      *imm_reloc = (int) BFD_RELOC_UNUSED + c;
13491
                    }
13492
                  s = expr_end;
13493
                  continue;
13494
                }
13495
              *imm_reloc = BFD_RELOC_UNUSED;
13496
              /* Fall through.  */
13497
            case '<':
13498
            case '>':
13499
            case '[':
13500
            case ']':
13501
            case '4':
13502
            case '8':
13503
              my_getExpression (&imm_expr, s);
13504
              if (imm_expr.X_op == O_register)
13505
                {
13506
                  /* What we thought was an expression turned out to
13507
                     be a register.  */
13508
 
13509
                  if (s[0] == '(' && args[1] == '(')
13510
                    {
13511
                      /* It looks like the expression was omitted
13512
                         before a register indirection, which means
13513
                         that the expression is implicitly zero.  We
13514
                         still set up imm_expr, so that we handle
13515
                         explicit extensions correctly.  */
13516
                      imm_expr.X_op = O_constant;
13517
                      imm_expr.X_add_number = 0;
13518
                      *imm_reloc = (int) BFD_RELOC_UNUSED + c;
13519
                      continue;
13520
                    }
13521
 
13522
                  break;
13523
                }
13524
 
13525
              /* We need to relax this instruction.  */
13526
              *imm_reloc = (int) BFD_RELOC_UNUSED + c;
13527
              s = expr_end;
13528
              continue;
13529
 
13530
            case 'p':
13531
            case 'q':
13532
            case 'A':
13533
            case 'B':
13534
            case 'E':
13535
              /* We use offset_reloc rather than imm_reloc for the PC
13536
                 relative operands.  This lets macros with both
13537
                 immediate and address operands work correctly.  */
13538
              my_getExpression (&offset_expr, s);
13539
 
13540
              if (offset_expr.X_op == O_register)
13541
                break;
13542
 
13543
              /* We need to relax this instruction.  */
13544
              *offset_reloc = (int) BFD_RELOC_UNUSED + c;
13545
              s = expr_end;
13546
              continue;
13547
 
13548
            case '6':           /* break code */
13549
              my_getExpression (&imm_expr, s);
13550
              check_absolute_expr (ip, &imm_expr);
13551
              if ((unsigned long) imm_expr.X_add_number > 63)
13552
                as_warn (_("Invalid value for `%s' (%lu)"),
13553
                         ip->insn_mo->name,
13554
                         (unsigned long) imm_expr.X_add_number);
13555
              MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
13556
              imm_expr.X_op = O_absent;
13557
              s = expr_end;
13558
              continue;
13559
 
13560
            case 'a':           /* 26 bit address */
13561
              my_getExpression (&offset_expr, s);
13562
              s = expr_end;
13563
              *offset_reloc = BFD_RELOC_MIPS16_JMP;
13564
              ip->insn_opcode <<= 16;
13565
              continue;
13566
 
13567
            case 'l':           /* register list for entry macro */
13568
            case 'L':           /* register list for exit macro */
13569
              {
13570
                int mask;
13571
 
13572
                if (c == 'l')
13573
                  mask = 0;
13574
                else
13575
                  mask = 7 << 3;
13576
                while (*s != '\0')
13577
                  {
13578
                    unsigned int freg, reg1, reg2;
13579
 
13580
                    while (*s == ' ' || *s == ',')
13581
                      ++s;
13582
                    if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
13583
                      freg = 0;
13584
                    else if (reg_lookup (&s, RTYPE_FPU, &reg1))
13585
                      freg = 1;
13586
                    else
13587
                      {
13588
                        as_bad (_("can't parse register list"));
13589
                        break;
13590
                      }
13591
                    if (*s == ' ')
13592
                      ++s;
13593
                    if (*s != '-')
13594
                      reg2 = reg1;
13595
                    else
13596
                      {
13597
                        ++s;
13598
                        if (!reg_lookup (&s, freg ? RTYPE_FPU
13599
                                         : (RTYPE_GP | RTYPE_NUM), &reg2))
13600
                          {
13601
                            as_bad (_("invalid register list"));
13602
                            break;
13603
                          }
13604
                      }
13605
                    if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
13606
                      {
13607
                        mask &= ~ (7 << 3);
13608
                        mask |= 5 << 3;
13609
                      }
13610
                    else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
13611
                      {
13612
                        mask &= ~ (7 << 3);
13613
                        mask |= 6 << 3;
13614
                      }
13615
                    else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
13616
                      mask |= (reg2 - 3) << 3;
13617
                    else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
13618
                      mask |= (reg2 - 15) << 1;
13619
                    else if (reg1 == RA && reg2 == RA)
13620
                      mask |= 1;
13621
                    else
13622
                      {
13623
                        as_bad (_("invalid register list"));
13624
                        break;
13625
                      }
13626
                  }
13627
                /* The mask is filled in in the opcode table for the
13628
                   benefit of the disassembler.  We remove it before
13629
                   applying the actual mask.  */
13630
                ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
13631
                ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
13632
              }
13633
            continue;
13634
 
13635
            case 'm':           /* Register list for save insn.  */
13636
            case 'M':           /* Register list for restore insn.  */
13637
              {
13638
                int opcode = 0;
13639
                int framesz = 0, seen_framesz = 0;
13640
                int nargs = 0, statics = 0, sregs = 0;
13641
 
13642
                while (*s != '\0')
13643
                  {
13644
                    unsigned int reg1, reg2;
13645
 
13646
                    SKIP_SPACE_TABS (s);
13647
                    while (*s == ',')
13648
                      ++s;
13649
                    SKIP_SPACE_TABS (s);
13650
 
13651
                    my_getExpression (&imm_expr, s);
13652
                    if (imm_expr.X_op == O_constant)
13653
                      {
13654
                        /* Handle the frame size.  */
13655
                        if (seen_framesz)
13656
                          {
13657
                            as_bad (_("more than one frame size in list"));
13658
                            break;
13659
                          }
13660
                        seen_framesz = 1;
13661
                        framesz = imm_expr.X_add_number;
13662
                        imm_expr.X_op = O_absent;
13663
                        s = expr_end;
13664
                        continue;
13665
                      }
13666
 
13667
                    if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
13668
                      {
13669
                        as_bad (_("can't parse register list"));
13670
                        break;
13671
                      }
13672
 
13673
                    while (*s == ' ')
13674
                      ++s;
13675
 
13676
                    if (*s != '-')
13677
                      reg2 = reg1;
13678
                    else
13679
                      {
13680
                        ++s;
13681
                        if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
13682
                            || reg2 < reg1)
13683
                          {
13684
                            as_bad (_("can't parse register list"));
13685
                            break;
13686
                          }
13687
                      }
13688
 
13689
                    while (reg1 <= reg2)
13690
                      {
13691
                        if (reg1 >= 4 && reg1 <= 7)
13692
                          {
13693
                            if (!seen_framesz)
13694
                                /* args $a0-$a3 */
13695
                                nargs |= 1 << (reg1 - 4);
13696
                            else
13697
                                /* statics $a0-$a3 */
13698
                                statics |= 1 << (reg1 - 4);
13699
                          }
13700
                        else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
13701
                          {
13702
                            /* $s0-$s8 */
13703
                            sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
13704
                          }
13705
                        else if (reg1 == 31)
13706
                          {
13707
                            /* Add $ra to insn.  */
13708
                            opcode |= 0x40;
13709
                          }
13710
                        else
13711
                          {
13712
                            as_bad (_("unexpected register in list"));
13713
                            break;
13714
                          }
13715
                        if (++reg1 == 24)
13716
                          reg1 = 30;
13717
                      }
13718
                  }
13719
 
13720
                /* Encode args/statics combination.  */
13721
                if (nargs & statics)
13722
                  as_bad (_("arg/static registers overlap"));
13723
                else if (nargs == 0xf)
13724
                  /* All $a0-$a3 are args.  */
13725
                  opcode |= MIPS16_ALL_ARGS << 16;
13726
                else if (statics == 0xf)
13727
                  /* All $a0-$a3 are statics.  */
13728
                  opcode |= MIPS16_ALL_STATICS << 16;
13729
                else
13730
                  {
13731
                    int narg = 0, nstat = 0;
13732
 
13733
                    /* Count arg registers.  */
13734
                    while (nargs & 0x1)
13735
                      {
13736
                        nargs >>= 1;
13737
                        narg++;
13738
                      }
13739
                    if (nargs != 0)
13740
                      as_bad (_("invalid arg register list"));
13741
 
13742
                    /* Count static registers.  */
13743
                    while (statics & 0x8)
13744
                      {
13745
                        statics = (statics << 1) & 0xf;
13746
                        nstat++;
13747
                      }
13748
                    if (statics != 0)
13749
                      as_bad (_("invalid static register list"));
13750
 
13751
                    /* Encode args/statics.  */
13752
                    opcode |= ((narg << 2) | nstat) << 16;
13753
                  }
13754
 
13755
                /* Encode $s0/$s1.  */
13756
                if (sregs & (1 << 0))            /* $s0 */
13757
                  opcode |= 0x20;
13758
                if (sregs & (1 << 1))           /* $s1 */
13759
                  opcode |= 0x10;
13760
                sregs >>= 2;
13761
 
13762
                if (sregs != 0)
13763
                  {
13764
                    /* Count regs $s2-$s8.  */
13765
                    int nsreg = 0;
13766
                    while (sregs & 1)
13767
                      {
13768
                        sregs >>= 1;
13769
                        nsreg++;
13770
                      }
13771
                    if (sregs != 0)
13772
                      as_bad (_("invalid static register list"));
13773
                    /* Encode $s2-$s8. */
13774
                    opcode |= nsreg << 24;
13775
                  }
13776
 
13777
                /* Encode frame size.  */
13778
                if (!seen_framesz)
13779
                  as_bad (_("missing frame size"));
13780
                else if ((framesz & 7) != 0 || framesz < 0
13781
                         || framesz > 0xff * 8)
13782
                  as_bad (_("invalid frame size"));
13783
                else if (framesz != 128 || (opcode >> 16) != 0)
13784
                  {
13785
                    framesz /= 8;
13786
                    opcode |= (((framesz & 0xf0) << 16)
13787
                             | (framesz & 0x0f));
13788
                  }
13789
 
13790
                /* Finally build the instruction.  */
13791
                if ((opcode >> 16) != 0 || framesz == 0)
13792
                  {
13793
                    ip->use_extend = TRUE;
13794
                    ip->extend = opcode >> 16;
13795
                  }
13796
                ip->insn_opcode |= opcode & 0x7f;
13797
              }
13798
            continue;
13799
 
13800
            case 'e':           /* extend code */
13801
              my_getExpression (&imm_expr, s);
13802
              check_absolute_expr (ip, &imm_expr);
13803
              if ((unsigned long) imm_expr.X_add_number > 0x7ff)
13804
                {
13805
                  as_warn (_("Invalid value for `%s' (%lu)"),
13806
                           ip->insn_mo->name,
13807
                           (unsigned long) imm_expr.X_add_number);
13808
                  imm_expr.X_add_number &= 0x7ff;
13809
                }
13810
              ip->insn_opcode |= imm_expr.X_add_number;
13811
              imm_expr.X_op = O_absent;
13812
              s = expr_end;
13813
              continue;
13814
 
13815
            default:
13816
              internalError ();
13817
            }
13818
          break;
13819
        }
13820
 
13821
      /* Args don't match.  */
13822
      if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
13823
          strcmp (insn->name, insn[1].name) == 0)
13824
        {
13825
          ++insn;
13826
          s = argsstart;
13827
          continue;
13828
        }
13829
 
13830
      insn_error = _("illegal operands");
13831
 
13832
      return;
13833
    }
13834
}
13835
 
13836
/* This structure holds information we know about a mips16 immediate
13837
   argument type.  */
13838
 
13839
struct mips16_immed_operand
13840
{
13841
  /* The type code used in the argument string in the opcode table.  */
13842
  int type;
13843
  /* The number of bits in the short form of the opcode.  */
13844
  int nbits;
13845
  /* The number of bits in the extended form of the opcode.  */
13846
  int extbits;
13847
  /* The amount by which the short form is shifted when it is used;
13848
     for example, the sw instruction has a shift count of 2.  */
13849
  int shift;
13850
  /* The amount by which the short form is shifted when it is stored
13851
     into the instruction code.  */
13852
  int op_shift;
13853
  /* Non-zero if the short form is unsigned.  */
13854
  int unsp;
13855
  /* Non-zero if the extended form is unsigned.  */
13856
  int extu;
13857
  /* Non-zero if the value is PC relative.  */
13858
  int pcrel;
13859
};
13860
 
13861
/* The mips16 immediate operand types.  */
13862
 
13863
static const struct mips16_immed_operand mips16_immed_operands[] =
13864
{
13865
  { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
13866
  { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
13867
  { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
13868
  { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
13869
  { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
13870
  { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
13871
  { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
13872
  { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
13873
  { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
13874
  { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
13875
  { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
13876
  { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
13877
  { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
13878
  { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
13879
  { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
13880
  { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
13881
  { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
13882
  { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
13883
  { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
13884
  { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
13885
  { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
13886
};
13887
 
13888
#define MIPS16_NUM_IMMED \
13889
  (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
13890
 
13891
/* Handle a mips16 instruction with an immediate value.  This or's the
13892
   small immediate value into *INSN.  It sets *USE_EXTEND to indicate
13893
   whether an extended value is needed; if one is needed, it sets
13894
   *EXTEND to the value.  The argument type is TYPE.  The value is VAL.
13895
   If SMALL is true, an unextended opcode was explicitly requested.
13896
   If EXT is true, an extended opcode was explicitly requested.  If
13897
   WARN is true, warn if EXT does not match reality.  */
13898
 
13899
static void
13900
mips16_immed (char *file, unsigned int line, int type, offsetT val,
13901
              bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
13902
              unsigned long *insn, bfd_boolean *use_extend,
13903
              unsigned short *extend)
13904
{
13905
  const struct mips16_immed_operand *op;
13906
  int mintiny, maxtiny;
13907
  bfd_boolean needext;
13908
 
13909
  op = mips16_immed_operands;
13910
  while (op->type != type)
13911
    {
13912
      ++op;
13913
      gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
13914
    }
13915
 
13916
  if (op->unsp)
13917
    {
13918
      if (type == '<' || type == '>' || type == '[' || type == ']')
13919
        {
13920
          mintiny = 1;
13921
          maxtiny = 1 << op->nbits;
13922
        }
13923
      else
13924
        {
13925
          mintiny = 0;
13926
          maxtiny = (1 << op->nbits) - 1;
13927
        }
13928
    }
13929
  else
13930
    {
13931
      mintiny = - (1 << (op->nbits - 1));
13932
      maxtiny = (1 << (op->nbits - 1)) - 1;
13933
    }
13934
 
13935
  /* Branch offsets have an implicit 0 in the lowest bit.  */
13936
  if (type == 'p' || type == 'q')
13937
    val /= 2;
13938
 
13939
  if ((val & ((1 << op->shift) - 1)) != 0
13940
      || val < (mintiny << op->shift)
13941
      || val > (maxtiny << op->shift))
13942
    needext = TRUE;
13943
  else
13944
    needext = FALSE;
13945
 
13946
  if (warn && ext && ! needext)
13947
    as_warn_where (file, line,
13948
                   _("extended operand requested but not required"));
13949
  if (small && needext)
13950
    as_bad_where (file, line, _("invalid unextended operand value"));
13951
 
13952
  if (small || (! ext && ! needext))
13953
    {
13954
      int insnval;
13955
 
13956
      *use_extend = FALSE;
13957
      insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
13958
      insnval <<= op->op_shift;
13959
      *insn |= insnval;
13960
    }
13961
  else
13962
    {
13963
      long minext, maxext;
13964
      int extval;
13965
 
13966
      if (op->extu)
13967
        {
13968
          minext = 0;
13969
          maxext = (1 << op->extbits) - 1;
13970
        }
13971
      else
13972
        {
13973
          minext = - (1 << (op->extbits - 1));
13974
          maxext = (1 << (op->extbits - 1)) - 1;
13975
        }
13976
      if (val < minext || val > maxext)
13977
        as_bad_where (file, line,
13978
                      _("operand value out of range for instruction"));
13979
 
13980
      *use_extend = TRUE;
13981
      if (op->extbits == 16)
13982
        {
13983
          extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
13984
          val &= 0x1f;
13985
        }
13986
      else if (op->extbits == 15)
13987
        {
13988
          extval = ((val >> 11) & 0xf) | (val & 0x7f0);
13989
          val &= 0xf;
13990
        }
13991
      else
13992
        {
13993
          extval = ((val & 0x1f) << 6) | (val & 0x20);
13994
          val = 0;
13995
        }
13996
 
13997
      *extend = (unsigned short) extval;
13998
      *insn |= val;
13999
    }
14000
}
14001
 
14002
struct percent_op_match
14003
{
14004
  const char *str;
14005
  bfd_reloc_code_real_type reloc;
14006
};
14007
 
14008
static const struct percent_op_match mips_percent_op[] =
14009
{
14010
  {"%lo", BFD_RELOC_LO16},
14011
#ifdef OBJ_ELF
14012
  {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
14013
  {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
14014
  {"%call16", BFD_RELOC_MIPS_CALL16},
14015
  {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
14016
  {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
14017
  {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
14018
  {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
14019
  {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
14020
  {"%got", BFD_RELOC_MIPS_GOT16},
14021
  {"%gp_rel", BFD_RELOC_GPREL16},
14022
  {"%half", BFD_RELOC_16},
14023
  {"%highest", BFD_RELOC_MIPS_HIGHEST},
14024
  {"%higher", BFD_RELOC_MIPS_HIGHER},
14025
  {"%neg", BFD_RELOC_MIPS_SUB},
14026
  {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
14027
  {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
14028
  {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
14029
  {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
14030
  {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
14031
  {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
14032
  {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
14033
#endif
14034
  {"%hi", BFD_RELOC_HI16_S}
14035
};
14036
 
14037
static const struct percent_op_match mips16_percent_op[] =
14038
{
14039
  {"%lo", BFD_RELOC_MIPS16_LO16},
14040
  {"%gprel", BFD_RELOC_MIPS16_GPREL},
14041
  {"%got", BFD_RELOC_MIPS16_GOT16},
14042
  {"%call16", BFD_RELOC_MIPS16_CALL16},
14043
  {"%hi", BFD_RELOC_MIPS16_HI16_S}
14044
};
14045
 
14046
 
14047
/* Return true if *STR points to a relocation operator.  When returning true,
14048
   move *STR over the operator and store its relocation code in *RELOC.
14049
   Leave both *STR and *RELOC alone when returning false.  */
14050
 
14051
static bfd_boolean
14052
parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
14053
{
14054
  const struct percent_op_match *percent_op;
14055
  size_t limit, i;
14056
 
14057
  if (mips_opts.mips16)
14058
    {
14059
      percent_op = mips16_percent_op;
14060
      limit = ARRAY_SIZE (mips16_percent_op);
14061
    }
14062
  else
14063
    {
14064
      percent_op = mips_percent_op;
14065
      limit = ARRAY_SIZE (mips_percent_op);
14066
    }
14067
 
14068
  for (i = 0; i < limit; i++)
14069
    if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
14070
      {
14071
        int len = strlen (percent_op[i].str);
14072
 
14073
        if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
14074
          continue;
14075
 
14076
        *str += strlen (percent_op[i].str);
14077
        *reloc = percent_op[i].reloc;
14078
 
14079
        /* Check whether the output BFD supports this relocation.
14080
           If not, issue an error and fall back on something safe.  */
14081
        if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
14082
          {
14083
            as_bad (_("relocation %s isn't supported by the current ABI"),
14084
                    percent_op[i].str);
14085
            *reloc = BFD_RELOC_UNUSED;
14086
          }
14087
        return TRUE;
14088
      }
14089
  return FALSE;
14090
}
14091
 
14092
 
14093
/* Parse string STR as a 16-bit relocatable operand.  Store the
14094
   expression in *EP and the relocations in the array starting
14095
   at RELOC.  Return the number of relocation operators used.
14096
 
14097
   On exit, EXPR_END points to the first character after the expression.  */
14098
 
14099
static size_t
14100
my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
14101
                       char *str)
14102
{
14103
  bfd_reloc_code_real_type reversed_reloc[3];
14104
  size_t reloc_index, i;
14105
  int crux_depth, str_depth;
14106
  char *crux;
14107
 
14108
  /* Search for the start of the main expression, recoding relocations
14109
     in REVERSED_RELOC.  End the loop with CRUX pointing to the start
14110
     of the main expression and with CRUX_DEPTH containing the number
14111
     of open brackets at that point.  */
14112
  reloc_index = -1;
14113
  str_depth = 0;
14114
  do
14115
    {
14116
      reloc_index++;
14117
      crux = str;
14118
      crux_depth = str_depth;
14119
 
14120
      /* Skip over whitespace and brackets, keeping count of the number
14121
         of brackets.  */
14122
      while (*str == ' ' || *str == '\t' || *str == '(')
14123
        if (*str++ == '(')
14124
          str_depth++;
14125
    }
14126
  while (*str == '%'
14127
         && reloc_index < (HAVE_NEWABI ? 3 : 1)
14128
         && parse_relocation (&str, &reversed_reloc[reloc_index]));
14129
 
14130
  my_getExpression (ep, crux);
14131
  str = expr_end;
14132
 
14133
  /* Match every open bracket.  */
14134
  while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
14135
    if (*str++ == ')')
14136
      crux_depth--;
14137
 
14138
  if (crux_depth > 0)
14139
    as_bad (_("unclosed '('"));
14140
 
14141
  expr_end = str;
14142
 
14143
  if (reloc_index != 0)
14144
    {
14145
      prev_reloc_op_frag = frag_now;
14146
      for (i = 0; i < reloc_index; i++)
14147
        reloc[i] = reversed_reloc[reloc_index - 1 - i];
14148
    }
14149
 
14150
  return reloc_index;
14151
}
14152
 
14153
static void
14154
my_getExpression (expressionS *ep, char *str)
14155
{
14156
  char *save_in;
14157
 
14158
  save_in = input_line_pointer;
14159
  input_line_pointer = str;
14160
  expression (ep);
14161
  expr_end = input_line_pointer;
14162
  input_line_pointer = save_in;
14163
}
14164
 
14165
char *
14166
md_atof (int type, char *litP, int *sizeP)
14167
{
14168
  return ieee_md_atof (type, litP, sizeP, target_big_endian);
14169
}
14170
 
14171
void
14172
md_number_to_chars (char *buf, valueT val, int n)
14173
{
14174
  if (target_big_endian)
14175
    number_to_chars_bigendian (buf, val, n);
14176
  else
14177
    number_to_chars_littleendian (buf, val, n);
14178
}
14179
 
14180
#ifdef OBJ_ELF
14181
static int support_64bit_objects(void)
14182
{
14183
  const char **list, **l;
14184
  int yes;
14185
 
14186
  list = bfd_target_list ();
14187
  for (l = list; *l != NULL; l++)
14188
    if (strcmp (*l, ELF_TARGET ("elf64-", "big")) == 0
14189
        || strcmp (*l, ELF_TARGET ("elf64-", "little")) == 0)
14190
      break;
14191
  yes = (*l != NULL);
14192
  free (list);
14193
  return yes;
14194
}
14195
#endif /* OBJ_ELF */
14196
 
14197
const char *md_shortopts = "O::g::G:";
14198
 
14199
enum options
14200
  {
14201
    OPTION_MARCH = OPTION_MD_BASE,
14202
    OPTION_MTUNE,
14203
    OPTION_MIPS1,
14204
    OPTION_MIPS2,
14205
    OPTION_MIPS3,
14206
    OPTION_MIPS4,
14207
    OPTION_MIPS5,
14208
    OPTION_MIPS32,
14209
    OPTION_MIPS64,
14210
    OPTION_MIPS32R2,
14211
    OPTION_MIPS64R2,
14212
    OPTION_MIPS16,
14213
    OPTION_NO_MIPS16,
14214
    OPTION_MIPS3D,
14215
    OPTION_NO_MIPS3D,
14216
    OPTION_MDMX,
14217
    OPTION_NO_MDMX,
14218
    OPTION_DSP,
14219
    OPTION_NO_DSP,
14220
    OPTION_MT,
14221
    OPTION_NO_MT,
14222
    OPTION_SMARTMIPS,
14223
    OPTION_NO_SMARTMIPS,
14224
    OPTION_DSPR2,
14225
    OPTION_NO_DSPR2,
14226 160 khays
    OPTION_MICROMIPS,
14227
    OPTION_NO_MICROMIPS,
14228
    OPTION_MCU,
14229
    OPTION_NO_MCU,
14230 16 khays
    OPTION_COMPAT_ARCH_BASE,
14231
    OPTION_M4650,
14232
    OPTION_NO_M4650,
14233
    OPTION_M4010,
14234
    OPTION_NO_M4010,
14235
    OPTION_M4100,
14236
    OPTION_NO_M4100,
14237
    OPTION_M3900,
14238
    OPTION_NO_M3900,
14239
    OPTION_M7000_HILO_FIX,
14240
    OPTION_MNO_7000_HILO_FIX,
14241
    OPTION_FIX_24K,
14242
    OPTION_NO_FIX_24K,
14243
    OPTION_FIX_LOONGSON2F_JUMP,
14244
    OPTION_NO_FIX_LOONGSON2F_JUMP,
14245
    OPTION_FIX_LOONGSON2F_NOP,
14246
    OPTION_NO_FIX_LOONGSON2F_NOP,
14247
    OPTION_FIX_VR4120,
14248
    OPTION_NO_FIX_VR4120,
14249
    OPTION_FIX_VR4130,
14250
    OPTION_NO_FIX_VR4130,
14251
    OPTION_FIX_CN63XXP1,
14252
    OPTION_NO_FIX_CN63XXP1,
14253
    OPTION_TRAP,
14254
    OPTION_BREAK,
14255
    OPTION_EB,
14256
    OPTION_EL,
14257
    OPTION_FP32,
14258
    OPTION_GP32,
14259
    OPTION_CONSTRUCT_FLOATS,
14260
    OPTION_NO_CONSTRUCT_FLOATS,
14261
    OPTION_FP64,
14262
    OPTION_GP64,
14263
    OPTION_RELAX_BRANCH,
14264
    OPTION_NO_RELAX_BRANCH,
14265
    OPTION_MSHARED,
14266
    OPTION_MNO_SHARED,
14267
    OPTION_MSYM32,
14268
    OPTION_MNO_SYM32,
14269
    OPTION_SOFT_FLOAT,
14270
    OPTION_HARD_FLOAT,
14271
    OPTION_SINGLE_FLOAT,
14272
    OPTION_DOUBLE_FLOAT,
14273
    OPTION_32,
14274
#ifdef OBJ_ELF
14275
    OPTION_CALL_SHARED,
14276
    OPTION_CALL_NONPIC,
14277
    OPTION_NON_SHARED,
14278
    OPTION_XGOT,
14279
    OPTION_MABI,
14280
    OPTION_N32,
14281
    OPTION_64,
14282
    OPTION_MDEBUG,
14283
    OPTION_NO_MDEBUG,
14284
    OPTION_PDR,
14285
    OPTION_NO_PDR,
14286
    OPTION_MVXWORKS_PIC,
14287
#endif /* OBJ_ELF */
14288
    OPTION_END_OF_ENUM
14289
  };
14290
 
14291
struct option md_longopts[] =
14292
{
14293
  /* Options which specify architecture.  */
14294
  {"march", required_argument, NULL, OPTION_MARCH},
14295
  {"mtune", required_argument, NULL, OPTION_MTUNE},
14296
  {"mips0", no_argument, NULL, OPTION_MIPS1},
14297
  {"mips1", no_argument, NULL, OPTION_MIPS1},
14298
  {"mips2", no_argument, NULL, OPTION_MIPS2},
14299
  {"mips3", no_argument, NULL, OPTION_MIPS3},
14300
  {"mips4", no_argument, NULL, OPTION_MIPS4},
14301
  {"mips5", no_argument, NULL, OPTION_MIPS5},
14302
  {"mips32", no_argument, NULL, OPTION_MIPS32},
14303
  {"mips64", no_argument, NULL, OPTION_MIPS64},
14304
  {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
14305
  {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
14306
 
14307
  /* Options which specify Application Specific Extensions (ASEs).  */
14308
  {"mips16", no_argument, NULL, OPTION_MIPS16},
14309
  {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
14310
  {"mips3d", no_argument, NULL, OPTION_MIPS3D},
14311
  {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
14312
  {"mdmx", no_argument, NULL, OPTION_MDMX},
14313
  {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
14314
  {"mdsp", no_argument, NULL, OPTION_DSP},
14315
  {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
14316
  {"mmt", no_argument, NULL, OPTION_MT},
14317
  {"mno-mt", no_argument, NULL, OPTION_NO_MT},
14318
  {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
14319
  {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
14320
  {"mdspr2", no_argument, NULL, OPTION_DSPR2},
14321
  {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
14322 160 khays
  {"mmicromips", no_argument, NULL, OPTION_MICROMIPS},
14323
  {"mno-micromips", no_argument, NULL, OPTION_NO_MICROMIPS},
14324
  {"mmcu", no_argument, NULL, OPTION_MCU},
14325
  {"mno-mcu", no_argument, NULL, OPTION_NO_MCU},
14326 16 khays
 
14327
  /* Old-style architecture options.  Don't add more of these.  */
14328
  {"m4650", no_argument, NULL, OPTION_M4650},
14329
  {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
14330
  {"m4010", no_argument, NULL, OPTION_M4010},
14331
  {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
14332
  {"m4100", no_argument, NULL, OPTION_M4100},
14333
  {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
14334
  {"m3900", no_argument, NULL, OPTION_M3900},
14335
  {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
14336
 
14337
  /* Options which enable bug fixes.  */
14338
  {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
14339
  {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
14340
  {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
14341
  {"mfix-loongson2f-jump", no_argument, NULL, OPTION_FIX_LOONGSON2F_JUMP},
14342
  {"mno-fix-loongson2f-jump", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_JUMP},
14343
  {"mfix-loongson2f-nop", no_argument, NULL, OPTION_FIX_LOONGSON2F_NOP},
14344
  {"mno-fix-loongson2f-nop", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_NOP},
14345
  {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
14346
  {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
14347
  {"mfix-vr4130",    no_argument, NULL, OPTION_FIX_VR4130},
14348
  {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
14349
  {"mfix-24k",    no_argument, NULL, OPTION_FIX_24K},
14350
  {"mno-fix-24k", no_argument, NULL, OPTION_NO_FIX_24K},
14351
  {"mfix-cn63xxp1", no_argument, NULL, OPTION_FIX_CN63XXP1},
14352
  {"mno-fix-cn63xxp1", no_argument, NULL, OPTION_NO_FIX_CN63XXP1},
14353
 
14354
  /* Miscellaneous options.  */
14355
  {"trap", no_argument, NULL, OPTION_TRAP},
14356
  {"no-break", no_argument, NULL, OPTION_TRAP},
14357
  {"break", no_argument, NULL, OPTION_BREAK},
14358
  {"no-trap", no_argument, NULL, OPTION_BREAK},
14359
  {"EB", no_argument, NULL, OPTION_EB},
14360
  {"EL", no_argument, NULL, OPTION_EL},
14361
  {"mfp32", no_argument, NULL, OPTION_FP32},
14362
  {"mgp32", no_argument, NULL, OPTION_GP32},
14363
  {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
14364
  {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
14365
  {"mfp64", no_argument, NULL, OPTION_FP64},
14366
  {"mgp64", no_argument, NULL, OPTION_GP64},
14367
  {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
14368
  {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
14369
  {"mshared", no_argument, NULL, OPTION_MSHARED},
14370
  {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
14371
  {"msym32", no_argument, NULL, OPTION_MSYM32},
14372
  {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
14373
  {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
14374
  {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
14375
  {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
14376
  {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
14377
 
14378
  /* Strictly speaking this next option is ELF specific,
14379
     but we allow it for other ports as well in order to
14380
     make testing easier.  */
14381
  {"32",          no_argument, NULL, OPTION_32},
14382
 
14383
  /* ELF-specific options.  */
14384
#ifdef OBJ_ELF
14385
  {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
14386
  {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
14387
  {"call_nonpic", no_argument, NULL, OPTION_CALL_NONPIC},
14388
  {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
14389
  {"xgot",        no_argument, NULL, OPTION_XGOT},
14390
  {"mabi", required_argument, NULL, OPTION_MABI},
14391
  {"n32",         no_argument, NULL, OPTION_N32},
14392
  {"64",          no_argument, NULL, OPTION_64},
14393
  {"mdebug", no_argument, NULL, OPTION_MDEBUG},
14394
  {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
14395
  {"mpdr", no_argument, NULL, OPTION_PDR},
14396
  {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
14397
  {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
14398
#endif /* OBJ_ELF */
14399
 
14400
  {NULL, no_argument, NULL, 0}
14401
};
14402
size_t md_longopts_size = sizeof (md_longopts);
14403
 
14404
/* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
14405
   NEW_VALUE.  Warn if another value was already specified.  Note:
14406
   we have to defer parsing the -march and -mtune arguments in order
14407
   to handle 'from-abi' correctly, since the ABI might be specified
14408
   in a later argument.  */
14409
 
14410
static void
14411
mips_set_option_string (const char **string_ptr, const char *new_value)
14412
{
14413
  if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
14414
    as_warn (_("A different %s was already specified, is now %s"),
14415
             string_ptr == &mips_arch_string ? "-march" : "-mtune",
14416
             new_value);
14417
 
14418
  *string_ptr = new_value;
14419
}
14420
 
14421
int
14422
md_parse_option (int c, char *arg)
14423
{
14424
  switch (c)
14425
    {
14426
    case OPTION_CONSTRUCT_FLOATS:
14427
      mips_disable_float_construction = 0;
14428
      break;
14429
 
14430
    case OPTION_NO_CONSTRUCT_FLOATS:
14431
      mips_disable_float_construction = 1;
14432
      break;
14433
 
14434
    case OPTION_TRAP:
14435
      mips_trap = 1;
14436
      break;
14437
 
14438
    case OPTION_BREAK:
14439
      mips_trap = 0;
14440
      break;
14441
 
14442
    case OPTION_EB:
14443
      target_big_endian = 1;
14444
      break;
14445
 
14446
    case OPTION_EL:
14447
      target_big_endian = 0;
14448
      break;
14449
 
14450
    case 'O':
14451
      if (arg == NULL)
14452
        mips_optimize = 1;
14453
      else if (arg[0] == '0')
14454
        mips_optimize = 0;
14455
      else if (arg[0] == '1')
14456
        mips_optimize = 1;
14457
      else
14458
        mips_optimize = 2;
14459
      break;
14460
 
14461
    case 'g':
14462
      if (arg == NULL)
14463
        mips_debug = 2;
14464
      else
14465
        mips_debug = atoi (arg);
14466
      break;
14467
 
14468
    case OPTION_MIPS1:
14469
      file_mips_isa = ISA_MIPS1;
14470
      break;
14471
 
14472
    case OPTION_MIPS2:
14473
      file_mips_isa = ISA_MIPS2;
14474
      break;
14475
 
14476
    case OPTION_MIPS3:
14477
      file_mips_isa = ISA_MIPS3;
14478
      break;
14479
 
14480
    case OPTION_MIPS4:
14481
      file_mips_isa = ISA_MIPS4;
14482
      break;
14483
 
14484
    case OPTION_MIPS5:
14485
      file_mips_isa = ISA_MIPS5;
14486
      break;
14487
 
14488
    case OPTION_MIPS32:
14489
      file_mips_isa = ISA_MIPS32;
14490
      break;
14491
 
14492
    case OPTION_MIPS32R2:
14493
      file_mips_isa = ISA_MIPS32R2;
14494
      break;
14495
 
14496
    case OPTION_MIPS64R2:
14497
      file_mips_isa = ISA_MIPS64R2;
14498
      break;
14499
 
14500
    case OPTION_MIPS64:
14501
      file_mips_isa = ISA_MIPS64;
14502
      break;
14503
 
14504
    case OPTION_MTUNE:
14505
      mips_set_option_string (&mips_tune_string, arg);
14506
      break;
14507
 
14508
    case OPTION_MARCH:
14509
      mips_set_option_string (&mips_arch_string, arg);
14510
      break;
14511
 
14512
    case OPTION_M4650:
14513
      mips_set_option_string (&mips_arch_string, "4650");
14514
      mips_set_option_string (&mips_tune_string, "4650");
14515
      break;
14516
 
14517
    case OPTION_NO_M4650:
14518
      break;
14519
 
14520
    case OPTION_M4010:
14521
      mips_set_option_string (&mips_arch_string, "4010");
14522
      mips_set_option_string (&mips_tune_string, "4010");
14523
      break;
14524
 
14525
    case OPTION_NO_M4010:
14526
      break;
14527
 
14528
    case OPTION_M4100:
14529
      mips_set_option_string (&mips_arch_string, "4100");
14530
      mips_set_option_string (&mips_tune_string, "4100");
14531
      break;
14532
 
14533
    case OPTION_NO_M4100:
14534
      break;
14535
 
14536
    case OPTION_M3900:
14537
      mips_set_option_string (&mips_arch_string, "3900");
14538
      mips_set_option_string (&mips_tune_string, "3900");
14539
      break;
14540
 
14541
    case OPTION_NO_M3900:
14542
      break;
14543
 
14544
    case OPTION_MDMX:
14545
      mips_opts.ase_mdmx = 1;
14546
      break;
14547
 
14548
    case OPTION_NO_MDMX:
14549
      mips_opts.ase_mdmx = 0;
14550
      break;
14551
 
14552
    case OPTION_DSP:
14553
      mips_opts.ase_dsp = 1;
14554
      mips_opts.ase_dspr2 = 0;
14555
      break;
14556
 
14557
    case OPTION_NO_DSP:
14558
      mips_opts.ase_dsp = 0;
14559
      mips_opts.ase_dspr2 = 0;
14560
      break;
14561
 
14562
    case OPTION_DSPR2:
14563
      mips_opts.ase_dspr2 = 1;
14564
      mips_opts.ase_dsp = 1;
14565
      break;
14566
 
14567
    case OPTION_NO_DSPR2:
14568
      mips_opts.ase_dspr2 = 0;
14569
      mips_opts.ase_dsp = 0;
14570
      break;
14571
 
14572
    case OPTION_MT:
14573
      mips_opts.ase_mt = 1;
14574
      break;
14575
 
14576
    case OPTION_NO_MT:
14577
      mips_opts.ase_mt = 0;
14578
      break;
14579
 
14580 160 khays
    case OPTION_MCU:
14581
      mips_opts.ase_mcu = 1;
14582
      break;
14583
 
14584
    case OPTION_NO_MCU:
14585
      mips_opts.ase_mcu = 0;
14586
      break;
14587
 
14588
    case OPTION_MICROMIPS:
14589
      if (mips_opts.mips16 == 1)
14590
        {
14591
          as_bad (_("-mmicromips cannot be used with -mips16"));
14592
          return 0;
14593
        }
14594
      mips_opts.micromips = 1;
14595
      mips_no_prev_insn ();
14596
      break;
14597
 
14598
    case OPTION_NO_MICROMIPS:
14599
      mips_opts.micromips = 0;
14600
      mips_no_prev_insn ();
14601
      break;
14602
 
14603 16 khays
    case OPTION_MIPS16:
14604 160 khays
      if (mips_opts.micromips == 1)
14605
        {
14606
          as_bad (_("-mips16 cannot be used with -micromips"));
14607
          return 0;
14608
        }
14609 16 khays
      mips_opts.mips16 = 1;
14610
      mips_no_prev_insn ();
14611
      break;
14612
 
14613
    case OPTION_NO_MIPS16:
14614
      mips_opts.mips16 = 0;
14615
      mips_no_prev_insn ();
14616
      break;
14617
 
14618
    case OPTION_MIPS3D:
14619
      mips_opts.ase_mips3d = 1;
14620
      break;
14621
 
14622
    case OPTION_NO_MIPS3D:
14623
      mips_opts.ase_mips3d = 0;
14624
      break;
14625
 
14626
    case OPTION_SMARTMIPS:
14627
      mips_opts.ase_smartmips = 1;
14628
      break;
14629
 
14630
    case OPTION_NO_SMARTMIPS:
14631
      mips_opts.ase_smartmips = 0;
14632
      break;
14633
 
14634
    case OPTION_FIX_24K:
14635
      mips_fix_24k = 1;
14636
      break;
14637
 
14638
    case OPTION_NO_FIX_24K:
14639
      mips_fix_24k = 0;
14640
      break;
14641
 
14642
    case OPTION_FIX_LOONGSON2F_JUMP:
14643
      mips_fix_loongson2f_jump = TRUE;
14644
      break;
14645
 
14646
    case OPTION_NO_FIX_LOONGSON2F_JUMP:
14647
      mips_fix_loongson2f_jump = FALSE;
14648
      break;
14649
 
14650
    case OPTION_FIX_LOONGSON2F_NOP:
14651
      mips_fix_loongson2f_nop = TRUE;
14652
      break;
14653
 
14654
    case OPTION_NO_FIX_LOONGSON2F_NOP:
14655
      mips_fix_loongson2f_nop = FALSE;
14656
      break;
14657
 
14658
    case OPTION_FIX_VR4120:
14659
      mips_fix_vr4120 = 1;
14660
      break;
14661
 
14662
    case OPTION_NO_FIX_VR4120:
14663
      mips_fix_vr4120 = 0;
14664
      break;
14665
 
14666
    case OPTION_FIX_VR4130:
14667
      mips_fix_vr4130 = 1;
14668
      break;
14669
 
14670
    case OPTION_NO_FIX_VR4130:
14671
      mips_fix_vr4130 = 0;
14672
      break;
14673
 
14674
    case OPTION_FIX_CN63XXP1:
14675
      mips_fix_cn63xxp1 = TRUE;
14676
      break;
14677
 
14678
    case OPTION_NO_FIX_CN63XXP1:
14679
      mips_fix_cn63xxp1 = FALSE;
14680
      break;
14681
 
14682
    case OPTION_RELAX_BRANCH:
14683
      mips_relax_branch = 1;
14684
      break;
14685
 
14686
    case OPTION_NO_RELAX_BRANCH:
14687
      mips_relax_branch = 0;
14688
      break;
14689
 
14690
    case OPTION_MSHARED:
14691
      mips_in_shared = TRUE;
14692
      break;
14693
 
14694
    case OPTION_MNO_SHARED:
14695
      mips_in_shared = FALSE;
14696
      break;
14697
 
14698
    case OPTION_MSYM32:
14699
      mips_opts.sym32 = TRUE;
14700
      break;
14701
 
14702
    case OPTION_MNO_SYM32:
14703
      mips_opts.sym32 = FALSE;
14704
      break;
14705
 
14706
#ifdef OBJ_ELF
14707
      /* When generating ELF code, we permit -KPIC and -call_shared to
14708
         select SVR4_PIC, and -non_shared to select no PIC.  This is
14709
         intended to be compatible with Irix 5.  */
14710
    case OPTION_CALL_SHARED:
14711
      if (!IS_ELF)
14712
        {
14713
          as_bad (_("-call_shared is supported only for ELF format"));
14714
          return 0;
14715
        }
14716
      mips_pic = SVR4_PIC;
14717
      mips_abicalls = TRUE;
14718
      break;
14719
 
14720
    case OPTION_CALL_NONPIC:
14721
      if (!IS_ELF)
14722
        {
14723
          as_bad (_("-call_nonpic is supported only for ELF format"));
14724
          return 0;
14725
        }
14726
      mips_pic = NO_PIC;
14727
      mips_abicalls = TRUE;
14728
      break;
14729
 
14730
    case OPTION_NON_SHARED:
14731
      if (!IS_ELF)
14732
        {
14733
          as_bad (_("-non_shared is supported only for ELF format"));
14734
          return 0;
14735
        }
14736
      mips_pic = NO_PIC;
14737
      mips_abicalls = FALSE;
14738
      break;
14739
 
14740
      /* The -xgot option tells the assembler to use 32 bit offsets
14741
         when accessing the got in SVR4_PIC mode.  It is for Irix
14742
         compatibility.  */
14743
    case OPTION_XGOT:
14744
      mips_big_got = 1;
14745
      break;
14746
#endif /* OBJ_ELF */
14747
 
14748
    case 'G':
14749
      g_switch_value = atoi (arg);
14750
      g_switch_seen = 1;
14751
      break;
14752
 
14753
      /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
14754
         and -mabi=64.  */
14755
    case OPTION_32:
14756
      if (IS_ELF)
14757
        mips_abi = O32_ABI;
14758
      /* We silently ignore -32 for non-ELF targets.  This greatly
14759
         simplifies the construction of the MIPS GAS test cases.  */
14760
      break;
14761
 
14762
#ifdef OBJ_ELF
14763
    case OPTION_N32:
14764
      if (!IS_ELF)
14765
        {
14766
          as_bad (_("-n32 is supported for ELF format only"));
14767
          return 0;
14768
        }
14769
      mips_abi = N32_ABI;
14770
      break;
14771
 
14772
    case OPTION_64:
14773
      if (!IS_ELF)
14774
        {
14775
          as_bad (_("-64 is supported for ELF format only"));
14776
          return 0;
14777
        }
14778
      mips_abi = N64_ABI;
14779
      if (!support_64bit_objects())
14780
        as_fatal (_("No compiled in support for 64 bit object file format"));
14781
      break;
14782
#endif /* OBJ_ELF */
14783
 
14784
    case OPTION_GP32:
14785
      file_mips_gp32 = 1;
14786
      break;
14787
 
14788
    case OPTION_GP64:
14789
      file_mips_gp32 = 0;
14790
      break;
14791
 
14792
    case OPTION_FP32:
14793
      file_mips_fp32 = 1;
14794
      break;
14795
 
14796
    case OPTION_FP64:
14797
      file_mips_fp32 = 0;
14798
      break;
14799
 
14800
    case OPTION_SINGLE_FLOAT:
14801
      file_mips_single_float = 1;
14802
      break;
14803
 
14804
    case OPTION_DOUBLE_FLOAT:
14805
      file_mips_single_float = 0;
14806
      break;
14807
 
14808
    case OPTION_SOFT_FLOAT:
14809
      file_mips_soft_float = 1;
14810
      break;
14811
 
14812
    case OPTION_HARD_FLOAT:
14813
      file_mips_soft_float = 0;
14814
      break;
14815
 
14816
#ifdef OBJ_ELF
14817
    case OPTION_MABI:
14818
      if (!IS_ELF)
14819
        {
14820
          as_bad (_("-mabi is supported for ELF format only"));
14821
          return 0;
14822
        }
14823
      if (strcmp (arg, "32") == 0)
14824
        mips_abi = O32_ABI;
14825
      else if (strcmp (arg, "o64") == 0)
14826
        mips_abi = O64_ABI;
14827
      else if (strcmp (arg, "n32") == 0)
14828
        mips_abi = N32_ABI;
14829
      else if (strcmp (arg, "64") == 0)
14830
        {
14831
          mips_abi = N64_ABI;
14832
          if (! support_64bit_objects())
14833
            as_fatal (_("No compiled in support for 64 bit object file "
14834
                        "format"));
14835
        }
14836
      else if (strcmp (arg, "eabi") == 0)
14837
        mips_abi = EABI_ABI;
14838
      else
14839
        {
14840
          as_fatal (_("invalid abi -mabi=%s"), arg);
14841
          return 0;
14842
        }
14843
      break;
14844
#endif /* OBJ_ELF */
14845
 
14846
    case OPTION_M7000_HILO_FIX:
14847
      mips_7000_hilo_fix = TRUE;
14848
      break;
14849
 
14850
    case OPTION_MNO_7000_HILO_FIX:
14851
      mips_7000_hilo_fix = FALSE;
14852
      break;
14853
 
14854
#ifdef OBJ_ELF
14855
    case OPTION_MDEBUG:
14856
      mips_flag_mdebug = TRUE;
14857
      break;
14858
 
14859
    case OPTION_NO_MDEBUG:
14860
      mips_flag_mdebug = FALSE;
14861
      break;
14862
 
14863
    case OPTION_PDR:
14864
      mips_flag_pdr = TRUE;
14865
      break;
14866
 
14867
    case OPTION_NO_PDR:
14868
      mips_flag_pdr = FALSE;
14869
      break;
14870
 
14871
    case OPTION_MVXWORKS_PIC:
14872
      mips_pic = VXWORKS_PIC;
14873
      break;
14874
#endif /* OBJ_ELF */
14875
 
14876
    default:
14877
      return 0;
14878
    }
14879
 
14880
    mips_fix_loongson2f = mips_fix_loongson2f_nop || mips_fix_loongson2f_jump;
14881
 
14882
  return 1;
14883
}
14884
 
14885
/* Set up globals to generate code for the ISA or processor
14886
   described by INFO.  */
14887
 
14888
static void
14889
mips_set_architecture (const struct mips_cpu_info *info)
14890
{
14891
  if (info != 0)
14892
    {
14893
      file_mips_arch = info->cpu;
14894
      mips_opts.arch = info->cpu;
14895
      mips_opts.isa = info->isa;
14896
    }
14897
}
14898
 
14899
 
14900
/* Likewise for tuning.  */
14901
 
14902
static void
14903
mips_set_tune (const struct mips_cpu_info *info)
14904
{
14905
  if (info != 0)
14906
    mips_tune = info->cpu;
14907
}
14908
 
14909
 
14910
void
14911
mips_after_parse_args (void)
14912
{
14913
  const struct mips_cpu_info *arch_info = 0;
14914
  const struct mips_cpu_info *tune_info = 0;
14915
 
14916
  /* GP relative stuff not working for PE */
14917
  if (strncmp (TARGET_OS, "pe", 2) == 0)
14918
    {
14919
      if (g_switch_seen && g_switch_value != 0)
14920
        as_bad (_("-G not supported in this configuration."));
14921
      g_switch_value = 0;
14922
    }
14923
 
14924
  if (mips_abi == NO_ABI)
14925
    mips_abi = MIPS_DEFAULT_ABI;
14926
 
14927
  /* The following code determines the architecture and register size.
14928
     Similar code was added to GCC 3.3 (see override_options() in
14929
     config/mips/mips.c).  The GAS and GCC code should be kept in sync
14930
     as much as possible.  */
14931
 
14932
  if (mips_arch_string != 0)
14933
    arch_info = mips_parse_cpu ("-march", mips_arch_string);
14934
 
14935
  if (file_mips_isa != ISA_UNKNOWN)
14936
    {
14937
      /* Handle -mipsN.  At this point, file_mips_isa contains the
14938
         ISA level specified by -mipsN, while arch_info->isa contains
14939
         the -march selection (if any).  */
14940
      if (arch_info != 0)
14941
        {
14942
          /* -march takes precedence over -mipsN, since it is more descriptive.
14943
             There's no harm in specifying both as long as the ISA levels
14944
             are the same.  */
14945
          if (file_mips_isa != arch_info->isa)
14946
            as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
14947
                    mips_cpu_info_from_isa (file_mips_isa)->name,
14948
                    mips_cpu_info_from_isa (arch_info->isa)->name);
14949
        }
14950
      else
14951
        arch_info = mips_cpu_info_from_isa (file_mips_isa);
14952
    }
14953
 
14954
  if (arch_info == 0)
14955
    arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
14956
 
14957
  if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
14958
    as_bad (_("-march=%s is not compatible with the selected ABI"),
14959
            arch_info->name);
14960
 
14961
  mips_set_architecture (arch_info);
14962
 
14963
  /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
14964
  if (mips_tune_string != 0)
14965
    tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
14966
 
14967
  if (tune_info == 0)
14968
    mips_set_tune (arch_info);
14969
  else
14970
    mips_set_tune (tune_info);
14971
 
14972
  if (file_mips_gp32 >= 0)
14973
    {
14974
      /* The user specified the size of the integer registers.  Make sure
14975
         it agrees with the ABI and ISA.  */
14976
      if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
14977
        as_bad (_("-mgp64 used with a 32-bit processor"));
14978
      else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
14979
        as_bad (_("-mgp32 used with a 64-bit ABI"));
14980
      else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
14981
        as_bad (_("-mgp64 used with a 32-bit ABI"));
14982
    }
14983
  else
14984
    {
14985
      /* Infer the integer register size from the ABI and processor.
14986
         Restrict ourselves to 32-bit registers if that's all the
14987
         processor has, or if the ABI cannot handle 64-bit registers.  */
14988
      file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
14989
                        || !ISA_HAS_64BIT_REGS (mips_opts.isa));
14990
    }
14991
 
14992
  switch (file_mips_fp32)
14993
    {
14994
    default:
14995
    case -1:
14996
      /* No user specified float register size.
14997
         ??? GAS treats single-float processors as though they had 64-bit
14998
         float registers (although it complains when double-precision
14999
         instructions are used).  As things stand, saying they have 32-bit
15000
         registers would lead to spurious "register must be even" messages.
15001
         So here we assume float registers are never smaller than the
15002
         integer ones.  */
15003
      if (file_mips_gp32 == 0)
15004
        /* 64-bit integer registers implies 64-bit float registers.  */
15005
        file_mips_fp32 = 0;
15006
      else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
15007
               && ISA_HAS_64BIT_FPRS (mips_opts.isa))
15008
        /* -mips3d and -mdmx imply 64-bit float registers, if possible.  */
15009
        file_mips_fp32 = 0;
15010
      else
15011
        /* 32-bit float registers.  */
15012
        file_mips_fp32 = 1;
15013
      break;
15014
 
15015
    /* The user specified the size of the float registers.  Check if it
15016
       agrees with the ABI and ISA.  */
15017
    case 0:
15018
      if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
15019
        as_bad (_("-mfp64 used with a 32-bit fpu"));
15020
      else if (ABI_NEEDS_32BIT_REGS (mips_abi)
15021
               && !ISA_HAS_MXHC1 (mips_opts.isa))
15022
        as_warn (_("-mfp64 used with a 32-bit ABI"));
15023
      break;
15024
    case 1:
15025
      if (ABI_NEEDS_64BIT_REGS (mips_abi))
15026
        as_warn (_("-mfp32 used with a 64-bit ABI"));
15027
      break;
15028
    }
15029
 
15030
  /* End of GCC-shared inference code.  */
15031
 
15032
  /* This flag is set when we have a 64-bit capable CPU but use only
15033
     32-bit wide registers.  Note that EABI does not use it.  */
15034
  if (ISA_HAS_64BIT_REGS (mips_opts.isa)
15035
      && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
15036
          || mips_abi == O32_ABI))
15037
    mips_32bitmode = 1;
15038
 
15039
  if (mips_opts.isa == ISA_MIPS1 && mips_trap)
15040
    as_bad (_("trap exception not supported at ISA 1"));
15041
 
15042
  /* If the selected architecture includes support for ASEs, enable
15043
     generation of code for them.  */
15044
  if (mips_opts.mips16 == -1)
15045
    mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
15046 160 khays
  if (mips_opts.micromips == -1)
15047
    mips_opts.micromips = (CPU_HAS_MICROMIPS (file_mips_arch)) ? 1 : 0;
15048 16 khays
  if (mips_opts.ase_mips3d == -1)
15049
    mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
15050
                            && file_mips_fp32 == 0) ? 1 : 0;
15051
  if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
15052
    as_bad (_("-mfp32 used with -mips3d"));
15053
 
15054
  if (mips_opts.ase_mdmx == -1)
15055
    mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
15056
                          && file_mips_fp32 == 0) ? 1 : 0;
15057
  if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
15058
    as_bad (_("-mfp32 used with -mdmx"));
15059
 
15060
  if (mips_opts.ase_smartmips == -1)
15061
    mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
15062
  if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
15063
    as_warn (_("%s ISA does not support SmartMIPS"),
15064
             mips_cpu_info_from_isa (mips_opts.isa)->name);
15065
 
15066
  if (mips_opts.ase_dsp == -1)
15067
    mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
15068
  if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
15069
    as_warn (_("%s ISA does not support DSP ASE"),
15070
             mips_cpu_info_from_isa (mips_opts.isa)->name);
15071
 
15072
  if (mips_opts.ase_dspr2 == -1)
15073
    {
15074
      mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
15075
      mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
15076
    }
15077
  if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
15078
    as_warn (_("%s ISA does not support DSP R2 ASE"),
15079
             mips_cpu_info_from_isa (mips_opts.isa)->name);
15080
 
15081
  if (mips_opts.ase_mt == -1)
15082
    mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
15083
  if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
15084
    as_warn (_("%s ISA does not support MT ASE"),
15085
             mips_cpu_info_from_isa (mips_opts.isa)->name);
15086
 
15087 160 khays
  if (mips_opts.ase_mcu == -1)
15088
    mips_opts.ase_mcu = (arch_info->flags & MIPS_CPU_ASE_MCU) ? 1 : 0;
15089
  if (mips_opts.ase_mcu && !ISA_SUPPORTS_MCU_ASE)
15090
      as_warn (_("%s ISA does not support MCU ASE"),
15091
               mips_cpu_info_from_isa (mips_opts.isa)->name);
15092
 
15093 16 khays
  file_mips_isa = mips_opts.isa;
15094
  file_ase_mips3d = mips_opts.ase_mips3d;
15095
  file_ase_mdmx = mips_opts.ase_mdmx;
15096
  file_ase_smartmips = mips_opts.ase_smartmips;
15097
  file_ase_dsp = mips_opts.ase_dsp;
15098
  file_ase_dspr2 = mips_opts.ase_dspr2;
15099
  file_ase_mt = mips_opts.ase_mt;
15100
  mips_opts.gp32 = file_mips_gp32;
15101
  mips_opts.fp32 = file_mips_fp32;
15102
  mips_opts.soft_float = file_mips_soft_float;
15103
  mips_opts.single_float = file_mips_single_float;
15104
 
15105
  if (mips_flag_mdebug < 0)
15106
    {
15107
#ifdef OBJ_MAYBE_ECOFF
15108
      if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
15109
        mips_flag_mdebug = 1;
15110
      else
15111
#endif /* OBJ_MAYBE_ECOFF */
15112
        mips_flag_mdebug = 0;
15113
    }
15114
}
15115
 
15116
void
15117
mips_init_after_args (void)
15118
{
15119
  /* initialize opcodes */
15120
  bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
15121
  mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
15122
}
15123
 
15124
long
15125
md_pcrel_from (fixS *fixP)
15126
{
15127
  valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
15128
  switch (fixP->fx_r_type)
15129
    {
15130 160 khays
    case BFD_RELOC_MICROMIPS_7_PCREL_S1:
15131
    case BFD_RELOC_MICROMIPS_10_PCREL_S1:
15132
      /* Return the address of the delay slot.  */
15133
      return addr + 2;
15134
 
15135
    case BFD_RELOC_MICROMIPS_16_PCREL_S1:
15136
    case BFD_RELOC_MICROMIPS_JMP:
15137 16 khays
    case BFD_RELOC_16_PCREL_S2:
15138
    case BFD_RELOC_MIPS_JMP:
15139
      /* Return the address of the delay slot.  */
15140
      return addr + 4;
15141 160 khays
 
15142 16 khays
    default:
15143
      /* We have no relocation type for PC relative MIPS16 instructions.  */
15144
      if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
15145
        as_bad_where (fixP->fx_file, fixP->fx_line,
15146
                      _("PC relative MIPS16 instruction references a different section"));
15147
      return addr;
15148
    }
15149
}
15150
 
15151
/* This is called before the symbol table is processed.  In order to
15152
   work with gcc when using mips-tfile, we must keep all local labels.
15153
   However, in other cases, we want to discard them.  If we were
15154
   called with -g, but we didn't see any debugging information, it may
15155
   mean that gcc is smuggling debugging information through to
15156
   mips-tfile, in which case we must generate all local labels.  */
15157
 
15158
void
15159
mips_frob_file_before_adjust (void)
15160
{
15161
#ifndef NO_ECOFF_DEBUGGING
15162
  if (ECOFF_DEBUGGING
15163
      && mips_debug != 0
15164
      && ! ecoff_debugging_seen)
15165
    flag_keep_locals = 1;
15166
#endif
15167
}
15168
 
15169
/* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
15170
   the corresponding LO16 reloc.  This is called before md_apply_fix and
15171
   tc_gen_reloc.  Unmatched relocs can only be generated by use of explicit
15172
   relocation operators.
15173
 
15174
   For our purposes, a %lo() expression matches a %got() or %hi()
15175
   expression if:
15176
 
15177
      (a) it refers to the same symbol; and
15178
      (b) the offset applied in the %lo() expression is no lower than
15179
          the offset applied in the %got() or %hi().
15180
 
15181
   (b) allows us to cope with code like:
15182
 
15183
        lui     $4,%hi(foo)
15184
        lh      $4,%lo(foo+2)($4)
15185
 
15186
   ...which is legal on RELA targets, and has a well-defined behaviour
15187
   if the user knows that adding 2 to "foo" will not induce a carry to
15188
   the high 16 bits.
15189
 
15190
   When several %lo()s match a particular %got() or %hi(), we use the
15191
   following rules to distinguish them:
15192
 
15193
     (1) %lo()s with smaller offsets are a better match than %lo()s with
15194
         higher offsets.
15195
 
15196
     (2) %lo()s with no matching %got() or %hi() are better than those
15197
         that already have a matching %got() or %hi().
15198
 
15199
     (3) later %lo()s are better than earlier %lo()s.
15200
 
15201
   These rules are applied in order.
15202
 
15203
   (1) means, among other things, that %lo()s with identical offsets are
15204
   chosen if they exist.
15205
 
15206
   (2) means that we won't associate several high-part relocations with
15207
   the same low-part relocation unless there's no alternative.  Having
15208
   several high parts for the same low part is a GNU extension; this rule
15209
   allows careful users to avoid it.
15210
 
15211
   (3) is purely cosmetic.  mips_hi_fixup_list is is in reverse order,
15212
   with the last high-part relocation being at the front of the list.
15213
   It therefore makes sense to choose the last matching low-part
15214
   relocation, all other things being equal.  It's also easier
15215
   to code that way.  */
15216
 
15217
void
15218
mips_frob_file (void)
15219
{
15220
  struct mips_hi_fixup *l;
15221
  bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
15222
 
15223
  for (l = mips_hi_fixup_list; l != NULL; l = l->next)
15224
    {
15225
      segment_info_type *seginfo;
15226
      bfd_boolean matched_lo_p;
15227
      fixS **hi_pos, **lo_pos, **pos;
15228
 
15229
      gas_assert (reloc_needs_lo_p (l->fixp->fx_r_type));
15230
 
15231
      /* If a GOT16 relocation turns out to be against a global symbol,
15232
         there isn't supposed to be a matching LO.  */
15233
      if (got16_reloc_p (l->fixp->fx_r_type)
15234
          && !pic_need_relax (l->fixp->fx_addsy, l->seg))
15235
        continue;
15236
 
15237
      /* Check quickly whether the next fixup happens to be a matching %lo.  */
15238
      if (fixup_has_matching_lo_p (l->fixp))
15239
        continue;
15240
 
15241
      seginfo = seg_info (l->seg);
15242
 
15243
      /* Set HI_POS to the position of this relocation in the chain.
15244
         Set LO_POS to the position of the chosen low-part relocation.
15245
         MATCHED_LO_P is true on entry to the loop if *POS is a low-part
15246
         relocation that matches an immediately-preceding high-part
15247
         relocation.  */
15248
      hi_pos = NULL;
15249
      lo_pos = NULL;
15250
      matched_lo_p = FALSE;
15251
      looking_for_rtype = matching_lo_reloc (l->fixp->fx_r_type);
15252
 
15253
      for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
15254
        {
15255
          if (*pos == l->fixp)
15256
            hi_pos = pos;
15257
 
15258
          if ((*pos)->fx_r_type == looking_for_rtype
15259
              && symbol_same_p ((*pos)->fx_addsy, l->fixp->fx_addsy)
15260
              && (*pos)->fx_offset >= l->fixp->fx_offset
15261
              && (lo_pos == NULL
15262
                  || (*pos)->fx_offset < (*lo_pos)->fx_offset
15263
                  || (!matched_lo_p
15264
                      && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
15265
            lo_pos = pos;
15266
 
15267
          matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
15268
                          && fixup_has_matching_lo_p (*pos));
15269
        }
15270
 
15271
      /* If we found a match, remove the high-part relocation from its
15272
         current position and insert it before the low-part relocation.
15273
         Make the offsets match so that fixup_has_matching_lo_p()
15274
         will return true.
15275
 
15276
         We don't warn about unmatched high-part relocations since some
15277
         versions of gcc have been known to emit dead "lui ...%hi(...)"
15278
         instructions.  */
15279
      if (lo_pos != NULL)
15280
        {
15281
          l->fixp->fx_offset = (*lo_pos)->fx_offset;
15282
          if (l->fixp->fx_next != *lo_pos)
15283
            {
15284
              *hi_pos = l->fixp->fx_next;
15285
              l->fixp->fx_next = *lo_pos;
15286
              *lo_pos = l->fixp;
15287
            }
15288
        }
15289
    }
15290
}
15291
 
15292
/* We may have combined relocations without symbols in the N32/N64 ABI.
15293
   We have to prevent gas from dropping them.  */
15294
 
15295
int
15296
mips_force_relocation (fixS *fixp)
15297
{
15298
  if (generic_force_reloc (fixp))
15299
    return 1;
15300
 
15301 160 khays
  /* We want to keep BFD_RELOC_MICROMIPS_*_PCREL_S1 relocation,
15302
     so that the linker relaxation can update targets.  */
15303
  if (fixp->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
15304
      || fixp->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
15305
      || fixp->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1)
15306
    return 1;
15307
 
15308 16 khays
  if (HAVE_NEWABI
15309
      && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
15310
      && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
15311
          || hi16_reloc_p (fixp->fx_r_type)
15312
          || lo16_reloc_p (fixp->fx_r_type)))
15313
    return 1;
15314
 
15315
  return 0;
15316
}
15317
 
15318
/* Apply a fixup to the object file.  */
15319
 
15320
void
15321
md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
15322
{
15323
  bfd_byte *buf;
15324
  long insn;
15325
  reloc_howto_type *howto;
15326
 
15327
  /* We ignore generic BFD relocations we don't know about.  */
15328
  howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
15329
  if (! howto)
15330
    return;
15331
 
15332 160 khays
  gas_assert (fixP->fx_size == 2
15333
              || fixP->fx_size == 4
15334 16 khays
              || fixP->fx_r_type == BFD_RELOC_16
15335
              || fixP->fx_r_type == BFD_RELOC_64
15336
              || fixP->fx_r_type == BFD_RELOC_CTOR
15337
              || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
15338 160 khays
              || fixP->fx_r_type == BFD_RELOC_MICROMIPS_SUB
15339 16 khays
              || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
15340
              || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
15341
              || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
15342
 
15343
  buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
15344
 
15345 160 khays
  gas_assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2
15346
              || fixP->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
15347
              || fixP->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
15348
              || fixP->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1);
15349 16 khays
 
15350
  /* Don't treat parts of a composite relocation as done.  There are two
15351
     reasons for this:
15352
 
15353
     (1) The second and third parts will be against 0 (RSS_UNDEF) but
15354
         should nevertheless be emitted if the first part is.
15355
 
15356
     (2) In normal usage, composite relocations are never assembly-time
15357
         constants.  The easiest way of dealing with the pathological
15358
         exceptions is to generate a relocation against STN_UNDEF and
15359
         leave everything up to the linker.  */
15360
  if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
15361
    fixP->fx_done = 1;
15362
 
15363
  switch (fixP->fx_r_type)
15364
    {
15365
    case BFD_RELOC_MIPS_TLS_GD:
15366
    case BFD_RELOC_MIPS_TLS_LDM:
15367
    case BFD_RELOC_MIPS_TLS_DTPREL32:
15368
    case BFD_RELOC_MIPS_TLS_DTPREL64:
15369
    case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
15370
    case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
15371
    case BFD_RELOC_MIPS_TLS_GOTTPREL:
15372
    case BFD_RELOC_MIPS_TLS_TPREL_HI16:
15373
    case BFD_RELOC_MIPS_TLS_TPREL_LO16:
15374 160 khays
    case BFD_RELOC_MICROMIPS_TLS_GD:
15375
    case BFD_RELOC_MICROMIPS_TLS_LDM:
15376
    case BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16:
15377
    case BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16:
15378
    case BFD_RELOC_MICROMIPS_TLS_GOTTPREL:
15379
    case BFD_RELOC_MICROMIPS_TLS_TPREL_HI16:
15380
    case BFD_RELOC_MICROMIPS_TLS_TPREL_LO16:
15381 16 khays
      S_SET_THREAD_LOCAL (fixP->fx_addsy);
15382
      /* fall through */
15383
 
15384
    case BFD_RELOC_MIPS_JMP:
15385
    case BFD_RELOC_MIPS_SHIFT5:
15386
    case BFD_RELOC_MIPS_SHIFT6:
15387
    case BFD_RELOC_MIPS_GOT_DISP:
15388
    case BFD_RELOC_MIPS_GOT_PAGE:
15389
    case BFD_RELOC_MIPS_GOT_OFST:
15390
    case BFD_RELOC_MIPS_SUB:
15391
    case BFD_RELOC_MIPS_INSERT_A:
15392
    case BFD_RELOC_MIPS_INSERT_B:
15393
    case BFD_RELOC_MIPS_DELETE:
15394
    case BFD_RELOC_MIPS_HIGHEST:
15395
    case BFD_RELOC_MIPS_HIGHER:
15396
    case BFD_RELOC_MIPS_SCN_DISP:
15397
    case BFD_RELOC_MIPS_REL16:
15398
    case BFD_RELOC_MIPS_RELGOT:
15399
    case BFD_RELOC_MIPS_JALR:
15400
    case BFD_RELOC_HI16:
15401
    case BFD_RELOC_HI16_S:
15402
    case BFD_RELOC_GPREL16:
15403
    case BFD_RELOC_MIPS_LITERAL:
15404
    case BFD_RELOC_MIPS_CALL16:
15405
    case BFD_RELOC_MIPS_GOT16:
15406
    case BFD_RELOC_GPREL32:
15407
    case BFD_RELOC_MIPS_GOT_HI16:
15408
    case BFD_RELOC_MIPS_GOT_LO16:
15409
    case BFD_RELOC_MIPS_CALL_HI16:
15410
    case BFD_RELOC_MIPS_CALL_LO16:
15411
    case BFD_RELOC_MIPS16_GPREL:
15412
    case BFD_RELOC_MIPS16_GOT16:
15413
    case BFD_RELOC_MIPS16_CALL16:
15414
    case BFD_RELOC_MIPS16_HI16:
15415
    case BFD_RELOC_MIPS16_HI16_S:
15416
    case BFD_RELOC_MIPS16_JMP:
15417 160 khays
    case BFD_RELOC_MICROMIPS_JMP:
15418
    case BFD_RELOC_MICROMIPS_GOT_DISP:
15419
    case BFD_RELOC_MICROMIPS_GOT_PAGE:
15420
    case BFD_RELOC_MICROMIPS_GOT_OFST:
15421
    case BFD_RELOC_MICROMIPS_SUB:
15422
    case BFD_RELOC_MICROMIPS_HIGHEST:
15423
    case BFD_RELOC_MICROMIPS_HIGHER:
15424
    case BFD_RELOC_MICROMIPS_SCN_DISP:
15425
    case BFD_RELOC_MICROMIPS_JALR:
15426
    case BFD_RELOC_MICROMIPS_HI16:
15427
    case BFD_RELOC_MICROMIPS_HI16_S:
15428
    case BFD_RELOC_MICROMIPS_GPREL16:
15429
    case BFD_RELOC_MICROMIPS_LITERAL:
15430
    case BFD_RELOC_MICROMIPS_CALL16:
15431
    case BFD_RELOC_MICROMIPS_GOT16:
15432
    case BFD_RELOC_MICROMIPS_GOT_HI16:
15433
    case BFD_RELOC_MICROMIPS_GOT_LO16:
15434
    case BFD_RELOC_MICROMIPS_CALL_HI16:
15435
    case BFD_RELOC_MICROMIPS_CALL_LO16:
15436 16 khays
      /* Nothing needed to do.  The value comes from the reloc entry.  */
15437
      break;
15438
 
15439
    case BFD_RELOC_64:
15440
      /* This is handled like BFD_RELOC_32, but we output a sign
15441
         extended value if we are only 32 bits.  */
15442
      if (fixP->fx_done)
15443
        {
15444
          if (8 <= sizeof (valueT))
15445
            md_number_to_chars ((char *) buf, *valP, 8);
15446
          else
15447
            {
15448
              valueT hiv;
15449
 
15450
              if ((*valP & 0x80000000) != 0)
15451
                hiv = 0xffffffff;
15452
              else
15453
                hiv = 0;
15454
              md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
15455
                                  *valP, 4);
15456
              md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
15457
                                  hiv, 4);
15458
            }
15459
        }
15460
      break;
15461
 
15462
    case BFD_RELOC_RVA:
15463
    case BFD_RELOC_32:
15464
    case BFD_RELOC_16:
15465
      /* If we are deleting this reloc entry, we must fill in the
15466
         value now.  This can happen if we have a .word which is not
15467
         resolved when it appears but is later defined.  */
15468
      if (fixP->fx_done)
15469
        md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
15470
      break;
15471
 
15472
    case BFD_RELOC_LO16:
15473
    case BFD_RELOC_MIPS16_LO16:
15474 160 khays
    case BFD_RELOC_MICROMIPS_LO16:
15475 16 khays
      /* FIXME: Now that embedded-PIC is gone, some of this code/comment
15476
         may be safe to remove, but if so it's not obvious.  */
15477
      /* When handling an embedded PIC switch statement, we can wind
15478
         up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
15479
      if (fixP->fx_done)
15480
        {
15481
          if (*valP + 0x8000 > 0xffff)
15482
            as_bad_where (fixP->fx_file, fixP->fx_line,
15483
                          _("relocation overflow"));
15484 160 khays
          /* 32-bit microMIPS instructions are divided into two halfwords.
15485
             Relocations always refer to the second halfword, regardless
15486
             of endianness.  */
15487
          if (target_big_endian || fixP->fx_r_type == BFD_RELOC_MICROMIPS_LO16)
15488 16 khays
            buf += 2;
15489
          md_number_to_chars ((char *) buf, *valP, 2);
15490
        }
15491
      break;
15492
 
15493
    case BFD_RELOC_16_PCREL_S2:
15494
      if ((*valP & 0x3) != 0)
15495
        as_bad_where (fixP->fx_file, fixP->fx_line,
15496
                      _("Branch to misaligned address (%lx)"), (long) *valP);
15497
 
15498
      /* We need to save the bits in the instruction since fixup_segment()
15499
         might be deleting the relocation entry (i.e., a branch within
15500
         the current segment).  */
15501
      if (! fixP->fx_done)
15502
        break;
15503
 
15504
      /* Update old instruction data.  */
15505
      if (target_big_endian)
15506
        insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
15507
      else
15508
        insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
15509
 
15510
      if (*valP + 0x20000 <= 0x3ffff)
15511
        {
15512
          insn |= (*valP >> 2) & 0xffff;
15513
          md_number_to_chars ((char *) buf, insn, 4);
15514
        }
15515
      else if (mips_pic == NO_PIC
15516
               && fixP->fx_done
15517
               && fixP->fx_frag->fr_address >= text_section->vma
15518
               && (fixP->fx_frag->fr_address
15519
                   < text_section->vma + bfd_get_section_size (text_section))
15520
               && ((insn & 0xffff0000) == 0x10000000     /* beq $0,$0 */
15521
                   || (insn & 0xffff0000) == 0x04010000  /* bgez $0 */
15522
                   || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
15523
        {
15524
          /* The branch offset is too large.  If this is an
15525
             unconditional branch, and we are not generating PIC code,
15526
             we can convert it to an absolute jump instruction.  */
15527
          if ((insn & 0xffff0000) == 0x04110000)         /* bgezal $0 */
15528
            insn = 0x0c000000;  /* jal */
15529
          else
15530
            insn = 0x08000000;  /* j */
15531
          fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
15532
          fixP->fx_done = 0;
15533
          fixP->fx_addsy = section_symbol (text_section);
15534
          *valP += md_pcrel_from (fixP);
15535
          md_number_to_chars ((char *) buf, insn, 4);
15536
        }
15537
      else
15538
        {
15539
          /* If we got here, we have branch-relaxation disabled,
15540
             and there's nothing we can do to fix this instruction
15541
             without turning it into a longer sequence.  */
15542
          as_bad_where (fixP->fx_file, fixP->fx_line,
15543
                        _("Branch out of range"));
15544
        }
15545
      break;
15546
 
15547 160 khays
    case BFD_RELOC_MICROMIPS_7_PCREL_S1:
15548
    case BFD_RELOC_MICROMIPS_10_PCREL_S1:
15549
    case BFD_RELOC_MICROMIPS_16_PCREL_S1:
15550
      /* We adjust the offset back to even.  */
15551
      if ((*valP & 0x1) != 0)
15552
        --(*valP);
15553
 
15554
      if (! fixP->fx_done)
15555
        break;
15556
 
15557
      /* Should never visit here, because we keep the relocation.  */
15558
      abort ();
15559
      break;
15560
 
15561 16 khays
    case BFD_RELOC_VTABLE_INHERIT:
15562
      fixP->fx_done = 0;
15563
      if (fixP->fx_addsy
15564
          && !S_IS_DEFINED (fixP->fx_addsy)
15565
          && !S_IS_WEAK (fixP->fx_addsy))
15566
        S_SET_WEAK (fixP->fx_addsy);
15567
      break;
15568
 
15569
    case BFD_RELOC_VTABLE_ENTRY:
15570
      fixP->fx_done = 0;
15571
      break;
15572
 
15573
    default:
15574
      internalError ();
15575
    }
15576
 
15577
  /* Remember value for tc_gen_reloc.  */
15578
  fixP->fx_addnumber = *valP;
15579
}
15580
 
15581
static symbolS *
15582
get_symbol (void)
15583
{
15584
  int c;
15585
  char *name;
15586
  symbolS *p;
15587
 
15588
  name = input_line_pointer;
15589
  c = get_symbol_end ();
15590
  p = (symbolS *) symbol_find_or_make (name);
15591
  *input_line_pointer = c;
15592
  return p;
15593
}
15594
 
15595
/* Align the current frag to a given power of two.  If a particular
15596
   fill byte should be used, FILL points to an integer that contains
15597
   that byte, otherwise FILL is null.
15598
 
15599
   The MIPS assembler also automatically adjusts any preceding
15600
   label.  */
15601
 
15602
static void
15603
mips_align (int to, int *fill, symbolS *label)
15604
{
15605
  mips_emit_delays ();
15606 160 khays
  mips_record_compressed_mode ();
15607 16 khays
  if (fill == NULL && subseg_text_p (now_seg))
15608
    frag_align_code (to, 0);
15609
  else
15610
    frag_align (to, fill ? *fill : 0, 0);
15611
  record_alignment (now_seg, to);
15612
  if (label != NULL)
15613
    {
15614
      gas_assert (S_GET_SEGMENT (label) == now_seg);
15615
      symbol_set_frag (label, frag_now);
15616
      S_SET_VALUE (label, (valueT) frag_now_fix ());
15617
    }
15618
}
15619
 
15620
/* Align to a given power of two.  .align 0 turns off the automatic
15621
   alignment used by the data creating pseudo-ops.  */
15622
 
15623
static void
15624
s_align (int x ATTRIBUTE_UNUSED)
15625
{
15626
  int temp, fill_value, *fill_ptr;
15627
  long max_alignment = 28;
15628
 
15629
  /* o Note that the assembler pulls down any immediately preceding label
15630
       to the aligned address.
15631
     o It's not documented but auto alignment is reinstated by
15632
       a .align pseudo instruction.
15633
     o Note also that after auto alignment is turned off the mips assembler
15634
       issues an error on attempt to assemble an improperly aligned data item.
15635
       We don't.  */
15636
 
15637
  temp = get_absolute_expression ();
15638
  if (temp > max_alignment)
15639
    as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
15640
  else if (temp < 0)
15641
    {
15642
      as_warn (_("Alignment negative: 0 assumed."));
15643
      temp = 0;
15644
    }
15645
  if (*input_line_pointer == ',')
15646
    {
15647
      ++input_line_pointer;
15648
      fill_value = get_absolute_expression ();
15649
      fill_ptr = &fill_value;
15650
    }
15651
  else
15652
    fill_ptr = 0;
15653
  if (temp)
15654
    {
15655
      segment_info_type *si = seg_info (now_seg);
15656
      struct insn_label_list *l = si->label_list;
15657
      /* Auto alignment should be switched on by next section change.  */
15658
      auto_align = 1;
15659
      mips_align (temp, fill_ptr, l != NULL ? l->label : NULL);
15660
    }
15661
  else
15662
    {
15663
      auto_align = 0;
15664
    }
15665
 
15666
  demand_empty_rest_of_line ();
15667
}
15668
 
15669
static void
15670
s_change_sec (int sec)
15671
{
15672
  segT seg;
15673
 
15674
#ifdef OBJ_ELF
15675
  /* The ELF backend needs to know that we are changing sections, so
15676
     that .previous works correctly.  We could do something like check
15677
     for an obj_section_change_hook macro, but that might be confusing
15678
     as it would not be appropriate to use it in the section changing
15679
     functions in read.c, since obj-elf.c intercepts those.  FIXME:
15680
     This should be cleaner, somehow.  */
15681
  if (IS_ELF)
15682
    obj_elf_section_change_hook ();
15683
#endif
15684
 
15685
  mips_emit_delays ();
15686
 
15687
  switch (sec)
15688
    {
15689
    case 't':
15690
      s_text (0);
15691
      break;
15692
    case 'd':
15693
      s_data (0);
15694
      break;
15695
    case 'b':
15696
      subseg_set (bss_section, (subsegT) get_absolute_expression ());
15697
      demand_empty_rest_of_line ();
15698
      break;
15699
 
15700
    case 'r':
15701
      seg = subseg_new (RDATA_SECTION_NAME,
15702
                        (subsegT) get_absolute_expression ());
15703
      if (IS_ELF)
15704
        {
15705
          bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
15706
                                                  | SEC_READONLY | SEC_RELOC
15707
                                                  | SEC_DATA));
15708
          if (strncmp (TARGET_OS, "elf", 3) != 0)
15709
            record_alignment (seg, 4);
15710
        }
15711
      demand_empty_rest_of_line ();
15712
      break;
15713
 
15714
    case 's':
15715
      seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
15716
      if (IS_ELF)
15717
        {
15718
          bfd_set_section_flags (stdoutput, seg,
15719
                                 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
15720
          if (strncmp (TARGET_OS, "elf", 3) != 0)
15721
            record_alignment (seg, 4);
15722
        }
15723
      demand_empty_rest_of_line ();
15724
      break;
15725
 
15726
    case 'B':
15727
      seg = subseg_new (".sbss", (subsegT) get_absolute_expression ());
15728
      if (IS_ELF)
15729
        {
15730
          bfd_set_section_flags (stdoutput, seg, SEC_ALLOC);
15731
          if (strncmp (TARGET_OS, "elf", 3) != 0)
15732
            record_alignment (seg, 4);
15733
        }
15734
      demand_empty_rest_of_line ();
15735
      break;
15736
    }
15737
 
15738
  auto_align = 1;
15739
}
15740
 
15741
void
15742
s_change_section (int ignore ATTRIBUTE_UNUSED)
15743
{
15744
#ifdef OBJ_ELF
15745
  char *section_name;
15746
  char c;
15747
  char next_c = 0;
15748
  int section_type;
15749
  int section_flag;
15750
  int section_entry_size;
15751
  int section_alignment;
15752
 
15753
  if (!IS_ELF)
15754
    return;
15755
 
15756
  section_name = input_line_pointer;
15757
  c = get_symbol_end ();
15758
  if (c)
15759
    next_c = *(input_line_pointer + 1);
15760
 
15761
  /* Do we have .section Name<,"flags">?  */
15762
  if (c != ',' || (c == ',' && next_c == '"'))
15763
    {
15764
      /* just after name is now '\0'.  */
15765
      *input_line_pointer = c;
15766
      input_line_pointer = section_name;
15767
      obj_elf_section (ignore);
15768
      return;
15769
    }
15770
  input_line_pointer++;
15771
 
15772
  /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
15773
  if (c == ',')
15774
    section_type = get_absolute_expression ();
15775
  else
15776
    section_type = 0;
15777
  if (*input_line_pointer++ == ',')
15778
    section_flag = get_absolute_expression ();
15779
  else
15780
    section_flag = 0;
15781
  if (*input_line_pointer++ == ',')
15782
    section_entry_size = get_absolute_expression ();
15783
  else
15784
    section_entry_size = 0;
15785
  if (*input_line_pointer++ == ',')
15786
    section_alignment = get_absolute_expression ();
15787
  else
15788
    section_alignment = 0;
15789
  /* FIXME: really ignore?  */
15790
  (void) section_alignment;
15791
 
15792
  section_name = xstrdup (section_name);
15793
 
15794
  /* When using the generic form of .section (as implemented by obj-elf.c),
15795
     there's no way to set the section type to SHT_MIPS_DWARF.  Users have
15796
     traditionally had to fall back on the more common @progbits instead.
15797
 
15798
     There's nothing really harmful in this, since bfd will correct
15799
     SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
15800
     means that, for backwards compatibility, the special_section entries
15801
     for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
15802
 
15803
     Even so, we shouldn't force users of the MIPS .section syntax to
15804
     incorrectly label the sections as SHT_PROGBITS.  The best compromise
15805
     seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
15806
     generic type-checking code.  */
15807
  if (section_type == SHT_MIPS_DWARF)
15808
    section_type = SHT_PROGBITS;
15809
 
15810
  obj_elf_change_section (section_name, section_type, section_flag,
15811
                          section_entry_size, 0, 0, 0);
15812
 
15813
  if (now_seg->name != section_name)
15814
    free (section_name);
15815
#endif /* OBJ_ELF */
15816
}
15817
 
15818
void
15819
mips_enable_auto_align (void)
15820
{
15821
  auto_align = 1;
15822
}
15823
 
15824
static void
15825
s_cons (int log_size)
15826
{
15827
  segment_info_type *si = seg_info (now_seg);
15828
  struct insn_label_list *l = si->label_list;
15829
  symbolS *label;
15830
 
15831
  label = l != NULL ? l->label : NULL;
15832
  mips_emit_delays ();
15833
  if (log_size > 0 && auto_align)
15834
    mips_align (log_size, 0, label);
15835
  cons (1 << log_size);
15836
  mips_clear_insn_labels ();
15837
}
15838
 
15839
static void
15840
s_float_cons (int type)
15841
{
15842
  segment_info_type *si = seg_info (now_seg);
15843
  struct insn_label_list *l = si->label_list;
15844
  symbolS *label;
15845
 
15846
  label = l != NULL ? l->label : NULL;
15847
 
15848
  mips_emit_delays ();
15849
 
15850
  if (auto_align)
15851
    {
15852
      if (type == 'd')
15853
        mips_align (3, 0, label);
15854
      else
15855
        mips_align (2, 0, label);
15856
    }
15857
 
15858
  float_cons (type);
15859
  mips_clear_insn_labels ();
15860
}
15861
 
15862
/* Handle .globl.  We need to override it because on Irix 5 you are
15863
   permitted to say
15864
       .globl foo .text
15865
   where foo is an undefined symbol, to mean that foo should be
15866
   considered to be the address of a function.  */
15867
 
15868
static void
15869
s_mips_globl (int x ATTRIBUTE_UNUSED)
15870
{
15871
  char *name;
15872
  int c;
15873
  symbolS *symbolP;
15874
  flagword flag;
15875
 
15876
  do
15877
    {
15878
      name = input_line_pointer;
15879
      c = get_symbol_end ();
15880
      symbolP = symbol_find_or_make (name);
15881
      S_SET_EXTERNAL (symbolP);
15882
 
15883
      *input_line_pointer = c;
15884
      SKIP_WHITESPACE ();
15885
 
15886
      /* On Irix 5, every global symbol that is not explicitly labelled as
15887
         being a function is apparently labelled as being an object.  */
15888
      flag = BSF_OBJECT;
15889
 
15890
      if (!is_end_of_line[(unsigned char) *input_line_pointer]
15891
          && (*input_line_pointer != ','))
15892
        {
15893
          char *secname;
15894
          asection *sec;
15895
 
15896
          secname = input_line_pointer;
15897
          c = get_symbol_end ();
15898
          sec = bfd_get_section_by_name (stdoutput, secname);
15899
          if (sec == NULL)
15900
            as_bad (_("%s: no such section"), secname);
15901
          *input_line_pointer = c;
15902
 
15903
          if (sec != NULL && (sec->flags & SEC_CODE) != 0)
15904
            flag = BSF_FUNCTION;
15905
        }
15906
 
15907
      symbol_get_bfdsym (symbolP)->flags |= flag;
15908
 
15909
      c = *input_line_pointer;
15910
      if (c == ',')
15911
        {
15912
          input_line_pointer++;
15913
          SKIP_WHITESPACE ();
15914
          if (is_end_of_line[(unsigned char) *input_line_pointer])
15915
            c = '\n';
15916
        }
15917
    }
15918
  while (c == ',');
15919
 
15920
  demand_empty_rest_of_line ();
15921
}
15922
 
15923
static void
15924
s_option (int x ATTRIBUTE_UNUSED)
15925
{
15926
  char *opt;
15927
  char c;
15928
 
15929
  opt = input_line_pointer;
15930
  c = get_symbol_end ();
15931
 
15932
  if (*opt == 'O')
15933
    {
15934
      /* FIXME: What does this mean?  */
15935
    }
15936
  else if (strncmp (opt, "pic", 3) == 0)
15937
    {
15938
      int i;
15939
 
15940
      i = atoi (opt + 3);
15941
      if (i == 0)
15942
        mips_pic = NO_PIC;
15943
      else if (i == 2)
15944
        {
15945 163 khays
          mips_pic = SVR4_PIC;
15946 16 khays
          mips_abicalls = TRUE;
15947
        }
15948
      else
15949
        as_bad (_(".option pic%d not supported"), i);
15950
 
15951
      if (mips_pic == SVR4_PIC)
15952
        {
15953
          if (g_switch_seen && g_switch_value != 0)
15954
            as_warn (_("-G may not be used with SVR4 PIC code"));
15955
          g_switch_value = 0;
15956
          bfd_set_gp_size (stdoutput, 0);
15957
        }
15958
    }
15959
  else
15960
    as_warn (_("Unrecognized option \"%s\""), opt);
15961
 
15962
  *input_line_pointer = c;
15963
  demand_empty_rest_of_line ();
15964
}
15965
 
15966
/* This structure is used to hold a stack of .set values.  */
15967
 
15968
struct mips_option_stack
15969
{
15970
  struct mips_option_stack *next;
15971
  struct mips_set_options options;
15972
};
15973
 
15974
static struct mips_option_stack *mips_opts_stack;
15975
 
15976
/* Handle the .set pseudo-op.  */
15977
 
15978
static void
15979
s_mipsset (int x ATTRIBUTE_UNUSED)
15980
{
15981
  char *name = input_line_pointer, ch;
15982
 
15983
  while (!is_end_of_line[(unsigned char) *input_line_pointer])
15984
    ++input_line_pointer;
15985
  ch = *input_line_pointer;
15986
  *input_line_pointer = '\0';
15987
 
15988
  if (strcmp (name, "reorder") == 0)
15989
    {
15990
      if (mips_opts.noreorder)
15991
        end_noreorder ();
15992
    }
15993
  else if (strcmp (name, "noreorder") == 0)
15994
    {
15995
      if (!mips_opts.noreorder)
15996
        start_noreorder ();
15997
    }
15998
  else if (strncmp (name, "at=", 3) == 0)
15999
    {
16000
      char *s = name + 3;
16001
 
16002
      if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
16003
        as_bad (_("Unrecognized register name `%s'"), s);
16004
    }
16005
  else if (strcmp (name, "at") == 0)
16006
    {
16007
      mips_opts.at = ATREG;
16008
    }
16009
  else if (strcmp (name, "noat") == 0)
16010
    {
16011
      mips_opts.at = ZERO;
16012
    }
16013
  else if (strcmp (name, "macro") == 0)
16014
    {
16015
      mips_opts.warn_about_macros = 0;
16016
    }
16017
  else if (strcmp (name, "nomacro") == 0)
16018
    {
16019
      if (mips_opts.noreorder == 0)
16020
        as_bad (_("`noreorder' must be set before `nomacro'"));
16021
      mips_opts.warn_about_macros = 1;
16022
    }
16023
  else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
16024
    {
16025
      mips_opts.nomove = 0;
16026
    }
16027
  else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
16028
    {
16029
      mips_opts.nomove = 1;
16030
    }
16031
  else if (strcmp (name, "bopt") == 0)
16032
    {
16033
      mips_opts.nobopt = 0;
16034
    }
16035
  else if (strcmp (name, "nobopt") == 0)
16036
    {
16037
      mips_opts.nobopt = 1;
16038
    }
16039
  else if (strcmp (name, "gp=default") == 0)
16040
    mips_opts.gp32 = file_mips_gp32;
16041
  else if (strcmp (name, "gp=32") == 0)
16042
    mips_opts.gp32 = 1;
16043
  else if (strcmp (name, "gp=64") == 0)
16044
    {
16045
      if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
16046
        as_warn (_("%s isa does not support 64-bit registers"),
16047
                 mips_cpu_info_from_isa (mips_opts.isa)->name);
16048
      mips_opts.gp32 = 0;
16049
    }
16050
  else if (strcmp (name, "fp=default") == 0)
16051
    mips_opts.fp32 = file_mips_fp32;
16052
  else if (strcmp (name, "fp=32") == 0)
16053
    mips_opts.fp32 = 1;
16054
  else if (strcmp (name, "fp=64") == 0)
16055
    {
16056
      if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
16057
        as_warn (_("%s isa does not support 64-bit floating point registers"),
16058
                 mips_cpu_info_from_isa (mips_opts.isa)->name);
16059
      mips_opts.fp32 = 0;
16060
    }
16061
  else if (strcmp (name, "softfloat") == 0)
16062
    mips_opts.soft_float = 1;
16063
  else if (strcmp (name, "hardfloat") == 0)
16064
    mips_opts.soft_float = 0;
16065
  else if (strcmp (name, "singlefloat") == 0)
16066
    mips_opts.single_float = 1;
16067
  else if (strcmp (name, "doublefloat") == 0)
16068
    mips_opts.single_float = 0;
16069
  else if (strcmp (name, "mips16") == 0
16070
           || strcmp (name, "MIPS-16") == 0)
16071 160 khays
    {
16072
      if (mips_opts.micromips == 1)
16073
        as_fatal (_("`mips16' cannot be used with `micromips'"));
16074
      mips_opts.mips16 = 1;
16075
    }
16076 16 khays
  else if (strcmp (name, "nomips16") == 0
16077
           || strcmp (name, "noMIPS-16") == 0)
16078
    mips_opts.mips16 = 0;
16079 160 khays
  else if (strcmp (name, "micromips") == 0)
16080
    {
16081
      if (mips_opts.mips16 == 1)
16082
        as_fatal (_("`micromips' cannot be used with `mips16'"));
16083
      mips_opts.micromips = 1;
16084
    }
16085
  else if (strcmp (name, "nomicromips") == 0)
16086
    mips_opts.micromips = 0;
16087 16 khays
  else if (strcmp (name, "smartmips") == 0)
16088
    {
16089
      if (!ISA_SUPPORTS_SMARTMIPS)
16090
        as_warn (_("%s ISA does not support SmartMIPS ASE"),
16091
                 mips_cpu_info_from_isa (mips_opts.isa)->name);
16092
      mips_opts.ase_smartmips = 1;
16093
    }
16094
  else if (strcmp (name, "nosmartmips") == 0)
16095
    mips_opts.ase_smartmips = 0;
16096
  else if (strcmp (name, "mips3d") == 0)
16097
    mips_opts.ase_mips3d = 1;
16098
  else if (strcmp (name, "nomips3d") == 0)
16099
    mips_opts.ase_mips3d = 0;
16100
  else if (strcmp (name, "mdmx") == 0)
16101
    mips_opts.ase_mdmx = 1;
16102
  else if (strcmp (name, "nomdmx") == 0)
16103
    mips_opts.ase_mdmx = 0;
16104
  else if (strcmp (name, "dsp") == 0)
16105
    {
16106
      if (!ISA_SUPPORTS_DSP_ASE)
16107
        as_warn (_("%s ISA does not support DSP ASE"),
16108
                 mips_cpu_info_from_isa (mips_opts.isa)->name);
16109
      mips_opts.ase_dsp = 1;
16110
      mips_opts.ase_dspr2 = 0;
16111
    }
16112
  else if (strcmp (name, "nodsp") == 0)
16113
    {
16114
      mips_opts.ase_dsp = 0;
16115
      mips_opts.ase_dspr2 = 0;
16116
    }
16117
  else if (strcmp (name, "dspr2") == 0)
16118
    {
16119
      if (!ISA_SUPPORTS_DSPR2_ASE)
16120
        as_warn (_("%s ISA does not support DSP R2 ASE"),
16121
                 mips_cpu_info_from_isa (mips_opts.isa)->name);
16122
      mips_opts.ase_dspr2 = 1;
16123
      mips_opts.ase_dsp = 1;
16124
    }
16125
  else if (strcmp (name, "nodspr2") == 0)
16126
    {
16127
      mips_opts.ase_dspr2 = 0;
16128
      mips_opts.ase_dsp = 0;
16129
    }
16130
  else if (strcmp (name, "mt") == 0)
16131
    {
16132
      if (!ISA_SUPPORTS_MT_ASE)
16133
        as_warn (_("%s ISA does not support MT ASE"),
16134
                 mips_cpu_info_from_isa (mips_opts.isa)->name);
16135
      mips_opts.ase_mt = 1;
16136
    }
16137
  else if (strcmp (name, "nomt") == 0)
16138
    mips_opts.ase_mt = 0;
16139 160 khays
  else if (strcmp (name, "mcu") == 0)
16140
    mips_opts.ase_mcu = 1;
16141
  else if (strcmp (name, "nomcu") == 0)
16142
    mips_opts.ase_mcu = 0;
16143 16 khays
  else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
16144
    {
16145
      int reset = 0;
16146
 
16147
      /* Permit the user to change the ISA and architecture on the fly.
16148
         Needless to say, misuse can cause serious problems.  */
16149
      if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
16150
        {
16151
          reset = 1;
16152
          mips_opts.isa = file_mips_isa;
16153
          mips_opts.arch = file_mips_arch;
16154
        }
16155
      else if (strncmp (name, "arch=", 5) == 0)
16156
        {
16157
          const struct mips_cpu_info *p;
16158
 
16159
          p = mips_parse_cpu("internal use", name + 5);
16160
          if (!p)
16161
            as_bad (_("unknown architecture %s"), name + 5);
16162
          else
16163
            {
16164
              mips_opts.arch = p->cpu;
16165
              mips_opts.isa = p->isa;
16166
            }
16167
        }
16168
      else if (strncmp (name, "mips", 4) == 0)
16169
        {
16170
          const struct mips_cpu_info *p;
16171
 
16172
          p = mips_parse_cpu("internal use", name);
16173
          if (!p)
16174
            as_bad (_("unknown ISA level %s"), name + 4);
16175
          else
16176
            {
16177
              mips_opts.arch = p->cpu;
16178
              mips_opts.isa = p->isa;
16179
            }
16180
        }
16181
      else
16182
        as_bad (_("unknown ISA or architecture %s"), name);
16183
 
16184
      switch (mips_opts.isa)
16185
        {
16186
        case  0:
16187
          break;
16188
        case ISA_MIPS1:
16189
        case ISA_MIPS2:
16190
        case ISA_MIPS32:
16191
        case ISA_MIPS32R2:
16192
          mips_opts.gp32 = 1;
16193
          mips_opts.fp32 = 1;
16194
          break;
16195
        case ISA_MIPS3:
16196
        case ISA_MIPS4:
16197
        case ISA_MIPS5:
16198
        case ISA_MIPS64:
16199
        case ISA_MIPS64R2:
16200
          mips_opts.gp32 = 0;
16201
          mips_opts.fp32 = 0;
16202
          break;
16203
        default:
16204
          as_bad (_("unknown ISA level %s"), name + 4);
16205
          break;
16206
        }
16207
      if (reset)
16208
        {
16209
          mips_opts.gp32 = file_mips_gp32;
16210
          mips_opts.fp32 = file_mips_fp32;
16211
        }
16212
    }
16213
  else if (strcmp (name, "autoextend") == 0)
16214
    mips_opts.noautoextend = 0;
16215
  else if (strcmp (name, "noautoextend") == 0)
16216
    mips_opts.noautoextend = 1;
16217
  else if (strcmp (name, "push") == 0)
16218
    {
16219
      struct mips_option_stack *s;
16220
 
16221
      s = (struct mips_option_stack *) xmalloc (sizeof *s);
16222
      s->next = mips_opts_stack;
16223
      s->options = mips_opts;
16224
      mips_opts_stack = s;
16225
    }
16226
  else if (strcmp (name, "pop") == 0)
16227
    {
16228
      struct mips_option_stack *s;
16229
 
16230
      s = mips_opts_stack;
16231
      if (s == NULL)
16232
        as_bad (_(".set pop with no .set push"));
16233
      else
16234
        {
16235
          /* If we're changing the reorder mode we need to handle
16236
             delay slots correctly.  */
16237
          if (s->options.noreorder && ! mips_opts.noreorder)
16238
            start_noreorder ();
16239
          else if (! s->options.noreorder && mips_opts.noreorder)
16240
            end_noreorder ();
16241
 
16242
          mips_opts = s->options;
16243
          mips_opts_stack = s->next;
16244
          free (s);
16245
        }
16246
    }
16247
  else if (strcmp (name, "sym32") == 0)
16248
    mips_opts.sym32 = TRUE;
16249
  else if (strcmp (name, "nosym32") == 0)
16250
    mips_opts.sym32 = FALSE;
16251
  else if (strchr (name, ','))
16252
    {
16253
      /* Generic ".set" directive; use the generic handler.  */
16254
      *input_line_pointer = ch;
16255
      input_line_pointer = name;
16256
      s_set (0);
16257
      return;
16258
    }
16259
  else
16260
    {
16261
      as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
16262
    }
16263
  *input_line_pointer = ch;
16264
  demand_empty_rest_of_line ();
16265
}
16266
 
16267
/* Handle the .abicalls pseudo-op.  I believe this is equivalent to
16268
   .option pic2.  It means to generate SVR4 PIC calls.  */
16269
 
16270
static void
16271
s_abicalls (int ignore ATTRIBUTE_UNUSED)
16272
{
16273
  mips_pic = SVR4_PIC;
16274
  mips_abicalls = TRUE;
16275
 
16276
  if (g_switch_seen && g_switch_value != 0)
16277
    as_warn (_("-G may not be used with SVR4 PIC code"));
16278
  g_switch_value = 0;
16279
 
16280
  bfd_set_gp_size (stdoutput, 0);
16281
  demand_empty_rest_of_line ();
16282
}
16283
 
16284
/* Handle the .cpload pseudo-op.  This is used when generating SVR4
16285
   PIC code.  It sets the $gp register for the function based on the
16286
   function address, which is in the register named in the argument.
16287
   This uses a relocation against _gp_disp, which is handled specially
16288
   by the linker.  The result is:
16289
        lui     $gp,%hi(_gp_disp)
16290
        addiu   $gp,$gp,%lo(_gp_disp)
16291
        addu    $gp,$gp,.cpload argument
16292
   The .cpload argument is normally $25 == $t9.
16293
 
16294
   The -mno-shared option changes this to:
16295
        lui     $gp,%hi(__gnu_local_gp)
16296
        addiu   $gp,$gp,%lo(__gnu_local_gp)
16297
   and the argument is ignored.  This saves an instruction, but the
16298
   resulting code is not position independent; it uses an absolute
16299
   address for __gnu_local_gp.  Thus code assembled with -mno-shared
16300
   can go into an ordinary executable, but not into a shared library.  */
16301
 
16302
static void
16303
s_cpload (int ignore ATTRIBUTE_UNUSED)
16304
{
16305
  expressionS ex;
16306
  int reg;
16307
  int in_shared;
16308
 
16309
  /* If we are not generating SVR4 PIC code, or if this is NewABI code,
16310
     .cpload is ignored.  */
16311
  if (mips_pic != SVR4_PIC || HAVE_NEWABI)
16312
    {
16313
      s_ignore (0);
16314
      return;
16315
    }
16316
 
16317
  /* .cpload should be in a .set noreorder section.  */
16318
  if (mips_opts.noreorder == 0)
16319
    as_warn (_(".cpload not in noreorder section"));
16320
 
16321
  reg = tc_get_register (0);
16322
 
16323
  /* If we need to produce a 64-bit address, we are better off using
16324
     the default instruction sequence.  */
16325
  in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
16326
 
16327
  ex.X_op = O_symbol;
16328
  ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
16329
                                         "__gnu_local_gp");
16330
  ex.X_op_symbol = NULL;
16331
  ex.X_add_number = 0;
16332
 
16333
  /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
16334
  symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
16335
 
16336
  macro_start ();
16337
  macro_build_lui (&ex, mips_gp_register);
16338
  macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
16339
               mips_gp_register, BFD_RELOC_LO16);
16340
  if (in_shared)
16341
    macro_build (NULL, "addu", "d,v,t", mips_gp_register,
16342
                 mips_gp_register, reg);
16343
  macro_end ();
16344
 
16345
  demand_empty_rest_of_line ();
16346
}
16347
 
16348
/* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
16349
     .cpsetup $reg1, offset|$reg2, label
16350
 
16351
   If offset is given, this results in:
16352
     sd         $gp, offset($sp)
16353
     lui        $gp, %hi(%neg(%gp_rel(label)))
16354
     addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
16355
     daddu      $gp, $gp, $reg1
16356
 
16357
   If $reg2 is given, this results in:
16358
     daddu      $reg2, $gp, $0
16359
     lui        $gp, %hi(%neg(%gp_rel(label)))
16360
     addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
16361
     daddu      $gp, $gp, $reg1
16362
   $reg1 is normally $25 == $t9.
16363
 
16364
   The -mno-shared option replaces the last three instructions with
16365
        lui     $gp,%hi(_gp)
16366
        addiu   $gp,$gp,%lo(_gp)  */
16367
 
16368
static void
16369
s_cpsetup (int ignore ATTRIBUTE_UNUSED)
16370
{
16371
  expressionS ex_off;
16372
  expressionS ex_sym;
16373
  int reg1;
16374
 
16375
  /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
16376
     We also need NewABI support.  */
16377
  if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16378
    {
16379
      s_ignore (0);
16380
      return;
16381
    }
16382
 
16383
  reg1 = tc_get_register (0);
16384
  SKIP_WHITESPACE ();
16385
  if (*input_line_pointer != ',')
16386
    {
16387
      as_bad (_("missing argument separator ',' for .cpsetup"));
16388
      return;
16389
    }
16390
  else
16391
    ++input_line_pointer;
16392
  SKIP_WHITESPACE ();
16393
  if (*input_line_pointer == '$')
16394
    {
16395
      mips_cpreturn_register = tc_get_register (0);
16396
      mips_cpreturn_offset = -1;
16397
    }
16398
  else
16399
    {
16400
      mips_cpreturn_offset = get_absolute_expression ();
16401
      mips_cpreturn_register = -1;
16402
    }
16403
  SKIP_WHITESPACE ();
16404
  if (*input_line_pointer != ',')
16405
    {
16406
      as_bad (_("missing argument separator ',' for .cpsetup"));
16407
      return;
16408
    }
16409
  else
16410
    ++input_line_pointer;
16411
  SKIP_WHITESPACE ();
16412
  expression (&ex_sym);
16413
 
16414
  macro_start ();
16415
  if (mips_cpreturn_register == -1)
16416
    {
16417
      ex_off.X_op = O_constant;
16418
      ex_off.X_add_symbol = NULL;
16419
      ex_off.X_op_symbol = NULL;
16420
      ex_off.X_add_number = mips_cpreturn_offset;
16421
 
16422
      macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
16423
                   BFD_RELOC_LO16, SP);
16424
    }
16425
  else
16426
    macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
16427
                 mips_gp_register, 0);
16428
 
16429
  if (mips_in_shared || HAVE_64BIT_SYMBOLS)
16430
    {
16431 160 khays
      macro_build (&ex_sym, "lui", LUI_FMT, mips_gp_register,
16432 16 khays
                   -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
16433
                   BFD_RELOC_HI16_S);
16434
 
16435
      macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
16436
                   mips_gp_register, -1, BFD_RELOC_GPREL16,
16437
                   BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
16438
 
16439
      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
16440
                   mips_gp_register, reg1);
16441
    }
16442
  else
16443
    {
16444
      expressionS ex;
16445
 
16446
      ex.X_op = O_symbol;
16447
      ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
16448
      ex.X_op_symbol = NULL;
16449
      ex.X_add_number = 0;
16450
 
16451
      /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
16452
      symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
16453
 
16454
      macro_build_lui (&ex, mips_gp_register);
16455
      macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
16456
                   mips_gp_register, BFD_RELOC_LO16);
16457
    }
16458
 
16459
  macro_end ();
16460
 
16461
  demand_empty_rest_of_line ();
16462
}
16463
 
16464
static void
16465
s_cplocal (int ignore ATTRIBUTE_UNUSED)
16466
{
16467
  /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
16468
     .cplocal is ignored.  */
16469
  if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16470
    {
16471
      s_ignore (0);
16472
      return;
16473
    }
16474
 
16475
  mips_gp_register = tc_get_register (0);
16476
  demand_empty_rest_of_line ();
16477
}
16478
 
16479
/* Handle the .cprestore pseudo-op.  This stores $gp into a given
16480
   offset from $sp.  The offset is remembered, and after making a PIC
16481
   call $gp is restored from that location.  */
16482
 
16483
static void
16484
s_cprestore (int ignore ATTRIBUTE_UNUSED)
16485
{
16486
  expressionS ex;
16487
 
16488
  /* If we are not generating SVR4 PIC code, or if this is NewABI code,
16489
     .cprestore is ignored.  */
16490
  if (mips_pic != SVR4_PIC || HAVE_NEWABI)
16491
    {
16492
      s_ignore (0);
16493
      return;
16494
    }
16495
 
16496
  mips_cprestore_offset = get_absolute_expression ();
16497
  mips_cprestore_valid = 1;
16498
 
16499
  ex.X_op = O_constant;
16500
  ex.X_add_symbol = NULL;
16501
  ex.X_op_symbol = NULL;
16502
  ex.X_add_number = mips_cprestore_offset;
16503
 
16504
  macro_start ();
16505
  macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
16506
                                SP, HAVE_64BIT_ADDRESSES);
16507
  macro_end ();
16508
 
16509
  demand_empty_rest_of_line ();
16510
}
16511
 
16512
/* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
16513
   was given in the preceding .cpsetup, it results in:
16514
     ld         $gp, offset($sp)
16515
 
16516
   If a register $reg2 was given there, it results in:
16517
     daddu      $gp, $reg2, $0  */
16518
 
16519
static void
16520
s_cpreturn (int ignore ATTRIBUTE_UNUSED)
16521
{
16522
  expressionS ex;
16523
 
16524
  /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
16525
     We also need NewABI support.  */
16526
  if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16527
    {
16528
      s_ignore (0);
16529
      return;
16530
    }
16531
 
16532
  macro_start ();
16533
  if (mips_cpreturn_register == -1)
16534
    {
16535
      ex.X_op = O_constant;
16536
      ex.X_add_symbol = NULL;
16537
      ex.X_op_symbol = NULL;
16538
      ex.X_add_number = mips_cpreturn_offset;
16539
 
16540
      macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
16541
    }
16542
  else
16543
    macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
16544
                 mips_cpreturn_register, 0);
16545
  macro_end ();
16546
 
16547
  demand_empty_rest_of_line ();
16548
}
16549
 
16550
/* Handle the .dtprelword and .dtpreldword pseudo-ops.  They generate
16551
   a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
16552
   use in DWARF debug information.  */
16553
 
16554
static void
16555
s_dtprel_internal (size_t bytes)
16556
{
16557
  expressionS ex;
16558
  char *p;
16559
 
16560
  expression (&ex);
16561
 
16562
  if (ex.X_op != O_symbol)
16563
    {
16564
      as_bad (_("Unsupported use of %s"), (bytes == 8
16565
                                           ? ".dtpreldword"
16566
                                           : ".dtprelword"));
16567
      ignore_rest_of_line ();
16568
    }
16569
 
16570
  p = frag_more (bytes);
16571
  md_number_to_chars (p, 0, bytes);
16572
  fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
16573
               (bytes == 8
16574
                ? BFD_RELOC_MIPS_TLS_DTPREL64
16575
                : BFD_RELOC_MIPS_TLS_DTPREL32));
16576
 
16577
  demand_empty_rest_of_line ();
16578
}
16579
 
16580
/* Handle .dtprelword.  */
16581
 
16582
static void
16583
s_dtprelword (int ignore ATTRIBUTE_UNUSED)
16584
{
16585
  s_dtprel_internal (4);
16586
}
16587
 
16588
/* Handle .dtpreldword.  */
16589
 
16590
static void
16591
s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
16592
{
16593
  s_dtprel_internal (8);
16594
}
16595
 
16596
/* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
16597
   code.  It sets the offset to use in gp_rel relocations.  */
16598
 
16599
static void
16600
s_gpvalue (int ignore ATTRIBUTE_UNUSED)
16601
{
16602
  /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
16603
     We also need NewABI support.  */
16604
  if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16605
    {
16606
      s_ignore (0);
16607
      return;
16608
    }
16609
 
16610
  mips_gprel_offset = get_absolute_expression ();
16611
 
16612
  demand_empty_rest_of_line ();
16613
}
16614
 
16615
/* Handle the .gpword pseudo-op.  This is used when generating PIC
16616
   code.  It generates a 32 bit GP relative reloc.  */
16617
 
16618
static void
16619
s_gpword (int ignore ATTRIBUTE_UNUSED)
16620
{
16621
  segment_info_type *si;
16622
  struct insn_label_list *l;
16623
  symbolS *label;
16624
  expressionS ex;
16625
  char *p;
16626
 
16627
  /* When not generating PIC code, this is treated as .word.  */
16628
  if (mips_pic != SVR4_PIC)
16629
    {
16630
      s_cons (2);
16631
      return;
16632
    }
16633
 
16634
  si = seg_info (now_seg);
16635
  l = si->label_list;
16636
  label = l != NULL ? l->label : NULL;
16637
  mips_emit_delays ();
16638
  if (auto_align)
16639
    mips_align (2, 0, label);
16640
 
16641
  expression (&ex);
16642
  mips_clear_insn_labels ();
16643
 
16644
  if (ex.X_op != O_symbol || ex.X_add_number != 0)
16645
    {
16646
      as_bad (_("Unsupported use of .gpword"));
16647
      ignore_rest_of_line ();
16648
    }
16649
 
16650
  p = frag_more (4);
16651
  md_number_to_chars (p, 0, 4);
16652
  fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
16653
               BFD_RELOC_GPREL32);
16654
 
16655
  demand_empty_rest_of_line ();
16656
}
16657
 
16658
static void
16659
s_gpdword (int ignore ATTRIBUTE_UNUSED)
16660
{
16661
  segment_info_type *si;
16662
  struct insn_label_list *l;
16663
  symbolS *label;
16664
  expressionS ex;
16665
  char *p;
16666
 
16667
  /* When not generating PIC code, this is treated as .dword.  */
16668
  if (mips_pic != SVR4_PIC)
16669
    {
16670
      s_cons (3);
16671
      return;
16672
    }
16673
 
16674
  si = seg_info (now_seg);
16675
  l = si->label_list;
16676
  label = l != NULL ? l->label : NULL;
16677
  mips_emit_delays ();
16678
  if (auto_align)
16679
    mips_align (3, 0, label);
16680
 
16681
  expression (&ex);
16682
  mips_clear_insn_labels ();
16683
 
16684
  if (ex.X_op != O_symbol || ex.X_add_number != 0)
16685
    {
16686
      as_bad (_("Unsupported use of .gpdword"));
16687
      ignore_rest_of_line ();
16688
    }
16689
 
16690
  p = frag_more (8);
16691
  md_number_to_chars (p, 0, 8);
16692
  fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
16693
               BFD_RELOC_GPREL32)->fx_tcbit = 1;
16694
 
16695
  /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
16696
  fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
16697
           FALSE, BFD_RELOC_64)->fx_tcbit = 1;
16698
 
16699
  demand_empty_rest_of_line ();
16700
}
16701
 
16702
/* Handle the .cpadd pseudo-op.  This is used when dealing with switch
16703
   tables in SVR4 PIC code.  */
16704
 
16705
static void
16706
s_cpadd (int ignore ATTRIBUTE_UNUSED)
16707
{
16708
  int reg;
16709
 
16710
  /* This is ignored when not generating SVR4 PIC code.  */
16711
  if (mips_pic != SVR4_PIC)
16712
    {
16713
      s_ignore (0);
16714
      return;
16715
    }
16716
 
16717
  /* Add $gp to the register named as an argument.  */
16718
  macro_start ();
16719
  reg = tc_get_register (0);
16720
  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
16721
  macro_end ();
16722
 
16723
  demand_empty_rest_of_line ();
16724
}
16725
 
16726
/* Handle the .insn pseudo-op.  This marks instruction labels in
16727 160 khays
   mips16/micromips mode.  This permits the linker to handle them specially,
16728 16 khays
   such as generating jalx instructions when needed.  We also make
16729
   them odd for the duration of the assembly, in order to generate the
16730
   right sort of code.  We will make them even in the adjust_symtab
16731
   routine, while leaving them marked.  This is convenient for the
16732
   debugger and the disassembler.  The linker knows to make them odd
16733
   again.  */
16734
 
16735
static void
16736
s_insn (int ignore ATTRIBUTE_UNUSED)
16737
{
16738 160 khays
  mips_mark_labels ();
16739 16 khays
 
16740
  demand_empty_rest_of_line ();
16741
}
16742
 
16743
/* Handle a .stabn directive.  We need these in order to mark a label
16744
   as being a mips16 text label correctly.  Sometimes the compiler
16745
   will emit a label, followed by a .stabn, and then switch sections.
16746
   If the label and .stabn are in mips16 mode, then the label is
16747
   really a mips16 text label.  */
16748
 
16749
static void
16750
s_mips_stab (int type)
16751
{
16752
  if (type == 'n')
16753 160 khays
    mips_mark_labels ();
16754 16 khays
 
16755
  s_stab (type);
16756
}
16757
 
16758
/* Handle the .weakext pseudo-op as defined in Kane and Heinrich.  */
16759
 
16760
static void
16761
s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
16762
{
16763
  char *name;
16764
  int c;
16765
  symbolS *symbolP;
16766
  expressionS exp;
16767
 
16768
  name = input_line_pointer;
16769
  c = get_symbol_end ();
16770
  symbolP = symbol_find_or_make (name);
16771
  S_SET_WEAK (symbolP);
16772
  *input_line_pointer = c;
16773
 
16774
  SKIP_WHITESPACE ();
16775
 
16776
  if (! is_end_of_line[(unsigned char) *input_line_pointer])
16777
    {
16778
      if (S_IS_DEFINED (symbolP))
16779
        {
16780
          as_bad (_("ignoring attempt to redefine symbol %s"),
16781
                  S_GET_NAME (symbolP));
16782
          ignore_rest_of_line ();
16783
          return;
16784
        }
16785
 
16786
      if (*input_line_pointer == ',')
16787
        {
16788
          ++input_line_pointer;
16789
          SKIP_WHITESPACE ();
16790
        }
16791
 
16792
      expression (&exp);
16793
      if (exp.X_op != O_symbol)
16794
        {
16795
          as_bad (_("bad .weakext directive"));
16796
          ignore_rest_of_line ();
16797
          return;
16798
        }
16799
      symbol_set_value_expression (symbolP, &exp);
16800
    }
16801
 
16802
  demand_empty_rest_of_line ();
16803
}
16804
 
16805
/* Parse a register string into a number.  Called from the ECOFF code
16806
   to parse .frame.  The argument is non-zero if this is the frame
16807
   register, so that we can record it in mips_frame_reg.  */
16808
 
16809
int
16810
tc_get_register (int frame)
16811
{
16812
  unsigned int reg;
16813
 
16814
  SKIP_WHITESPACE ();
16815
  if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
16816
    reg = 0;
16817
  if (frame)
16818
    {
16819
      mips_frame_reg = reg != 0 ? reg : SP;
16820
      mips_frame_reg_valid = 1;
16821
      mips_cprestore_valid = 0;
16822
    }
16823
  return reg;
16824
}
16825
 
16826
valueT
16827
md_section_align (asection *seg, valueT addr)
16828
{
16829
  int align = bfd_get_section_alignment (stdoutput, seg);
16830
 
16831
  if (IS_ELF)
16832
    {
16833
      /* We don't need to align ELF sections to the full alignment.
16834
         However, Irix 5 may prefer that we align them at least to a 16
16835
         byte boundary.  We don't bother to align the sections if we
16836
         are targeted for an embedded system.  */
16837
      if (strncmp (TARGET_OS, "elf", 3) == 0)
16838
        return addr;
16839
      if (align > 4)
16840
        align = 4;
16841
    }
16842
 
16843
  return ((addr + (1 << align) - 1) & (-1 << align));
16844
}
16845
 
16846
/* Utility routine, called from above as well.  If called while the
16847
   input file is still being read, it's only an approximation.  (For
16848
   example, a symbol may later become defined which appeared to be
16849
   undefined earlier.)  */
16850
 
16851
static int
16852
nopic_need_relax (symbolS *sym, int before_relaxing)
16853
{
16854
  if (sym == 0)
16855
    return 0;
16856
 
16857
  if (g_switch_value > 0)
16858
    {
16859
      const char *symname;
16860
      int change;
16861
 
16862
      /* Find out whether this symbol can be referenced off the $gp
16863
         register.  It can be if it is smaller than the -G size or if
16864
         it is in the .sdata or .sbss section.  Certain symbols can
16865
         not be referenced off the $gp, although it appears as though
16866
         they can.  */
16867
      symname = S_GET_NAME (sym);
16868
      if (symname != (const char *) NULL
16869
          && (strcmp (symname, "eprol") == 0
16870
              || strcmp (symname, "etext") == 0
16871
              || strcmp (symname, "_gp") == 0
16872
              || strcmp (symname, "edata") == 0
16873
              || strcmp (symname, "_fbss") == 0
16874
              || strcmp (symname, "_fdata") == 0
16875
              || strcmp (symname, "_ftext") == 0
16876
              || strcmp (symname, "end") == 0
16877
              || strcmp (symname, "_gp_disp") == 0))
16878
        change = 1;
16879
      else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
16880
               && (0
16881
#ifndef NO_ECOFF_DEBUGGING
16882
                   || (symbol_get_obj (sym)->ecoff_extern_size != 0
16883
                       && (symbol_get_obj (sym)->ecoff_extern_size
16884
                           <= g_switch_value))
16885
#endif
16886
                   /* We must defer this decision until after the whole
16887
                      file has been read, since there might be a .extern
16888
                      after the first use of this symbol.  */
16889
                   || (before_relaxing
16890
#ifndef NO_ECOFF_DEBUGGING
16891
                       && symbol_get_obj (sym)->ecoff_extern_size == 0
16892
#endif
16893
                       && S_GET_VALUE (sym) == 0)
16894
                   || (S_GET_VALUE (sym) != 0
16895
                       && S_GET_VALUE (sym) <= g_switch_value)))
16896
        change = 0;
16897
      else
16898
        {
16899
          const char *segname;
16900
 
16901
          segname = segment_name (S_GET_SEGMENT (sym));
16902
          gas_assert (strcmp (segname, ".lit8") != 0
16903
                  && strcmp (segname, ".lit4") != 0);
16904
          change = (strcmp (segname, ".sdata") != 0
16905
                    && strcmp (segname, ".sbss") != 0
16906
                    && strncmp (segname, ".sdata.", 7) != 0
16907
                    && strncmp (segname, ".sbss.", 6) != 0
16908
                    && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
16909
                    && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
16910
        }
16911
      return change;
16912
    }
16913
  else
16914
    /* We are not optimizing for the $gp register.  */
16915
    return 1;
16916
}
16917
 
16918
 
16919
/* Return true if the given symbol should be considered local for SVR4 PIC.  */
16920
 
16921
static bfd_boolean
16922
pic_need_relax (symbolS *sym, asection *segtype)
16923
{
16924
  asection *symsec;
16925
 
16926
  /* Handle the case of a symbol equated to another symbol.  */
16927
  while (symbol_equated_reloc_p (sym))
16928
    {
16929
      symbolS *n;
16930
 
16931
      /* It's possible to get a loop here in a badly written program.  */
16932
      n = symbol_get_value_expression (sym)->X_add_symbol;
16933
      if (n == sym)
16934
        break;
16935
      sym = n;
16936
    }
16937
 
16938
  if (symbol_section_p (sym))
16939
    return TRUE;
16940
 
16941
  symsec = S_GET_SEGMENT (sym);
16942
 
16943
  /* This must duplicate the test in adjust_reloc_syms.  */
16944
  return (symsec != &bfd_und_section
16945
          && symsec != &bfd_abs_section
16946
          && !bfd_is_com_section (symsec)
16947
          && !s_is_linkonce (sym, segtype)
16948
#ifdef OBJ_ELF
16949
          /* A global or weak symbol is treated as external.  */
16950
          && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
16951
#endif
16952
          );
16953
}
16954
 
16955
 
16956
/* Given a mips16 variant frag FRAGP, return non-zero if it needs an
16957
   extended opcode.  SEC is the section the frag is in.  */
16958
 
16959
static int
16960
mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
16961
{
16962
  int type;
16963
  const struct mips16_immed_operand *op;
16964
  offsetT val;
16965
  int mintiny, maxtiny;
16966
  segT symsec;
16967
  fragS *sym_frag;
16968
 
16969
  if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
16970
    return 0;
16971
  if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
16972
    return 1;
16973
 
16974
  type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
16975
  op = mips16_immed_operands;
16976
  while (op->type != type)
16977
    {
16978
      ++op;
16979
      gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
16980
    }
16981
 
16982
  if (op->unsp)
16983
    {
16984
      if (type == '<' || type == '>' || type == '[' || type == ']')
16985
        {
16986
          mintiny = 1;
16987
          maxtiny = 1 << op->nbits;
16988
        }
16989
      else
16990
        {
16991
          mintiny = 0;
16992
          maxtiny = (1 << op->nbits) - 1;
16993
        }
16994
    }
16995
  else
16996
    {
16997
      mintiny = - (1 << (op->nbits - 1));
16998
      maxtiny = (1 << (op->nbits - 1)) - 1;
16999
    }
17000
 
17001
  sym_frag = symbol_get_frag (fragp->fr_symbol);
17002
  val = S_GET_VALUE (fragp->fr_symbol);
17003
  symsec = S_GET_SEGMENT (fragp->fr_symbol);
17004
 
17005
  if (op->pcrel)
17006
    {
17007
      addressT addr;
17008
 
17009
      /* We won't have the section when we are called from
17010
         mips_relax_frag.  However, we will always have been called
17011
         from md_estimate_size_before_relax first.  If this is a
17012
         branch to a different section, we mark it as such.  If SEC is
17013
         NULL, and the frag is not marked, then it must be a branch to
17014
         the same section.  */
17015
      if (sec == NULL)
17016
        {
17017
          if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
17018
            return 1;
17019
        }
17020
      else
17021
        {
17022
          /* Must have been called from md_estimate_size_before_relax.  */
17023
          if (symsec != sec)
17024
            {
17025
              fragp->fr_subtype =
17026
                RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17027
 
17028
              /* FIXME: We should support this, and let the linker
17029
                 catch branches and loads that are out of range.  */
17030
              as_bad_where (fragp->fr_file, fragp->fr_line,
17031
                            _("unsupported PC relative reference to different section"));
17032
 
17033
              return 1;
17034
            }
17035
          if (fragp != sym_frag && sym_frag->fr_address == 0)
17036
            /* Assume non-extended on the first relaxation pass.
17037
               The address we have calculated will be bogus if this is
17038
               a forward branch to another frag, as the forward frag
17039
               will have fr_address == 0.  */
17040
            return 0;
17041
        }
17042
 
17043
      /* In this case, we know for sure that the symbol fragment is in
17044
         the same section.  If the relax_marker of the symbol fragment
17045
         differs from the relax_marker of this fragment, we have not
17046
         yet adjusted the symbol fragment fr_address.  We want to add
17047
         in STRETCH in order to get a better estimate of the address.
17048
         This particularly matters because of the shift bits.  */
17049
      if (stretch != 0
17050
          && sym_frag->relax_marker != fragp->relax_marker)
17051
        {
17052
          fragS *f;
17053
 
17054
          /* Adjust stretch for any alignment frag.  Note that if have
17055
             been expanding the earlier code, the symbol may be
17056
             defined in what appears to be an earlier frag.  FIXME:
17057
             This doesn't handle the fr_subtype field, which specifies
17058
             a maximum number of bytes to skip when doing an
17059
             alignment.  */
17060
          for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
17061
            {
17062
              if (f->fr_type == rs_align || f->fr_type == rs_align_code)
17063
                {
17064
                  if (stretch < 0)
17065
                    stretch = - ((- stretch)
17066
                                 & ~ ((1 << (int) f->fr_offset) - 1));
17067
                  else
17068
                    stretch &= ~ ((1 << (int) f->fr_offset) - 1);
17069
                  if (stretch == 0)
17070
                    break;
17071
                }
17072
            }
17073
          if (f != NULL)
17074
            val += stretch;
17075
        }
17076
 
17077
      addr = fragp->fr_address + fragp->fr_fix;
17078
 
17079
      /* The base address rules are complicated.  The base address of
17080
         a branch is the following instruction.  The base address of a
17081
         PC relative load or add is the instruction itself, but if it
17082
         is in a delay slot (in which case it can not be extended) use
17083
         the address of the instruction whose delay slot it is in.  */
17084
      if (type == 'p' || type == 'q')
17085
        {
17086
          addr += 2;
17087
 
17088
          /* If we are currently assuming that this frag should be
17089
             extended, then, the current address is two bytes
17090
             higher.  */
17091
          if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
17092
            addr += 2;
17093
 
17094
          /* Ignore the low bit in the target, since it will be set
17095
             for a text label.  */
17096
          if ((val & 1) != 0)
17097
            --val;
17098
        }
17099
      else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
17100
        addr -= 4;
17101
      else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
17102
        addr -= 2;
17103
 
17104
      val -= addr & ~ ((1 << op->shift) - 1);
17105
 
17106
      /* Branch offsets have an implicit 0 in the lowest bit.  */
17107
      if (type == 'p' || type == 'q')
17108
        val /= 2;
17109
 
17110
      /* If any of the shifted bits are set, we must use an extended
17111
         opcode.  If the address depends on the size of this
17112
         instruction, this can lead to a loop, so we arrange to always
17113
         use an extended opcode.  We only check this when we are in
17114
         the main relaxation loop, when SEC is NULL.  */
17115
      if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
17116
        {
17117
          fragp->fr_subtype =
17118
            RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17119
          return 1;
17120
        }
17121
 
17122
      /* If we are about to mark a frag as extended because the value
17123
         is precisely maxtiny + 1, then there is a chance of an
17124
         infinite loop as in the following code:
17125
             la $4,foo
17126
             .skip      1020
17127
             .align     2
17128
           foo:
17129
         In this case when the la is extended, foo is 0x3fc bytes
17130
         away, so the la can be shrunk, but then foo is 0x400 away, so
17131
         the la must be extended.  To avoid this loop, we mark the
17132
         frag as extended if it was small, and is about to become
17133
         extended with a value of maxtiny + 1.  */
17134
      if (val == ((maxtiny + 1) << op->shift)
17135
          && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
17136
          && sec == NULL)
17137
        {
17138
          fragp->fr_subtype =
17139
            RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17140
          return 1;
17141
        }
17142
    }
17143
  else if (symsec != absolute_section && sec != NULL)
17144
    as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
17145
 
17146
  if ((val & ((1 << op->shift) - 1)) != 0
17147
      || val < (mintiny << op->shift)
17148
      || val > (maxtiny << op->shift))
17149
    return 1;
17150
  else
17151
    return 0;
17152
}
17153
 
17154
/* Compute the length of a branch sequence, and adjust the
17155
   RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
17156
   worst-case length is computed, with UPDATE being used to indicate
17157
   whether an unconditional (-1), branch-likely (+1) or regular (0)
17158
   branch is to be computed.  */
17159
static int
17160
relaxed_branch_length (fragS *fragp, asection *sec, int update)
17161
{
17162
  bfd_boolean toofar;
17163
  int length;
17164
 
17165
  if (fragp
17166
      && S_IS_DEFINED (fragp->fr_symbol)
17167
      && sec == S_GET_SEGMENT (fragp->fr_symbol))
17168
    {
17169
      addressT addr;
17170
      offsetT val;
17171
 
17172
      val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17173
 
17174
      addr = fragp->fr_address + fragp->fr_fix + 4;
17175
 
17176
      val -= addr;
17177
 
17178
      toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
17179
    }
17180
  else if (fragp)
17181
    /* If the symbol is not defined or it's in a different segment,
17182
       assume the user knows what's going on and emit a short
17183
       branch.  */
17184
    toofar = FALSE;
17185
  else
17186
    toofar = TRUE;
17187
 
17188
  if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
17189
    fragp->fr_subtype
17190
      = RELAX_BRANCH_ENCODE (RELAX_BRANCH_AT (fragp->fr_subtype),
17191
                             RELAX_BRANCH_UNCOND (fragp->fr_subtype),
17192
                             RELAX_BRANCH_LIKELY (fragp->fr_subtype),
17193
                             RELAX_BRANCH_LINK (fragp->fr_subtype),
17194
                             toofar);
17195
 
17196
  length = 4;
17197
  if (toofar)
17198
    {
17199
      if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
17200
        length += 8;
17201
 
17202
      if (mips_pic != NO_PIC)
17203
        {
17204
          /* Additional space for PIC loading of target address.  */
17205
          length += 8;
17206
          if (mips_opts.isa == ISA_MIPS1)
17207
            /* Additional space for $at-stabilizing nop.  */
17208
            length += 4;
17209
        }
17210
 
17211
      /* If branch is conditional.  */
17212
      if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
17213
        length += 8;
17214
    }
17215
 
17216
  return length;
17217
}
17218
 
17219 160 khays
/* Compute the length of a branch sequence, and adjust the
17220
   RELAX_MICROMIPS_TOOFAR32 bit accordingly.  If FRAGP is NULL, the
17221
   worst-case length is computed, with UPDATE being used to indicate
17222
   whether an unconditional (-1), or regular (0) branch is to be
17223
   computed.  */
17224
 
17225
static int
17226
relaxed_micromips_32bit_branch_length (fragS *fragp, asection *sec, int update)
17227
{
17228
  bfd_boolean toofar;
17229
  int length;
17230
 
17231
  if (fragp
17232
      && S_IS_DEFINED (fragp->fr_symbol)
17233
      && sec == S_GET_SEGMENT (fragp->fr_symbol))
17234
    {
17235
      addressT addr;
17236
      offsetT val;
17237
 
17238
      val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17239
      /* Ignore the low bit in the target, since it will be set
17240
         for a text label.  */
17241
      if ((val & 1) != 0)
17242
        --val;
17243
 
17244
      addr = fragp->fr_address + fragp->fr_fix + 4;
17245
 
17246
      val -= addr;
17247
 
17248
      toofar = val < - (0x8000 << 1) || val >= (0x8000 << 1);
17249
    }
17250
  else if (fragp)
17251
    /* If the symbol is not defined or it's in a different segment,
17252
       assume the user knows what's going on and emit a short
17253
       branch.  */
17254
    toofar = FALSE;
17255
  else
17256
    toofar = TRUE;
17257
 
17258
  if (fragp && update
17259
      && toofar != RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
17260
    fragp->fr_subtype = (toofar
17261
                         ? RELAX_MICROMIPS_MARK_TOOFAR32 (fragp->fr_subtype)
17262
                         : RELAX_MICROMIPS_CLEAR_TOOFAR32 (fragp->fr_subtype));
17263
 
17264
  length = 4;
17265
  if (toofar)
17266
    {
17267
      bfd_boolean compact_known = fragp != NULL;
17268
      bfd_boolean compact = FALSE;
17269
      bfd_boolean uncond;
17270
 
17271
      if (compact_known)
17272
        compact = RELAX_MICROMIPS_COMPACT (fragp->fr_subtype);
17273
      if (fragp)
17274
        uncond = RELAX_MICROMIPS_UNCOND (fragp->fr_subtype);
17275
      else
17276
        uncond = update < 0;
17277
 
17278
      /* If label is out of range, we turn branch <br>:
17279
 
17280
                <br>    label                   # 4 bytes
17281
            0:
17282
 
17283
         into:
17284
 
17285
                j       label                   # 4 bytes
17286
                nop                             # 2 bytes if compact && !PIC
17287
            0:
17288
       */
17289
      if (mips_pic == NO_PIC && (!compact_known || compact))
17290
        length += 2;
17291
 
17292
      /* If assembling PIC code, we further turn:
17293
 
17294
                        j       label                   # 4 bytes
17295
 
17296
         into:
17297
 
17298
                        lw/ld   at, %got(label)(gp)     # 4 bytes
17299
                        d/addiu at, %lo(label)          # 4 bytes
17300
                        jr/c    at                      # 2 bytes
17301
       */
17302
      if (mips_pic != NO_PIC)
17303
        length += 6;
17304
 
17305
      /* If branch <br> is conditional, we prepend negated branch <brneg>:
17306
 
17307
                        <brneg> 0f                      # 4 bytes
17308
                        nop                             # 2 bytes if !compact
17309
       */
17310
      if (!uncond)
17311
        length += (compact_known && compact) ? 4 : 6;
17312
    }
17313
 
17314
  return length;
17315
}
17316
 
17317
/* Compute the length of a branch, and adjust the RELAX_MICROMIPS_TOOFAR16
17318
   bit accordingly.  */
17319
 
17320
static int
17321
relaxed_micromips_16bit_branch_length (fragS *fragp, asection *sec, int update)
17322
{
17323
  bfd_boolean toofar;
17324
 
17325
  if (fragp
17326
      && S_IS_DEFINED (fragp->fr_symbol)
17327
      && sec == S_GET_SEGMENT (fragp->fr_symbol))
17328
    {
17329
      addressT addr;
17330
      offsetT val;
17331
      int type;
17332
 
17333
      val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17334
      /* Ignore the low bit in the target, since it will be set
17335
         for a text label.  */
17336
      if ((val & 1) != 0)
17337
        --val;
17338
 
17339
      /* Assume this is a 2-byte branch.  */
17340
      addr = fragp->fr_address + fragp->fr_fix + 2;
17341
 
17342
      /* We try to avoid the infinite loop by not adding 2 more bytes for
17343
         long branches.  */
17344
 
17345
      val -= addr;
17346
 
17347
      type = RELAX_MICROMIPS_TYPE (fragp->fr_subtype);
17348
      if (type == 'D')
17349
        toofar = val < - (0x200 << 1) || val >= (0x200 << 1);
17350
      else if (type == 'E')
17351
        toofar = val < - (0x40 << 1) || val >= (0x40 << 1);
17352
      else
17353
        abort ();
17354
    }
17355
  else
17356
    /* If the symbol is not defined or it's in a different segment,
17357
       we emit a normal 32-bit branch.  */
17358
    toofar = TRUE;
17359
 
17360
  if (fragp && update
17361
      && toofar != RELAX_MICROMIPS_TOOFAR16 (fragp->fr_subtype))
17362
    fragp->fr_subtype
17363
      = toofar ? RELAX_MICROMIPS_MARK_TOOFAR16 (fragp->fr_subtype)
17364
               : RELAX_MICROMIPS_CLEAR_TOOFAR16 (fragp->fr_subtype);
17365
 
17366
  if (toofar)
17367
    return 4;
17368
 
17369
  return 2;
17370
}
17371
 
17372 16 khays
/* Estimate the size of a frag before relaxing.  Unless this is the
17373
   mips16, we are not really relaxing here, and the final size is
17374
   encoded in the subtype information.  For the mips16, we have to
17375
   decide whether we are using an extended opcode or not.  */
17376
 
17377
int
17378
md_estimate_size_before_relax (fragS *fragp, asection *segtype)
17379
{
17380
  int change;
17381
 
17382
  if (RELAX_BRANCH_P (fragp->fr_subtype))
17383
    {
17384
 
17385
      fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
17386
 
17387
      return fragp->fr_var;
17388
    }
17389
 
17390
  if (RELAX_MIPS16_P (fragp->fr_subtype))
17391
    /* We don't want to modify the EXTENDED bit here; it might get us
17392
       into infinite loops.  We change it only in mips_relax_frag().  */
17393
    return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
17394
 
17395 160 khays
  if (RELAX_MICROMIPS_P (fragp->fr_subtype))
17396
    {
17397
      int length = 4;
17398
 
17399
      if (RELAX_MICROMIPS_TYPE (fragp->fr_subtype) != 0)
17400
        length = relaxed_micromips_16bit_branch_length (fragp, segtype, FALSE);
17401
      if (length == 4 && RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype))
17402
        length = relaxed_micromips_32bit_branch_length (fragp, segtype, FALSE);
17403
      fragp->fr_var = length;
17404
 
17405
      return length;
17406
    }
17407
 
17408 16 khays
  if (mips_pic == NO_PIC)
17409
    change = nopic_need_relax (fragp->fr_symbol, 0);
17410
  else if (mips_pic == SVR4_PIC)
17411
    change = pic_need_relax (fragp->fr_symbol, segtype);
17412
  else if (mips_pic == VXWORKS_PIC)
17413
    /* For vxworks, GOT16 relocations never have a corresponding LO16.  */
17414
    change = 0;
17415
  else
17416
    abort ();
17417
 
17418
  if (change)
17419
    {
17420
      fragp->fr_subtype |= RELAX_USE_SECOND;
17421
      return -RELAX_FIRST (fragp->fr_subtype);
17422
    }
17423
  else
17424
    return -RELAX_SECOND (fragp->fr_subtype);
17425
}
17426
 
17427
/* This is called to see whether a reloc against a defined symbol
17428
   should be converted into a reloc against a section.  */
17429
 
17430
int
17431
mips_fix_adjustable (fixS *fixp)
17432
{
17433
  if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
17434
      || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
17435
    return 0;
17436
 
17437
  if (fixp->fx_addsy == NULL)
17438
    return 1;
17439
 
17440
  /* If symbol SYM is in a mergeable section, relocations of the form
17441
     SYM + 0 can usually be made section-relative.  The mergeable data
17442
     is then identified by the section offset rather than by the symbol.
17443
 
17444
     However, if we're generating REL LO16 relocations, the offset is split
17445
     between the LO16 and parterning high part relocation.  The linker will
17446
     need to recalculate the complete offset in order to correctly identify
17447
     the merge data.
17448
 
17449
     The linker has traditionally not looked for the parterning high part
17450
     relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
17451
     placed anywhere.  Rather than break backwards compatibility by changing
17452
     this, it seems better not to force the issue, and instead keep the
17453
     original symbol.  This will work with either linker behavior.  */
17454
  if ((lo16_reloc_p (fixp->fx_r_type)
17455
       || reloc_needs_lo_p (fixp->fx_r_type))
17456
      && HAVE_IN_PLACE_ADDENDS
17457
      && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
17458
    return 0;
17459
 
17460
  /* There is no place to store an in-place offset for JALR relocations.
17461
     Likewise an in-range offset of PC-relative relocations may overflow
17462
     the in-place relocatable field if recalculated against the start
17463
     address of the symbol's containing section.  */
17464
  if (HAVE_IN_PLACE_ADDENDS
17465 160 khays
      && (fixp->fx_pcrel || jalr_reloc_p (fixp->fx_r_type)))
17466 16 khays
    return 0;
17467
 
17468
#ifdef OBJ_ELF
17469
  /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
17470
     to a floating-point stub.  The same is true for non-R_MIPS16_26
17471
     relocations against MIPS16 functions; in this case, the stub becomes
17472
     the function's canonical address.
17473
 
17474
     Floating-point stubs are stored in unique .mips16.call.* or
17475
     .mips16.fn.* sections.  If a stub T for function F is in section S,
17476
     the first relocation in section S must be against F; this is how the
17477
     linker determines the target function.  All relocations that might
17478
     resolve to T must also be against F.  We therefore have the following
17479
     restrictions, which are given in an intentionally-redundant way:
17480
 
17481
       1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
17482
          symbols.
17483
 
17484
       2. We cannot reduce a stub's relocations against non-MIPS16 symbols
17485
          if that stub might be used.
17486
 
17487
       3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
17488
          symbols.
17489
 
17490
       4. We cannot reduce a stub's relocations against MIPS16 symbols if
17491
          that stub might be used.
17492
 
17493
     There is a further restriction:
17494
 
17495 160 khays
       5. We cannot reduce jump relocations (R_MIPS_26, R_MIPS16_26 or
17496
          R_MICROMIPS_26_S1) against MIPS16 or microMIPS symbols on
17497
          targets with in-place addends; the relocation field cannot
17498 16 khays
          encode the low bit.
17499
 
17500 160 khays
     For simplicity, we deal with (3)-(4) by not reducing _any_ relocation
17501
     against a MIPS16 symbol.  We deal with (5) by by not reducing any
17502
     such relocations on REL targets.
17503 16 khays
 
17504
     We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
17505
     relocation against some symbol R, no relocation against R may be
17506
     reduced.  (Note that this deals with (2) as well as (1) because
17507
     relocations against global symbols will never be reduced on ELF
17508
     targets.)  This approach is a little simpler than trying to detect
17509
     stub sections, and gives the "all or nothing" per-symbol consistency
17510
     that we have for MIPS16 symbols.  */
17511
  if (IS_ELF
17512
      && fixp->fx_subsy == NULL
17513
      && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
17514 160 khays
          || *symbol_get_tc (fixp->fx_addsy)
17515
          || (HAVE_IN_PLACE_ADDENDS
17516
              && ELF_ST_IS_MICROMIPS (S_GET_OTHER (fixp->fx_addsy))
17517
              && jmp_reloc_p (fixp->fx_r_type))))
17518 16 khays
    return 0;
17519
#endif
17520
 
17521
  return 1;
17522
}
17523
 
17524
/* Translate internal representation of relocation info to BFD target
17525
   format.  */
17526
 
17527
arelent **
17528
tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
17529
{
17530
  static arelent *retval[4];
17531
  arelent *reloc;
17532
  bfd_reloc_code_real_type code;
17533
 
17534
  memset (retval, 0, sizeof(retval));
17535
  reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
17536
  reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
17537
  *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
17538
  reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
17539
 
17540
  if (fixp->fx_pcrel)
17541
    {
17542 160 khays
      gas_assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2
17543
                  || fixp->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
17544
                  || fixp->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
17545
                  || fixp->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1);
17546 16 khays
 
17547
      /* At this point, fx_addnumber is "symbol offset - pcrel address".
17548
         Relocations want only the symbol offset.  */
17549
      reloc->addend = fixp->fx_addnumber + reloc->address;
17550
      if (!IS_ELF)
17551
        {
17552
          /* A gruesome hack which is a result of the gruesome gas
17553
             reloc handling.  What's worse, for COFF (as opposed to
17554
             ECOFF), we might need yet another copy of reloc->address.
17555
             See bfd_install_relocation.  */
17556
          reloc->addend += reloc->address;
17557
        }
17558
    }
17559
  else
17560
    reloc->addend = fixp->fx_addnumber;
17561
 
17562
  /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
17563
     entry to be used in the relocation's section offset.  */
17564
  if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
17565
    {
17566
      reloc->address = reloc->addend;
17567
      reloc->addend = 0;
17568
    }
17569
 
17570
  code = fixp->fx_r_type;
17571
 
17572
  reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
17573
  if (reloc->howto == NULL)
17574
    {
17575
      as_bad_where (fixp->fx_file, fixp->fx_line,
17576
                    _("Can not represent %s relocation in this object file format"),
17577
                    bfd_get_reloc_code_name (code));
17578
      retval[0] = NULL;
17579
    }
17580
 
17581
  return retval;
17582
}
17583
 
17584
/* Relax a machine dependent frag.  This returns the amount by which
17585
   the current size of the frag should change.  */
17586
 
17587
int
17588
mips_relax_frag (asection *sec, fragS *fragp, long stretch)
17589
{
17590
  if (RELAX_BRANCH_P (fragp->fr_subtype))
17591
    {
17592
      offsetT old_var = fragp->fr_var;
17593
 
17594
      fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
17595
 
17596
      return fragp->fr_var - old_var;
17597
    }
17598
 
17599 160 khays
  if (RELAX_MICROMIPS_P (fragp->fr_subtype))
17600
    {
17601
      offsetT old_var = fragp->fr_var;
17602
      offsetT new_var = 4;
17603
 
17604
      if (RELAX_MICROMIPS_TYPE (fragp->fr_subtype) != 0)
17605
        new_var = relaxed_micromips_16bit_branch_length (fragp, sec, TRUE);
17606
      if (new_var == 4 && RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype))
17607
        new_var = relaxed_micromips_32bit_branch_length (fragp, sec, TRUE);
17608
      fragp->fr_var = new_var;
17609
 
17610
      return new_var - old_var;
17611
    }
17612
 
17613 16 khays
  if (! RELAX_MIPS16_P (fragp->fr_subtype))
17614
    return 0;
17615
 
17616
  if (mips16_extended_frag (fragp, NULL, stretch))
17617
    {
17618
      if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
17619
        return 0;
17620
      fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
17621
      return 2;
17622
    }
17623
  else
17624
    {
17625
      if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
17626
        return 0;
17627
      fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
17628
      return -2;
17629
    }
17630
 
17631
  return 0;
17632
}
17633
 
17634
/* Convert a machine dependent frag.  */
17635
 
17636
void
17637
md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
17638
{
17639
  if (RELAX_BRANCH_P (fragp->fr_subtype))
17640
    {
17641
      bfd_byte *buf;
17642
      unsigned long insn;
17643
      expressionS exp;
17644
      fixS *fixp;
17645
 
17646
      buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
17647
 
17648
      if (target_big_endian)
17649
        insn = bfd_getb32 (buf);
17650
      else
17651
        insn = bfd_getl32 (buf);
17652
 
17653
      if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
17654
        {
17655
          /* We generate a fixup instead of applying it right now
17656
             because, if there are linker relaxations, we're going to
17657
             need the relocations.  */
17658
          exp.X_op = O_symbol;
17659
          exp.X_add_symbol = fragp->fr_symbol;
17660
          exp.X_add_number = fragp->fr_offset;
17661
 
17662
          fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
17663
                              4, &exp, TRUE, BFD_RELOC_16_PCREL_S2);
17664
          fixp->fx_file = fragp->fr_file;
17665
          fixp->fx_line = fragp->fr_line;
17666
 
17667
          md_number_to_chars ((char *) buf, insn, 4);
17668
          buf += 4;
17669
        }
17670
      else
17671
        {
17672
          int i;
17673
 
17674
          as_warn_where (fragp->fr_file, fragp->fr_line,
17675
                         _("Relaxed out-of-range branch into a jump"));
17676
 
17677
          if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
17678
            goto uncond;
17679
 
17680
          if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
17681
            {
17682
              /* Reverse the branch.  */
17683
              switch ((insn >> 28) & 0xf)
17684
                {
17685
                case 4:
17686
                  /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
17687
                     have the condition reversed by tweaking a single
17688
                     bit, and their opcodes all have 0x4???????.  */
17689
                  gas_assert ((insn & 0xf1000000) == 0x41000000);
17690
                  insn ^= 0x00010000;
17691
                  break;
17692
 
17693
                case 0:
17694
                  /* bltz       0x04000000      bgez    0x04010000
17695
                     bltzal     0x04100000      bgezal  0x04110000  */
17696
                  gas_assert ((insn & 0xfc0e0000) == 0x04000000);
17697
                  insn ^= 0x00010000;
17698
                  break;
17699
 
17700
                case 1:
17701
                  /* beq        0x10000000      bne     0x14000000
17702
                     blez       0x18000000      bgtz    0x1c000000  */
17703
                  insn ^= 0x04000000;
17704
                  break;
17705
 
17706
                default:
17707
                  abort ();
17708
                }
17709
            }
17710
 
17711
          if (RELAX_BRANCH_LINK (fragp->fr_subtype))
17712
            {
17713
              /* Clear the and-link bit.  */
17714
              gas_assert ((insn & 0xfc1c0000) == 0x04100000);
17715
 
17716
              /* bltzal         0x04100000      bgezal  0x04110000
17717
                 bltzall        0x04120000      bgezall 0x04130000  */
17718
              insn &= ~0x00100000;
17719
            }
17720
 
17721
          /* Branch over the branch (if the branch was likely) or the
17722
             full jump (not likely case).  Compute the offset from the
17723
             current instruction to branch to.  */
17724
          if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
17725
            i = 16;
17726
          else
17727
            {
17728
              /* How many bytes in instructions we've already emitted?  */
17729
              i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
17730
              /* How many bytes in instructions from here to the end?  */
17731
              i = fragp->fr_var - i;
17732
            }
17733
          /* Convert to instruction count.  */
17734
          i >>= 2;
17735
          /* Branch counts from the next instruction.  */
17736
          i--;
17737
          insn |= i;
17738
          /* Branch over the jump.  */
17739
          md_number_to_chars ((char *) buf, insn, 4);
17740
          buf += 4;
17741
 
17742
          /* nop */
17743
          md_number_to_chars ((char *) buf, 0, 4);
17744
          buf += 4;
17745
 
17746
          if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
17747
            {
17748
              /* beql $0, $0, 2f */
17749
              insn = 0x50000000;
17750
              /* Compute the PC offset from the current instruction to
17751
                 the end of the variable frag.  */
17752
              /* How many bytes in instructions we've already emitted?  */
17753
              i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
17754
              /* How many bytes in instructions from here to the end?  */
17755
              i = fragp->fr_var - i;
17756
              /* Convert to instruction count.  */
17757
              i >>= 2;
17758
              /* Don't decrement i, because we want to branch over the
17759
                 delay slot.  */
17760
 
17761
              insn |= i;
17762
              md_number_to_chars ((char *) buf, insn, 4);
17763
              buf += 4;
17764
 
17765
              md_number_to_chars ((char *) buf, 0, 4);
17766
              buf += 4;
17767
            }
17768
 
17769
        uncond:
17770
          if (mips_pic == NO_PIC)
17771
            {
17772
              /* j or jal.  */
17773
              insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
17774
                      ? 0x0c000000 : 0x08000000);
17775
              exp.X_op = O_symbol;
17776
              exp.X_add_symbol = fragp->fr_symbol;
17777
              exp.X_add_number = fragp->fr_offset;
17778
 
17779
              fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
17780
                                  4, &exp, FALSE, BFD_RELOC_MIPS_JMP);
17781
              fixp->fx_file = fragp->fr_file;
17782
              fixp->fx_line = fragp->fr_line;
17783
 
17784
              md_number_to_chars ((char *) buf, insn, 4);
17785
              buf += 4;
17786
            }
17787
          else
17788
            {
17789
              unsigned long at = RELAX_BRANCH_AT (fragp->fr_subtype);
17790
 
17791
              /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
17792
              insn = HAVE_64BIT_ADDRESSES ? 0xdf800000 : 0x8f800000;
17793
              insn |= at << OP_SH_RT;
17794
              exp.X_op = O_symbol;
17795
              exp.X_add_symbol = fragp->fr_symbol;
17796
              exp.X_add_number = fragp->fr_offset;
17797
 
17798
              if (fragp->fr_offset)
17799
                {
17800
                  exp.X_add_symbol = make_expr_symbol (&exp);
17801
                  exp.X_add_number = 0;
17802
                }
17803
 
17804
              fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
17805
                                  4, &exp, FALSE, BFD_RELOC_MIPS_GOT16);
17806
              fixp->fx_file = fragp->fr_file;
17807
              fixp->fx_line = fragp->fr_line;
17808
 
17809
              md_number_to_chars ((char *) buf, insn, 4);
17810
              buf += 4;
17811
 
17812
              if (mips_opts.isa == ISA_MIPS1)
17813
                {
17814
                  /* nop */
17815
                  md_number_to_chars ((char *) buf, 0, 4);
17816
                  buf += 4;
17817
                }
17818
 
17819
              /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
17820
              insn = HAVE_64BIT_ADDRESSES ? 0x64000000 : 0x24000000;
17821
              insn |= at << OP_SH_RS | at << OP_SH_RT;
17822
 
17823
              fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
17824
                                  4, &exp, FALSE, BFD_RELOC_LO16);
17825
              fixp->fx_file = fragp->fr_file;
17826
              fixp->fx_line = fragp->fr_line;
17827
 
17828
              md_number_to_chars ((char *) buf, insn, 4);
17829
              buf += 4;
17830
 
17831
              /* j(al)r $at.  */
17832
              if (RELAX_BRANCH_LINK (fragp->fr_subtype))
17833
                insn = 0x0000f809;
17834
              else
17835
                insn = 0x00000008;
17836
              insn |= at << OP_SH_RS;
17837
 
17838
              md_number_to_chars ((char *) buf, insn, 4);
17839
              buf += 4;
17840
            }
17841
        }
17842
 
17843
      gas_assert (buf == (bfd_byte *)fragp->fr_literal
17844
              + fragp->fr_fix + fragp->fr_var);
17845
 
17846
      fragp->fr_fix += fragp->fr_var;
17847
 
17848
      return;
17849
    }
17850
 
17851 160 khays
  /* Relax microMIPS branches.  */
17852
  if (RELAX_MICROMIPS_P (fragp->fr_subtype))
17853
    {
17854
      bfd_byte *buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
17855
      bfd_boolean compact = RELAX_MICROMIPS_COMPACT (fragp->fr_subtype);
17856
      bfd_boolean al = RELAX_MICROMIPS_LINK (fragp->fr_subtype);
17857
      int type = RELAX_MICROMIPS_TYPE (fragp->fr_subtype);
17858
      bfd_boolean short_ds;
17859
      unsigned long insn;
17860
      expressionS exp;
17861
      fixS *fixp;
17862
 
17863
      exp.X_op = O_symbol;
17864
      exp.X_add_symbol = fragp->fr_symbol;
17865
      exp.X_add_number = fragp->fr_offset;
17866
 
17867
      fragp->fr_fix += fragp->fr_var;
17868
 
17869
      /* Handle 16-bit branches that fit or are forced to fit.  */
17870
      if (type != 0 && !RELAX_MICROMIPS_TOOFAR16 (fragp->fr_subtype))
17871
        {
17872
          /* We generate a fixup instead of applying it right now,
17873
             because if there is linker relaxation, we're going to
17874
             need the relocations.  */
17875
          if (type == 'D')
17876
            fixp = fix_new_exp (fragp,
17877
                                buf - (bfd_byte *) fragp->fr_literal,
17878
                                2, &exp, TRUE,
17879
                                BFD_RELOC_MICROMIPS_10_PCREL_S1);
17880
          else if (type == 'E')
17881
            fixp = fix_new_exp (fragp,
17882
                                buf - (bfd_byte *) fragp->fr_literal,
17883
                                2, &exp, TRUE,
17884
                                BFD_RELOC_MICROMIPS_7_PCREL_S1);
17885
          else
17886
            abort ();
17887
 
17888
          fixp->fx_file = fragp->fr_file;
17889
          fixp->fx_line = fragp->fr_line;
17890
 
17891
          /* These relocations can have an addend that won't fit in
17892
             2 octets.  */
17893
          fixp->fx_no_overflow = 1;
17894
 
17895
          return;
17896
        }
17897
 
17898
      /* Handle 32-bit branches that fit or are forced to fit.  */
17899
      if (!RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype)
17900
          || !RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
17901
        {
17902
          /* We generate a fixup instead of applying it right now,
17903
             because if there is linker relaxation, we're going to
17904
             need the relocations.  */
17905
          fixp = fix_new_exp (fragp, buf - (bfd_byte *) fragp->fr_literal,
17906
                              4, &exp, TRUE, BFD_RELOC_MICROMIPS_16_PCREL_S1);
17907
          fixp->fx_file = fragp->fr_file;
17908
          fixp->fx_line = fragp->fr_line;
17909
 
17910
          if (type == 0)
17911
            return;
17912
        }
17913
 
17914
      /* Relax 16-bit branches to 32-bit branches.  */
17915
      if (type != 0)
17916
        {
17917
          if (target_big_endian)
17918
            insn = bfd_getb16 (buf);
17919
          else
17920
            insn = bfd_getl16 (buf);
17921
 
17922
          if ((insn & 0xfc00) == 0xcc00)                /* b16  */
17923
            insn = 0x94000000;                          /* beq  */
17924
          else if ((insn & 0xdc00) == 0x8c00)           /* beqz16/bnez16  */
17925
            {
17926
              unsigned long regno;
17927
 
17928
              regno = (insn >> MICROMIPSOP_SH_MD) & MICROMIPSOP_MASK_MD;
17929
              regno = micromips_to_32_reg_d_map [regno];
17930
              insn = ((insn & 0x2000) << 16) | 0x94000000;      /* beq/bne  */
17931
              insn |= regno << MICROMIPSOP_SH_RS;
17932
            }
17933
          else
17934
            abort ();
17935
 
17936
          /* Nothing else to do, just write it out.  */
17937
          if (!RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype)
17938
              || !RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
17939
            {
17940
              md_number_to_chars ((char *) buf, insn >> 16, 2);
17941
              buf += 2;
17942
              md_number_to_chars ((char *) buf, insn & 0xffff, 2);
17943
              buf += 2;
17944
 
17945
              gas_assert (buf == ((bfd_byte *) fragp->fr_literal
17946
                                  + fragp->fr_fix));
17947
              return;
17948
            }
17949
        }
17950
      else
17951
        {
17952
          unsigned long next;
17953
 
17954
          if (target_big_endian)
17955
            {
17956
              insn = bfd_getb16 (buf);
17957
              next = bfd_getb16 (buf + 2);
17958
            }
17959
          else
17960
            {
17961
              insn = bfd_getl16 (buf);
17962
              next = bfd_getl16 (buf + 2);
17963
            }
17964
          insn = (insn << 16) | next;
17965
        }
17966
 
17967
      /* Relax 32-bit branches to a sequence of instructions.  */
17968
      as_warn_where (fragp->fr_file, fragp->fr_line,
17969
                     _("Relaxed out-of-range branch into a jump"));
17970
 
17971
      /* Set the short-delay-slot bit.  */
17972
      short_ds = al && (insn & 0x02000000) != 0;
17973
 
17974
      if (!RELAX_MICROMIPS_UNCOND (fragp->fr_subtype))
17975
        {
17976
          symbolS *l;
17977
 
17978
          /* Reverse the branch.  */
17979
          if ((insn & 0xfc000000) == 0x94000000                 /* beq  */
17980
              || (insn & 0xfc000000) == 0xb4000000)             /* bne  */
17981
            insn ^= 0x20000000;
17982
          else if ((insn & 0xffe00000) == 0x40000000            /* bltz  */
17983
                   || (insn & 0xffe00000) == 0x40400000         /* bgez  */
17984
                   || (insn & 0xffe00000) == 0x40800000         /* blez  */
17985
                   || (insn & 0xffe00000) == 0x40c00000         /* bgtz  */
17986
                   || (insn & 0xffe00000) == 0x40a00000         /* bnezc  */
17987
                   || (insn & 0xffe00000) == 0x40e00000         /* beqzc  */
17988
                   || (insn & 0xffe00000) == 0x40200000         /* bltzal  */
17989
                   || (insn & 0xffe00000) == 0x40600000         /* bgezal  */
17990
                   || (insn & 0xffe00000) == 0x42200000         /* bltzals  */
17991
                   || (insn & 0xffe00000) == 0x42600000)        /* bgezals  */
17992
            insn ^= 0x00400000;
17993
          else if ((insn & 0xffe30000) == 0x43800000            /* bc1f  */
17994
                   || (insn & 0xffe30000) == 0x43a00000         /* bc1t  */
17995
                   || (insn & 0xffe30000) == 0x42800000         /* bc2f  */
17996
                   || (insn & 0xffe30000) == 0x42a00000)        /* bc2t  */
17997
            insn ^= 0x00200000;
17998
          else
17999
            abort ();
18000
 
18001
          if (al)
18002
            {
18003
              /* Clear the and-link and short-delay-slot bits.  */
18004
              gas_assert ((insn & 0xfda00000) == 0x40200000);
18005
 
18006
              /* bltzal  0x40200000     bgezal  0x40600000  */
18007
              /* bltzals 0x42200000     bgezals 0x42600000  */
18008
              insn &= ~0x02200000;
18009
            }
18010
 
18011
          /* Make a label at the end for use with the branch.  */
18012
          l = symbol_new (micromips_label_name (), asec, fragp->fr_fix, fragp);
18013
          micromips_label_inc ();
18014
#if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
18015
          if (IS_ELF)
18016
            S_SET_OTHER (l, ELF_ST_SET_MICROMIPS (S_GET_OTHER (l)));
18017
#endif
18018
 
18019
          /* Refer to it.  */
18020
          fixp = fix_new (fragp, buf - (bfd_byte *) fragp->fr_literal,
18021
                          4, l, 0, TRUE, BFD_RELOC_MICROMIPS_16_PCREL_S1);
18022
          fixp->fx_file = fragp->fr_file;
18023
          fixp->fx_line = fragp->fr_line;
18024
 
18025
          /* Branch over the jump.  */
18026
          md_number_to_chars ((char *) buf, insn >> 16, 2);
18027
          buf += 2;
18028
          md_number_to_chars ((char *) buf, insn & 0xffff, 2);
18029
          buf += 2;
18030
 
18031
          if (!compact)
18032
            {
18033
              /* nop  */
18034
              insn = 0x0c00;
18035
              md_number_to_chars ((char *) buf, insn, 2);
18036
              buf += 2;
18037
            }
18038
        }
18039
 
18040
      if (mips_pic == NO_PIC)
18041
        {
18042
          unsigned long jal = short_ds ? 0x74000000 : 0xf4000000; /* jal/s  */
18043
 
18044
          /* j/jal/jals <sym>  R_MICROMIPS_26_S1  */
18045
          insn = al ? jal : 0xd4000000;
18046
 
18047
          fixp = fix_new_exp (fragp, buf - (bfd_byte *) fragp->fr_literal,
18048
                              4, &exp, FALSE, BFD_RELOC_MICROMIPS_JMP);
18049
          fixp->fx_file = fragp->fr_file;
18050
          fixp->fx_line = fragp->fr_line;
18051
 
18052
          md_number_to_chars ((char *) buf, insn >> 16, 2);
18053
          buf += 2;
18054
          md_number_to_chars ((char *) buf, insn & 0xffff, 2);
18055
          buf += 2;
18056
 
18057
          if (compact)
18058
            {
18059
              /* nop  */
18060
              insn = 0x0c00;
18061
              md_number_to_chars ((char *) buf, insn, 2);
18062
              buf += 2;
18063
            }
18064
        }
18065
      else
18066
        {
18067
          unsigned long at = RELAX_MICROMIPS_AT (fragp->fr_subtype);
18068
          unsigned long jalr = short_ds ? 0x45e0 : 0x45c0;      /* jalr/s  */
18069
          unsigned long jr = compact ? 0x45a0 : 0x4580;         /* jr/c  */
18070
 
18071
          /* lw/ld $at, <sym>($gp)  R_MICROMIPS_GOT16  */
18072
          insn = HAVE_64BIT_ADDRESSES ? 0xdc1c0000 : 0xfc1c0000;
18073
          insn |= at << MICROMIPSOP_SH_RT;
18074
 
18075
          if (exp.X_add_number)
18076
            {
18077
              exp.X_add_symbol = make_expr_symbol (&exp);
18078
              exp.X_add_number = 0;
18079
            }
18080
 
18081
          fixp = fix_new_exp (fragp, buf - (bfd_byte *) fragp->fr_literal,
18082
                              4, &exp, FALSE, BFD_RELOC_MICROMIPS_GOT16);
18083
          fixp->fx_file = fragp->fr_file;
18084
          fixp->fx_line = fragp->fr_line;
18085
 
18086
          md_number_to_chars ((char *) buf, insn >> 16, 2);
18087
          buf += 2;
18088
          md_number_to_chars ((char *) buf, insn & 0xffff, 2);
18089
          buf += 2;
18090
 
18091
          /* d/addiu $at, $at, <sym>  R_MICROMIPS_LO16  */
18092
          insn = HAVE_64BIT_ADDRESSES ? 0x5c000000 : 0x30000000;
18093
          insn |= at << MICROMIPSOP_SH_RT | at << MICROMIPSOP_SH_RS;
18094
 
18095
          fixp = fix_new_exp (fragp, buf - (bfd_byte *) fragp->fr_literal,
18096
                              4, &exp, FALSE, BFD_RELOC_MICROMIPS_LO16);
18097
          fixp->fx_file = fragp->fr_file;
18098
          fixp->fx_line = fragp->fr_line;
18099
 
18100
          md_number_to_chars ((char *) buf, insn >> 16, 2);
18101
          buf += 2;
18102
          md_number_to_chars ((char *) buf, insn & 0xffff, 2);
18103
          buf += 2;
18104
 
18105
          /* jr/jrc/jalr/jalrs $at  */
18106
          insn = al ? jalr : jr;
18107
          insn |= at << MICROMIPSOP_SH_MJ;
18108
 
18109
          md_number_to_chars ((char *) buf, insn & 0xffff, 2);
18110
          buf += 2;
18111
        }
18112
 
18113
      gas_assert (buf == (bfd_byte *) fragp->fr_literal + fragp->fr_fix);
18114
      return;
18115
    }
18116
 
18117 16 khays
  if (RELAX_MIPS16_P (fragp->fr_subtype))
18118
    {
18119
      int type;
18120
      const struct mips16_immed_operand *op;
18121
      bfd_boolean small, ext;
18122
      offsetT val;
18123
      bfd_byte *buf;
18124
      unsigned long insn;
18125
      bfd_boolean use_extend;
18126
      unsigned short extend;
18127
 
18128
      type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
18129
      op = mips16_immed_operands;
18130
      while (op->type != type)
18131
        ++op;
18132
 
18133
      if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
18134
        {
18135
          small = FALSE;
18136
          ext = TRUE;
18137
        }
18138
      else
18139
        {
18140
          small = TRUE;
18141
          ext = FALSE;
18142
        }
18143
 
18144
      val = resolve_symbol_value (fragp->fr_symbol);
18145
      if (op->pcrel)
18146
        {
18147
          addressT addr;
18148
 
18149
          addr = fragp->fr_address + fragp->fr_fix;
18150
 
18151
          /* The rules for the base address of a PC relative reloc are
18152
             complicated; see mips16_extended_frag.  */
18153
          if (type == 'p' || type == 'q')
18154
            {
18155
              addr += 2;
18156
              if (ext)
18157
                addr += 2;
18158
              /* Ignore the low bit in the target, since it will be
18159
                 set for a text label.  */
18160
              if ((val & 1) != 0)
18161
                --val;
18162
            }
18163
          else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
18164
            addr -= 4;
18165
          else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
18166
            addr -= 2;
18167
 
18168
          addr &= ~ (addressT) ((1 << op->shift) - 1);
18169
          val -= addr;
18170
 
18171
          /* Make sure the section winds up with the alignment we have
18172
             assumed.  */
18173
          if (op->shift > 0)
18174
            record_alignment (asec, op->shift);
18175
        }
18176
 
18177
      if (ext
18178
          && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
18179
              || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
18180
        as_warn_where (fragp->fr_file, fragp->fr_line,
18181
                       _("extended instruction in delay slot"));
18182
 
18183
      buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
18184
 
18185
      if (target_big_endian)
18186
        insn = bfd_getb16 (buf);
18187
      else
18188
        insn = bfd_getl16 (buf);
18189
 
18190
      mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
18191
                    RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
18192
                    small, ext, &insn, &use_extend, &extend);
18193
 
18194
      if (use_extend)
18195
        {
18196
          md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
18197
          fragp->fr_fix += 2;
18198
          buf += 2;
18199
        }
18200
 
18201
      md_number_to_chars ((char *) buf, insn, 2);
18202
      fragp->fr_fix += 2;
18203
      buf += 2;
18204
    }
18205
  else
18206
    {
18207 160 khays
      relax_substateT subtype = fragp->fr_subtype;
18208
      bfd_boolean second_longer = (subtype & RELAX_SECOND_LONGER) != 0;
18209
      bfd_boolean use_second = (subtype & RELAX_USE_SECOND) != 0;
18210 16 khays
      int first, second;
18211
      fixS *fixp;
18212
 
18213 160 khays
      first = RELAX_FIRST (subtype);
18214
      second = RELAX_SECOND (subtype);
18215 16 khays
      fixp = (fixS *) fragp->fr_opcode;
18216
 
18217 160 khays
      /* If the delay slot chosen does not match the size of the instruction,
18218
         then emit a warning.  */
18219
      if ((!use_second && (subtype & RELAX_DELAY_SLOT_SIZE_FIRST) != 0)
18220
           || (use_second && (subtype & RELAX_DELAY_SLOT_SIZE_SECOND) != 0))
18221
        {
18222
          relax_substateT s;
18223
          const char *msg;
18224
 
18225
          s = subtype & (RELAX_DELAY_SLOT_16BIT
18226
                         | RELAX_DELAY_SLOT_SIZE_FIRST
18227
                         | RELAX_DELAY_SLOT_SIZE_SECOND);
18228
          msg = macro_warning (s);
18229
          if (msg != NULL)
18230 163 khays
            as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
18231 160 khays
          subtype &= ~s;
18232
        }
18233
 
18234 16 khays
      /* Possibly emit a warning if we've chosen the longer option.  */
18235 160 khays
      if (use_second == second_longer)
18236 16 khays
        {
18237 160 khays
          relax_substateT s;
18238
          const char *msg;
18239
 
18240
          s = (subtype
18241
               & (RELAX_SECOND_LONGER | RELAX_NOMACRO | RELAX_DELAY_SLOT));
18242
          msg = macro_warning (s);
18243
          if (msg != NULL)
18244 163 khays
            as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
18245 160 khays
          subtype &= ~s;
18246 16 khays
        }
18247
 
18248
      /* Go through all the fixups for the first sequence.  Disable them
18249
         (by marking them as done) if we're going to use the second
18250
         sequence instead.  */
18251
      while (fixp
18252
             && fixp->fx_frag == fragp
18253
             && fixp->fx_where < fragp->fr_fix - second)
18254
        {
18255 160 khays
          if (subtype & RELAX_USE_SECOND)
18256 16 khays
            fixp->fx_done = 1;
18257
          fixp = fixp->fx_next;
18258
        }
18259
 
18260
      /* Go through the fixups for the second sequence.  Disable them if
18261
         we're going to use the first sequence, otherwise adjust their
18262
         addresses to account for the relaxation.  */
18263
      while (fixp && fixp->fx_frag == fragp)
18264
        {
18265 160 khays
          if (subtype & RELAX_USE_SECOND)
18266 16 khays
            fixp->fx_where -= first;
18267
          else
18268
            fixp->fx_done = 1;
18269
          fixp = fixp->fx_next;
18270
        }
18271
 
18272
      /* Now modify the frag contents.  */
18273 160 khays
      if (subtype & RELAX_USE_SECOND)
18274 16 khays
        {
18275
          char *start;
18276
 
18277
          start = fragp->fr_literal + fragp->fr_fix - first - second;
18278
          memmove (start, start + first, second);
18279
          fragp->fr_fix -= first;
18280
        }
18281
      else
18282
        fragp->fr_fix -= second;
18283
    }
18284
}
18285
 
18286
#ifdef OBJ_ELF
18287
 
18288
/* This function is called after the relocs have been generated.
18289
   We've been storing mips16 text labels as odd.  Here we convert them
18290
   back to even for the convenience of the debugger.  */
18291
 
18292
void
18293
mips_frob_file_after_relocs (void)
18294
{
18295
  asymbol **syms;
18296
  unsigned int count, i;
18297
 
18298
  if (!IS_ELF)
18299
    return;
18300
 
18301
  syms = bfd_get_outsymbols (stdoutput);
18302
  count = bfd_get_symcount (stdoutput);
18303
  for (i = 0; i < count; i++, syms++)
18304 160 khays
    if (ELF_ST_IS_COMPRESSED (elf_symbol (*syms)->internal_elf_sym.st_other)
18305
        && ((*syms)->value & 1) != 0)
18306
      {
18307
        (*syms)->value &= ~1;
18308
        /* If the symbol has an odd size, it was probably computed
18309
           incorrectly, so adjust that as well.  */
18310
        if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
18311
          ++elf_symbol (*syms)->internal_elf_sym.st_size;
18312
      }
18313 16 khays
}
18314
 
18315
#endif
18316
 
18317
/* This function is called whenever a label is defined, including fake
18318
   labels instantiated off the dot special symbol.  It is used when
18319
   handling branch delays; if a branch has a label, we assume we cannot
18320
   move it.  This also bumps the value of the symbol by 1 in compressed
18321
   code.  */
18322
 
18323
void
18324
mips_record_label (symbolS *sym)
18325
{
18326
  segment_info_type *si = seg_info (now_seg);
18327
  struct insn_label_list *l;
18328
 
18329
  if (free_insn_labels == NULL)
18330
    l = (struct insn_label_list *) xmalloc (sizeof *l);
18331
  else
18332
    {
18333
      l = free_insn_labels;
18334
      free_insn_labels = l->next;
18335
    }
18336
 
18337
  l->label = sym;
18338
  l->next = si->label_list;
18339
  si->label_list = l;
18340
}
18341
 
18342
/* This function is called as tc_frob_label() whenever a label is defined
18343
   and adds a DWARF-2 record we only want for true labels.  */
18344
 
18345
void
18346
mips_define_label (symbolS *sym)
18347
{
18348
  mips_record_label (sym);
18349
#ifdef OBJ_ELF
18350
  dwarf2_emit_label (sym);
18351
#endif
18352
}
18353
 
18354
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
18355
 
18356
/* Some special processing for a MIPS ELF file.  */
18357
 
18358
void
18359
mips_elf_final_processing (void)
18360
{
18361
  /* Write out the register information.  */
18362
  if (mips_abi != N64_ABI)
18363
    {
18364
      Elf32_RegInfo s;
18365
 
18366
      s.ri_gprmask = mips_gprmask;
18367
      s.ri_cprmask[0] = mips_cprmask[0];
18368
      s.ri_cprmask[1] = mips_cprmask[1];
18369
      s.ri_cprmask[2] = mips_cprmask[2];
18370
      s.ri_cprmask[3] = mips_cprmask[3];
18371
      /* The gp_value field is set by the MIPS ELF backend.  */
18372
 
18373
      bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
18374
                                       ((Elf32_External_RegInfo *)
18375
                                        mips_regmask_frag));
18376
    }
18377
  else
18378
    {
18379
      Elf64_Internal_RegInfo s;
18380
 
18381
      s.ri_gprmask = mips_gprmask;
18382
      s.ri_pad = 0;
18383
      s.ri_cprmask[0] = mips_cprmask[0];
18384
      s.ri_cprmask[1] = mips_cprmask[1];
18385
      s.ri_cprmask[2] = mips_cprmask[2];
18386
      s.ri_cprmask[3] = mips_cprmask[3];
18387
      /* The gp_value field is set by the MIPS ELF backend.  */
18388
 
18389
      bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
18390
                                       ((Elf64_External_RegInfo *)
18391
                                        mips_regmask_frag));
18392
    }
18393
 
18394
  /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
18395
     sort of BFD interface for this.  */
18396
  if (mips_any_noreorder)
18397
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
18398
  if (mips_pic != NO_PIC)
18399
    {
18400 163 khays
      elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
18401 16 khays
      elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
18402
    }
18403
  if (mips_abicalls)
18404
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
18405
 
18406
  /* Set MIPS ELF flags for ASEs.  */
18407
  /* We may need to define a new flag for DSP ASE, and set this flag when
18408
     file_ase_dsp is true.  */
18409
  /* Same for DSP R2.  */
18410
  /* We may need to define a new flag for MT ASE, and set this flag when
18411
     file_ase_mt is true.  */
18412
  if (file_ase_mips16)
18413
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
18414 160 khays
  if (file_ase_micromips)
18415
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MICROMIPS;
18416 16 khays
#if 0 /* XXX FIXME */
18417
  if (file_ase_mips3d)
18418
    elf_elfheader (stdoutput)->e_flags |= ???;
18419
#endif
18420
  if (file_ase_mdmx)
18421
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
18422
 
18423
  /* Set the MIPS ELF ABI flags.  */
18424
  if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
18425
    elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
18426
  else if (mips_abi == O64_ABI)
18427
    elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
18428
  else if (mips_abi == EABI_ABI)
18429
    {
18430
      if (!file_mips_gp32)
18431
        elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
18432
      else
18433
        elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
18434
    }
18435
  else if (mips_abi == N32_ABI)
18436
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
18437
 
18438
  /* Nothing to do for N64_ABI.  */
18439
 
18440
  if (mips_32bitmode)
18441
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
18442
 
18443
#if 0 /* XXX FIXME */
18444
  /* 32 bit code with 64 bit FP registers.  */
18445
  if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
18446
    elf_elfheader (stdoutput)->e_flags |= ???;
18447
#endif
18448
}
18449
 
18450
#endif /* OBJ_ELF || OBJ_MAYBE_ELF */
18451
 
18452
typedef struct proc {
18453
  symbolS *func_sym;
18454
  symbolS *func_end_sym;
18455
  unsigned long reg_mask;
18456
  unsigned long reg_offset;
18457
  unsigned long fpreg_mask;
18458
  unsigned long fpreg_offset;
18459
  unsigned long frame_offset;
18460
  unsigned long frame_reg;
18461
  unsigned long pc_reg;
18462
} procS;
18463
 
18464
static procS cur_proc;
18465
static procS *cur_proc_ptr;
18466
static int numprocs;
18467
 
18468 160 khays
/* Implement NOP_OPCODE.  We encode a MIPS16 nop as "1", a microMIPS nop
18469
   as "2", and a normal nop as "0".  */
18470 16 khays
 
18471 160 khays
#define NOP_OPCODE_MIPS         0
18472
#define NOP_OPCODE_MIPS16       1
18473
#define NOP_OPCODE_MICROMIPS    2
18474
 
18475 16 khays
char
18476
mips_nop_opcode (void)
18477
{
18478 160 khays
  if (seg_info (now_seg)->tc_segment_info_data.micromips)
18479
    return NOP_OPCODE_MICROMIPS;
18480
  else if (seg_info (now_seg)->tc_segment_info_data.mips16)
18481
    return NOP_OPCODE_MIPS16;
18482
  else
18483
    return NOP_OPCODE_MIPS;
18484 16 khays
}
18485
 
18486 160 khays
/* Fill in an rs_align_code fragment.  Unlike elsewhere we want to use
18487
   32-bit microMIPS NOPs here (if applicable).  */
18488 16 khays
 
18489
void
18490
mips_handle_align (fragS *fragp)
18491
{
18492 160 khays
  char nop_opcode;
18493 16 khays
  char *p;
18494
  int bytes, size, excess;
18495
  valueT opcode;
18496
 
18497
  if (fragp->fr_type != rs_align_code)
18498
    return;
18499
 
18500
  p = fragp->fr_literal + fragp->fr_fix;
18501 160 khays
  nop_opcode = *p;
18502
  switch (nop_opcode)
18503 16 khays
    {
18504 160 khays
    case NOP_OPCODE_MICROMIPS:
18505
      opcode = micromips_nop32_insn.insn_opcode;
18506
      size = 4;
18507
      break;
18508
    case NOP_OPCODE_MIPS16:
18509 16 khays
      opcode = mips16_nop_insn.insn_opcode;
18510
      size = 2;
18511 160 khays
      break;
18512
    case NOP_OPCODE_MIPS:
18513
    default:
18514 16 khays
      opcode = nop_insn.insn_opcode;
18515
      size = 4;
18516 160 khays
      break;
18517 16 khays
    }
18518
 
18519
  bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
18520
  excess = bytes % size;
18521 160 khays
 
18522
  /* Handle the leading part if we're not inserting a whole number of
18523
     instructions, and make it the end of the fixed part of the frag.
18524
     Try to fit in a short microMIPS NOP if applicable and possible,
18525
     and use zeroes otherwise.  */
18526
  gas_assert (excess < 4);
18527
  fragp->fr_fix += excess;
18528
  switch (excess)
18529 16 khays
    {
18530 160 khays
    case 3:
18531
      *p++ = '\0';
18532
      /* Fall through.  */
18533
    case 2:
18534
      if (nop_opcode == NOP_OPCODE_MICROMIPS)
18535
        {
18536
          md_number_to_chars (p, micromips_nop16_insn.insn_opcode, 2);
18537
          p += 2;
18538
          break;
18539
        }
18540
      *p++ = '\0';
18541
      /* Fall through.  */
18542
    case 1:
18543
      *p++ = '\0';
18544
      /* Fall through.  */
18545
    case 0:
18546
      break;
18547 16 khays
    }
18548
 
18549
  md_number_to_chars (p, opcode, size);
18550
  fragp->fr_var = size;
18551
}
18552
 
18553
static void
18554
md_obj_begin (void)
18555
{
18556
}
18557
 
18558
static void
18559
md_obj_end (void)
18560
{
18561
  /* Check for premature end, nesting errors, etc.  */
18562
  if (cur_proc_ptr)
18563
    as_warn (_("missing .end at end of assembly"));
18564
}
18565
 
18566
static long
18567
get_number (void)
18568
{
18569
  int negative = 0;
18570
  long val = 0;
18571
 
18572
  if (*input_line_pointer == '-')
18573
    {
18574
      ++input_line_pointer;
18575
      negative = 1;
18576
    }
18577
  if (!ISDIGIT (*input_line_pointer))
18578
    as_bad (_("expected simple number"));
18579
  if (input_line_pointer[0] == '0')
18580
    {
18581
      if (input_line_pointer[1] == 'x')
18582
        {
18583
          input_line_pointer += 2;
18584
          while (ISXDIGIT (*input_line_pointer))
18585
            {
18586
              val <<= 4;
18587
              val |= hex_value (*input_line_pointer++);
18588
            }
18589
          return negative ? -val : val;
18590
        }
18591
      else
18592
        {
18593
          ++input_line_pointer;
18594
          while (ISDIGIT (*input_line_pointer))
18595
            {
18596
              val <<= 3;
18597
              val |= *input_line_pointer++ - '0';
18598
            }
18599
          return negative ? -val : val;
18600
        }
18601
    }
18602
  if (!ISDIGIT (*input_line_pointer))
18603
    {
18604
      printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
18605
              *input_line_pointer, *input_line_pointer);
18606
      as_warn (_("invalid number"));
18607
      return -1;
18608
    }
18609
  while (ISDIGIT (*input_line_pointer))
18610
    {
18611
      val *= 10;
18612
      val += *input_line_pointer++ - '0';
18613
    }
18614
  return negative ? -val : val;
18615
}
18616
 
18617
/* The .file directive; just like the usual .file directive, but there
18618
   is an initial number which is the ECOFF file index.  In the non-ECOFF
18619
   case .file implies DWARF-2.  */
18620
 
18621
static void
18622
s_mips_file (int x ATTRIBUTE_UNUSED)
18623
{
18624
  static int first_file_directive = 0;
18625
 
18626
  if (ECOFF_DEBUGGING)
18627
    {
18628
      get_number ();
18629
      s_app_file (0);
18630
    }
18631
  else
18632
    {
18633
      char *filename;
18634
 
18635
      filename = dwarf2_directive_file (0);
18636
 
18637
      /* Versions of GCC up to 3.1 start files with a ".file"
18638
         directive even for stabs output.  Make sure that this
18639
         ".file" is handled.  Note that you need a version of GCC
18640
         after 3.1 in order to support DWARF-2 on MIPS.  */
18641
      if (filename != NULL && ! first_file_directive)
18642
        {
18643
          (void) new_logical_line (filename, -1);
18644
          s_app_file_string (filename, 0);
18645
        }
18646
      first_file_directive = 1;
18647
    }
18648
}
18649
 
18650
/* The .loc directive, implying DWARF-2.  */
18651
 
18652
static void
18653
s_mips_loc (int x ATTRIBUTE_UNUSED)
18654
{
18655
  if (!ECOFF_DEBUGGING)
18656
    dwarf2_directive_loc (0);
18657
}
18658
 
18659
/* The .end directive.  */
18660
 
18661
static void
18662
s_mips_end (int x ATTRIBUTE_UNUSED)
18663
{
18664
  symbolS *p;
18665
 
18666
  /* Following functions need their own .frame and .cprestore directives.  */
18667
  mips_frame_reg_valid = 0;
18668
  mips_cprestore_valid = 0;
18669
 
18670
  if (!is_end_of_line[(unsigned char) *input_line_pointer])
18671
    {
18672
      p = get_symbol ();
18673
      demand_empty_rest_of_line ();
18674
    }
18675
  else
18676
    p = NULL;
18677
 
18678
  if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
18679
    as_warn (_(".end not in text section"));
18680
 
18681
  if (!cur_proc_ptr)
18682
    {
18683
      as_warn (_(".end directive without a preceding .ent directive."));
18684
      demand_empty_rest_of_line ();
18685
      return;
18686
    }
18687
 
18688
  if (p != NULL)
18689
    {
18690
      gas_assert (S_GET_NAME (p));
18691
      if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
18692
        as_warn (_(".end symbol does not match .ent symbol."));
18693
 
18694
      if (debug_type == DEBUG_STABS)
18695
        stabs_generate_asm_endfunc (S_GET_NAME (p),
18696
                                    S_GET_NAME (p));
18697
    }
18698
  else
18699
    as_warn (_(".end directive missing or unknown symbol"));
18700
 
18701
#ifdef OBJ_ELF
18702
  /* Create an expression to calculate the size of the function.  */
18703
  if (p && cur_proc_ptr)
18704
    {
18705
      OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
18706
      expressionS *exp = xmalloc (sizeof (expressionS));
18707
 
18708
      obj->size = exp;
18709
      exp->X_op = O_subtract;
18710
      exp->X_add_symbol = symbol_temp_new_now ();
18711
      exp->X_op_symbol = p;
18712
      exp->X_add_number = 0;
18713
 
18714
      cur_proc_ptr->func_end_sym = exp->X_add_symbol;
18715
    }
18716
 
18717
  /* Generate a .pdr section.  */
18718
  if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
18719
    {
18720
      segT saved_seg = now_seg;
18721
      subsegT saved_subseg = now_subseg;
18722
      expressionS exp;
18723
      char *fragp;
18724
 
18725
#ifdef md_flush_pending_output
18726
      md_flush_pending_output ();
18727
#endif
18728
 
18729
      gas_assert (pdr_seg);
18730
      subseg_set (pdr_seg, 0);
18731
 
18732
      /* Write the symbol.  */
18733
      exp.X_op = O_symbol;
18734
      exp.X_add_symbol = p;
18735
      exp.X_add_number = 0;
18736
      emit_expr (&exp, 4);
18737
 
18738
      fragp = frag_more (7 * 4);
18739
 
18740
      md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
18741
      md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
18742
      md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
18743
      md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
18744
      md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
18745
      md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
18746
      md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
18747
 
18748
      subseg_set (saved_seg, saved_subseg);
18749
    }
18750
#endif /* OBJ_ELF */
18751
 
18752
  cur_proc_ptr = NULL;
18753
}
18754
 
18755
/* The .aent and .ent directives.  */
18756
 
18757
static void
18758
s_mips_ent (int aent)
18759
{
18760
  symbolS *symbolP;
18761
 
18762
  symbolP = get_symbol ();
18763
  if (*input_line_pointer == ',')
18764
    ++input_line_pointer;
18765
  SKIP_WHITESPACE ();
18766
  if (ISDIGIT (*input_line_pointer)
18767
      || *input_line_pointer == '-')
18768
    get_number ();
18769
 
18770
  if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
18771
    as_warn (_(".ent or .aent not in text section."));
18772
 
18773
  if (!aent && cur_proc_ptr)
18774
    as_warn (_("missing .end"));
18775
 
18776
  if (!aent)
18777
    {
18778
      /* This function needs its own .frame and .cprestore directives.  */
18779
      mips_frame_reg_valid = 0;
18780
      mips_cprestore_valid = 0;
18781
 
18782
      cur_proc_ptr = &cur_proc;
18783
      memset (cur_proc_ptr, '\0', sizeof (procS));
18784
 
18785
      cur_proc_ptr->func_sym = symbolP;
18786
 
18787
      ++numprocs;
18788
 
18789
      if (debug_type == DEBUG_STABS)
18790
        stabs_generate_asm_func (S_GET_NAME (symbolP),
18791
                                 S_GET_NAME (symbolP));
18792
    }
18793
 
18794
  symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
18795
 
18796
  demand_empty_rest_of_line ();
18797
}
18798
 
18799
/* The .frame directive. If the mdebug section is present (IRIX 5 native)
18800
   then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
18801
   s_mips_frame is used so that we can set the PDR information correctly.
18802
   We can't use the ecoff routines because they make reference to the ecoff
18803
   symbol table (in the mdebug section).  */
18804
 
18805
static void
18806
s_mips_frame (int ignore ATTRIBUTE_UNUSED)
18807
{
18808
#ifdef OBJ_ELF
18809
  if (IS_ELF && !ECOFF_DEBUGGING)
18810
    {
18811
      long val;
18812
 
18813
      if (cur_proc_ptr == (procS *) NULL)
18814
        {
18815
          as_warn (_(".frame outside of .ent"));
18816
          demand_empty_rest_of_line ();
18817
          return;
18818
        }
18819
 
18820
      cur_proc_ptr->frame_reg = tc_get_register (1);
18821
 
18822
      SKIP_WHITESPACE ();
18823
      if (*input_line_pointer++ != ','
18824
          || get_absolute_expression_and_terminator (&val) != ',')
18825
        {
18826
          as_warn (_("Bad .frame directive"));
18827
          --input_line_pointer;
18828
          demand_empty_rest_of_line ();
18829
          return;
18830
        }
18831
 
18832
      cur_proc_ptr->frame_offset = val;
18833
      cur_proc_ptr->pc_reg = tc_get_register (0);
18834
 
18835
      demand_empty_rest_of_line ();
18836
    }
18837
  else
18838
#endif /* OBJ_ELF */
18839
    s_ignore (ignore);
18840
}
18841
 
18842
/* The .fmask and .mask directives. If the mdebug section is present
18843
   (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
18844
   embedded targets, s_mips_mask is used so that we can set the PDR
18845
   information correctly. We can't use the ecoff routines because they
18846
   make reference to the ecoff symbol table (in the mdebug section).  */
18847
 
18848
static void
18849
s_mips_mask (int reg_type)
18850
{
18851
#ifdef OBJ_ELF
18852
  if (IS_ELF && !ECOFF_DEBUGGING)
18853
    {
18854
      long mask, off;
18855
 
18856
      if (cur_proc_ptr == (procS *) NULL)
18857
        {
18858
          as_warn (_(".mask/.fmask outside of .ent"));
18859
          demand_empty_rest_of_line ();
18860
          return;
18861
        }
18862
 
18863
      if (get_absolute_expression_and_terminator (&mask) != ',')
18864
        {
18865
          as_warn (_("Bad .mask/.fmask directive"));
18866
          --input_line_pointer;
18867
          demand_empty_rest_of_line ();
18868
          return;
18869
        }
18870
 
18871
      off = get_absolute_expression ();
18872
 
18873
      if (reg_type == 'F')
18874
        {
18875
          cur_proc_ptr->fpreg_mask = mask;
18876
          cur_proc_ptr->fpreg_offset = off;
18877
        }
18878
      else
18879
        {
18880
          cur_proc_ptr->reg_mask = mask;
18881
          cur_proc_ptr->reg_offset = off;
18882
        }
18883
 
18884
      demand_empty_rest_of_line ();
18885
    }
18886
  else
18887
#endif /* OBJ_ELF */
18888
    s_ignore (reg_type);
18889
}
18890
 
18891
/* A table describing all the processors gas knows about.  Names are
18892
   matched in the order listed.
18893
 
18894
   To ease comparison, please keep this table in the same order as
18895
   gcc's mips_cpu_info_table[].  */
18896
static const struct mips_cpu_info mips_cpu_info_table[] =
18897
{
18898
  /* Entries for generic ISAs */
18899
  { "mips1",          MIPS_CPU_IS_ISA,          ISA_MIPS1,      CPU_R3000 },
18900
  { "mips2",          MIPS_CPU_IS_ISA,          ISA_MIPS2,      CPU_R6000 },
18901
  { "mips3",          MIPS_CPU_IS_ISA,          ISA_MIPS3,      CPU_R4000 },
18902
  { "mips4",          MIPS_CPU_IS_ISA,          ISA_MIPS4,      CPU_R8000 },
18903
  { "mips5",          MIPS_CPU_IS_ISA,          ISA_MIPS5,      CPU_MIPS5 },
18904
  { "mips32",         MIPS_CPU_IS_ISA,          ISA_MIPS32,     CPU_MIPS32 },
18905
  { "mips32r2",       MIPS_CPU_IS_ISA,          ISA_MIPS32R2,   CPU_MIPS32R2 },
18906
  { "mips64",         MIPS_CPU_IS_ISA,          ISA_MIPS64,     CPU_MIPS64 },
18907
  { "mips64r2",       MIPS_CPU_IS_ISA,          ISA_MIPS64R2,   CPU_MIPS64R2 },
18908
 
18909
  /* MIPS I */
18910
  { "r3000",          0,                 ISA_MIPS1,      CPU_R3000 },
18911
  { "r2000",          0,                 ISA_MIPS1,      CPU_R3000 },
18912
  { "r3900",          0,                 ISA_MIPS1,      CPU_R3900 },
18913
 
18914
  /* MIPS II */
18915
  { "r6000",          0,                 ISA_MIPS2,      CPU_R6000 },
18916
 
18917
  /* MIPS III */
18918
  { "r4000",          0,                 ISA_MIPS3,      CPU_R4000 },
18919
  { "r4010",          0,                 ISA_MIPS2,      CPU_R4010 },
18920
  { "vr4100",         0,                 ISA_MIPS3,      CPU_VR4100 },
18921
  { "vr4111",         0,                 ISA_MIPS3,      CPU_R4111 },
18922
  { "vr4120",         0,                 ISA_MIPS3,      CPU_VR4120 },
18923
  { "vr4130",         0,                 ISA_MIPS3,      CPU_VR4120 },
18924
  { "vr4181",         0,                 ISA_MIPS3,      CPU_R4111 },
18925
  { "vr4300",         0,                 ISA_MIPS3,      CPU_R4300 },
18926
  { "r4400",          0,                 ISA_MIPS3,      CPU_R4400 },
18927
  { "r4600",          0,                 ISA_MIPS3,      CPU_R4600 },
18928
  { "orion",          0,                 ISA_MIPS3,      CPU_R4600 },
18929
  { "r4650",          0,                 ISA_MIPS3,      CPU_R4650 },
18930
  /* ST Microelectronics Loongson 2E and 2F cores */
18931
  { "loongson2e",     0,                 ISA_MIPS3,   CPU_LOONGSON_2E },
18932
  { "loongson2f",     0,                 ISA_MIPS3,   CPU_LOONGSON_2F },
18933
 
18934
  /* MIPS IV */
18935
  { "r8000",          0,                 ISA_MIPS4,      CPU_R8000 },
18936
  { "r10000",         0,                 ISA_MIPS4,      CPU_R10000 },
18937
  { "r12000",         0,                 ISA_MIPS4,      CPU_R12000 },
18938
  { "r14000",         0,                 ISA_MIPS4,      CPU_R14000 },
18939
  { "r16000",         0,                 ISA_MIPS4,      CPU_R16000 },
18940
  { "vr5000",         0,                 ISA_MIPS4,      CPU_R5000 },
18941
  { "vr5400",         0,                 ISA_MIPS4,      CPU_VR5400 },
18942
  { "vr5500",         0,                 ISA_MIPS4,      CPU_VR5500 },
18943
  { "rm5200",         0,                 ISA_MIPS4,      CPU_R5000 },
18944
  { "rm5230",         0,                 ISA_MIPS4,      CPU_R5000 },
18945
  { "rm5231",         0,                 ISA_MIPS4,      CPU_R5000 },
18946
  { "rm5261",         0,                 ISA_MIPS4,      CPU_R5000 },
18947
  { "rm5721",         0,                 ISA_MIPS4,      CPU_R5000 },
18948
  { "rm7000",         0,                 ISA_MIPS4,      CPU_RM7000 },
18949
  { "rm9000",         0,                 ISA_MIPS4,      CPU_RM9000 },
18950
 
18951
  /* MIPS 32 */
18952
  { "4kc",            0,                 ISA_MIPS32,     CPU_MIPS32 },
18953
  { "4km",            0,                 ISA_MIPS32,     CPU_MIPS32 },
18954
  { "4kp",            0,                 ISA_MIPS32,     CPU_MIPS32 },
18955
  { "4ksc",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32,     CPU_MIPS32 },
18956
 
18957
  /* MIPS 32 Release 2 */
18958
  { "4kec",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18959
  { "4kem",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18960
  { "4kep",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18961
  { "4ksd",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32R2,   CPU_MIPS32R2 },
18962
  { "m4k",            0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18963
  { "m4kp",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18964 160 khays
  { "m14k",           MIPS_CPU_ASE_MCU,         ISA_MIPS32R2,   CPU_MIPS32R2 },
18965
  { "m14kc",          MIPS_CPU_ASE_MCU,         ISA_MIPS32R2,   CPU_MIPS32R2 },
18966 16 khays
  { "24kc",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18967
  { "24kf2_1",        0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18968
  { "24kf",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18969
  { "24kf1_1",        0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18970
  /* Deprecated forms of the above.  */
18971
  { "24kfx",          0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18972
  { "24kx",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18973
  /* 24KE is a 24K with DSP ASE, other ASEs are optional.  */
18974
  { "24kec",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
18975
  { "24kef2_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
18976
  { "24kef",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
18977
  { "24kef1_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
18978
  /* Deprecated forms of the above.  */
18979
  { "24kefx",         MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
18980
  { "24kex",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
18981
  /* 34K is a 24K with DSP and MT ASE, other ASEs are optional.  */
18982
  { "34kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
18983
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
18984
  { "34kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
18985
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
18986
  { "34kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
18987
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
18988
  { "34kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
18989
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
18990
  /* Deprecated forms of the above.  */
18991
  { "34kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
18992
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
18993
  { "34kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
18994
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
18995
  /* 74K with DSP and DSPR2 ASE, other ASEs are optional.  */
18996
  { "74kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
18997
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
18998
  { "74kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
18999
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
19000
  { "74kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19001
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
19002
  { "74kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19003
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
19004
  { "74kf3_2",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19005
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
19006
  /* Deprecated forms of the above.  */
19007
  { "74kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19008
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
19009
  { "74kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19010
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
19011
  /* 1004K cores are multiprocessor versions of the 34K.  */
19012
  { "1004kc",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19013
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
19014
  { "1004kf2_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19015
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
19016
  { "1004kf",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19017
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
19018
  { "1004kf1_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19019
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
19020
 
19021
  /* MIPS 64 */
19022
  { "5kc",            0,                 ISA_MIPS64,     CPU_MIPS64 },
19023
  { "5kf",            0,                 ISA_MIPS64,     CPU_MIPS64 },
19024
  { "20kc",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
19025
  { "25kf",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
19026
 
19027
  /* Broadcom SB-1 CPU core */
19028
  { "sb1",            MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
19029
                                                ISA_MIPS64,     CPU_SB1 },
19030
  /* Broadcom SB-1A CPU core */
19031
  { "sb1a",           MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
19032
                                                ISA_MIPS64,     CPU_SB1 },
19033
 
19034
  { "loongson3a",     0,                 ISA_MIPS64,     CPU_LOONGSON_3A },
19035
 
19036
  /* MIPS 64 Release 2 */
19037
 
19038
  /* Cavium Networks Octeon CPU core */
19039
  { "octeon",         0,      ISA_MIPS64R2,   CPU_OCTEON },
19040
 
19041
  /* RMI Xlr */
19042
  { "xlr",            0,      ISA_MIPS64,     CPU_XLR },
19043
 
19044
  /* End marker */
19045
  { NULL, 0, 0, 0 }
19046
};
19047
 
19048
 
19049
/* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
19050
   with a final "000" replaced by "k".  Ignore case.
19051
 
19052
   Note: this function is shared between GCC and GAS.  */
19053
 
19054
static bfd_boolean
19055
mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
19056
{
19057
  while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
19058
    given++, canonical++;
19059
 
19060
  return ((*given == 0 && *canonical == 0)
19061
          || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
19062
}
19063
 
19064
 
19065
/* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
19066
   CPU name.  We've traditionally allowed a lot of variation here.
19067
 
19068
   Note: this function is shared between GCC and GAS.  */
19069
 
19070
static bfd_boolean
19071
mips_matching_cpu_name_p (const char *canonical, const char *given)
19072
{
19073
  /* First see if the name matches exactly, or with a final "000"
19074
     turned into "k".  */
19075
  if (mips_strict_matching_cpu_name_p (canonical, given))
19076
    return TRUE;
19077
 
19078
  /* If not, try comparing based on numerical designation alone.
19079
     See if GIVEN is an unadorned number, or 'r' followed by a number.  */
19080
  if (TOLOWER (*given) == 'r')
19081
    given++;
19082
  if (!ISDIGIT (*given))
19083
    return FALSE;
19084
 
19085
  /* Skip over some well-known prefixes in the canonical name,
19086
     hoping to find a number there too.  */
19087
  if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
19088
    canonical += 2;
19089
  else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
19090
    canonical += 2;
19091
  else if (TOLOWER (canonical[0]) == 'r')
19092
    canonical += 1;
19093
 
19094
  return mips_strict_matching_cpu_name_p (canonical, given);
19095
}
19096
 
19097
 
19098
/* Parse an option that takes the name of a processor as its argument.
19099
   OPTION is the name of the option and CPU_STRING is the argument.
19100
   Return the corresponding processor enumeration if the CPU_STRING is
19101
   recognized, otherwise report an error and return null.
19102
 
19103
   A similar function exists in GCC.  */
19104
 
19105
static const struct mips_cpu_info *
19106
mips_parse_cpu (const char *option, const char *cpu_string)
19107
{
19108
  const struct mips_cpu_info *p;
19109
 
19110
  /* 'from-abi' selects the most compatible architecture for the given
19111
     ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
19112
     EABIs, we have to decide whether we're using the 32-bit or 64-bit
19113
     version.  Look first at the -mgp options, if given, otherwise base
19114
     the choice on MIPS_DEFAULT_64BIT.
19115
 
19116
     Treat NO_ABI like the EABIs.  One reason to do this is that the
19117
     plain 'mips' and 'mips64' configs have 'from-abi' as their default
19118
     architecture.  This code picks MIPS I for 'mips' and MIPS III for
19119
     'mips64', just as we did in the days before 'from-abi'.  */
19120
  if (strcasecmp (cpu_string, "from-abi") == 0)
19121
    {
19122
      if (ABI_NEEDS_32BIT_REGS (mips_abi))
19123
        return mips_cpu_info_from_isa (ISA_MIPS1);
19124
 
19125
      if (ABI_NEEDS_64BIT_REGS (mips_abi))
19126
        return mips_cpu_info_from_isa (ISA_MIPS3);
19127
 
19128
      if (file_mips_gp32 >= 0)
19129
        return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
19130
 
19131
      return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
19132
                                     ? ISA_MIPS3
19133
                                     : ISA_MIPS1);
19134
    }
19135
 
19136
  /* 'default' has traditionally been a no-op.  Probably not very useful.  */
19137
  if (strcasecmp (cpu_string, "default") == 0)
19138
    return 0;
19139
 
19140
  for (p = mips_cpu_info_table; p->name != 0; p++)
19141
    if (mips_matching_cpu_name_p (p->name, cpu_string))
19142
      return p;
19143
 
19144
  as_bad (_("Bad value (%s) for %s"), cpu_string, option);
19145
  return 0;
19146
}
19147
 
19148
/* Return the canonical processor information for ISA (a member of the
19149
   ISA_MIPS* enumeration).  */
19150
 
19151
static const struct mips_cpu_info *
19152
mips_cpu_info_from_isa (int isa)
19153
{
19154
  int i;
19155
 
19156
  for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19157
    if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
19158
        && isa == mips_cpu_info_table[i].isa)
19159
      return (&mips_cpu_info_table[i]);
19160
 
19161
  return NULL;
19162
}
19163
 
19164
static const struct mips_cpu_info *
19165
mips_cpu_info_from_arch (int arch)
19166
{
19167
  int i;
19168
 
19169
  for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19170
    if (arch == mips_cpu_info_table[i].cpu)
19171
      return (&mips_cpu_info_table[i]);
19172
 
19173
  return NULL;
19174
}
19175
 
19176
static void
19177
show (FILE *stream, const char *string, int *col_p, int *first_p)
19178
{
19179
  if (*first_p)
19180
    {
19181
      fprintf (stream, "%24s", "");
19182
      *col_p = 24;
19183
    }
19184
  else
19185
    {
19186
      fprintf (stream, ", ");
19187
      *col_p += 2;
19188
    }
19189
 
19190
  if (*col_p + strlen (string) > 72)
19191
    {
19192
      fprintf (stream, "\n%24s", "");
19193
      *col_p = 24;
19194
    }
19195
 
19196
  fprintf (stream, "%s", string);
19197
  *col_p += strlen (string);
19198
 
19199
  *first_p = 0;
19200
}
19201
 
19202
void
19203
md_show_usage (FILE *stream)
19204
{
19205
  int column, first;
19206
  size_t i;
19207
 
19208
  fprintf (stream, _("\
19209
MIPS options:\n\
19210
-EB                     generate big endian output\n\
19211
-EL                     generate little endian output\n\
19212
-g, -g2                 do not remove unneeded NOPs or swap branches\n\
19213
-G NUM                  allow referencing objects up to NUM bytes\n\
19214
                        implicitly with the gp register [default 8]\n"));
19215
  fprintf (stream, _("\
19216
-mips1                  generate MIPS ISA I instructions\n\
19217
-mips2                  generate MIPS ISA II instructions\n\
19218
-mips3                  generate MIPS ISA III instructions\n\
19219
-mips4                  generate MIPS ISA IV instructions\n\
19220
-mips5                  generate MIPS ISA V instructions\n\
19221
-mips32                 generate MIPS32 ISA instructions\n\
19222
-mips32r2               generate MIPS32 release 2 ISA instructions\n\
19223
-mips64                 generate MIPS64 ISA instructions\n\
19224
-mips64r2               generate MIPS64 release 2 ISA instructions\n\
19225
-march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
19226
 
19227
  first = 1;
19228
 
19229
  for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19230
    show (stream, mips_cpu_info_table[i].name, &column, &first);
19231
  show (stream, "from-abi", &column, &first);
19232
  fputc ('\n', stream);
19233
 
19234
  fprintf (stream, _("\
19235
-mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
19236
-no-mCPU                don't generate code specific to CPU.\n\
19237
                        For -mCPU and -no-mCPU, CPU must be one of:\n"));
19238
 
19239
  first = 1;
19240
 
19241
  show (stream, "3900", &column, &first);
19242
  show (stream, "4010", &column, &first);
19243
  show (stream, "4100", &column, &first);
19244
  show (stream, "4650", &column, &first);
19245
  fputc ('\n', stream);
19246
 
19247
  fprintf (stream, _("\
19248
-mips16                 generate mips16 instructions\n\
19249
-no-mips16              do not generate mips16 instructions\n"));
19250
  fprintf (stream, _("\
19251 160 khays
-mmicromips             generate microMIPS instructions\n\
19252
-mno-micromips          do not generate microMIPS instructions\n"));
19253
  fprintf (stream, _("\
19254 16 khays
-msmartmips             generate smartmips instructions\n\
19255
-mno-smartmips          do not generate smartmips instructions\n"));
19256
  fprintf (stream, _("\
19257
-mdsp                   generate DSP instructions\n\
19258
-mno-dsp                do not generate DSP instructions\n"));
19259
  fprintf (stream, _("\
19260
-mdspr2                 generate DSP R2 instructions\n\
19261
-mno-dspr2              do not generate DSP R2 instructions\n"));
19262
  fprintf (stream, _("\
19263
-mmt                    generate MT instructions\n\
19264
-mno-mt                 do not generate MT instructions\n"));
19265
  fprintf (stream, _("\
19266 160 khays
-mmcu                   generate MCU instructions\n\
19267
-mno-mcu                do not generate MCU instructions\n"));
19268
  fprintf (stream, _("\
19269 16 khays
-mfix-loongson2f-jump   work around Loongson2F JUMP instructions\n\
19270
-mfix-loongson2f-nop    work around Loongson2F NOP errata\n\
19271
-mfix-vr4120            work around certain VR4120 errata\n\
19272
-mfix-vr4130            work around VR4130 mflo/mfhi errata\n\
19273
-mfix-24k               insert a nop after ERET and DERET instructions\n\
19274
-mfix-cn63xxp1          work around CN63XXP1 PREF errata\n\
19275
-mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
19276
-mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
19277
-msym32                 assume all symbols have 32-bit values\n\
19278
-O0                     remove unneeded NOPs, do not swap branches\n\
19279
-O                      remove unneeded NOPs and swap branches\n\
19280
--trap, --no-break      trap exception on div by 0 and mult overflow\n\
19281
--break, --no-trap      break exception on div by 0 and mult overflow\n"));
19282
  fprintf (stream, _("\
19283
-mhard-float            allow floating-point instructions\n\
19284
-msoft-float            do not allow floating-point instructions\n\
19285
-msingle-float          only allow 32-bit floating-point operations\n\
19286
-mdouble-float          allow 32-bit and 64-bit floating-point operations\n\
19287
--[no-]construct-floats [dis]allow floating point values to be constructed\n"
19288
                     ));
19289
#ifdef OBJ_ELF
19290
  fprintf (stream, _("\
19291
-KPIC, -call_shared     generate SVR4 position independent code\n\
19292
-call_nonpic            generate non-PIC code that can operate with DSOs\n\
19293
-mvxworks-pic           generate VxWorks position independent code\n\
19294
-non_shared             do not generate code that can operate with DSOs\n\
19295
-xgot                   assume a 32 bit GOT\n\
19296
-mpdr, -mno-pdr         enable/disable creation of .pdr sections\n\
19297
-mshared, -mno-shared   disable/enable .cpload optimization for\n\
19298
                        position dependent (non shared) code\n\
19299
-mabi=ABI               create ABI conformant object file for:\n"));
19300
 
19301
  first = 1;
19302
 
19303
  show (stream, "32", &column, &first);
19304
  show (stream, "o64", &column, &first);
19305
  show (stream, "n32", &column, &first);
19306
  show (stream, "64", &column, &first);
19307
  show (stream, "eabi", &column, &first);
19308
 
19309
  fputc ('\n', stream);
19310
 
19311
  fprintf (stream, _("\
19312
-32                     create o32 ABI object file (default)\n\
19313
-n32                    create n32 ABI object file\n\
19314
-64                     create 64 ABI object file\n"));
19315
#endif
19316
}
19317
 
19318
#ifdef TE_IRIX
19319
enum dwarf2_format
19320
mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
19321
{
19322
  if (HAVE_64BIT_SYMBOLS)
19323
    return dwarf2_format_64bit_irix;
19324
  else
19325
    return dwarf2_format_32bit;
19326
}
19327
#endif
19328
 
19329
int
19330
mips_dwarf2_addr_size (void)
19331
{
19332
  if (HAVE_64BIT_OBJECTS)
19333
    return 8;
19334
  else
19335
    return 4;
19336
}
19337
 
19338
/* Standard calling conventions leave the CFA at SP on entry.  */
19339
void
19340
mips_cfi_frame_initial_instructions (void)
19341
{
19342
  cfi_add_CFA_def_cfa_register (SP);
19343
}
19344
 
19345
int
19346
tc_mips_regname_to_dw2regnum (char *regname)
19347
{
19348
  unsigned int regnum = -1;
19349
  unsigned int reg;
19350
 
19351
  if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
19352
    regnum = reg;
19353
 
19354
  return regnum;
19355
}

powered by: WebSVN 2.1.0

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