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 160

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

Line No. Rev Author Line
1 16 khays
/* tc-mips.c -- assemble code for a MIPS chip.
2
   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3
   2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4
   Free Software Foundation, Inc.
5
   Contributed by the OSF and Ralph Campbell.
6
   Written by Keith Knowles and Ralph Campbell, working independently.
7
   Modified for ECOFF and R4000 support by Ian Lance Taylor of Cygnus
8
   Support.
9
 
10
   This file is part of GAS.
11
 
12
   GAS is free software; you can redistribute it and/or modify
13
   it under the terms of the GNU General Public License as published by
14
   the Free Software Foundation; either version 3, or (at your option)
15
   any later version.
16
 
17
   GAS is distributed in the hope that it will be useful,
18
   but WITHOUT ANY WARRANTY; without even the implied warranty of
19
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20
   GNU General Public License for more details.
21
 
22
   You should have received a copy of the GNU General Public License
23
   along with GAS; see the file COPYING.  If not, write to the Free
24
   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
25
   02110-1301, USA.  */
26
 
27
#include "as.h"
28
#include "config.h"
29
#include "subsegs.h"
30
#include "safe-ctype.h"
31
 
32
#include "opcode/mips.h"
33
#include "itbl-ops.h"
34
#include "dwarf2dbg.h"
35
#include "dw2gencfi.h"
36
 
37
#ifdef DEBUG
38
#define DBG(x) printf x
39
#else
40
#define DBG(x)
41
#endif
42
 
43
#ifdef OBJ_MAYBE_ELF
44
/* Clean up namespace so we can include obj-elf.h too.  */
45
static int mips_output_flavor (void);
46
static int mips_output_flavor (void) { return OUTPUT_FLAVOR; }
47
#undef OBJ_PROCESS_STAB
48
#undef OUTPUT_FLAVOR
49
#undef S_GET_ALIGN
50
#undef S_GET_SIZE
51
#undef S_SET_ALIGN
52
#undef S_SET_SIZE
53
#undef obj_frob_file
54
#undef obj_frob_file_after_relocs
55
#undef obj_frob_symbol
56
#undef obj_pop_insert
57
#undef obj_sec_sym_ok_for_reloc
58
#undef OBJ_COPY_SYMBOL_ATTRIBUTES
59
 
60
#include "obj-elf.h"
61
/* Fix any of them that we actually care about.  */
62
#undef OUTPUT_FLAVOR
63
#define OUTPUT_FLAVOR mips_output_flavor()
64
#endif
65
 
66
#if defined (OBJ_ELF)
67
#include "elf/mips.h"
68
#endif
69
 
70
#ifndef ECOFF_DEBUGGING
71
#define NO_ECOFF_DEBUGGING
72
#define ECOFF_DEBUGGING 0
73
#endif
74
 
75
int mips_flag_mdebug = -1;
76
 
77
/* Control generation of .pdr sections.  Off by default on IRIX: the native
78
   linker doesn't know about and discards them, but relocations against them
79
   remain, leading to rld crashes.  */
80
#ifdef TE_IRIX
81
int mips_flag_pdr = FALSE;
82
#else
83
int mips_flag_pdr = TRUE;
84
#endif
85
 
86
#include "ecoff.h"
87
 
88
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
89
static char *mips_regmask_frag;
90
#endif
91
 
92
#define ZERO 0
93
#define ATREG 1
94 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
 
3691
  /* -O2 and above is required for this optimization.  */
3692
  if (mips_optimize < 2)
3693
    return FALSE;
3694
 
3695
  /* If we have seen .set volatile or .set nomove, don't optimize.  */
3696
  if (mips_opts.nomove)
3697
    return FALSE;
3698
 
3699
  /* We can't swap if the previous instruction's position is fixed.  */
3700
  if (history[0].fixed_p)
3701
    return FALSE;
3702
 
3703
  /* If the previous previous insn was in a .set noreorder, we can't
3704
     swap.  Actually, the MIPS assembler will swap in this situation.
3705
     However, gcc configured -with-gnu-as will generate code like
3706
 
3707
        .set    noreorder
3708
        lw      $4,XXX
3709
        .set    reorder
3710
        INSN
3711
        bne     $4,$0,foo
3712
 
3713
     in which we can not swap the bne and INSN.  If gcc is not configured
3714
     -with-gnu-as, it does not output the .set pseudo-ops.  */
3715
  if (history[1].noreorder_p)
3716
    return FALSE;
3717
 
3718
  /* If the previous instruction had a fixup in mips16 mode, we can not swap.
3719
     This means that the previous instruction was a 4-byte one anyhow.  */
3720
  if (mips_opts.mips16 && history[0].fixp[0])
3721
    return FALSE;
3722
 
3723
  /* If the branch is itself the target of a branch, we can not swap.
3724
     We cheat on this; all we check for is whether there is a label on
3725
     this instruction.  If there are any branches to anything other than
3726
     a label, users must use .set noreorder.  */
3727
  if (seg_info (now_seg)->label_list)
3728
    return FALSE;
3729
 
3730
  /* If the previous instruction is in a variant frag other than this
3731
     branch's one, we cannot do the swap.  This does not apply to
3732
     MIPS16/microMIPS code, which uses variant frags for different
3733
     purposes.  */
3734
  if (!HAVE_CODE_COMPRESSION
3735
      && history[0].frag
3736
      && history[0].frag->fr_type == rs_machine_dependent)
3737
    return FALSE;
3738
 
3739
  /* We do not swap with instructions that cannot architecturally
3740
     be placed in a branch delay slot, such as SYNC or ERET.  We
3741
     also refrain from swapping with a trap instruction, since it
3742
     complicates trap handlers to have the trap instruction be in
3743
     a delay slot.  */
3744
  prev_pinfo = history[0].insn_mo->pinfo;
3745
  if (prev_pinfo & INSN_NO_DELAY_SLOT)
3746
    return FALSE;
3747
 
3748
  /* Check for conflicts between the branch and the instructions
3749
     before the candidate delay slot.  */
3750
  if (nops_for_insn (0, history + 1, ip) > 0)
3751
    return FALSE;
3752
 
3753
  /* Check for conflicts between the swapped sequence and the
3754
     target of the branch.  */
3755
  if (nops_for_sequence (2, 0, history + 1, ip, history) > 0)
3756
    return FALSE;
3757
 
3758
  /* If the branch reads a register that the previous
3759
     instruction sets, we can not swap.  */
3760
  gpr_read = gpr_read_mask (ip);
3761
  prev_gpr_write = gpr_write_mask (&history[0]);
3762
  if (gpr_read & prev_gpr_write)
3763
    return FALSE;
3764
 
3765
  /* If the branch writes a register that the previous
3766
     instruction sets, we can not swap.  */
3767
  gpr_write = gpr_write_mask (ip);
3768
  if (gpr_write & prev_gpr_write)
3769
    return FALSE;
3770
 
3771
  /* If the branch writes a register that the previous
3772
     instruction reads, we can not swap.  */
3773
  prev_gpr_read = gpr_read_mask (&history[0]);
3774
  if (gpr_write & prev_gpr_read)
3775
    return FALSE;
3776
 
3777
  /* If one instruction sets a condition code and the
3778
     other one uses a condition code, we can not swap.  */
3779
  pinfo = ip->insn_mo->pinfo;
3780
  if ((pinfo & INSN_READ_COND_CODE)
3781
      && (prev_pinfo & INSN_WRITE_COND_CODE))
3782
    return FALSE;
3783
  if ((pinfo & INSN_WRITE_COND_CODE)
3784
      && (prev_pinfo & INSN_READ_COND_CODE))
3785
    return FALSE;
3786
 
3787
  /* If the previous instruction uses the PC, we can not swap.  */
3788
  prev_pinfo2 = history[0].insn_mo->pinfo2;
3789
  if (mips_opts.mips16 && (prev_pinfo & MIPS16_INSN_READ_PC))
3790
    return FALSE;
3791
  if (mips_opts.micromips && (prev_pinfo2 & INSN2_READ_PC))
3792
    return FALSE;
3793
 
3794
  /* If the previous instruction has an incorrect size for a fixed
3795
     branch delay slot in microMIPS mode, we cannot swap.  */
3796
  pinfo2 = ip->insn_mo->pinfo2;
3797
  if (mips_opts.micromips
3798
      && (pinfo2 & INSN2_BRANCH_DELAY_16BIT)
3799
      && insn_length (history) != 2)
3800
    return FALSE;
3801
  if (mips_opts.micromips
3802
      && (pinfo2 & INSN2_BRANCH_DELAY_32BIT)
3803
      && insn_length (history) != 4)
3804
    return FALSE;
3805
 
3806
  return TRUE;
3807
}
3808
 
3809
/* Decide how we should add IP to the instruction stream.  */
3810
 
3811
static enum append_method
3812
get_append_method (struct mips_cl_insn *ip)
3813
{
3814
  unsigned long pinfo;
3815
 
3816
  /* The relaxed version of a macro sequence must be inherently
3817
     hazard-free.  */
3818
  if (mips_relax.sequence == 2)
3819
    return APPEND_ADD;
3820
 
3821
  /* We must not dabble with instructions in a ".set norerorder" block.  */
3822
  if (mips_opts.noreorder)
3823
    return APPEND_ADD;
3824
 
3825
  /* Otherwise, it's our responsibility to fill branch delay slots.  */
3826
  if (delayed_branch_p (ip))
3827
    {
3828
      if (!branch_likely_p (ip) && can_swap_branch_p (ip))
3829
        return APPEND_SWAP;
3830
 
3831
      pinfo = ip->insn_mo->pinfo;
3832
      if (mips_opts.mips16
3833
          && ISA_SUPPORTS_MIPS16E
3834
          && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31)))
3835
        return APPEND_ADD_COMPACT;
3836
 
3837
      return APPEND_ADD_WITH_NOP;
3838
    }
3839
 
3840
  return APPEND_ADD;
3841
}
3842
 
3843
/* IP is a MIPS16 instruction whose opcode we have just changed.
3844
   Point IP->insn_mo to the new opcode's definition.  */
3845
 
3846
static void
3847
find_altered_mips16_opcode (struct mips_cl_insn *ip)
3848
{
3849
  const struct mips_opcode *mo, *end;
3850
 
3851
  end = &mips16_opcodes[bfd_mips16_num_opcodes];
3852
  for (mo = ip->insn_mo; mo < end; mo++)
3853
    if ((ip->insn_opcode & mo->mask) == mo->match)
3854
      {
3855
        ip->insn_mo = mo;
3856
        return;
3857
      }
3858
  abort ();
3859
}
3860
 
3861
/* For microMIPS macros, we need to generate a local number label
3862
   as the target of branches.  */
3863
#define MICROMIPS_LABEL_CHAR            '\037'
3864
static unsigned long micromips_target_label;
3865
static char micromips_target_name[32];
3866
 
3867
static char *
3868
micromips_label_name (void)
3869
{
3870
  char *p = micromips_target_name;
3871
  char symbol_name_temporary[24];
3872
  unsigned long l;
3873
  int i;
3874
 
3875
  if (*p)
3876
    return p;
3877
 
3878
  i = 0;
3879
  l = micromips_target_label;
3880
#ifdef LOCAL_LABEL_PREFIX
3881
  *p++ = LOCAL_LABEL_PREFIX;
3882
#endif
3883
  *p++ = 'L';
3884
  *p++ = MICROMIPS_LABEL_CHAR;
3885
  do
3886
    {
3887
      symbol_name_temporary[i++] = l % 10 + '0';
3888
      l /= 10;
3889
    }
3890
  while (l != 0);
3891
  while (i > 0)
3892
    *p++ = symbol_name_temporary[--i];
3893
  *p = '\0';
3894
 
3895
  return micromips_target_name;
3896
}
3897
 
3898
static void
3899
micromips_label_expr (expressionS *label_expr)
3900
{
3901
  label_expr->X_op = O_symbol;
3902
  label_expr->X_add_symbol = symbol_find_or_make (micromips_label_name ());
3903
  label_expr->X_add_number = 0;
3904
}
3905
 
3906
static void
3907
micromips_label_inc (void)
3908
{
3909
  micromips_target_label++;
3910
  *micromips_target_name = '\0';
3911
}
3912
 
3913
static void
3914
micromips_add_label (void)
3915
{
3916
  symbolS *s;
3917
 
3918
  s = colon (micromips_label_name ());
3919
  micromips_label_inc ();
3920
#if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
3921
  if (IS_ELF)
3922
    S_SET_OTHER (s, ELF_ST_SET_MICROMIPS (S_GET_OTHER (s)));
3923
#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
 
4595
  mips_opts.noreorder--;
4596
  if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
4597
    {
4598
      /* Commit to inserting prev_nop_frag_required nops and go back to
4599
         handling nop insertion the .set reorder way.  */
4600
      prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
4601 160 khays
                                * NOP_INSN_SIZE);
4602 16 khays
      insert_into_history (prev_nop_frag_since,
4603
                           prev_nop_frag_required, NOP_INSN);
4604
      prev_nop_frag = NULL;
4605
    }
4606
}
4607
 
4608
/* Set up global variables for the start of a new macro.  */
4609
 
4610
static void
4611
macro_start (void)
4612
{
4613
  memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
4614 160 khays
  memset (&mips_macro_warning.first_insn_sizes, 0,
4615
          sizeof (mips_macro_warning.first_insn_sizes));
4616
  memset (&mips_macro_warning.insns, 0, sizeof (mips_macro_warning.insns));
4617 16 khays
  mips_macro_warning.delay_slot_p = (mips_opts.noreorder
4618 160 khays
                                     && delayed_branch_p (&history[0]));
4619
  switch (history[0].insn_mo->pinfo2
4620
          & (INSN2_BRANCH_DELAY_32BIT | INSN2_BRANCH_DELAY_16BIT))
4621
    {
4622
    case INSN2_BRANCH_DELAY_32BIT:
4623
      mips_macro_warning.delay_slot_length = 4;
4624
      break;
4625
    case INSN2_BRANCH_DELAY_16BIT:
4626
      mips_macro_warning.delay_slot_length = 2;
4627
      break;
4628
    default:
4629
      mips_macro_warning.delay_slot_length = 0;
4630
      break;
4631
    }
4632
  mips_macro_warning.first_frag = NULL;
4633 16 khays
}
4634
 
4635 160 khays
/* Given that a macro is longer than one instruction or of the wrong size,
4636
   return the appropriate warning for it.  Return null if no warning is
4637
   needed.  SUBTYPE is a bitmask of RELAX_DELAY_SLOT, RELAX_DELAY_SLOT_16BIT,
4638
   RELAX_DELAY_SLOT_SIZE_FIRST, RELAX_DELAY_SLOT_SIZE_SECOND,
4639
   and RELAX_NOMACRO.  */
4640 16 khays
 
4641
static const char *
4642
macro_warning (relax_substateT subtype)
4643
{
4644
  if (subtype & RELAX_DELAY_SLOT)
4645
    return _("Macro instruction expanded into multiple instructions"
4646
             " in a branch delay slot");
4647
  else if (subtype & RELAX_NOMACRO)
4648
    return _("Macro instruction expanded into multiple instructions");
4649 160 khays
  else if (subtype & (RELAX_DELAY_SLOT_SIZE_FIRST
4650
                      | RELAX_DELAY_SLOT_SIZE_SECOND))
4651
    return ((subtype & RELAX_DELAY_SLOT_16BIT)
4652
            ? _("Macro instruction expanded into a wrong size instruction"
4653
                " in a 16-bit branch delay slot")
4654
            : _("Macro instruction expanded into a wrong size instruction"
4655
                " in a 32-bit branch delay slot"));
4656 16 khays
  else
4657
    return 0;
4658
}
4659
 
4660
/* Finish up a macro.  Emit warnings as appropriate.  */
4661
 
4662
static void
4663
macro_end (void)
4664
{
4665 160 khays
  /* Relaxation warning flags.  */
4666
  relax_substateT subtype = 0;
4667
 
4668
  /* Check delay slot size requirements.  */
4669
  if (mips_macro_warning.delay_slot_length == 2)
4670
    subtype |= RELAX_DELAY_SLOT_16BIT;
4671
  if (mips_macro_warning.delay_slot_length != 0)
4672 16 khays
    {
4673 160 khays
      if (mips_macro_warning.delay_slot_length
4674
          != mips_macro_warning.first_insn_sizes[0])
4675
        subtype |= RELAX_DELAY_SLOT_SIZE_FIRST;
4676
      if (mips_macro_warning.delay_slot_length
4677
          != mips_macro_warning.first_insn_sizes[1])
4678
        subtype |= RELAX_DELAY_SLOT_SIZE_SECOND;
4679
    }
4680 16 khays
 
4681 160 khays
  /* Check instruction count requirements.  */
4682
  if (mips_macro_warning.insns[0] > 1 || mips_macro_warning.insns[1] > 1)
4683
    {
4684
      if (mips_macro_warning.insns[1] > mips_macro_warning.insns[0])
4685 16 khays
        subtype |= RELAX_SECOND_LONGER;
4686
      if (mips_opts.warn_about_macros)
4687
        subtype |= RELAX_NOMACRO;
4688
      if (mips_macro_warning.delay_slot_p)
4689
        subtype |= RELAX_DELAY_SLOT;
4690 160 khays
    }
4691 16 khays
 
4692 160 khays
  /* If both alternatives fail to fill a delay slot correctly,
4693
     emit the warning now.  */
4694
  if ((subtype & RELAX_DELAY_SLOT_SIZE_FIRST) != 0
4695
      && (subtype & RELAX_DELAY_SLOT_SIZE_SECOND) != 0)
4696
    {
4697
      relax_substateT s;
4698
      const char *msg;
4699
 
4700
      s = subtype & (RELAX_DELAY_SLOT_16BIT
4701
                     | RELAX_DELAY_SLOT_SIZE_FIRST
4702
                     | RELAX_DELAY_SLOT_SIZE_SECOND);
4703
      msg = macro_warning (s);
4704
      if (msg != NULL)
4705
        as_warn ("%s", msg);
4706
      subtype &= ~s;
4707 16 khays
    }
4708 160 khays
 
4709
  /* If both implementations are longer than 1 instruction, then emit the
4710
     warning now.  */
4711
  if (mips_macro_warning.insns[0] > 1 && mips_macro_warning.insns[1] > 1)
4712
    {
4713
      relax_substateT s;
4714
      const char *msg;
4715
 
4716
      s = subtype & (RELAX_SECOND_LONGER | RELAX_NOMACRO | RELAX_DELAY_SLOT);
4717
      msg = macro_warning (s);
4718
      if (msg != NULL)
4719
        as_warn ("%s", msg);
4720
      subtype &= ~s;
4721
    }
4722
 
4723
  /* If any flags still set, then one implementation might need a warning
4724
     and the other either will need one of a different kind or none at all.
4725
     Pass any remaining flags over to relaxation.  */
4726
  if (mips_macro_warning.first_frag != NULL)
4727
    mips_macro_warning.first_frag->fr_subtype |= subtype;
4728 16 khays
}
4729
 
4730 160 khays
/* Instruction operand formats used in macros that vary between
4731
   standard MIPS and microMIPS code.  */
4732
 
4733
static const char * const brk_fmt[2] = { "c", "mF" };
4734
static const char * const cop12_fmt[2] = { "E,o(b)", "E,~(b)" };
4735
static const char * const jalr_fmt[2] = { "d,s", "t,s" };
4736
static const char * const lui_fmt[2] = { "t,u", "s,u" };
4737
static const char * const mem12_fmt[2] = { "t,o(b)", "t,~(b)" };
4738
static const char * const mfhl_fmt[2] = { "d", "mj" };
4739
static const char * const shft_fmt[2] = { "d,w,<", "t,r,<" };
4740
static const char * const trap_fmt[2] = { "s,t,q", "s,t,|" };
4741
 
4742
#define BRK_FMT (brk_fmt[mips_opts.micromips])
4743
#define COP12_FMT (cop12_fmt[mips_opts.micromips])
4744
#define JALR_FMT (jalr_fmt[mips_opts.micromips])
4745
#define LUI_FMT (lui_fmt[mips_opts.micromips])
4746
#define MEM12_FMT (mem12_fmt[mips_opts.micromips])
4747
#define MFHL_FMT (mfhl_fmt[mips_opts.micromips])
4748
#define SHFT_FMT (shft_fmt[mips_opts.micromips])
4749
#define TRAP_FMT (trap_fmt[mips_opts.micromips])
4750
 
4751 16 khays
/* Read a macro's relocation codes from *ARGS and store them in *R.
4752
   The first argument in *ARGS will be either the code for a single
4753
   relocation or -1 followed by the three codes that make up a
4754
   composite relocation.  */
4755
 
4756
static void
4757
macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
4758
{
4759
  int i, next;
4760
 
4761
  next = va_arg (*args, int);
4762
  if (next >= 0)
4763
    r[0] = (bfd_reloc_code_real_type) next;
4764
  else
4765
    for (i = 0; i < 3; i++)
4766
      r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
4767
}
4768
 
4769
/* Build an instruction created by a macro expansion.  This is passed
4770
   a pointer to the count of instructions created so far, an
4771
   expression, the name of the instruction to build, an operand format
4772
   string, and corresponding arguments.  */
4773
 
4774
static void
4775
macro_build (expressionS *ep, const char *name, const char *fmt, ...)
4776
{
4777 160 khays
  const struct mips_opcode *mo = NULL;
4778
  bfd_reloc_code_real_type r[3];
4779
  const struct mips_opcode *amo;
4780
  struct hash_control *hash;
4781 16 khays
  struct mips_cl_insn insn;
4782
  va_list args;
4783
 
4784
  va_start (args, fmt);
4785
 
4786
  if (mips_opts.mips16)
4787
    {
4788
      mips16_macro_build (ep, name, fmt, &args);
4789
      va_end (args);
4790
      return;
4791
    }
4792
 
4793
  r[0] = BFD_RELOC_UNUSED;
4794
  r[1] = BFD_RELOC_UNUSED;
4795
  r[2] = BFD_RELOC_UNUSED;
4796 160 khays
  hash = mips_opts.micromips ? micromips_op_hash : op_hash;
4797
  amo = (struct mips_opcode *) hash_find (hash, name);
4798
  gas_assert (amo);
4799
  gas_assert (strcmp (name, amo->name) == 0);
4800 16 khays
 
4801 160 khays
  do
4802 16 khays
    {
4803
      /* Search until we get a match for NAME.  It is assumed here that
4804 160 khays
         macros will never generate MDMX, MIPS-3D, or MT instructions.
4805
         We try to match an instruction that fulfils the branch delay
4806
         slot instruction length requirement (if any) of the previous
4807
         instruction.  While doing this we record the first instruction
4808
         seen that matches all the other conditions and use it anyway
4809
         if the requirement cannot be met; we will issue an appropriate
4810
         warning later on.  */
4811
      if (strcmp (fmt, amo->args) == 0
4812
          && amo->pinfo != INSN_MACRO
4813
          && is_opcode_valid (amo)
4814
          && is_size_valid (amo))
4815
        {
4816
          if (is_delay_slot_valid (amo))
4817
            {
4818
              mo = amo;
4819
              break;
4820
            }
4821
          else if (!mo)
4822
            mo = amo;
4823
        }
4824 16 khays
 
4825 160 khays
      ++amo;
4826
      gas_assert (amo->name);
4827 16 khays
    }
4828 160 khays
  while (strcmp (name, amo->name) == 0);
4829 16 khays
 
4830 160 khays
  gas_assert (mo);
4831 16 khays
  create_insn (&insn, mo);
4832
  for (;;)
4833
    {
4834
      switch (*fmt++)
4835
        {
4836
        case '\0':
4837
          break;
4838
 
4839
        case ',':
4840
        case '(':
4841
        case ')':
4842
          continue;
4843
 
4844
        case '+':
4845
          switch (*fmt++)
4846
            {
4847
            case 'A':
4848
            case 'E':
4849 160 khays
              INSERT_OPERAND (mips_opts.micromips,
4850
                              EXTLSB, insn, va_arg (args, int));
4851 16 khays
              continue;
4852
 
4853
            case 'B':
4854
            case 'F':
4855
              /* Note that in the macro case, these arguments are already
4856
                 in MSB form.  (When handling the instruction in the
4857
                 non-macro case, these arguments are sizes from which
4858
                 MSB values must be calculated.)  */
4859 160 khays
              INSERT_OPERAND (mips_opts.micromips,
4860
                              INSMSB, insn, va_arg (args, int));
4861 16 khays
              continue;
4862
 
4863
            case 'C':
4864
            case 'G':
4865
            case 'H':
4866
              /* Note that in the macro case, these arguments are already
4867
                 in MSBD form.  (When handling the instruction in the
4868
                 non-macro case, these arguments are sizes from which
4869
                 MSBD values must be calculated.)  */
4870 160 khays
              INSERT_OPERAND (mips_opts.micromips,
4871
                              EXTMSBD, insn, va_arg (args, int));
4872 16 khays
              continue;
4873
 
4874
            case 'Q':
4875 160 khays
              gas_assert (!mips_opts.micromips);
4876
              INSERT_OPERAND (0, SEQI, insn, va_arg (args, int));
4877 16 khays
              continue;
4878
 
4879
            default:
4880
              internalError ();
4881
            }
4882
          continue;
4883
 
4884
        case '2':
4885 160 khays
          gas_assert (!mips_opts.micromips);
4886
          INSERT_OPERAND (0, BP, insn, va_arg (args, int));
4887 16 khays
          continue;
4888
 
4889 160 khays
        case 'n':
4890
          gas_assert (mips_opts.micromips);
4891 16 khays
        case 't':
4892
        case 'w':
4893
        case 'E':
4894 160 khays
          INSERT_OPERAND (mips_opts.micromips, RT, insn, va_arg (args, int));
4895 16 khays
          continue;
4896
 
4897
        case 'c':
4898 160 khays
          gas_assert (!mips_opts.micromips);
4899
          INSERT_OPERAND (0, CODE, insn, va_arg (args, int));
4900 16 khays
          continue;
4901
 
4902 160 khays
        case 'W':
4903
          gas_assert (!mips_opts.micromips);
4904 16 khays
        case 'T':
4905 160 khays
          INSERT_OPERAND (mips_opts.micromips, FT, insn, va_arg (args, int));
4906 16 khays
          continue;
4907
 
4908
        case 'G':
4909 160 khays
          if (mips_opts.micromips)
4910
            INSERT_OPERAND (1, RS, insn, va_arg (args, int));
4911
          else
4912
            INSERT_OPERAND (0, RD, insn, va_arg (args, int));
4913
          continue;
4914
 
4915 16 khays
        case 'K':
4916 160 khays
          gas_assert (!mips_opts.micromips);
4917
        case 'd':
4918
          INSERT_OPERAND (mips_opts.micromips, RD, insn, va_arg (args, int));
4919 16 khays
          continue;
4920
 
4921
        case 'U':
4922 160 khays
          gas_assert (!mips_opts.micromips);
4923 16 khays
          {
4924
            int tmp = va_arg (args, int);
4925
 
4926 160 khays
            INSERT_OPERAND (0, RT, insn, tmp);
4927
            INSERT_OPERAND (0, RD, insn, tmp);
4928 16 khays
          }
4929 160 khays
          continue;
4930 16 khays
 
4931
        case 'V':
4932
        case 'S':
4933 160 khays
          gas_assert (!mips_opts.micromips);
4934
          INSERT_OPERAND (0, FS, insn, va_arg (args, int));
4935 16 khays
          continue;
4936
 
4937
        case 'z':
4938
          continue;
4939
 
4940
        case '<':
4941 160 khays
          INSERT_OPERAND (mips_opts.micromips,
4942
                          SHAMT, insn, va_arg (args, int));
4943 16 khays
          continue;
4944
 
4945
        case 'D':
4946 160 khays
          gas_assert (!mips_opts.micromips);
4947
          INSERT_OPERAND (0, FD, insn, va_arg (args, int));
4948 16 khays
          continue;
4949
 
4950
        case 'B':
4951 160 khays
          gas_assert (!mips_opts.micromips);
4952
          INSERT_OPERAND (0, CODE20, insn, va_arg (args, int));
4953 16 khays
          continue;
4954
 
4955
        case 'J':
4956 160 khays
          gas_assert (!mips_opts.micromips);
4957
          INSERT_OPERAND (0, CODE19, insn, va_arg (args, int));
4958 16 khays
          continue;
4959
 
4960
        case 'q':
4961 160 khays
          gas_assert (!mips_opts.micromips);
4962
          INSERT_OPERAND (0, CODE2, insn, va_arg (args, int));
4963 16 khays
          continue;
4964
 
4965
        case 'b':
4966
        case 's':
4967
        case 'r':
4968
        case 'v':
4969 160 khays
          INSERT_OPERAND (mips_opts.micromips, RS, insn, va_arg (args, int));
4970 16 khays
          continue;
4971
 
4972
        case 'i':
4973
        case 'j':
4974
          macro_read_relocs (&args, r);
4975
          gas_assert (*r == BFD_RELOC_GPREL16
4976
                      || *r == BFD_RELOC_MIPS_HIGHER
4977
                      || *r == BFD_RELOC_HI16_S
4978
                      || *r == BFD_RELOC_LO16
4979
                      || *r == BFD_RELOC_MIPS_GOT_OFST);
4980
          continue;
4981
 
4982
        case 'o':
4983
          macro_read_relocs (&args, r);
4984
          continue;
4985
 
4986
        case 'u':
4987
          macro_read_relocs (&args, r);
4988
          gas_assert (ep != NULL
4989
                      && (ep->X_op == O_constant
4990
                          || (ep->X_op == O_symbol
4991
                              && (*r == BFD_RELOC_MIPS_HIGHEST
4992
                                  || *r == BFD_RELOC_HI16_S
4993
                                  || *r == BFD_RELOC_HI16
4994
                                  || *r == BFD_RELOC_GPREL16
4995
                                  || *r == BFD_RELOC_MIPS_GOT_HI16
4996
                                  || *r == BFD_RELOC_MIPS_CALL_HI16))));
4997
          continue;
4998
 
4999
        case 'p':
5000
          gas_assert (ep != NULL);
5001
 
5002
          /*
5003
           * This allows macro() to pass an immediate expression for
5004
           * creating short branches without creating a symbol.
5005
           *
5006
           * We don't allow branch relaxation for these branches, as
5007
           * they should only appear in ".set nomacro" anyway.
5008
           */
5009
          if (ep->X_op == O_constant)
5010
            {
5011 160 khays
              /* For microMIPS we always use relocations for branches.
5012
                 So we should not resolve immediate values.  */
5013
              gas_assert (!mips_opts.micromips);
5014
 
5015 16 khays
              if ((ep->X_add_number & 3) != 0)
5016
                as_bad (_("branch to misaligned address (0x%lx)"),
5017
                        (unsigned long) ep->X_add_number);
5018
              if ((ep->X_add_number + 0x20000) & ~0x3ffff)
5019
                as_bad (_("branch address range overflow (0x%lx)"),
5020
                        (unsigned long) ep->X_add_number);
5021
              insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
5022
              ep = NULL;
5023
            }
5024
          else
5025
            *r = BFD_RELOC_16_PCREL_S2;
5026
          continue;
5027
 
5028
        case 'a':
5029
          gas_assert (ep != NULL);
5030
          *r = BFD_RELOC_MIPS_JMP;
5031
          continue;
5032
 
5033
        case 'C':
5034 160 khays
          gas_assert (!mips_opts.micromips);
5035
          INSERT_OPERAND (0, COPZ, insn, va_arg (args, unsigned long));
5036 16 khays
          continue;
5037
 
5038
        case 'k':
5039 160 khays
          INSERT_OPERAND (mips_opts.micromips,
5040
                          CACHE, insn, va_arg (args, unsigned long));
5041 16 khays
          continue;
5042
 
5043 160 khays
        case '|':
5044
          gas_assert (mips_opts.micromips);
5045
          INSERT_OPERAND (1, TRAP, insn, va_arg (args, int));
5046
          continue;
5047
 
5048
        case '.':
5049
          gas_assert (mips_opts.micromips);
5050
          INSERT_OPERAND (1, OFFSET10, insn, va_arg (args, int));
5051
          continue;
5052
 
5053
        case '\\':
5054
          INSERT_OPERAND (mips_opts.micromips,
5055
                          3BITPOS, insn, va_arg (args, unsigned int));
5056
          continue;
5057
 
5058
        case '~':
5059
          INSERT_OPERAND (mips_opts.micromips,
5060
                          OFFSET12, insn, va_arg (args, unsigned long));
5061
          continue;
5062
 
5063
        case 'N':
5064
          gas_assert (mips_opts.micromips);
5065
          INSERT_OPERAND (1, BCC, insn, va_arg (args, int));
5066
          continue;
5067
 
5068
        case 'm':       /* Opcode extension character.  */
5069
          gas_assert (mips_opts.micromips);
5070
          switch (*fmt++)
5071
            {
5072
            case 'j':
5073
              INSERT_OPERAND (1, MJ, insn, va_arg (args, int));
5074
              break;
5075
 
5076
            case 'p':
5077
              INSERT_OPERAND (1, MP, insn, va_arg (args, int));
5078
              break;
5079
 
5080
            case 'F':
5081
              INSERT_OPERAND (1, IMMF, insn, va_arg (args, int));
5082
              break;
5083
 
5084
            default:
5085
              internalError ();
5086
            }
5087
          continue;
5088
 
5089 16 khays
        default:
5090
          internalError ();
5091
        }
5092
      break;
5093
    }
5094
  va_end (args);
5095
  gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
5096
 
5097 160 khays
  append_insn (&insn, ep, r, TRUE);
5098 16 khays
}
5099
 
5100
static void
5101
mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
5102
                    va_list *args)
5103
{
5104
  struct mips_opcode *mo;
5105
  struct mips_cl_insn insn;
5106
  bfd_reloc_code_real_type r[3]
5107
    = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
5108
 
5109
  mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
5110
  gas_assert (mo);
5111
  gas_assert (strcmp (name, mo->name) == 0);
5112
 
5113
  while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
5114
    {
5115
      ++mo;
5116
      gas_assert (mo->name);
5117
      gas_assert (strcmp (name, mo->name) == 0);
5118
    }
5119
 
5120
  create_insn (&insn, mo);
5121
  for (;;)
5122
    {
5123
      int c;
5124
 
5125
      c = *fmt++;
5126
      switch (c)
5127
        {
5128
        case '\0':
5129
          break;
5130
 
5131
        case ',':
5132
        case '(':
5133
        case ')':
5134
          continue;
5135
 
5136
        case 'y':
5137
        case 'w':
5138
          MIPS16_INSERT_OPERAND (RY, insn, va_arg (*args, int));
5139
          continue;
5140
 
5141
        case 'x':
5142
        case 'v':
5143
          MIPS16_INSERT_OPERAND (RX, insn, va_arg (*args, int));
5144
          continue;
5145
 
5146
        case 'z':
5147
          MIPS16_INSERT_OPERAND (RZ, insn, va_arg (*args, int));
5148
          continue;
5149
 
5150
        case 'Z':
5151
          MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (*args, int));
5152
          continue;
5153
 
5154
        case '0':
5155
        case 'S':
5156
        case 'P':
5157
        case 'R':
5158
          continue;
5159
 
5160
        case 'X':
5161
          MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (*args, int));
5162
          continue;
5163
 
5164
        case 'Y':
5165
          {
5166
            int regno;
5167
 
5168
            regno = va_arg (*args, int);
5169
            regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
5170
            MIPS16_INSERT_OPERAND (REG32R, insn, regno);
5171
          }
5172
          continue;
5173
 
5174
        case '<':
5175
        case '>':
5176
        case '4':
5177
        case '5':
5178
        case 'H':
5179
        case 'W':
5180
        case 'D':
5181
        case 'j':
5182
        case '8':
5183
        case 'V':
5184
        case 'C':
5185
        case 'U':
5186
        case 'k':
5187
        case 'K':
5188
        case 'p':
5189
        case 'q':
5190
          {
5191
            gas_assert (ep != NULL);
5192
 
5193
            if (ep->X_op != O_constant)
5194
              *r = (int) BFD_RELOC_UNUSED + c;
5195
            else
5196
              {
5197
                mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
5198
                              FALSE, &insn.insn_opcode, &insn.use_extend,
5199
                              &insn.extend);
5200
                ep = NULL;
5201
                *r = BFD_RELOC_UNUSED;
5202
              }
5203
          }
5204
          continue;
5205
 
5206
        case '6':
5207
          MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (*args, int));
5208
          continue;
5209
        }
5210
 
5211
      break;
5212
    }
5213
 
5214
  gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
5215
 
5216 160 khays
  append_insn (&insn, ep, r, TRUE);
5217 16 khays
}
5218
 
5219
/*
5220
 * Sign-extend 32-bit mode constants that have bit 31 set and all
5221
 * higher bits unset.
5222
 */
5223
static void
5224
normalize_constant_expr (expressionS *ex)
5225
{
5226
  if (ex->X_op == O_constant
5227
      && IS_ZEXT_32BIT_NUM (ex->X_add_number))
5228
    ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
5229
                        - 0x80000000);
5230
}
5231
 
5232
/*
5233
 * Sign-extend 32-bit mode address offsets that have bit 31 set and
5234
 * all higher bits unset.
5235
 */
5236
static void
5237
normalize_address_expr (expressionS *ex)
5238
{
5239
  if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
5240
        || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
5241
      && IS_ZEXT_32BIT_NUM (ex->X_add_number))
5242
    ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
5243
                        - 0x80000000);
5244
}
5245
 
5246
/*
5247
 * Generate a "jalr" instruction with a relocation hint to the called
5248
 * function.  This occurs in NewABI PIC code.
5249
 */
5250
static void
5251 160 khays
macro_build_jalr (expressionS *ep, int cprestore)
5252 16 khays
{
5253 160 khays
  static const bfd_reloc_code_real_type jalr_relocs[2]
5254
    = { BFD_RELOC_MIPS_JALR, BFD_RELOC_MICROMIPS_JALR };
5255
  bfd_reloc_code_real_type jalr_reloc = jalr_relocs[mips_opts.micromips];
5256
  const char *jalr;
5257 16 khays
  char *f = NULL;
5258
 
5259
  if (MIPS_JALR_HINT_P (ep))
5260
    {
5261
      frag_grow (8);
5262
      f = frag_more (0);
5263
    }
5264 160 khays
  if (!mips_opts.micromips)
5265
    macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
5266
  else
5267
    {
5268
      jalr = mips_opts.noreorder && !cprestore ? "jalr" : "jalrs";
5269
      if (MIPS_JALR_HINT_P (ep))
5270
        macro_build (NULL, jalr, "t,s", RA, PIC_CALL_REG);
5271
      else
5272
        macro_build (NULL, jalr, "mj", PIC_CALL_REG);
5273
    }
5274 16 khays
  if (MIPS_JALR_HINT_P (ep))
5275 160 khays
    fix_new_exp (frag_now, f - frag_now->fr_literal, 4, ep, FALSE, jalr_reloc);
5276 16 khays
}
5277
 
5278
/*
5279
 * Generate a "lui" instruction.
5280
 */
5281
static void
5282
macro_build_lui (expressionS *ep, int regnum)
5283
{
5284
  gas_assert (! mips_opts.mips16);
5285
 
5286 160 khays
  if (ep->X_op != O_constant)
5287 16 khays
    {
5288
      gas_assert (ep->X_op == O_symbol);
5289
      /* _gp_disp is a special case, used from s_cpload.
5290
         __gnu_local_gp is used if mips_no_shared.  */
5291
      gas_assert (mips_pic == NO_PIC
5292
              || (! HAVE_NEWABI
5293
                  && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
5294
              || (! mips_in_shared
5295
                  && strcmp (S_GET_NAME (ep->X_add_symbol),
5296
                             "__gnu_local_gp") == 0));
5297
    }
5298
 
5299 160 khays
  macro_build (ep, "lui", LUI_FMT, regnum, BFD_RELOC_HI16_S);
5300 16 khays
}
5301
 
5302
/* Generate a sequence of instructions to do a load or store from a constant
5303
   offset off of a base register (breg) into/from a target register (treg),
5304
   using AT if necessary.  */
5305
static void
5306
macro_build_ldst_constoffset (expressionS *ep, const char *op,
5307
                              int treg, int breg, int dbl)
5308
{
5309
  gas_assert (ep->X_op == O_constant);
5310
 
5311
  /* Sign-extending 32-bit constants makes their handling easier.  */
5312
  if (!dbl)
5313
    normalize_constant_expr (ep);
5314
 
5315
  /* Right now, this routine can only handle signed 32-bit constants.  */
5316
  if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
5317
    as_warn (_("operand overflow"));
5318
 
5319
  if (IS_SEXT_16BIT_NUM(ep->X_add_number))
5320
    {
5321
      /* Signed 16-bit offset will fit in the op.  Easy!  */
5322
      macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
5323
    }
5324
  else
5325
    {
5326
      /* 32-bit offset, need multiple instructions and AT, like:
5327
           lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
5328
           addu     $tempreg,$tempreg,$breg
5329
           <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
5330
         to handle the complete offset.  */
5331
      macro_build_lui (ep, AT);
5332
      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
5333
      macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
5334
 
5335
      if (!mips_opts.at)
5336
        as_bad (_("Macro used $at after \".set noat\""));
5337
    }
5338
}
5339
 
5340
/*                      set_at()
5341
 * Generates code to set the $at register to true (one)
5342
 * if reg is less than the immediate expression.
5343
 */
5344
static void
5345
set_at (int reg, int unsignedp)
5346
{
5347
  if (imm_expr.X_op == O_constant
5348
      && imm_expr.X_add_number >= -0x8000
5349
      && imm_expr.X_add_number < 0x8000)
5350
    macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
5351
                 AT, reg, BFD_RELOC_LO16);
5352
  else
5353
    {
5354
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
5355
      macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
5356
    }
5357
}
5358
 
5359
/* Warn if an expression is not a constant.  */
5360
 
5361
static void
5362
check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
5363
{
5364
  if (ex->X_op == O_big)
5365
    as_bad (_("unsupported large constant"));
5366
  else if (ex->X_op != O_constant)
5367
    as_bad (_("Instruction %s requires absolute expression"),
5368
            ip->insn_mo->name);
5369
 
5370
  if (HAVE_32BIT_GPRS)
5371
    normalize_constant_expr (ex);
5372
}
5373
 
5374
/* Count the leading zeroes by performing a binary chop. This is a
5375
   bulky bit of source, but performance is a LOT better for the
5376
   majority of values than a simple loop to count the bits:
5377
       for (lcnt = 0; (lcnt < 32); lcnt++)
5378
         if ((v) & (1 << (31 - lcnt)))
5379
           break;
5380
  However it is not code size friendly, and the gain will drop a bit
5381
  on certain cached systems.
5382
*/
5383
#define COUNT_TOP_ZEROES(v)             \
5384
  (((v) & ~0xffff) == 0                 \
5385
   ? ((v) & ~0xff) == 0                 \
5386
     ? ((v) & ~0xf) == 0                \
5387
       ? ((v) & ~0x3) == 0              \
5388
         ? ((v) & ~0x1) == 0            \
5389
           ? !(v)                       \
5390
             ? 32                       \
5391
             : 31                       \
5392
           : 30                         \
5393
         : ((v) & ~0x7) == 0            \
5394
           ? 29                         \
5395
           : 28                         \
5396
       : ((v) & ~0x3f) == 0             \
5397
         ? ((v) & ~0x1f) == 0           \
5398
           ? 27                         \
5399
           : 26                         \
5400
         : ((v) & ~0x7f) == 0           \
5401
           ? 25                         \
5402
           : 24                         \
5403
     : ((v) & ~0xfff) == 0              \
5404
       ? ((v) & ~0x3ff) == 0            \
5405
         ? ((v) & ~0x1ff) == 0          \
5406
           ? 23                         \
5407
           : 22                         \
5408
         : ((v) & ~0x7ff) == 0          \
5409
           ? 21                         \
5410
           : 20                         \
5411
       : ((v) & ~0x3fff) == 0           \
5412
         ? ((v) & ~0x1fff) == 0         \
5413
           ? 19                         \
5414
           : 18                         \
5415
         : ((v) & ~0x7fff) == 0         \
5416
           ? 17                         \
5417
           : 16                         \
5418
   : ((v) & ~0xffffff) == 0             \
5419
     ? ((v) & ~0xfffff) == 0            \
5420
       ? ((v) & ~0x3ffff) == 0          \
5421
         ? ((v) & ~0x1ffff) == 0        \
5422
           ? 15                         \
5423
           : 14                         \
5424
         : ((v) & ~0x7ffff) == 0        \
5425
           ? 13                         \
5426
           : 12                         \
5427
       : ((v) & ~0x3fffff) == 0         \
5428
         ? ((v) & ~0x1fffff) == 0       \
5429
           ? 11                         \
5430
           : 10                         \
5431
         : ((v) & ~0x7fffff) == 0       \
5432
           ? 9                          \
5433
           : 8                          \
5434
     : ((v) & ~0xfffffff) == 0          \
5435
       ? ((v) & ~0x3ffffff) == 0        \
5436
         ? ((v) & ~0x1ffffff) == 0      \
5437
           ? 7                          \
5438
           : 6                          \
5439
         : ((v) & ~0x7ffffff) == 0      \
5440
           ? 5                          \
5441
           : 4                          \
5442
       : ((v) & ~0x3fffffff) == 0       \
5443
         ? ((v) & ~0x1fffffff) == 0     \
5444
           ? 3                          \
5445
           : 2                          \
5446
         : ((v) & ~0x7fffffff) == 0     \
5447
           ? 1                          \
5448
           : 0)
5449
 
5450
/*                      load_register()
5451
 *  This routine generates the least number of instructions necessary to load
5452
 *  an absolute expression value into a register.
5453
 */
5454
static void
5455
load_register (int reg, expressionS *ep, int dbl)
5456
{
5457
  int freg;
5458
  expressionS hi32, lo32;
5459
 
5460
  if (ep->X_op != O_big)
5461
    {
5462
      gas_assert (ep->X_op == O_constant);
5463
 
5464
      /* Sign-extending 32-bit constants makes their handling easier.  */
5465
      if (!dbl)
5466
        normalize_constant_expr (ep);
5467
 
5468
      if (IS_SEXT_16BIT_NUM (ep->X_add_number))
5469
        {
5470
          /* We can handle 16 bit signed values with an addiu to
5471
             $zero.  No need to ever use daddiu here, since $zero and
5472
             the result are always correct in 32 bit mode.  */
5473
          macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5474
          return;
5475
        }
5476
      else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
5477
        {
5478
          /* We can handle 16 bit unsigned values with an ori to
5479
             $zero.  */
5480
          macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
5481
          return;
5482
        }
5483
      else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
5484
        {
5485
          /* 32 bit values require an lui.  */
5486 160 khays
          macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
5487 16 khays
          if ((ep->X_add_number & 0xffff) != 0)
5488
            macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
5489
          return;
5490
        }
5491
    }
5492
 
5493
  /* The value is larger than 32 bits.  */
5494
 
5495
  if (!dbl || HAVE_32BIT_GPRS)
5496
    {
5497
      char value[32];
5498
 
5499
      sprintf_vma (value, ep->X_add_number);
5500
      as_bad (_("Number (0x%s) larger than 32 bits"), value);
5501
      macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5502
      return;
5503
    }
5504
 
5505
  if (ep->X_op != O_big)
5506
    {
5507
      hi32 = *ep;
5508
      hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
5509
      hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
5510
      hi32.X_add_number &= 0xffffffff;
5511
      lo32 = *ep;
5512
      lo32.X_add_number &= 0xffffffff;
5513
    }
5514
  else
5515
    {
5516
      gas_assert (ep->X_add_number > 2);
5517
      if (ep->X_add_number == 3)
5518
        generic_bignum[3] = 0;
5519
      else if (ep->X_add_number > 4)
5520
        as_bad (_("Number larger than 64 bits"));
5521
      lo32.X_op = O_constant;
5522
      lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
5523
      hi32.X_op = O_constant;
5524
      hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
5525
    }
5526
 
5527
  if (hi32.X_add_number == 0)
5528
    freg = 0;
5529
  else
5530
    {
5531
      int shift, bit;
5532
      unsigned long hi, lo;
5533
 
5534
      if (hi32.X_add_number == (offsetT) 0xffffffff)
5535
        {
5536
          if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
5537
            {
5538
              macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5539
              return;
5540
            }
5541
          if (lo32.X_add_number & 0x80000000)
5542
            {
5543 160 khays
              macro_build (&lo32, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
5544 16 khays
              if (lo32.X_add_number & 0xffff)
5545
                macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
5546
              return;
5547
            }
5548
        }
5549
 
5550
      /* Check for 16bit shifted constant.  We know that hi32 is
5551
         non-zero, so start the mask on the first bit of the hi32
5552
         value.  */
5553
      shift = 17;
5554
      do
5555
        {
5556
          unsigned long himask, lomask;
5557
 
5558
          if (shift < 32)
5559
            {
5560
              himask = 0xffff >> (32 - shift);
5561
              lomask = (0xffff << shift) & 0xffffffff;
5562
            }
5563
          else
5564
            {
5565
              himask = 0xffff << (shift - 32);
5566
              lomask = 0;
5567
            }
5568
          if ((hi32.X_add_number & ~(offsetT) himask) == 0
5569
              && (lo32.X_add_number & ~(offsetT) lomask) == 0)
5570
            {
5571
              expressionS tmp;
5572
 
5573
              tmp.X_op = O_constant;
5574
              if (shift < 32)
5575
                tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
5576
                                    | (lo32.X_add_number >> shift));
5577
              else
5578
                tmp.X_add_number = hi32.X_add_number >> (shift - 32);
5579
              macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
5580 160 khays
              macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", SHFT_FMT,
5581 16 khays
                           reg, reg, (shift >= 32) ? shift - 32 : shift);
5582
              return;
5583
            }
5584
          ++shift;
5585
        }
5586
      while (shift <= (64 - 16));
5587
 
5588
      /* Find the bit number of the lowest one bit, and store the
5589
         shifted value in hi/lo.  */
5590
      hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
5591
      lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
5592
      if (lo != 0)
5593
        {
5594
          bit = 0;
5595
          while ((lo & 1) == 0)
5596
            {
5597
              lo >>= 1;
5598
              ++bit;
5599
            }
5600
          lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
5601
          hi >>= bit;
5602
        }
5603
      else
5604
        {
5605
          bit = 32;
5606
          while ((hi & 1) == 0)
5607
            {
5608
              hi >>= 1;
5609
              ++bit;
5610
            }
5611
          lo = hi;
5612
          hi = 0;
5613
        }
5614
 
5615
      /* Optimize if the shifted value is a (power of 2) - 1.  */
5616
      if ((hi == 0 && ((lo + 1) & lo) == 0)
5617
          || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
5618
        {
5619
          shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
5620
          if (shift != 0)
5621
            {
5622
              expressionS tmp;
5623
 
5624
              /* This instruction will set the register to be all
5625
                 ones.  */
5626
              tmp.X_op = O_constant;
5627
              tmp.X_add_number = (offsetT) -1;
5628
              macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
5629
              if (bit != 0)
5630
                {
5631
                  bit += shift;
5632 160 khays
                  macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", SHFT_FMT,
5633 16 khays
                               reg, reg, (bit >= 32) ? bit - 32 : bit);
5634
                }
5635 160 khays
              macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", SHFT_FMT,
5636 16 khays
                           reg, reg, (shift >= 32) ? shift - 32 : shift);
5637
              return;
5638
            }
5639
        }
5640
 
5641
      /* Sign extend hi32 before calling load_register, because we can
5642
         generally get better code when we load a sign extended value.  */
5643
      if ((hi32.X_add_number & 0x80000000) != 0)
5644
        hi32.X_add_number |= ~(offsetT) 0xffffffff;
5645
      load_register (reg, &hi32, 0);
5646
      freg = reg;
5647
    }
5648
  if ((lo32.X_add_number & 0xffff0000) == 0)
5649
    {
5650
      if (freg != 0)
5651
        {
5652 160 khays
          macro_build (NULL, "dsll32", SHFT_FMT, reg, freg, 0);
5653 16 khays
          freg = reg;
5654
        }
5655
    }
5656
  else
5657
    {
5658
      expressionS mid16;
5659
 
5660
      if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
5661
        {
5662 160 khays
          macro_build (&lo32, "lui", LUI_FMT, reg, BFD_RELOC_HI16);
5663
          macro_build (NULL, "dsrl32", SHFT_FMT, reg, reg, 0);
5664 16 khays
          return;
5665
        }
5666
 
5667
      if (freg != 0)
5668
        {
5669 160 khays
          macro_build (NULL, "dsll", SHFT_FMT, reg, freg, 16);
5670 16 khays
          freg = reg;
5671
        }
5672
      mid16 = lo32;
5673
      mid16.X_add_number >>= 16;
5674
      macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
5675 160 khays
      macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
5676 16 khays
      freg = reg;
5677
    }
5678
  if ((lo32.X_add_number & 0xffff) != 0)
5679
    macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
5680
}
5681
 
5682
static inline void
5683
load_delay_nop (void)
5684
{
5685
  if (!gpr_interlocks)
5686
    macro_build (NULL, "nop", "");
5687
}
5688
 
5689
/* Load an address into a register.  */
5690
 
5691
static void
5692
load_address (int reg, expressionS *ep, int *used_at)
5693
{
5694
  if (ep->X_op != O_constant
5695
      && ep->X_op != O_symbol)
5696
    {
5697
      as_bad (_("expression too complex"));
5698
      ep->X_op = O_constant;
5699
    }
5700
 
5701
  if (ep->X_op == O_constant)
5702
    {
5703
      load_register (reg, ep, HAVE_64BIT_ADDRESSES);
5704
      return;
5705
    }
5706
 
5707
  if (mips_pic == NO_PIC)
5708
    {
5709
      /* If this is a reference to a GP relative symbol, we want
5710
           addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
5711
         Otherwise we want
5712
           lui          $reg,<sym>              (BFD_RELOC_HI16_S)
5713
           addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
5714
         If we have an addend, we always use the latter form.
5715
 
5716
         With 64bit address space and a usable $at we want
5717
           lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
5718
           lui          $at,<sym>               (BFD_RELOC_HI16_S)
5719
           daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
5720
           daddiu       $at,<sym>               (BFD_RELOC_LO16)
5721
           dsll32       $reg,0
5722
           daddu        $reg,$reg,$at
5723
 
5724
         If $at is already in use, we use a path which is suboptimal
5725
         on superscalar processors.
5726
           lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
5727
           daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
5728
           dsll         $reg,16
5729
           daddiu       $reg,<sym>              (BFD_RELOC_HI16_S)
5730
           dsll         $reg,16
5731
           daddiu       $reg,<sym>              (BFD_RELOC_LO16)
5732
 
5733
         For GP relative symbols in 64bit address space we can use
5734
         the same sequence as in 32bit address space.  */
5735
      if (HAVE_64BIT_SYMBOLS)
5736
        {
5737
          if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
5738
              && !nopic_need_relax (ep->X_add_symbol, 1))
5739
            {
5740
              relax_start (ep->X_add_symbol);
5741
              macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
5742
                           mips_gp_register, BFD_RELOC_GPREL16);
5743
              relax_switch ();
5744
            }
5745
 
5746
          if (*used_at == 0 && mips_opts.at)
5747
            {
5748 160 khays
              macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_HIGHEST);
5749
              macro_build (ep, "lui", LUI_FMT, AT, BFD_RELOC_HI16_S);
5750 16 khays
              macro_build (ep, "daddiu", "t,r,j", reg, reg,
5751
                           BFD_RELOC_MIPS_HIGHER);
5752
              macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
5753 160 khays
              macro_build (NULL, "dsll32", SHFT_FMT, reg, reg, 0);
5754 16 khays
              macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
5755
              *used_at = 1;
5756
            }
5757
          else
5758
            {
5759 160 khays
              macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_HIGHEST);
5760 16 khays
              macro_build (ep, "daddiu", "t,r,j", reg, reg,
5761
                           BFD_RELOC_MIPS_HIGHER);
5762 160 khays
              macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
5763 16 khays
              macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
5764 160 khays
              macro_build (NULL, "dsll", SHFT_FMT, reg, reg, 16);
5765 16 khays
              macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
5766
            }
5767
 
5768
          if (mips_relax.sequence)
5769
            relax_end ();
5770
        }
5771
      else
5772
        {
5773
          if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
5774
              && !nopic_need_relax (ep->X_add_symbol, 1))
5775
            {
5776
              relax_start (ep->X_add_symbol);
5777
              macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
5778
                           mips_gp_register, BFD_RELOC_GPREL16);
5779
              relax_switch ();
5780
            }
5781
          macro_build_lui (ep, reg);
5782
          macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
5783
                       reg, reg, BFD_RELOC_LO16);
5784
          if (mips_relax.sequence)
5785
            relax_end ();
5786
        }
5787
    }
5788
  else if (!mips_big_got)
5789
    {
5790
      expressionS ex;
5791
 
5792
      /* If this is a reference to an external symbol, we want
5793
           lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
5794
         Otherwise we want
5795
           lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
5796
           nop
5797
           addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
5798
         If there is a constant, it must be added in after.
5799
 
5800
         If we have NewABI, we want
5801
           lw           $reg,<sym+cst>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5802
         unless we're referencing a global symbol with a non-zero
5803
         offset, in which case cst must be added separately.  */
5804
      if (HAVE_NEWABI)
5805
        {
5806
          if (ep->X_add_number)
5807
            {
5808
              ex.X_add_number = ep->X_add_number;
5809
              ep->X_add_number = 0;
5810
              relax_start (ep->X_add_symbol);
5811
              macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
5812
                           BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5813
              if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
5814
                as_bad (_("PIC code offset overflow (max 16 signed bits)"));
5815
              ex.X_op = O_constant;
5816
              macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
5817
                           reg, reg, BFD_RELOC_LO16);
5818
              ep->X_add_number = ex.X_add_number;
5819
              relax_switch ();
5820
            }
5821
          macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
5822
                       BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5823
          if (mips_relax.sequence)
5824
            relax_end ();
5825
        }
5826
      else
5827
        {
5828
          ex.X_add_number = ep->X_add_number;
5829
          ep->X_add_number = 0;
5830
          macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
5831
                       BFD_RELOC_MIPS_GOT16, mips_gp_register);
5832
          load_delay_nop ();
5833
          relax_start (ep->X_add_symbol);
5834
          relax_switch ();
5835
          macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
5836
                       BFD_RELOC_LO16);
5837
          relax_end ();
5838
 
5839
          if (ex.X_add_number != 0)
5840
            {
5841
              if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
5842
                as_bad (_("PIC code offset overflow (max 16 signed bits)"));
5843
              ex.X_op = O_constant;
5844
              macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
5845
                           reg, reg, BFD_RELOC_LO16);
5846
            }
5847
        }
5848
    }
5849
  else if (mips_big_got)
5850
    {
5851
      expressionS ex;
5852
 
5853
      /* This is the large GOT case.  If this is a reference to an
5854
         external symbol, we want
5855
           lui          $reg,<sym>              (BFD_RELOC_MIPS_GOT_HI16)
5856
           addu         $reg,$reg,$gp
5857
           lw           $reg,<sym>($reg)        (BFD_RELOC_MIPS_GOT_LO16)
5858
 
5859
         Otherwise, for a reference to a local symbol in old ABI, we want
5860
           lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
5861
           nop
5862
           addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
5863
         If there is a constant, it must be added in after.
5864
 
5865
         In the NewABI, for local symbols, with or without offsets, we want:
5866
           lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
5867
           addiu        $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
5868
      */
5869
      if (HAVE_NEWABI)
5870
        {
5871
          ex.X_add_number = ep->X_add_number;
5872
          ep->X_add_number = 0;
5873
          relax_start (ep->X_add_symbol);
5874 160 khays
          macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_GOT_HI16);
5875 16 khays
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5876
                       reg, reg, mips_gp_register);
5877
          macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
5878
                       reg, BFD_RELOC_MIPS_GOT_LO16, reg);
5879
          if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
5880
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
5881
          else if (ex.X_add_number)
5882
            {
5883
              ex.X_op = O_constant;
5884
              macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
5885
                           BFD_RELOC_LO16);
5886
            }
5887
 
5888
          ep->X_add_number = ex.X_add_number;
5889
          relax_switch ();
5890
          macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
5891
                       BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
5892
          macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
5893
                       BFD_RELOC_MIPS_GOT_OFST);
5894
          relax_end ();
5895
        }
5896
      else
5897
        {
5898
          ex.X_add_number = ep->X_add_number;
5899
          ep->X_add_number = 0;
5900
          relax_start (ep->X_add_symbol);
5901 160 khays
          macro_build (ep, "lui", LUI_FMT, reg, BFD_RELOC_MIPS_GOT_HI16);
5902 16 khays
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5903
                       reg, reg, mips_gp_register);
5904
          macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
5905
                       reg, BFD_RELOC_MIPS_GOT_LO16, reg);
5906
          relax_switch ();
5907
          if (reg_needs_delay (mips_gp_register))
5908
            {
5909
              /* We need a nop before loading from $gp.  This special
5910
                 check is required because the lui which starts the main
5911
                 instruction stream does not refer to $gp, and so will not
5912
                 insert the nop which may be required.  */
5913
              macro_build (NULL, "nop", "");
5914
            }
5915
          macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
5916
                       BFD_RELOC_MIPS_GOT16, mips_gp_register);
5917
          load_delay_nop ();
5918
          macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
5919
                       BFD_RELOC_LO16);
5920
          relax_end ();
5921
 
5922
          if (ex.X_add_number != 0)
5923
            {
5924
              if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
5925
                as_bad (_("PIC code offset overflow (max 16 signed bits)"));
5926
              ex.X_op = O_constant;
5927
              macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
5928
                           BFD_RELOC_LO16);
5929
            }
5930
        }
5931
    }
5932
  else
5933
    abort ();
5934
 
5935
  if (!mips_opts.at && *used_at == 1)
5936
    as_bad (_("Macro used $at after \".set noat\""));
5937
}
5938
 
5939
/* Move the contents of register SOURCE into register DEST.  */
5940
 
5941
static void
5942
move_register (int dest, int source)
5943
{
5944 160 khays
  /* Prefer to use a 16-bit microMIPS instruction unless the previous
5945
     instruction specifically requires a 32-bit one.  */
5946
  if (mips_opts.micromips
5947
      && !(history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT))
5948
    macro_build (NULL, "move", "mp,mj", dest, source );
5949
  else
5950
    macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
5951
                 dest, source, 0);
5952 16 khays
}
5953
 
5954
/* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
5955
   LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
5956
   The two alternatives are:
5957
 
5958
   Global symbol                Local sybmol
5959
   -------------                ------------
5960
   lw DEST,%got(SYMBOL)         lw DEST,%got(SYMBOL + OFFSET)
5961
   ...                          ...
5962
   addiu DEST,DEST,OFFSET       addiu DEST,DEST,%lo(SYMBOL + OFFSET)
5963
 
5964
   load_got_offset emits the first instruction and add_got_offset
5965
   emits the second for a 16-bit offset or add_got_offset_hilo emits
5966
   a sequence to add a 32-bit offset using a scratch register.  */
5967
 
5968
static void
5969
load_got_offset (int dest, expressionS *local)
5970
{
5971
  expressionS global;
5972
 
5973
  global = *local;
5974
  global.X_add_number = 0;
5975
 
5976
  relax_start (local->X_add_symbol);
5977
  macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
5978
               BFD_RELOC_MIPS_GOT16, mips_gp_register);
5979
  relax_switch ();
5980
  macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
5981
               BFD_RELOC_MIPS_GOT16, mips_gp_register);
5982
  relax_end ();
5983
}
5984
 
5985
static void
5986
add_got_offset (int dest, expressionS *local)
5987
{
5988
  expressionS global;
5989
 
5990
  global.X_op = O_constant;
5991
  global.X_op_symbol = NULL;
5992
  global.X_add_symbol = NULL;
5993
  global.X_add_number = local->X_add_number;
5994
 
5995
  relax_start (local->X_add_symbol);
5996
  macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
5997
               dest, dest, BFD_RELOC_LO16);
5998
  relax_switch ();
5999
  macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
6000
  relax_end ();
6001
}
6002
 
6003
static void
6004
add_got_offset_hilo (int dest, expressionS *local, int tmp)
6005
{
6006
  expressionS global;
6007
  int hold_mips_optimize;
6008
 
6009
  global.X_op = O_constant;
6010
  global.X_op_symbol = NULL;
6011
  global.X_add_symbol = NULL;
6012
  global.X_add_number = local->X_add_number;
6013
 
6014
  relax_start (local->X_add_symbol);
6015
  load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
6016
  relax_switch ();
6017
  /* Set mips_optimize around the lui instruction to avoid
6018
     inserting an unnecessary nop after the lw.  */
6019
  hold_mips_optimize = mips_optimize;
6020
  mips_optimize = 2;
6021
  macro_build_lui (&global, tmp);
6022
  mips_optimize = hold_mips_optimize;
6023
  macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
6024
  relax_end ();
6025
 
6026
  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
6027
}
6028
 
6029 160 khays
/* Emit a sequence of instructions to emulate a branch likely operation.
6030
   BR is an ordinary branch corresponding to one to be emulated.  BRNEG
6031
   is its complementing branch with the original condition negated.
6032
   CALL is set if the original branch specified the link operation.
6033
   EP, FMT, SREG and TREG specify the usual macro_build() parameters.
6034
 
6035
   Code like this is produced in the noreorder mode:
6036
 
6037
        BRNEG   <args>, 1f
6038
         nop
6039
        b       <sym>
6040
         delay slot (executed only if branch taken)
6041
    1:
6042
 
6043
   or, if CALL is set:
6044
 
6045
        BRNEG   <args>, 1f
6046
         nop
6047
        bal     <sym>
6048
         delay slot (executed only if branch taken)
6049
    1:
6050
 
6051
   In the reorder mode the delay slot would be filled with a nop anyway,
6052
   so code produced is simply:
6053
 
6054
        BR      <args>, <sym>
6055
         nop
6056
 
6057
   This function is used when producing code for the microMIPS ASE that
6058
   does not implement branch likely instructions in hardware.  */
6059
 
6060
static void
6061
macro_build_branch_likely (const char *br, const char *brneg,
6062
                           int call, expressionS *ep, const char *fmt,
6063
                           unsigned int sreg, unsigned int treg)
6064
{
6065
  int noreorder = mips_opts.noreorder;
6066
  expressionS expr1;
6067
 
6068
  gas_assert (mips_opts.micromips);
6069
  start_noreorder ();
6070
  if (noreorder)
6071
    {
6072
      micromips_label_expr (&expr1);
6073
      macro_build (&expr1, brneg, fmt, sreg, treg);
6074
      macro_build (NULL, "nop", "");
6075
      macro_build (ep, call ? "bal" : "b", "p");
6076
 
6077
      /* Set to true so that append_insn adds a label.  */
6078
      emit_branch_likely_macro = TRUE;
6079
    }
6080
  else
6081
    {
6082
      macro_build (ep, br, fmt, sreg, treg);
6083
      macro_build (NULL, "nop", "");
6084
    }
6085
  end_noreorder ();
6086
}
6087
 
6088
/* Emit a coprocessor branch-likely macro specified by TYPE, using CC as
6089
   the condition code tested.  EP specifies the branch target.  */
6090
 
6091
static void
6092
macro_build_branch_ccl (int type, expressionS *ep, unsigned int cc)
6093
{
6094
  const int call = 0;
6095
  const char *brneg;
6096
  const char *br;
6097
 
6098
  switch (type)
6099
    {
6100
    case M_BC1FL:
6101
      br = "bc1f";
6102
      brneg = "bc1t";
6103
      break;
6104
    case M_BC1TL:
6105
      br = "bc1t";
6106
      brneg = "bc1f";
6107
      break;
6108
    case M_BC2FL:
6109
      br = "bc2f";
6110
      brneg = "bc2t";
6111
      break;
6112
    case M_BC2TL:
6113
      br = "bc2t";
6114
      brneg = "bc2f";
6115
      break;
6116
    default:
6117
      abort ();
6118
    }
6119
  macro_build_branch_likely (br, brneg, call, ep, "N,p", cc, ZERO);
6120
}
6121
 
6122
/* Emit a two-argument branch macro specified by TYPE, using SREG as
6123
   the register tested.  EP specifies the branch target.  */
6124
 
6125
static void
6126
macro_build_branch_rs (int type, expressionS *ep, unsigned int sreg)
6127
{
6128
  const char *brneg = NULL;
6129
  const char *br;
6130
  int call = 0;
6131
 
6132
  switch (type)
6133
    {
6134
    case M_BGEZ:
6135
      br = "bgez";
6136
      break;
6137
    case M_BGEZL:
6138
      br = mips_opts.micromips ? "bgez" : "bgezl";
6139
      brneg = "bltz";
6140
      break;
6141
    case M_BGEZALL:
6142
      gas_assert (mips_opts.micromips);
6143
      br = "bgezals";
6144
      brneg = "bltz";
6145
      call = 1;
6146
      break;
6147
    case M_BGTZ:
6148
      br = "bgtz";
6149
      break;
6150
    case M_BGTZL:
6151
      br = mips_opts.micromips ? "bgtz" : "bgtzl";
6152
      brneg = "blez";
6153
      break;
6154
    case M_BLEZ:
6155
      br = "blez";
6156
      break;
6157
    case M_BLEZL:
6158
      br = mips_opts.micromips ? "blez" : "blezl";
6159
      brneg = "bgtz";
6160
      break;
6161
    case M_BLTZ:
6162
      br = "bltz";
6163
      break;
6164
    case M_BLTZL:
6165
      br = mips_opts.micromips ? "bltz" : "bltzl";
6166
      brneg = "bgez";
6167
      break;
6168
    case M_BLTZALL:
6169
      gas_assert (mips_opts.micromips);
6170
      br = "bltzals";
6171
      brneg = "bgez";
6172
      call = 1;
6173
      break;
6174
    default:
6175
      abort ();
6176
    }
6177
  if (mips_opts.micromips && brneg)
6178
    macro_build_branch_likely (br, brneg, call, ep, "s,p", sreg, ZERO);
6179
  else
6180
    macro_build (ep, br, "s,p", sreg);
6181
}
6182
 
6183
/* Emit a three-argument branch macro specified by TYPE, using SREG and
6184
   TREG as the registers tested.  EP specifies the branch target.  */
6185
 
6186
static void
6187
macro_build_branch_rsrt (int type, expressionS *ep,
6188
                         unsigned int sreg, unsigned int treg)
6189
{
6190
  const char *brneg = NULL;
6191
  const int call = 0;
6192
  const char *br;
6193
 
6194
  switch (type)
6195
    {
6196
    case M_BEQ:
6197
    case M_BEQ_I:
6198
      br = "beq";
6199
      break;
6200
    case M_BEQL:
6201
    case M_BEQL_I:
6202
      br = mips_opts.micromips ? "beq" : "beql";
6203
      brneg = "bne";
6204
      break;
6205
    case M_BNE:
6206
    case M_BNE_I:
6207
      br = "bne";
6208
      break;
6209
    case M_BNEL:
6210
    case M_BNEL_I:
6211
      br = mips_opts.micromips ? "bne" : "bnel";
6212
      brneg = "beq";
6213
      break;
6214
    default:
6215
      abort ();
6216
    }
6217
  if (mips_opts.micromips && brneg)
6218
    macro_build_branch_likely (br, brneg, call, ep, "s,t,p", sreg, treg);
6219
  else
6220
    macro_build (ep, br, "s,t,p", sreg, treg);
6221
}
6222
 
6223 16 khays
/*
6224
 *                      Build macros
6225
 *   This routine implements the seemingly endless macro or synthesized
6226
 * instructions and addressing modes in the mips assembly language. Many
6227
 * of these macros are simple and are similar to each other. These could
6228
 * probably be handled by some kind of table or grammar approach instead of
6229
 * this verbose method. Others are not simple macros but are more like
6230
 * optimizing code generation.
6231
 *   One interesting optimization is when several store macros appear
6232
 * consecutively that would load AT with the upper half of the same address.
6233
 * The ensuing load upper instructions are ommited. This implies some kind
6234
 * of global optimization. We currently only optimize within a single macro.
6235
 *   For many of the load and store macros if the address is specified as a
6236
 * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
6237
 * first load register 'at' with zero and use it as the base register. The
6238
 * mips assembler simply uses register $zero. Just one tiny optimization
6239
 * we're missing.
6240
 */
6241
static void
6242
macro (struct mips_cl_insn *ip)
6243
{
6244
  unsigned int treg, sreg, dreg, breg;
6245
  unsigned int tempreg;
6246
  int mask;
6247
  int used_at = 0;
6248 160 khays
  expressionS label_expr;
6249 16 khays
  expressionS expr1;
6250 160 khays
  expressionS *ep;
6251 16 khays
  const char *s;
6252
  const char *s2;
6253
  const char *fmt;
6254
  int likely = 0;
6255 160 khays
  int coproc = 0;
6256
  int off12 = 0;
6257
  int call = 0;
6258
  int jals = 0;
6259 16 khays
  int dbl = 0;
6260
  int imm = 0;
6261 160 khays
  int ust = 0;
6262
  int lp = 0;
6263
  int ab = 0;
6264 16 khays
  int off;
6265
  offsetT maxnum;
6266
  bfd_reloc_code_real_type r;
6267
  int hold_mips_optimize;
6268
 
6269
  gas_assert (! mips_opts.mips16);
6270
 
6271 160 khays
  treg = EXTRACT_OPERAND (mips_opts.micromips, RT, *ip);
6272
  dreg = EXTRACT_OPERAND (mips_opts.micromips, RD, *ip);
6273
  sreg = breg = EXTRACT_OPERAND (mips_opts.micromips, RS, *ip);
6274 16 khays
  mask = ip->insn_mo->mask;
6275
 
6276 160 khays
  label_expr.X_op = O_constant;
6277
  label_expr.X_op_symbol = NULL;
6278
  label_expr.X_add_symbol = NULL;
6279
  label_expr.X_add_number = 0;
6280
 
6281 16 khays
  expr1.X_op = O_constant;
6282
  expr1.X_op_symbol = NULL;
6283
  expr1.X_add_symbol = NULL;
6284
  expr1.X_add_number = 1;
6285
 
6286
  switch (mask)
6287
    {
6288
    case M_DABS:
6289
      dbl = 1;
6290
    case M_ABS:
6291 160 khays
      /*    bgez    $a0,1f
6292
            move    v0,$a0
6293
            sub     v0,$zero,$a0
6294
         1:
6295
       */
6296 16 khays
 
6297
      start_noreorder ();
6298
 
6299 160 khays
      if (mips_opts.micromips)
6300
        micromips_label_expr (&label_expr);
6301
      else
6302
        label_expr.X_add_number = 8;
6303
      macro_build (&label_expr, "bgez", "s,p", sreg);
6304 16 khays
      if (dreg == sreg)
6305
        macro_build (NULL, "nop", "");
6306
      else
6307
        move_register (dreg, sreg);
6308
      macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
6309 160 khays
      if (mips_opts.micromips)
6310
        micromips_add_label ();
6311 16 khays
 
6312
      end_noreorder ();
6313
      break;
6314
 
6315
    case M_ADD_I:
6316
      s = "addi";
6317
      s2 = "add";
6318
      goto do_addi;
6319
    case M_ADDU_I:
6320
      s = "addiu";
6321
      s2 = "addu";
6322
      goto do_addi;
6323
    case M_DADD_I:
6324
      dbl = 1;
6325
      s = "daddi";
6326
      s2 = "dadd";
6327 160 khays
      if (!mips_opts.micromips)
6328
        goto do_addi;
6329
      if (imm_expr.X_op == O_constant
6330
          && imm_expr.X_add_number >= -0x200
6331
          && imm_expr.X_add_number < 0x200)
6332
        {
6333
          macro_build (NULL, s, "t,r,.", treg, sreg, imm_expr.X_add_number);
6334
          break;
6335
        }
6336
      goto do_addi_i;
6337 16 khays
    case M_DADDU_I:
6338
      dbl = 1;
6339
      s = "daddiu";
6340
      s2 = "daddu";
6341
    do_addi:
6342
      if (imm_expr.X_op == O_constant
6343
          && imm_expr.X_add_number >= -0x8000
6344
          && imm_expr.X_add_number < 0x8000)
6345
        {
6346
          macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
6347
          break;
6348
        }
6349 160 khays
    do_addi_i:
6350 16 khays
      used_at = 1;
6351
      load_register (AT, &imm_expr, dbl);
6352
      macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
6353
      break;
6354
 
6355
    case M_AND_I:
6356
      s = "andi";
6357
      s2 = "and";
6358
      goto do_bit;
6359
    case M_OR_I:
6360
      s = "ori";
6361
      s2 = "or";
6362
      goto do_bit;
6363
    case M_NOR_I:
6364
      s = "";
6365
      s2 = "nor";
6366
      goto do_bit;
6367
    case M_XOR_I:
6368
      s = "xori";
6369
      s2 = "xor";
6370
    do_bit:
6371
      if (imm_expr.X_op == O_constant
6372
          && imm_expr.X_add_number >= 0
6373
          && imm_expr.X_add_number < 0x10000)
6374
        {
6375
          if (mask != M_NOR_I)
6376
            macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
6377
          else
6378
            {
6379
              macro_build (&imm_expr, "ori", "t,r,i",
6380
                           treg, sreg, BFD_RELOC_LO16);
6381
              macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
6382
            }
6383
          break;
6384
        }
6385
 
6386
      used_at = 1;
6387
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
6388
      macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
6389
      break;
6390
 
6391
    case M_BALIGN:
6392
      switch (imm_expr.X_add_number)
6393
        {
6394
        case 0:
6395
          macro_build (NULL, "nop", "");
6396
          break;
6397
        case 2:
6398
          macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
6399
          break;
6400
        default:
6401
          macro_build (NULL, "balign", "t,s,2", treg, sreg,
6402
                       (int) imm_expr.X_add_number);
6403
          break;
6404
        }
6405
      break;
6406
 
6407 160 khays
    case M_BC1FL:
6408
    case M_BC1TL:
6409
    case M_BC2FL:
6410
    case M_BC2TL:
6411
      gas_assert (mips_opts.micromips);
6412
      macro_build_branch_ccl (mask, &offset_expr,
6413
                              EXTRACT_OPERAND (1, BCC, *ip));
6414
      break;
6415
 
6416 16 khays
    case M_BEQ_I:
6417
    case M_BEQL_I:
6418
    case M_BNE_I:
6419
    case M_BNEL_I:
6420
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6421 160 khays
        treg = 0;
6422
      else
6423 16 khays
        {
6424 160 khays
          treg = AT;
6425
          used_at = 1;
6426
          load_register (treg, &imm_expr, HAVE_64BIT_GPRS);
6427 16 khays
        }
6428 160 khays
      /* Fall through.  */
6429
    case M_BEQL:
6430
    case M_BNEL:
6431
      macro_build_branch_rsrt (mask, &offset_expr, sreg, treg);
6432 16 khays
      break;
6433
 
6434
    case M_BGEL:
6435
      likely = 1;
6436
    case M_BGE:
6437
      if (treg == 0)
6438 160 khays
        macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ, &offset_expr, sreg);
6439
      else if (sreg == 0)
6440
        macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, treg);
6441
      else
6442 16 khays
        {
6443 160 khays
          used_at = 1;
6444
          macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
6445
          macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6446
                                   &offset_expr, AT, ZERO);
6447 16 khays
        }
6448
      break;
6449
 
6450 160 khays
    case M_BGEZL:
6451
    case M_BGEZALL:
6452
    case M_BGTZL:
6453
    case M_BLEZL:
6454
    case M_BLTZL:
6455
    case M_BLTZALL:
6456
      macro_build_branch_rs (mask, &offset_expr, sreg);
6457
      break;
6458
 
6459 16 khays
    case M_BGTL_I:
6460
      likely = 1;
6461
    case M_BGT_I:
6462
      /* Check for > max integer.  */
6463
      maxnum = 0x7fffffff;
6464
      if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
6465
        {
6466
          maxnum <<= 16;
6467
          maxnum |= 0xffff;
6468
          maxnum <<= 16;
6469
          maxnum |= 0xffff;
6470
        }
6471
      if (imm_expr.X_op == O_constant
6472
          && imm_expr.X_add_number >= maxnum
6473
          && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
6474
        {
6475
        do_false:
6476
          /* Result is always false.  */
6477
          if (! likely)
6478
            macro_build (NULL, "nop", "");
6479
          else
6480 160 khays
            macro_build_branch_rsrt (M_BNEL, &offset_expr, ZERO, ZERO);
6481 16 khays
          break;
6482
        }
6483
      if (imm_expr.X_op != O_constant)
6484
        as_bad (_("Unsupported large constant"));
6485
      ++imm_expr.X_add_number;
6486
      /* FALLTHROUGH */
6487
    case M_BGE_I:
6488
    case M_BGEL_I:
6489
      if (mask == M_BGEL_I)
6490
        likely = 1;
6491
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6492
        {
6493 160 khays
          macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ,
6494
                                 &offset_expr, sreg);
6495 16 khays
          break;
6496
        }
6497
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6498
        {
6499 160 khays
          macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ,
6500
                                 &offset_expr, sreg);
6501 16 khays
          break;
6502
        }
6503
      maxnum = 0x7fffffff;
6504
      if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
6505
        {
6506
          maxnum <<= 16;
6507
          maxnum |= 0xffff;
6508
          maxnum <<= 16;
6509
          maxnum |= 0xffff;
6510
        }
6511
      maxnum = - maxnum - 1;
6512
      if (imm_expr.X_op == O_constant
6513
          && imm_expr.X_add_number <= maxnum
6514
          && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
6515
        {
6516
        do_true:
6517
          /* result is always true */
6518
          as_warn (_("Branch %s is always true"), ip->insn_mo->name);
6519
          macro_build (&offset_expr, "b", "p");
6520
          break;
6521
        }
6522
      used_at = 1;
6523
      set_at (sreg, 0);
6524 160 khays
      macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6525
                               &offset_expr, AT, ZERO);
6526 16 khays
      break;
6527
 
6528
    case M_BGEUL:
6529
      likely = 1;
6530
    case M_BGEU:
6531
      if (treg == 0)
6532
        goto do_true;
6533 160 khays
      else if (sreg == 0)
6534
        macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6535
                                 &offset_expr, ZERO, treg);
6536
      else
6537 16 khays
        {
6538 160 khays
          used_at = 1;
6539
          macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
6540
          macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6541
                                   &offset_expr, AT, ZERO);
6542 16 khays
        }
6543
      break;
6544
 
6545
    case M_BGTUL_I:
6546
      likely = 1;
6547
    case M_BGTU_I:
6548
      if (sreg == 0
6549
          || (HAVE_32BIT_GPRS
6550
              && imm_expr.X_op == O_constant
6551
              && imm_expr.X_add_number == -1))
6552
        goto do_false;
6553
      if (imm_expr.X_op != O_constant)
6554
        as_bad (_("Unsupported large constant"));
6555
      ++imm_expr.X_add_number;
6556
      /* FALLTHROUGH */
6557
    case M_BGEU_I:
6558
    case M_BGEUL_I:
6559
      if (mask == M_BGEUL_I)
6560
        likely = 1;
6561
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6562
        goto do_true;
6563 160 khays
      else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6564
        macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6565
                                 &offset_expr, sreg, ZERO);
6566
      else
6567 16 khays
        {
6568 160 khays
          used_at = 1;
6569
          set_at (sreg, 1);
6570
          macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6571
                                   &offset_expr, AT, ZERO);
6572 16 khays
        }
6573
      break;
6574
 
6575
    case M_BGTL:
6576
      likely = 1;
6577
    case M_BGT:
6578
      if (treg == 0)
6579 160 khays
        macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ, &offset_expr, sreg);
6580
      else if (sreg == 0)
6581
        macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, treg);
6582
      else
6583 16 khays
        {
6584 160 khays
          used_at = 1;
6585
          macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
6586
          macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6587
                                   &offset_expr, AT, ZERO);
6588 16 khays
        }
6589
      break;
6590
 
6591
    case M_BGTUL:
6592
      likely = 1;
6593
    case M_BGTU:
6594
      if (treg == 0)
6595 160 khays
        macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6596
                                 &offset_expr, sreg, ZERO);
6597
      else if (sreg == 0)
6598
        goto do_false;
6599
      else
6600 16 khays
        {
6601 160 khays
          used_at = 1;
6602
          macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
6603
          macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6604
                                   &offset_expr, AT, ZERO);
6605 16 khays
        }
6606
      break;
6607
 
6608
    case M_BLEL:
6609
      likely = 1;
6610
    case M_BLE:
6611
      if (treg == 0)
6612 160 khays
        macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, sreg);
6613
      else if (sreg == 0)
6614
        macro_build_branch_rs (likely ? M_BGEZL : M_BGEZ, &offset_expr, treg);
6615
      else
6616 16 khays
        {
6617 160 khays
          used_at = 1;
6618
          macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
6619
          macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6620
                                   &offset_expr, AT, ZERO);
6621 16 khays
        }
6622
      break;
6623
 
6624
    case M_BLEL_I:
6625
      likely = 1;
6626
    case M_BLE_I:
6627
      maxnum = 0x7fffffff;
6628
      if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
6629
        {
6630
          maxnum <<= 16;
6631
          maxnum |= 0xffff;
6632
          maxnum <<= 16;
6633
          maxnum |= 0xffff;
6634
        }
6635
      if (imm_expr.X_op == O_constant
6636
          && imm_expr.X_add_number >= maxnum
6637
          && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
6638
        goto do_true;
6639
      if (imm_expr.X_op != O_constant)
6640
        as_bad (_("Unsupported large constant"));
6641
      ++imm_expr.X_add_number;
6642
      /* FALLTHROUGH */
6643
    case M_BLT_I:
6644
    case M_BLTL_I:
6645
      if (mask == M_BLTL_I)
6646
        likely = 1;
6647
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6648 160 khays
        macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, sreg);
6649
      else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6650
        macro_build_branch_rs (likely ? M_BLEZL : M_BLEZ, &offset_expr, sreg);
6651
      else
6652 16 khays
        {
6653 160 khays
          used_at = 1;
6654
          set_at (sreg, 0);
6655
          macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6656
                                   &offset_expr, AT, ZERO);
6657 16 khays
        }
6658
      break;
6659
 
6660
    case M_BLEUL:
6661
      likely = 1;
6662
    case M_BLEU:
6663
      if (treg == 0)
6664 160 khays
        macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6665
                                 &offset_expr, sreg, ZERO);
6666
      else if (sreg == 0)
6667
        goto do_true;
6668
      else
6669 16 khays
        {
6670 160 khays
          used_at = 1;
6671
          macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
6672
          macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6673
                                   &offset_expr, AT, ZERO);
6674 16 khays
        }
6675
      break;
6676
 
6677
    case M_BLEUL_I:
6678
      likely = 1;
6679
    case M_BLEU_I:
6680
      if (sreg == 0
6681
          || (HAVE_32BIT_GPRS
6682
              && imm_expr.X_op == O_constant
6683
              && imm_expr.X_add_number == -1))
6684
        goto do_true;
6685
      if (imm_expr.X_op != O_constant)
6686
        as_bad (_("Unsupported large constant"));
6687
      ++imm_expr.X_add_number;
6688
      /* FALLTHROUGH */
6689
    case M_BLTU_I:
6690
    case M_BLTUL_I:
6691
      if (mask == M_BLTUL_I)
6692
        likely = 1;
6693
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6694
        goto do_false;
6695 160 khays
      else if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6696
        macro_build_branch_rsrt (likely ? M_BEQL : M_BEQ,
6697
                                 &offset_expr, sreg, ZERO);
6698
      else
6699 16 khays
        {
6700 160 khays
          used_at = 1;
6701
          set_at (sreg, 1);
6702
          macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6703
                                   &offset_expr, AT, ZERO);
6704 16 khays
        }
6705
      break;
6706
 
6707
    case M_BLTL:
6708
      likely = 1;
6709
    case M_BLT:
6710
      if (treg == 0)
6711 160 khays
        macro_build_branch_rs (likely ? M_BLTZL : M_BLTZ, &offset_expr, sreg);
6712
      else if (sreg == 0)
6713
        macro_build_branch_rs (likely ? M_BGTZL : M_BGTZ, &offset_expr, treg);
6714
      else
6715 16 khays
        {
6716 160 khays
          used_at = 1;
6717
          macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
6718
          macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6719
                                   &offset_expr, AT, ZERO);
6720 16 khays
        }
6721
      break;
6722
 
6723
    case M_BLTUL:
6724
      likely = 1;
6725
    case M_BLTU:
6726
      if (treg == 0)
6727
        goto do_false;
6728 160 khays
      else if (sreg == 0)
6729
        macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6730
                                 &offset_expr, ZERO, treg);
6731
      else
6732 16 khays
        {
6733 160 khays
          used_at = 1;
6734
          macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
6735
          macro_build_branch_rsrt (likely ? M_BNEL : M_BNE,
6736
                                   &offset_expr, AT, ZERO);
6737 16 khays
        }
6738
      break;
6739
 
6740
    case M_DEXT:
6741
      {
6742
        /* Use unsigned arithmetic.  */
6743
        addressT pos;
6744
        addressT size;
6745
 
6746
        if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
6747
          {
6748
            as_bad (_("Unsupported large constant"));
6749
            pos = size = 1;
6750
          }
6751
        else
6752
          {
6753
            pos = imm_expr.X_add_number;
6754
            size = imm2_expr.X_add_number;
6755
          }
6756
 
6757
        if (pos > 63)
6758
          {
6759
            as_bad (_("Improper position (%lu)"), (unsigned long) pos);
6760
            pos = 1;
6761
          }
6762
        if (size == 0 || size > 64 || (pos + size - 1) > 63)
6763
          {
6764
            as_bad (_("Improper extract size (%lu, position %lu)"),
6765
                    (unsigned long) size, (unsigned long) pos);
6766
            size = 1;
6767
          }
6768
 
6769
        if (size <= 32 && pos < 32)
6770
          {
6771
            s = "dext";
6772
            fmt = "t,r,+A,+C";
6773
          }
6774
        else if (size <= 32)
6775
          {
6776
            s = "dextu";
6777
            fmt = "t,r,+E,+H";
6778
          }
6779
        else
6780
          {
6781
            s = "dextm";
6782
            fmt = "t,r,+A,+G";
6783
          }
6784
        macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
6785
                     (int) (size - 1));
6786
      }
6787
      break;
6788
 
6789
    case M_DINS:
6790
      {
6791
        /* Use unsigned arithmetic.  */
6792
        addressT pos;
6793
        addressT size;
6794
 
6795
        if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
6796
          {
6797
            as_bad (_("Unsupported large constant"));
6798
            pos = size = 1;
6799
          }
6800
        else
6801
          {
6802
            pos = imm_expr.X_add_number;
6803
            size = imm2_expr.X_add_number;
6804
          }
6805
 
6806
        if (pos > 63)
6807
          {
6808
            as_bad (_("Improper position (%lu)"), (unsigned long) pos);
6809
            pos = 1;
6810
          }
6811
        if (size == 0 || size > 64 || (pos + size - 1) > 63)
6812
          {
6813
            as_bad (_("Improper insert size (%lu, position %lu)"),
6814
                    (unsigned long) size, (unsigned long) pos);
6815
            size = 1;
6816
          }
6817
 
6818
        if (pos < 32 && (pos + size - 1) < 32)
6819
          {
6820
            s = "dins";
6821
            fmt = "t,r,+A,+B";
6822
          }
6823
        else if (pos >= 32)
6824
          {
6825
            s = "dinsu";
6826
            fmt = "t,r,+E,+F";
6827
          }
6828
        else
6829
          {
6830
            s = "dinsm";
6831
            fmt = "t,r,+A,+F";
6832
          }
6833
        macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
6834
                     (int) (pos + size - 1));
6835
      }
6836
      break;
6837
 
6838
    case M_DDIV_3:
6839
      dbl = 1;
6840
    case M_DIV_3:
6841
      s = "mflo";
6842
      goto do_div3;
6843
    case M_DREM_3:
6844
      dbl = 1;
6845
    case M_REM_3:
6846
      s = "mfhi";
6847
    do_div3:
6848
      if (treg == 0)
6849
        {
6850
          as_warn (_("Divide by zero."));
6851
          if (mips_trap)
6852 160 khays
            macro_build (NULL, "teq", TRAP_FMT, ZERO, ZERO, 7);
6853 16 khays
          else
6854 160 khays
            macro_build (NULL, "break", BRK_FMT, 7);
6855 16 khays
          break;
6856
        }
6857
 
6858
      start_noreorder ();
6859
      if (mips_trap)
6860
        {
6861 160 khays
          macro_build (NULL, "teq", TRAP_FMT, treg, ZERO, 7);
6862 16 khays
          macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
6863
        }
6864
      else
6865
        {
6866 160 khays
          if (mips_opts.micromips)
6867
            micromips_label_expr (&label_expr);
6868
          else
6869
            label_expr.X_add_number = 8;
6870
          macro_build (&label_expr, "bne", "s,t,p", treg, ZERO);
6871 16 khays
          macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
6872 160 khays
          macro_build (NULL, "break", BRK_FMT, 7);
6873
          if (mips_opts.micromips)
6874
            micromips_add_label ();
6875 16 khays
        }
6876
      expr1.X_add_number = -1;
6877
      used_at = 1;
6878
      load_register (AT, &expr1, dbl);
6879 160 khays
      if (mips_opts.micromips)
6880
        micromips_label_expr (&label_expr);
6881
      else
6882
        label_expr.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
6883
      macro_build (&label_expr, "bne", "s,t,p", treg, AT);
6884 16 khays
      if (dbl)
6885
        {
6886
          expr1.X_add_number = 1;
6887
          load_register (AT, &expr1, dbl);
6888 160 khays
          macro_build (NULL, "dsll32", SHFT_FMT, AT, AT, 31);
6889 16 khays
        }
6890
      else
6891
        {
6892
          expr1.X_add_number = 0x80000000;
6893 160 khays
          macro_build (&expr1, "lui", LUI_FMT, AT, BFD_RELOC_HI16);
6894 16 khays
        }
6895
      if (mips_trap)
6896
        {
6897 160 khays
          macro_build (NULL, "teq", TRAP_FMT, sreg, AT, 6);
6898 16 khays
          /* We want to close the noreorder block as soon as possible, so
6899
             that later insns are available for delay slot filling.  */
6900
          end_noreorder ();
6901
        }
6902
      else
6903
        {
6904 160 khays
          if (mips_opts.micromips)
6905
            micromips_label_expr (&label_expr);
6906
          else
6907
            label_expr.X_add_number = 8;
6908
          macro_build (&label_expr, "bne", "s,t,p", sreg, AT);
6909 16 khays
          macro_build (NULL, "nop", "");
6910
 
6911
          /* We want to close the noreorder block as soon as possible, so
6912
             that later insns are available for delay slot filling.  */
6913
          end_noreorder ();
6914
 
6915 160 khays
          macro_build (NULL, "break", BRK_FMT, 6);
6916 16 khays
        }
6917 160 khays
      if (mips_opts.micromips)
6918
        micromips_add_label ();
6919
      macro_build (NULL, s, MFHL_FMT, dreg);
6920 16 khays
      break;
6921
 
6922
    case M_DIV_3I:
6923
      s = "div";
6924
      s2 = "mflo";
6925
      goto do_divi;
6926
    case M_DIVU_3I:
6927
      s = "divu";
6928
      s2 = "mflo";
6929
      goto do_divi;
6930
    case M_REM_3I:
6931
      s = "div";
6932
      s2 = "mfhi";
6933
      goto do_divi;
6934
    case M_REMU_3I:
6935
      s = "divu";
6936
      s2 = "mfhi";
6937
      goto do_divi;
6938
    case M_DDIV_3I:
6939
      dbl = 1;
6940
      s = "ddiv";
6941
      s2 = "mflo";
6942
      goto do_divi;
6943
    case M_DDIVU_3I:
6944
      dbl = 1;
6945
      s = "ddivu";
6946
      s2 = "mflo";
6947
      goto do_divi;
6948
    case M_DREM_3I:
6949
      dbl = 1;
6950
      s = "ddiv";
6951
      s2 = "mfhi";
6952
      goto do_divi;
6953
    case M_DREMU_3I:
6954
      dbl = 1;
6955
      s = "ddivu";
6956
      s2 = "mfhi";
6957
    do_divi:
6958
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6959
        {
6960
          as_warn (_("Divide by zero."));
6961
          if (mips_trap)
6962 160 khays
            macro_build (NULL, "teq", TRAP_FMT, ZERO, ZERO, 7);
6963 16 khays
          else
6964 160 khays
            macro_build (NULL, "break", BRK_FMT, 7);
6965 16 khays
          break;
6966
        }
6967
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
6968
        {
6969
          if (strcmp (s2, "mflo") == 0)
6970
            move_register (dreg, sreg);
6971
          else
6972
            move_register (dreg, ZERO);
6973
          break;
6974
        }
6975
      if (imm_expr.X_op == O_constant
6976
          && imm_expr.X_add_number == -1
6977
          && s[strlen (s) - 1] != 'u')
6978
        {
6979
          if (strcmp (s2, "mflo") == 0)
6980
            {
6981
              macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
6982
            }
6983
          else
6984
            move_register (dreg, ZERO);
6985
          break;
6986
        }
6987
 
6988
      used_at = 1;
6989
      load_register (AT, &imm_expr, dbl);
6990
      macro_build (NULL, s, "z,s,t", sreg, AT);
6991 160 khays
      macro_build (NULL, s2, MFHL_FMT, dreg);
6992 16 khays
      break;
6993
 
6994
    case M_DIVU_3:
6995
      s = "divu";
6996
      s2 = "mflo";
6997
      goto do_divu3;
6998
    case M_REMU_3:
6999
      s = "divu";
7000
      s2 = "mfhi";
7001
      goto do_divu3;
7002
    case M_DDIVU_3:
7003
      s = "ddivu";
7004
      s2 = "mflo";
7005
      goto do_divu3;
7006
    case M_DREMU_3:
7007
      s = "ddivu";
7008
      s2 = "mfhi";
7009
    do_divu3:
7010
      start_noreorder ();
7011
      if (mips_trap)
7012
        {
7013 160 khays
          macro_build (NULL, "teq", TRAP_FMT, treg, ZERO, 7);
7014 16 khays
          macro_build (NULL, s, "z,s,t", sreg, treg);
7015
          /* We want to close the noreorder block as soon as possible, so
7016
             that later insns are available for delay slot filling.  */
7017
          end_noreorder ();
7018
        }
7019
      else
7020
        {
7021 160 khays
          if (mips_opts.micromips)
7022
            micromips_label_expr (&label_expr);
7023
          else
7024
            label_expr.X_add_number = 8;
7025
          macro_build (&label_expr, "bne", "s,t,p", treg, ZERO);
7026 16 khays
          macro_build (NULL, s, "z,s,t", sreg, treg);
7027
 
7028
          /* We want to close the noreorder block as soon as possible, so
7029
             that later insns are available for delay slot filling.  */
7030
          end_noreorder ();
7031 160 khays
          macro_build (NULL, "break", BRK_FMT, 7);
7032
          if (mips_opts.micromips)
7033
            micromips_add_label ();
7034 16 khays
        }
7035 160 khays
      macro_build (NULL, s2, MFHL_FMT, dreg);
7036 16 khays
      break;
7037
 
7038
    case M_DLCA_AB:
7039
      dbl = 1;
7040
    case M_LCA_AB:
7041
      call = 1;
7042
      goto do_la;
7043
    case M_DLA_AB:
7044
      dbl = 1;
7045
    case M_LA_AB:
7046
    do_la:
7047
      /* Load the address of a symbol into a register.  If breg is not
7048
         zero, we then add a base register to it.  */
7049
 
7050
      if (dbl && HAVE_32BIT_GPRS)
7051
        as_warn (_("dla used to load 32-bit register"));
7052
 
7053
      if (!dbl && HAVE_64BIT_OBJECTS)
7054
        as_warn (_("la used to load 64-bit address"));
7055
 
7056
      if (offset_expr.X_op == O_constant
7057
          && offset_expr.X_add_number >= -0x8000
7058
          && offset_expr.X_add_number < 0x8000)
7059
        {
7060
          macro_build (&offset_expr, ADDRESS_ADDI_INSN,
7061
                       "t,r,j", treg, sreg, BFD_RELOC_LO16);
7062
          break;
7063
        }
7064
 
7065
      if (mips_opts.at && (treg == breg))
7066
        {
7067
          tempreg = AT;
7068
          used_at = 1;
7069
        }
7070
      else
7071
        {
7072
          tempreg = treg;
7073
        }
7074
 
7075
      if (offset_expr.X_op != O_symbol
7076
          && offset_expr.X_op != O_constant)
7077
        {
7078
          as_bad (_("Expression too complex"));
7079
          offset_expr.X_op = O_constant;
7080
        }
7081
 
7082
      if (offset_expr.X_op == O_constant)
7083
        load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
7084
      else if (mips_pic == NO_PIC)
7085
        {
7086
          /* If this is a reference to a GP relative symbol, we want
7087
               addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
7088
             Otherwise we want
7089
               lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
7090
               addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7091
             If we have a constant, we need two instructions anyhow,
7092
             so we may as well always use the latter form.
7093
 
7094
             With 64bit address space and a usable $at we want
7095
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
7096
               lui      $at,<sym>               (BFD_RELOC_HI16_S)
7097
               daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
7098
               daddiu   $at,<sym>               (BFD_RELOC_LO16)
7099
               dsll32   $tempreg,0
7100
               daddu    $tempreg,$tempreg,$at
7101
 
7102
             If $at is already in use, we use a path which is suboptimal
7103
             on superscalar processors.
7104
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
7105
               daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
7106
               dsll     $tempreg,16
7107
               daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
7108
               dsll     $tempreg,16
7109
               daddiu   $tempreg,<sym>          (BFD_RELOC_LO16)
7110
 
7111
             For GP relative symbols in 64bit address space we can use
7112
             the same sequence as in 32bit address space.  */
7113
          if (HAVE_64BIT_SYMBOLS)
7114
            {
7115
              if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7116
                  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7117
                {
7118
                  relax_start (offset_expr.X_add_symbol);
7119
                  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7120
                               tempreg, mips_gp_register, BFD_RELOC_GPREL16);
7121
                  relax_switch ();
7122
                }
7123
 
7124
              if (used_at == 0 && mips_opts.at)
7125
                {
7126 160 khays
                  macro_build (&offset_expr, "lui", LUI_FMT,
7127 16 khays
                               tempreg, BFD_RELOC_MIPS_HIGHEST);
7128 160 khays
                  macro_build (&offset_expr, "lui", LUI_FMT,
7129 16 khays
                               AT, BFD_RELOC_HI16_S);
7130
                  macro_build (&offset_expr, "daddiu", "t,r,j",
7131
                               tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
7132
                  macro_build (&offset_expr, "daddiu", "t,r,j",
7133
                               AT, AT, BFD_RELOC_LO16);
7134 160 khays
                  macro_build (NULL, "dsll32", SHFT_FMT, tempreg, tempreg, 0);
7135 16 khays
                  macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
7136
                  used_at = 1;
7137
                }
7138
              else
7139
                {
7140 160 khays
                  macro_build (&offset_expr, "lui", LUI_FMT,
7141 16 khays
                               tempreg, BFD_RELOC_MIPS_HIGHEST);
7142
                  macro_build (&offset_expr, "daddiu", "t,r,j",
7143
                               tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
7144 160 khays
                  macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
7145 16 khays
                  macro_build (&offset_expr, "daddiu", "t,r,j",
7146
                               tempreg, tempreg, BFD_RELOC_HI16_S);
7147 160 khays
                  macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
7148 16 khays
                  macro_build (&offset_expr, "daddiu", "t,r,j",
7149
                               tempreg, tempreg, BFD_RELOC_LO16);
7150
                }
7151
 
7152
              if (mips_relax.sequence)
7153
                relax_end ();
7154
            }
7155
          else
7156
            {
7157
              if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7158
                  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7159
                {
7160
                  relax_start (offset_expr.X_add_symbol);
7161
                  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7162
                               tempreg, mips_gp_register, BFD_RELOC_GPREL16);
7163
                  relax_switch ();
7164
                }
7165
              if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
7166
                as_bad (_("Offset too large"));
7167
              macro_build_lui (&offset_expr, tempreg);
7168
              macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7169
                           tempreg, tempreg, BFD_RELOC_LO16);
7170
              if (mips_relax.sequence)
7171
                relax_end ();
7172
            }
7173
        }
7174
      else if (!mips_big_got && !HAVE_NEWABI)
7175
        {
7176
          int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
7177
 
7178
          /* If this is a reference to an external symbol, and there
7179
             is no constant, we want
7180
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7181
             or for lca or if tempreg is PIC_CALL_REG
7182
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
7183
             For a local symbol, we want
7184
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7185
               nop
7186
               addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7187
 
7188
             If we have a small constant, and this is a reference to
7189
             an external symbol, we want
7190
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7191
               nop
7192
               addiu    $tempreg,$tempreg,<constant>
7193
             For a local symbol, we want the same instruction
7194
             sequence, but we output a BFD_RELOC_LO16 reloc on the
7195
             addiu instruction.
7196
 
7197
             If we have a large constant, and this is a reference to
7198
             an external symbol, we want
7199
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7200
               lui      $at,<hiconstant>
7201
               addiu    $at,$at,<loconstant>
7202
               addu     $tempreg,$tempreg,$at
7203
             For a local symbol, we want the same instruction
7204
             sequence, but we output a BFD_RELOC_LO16 reloc on the
7205
             addiu instruction.
7206
           */
7207
 
7208
          if (offset_expr.X_add_number == 0)
7209
            {
7210
              if (mips_pic == SVR4_PIC
7211
                  && breg == 0
7212
                  && (call || tempreg == PIC_CALL_REG))
7213
                lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
7214
 
7215
              relax_start (offset_expr.X_add_symbol);
7216
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7217
                           lw_reloc_type, mips_gp_register);
7218
              if (breg != 0)
7219
                {
7220
                  /* We're going to put in an addu instruction using
7221
                     tempreg, so we may as well insert the nop right
7222
                     now.  */
7223
                  load_delay_nop ();
7224
                }
7225
              relax_switch ();
7226
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7227
                           tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
7228
              load_delay_nop ();
7229
              macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7230
                           tempreg, tempreg, BFD_RELOC_LO16);
7231
              relax_end ();
7232
              /* FIXME: If breg == 0, and the next instruction uses
7233
                 $tempreg, then if this variant case is used an extra
7234
                 nop will be generated.  */
7235
            }
7236
          else if (offset_expr.X_add_number >= -0x8000
7237
                   && offset_expr.X_add_number < 0x8000)
7238
            {
7239
              load_got_offset (tempreg, &offset_expr);
7240
              load_delay_nop ();
7241
              add_got_offset (tempreg, &offset_expr);
7242
            }
7243
          else
7244
            {
7245
              expr1.X_add_number = offset_expr.X_add_number;
7246
              offset_expr.X_add_number =
7247
                ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
7248
              load_got_offset (tempreg, &offset_expr);
7249
              offset_expr.X_add_number = expr1.X_add_number;
7250
              /* If we are going to add in a base register, and the
7251
                 target register and the base register are the same,
7252
                 then we are using AT as a temporary register.  Since
7253
                 we want to load the constant into AT, we add our
7254
                 current AT (from the global offset table) and the
7255
                 register into the register now, and pretend we were
7256
                 not using a base register.  */
7257
              if (breg == treg)
7258
                {
7259
                  load_delay_nop ();
7260
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7261
                               treg, AT, breg);
7262
                  breg = 0;
7263
                  tempreg = treg;
7264
                }
7265
              add_got_offset_hilo (tempreg, &offset_expr, AT);
7266
              used_at = 1;
7267
            }
7268
        }
7269
      else if (!mips_big_got && HAVE_NEWABI)
7270
        {
7271
          int add_breg_early = 0;
7272
 
7273
          /* If this is a reference to an external, and there is no
7274
             constant, or local symbol (*), with or without a
7275
             constant, we want
7276
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
7277
             or for lca or if tempreg is PIC_CALL_REG
7278
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
7279
 
7280
             If we have a small constant, and this is a reference to
7281
             an external symbol, we want
7282
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
7283
               addiu    $tempreg,$tempreg,<constant>
7284
 
7285
             If we have a large constant, and this is a reference to
7286
             an external symbol, we want
7287
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
7288
               lui      $at,<hiconstant>
7289
               addiu    $at,$at,<loconstant>
7290
               addu     $tempreg,$tempreg,$at
7291
 
7292
             (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
7293
             local symbols, even though it introduces an additional
7294
             instruction.  */
7295
 
7296
          if (offset_expr.X_add_number)
7297
            {
7298
              expr1.X_add_number = offset_expr.X_add_number;
7299
              offset_expr.X_add_number = 0;
7300
 
7301
              relax_start (offset_expr.X_add_symbol);
7302
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7303
                           BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7304
 
7305
              if (expr1.X_add_number >= -0x8000
7306
                  && expr1.X_add_number < 0x8000)
7307
                {
7308
                  macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
7309
                               tempreg, tempreg, BFD_RELOC_LO16);
7310
                }
7311
              else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
7312
                {
7313
                  /* If we are going to add in a base register, and the
7314
                     target register and the base register are the same,
7315
                     then we are using AT as a temporary register.  Since
7316
                     we want to load the constant into AT, we add our
7317
                     current AT (from the global offset table) and the
7318
                     register into the register now, and pretend we were
7319
                     not using a base register.  */
7320
                  if (breg != treg)
7321
                    dreg = tempreg;
7322
                  else
7323
                    {
7324
                      gas_assert (tempreg == AT);
7325
                      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7326
                                   treg, AT, breg);
7327
                      dreg = treg;
7328
                      add_breg_early = 1;
7329
                    }
7330
 
7331
                  load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
7332
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7333
                               dreg, dreg, AT);
7334
 
7335
                  used_at = 1;
7336
                }
7337
              else
7338
                as_bad (_("PIC code offset overflow (max 32 signed bits)"));
7339
 
7340
              relax_switch ();
7341
              offset_expr.X_add_number = expr1.X_add_number;
7342
 
7343
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7344
                           BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7345
              if (add_breg_early)
7346
                {
7347
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7348
                               treg, tempreg, breg);
7349
                  breg = 0;
7350
                  tempreg = treg;
7351
                }
7352
              relax_end ();
7353
            }
7354
          else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
7355
            {
7356
              relax_start (offset_expr.X_add_symbol);
7357
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7358
                           BFD_RELOC_MIPS_CALL16, mips_gp_register);
7359
              relax_switch ();
7360
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7361
                           BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7362
              relax_end ();
7363
            }
7364
          else
7365
            {
7366
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7367
                           BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
7368
            }
7369
        }
7370
      else if (mips_big_got && !HAVE_NEWABI)
7371
        {
7372
          int gpdelay;
7373
          int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
7374
          int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
7375
          int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
7376
 
7377
          /* This is the large GOT case.  If this is a reference to an
7378
             external symbol, and there is no constant, we want
7379
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7380
               addu     $tempreg,$tempreg,$gp
7381
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7382
             or for lca or if tempreg is PIC_CALL_REG
7383
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
7384
               addu     $tempreg,$tempreg,$gp
7385
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
7386
             For a local symbol, we want
7387
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7388
               nop
7389
               addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7390
 
7391
             If we have a small constant, and this is a reference to
7392
             an external symbol, we want
7393
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7394
               addu     $tempreg,$tempreg,$gp
7395
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7396
               nop
7397
               addiu    $tempreg,$tempreg,<constant>
7398
             For a local symbol, we want
7399
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7400
               nop
7401
               addiu    $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
7402
 
7403
             If we have a large constant, and this is a reference to
7404
             an external symbol, we want
7405
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7406
               addu     $tempreg,$tempreg,$gp
7407
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7408
               lui      $at,<hiconstant>
7409
               addiu    $at,$at,<loconstant>
7410
               addu     $tempreg,$tempreg,$at
7411
             For a local symbol, we want
7412
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7413
               lui      $at,<hiconstant>
7414
               addiu    $at,$at,<loconstant>    (BFD_RELOC_LO16)
7415
               addu     $tempreg,$tempreg,$at
7416
          */
7417
 
7418
          expr1.X_add_number = offset_expr.X_add_number;
7419
          offset_expr.X_add_number = 0;
7420
          relax_start (offset_expr.X_add_symbol);
7421
          gpdelay = reg_needs_delay (mips_gp_register);
7422
          if (expr1.X_add_number == 0 && breg == 0
7423
              && (call || tempreg == PIC_CALL_REG))
7424
            {
7425
              lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
7426
              lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
7427
            }
7428 160 khays
          macro_build (&offset_expr, "lui", LUI_FMT, tempreg, lui_reloc_type);
7429 16 khays
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7430
                       tempreg, tempreg, mips_gp_register);
7431
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7432
                       tempreg, lw_reloc_type, tempreg);
7433
          if (expr1.X_add_number == 0)
7434
            {
7435
              if (breg != 0)
7436
                {
7437
                  /* We're going to put in an addu instruction using
7438
                     tempreg, so we may as well insert the nop right
7439
                     now.  */
7440
                  load_delay_nop ();
7441
                }
7442
            }
7443
          else if (expr1.X_add_number >= -0x8000
7444
                   && expr1.X_add_number < 0x8000)
7445
            {
7446
              load_delay_nop ();
7447
              macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
7448
                           tempreg, tempreg, BFD_RELOC_LO16);
7449
            }
7450
          else
7451
            {
7452
              /* If we are going to add in a base register, and the
7453
                 target register and the base register are the same,
7454
                 then we are using AT as a temporary register.  Since
7455
                 we want to load the constant into AT, we add our
7456
                 current AT (from the global offset table) and the
7457
                 register into the register now, and pretend we were
7458
                 not using a base register.  */
7459
              if (breg != treg)
7460
                dreg = tempreg;
7461
              else
7462
                {
7463
                  gas_assert (tempreg == AT);
7464
                  load_delay_nop ();
7465
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7466
                               treg, AT, breg);
7467
                  dreg = treg;
7468
                }
7469
 
7470
              load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
7471
              macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
7472
 
7473
              used_at = 1;
7474
            }
7475
          offset_expr.X_add_number =
7476
            ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
7477
          relax_switch ();
7478
 
7479
          if (gpdelay)
7480
            {
7481
              /* This is needed because this instruction uses $gp, but
7482
                 the first instruction on the main stream does not.  */
7483
              macro_build (NULL, "nop", "");
7484
            }
7485
 
7486
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7487
                       local_reloc_type, mips_gp_register);
7488
          if (expr1.X_add_number >= -0x8000
7489
              && expr1.X_add_number < 0x8000)
7490
            {
7491
              load_delay_nop ();
7492
              macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7493
                           tempreg, tempreg, BFD_RELOC_LO16);
7494
              /* FIXME: If add_number is 0, and there was no base
7495
                 register, the external symbol case ended with a load,
7496
                 so if the symbol turns out to not be external, and
7497
                 the next instruction uses tempreg, an unnecessary nop
7498
                 will be inserted.  */
7499
            }
7500
          else
7501
            {
7502
              if (breg == treg)
7503
                {
7504
                  /* We must add in the base register now, as in the
7505
                     external symbol case.  */
7506
                  gas_assert (tempreg == AT);
7507
                  load_delay_nop ();
7508
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7509
                               treg, AT, breg);
7510
                  tempreg = treg;
7511
                  /* We set breg to 0 because we have arranged to add
7512
                     it in in both cases.  */
7513
                  breg = 0;
7514
                }
7515
 
7516
              macro_build_lui (&expr1, AT);
7517
              macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7518
                           AT, AT, BFD_RELOC_LO16);
7519
              macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7520
                           tempreg, tempreg, AT);
7521
              used_at = 1;
7522
            }
7523
          relax_end ();
7524
        }
7525
      else if (mips_big_got && HAVE_NEWABI)
7526
        {
7527
          int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
7528
          int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
7529
          int add_breg_early = 0;
7530
 
7531
          /* This is the large GOT case.  If this is a reference to an
7532
             external symbol, and there is no constant, we want
7533
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7534
               add      $tempreg,$tempreg,$gp
7535
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7536
             or for lca or if tempreg is PIC_CALL_REG
7537
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
7538
               add      $tempreg,$tempreg,$gp
7539
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
7540
 
7541
             If we have a small constant, and this is a reference to
7542
             an external symbol, we want
7543
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7544
               add      $tempreg,$tempreg,$gp
7545
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7546
               addi     $tempreg,$tempreg,<constant>
7547
 
7548
             If we have a large constant, and this is a reference to
7549
             an external symbol, we want
7550
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7551
               addu     $tempreg,$tempreg,$gp
7552
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7553
               lui      $at,<hiconstant>
7554
               addi     $at,$at,<loconstant>
7555
               add      $tempreg,$tempreg,$at
7556
 
7557
             If we have NewABI, and we know it's a local symbol, we want
7558
               lw       $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
7559
               addiu    $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
7560
             otherwise we have to resort to GOT_HI16/GOT_LO16.  */
7561
 
7562
          relax_start (offset_expr.X_add_symbol);
7563
 
7564
          expr1.X_add_number = offset_expr.X_add_number;
7565
          offset_expr.X_add_number = 0;
7566
 
7567
          if (expr1.X_add_number == 0 && breg == 0
7568
              && (call || tempreg == PIC_CALL_REG))
7569
            {
7570
              lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
7571
              lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
7572
            }
7573 160 khays
          macro_build (&offset_expr, "lui", LUI_FMT, tempreg, lui_reloc_type);
7574 16 khays
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7575
                       tempreg, tempreg, mips_gp_register);
7576
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7577
                       tempreg, lw_reloc_type, tempreg);
7578
 
7579
          if (expr1.X_add_number == 0)
7580
            ;
7581
          else if (expr1.X_add_number >= -0x8000
7582
                   && expr1.X_add_number < 0x8000)
7583
            {
7584
              macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
7585
                           tempreg, tempreg, BFD_RELOC_LO16);
7586
            }
7587
          else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
7588
            {
7589
              /* If we are going to add in a base register, and the
7590
                 target register and the base register are the same,
7591
                 then we are using AT as a temporary register.  Since
7592
                 we want to load the constant into AT, we add our
7593
                 current AT (from the global offset table) and the
7594
                 register into the register now, and pretend we were
7595
                 not using a base register.  */
7596
              if (breg != treg)
7597
                dreg = tempreg;
7598
              else
7599
                {
7600
                  gas_assert (tempreg == AT);
7601
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7602
                               treg, AT, breg);
7603
                  dreg = treg;
7604
                  add_breg_early = 1;
7605
                }
7606
 
7607
              load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
7608
              macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
7609
 
7610
              used_at = 1;
7611
            }
7612
          else
7613
            as_bad (_("PIC code offset overflow (max 32 signed bits)"));
7614
 
7615
          relax_switch ();
7616
          offset_expr.X_add_number = expr1.X_add_number;
7617
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7618
                       BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
7619
          macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
7620
                       tempreg, BFD_RELOC_MIPS_GOT_OFST);
7621
          if (add_breg_early)
7622
            {
7623
              macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7624
                           treg, tempreg, breg);
7625
              breg = 0;
7626
              tempreg = treg;
7627
            }
7628
          relax_end ();
7629
        }
7630
      else
7631
        abort ();
7632
 
7633
      if (breg != 0)
7634
        macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
7635
      break;
7636
 
7637
    case M_MSGSND:
7638 160 khays
      gas_assert (!mips_opts.micromips);
7639 16 khays
      {
7640
        unsigned long temp = (treg << 16) | (0x01);
7641
        macro_build (NULL, "c2", "C", temp);
7642
      }
7643
      break;
7644
 
7645
    case M_MSGLD:
7646 160 khays
      gas_assert (!mips_opts.micromips);
7647 16 khays
      {
7648
        unsigned long temp = (0x02);
7649
        macro_build (NULL, "c2", "C", temp);
7650
      }
7651
      break;
7652
 
7653
    case M_MSGLD_T:
7654 160 khays
      gas_assert (!mips_opts.micromips);
7655 16 khays
      {
7656
        unsigned long temp = (treg << 16) | (0x02);
7657
        macro_build (NULL, "c2", "C", temp);
7658
      }
7659
      break;
7660
 
7661
    case M_MSGWAIT:
7662 160 khays
      gas_assert (!mips_opts.micromips);
7663 16 khays
      macro_build (NULL, "c2", "C", 3);
7664
      break;
7665
 
7666
    case M_MSGWAIT_T:
7667 160 khays
      gas_assert (!mips_opts.micromips);
7668 16 khays
      {
7669
        unsigned long temp = (treg << 16) | 0x03;
7670
        macro_build (NULL, "c2", "C", temp);
7671
      }
7672
      break;
7673
 
7674
    case M_J_A:
7675
      /* The j instruction may not be used in PIC code, since it
7676
         requires an absolute address.  We convert it to a b
7677
         instruction.  */
7678
      if (mips_pic == NO_PIC)
7679
        macro_build (&offset_expr, "j", "a");
7680
      else
7681
        macro_build (&offset_expr, "b", "p");
7682
      break;
7683
 
7684
      /* The jal instructions must be handled as macros because when
7685
         generating PIC code they expand to multi-instruction
7686
         sequences.  Normally they are simple instructions.  */
7687 160 khays
    case M_JALS_1:
7688
      dreg = RA;
7689
      /* Fall through.  */
7690
    case M_JALS_2:
7691
      gas_assert (mips_opts.micromips);
7692
      jals = 1;
7693
      goto jal;
7694 16 khays
    case M_JAL_1:
7695
      dreg = RA;
7696
      /* Fall through.  */
7697
    case M_JAL_2:
7698 160 khays
    jal:
7699 16 khays
      if (mips_pic == NO_PIC)
7700 160 khays
        {
7701
          s = jals ? "jalrs" : "jalr";
7702
          if (mips_opts.micromips && dreg == RA)
7703
            macro_build (NULL, s, "mj", sreg);
7704
          else
7705
            macro_build (NULL, s, JALR_FMT, dreg, sreg);
7706
        }
7707 16 khays
      else
7708
        {
7709 160 khays
          int cprestore = (mips_pic == SVR4_PIC && !HAVE_NEWABI
7710
                           && mips_cprestore_offset >= 0);
7711
 
7712 16 khays
          if (sreg != PIC_CALL_REG)
7713
            as_warn (_("MIPS PIC call to register other than $25"));
7714
 
7715 160 khays
          s = (mips_opts.micromips && (!mips_opts.noreorder || cprestore)
7716
               ? "jalrs" : "jalr");
7717
          if (mips_opts.micromips && dreg == RA)
7718
            macro_build (NULL, s, "mj", sreg);
7719
          else
7720
            macro_build (NULL, s, JALR_FMT, dreg, sreg);
7721 16 khays
          if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
7722
            {
7723
              if (mips_cprestore_offset < 0)
7724
                as_warn (_("No .cprestore pseudo-op used in PIC code"));
7725
              else
7726
                {
7727
                  if (!mips_frame_reg_valid)
7728
                    {
7729
                      as_warn (_("No .frame pseudo-op used in PIC code"));
7730
                      /* Quiet this warning.  */
7731
                      mips_frame_reg_valid = 1;
7732
                    }
7733
                  if (!mips_cprestore_valid)
7734
                    {
7735
                      as_warn (_("No .cprestore pseudo-op used in PIC code"));
7736
                      /* Quiet this warning.  */
7737
                      mips_cprestore_valid = 1;
7738
                    }
7739
                  if (mips_opts.noreorder)
7740
                    macro_build (NULL, "nop", "");
7741
                  expr1.X_add_number = mips_cprestore_offset;
7742
                  macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
7743
                                                mips_gp_register,
7744
                                                mips_frame_reg,
7745
                                                HAVE_64BIT_ADDRESSES);
7746
                }
7747
            }
7748
        }
7749
 
7750
      break;
7751
 
7752 160 khays
    case M_JALS_A:
7753
      gas_assert (mips_opts.micromips);
7754
      jals = 1;
7755
      /* Fall through.  */
7756 16 khays
    case M_JAL_A:
7757
      if (mips_pic == NO_PIC)
7758 160 khays
        macro_build (&offset_expr, jals ? "jals" : "jal", "a");
7759 16 khays
      else if (mips_pic == SVR4_PIC)
7760
        {
7761
          /* If this is a reference to an external symbol, and we are
7762
             using a small GOT, we want
7763
               lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
7764
               nop
7765
               jalr     $ra,$25
7766
               nop
7767
               lw       $gp,cprestore($sp)
7768
             The cprestore value is set using the .cprestore
7769
             pseudo-op.  If we are using a big GOT, we want
7770
               lui      $25,<sym>               (BFD_RELOC_MIPS_CALL_HI16)
7771
               addu     $25,$25,$gp
7772
               lw       $25,<sym>($25)          (BFD_RELOC_MIPS_CALL_LO16)
7773
               nop
7774
               jalr     $ra,$25
7775
               nop
7776
               lw       $gp,cprestore($sp)
7777
             If the symbol is not external, we want
7778
               lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7779
               nop
7780
               addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
7781
               jalr     $ra,$25
7782
               nop
7783
               lw $gp,cprestore($sp)
7784
 
7785
             For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
7786
             sequences above, minus nops, unless the symbol is local,
7787
             which enables us to use GOT_PAGE/GOT_OFST (big got) or
7788
             GOT_DISP.  */
7789
          if (HAVE_NEWABI)
7790
            {
7791
              if (!mips_big_got)
7792
                {
7793
                  relax_start (offset_expr.X_add_symbol);
7794
                  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7795
                               PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
7796
                               mips_gp_register);
7797
                  relax_switch ();
7798
                  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7799
                               PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
7800
                               mips_gp_register);
7801
                  relax_end ();
7802
                }
7803
              else
7804
                {
7805
                  relax_start (offset_expr.X_add_symbol);
7806 160 khays
                  macro_build (&offset_expr, "lui", LUI_FMT, PIC_CALL_REG,
7807 16 khays
                               BFD_RELOC_MIPS_CALL_HI16);
7808
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
7809
                               PIC_CALL_REG, mips_gp_register);
7810
                  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7811
                               PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
7812
                               PIC_CALL_REG);
7813
                  relax_switch ();
7814
                  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7815
                               PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
7816
                               mips_gp_register);
7817
                  macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7818
                               PIC_CALL_REG, PIC_CALL_REG,
7819
                               BFD_RELOC_MIPS_GOT_OFST);
7820
                  relax_end ();
7821
                }
7822
 
7823 160 khays
              macro_build_jalr (&offset_expr, 0);
7824 16 khays
            }
7825
          else
7826
            {
7827
              relax_start (offset_expr.X_add_symbol);
7828
              if (!mips_big_got)
7829
                {
7830
                  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7831
                               PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
7832
                               mips_gp_register);
7833
                  load_delay_nop ();
7834
                  relax_switch ();
7835
                }
7836
              else
7837
                {
7838
                  int gpdelay;
7839
 
7840
                  gpdelay = reg_needs_delay (mips_gp_register);
7841 160 khays
                  macro_build (&offset_expr, "lui", LUI_FMT, PIC_CALL_REG,
7842 16 khays
                               BFD_RELOC_MIPS_CALL_HI16);
7843
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
7844
                               PIC_CALL_REG, mips_gp_register);
7845
                  macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7846
                               PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
7847
                               PIC_CALL_REG);
7848
                  load_delay_nop ();
7849
                  relax_switch ();
7850
                  if (gpdelay)
7851
                    macro_build (NULL, "nop", "");
7852
                }
7853
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7854
                           PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
7855
                           mips_gp_register);
7856
              load_delay_nop ();
7857
              macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
7858
                           PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
7859
              relax_end ();
7860 160 khays
              macro_build_jalr (&offset_expr, mips_cprestore_offset >= 0);
7861 16 khays
 
7862
              if (mips_cprestore_offset < 0)
7863
                as_warn (_("No .cprestore pseudo-op used in PIC code"));
7864
              else
7865
                {
7866
                  if (!mips_frame_reg_valid)
7867
                    {
7868
                      as_warn (_("No .frame pseudo-op used in PIC code"));
7869
                      /* Quiet this warning.  */
7870
                      mips_frame_reg_valid = 1;
7871
                    }
7872
                  if (!mips_cprestore_valid)
7873
                    {
7874
                      as_warn (_("No .cprestore pseudo-op used in PIC code"));
7875
                      /* Quiet this warning.  */
7876
                      mips_cprestore_valid = 1;
7877
                    }
7878
                  if (mips_opts.noreorder)
7879
                    macro_build (NULL, "nop", "");
7880
                  expr1.X_add_number = mips_cprestore_offset;
7881
                  macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
7882
                                                mips_gp_register,
7883
                                                mips_frame_reg,
7884
                                                HAVE_64BIT_ADDRESSES);
7885
                }
7886
            }
7887
        }
7888
      else if (mips_pic == VXWORKS_PIC)
7889
        as_bad (_("Non-PIC jump used in PIC library"));
7890
      else
7891
        abort ();
7892
 
7893
      break;
7894
 
7895 160 khays
    case M_ACLR_AB:
7896
      ab = 1;
7897
    case M_ACLR_OB:
7898
      s = "aclr";
7899
      treg = EXTRACT_OPERAND (mips_opts.micromips, 3BITPOS, *ip);
7900
      fmt = "\\,~(b)";
7901
      off12 = 1;
7902
      goto ld_st;
7903
    case M_ASET_AB:
7904
      ab = 1;
7905
    case M_ASET_OB:
7906
      s = "aset";
7907
      treg = EXTRACT_OPERAND (mips_opts.micromips, 3BITPOS, *ip);
7908
      fmt = "\\,~(b)";
7909
      off12 = 1;
7910
      goto ld_st;
7911 16 khays
    case M_LB_AB:
7912 160 khays
      ab = 1;
7913 16 khays
      s = "lb";
7914 160 khays
      fmt = "t,o(b)";
7915 16 khays
      goto ld;
7916
    case M_LBU_AB:
7917 160 khays
      ab = 1;
7918 16 khays
      s = "lbu";
7919 160 khays
      fmt = "t,o(b)";
7920 16 khays
      goto ld;
7921
    case M_LH_AB:
7922 160 khays
      ab = 1;
7923 16 khays
      s = "lh";
7924 160 khays
      fmt = "t,o(b)";
7925 16 khays
      goto ld;
7926
    case M_LHU_AB:
7927 160 khays
      ab = 1;
7928 16 khays
      s = "lhu";
7929 160 khays
      fmt = "t,o(b)";
7930 16 khays
      goto ld;
7931
    case M_LW_AB:
7932 160 khays
      ab = 1;
7933 16 khays
      s = "lw";
7934 160 khays
      fmt = "t,o(b)";
7935 16 khays
      goto ld;
7936
    case M_LWC0_AB:
7937 160 khays
      ab = 1;
7938
      gas_assert (!mips_opts.micromips);
7939 16 khays
      s = "lwc0";
7940 160 khays
      fmt = "E,o(b)";
7941 16 khays
      /* Itbl support may require additional care here.  */
7942
      coproc = 1;
7943 160 khays
      goto ld_st;
7944 16 khays
    case M_LWC1_AB:
7945 160 khays
      ab = 1;
7946 16 khays
      s = "lwc1";
7947 160 khays
      fmt = "T,o(b)";
7948 16 khays
      /* Itbl support may require additional care here.  */
7949
      coproc = 1;
7950 160 khays
      goto ld_st;
7951 16 khays
    case M_LWC2_AB:
7952 160 khays
      ab = 1;
7953
    case M_LWC2_OB:
7954 16 khays
      s = "lwc2";
7955 160 khays
      fmt = COP12_FMT;
7956
      off12 = mips_opts.micromips;
7957 16 khays
      /* Itbl support may require additional care here.  */
7958
      coproc = 1;
7959 160 khays
      goto ld_st;
7960 16 khays
    case M_LWC3_AB:
7961 160 khays
      ab = 1;
7962
      gas_assert (!mips_opts.micromips);
7963 16 khays
      s = "lwc3";
7964 160 khays
      fmt = "E,o(b)";
7965 16 khays
      /* Itbl support may require additional care here.  */
7966
      coproc = 1;
7967 160 khays
      goto ld_st;
7968 16 khays
    case M_LWL_AB:
7969 160 khays
      ab = 1;
7970
    case M_LWL_OB:
7971 16 khays
      s = "lwl";
7972 160 khays
      fmt = MEM12_FMT;
7973
      off12 = mips_opts.micromips;
7974
      goto ld_st;
7975 16 khays
    case M_LWR_AB:
7976 160 khays
      ab = 1;
7977
    case M_LWR_OB:
7978 16 khays
      s = "lwr";
7979 160 khays
      fmt = MEM12_FMT;
7980
      off12 = mips_opts.micromips;
7981
      goto ld_st;
7982 16 khays
    case M_LDC1_AB:
7983 160 khays
      ab = 1;
7984 16 khays
      s = "ldc1";
7985 160 khays
      fmt = "T,o(b)";
7986 16 khays
      /* Itbl support may require additional care here.  */
7987
      coproc = 1;
7988 160 khays
      goto ld_st;
7989 16 khays
    case M_LDC2_AB:
7990 160 khays
      ab = 1;
7991
    case M_LDC2_OB:
7992 16 khays
      s = "ldc2";
7993 160 khays
      fmt = COP12_FMT;
7994
      off12 = mips_opts.micromips;
7995 16 khays
      /* Itbl support may require additional care here.  */
7996
      coproc = 1;
7997 160 khays
      goto ld_st;
7998 16 khays
    case M_LDC3_AB:
7999 160 khays
      ab = 1;
8000 16 khays
      s = "ldc3";
8001 160 khays
      fmt = "E,o(b)";
8002 16 khays
      /* Itbl support may require additional care here.  */
8003
      coproc = 1;
8004 160 khays
      goto ld_st;
8005 16 khays
    case M_LDL_AB:
8006 160 khays
      ab = 1;
8007
    case M_LDL_OB:
8008 16 khays
      s = "ldl";
8009 160 khays
      fmt = MEM12_FMT;
8010
      off12 = mips_opts.micromips;
8011
      goto ld_st;
8012 16 khays
    case M_LDR_AB:
8013 160 khays
      ab = 1;
8014
    case M_LDR_OB:
8015 16 khays
      s = "ldr";
8016 160 khays
      fmt = MEM12_FMT;
8017
      off12 = mips_opts.micromips;
8018
      goto ld_st;
8019 16 khays
    case M_LL_AB:
8020 160 khays
      ab = 1;
8021
    case M_LL_OB:
8022 16 khays
      s = "ll";
8023 160 khays
      fmt = MEM12_FMT;
8024
      off12 = mips_opts.micromips;
8025 16 khays
      goto ld;
8026
    case M_LLD_AB:
8027 160 khays
      ab = 1;
8028
    case M_LLD_OB:
8029 16 khays
      s = "lld";
8030 160 khays
      fmt = MEM12_FMT;
8031
      off12 = mips_opts.micromips;
8032 16 khays
      goto ld;
8033
    case M_LWU_AB:
8034 160 khays
      ab = 1;
8035
    case M_LWU_OB:
8036 16 khays
      s = "lwu";
8037 160 khays
      fmt = MEM12_FMT;
8038
      off12 = mips_opts.micromips;
8039
      goto ld;
8040
    case M_LWP_AB:
8041
      ab = 1;
8042
    case M_LWP_OB:
8043
      gas_assert (mips_opts.micromips);
8044
      s = "lwp";
8045
      fmt = "t,~(b)";
8046
      off12 = 1;
8047
      lp = 1;
8048
      goto ld;
8049
    case M_LDP_AB:
8050
      ab = 1;
8051
    case M_LDP_OB:
8052
      gas_assert (mips_opts.micromips);
8053
      s = "ldp";
8054
      fmt = "t,~(b)";
8055
      off12 = 1;
8056
      lp = 1;
8057
      goto ld;
8058
    case M_LWM_AB:
8059
      ab = 1;
8060
    case M_LWM_OB:
8061
      gas_assert (mips_opts.micromips);
8062
      s = "lwm";
8063
      fmt = "n,~(b)";
8064
      off12 = 1;
8065
      goto ld_st;
8066
    case M_LDM_AB:
8067
      ab = 1;
8068
    case M_LDM_OB:
8069
      gas_assert (mips_opts.micromips);
8070
      s = "ldm";
8071
      fmt = "n,~(b)";
8072
      off12 = 1;
8073
      goto ld_st;
8074
 
8075 16 khays
    ld:
8076 160 khays
      if (breg == treg + lp)
8077
        goto ld_st;
8078 16 khays
      else
8079 160 khays
        tempreg = treg + lp;
8080
      goto ld_noat;
8081
 
8082 16 khays
    case M_SB_AB:
8083 160 khays
      ab = 1;
8084 16 khays
      s = "sb";
8085 160 khays
      fmt = "t,o(b)";
8086
      goto ld_st;
8087 16 khays
    case M_SH_AB:
8088 160 khays
      ab = 1;
8089 16 khays
      s = "sh";
8090 160 khays
      fmt = "t,o(b)";
8091
      goto ld_st;
8092 16 khays
    case M_SW_AB:
8093 160 khays
      ab = 1;
8094 16 khays
      s = "sw";
8095 160 khays
      fmt = "t,o(b)";
8096
      goto ld_st;
8097 16 khays
    case M_SWC0_AB:
8098 160 khays
      ab = 1;
8099
      gas_assert (!mips_opts.micromips);
8100 16 khays
      s = "swc0";
8101 160 khays
      fmt = "E,o(b)";
8102 16 khays
      /* Itbl support may require additional care here.  */
8103
      coproc = 1;
8104 160 khays
      goto ld_st;
8105 16 khays
    case M_SWC1_AB:
8106 160 khays
      ab = 1;
8107 16 khays
      s = "swc1";
8108 160 khays
      fmt = "T,o(b)";
8109 16 khays
      /* Itbl support may require additional care here.  */
8110
      coproc = 1;
8111 160 khays
      goto ld_st;
8112 16 khays
    case M_SWC2_AB:
8113 160 khays
      ab = 1;
8114
    case M_SWC2_OB:
8115 16 khays
      s = "swc2";
8116 160 khays
      fmt = COP12_FMT;
8117
      off12 = mips_opts.micromips;
8118 16 khays
      /* Itbl support may require additional care here.  */
8119
      coproc = 1;
8120 160 khays
      goto ld_st;
8121 16 khays
    case M_SWC3_AB:
8122 160 khays
      ab = 1;
8123
      gas_assert (!mips_opts.micromips);
8124 16 khays
      s = "swc3";
8125 160 khays
      fmt = "E,o(b)";
8126 16 khays
      /* Itbl support may require additional care here.  */
8127
      coproc = 1;
8128 160 khays
      goto ld_st;
8129 16 khays
    case M_SWL_AB:
8130 160 khays
      ab = 1;
8131
    case M_SWL_OB:
8132 16 khays
      s = "swl";
8133 160 khays
      fmt = MEM12_FMT;
8134
      off12 = mips_opts.micromips;
8135
      goto ld_st;
8136 16 khays
    case M_SWR_AB:
8137 160 khays
      ab = 1;
8138
    case M_SWR_OB:
8139 16 khays
      s = "swr";
8140 160 khays
      fmt = MEM12_FMT;
8141
      off12 = mips_opts.micromips;
8142
      goto ld_st;
8143 16 khays
    case M_SC_AB:
8144 160 khays
      ab = 1;
8145
    case M_SC_OB:
8146 16 khays
      s = "sc";
8147 160 khays
      fmt = MEM12_FMT;
8148
      off12 = mips_opts.micromips;
8149
      goto ld_st;
8150 16 khays
    case M_SCD_AB:
8151 160 khays
      ab = 1;
8152
    case M_SCD_OB:
8153 16 khays
      s = "scd";
8154 160 khays
      fmt = MEM12_FMT;
8155
      off12 = mips_opts.micromips;
8156
      goto ld_st;
8157 16 khays
    case M_CACHE_AB:
8158 160 khays
      ab = 1;
8159
    case M_CACHE_OB:
8160 16 khays
      s = "cache";
8161 160 khays
      fmt = mips_opts.micromips ? "k,~(b)" : "k,o(b)";
8162
      off12 = mips_opts.micromips;
8163
      goto ld_st;
8164 16 khays
    case M_PREF_AB:
8165 160 khays
      ab = 1;
8166
    case M_PREF_OB:
8167 16 khays
      s = "pref";
8168 160 khays
      fmt = !mips_opts.micromips ? "k,o(b)" : "k,~(b)";
8169
      off12 = mips_opts.micromips;
8170
      goto ld_st;
8171 16 khays
    case M_SDC1_AB:
8172 160 khays
      ab = 1;
8173 16 khays
      s = "sdc1";
8174 160 khays
      fmt = "T,o(b)";
8175 16 khays
      coproc = 1;
8176
      /* Itbl support may require additional care here.  */
8177 160 khays
      goto ld_st;
8178 16 khays
    case M_SDC2_AB:
8179 160 khays
      ab = 1;
8180
    case M_SDC2_OB:
8181 16 khays
      s = "sdc2";
8182 160 khays
      fmt = COP12_FMT;
8183
      off12 = mips_opts.micromips;
8184 16 khays
      /* Itbl support may require additional care here.  */
8185
      coproc = 1;
8186 160 khays
      goto ld_st;
8187 16 khays
    case M_SDC3_AB:
8188 160 khays
      ab = 1;
8189
      gas_assert (!mips_opts.micromips);
8190 16 khays
      s = "sdc3";
8191 160 khays
      fmt = "E,o(b)";
8192 16 khays
      /* Itbl support may require additional care here.  */
8193
      coproc = 1;
8194 160 khays
      goto ld_st;
8195 16 khays
    case M_SDL_AB:
8196 160 khays
      ab = 1;
8197
    case M_SDL_OB:
8198 16 khays
      s = "sdl";
8199 160 khays
      fmt = MEM12_FMT;
8200
      off12 = mips_opts.micromips;
8201
      goto ld_st;
8202 16 khays
    case M_SDR_AB:
8203 160 khays
      ab = 1;
8204
    case M_SDR_OB:
8205 16 khays
      s = "sdr";
8206 160 khays
      fmt = MEM12_FMT;
8207
      off12 = mips_opts.micromips;
8208
      goto ld_st;
8209
    case M_SWP_AB:
8210
      ab = 1;
8211
    case M_SWP_OB:
8212
      gas_assert (mips_opts.micromips);
8213
      s = "swp";
8214
      fmt = "t,~(b)";
8215
      off12 = 1;
8216
      goto ld_st;
8217
    case M_SDP_AB:
8218
      ab = 1;
8219
    case M_SDP_OB:
8220
      gas_assert (mips_opts.micromips);
8221
      s = "sdp";
8222
      fmt = "t,~(b)";
8223
      off12 = 1;
8224
      goto ld_st;
8225
    case M_SWM_AB:
8226
      ab = 1;
8227
    case M_SWM_OB:
8228
      gas_assert (mips_opts.micromips);
8229
      s = "swm";
8230
      fmt = "n,~(b)";
8231
      off12 = 1;
8232
      goto ld_st;
8233
    case M_SDM_AB:
8234
      ab = 1;
8235
    case M_SDM_OB:
8236
      gas_assert (mips_opts.micromips);
8237
      s = "sdm";
8238
      fmt = "n,~(b)";
8239
      off12 = 1;
8240
 
8241
    ld_st:
8242 16 khays
      tempreg = AT;
8243
      used_at = 1;
8244 160 khays
    ld_noat:
8245 16 khays
      if (coproc
8246
          && NO_ISA_COP (mips_opts.arch)
8247
          && (ip->insn_mo->pinfo2 & (INSN2_M_FP_S | INSN2_M_FP_D)) == 0)
8248
        {
8249
          as_bad (_("Opcode not supported on this processor: %s"),
8250
                  mips_cpu_info_from_arch (mips_opts.arch)->name);
8251
          break;
8252
        }
8253
 
8254
      if (offset_expr.X_op != O_constant
8255
          && offset_expr.X_op != O_symbol)
8256
        {
8257
          as_bad (_("Expression too complex"));
8258
          offset_expr.X_op = O_constant;
8259
        }
8260
 
8261
      if (HAVE_32BIT_ADDRESSES
8262
          && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
8263
        {
8264
          char value [32];
8265
 
8266
          sprintf_vma (value, offset_expr.X_add_number);
8267
          as_bad (_("Number (0x%s) larger than 32 bits"), value);
8268
        }
8269
 
8270
      /* A constant expression in PIC code can be handled just as it
8271
         is in non PIC code.  */
8272
      if (offset_expr.X_op == O_constant)
8273
        {
8274 160 khays
          int hipart = 0;
8275
 
8276 16 khays
          expr1.X_add_number = offset_expr.X_add_number;
8277
          normalize_address_expr (&expr1);
8278 160 khays
          if (!off12 && !IS_SEXT_16BIT_NUM (expr1.X_add_number))
8279 16 khays
            {
8280
              expr1.X_add_number = ((expr1.X_add_number + 0x8000)
8281
                                    & ~(bfd_vma) 0xffff);
8282 160 khays
              hipart = 1;
8283
            }
8284
          else if (off12 && !IS_SEXT_12BIT_NUM (expr1.X_add_number))
8285
            {
8286
              expr1.X_add_number = ((expr1.X_add_number + 0x800)
8287
                                    & ~(bfd_vma) 0xfff);
8288
              hipart = 1;
8289
            }
8290
          if (hipart)
8291
            {
8292 16 khays
              load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
8293
              if (breg != 0)
8294
                macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8295
                             tempreg, tempreg, breg);
8296
              breg = tempreg;
8297
            }
8298 160 khays
          if (!off12)
8299
            macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, breg);
8300
          else
8301
            macro_build (NULL, s, fmt,
8302
                         treg, (unsigned long) offset_expr.X_add_number, breg);
8303 16 khays
        }
8304 160 khays
      else if (off12)
8305
        {
8306
          /* A 12-bit offset field is too narrow to be used for a low-part
8307
             relocation, so load the whole address into the auxillary
8308
             register.  In the case of "A(b)" addresses, we first load
8309
             absolute address "A" into the register and then add base
8310
             register "b".  In the case of "o(b)" addresses, we simply
8311
             need to add 16-bit offset "o" to base register "b", and
8312
             offset_reloc already contains the relocations associated
8313
             with "o".  */
8314
          if (ab)
8315
            {
8316
              load_address (tempreg, &offset_expr, &used_at);
8317
              if (breg != 0)
8318
                macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8319
                             tempreg, tempreg, breg);
8320
            }
8321
          else
8322
            macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
8323
                         tempreg, breg, -1,
8324
                         offset_reloc[0], offset_reloc[1], offset_reloc[2]);
8325
          expr1.X_add_number = 0;
8326
          macro_build (NULL, s, fmt,
8327
                       treg, (unsigned long) expr1.X_add_number, tempreg);
8328
        }
8329 16 khays
      else if (mips_pic == NO_PIC)
8330
        {
8331
          /* If this is a reference to a GP relative symbol, and there
8332
             is no base register, we want
8333
               <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
8334
             Otherwise, if there is no base register, we want
8335
               lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
8336
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8337
             If we have a constant, we need two instructions anyhow,
8338
             so we always use the latter form.
8339
 
8340
             If we have a base register, and this is a reference to a
8341
             GP relative symbol, we want
8342
               addu     $tempreg,$breg,$gp
8343
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
8344
             Otherwise we want
8345
               lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
8346
               addu     $tempreg,$tempreg,$breg
8347
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8348
             With a constant we always use the latter case.
8349
 
8350
             With 64bit address space and no base register and $at usable,
8351
             we want
8352
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8353
               lui      $at,<sym>               (BFD_RELOC_HI16_S)
8354
               daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8355
               dsll32   $tempreg,0
8356
               daddu    $tempreg,$at
8357
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8358
             If we have a base register, we want
8359
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8360
               lui      $at,<sym>               (BFD_RELOC_HI16_S)
8361
               daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8362
               daddu    $at,$breg
8363
               dsll32   $tempreg,0
8364
               daddu    $tempreg,$at
8365
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8366
 
8367
             Without $at we can't generate the optimal path for superscalar
8368
             processors here since this would require two temporary registers.
8369
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8370
               daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8371
               dsll     $tempreg,16
8372
               daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
8373
               dsll     $tempreg,16
8374
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8375
             If we have a base register, we want
8376
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
8377
               daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
8378
               dsll     $tempreg,16
8379
               daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
8380
               dsll     $tempreg,16
8381
               daddu    $tempreg,$tempreg,$breg
8382
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
8383
 
8384
             For GP relative symbols in 64bit address space we can use
8385
             the same sequence as in 32bit address space.  */
8386
          if (HAVE_64BIT_SYMBOLS)
8387
            {
8388
              if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
8389
                  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
8390
                {
8391
                  relax_start (offset_expr.X_add_symbol);
8392
                  if (breg == 0)
8393
                    {
8394
                      macro_build (&offset_expr, s, fmt, treg,
8395
                                   BFD_RELOC_GPREL16, mips_gp_register);
8396
                    }
8397
                  else
8398
                    {
8399
                      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8400
                                   tempreg, breg, mips_gp_register);
8401
                      macro_build (&offset_expr, s, fmt, treg,
8402
                                   BFD_RELOC_GPREL16, tempreg);
8403
                    }
8404
                  relax_switch ();
8405
                }
8406
 
8407
              if (used_at == 0 && mips_opts.at)
8408
                {
8409 160 khays
                  macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
8410 16 khays
                               BFD_RELOC_MIPS_HIGHEST);
8411 160 khays
                  macro_build (&offset_expr, "lui", LUI_FMT, AT,
8412 16 khays
                               BFD_RELOC_HI16_S);
8413
                  macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
8414
                               tempreg, BFD_RELOC_MIPS_HIGHER);
8415
                  if (breg != 0)
8416
                    macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
8417 160 khays
                  macro_build (NULL, "dsll32", SHFT_FMT, tempreg, tempreg, 0);
8418 16 khays
                  macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
8419
                  macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
8420
                               tempreg);
8421
                  used_at = 1;
8422
                }
8423
              else
8424
                {
8425 160 khays
                  macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
8426 16 khays
                               BFD_RELOC_MIPS_HIGHEST);
8427
                  macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
8428
                               tempreg, BFD_RELOC_MIPS_HIGHER);
8429 160 khays
                  macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
8430 16 khays
                  macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
8431
                               tempreg, BFD_RELOC_HI16_S);
8432 160 khays
                  macro_build (NULL, "dsll", SHFT_FMT, tempreg, tempreg, 16);
8433 16 khays
                  if (breg != 0)
8434
                    macro_build (NULL, "daddu", "d,v,t",
8435
                                 tempreg, tempreg, breg);
8436
                  macro_build (&offset_expr, s, fmt, treg,
8437
                               BFD_RELOC_LO16, tempreg);
8438
                }
8439
 
8440
              if (mips_relax.sequence)
8441
                relax_end ();
8442
              break;
8443
            }
8444
 
8445
          if (breg == 0)
8446
            {
8447
              if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
8448
                  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
8449
                {
8450
                  relax_start (offset_expr.X_add_symbol);
8451
                  macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
8452
                               mips_gp_register);
8453
                  relax_switch ();
8454
                }
8455
              macro_build_lui (&offset_expr, tempreg);
8456
              macro_build (&offset_expr, s, fmt, treg,
8457
                           BFD_RELOC_LO16, tempreg);
8458
              if (mips_relax.sequence)
8459
                relax_end ();
8460
            }
8461
          else
8462
            {
8463
              if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
8464
                  && !nopic_need_relax (offset_expr.X_add_symbol, 1))
8465
                {
8466
                  relax_start (offset_expr.X_add_symbol);
8467
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8468
                               tempreg, breg, mips_gp_register);
8469
                  macro_build (&offset_expr, s, fmt, treg,
8470
                               BFD_RELOC_GPREL16, tempreg);
8471
                  relax_switch ();
8472
                }
8473
              macro_build_lui (&offset_expr, tempreg);
8474
              macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8475
                           tempreg, tempreg, breg);
8476
              macro_build (&offset_expr, s, fmt, treg,
8477
                           BFD_RELOC_LO16, tempreg);
8478
              if (mips_relax.sequence)
8479
                relax_end ();
8480
            }
8481
        }
8482
      else if (!mips_big_got)
8483
        {
8484
          int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
8485
 
8486
          /* If this is a reference to an external symbol, we want
8487
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
8488
               nop
8489
               <op>     $treg,0($tempreg)
8490
             Otherwise we want
8491
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
8492
               nop
8493
               addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
8494
               <op>     $treg,0($tempreg)
8495
 
8496
             For NewABI, we want
8497
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
8498
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
8499
 
8500
             If there is a base register, we add it to $tempreg before
8501
             the <op>.  If there is a constant, we stick it in the
8502
             <op> instruction.  We don't handle constants larger than
8503
             16 bits, because we have no way to load the upper 16 bits
8504
             (actually, we could handle them for the subset of cases
8505
             in which we are not using $at).  */
8506
          gas_assert (offset_expr.X_op == O_symbol);
8507
          if (HAVE_NEWABI)
8508
            {
8509
              macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8510
                           BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
8511
              if (breg != 0)
8512
                macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8513
                             tempreg, tempreg, breg);
8514
              macro_build (&offset_expr, s, fmt, treg,
8515
                           BFD_RELOC_MIPS_GOT_OFST, tempreg);
8516
              break;
8517
            }
8518
          expr1.X_add_number = offset_expr.X_add_number;
8519
          offset_expr.X_add_number = 0;
8520
          if (expr1.X_add_number < -0x8000
8521
              || expr1.X_add_number >= 0x8000)
8522
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
8523
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8524
                       lw_reloc_type, mips_gp_register);
8525
          load_delay_nop ();
8526
          relax_start (offset_expr.X_add_symbol);
8527
          relax_switch ();
8528
          macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
8529
                       tempreg, BFD_RELOC_LO16);
8530
          relax_end ();
8531
          if (breg != 0)
8532
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8533
                         tempreg, tempreg, breg);
8534
          macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
8535
        }
8536
      else if (mips_big_got && !HAVE_NEWABI)
8537
        {
8538
          int gpdelay;
8539
 
8540
          /* If this is a reference to an external symbol, we want
8541
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
8542
               addu     $tempreg,$tempreg,$gp
8543
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
8544
               <op>     $treg,0($tempreg)
8545
             Otherwise we want
8546
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
8547
               nop
8548
               addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
8549
               <op>     $treg,0($tempreg)
8550
             If there is a base register, we add it to $tempreg before
8551
             the <op>.  If there is a constant, we stick it in the
8552
             <op> instruction.  We don't handle constants larger than
8553
             16 bits, because we have no way to load the upper 16 bits
8554
             (actually, we could handle them for the subset of cases
8555
             in which we are not using $at).  */
8556
          gas_assert (offset_expr.X_op == O_symbol);
8557
          expr1.X_add_number = offset_expr.X_add_number;
8558
          offset_expr.X_add_number = 0;
8559
          if (expr1.X_add_number < -0x8000
8560
              || expr1.X_add_number >= 0x8000)
8561
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
8562
          gpdelay = reg_needs_delay (mips_gp_register);
8563
          relax_start (offset_expr.X_add_symbol);
8564 160 khays
          macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
8565 16 khays
                       BFD_RELOC_MIPS_GOT_HI16);
8566
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
8567
                       mips_gp_register);
8568
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8569
                       BFD_RELOC_MIPS_GOT_LO16, tempreg);
8570
          relax_switch ();
8571
          if (gpdelay)
8572
            macro_build (NULL, "nop", "");
8573
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8574
                       BFD_RELOC_MIPS_GOT16, mips_gp_register);
8575
          load_delay_nop ();
8576
          macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
8577
                       tempreg, BFD_RELOC_LO16);
8578
          relax_end ();
8579
 
8580
          if (breg != 0)
8581
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8582
                         tempreg, tempreg, breg);
8583
          macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
8584
        }
8585
      else if (mips_big_got && HAVE_NEWABI)
8586
        {
8587
          /* If this is a reference to an external symbol, we want
8588
               lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
8589
               add      $tempreg,$tempreg,$gp
8590
               lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
8591
               <op>     $treg,<ofst>($tempreg)
8592
             Otherwise, for local symbols, we want:
8593
               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
8594
               <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
8595
          gas_assert (offset_expr.X_op == O_symbol);
8596
          expr1.X_add_number = offset_expr.X_add_number;
8597
          offset_expr.X_add_number = 0;
8598
          if (expr1.X_add_number < -0x8000
8599
              || expr1.X_add_number >= 0x8000)
8600
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
8601
          relax_start (offset_expr.X_add_symbol);
8602 160 khays
          macro_build (&offset_expr, "lui", LUI_FMT, tempreg,
8603 16 khays
                       BFD_RELOC_MIPS_GOT_HI16);
8604
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
8605
                       mips_gp_register);
8606
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8607
                       BFD_RELOC_MIPS_GOT_LO16, tempreg);
8608
          if (breg != 0)
8609
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8610
                         tempreg, tempreg, breg);
8611
          macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
8612
 
8613
          relax_switch ();
8614
          offset_expr.X_add_number = expr1.X_add_number;
8615
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
8616
                       BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
8617
          if (breg != 0)
8618
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8619
                         tempreg, tempreg, breg);
8620
          macro_build (&offset_expr, s, fmt, treg,
8621
                       BFD_RELOC_MIPS_GOT_OFST, tempreg);
8622
          relax_end ();
8623
        }
8624
      else
8625
        abort ();
8626
 
8627
      break;
8628
 
8629
    case M_LI:
8630
    case M_LI_S:
8631
      load_register (treg, &imm_expr, 0);
8632
      break;
8633
 
8634
    case M_DLI:
8635
      load_register (treg, &imm_expr, 1);
8636
      break;
8637
 
8638
    case M_LI_SS:
8639
      if (imm_expr.X_op == O_constant)
8640
        {
8641
          used_at = 1;
8642
          load_register (AT, &imm_expr, 0);
8643
          macro_build (NULL, "mtc1", "t,G", AT, treg);
8644
          break;
8645
        }
8646
      else
8647
        {
8648
          gas_assert (offset_expr.X_op == O_symbol
8649
                      && strcmp (segment_name (S_GET_SEGMENT
8650
                                               (offset_expr.X_add_symbol)),
8651
                                 ".lit4") == 0
8652
                      && offset_expr.X_add_number == 0);
8653
          macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
8654
                       BFD_RELOC_MIPS_LITERAL, mips_gp_register);
8655
          break;
8656
        }
8657
 
8658
    case M_LI_D:
8659
      /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
8660
         wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
8661
         order 32 bits of the value and the low order 32 bits are either
8662
         zero or in OFFSET_EXPR.  */
8663
      if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
8664
        {
8665
          if (HAVE_64BIT_GPRS)
8666
            load_register (treg, &imm_expr, 1);
8667
          else
8668
            {
8669
              int hreg, lreg;
8670
 
8671
              if (target_big_endian)
8672
                {
8673
                  hreg = treg;
8674
                  lreg = treg + 1;
8675
                }
8676
              else
8677
                {
8678
                  hreg = treg + 1;
8679
                  lreg = treg;
8680
                }
8681
 
8682
              if (hreg <= 31)
8683
                load_register (hreg, &imm_expr, 0);
8684
              if (lreg <= 31)
8685
                {
8686
                  if (offset_expr.X_op == O_absent)
8687
                    move_register (lreg, 0);
8688
                  else
8689
                    {
8690
                      gas_assert (offset_expr.X_op == O_constant);
8691
                      load_register (lreg, &offset_expr, 0);
8692
                    }
8693
                }
8694
            }
8695
          break;
8696
        }
8697
 
8698
      /* We know that sym is in the .rdata section.  First we get the
8699
         upper 16 bits of the address.  */
8700
      if (mips_pic == NO_PIC)
8701
        {
8702
          macro_build_lui (&offset_expr, AT);
8703
          used_at = 1;
8704
        }
8705
      else
8706
        {
8707
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
8708
                       BFD_RELOC_MIPS_GOT16, mips_gp_register);
8709
          used_at = 1;
8710
        }
8711
 
8712
      /* Now we load the register(s).  */
8713
      if (HAVE_64BIT_GPRS)
8714
        {
8715
          used_at = 1;
8716
          macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8717
        }
8718
      else
8719
        {
8720
          used_at = 1;
8721
          macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8722
          if (treg != RA)
8723
            {
8724
              /* FIXME: How in the world do we deal with the possible
8725
                 overflow here?  */
8726
              offset_expr.X_add_number += 4;
8727
              macro_build (&offset_expr, "lw", "t,o(b)",
8728
                           treg + 1, BFD_RELOC_LO16, AT);
8729
            }
8730
        }
8731
      break;
8732
 
8733
    case M_LI_DD:
8734
      /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
8735
         wide, IMM_EXPR is the entire value and the GPRs are known to be 64
8736
         bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
8737
         the value and the low order 32 bits are either zero or in
8738
         OFFSET_EXPR.  */
8739
      if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
8740
        {
8741
          used_at = 1;
8742
          load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
8743
          if (HAVE_64BIT_FPRS)
8744
            {
8745
              gas_assert (HAVE_64BIT_GPRS);
8746
              macro_build (NULL, "dmtc1", "t,S", AT, treg);
8747
            }
8748
          else
8749
            {
8750
              macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
8751
              if (offset_expr.X_op == O_absent)
8752
                macro_build (NULL, "mtc1", "t,G", 0, treg);
8753
              else
8754
                {
8755
                  gas_assert (offset_expr.X_op == O_constant);
8756
                  load_register (AT, &offset_expr, 0);
8757
                  macro_build (NULL, "mtc1", "t,G", AT, treg);
8758
                }
8759
            }
8760
          break;
8761
        }
8762
 
8763
      gas_assert (offset_expr.X_op == O_symbol
8764
                  && offset_expr.X_add_number == 0);
8765
      s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
8766
      if (strcmp (s, ".lit8") == 0)
8767
        {
8768 160 khays
          if (mips_opts.isa != ISA_MIPS1 || mips_opts.micromips)
8769 16 khays
            {
8770
              macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
8771
                           BFD_RELOC_MIPS_LITERAL, mips_gp_register);
8772
              break;
8773
            }
8774
          breg = mips_gp_register;
8775
          r = BFD_RELOC_MIPS_LITERAL;
8776
          goto dob;
8777
        }
8778
      else
8779
        {
8780
          gas_assert (strcmp (s, RDATA_SECTION_NAME) == 0);
8781
          used_at = 1;
8782
          if (mips_pic != NO_PIC)
8783
            macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
8784
                         BFD_RELOC_MIPS_GOT16, mips_gp_register);
8785
          else
8786
            {
8787
              /* FIXME: This won't work for a 64 bit address.  */
8788
              macro_build_lui (&offset_expr, AT);
8789
            }
8790
 
8791 160 khays
          if (mips_opts.isa != ISA_MIPS1 || mips_opts.micromips)
8792 16 khays
            {
8793
              macro_build (&offset_expr, "ldc1", "T,o(b)",
8794
                           treg, BFD_RELOC_LO16, AT);
8795
              break;
8796
            }
8797
          breg = AT;
8798
          r = BFD_RELOC_LO16;
8799
          goto dob;
8800
        }
8801
 
8802
    case M_L_DOB:
8803
      /* Even on a big endian machine $fn comes before $fn+1.  We have
8804
         to adjust when loading from memory.  */
8805
      r = BFD_RELOC_LO16;
8806
    dob:
8807 160 khays
      gas_assert (!mips_opts.micromips);
8808 16 khays
      gas_assert (mips_opts.isa == ISA_MIPS1);
8809
      macro_build (&offset_expr, "lwc1", "T,o(b)",
8810
                   target_big_endian ? treg + 1 : treg, r, breg);
8811
      /* FIXME: A possible overflow which I don't know how to deal
8812
         with.  */
8813
      offset_expr.X_add_number += 4;
8814
      macro_build (&offset_expr, "lwc1", "T,o(b)",
8815
                   target_big_endian ? treg : treg + 1, r, breg);
8816
      break;
8817
 
8818
    case M_S_DOB:
8819 160 khays
      gas_assert (!mips_opts.micromips);
8820 16 khays
      gas_assert (mips_opts.isa == ISA_MIPS1);
8821
      /* Even on a big endian machine $fn comes before $fn+1.  We have
8822
         to adjust when storing to memory.  */
8823
      macro_build (&offset_expr, "swc1", "T,o(b)",
8824
                   target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
8825
      offset_expr.X_add_number += 4;
8826
      macro_build (&offset_expr, "swc1", "T,o(b)",
8827
                   target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
8828
      break;
8829
 
8830
    case M_L_DAB:
8831 160 khays
      gas_assert (!mips_opts.micromips);
8832 16 khays
      /*
8833
       * The MIPS assembler seems to check for X_add_number not
8834
       * being double aligned and generating:
8835
       *        lui     at,%hi(foo+1)
8836
       *        addu    at,at,v1
8837
       *        addiu   at,at,%lo(foo+1)
8838
       *        lwc1    f2,0(at)
8839
       *        lwc1    f3,4(at)
8840
       * But, the resulting address is the same after relocation so why
8841
       * generate the extra instruction?
8842
       */
8843
      /* Itbl support may require additional care here.  */
8844
      coproc = 1;
8845 160 khays
      fmt = "T,o(b)";
8846 16 khays
      if (mips_opts.isa != ISA_MIPS1)
8847
        {
8848
          s = "ldc1";
8849 160 khays
          goto ld_st;
8850 16 khays
        }
8851
      s = "lwc1";
8852
      goto ldd_std;
8853
 
8854
    case M_S_DAB:
8855 160 khays
      gas_assert (!mips_opts.micromips);
8856
      /* Itbl support may require additional care here.  */
8857
      coproc = 1;
8858
      fmt = "T,o(b)";
8859 16 khays
      if (mips_opts.isa != ISA_MIPS1)
8860
        {
8861
          s = "sdc1";
8862 160 khays
          goto ld_st;
8863 16 khays
        }
8864
      s = "swc1";
8865
      goto ldd_std;
8866
 
8867
    case M_LD_AB:
8868 160 khays
      fmt = "t,o(b)";
8869 16 khays
      if (HAVE_64BIT_GPRS)
8870
        {
8871
          s = "ld";
8872
          goto ld;
8873
        }
8874
      s = "lw";
8875
      goto ldd_std;
8876
 
8877
    case M_SD_AB:
8878 160 khays
      fmt = "t,o(b)";
8879 16 khays
      if (HAVE_64BIT_GPRS)
8880
        {
8881
          s = "sd";
8882 160 khays
          goto ld_st;
8883 16 khays
        }
8884
      s = "sw";
8885
 
8886
    ldd_std:
8887
      if (offset_expr.X_op != O_symbol
8888
          && offset_expr.X_op != O_constant)
8889
        {
8890
          as_bad (_("Expression too complex"));
8891
          offset_expr.X_op = O_constant;
8892
        }
8893
 
8894
      if (HAVE_32BIT_ADDRESSES
8895
          && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
8896
        {
8897
          char value [32];
8898
 
8899
          sprintf_vma (value, offset_expr.X_add_number);
8900
          as_bad (_("Number (0x%s) larger than 32 bits"), value);
8901
        }
8902
 
8903
      /* Even on a big endian machine $fn comes before $fn+1.  We have
8904
         to adjust when loading from memory.  We set coproc if we must
8905
         load $fn+1 first.  */
8906
      /* Itbl support may require additional care here.  */
8907
      if (!target_big_endian)
8908
        coproc = 0;
8909
 
8910
      if (mips_pic == NO_PIC || offset_expr.X_op == O_constant)
8911
        {
8912
          /* If this is a reference to a GP relative symbol, we want
8913
               <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
8914
               <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
8915
             If we have a base register, we use this
8916
               addu     $at,$breg,$gp
8917
               <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
8918
               <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
8919
             If this is not a GP relative symbol, we want
8920
               lui      $at,<sym>               (BFD_RELOC_HI16_S)
8921
               <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
8922
               <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
8923
             If there is a base register, we add it to $at after the
8924
             lui instruction.  If there is a constant, we always use
8925
             the last case.  */
8926
          if (offset_expr.X_op == O_symbol
8927
              && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
8928
              && !nopic_need_relax (offset_expr.X_add_symbol, 1))
8929
            {
8930
              relax_start (offset_expr.X_add_symbol);
8931
              if (breg == 0)
8932
                {
8933
                  tempreg = mips_gp_register;
8934
                }
8935
              else
8936
                {
8937
                  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
8938
                               AT, breg, mips_gp_register);
8939
                  tempreg = AT;
8940
                  used_at = 1;
8941
                }
8942
 
8943
              /* Itbl support may require additional care here.  */
8944
              macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
8945
                           BFD_RELOC_GPREL16, tempreg);
8946
              offset_expr.X_add_number += 4;
8947
 
8948
              /* Set mips_optimize to 2 to avoid inserting an
8949
                 undesired nop.  */
8950
              hold_mips_optimize = mips_optimize;
8951
              mips_optimize = 2;
8952
              /* Itbl support may require additional care here.  */
8953
              macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
8954
                           BFD_RELOC_GPREL16, tempreg);
8955
              mips_optimize = hold_mips_optimize;
8956
 
8957
              relax_switch ();
8958
 
8959
              offset_expr.X_add_number -= 4;
8960
            }
8961
          used_at = 1;
8962
          macro_build_lui (&offset_expr, AT);
8963
          if (breg != 0)
8964
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
8965
          /* Itbl support may require additional care here.  */
8966
          macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
8967
                       BFD_RELOC_LO16, AT);
8968
          /* FIXME: How do we handle overflow here?  */
8969
          offset_expr.X_add_number += 4;
8970
          /* Itbl support may require additional care here.  */
8971
          macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
8972
                       BFD_RELOC_LO16, AT);
8973
          if (mips_relax.sequence)
8974
            relax_end ();
8975
        }
8976
      else if (!mips_big_got)
8977
        {
8978
          /* If this is a reference to an external symbol, we want
8979
               lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
8980
               nop
8981
               <op>     $treg,0($at)
8982
               <op>     $treg+1,4($at)
8983
             Otherwise we want
8984
               lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
8985
               nop
8986
               <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
8987
               <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
8988
             If there is a base register we add it to $at before the
8989
             lwc1 instructions.  If there is a constant we include it
8990
             in the lwc1 instructions.  */
8991
          used_at = 1;
8992
          expr1.X_add_number = offset_expr.X_add_number;
8993
          if (expr1.X_add_number < -0x8000
8994
              || expr1.X_add_number >= 0x8000 - 4)
8995
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
8996
          load_got_offset (AT, &offset_expr);
8997
          load_delay_nop ();
8998
          if (breg != 0)
8999
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9000
 
9001
          /* Set mips_optimize to 2 to avoid inserting an undesired
9002
             nop.  */
9003
          hold_mips_optimize = mips_optimize;
9004
          mips_optimize = 2;
9005
 
9006
          /* Itbl support may require additional care here.  */
9007
          relax_start (offset_expr.X_add_symbol);
9008
          macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
9009
                       BFD_RELOC_LO16, AT);
9010
          expr1.X_add_number += 4;
9011
          macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
9012
                       BFD_RELOC_LO16, AT);
9013
          relax_switch ();
9014
          macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9015
                       BFD_RELOC_LO16, AT);
9016
          offset_expr.X_add_number += 4;
9017
          macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9018
                       BFD_RELOC_LO16, AT);
9019
          relax_end ();
9020
 
9021
          mips_optimize = hold_mips_optimize;
9022
        }
9023
      else if (mips_big_got)
9024
        {
9025
          int gpdelay;
9026
 
9027
          /* If this is a reference to an external symbol, we want
9028
               lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
9029
               addu     $at,$at,$gp
9030
               lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
9031
               nop
9032
               <op>     $treg,0($at)
9033
               <op>     $treg+1,4($at)
9034
             Otherwise we want
9035
               lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
9036
               nop
9037
               <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
9038
               <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
9039
             If there is a base register we add it to $at before the
9040
             lwc1 instructions.  If there is a constant we include it
9041
             in the lwc1 instructions.  */
9042
          used_at = 1;
9043
          expr1.X_add_number = offset_expr.X_add_number;
9044
          offset_expr.X_add_number = 0;
9045
          if (expr1.X_add_number < -0x8000
9046
              || expr1.X_add_number >= 0x8000 - 4)
9047
            as_bad (_("PIC code offset overflow (max 16 signed bits)"));
9048
          gpdelay = reg_needs_delay (mips_gp_register);
9049
          relax_start (offset_expr.X_add_symbol);
9050 160 khays
          macro_build (&offset_expr, "lui", LUI_FMT,
9051 16 khays
                       AT, BFD_RELOC_MIPS_GOT_HI16);
9052
          macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9053
                       AT, AT, mips_gp_register);
9054
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
9055
                       AT, BFD_RELOC_MIPS_GOT_LO16, AT);
9056
          load_delay_nop ();
9057
          if (breg != 0)
9058
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9059
          /* Itbl support may require additional care here.  */
9060
          macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
9061
                       BFD_RELOC_LO16, AT);
9062
          expr1.X_add_number += 4;
9063
 
9064
          /* Set mips_optimize to 2 to avoid inserting an undesired
9065
             nop.  */
9066
          hold_mips_optimize = mips_optimize;
9067
          mips_optimize = 2;
9068
          /* Itbl support may require additional care here.  */
9069
          macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
9070
                       BFD_RELOC_LO16, AT);
9071
          mips_optimize = hold_mips_optimize;
9072
          expr1.X_add_number -= 4;
9073
 
9074
          relax_switch ();
9075
          offset_expr.X_add_number = expr1.X_add_number;
9076
          if (gpdelay)
9077
            macro_build (NULL, "nop", "");
9078
          macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
9079
                       BFD_RELOC_MIPS_GOT16, mips_gp_register);
9080
          load_delay_nop ();
9081
          if (breg != 0)
9082
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
9083
          /* Itbl support may require additional care here.  */
9084
          macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
9085
                       BFD_RELOC_LO16, AT);
9086
          offset_expr.X_add_number += 4;
9087
 
9088
          /* Set mips_optimize to 2 to avoid inserting an undesired
9089
             nop.  */
9090
          hold_mips_optimize = mips_optimize;
9091
          mips_optimize = 2;
9092
          /* Itbl support may require additional care here.  */
9093
          macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
9094
                       BFD_RELOC_LO16, AT);
9095
          mips_optimize = hold_mips_optimize;
9096
          relax_end ();
9097
        }
9098
      else
9099
        abort ();
9100
 
9101
      break;
9102
 
9103
    case M_LD_OB:
9104
      s = HAVE_64BIT_GPRS ? "ld" : "lw";
9105
      goto sd_ob;
9106
    case M_SD_OB:
9107
      s = HAVE_64BIT_GPRS ? "sd" : "sw";
9108
    sd_ob:
9109
      macro_build (&offset_expr, s, "t,o(b)", treg,
9110
                   -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
9111
                   breg);
9112
      if (!HAVE_64BIT_GPRS)
9113
        {
9114
          offset_expr.X_add_number += 4;
9115
          macro_build (&offset_expr, s, "t,o(b)", treg + 1,
9116
                       -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
9117
                       breg);
9118
        }
9119
      break;
9120
 
9121
   /* New code added to support COPZ instructions.
9122
      This code builds table entries out of the macros in mip_opcodes.
9123
      R4000 uses interlocks to handle coproc delays.
9124
      Other chips (like the R3000) require nops to be inserted for delays.
9125
 
9126
      FIXME: Currently, we require that the user handle delays.
9127
      In order to fill delay slots for non-interlocked chips,
9128
      we must have a way to specify delays based on the coprocessor.
9129
      Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
9130
      What are the side-effects of the cop instruction?
9131
      What cache support might we have and what are its effects?
9132
      Both coprocessor & memory require delays. how long???
9133
      What registers are read/set/modified?
9134
 
9135
      If an itbl is provided to interpret cop instructions,
9136
      this knowledge can be encoded in the itbl spec.  */
9137
 
9138
    case M_COP0:
9139
      s = "c0";
9140
      goto copz;
9141
    case M_COP1:
9142
      s = "c1";
9143
      goto copz;
9144
    case M_COP2:
9145
      s = "c2";
9146
      goto copz;
9147
    case M_COP3:
9148
      s = "c3";
9149
    copz:
9150 160 khays
      gas_assert (!mips_opts.micromips);
9151 16 khays
      if (NO_ISA_COP (mips_opts.arch)
9152
          && (ip->insn_mo->pinfo2 & INSN2_M_FP_S) == 0)
9153
        {
9154
          as_bad (_("opcode not supported on this processor: %s"),
9155
                  mips_cpu_info_from_arch (mips_opts.arch)->name);
9156
          break;
9157
        }
9158
 
9159
      /* For now we just do C (same as Cz).  The parameter will be
9160
         stored in insn_opcode by mips_ip.  */
9161
      macro_build (NULL, s, "C", ip->insn_opcode);
9162
      break;
9163
 
9164
    case M_MOVE:
9165
      move_register (dreg, sreg);
9166
      break;
9167
 
9168
    case M_DMUL:
9169
      dbl = 1;
9170
    case M_MUL:
9171
      macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
9172 160 khays
      macro_build (NULL, "mflo", MFHL_FMT, dreg);
9173 16 khays
      break;
9174
 
9175
    case M_DMUL_I:
9176
      dbl = 1;
9177
    case M_MUL_I:
9178
      /* The MIPS assembler some times generates shifts and adds.  I'm
9179
         not trying to be that fancy. GCC should do this for us
9180
         anyway.  */
9181
      used_at = 1;
9182
      load_register (AT, &imm_expr, dbl);
9183
      macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
9184 160 khays
      macro_build (NULL, "mflo", MFHL_FMT, dreg);
9185 16 khays
      break;
9186
 
9187
    case M_DMULO_I:
9188
      dbl = 1;
9189
    case M_MULO_I:
9190
      imm = 1;
9191
      goto do_mulo;
9192
 
9193
    case M_DMULO:
9194
      dbl = 1;
9195
    case M_MULO:
9196
    do_mulo:
9197
      start_noreorder ();
9198
      used_at = 1;
9199
      if (imm)
9200
        load_register (AT, &imm_expr, dbl);
9201
      macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
9202 160 khays
      macro_build (NULL, "mflo", MFHL_FMT, dreg);
9203
      macro_build (NULL, dbl ? "dsra32" : "sra", SHFT_FMT, dreg, dreg, RA);
9204
      macro_build (NULL, "mfhi", MFHL_FMT, AT);
9205 16 khays
      if (mips_trap)
9206 160 khays
        macro_build (NULL, "tne", TRAP_FMT, dreg, AT, 6);
9207 16 khays
      else
9208
        {
9209 160 khays
          if (mips_opts.micromips)
9210
            micromips_label_expr (&label_expr);
9211
          else
9212
            label_expr.X_add_number = 8;
9213
          macro_build (&label_expr, "beq", "s,t,p", dreg, AT);
9214 16 khays
          macro_build (NULL, "nop", "");
9215 160 khays
          macro_build (NULL, "break", BRK_FMT, 6);
9216
          if (mips_opts.micromips)
9217
            micromips_add_label ();
9218 16 khays
        }
9219
      end_noreorder ();
9220 160 khays
      macro_build (NULL, "mflo", MFHL_FMT, dreg);
9221 16 khays
      break;
9222
 
9223
    case M_DMULOU_I:
9224
      dbl = 1;
9225
    case M_MULOU_I:
9226
      imm = 1;
9227
      goto do_mulou;
9228
 
9229
    case M_DMULOU:
9230
      dbl = 1;
9231
    case M_MULOU:
9232
    do_mulou:
9233
      start_noreorder ();
9234
      used_at = 1;
9235
      if (imm)
9236
        load_register (AT, &imm_expr, dbl);
9237
      macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
9238
                   sreg, imm ? AT : treg);
9239 160 khays
      macro_build (NULL, "mfhi", MFHL_FMT, AT);
9240
      macro_build (NULL, "mflo", MFHL_FMT, dreg);
9241 16 khays
      if (mips_trap)
9242 160 khays
        macro_build (NULL, "tne", TRAP_FMT, AT, ZERO, 6);
9243 16 khays
      else
9244
        {
9245 160 khays
          if (mips_opts.micromips)
9246
            micromips_label_expr (&label_expr);
9247
          else
9248
            label_expr.X_add_number = 8;
9249
          macro_build (&label_expr, "beq", "s,t,p", AT, ZERO);
9250 16 khays
          macro_build (NULL, "nop", "");
9251 160 khays
          macro_build (NULL, "break", BRK_FMT, 6);
9252
          if (mips_opts.micromips)
9253
            micromips_add_label ();
9254 16 khays
        }
9255
      end_noreorder ();
9256
      break;
9257
 
9258
    case M_DROL:
9259
      if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9260
        {
9261
          if (dreg == sreg)
9262
            {
9263
              tempreg = AT;
9264
              used_at = 1;
9265
            }
9266
          else
9267
            {
9268
              tempreg = dreg;
9269
            }
9270
          macro_build (NULL, "dnegu", "d,w", tempreg, treg);
9271
          macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
9272
          break;
9273
        }
9274
      used_at = 1;
9275
      macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
9276
      macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
9277
      macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
9278
      macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9279
      break;
9280
 
9281
    case M_ROL:
9282
      if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9283
        {
9284
          if (dreg == sreg)
9285
            {
9286
              tempreg = AT;
9287
              used_at = 1;
9288
            }
9289
          else
9290
            {
9291
              tempreg = dreg;
9292
            }
9293
          macro_build (NULL, "negu", "d,w", tempreg, treg);
9294
          macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
9295
          break;
9296
        }
9297
      used_at = 1;
9298
      macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
9299
      macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
9300
      macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
9301
      macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9302
      break;
9303
 
9304
    case M_DROL_I:
9305
      {
9306
        unsigned int rot;
9307
        char *l;
9308
        char *rr;
9309
 
9310
        if (imm_expr.X_op != O_constant)
9311
          as_bad (_("Improper rotate count"));
9312
        rot = imm_expr.X_add_number & 0x3f;
9313
        if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9314
          {
9315
            rot = (64 - rot) & 0x3f;
9316
            if (rot >= 32)
9317 160 khays
              macro_build (NULL, "dror32", SHFT_FMT, dreg, sreg, rot - 32);
9318 16 khays
            else
9319 160 khays
              macro_build (NULL, "dror", SHFT_FMT, dreg, sreg, rot);
9320 16 khays
            break;
9321
          }
9322
        if (rot == 0)
9323
          {
9324 160 khays
            macro_build (NULL, "dsrl", SHFT_FMT, dreg, sreg, 0);
9325 16 khays
            break;
9326
          }
9327
        l = (rot < 0x20) ? "dsll" : "dsll32";
9328
        rr = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
9329
        rot &= 0x1f;
9330
        used_at = 1;
9331 160 khays
        macro_build (NULL, l, SHFT_FMT, AT, sreg, rot);
9332
        macro_build (NULL, rr, SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9333 16 khays
        macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9334
      }
9335
      break;
9336
 
9337
    case M_ROL_I:
9338
      {
9339
        unsigned int rot;
9340
 
9341
        if (imm_expr.X_op != O_constant)
9342
          as_bad (_("Improper rotate count"));
9343
        rot = imm_expr.X_add_number & 0x1f;
9344
        if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9345
          {
9346 160 khays
            macro_build (NULL, "ror", SHFT_FMT, dreg, sreg, (32 - rot) & 0x1f);
9347 16 khays
            break;
9348
          }
9349
        if (rot == 0)
9350
          {
9351 160 khays
            macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, 0);
9352 16 khays
            break;
9353
          }
9354
        used_at = 1;
9355 160 khays
        macro_build (NULL, "sll", SHFT_FMT, AT, sreg, rot);
9356
        macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9357 16 khays
        macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9358
      }
9359
      break;
9360
 
9361
    case M_DROR:
9362
      if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9363
        {
9364
          macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
9365
          break;
9366
        }
9367
      used_at = 1;
9368
      macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
9369
      macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
9370
      macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
9371
      macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9372
      break;
9373
 
9374
    case M_ROR:
9375
      if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9376
        {
9377
          macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
9378
          break;
9379
        }
9380
      used_at = 1;
9381
      macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
9382
      macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
9383
      macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
9384
      macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9385
      break;
9386
 
9387
    case M_DROR_I:
9388
      {
9389
        unsigned int rot;
9390
        char *l;
9391
        char *rr;
9392
 
9393
        if (imm_expr.X_op != O_constant)
9394
          as_bad (_("Improper rotate count"));
9395
        rot = imm_expr.X_add_number & 0x3f;
9396
        if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
9397
          {
9398
            if (rot >= 32)
9399 160 khays
              macro_build (NULL, "dror32", SHFT_FMT, dreg, sreg, rot - 32);
9400 16 khays
            else
9401 160 khays
              macro_build (NULL, "dror", SHFT_FMT, dreg, sreg, rot);
9402 16 khays
            break;
9403
          }
9404
        if (rot == 0)
9405
          {
9406 160 khays
            macro_build (NULL, "dsrl", SHFT_FMT, dreg, sreg, 0);
9407 16 khays
            break;
9408
          }
9409
        rr = (rot < 0x20) ? "dsrl" : "dsrl32";
9410
        l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
9411
        rot &= 0x1f;
9412
        used_at = 1;
9413 160 khays
        macro_build (NULL, rr, SHFT_FMT, AT, sreg, rot);
9414
        macro_build (NULL, l, SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9415 16 khays
        macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9416
      }
9417
      break;
9418
 
9419
    case M_ROR_I:
9420
      {
9421
        unsigned int rot;
9422
 
9423
        if (imm_expr.X_op != O_constant)
9424
          as_bad (_("Improper rotate count"));
9425
        rot = imm_expr.X_add_number & 0x1f;
9426
        if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
9427
          {
9428 160 khays
            macro_build (NULL, "ror", SHFT_FMT, dreg, sreg, rot);
9429 16 khays
            break;
9430
          }
9431
        if (rot == 0)
9432
          {
9433 160 khays
            macro_build (NULL, "srl", SHFT_FMT, dreg, sreg, 0);
9434 16 khays
            break;
9435
          }
9436
        used_at = 1;
9437 160 khays
        macro_build (NULL, "srl", SHFT_FMT, AT, sreg, rot);
9438
        macro_build (NULL, "sll", SHFT_FMT, dreg, sreg, (0x20 - rot) & 0x1f);
9439 16 khays
        macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
9440
      }
9441
      break;
9442
 
9443
    case M_SEQ:
9444
      if (sreg == 0)
9445
        macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
9446
      else if (treg == 0)
9447
        macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9448
      else
9449
        {
9450
          macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
9451
          macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
9452
        }
9453
      break;
9454
 
9455
    case M_SEQ_I:
9456
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
9457
        {
9458
          macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9459
          break;
9460
        }
9461
      if (sreg == 0)
9462
        {
9463
          as_warn (_("Instruction %s: result is always false"),
9464
                   ip->insn_mo->name);
9465
          move_register (dreg, 0);
9466
          break;
9467
        }
9468
      if (CPU_HAS_SEQ (mips_opts.arch)
9469
          && -512 <= imm_expr.X_add_number
9470
          && imm_expr.X_add_number < 512)
9471
        {
9472
          macro_build (NULL, "seqi", "t,r,+Q", dreg, sreg,
9473
                       (int) imm_expr.X_add_number);
9474
          break;
9475
        }
9476
      if (imm_expr.X_op == O_constant
9477
          && imm_expr.X_add_number >= 0
9478
          && imm_expr.X_add_number < 0x10000)
9479
        {
9480
          macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
9481
        }
9482
      else if (imm_expr.X_op == O_constant
9483
               && imm_expr.X_add_number > -0x8000
9484
               && imm_expr.X_add_number < 0)
9485
        {
9486
          imm_expr.X_add_number = -imm_expr.X_add_number;
9487
          macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
9488
                       "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9489
        }
9490
      else if (CPU_HAS_SEQ (mips_opts.arch))
9491
        {
9492
          used_at = 1;
9493
          load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9494
          macro_build (NULL, "seq", "d,v,t", dreg, sreg, AT);
9495
          break;
9496
        }
9497
      else
9498
        {
9499
          load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9500
          macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
9501
          used_at = 1;
9502
        }
9503
      macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
9504
      break;
9505
 
9506
    case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
9507
      s = "slt";
9508
      goto sge;
9509
    case M_SGEU:
9510
      s = "sltu";
9511
    sge:
9512
      macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
9513
      macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
9514
      break;
9515
 
9516
    case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
9517
    case M_SGEU_I:
9518
      if (imm_expr.X_op == O_constant
9519
          && imm_expr.X_add_number >= -0x8000
9520
          && imm_expr.X_add_number < 0x8000)
9521
        {
9522
          macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
9523
                       dreg, sreg, BFD_RELOC_LO16);
9524
        }
9525
      else
9526
        {
9527
          load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9528
          macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
9529
                       dreg, sreg, AT);
9530
          used_at = 1;
9531
        }
9532
      macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
9533
      break;
9534
 
9535
    case M_SGT:         /* sreg > treg  <==>  treg < sreg */
9536
      s = "slt";
9537
      goto sgt;
9538
    case M_SGTU:
9539
      s = "sltu";
9540
    sgt:
9541
      macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
9542
      break;
9543
 
9544
    case M_SGT_I:               /* sreg > I  <==>  I < sreg */
9545
      s = "slt";
9546
      goto sgti;
9547
    case M_SGTU_I:
9548
      s = "sltu";
9549
    sgti:
9550
      used_at = 1;
9551
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9552
      macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
9553
      break;
9554
 
9555
    case M_SLE: /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
9556
      s = "slt";
9557
      goto sle;
9558
    case M_SLEU:
9559
      s = "sltu";
9560
    sle:
9561
      macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
9562
      macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
9563
      break;
9564
 
9565
    case M_SLE_I:       /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
9566
      s = "slt";
9567
      goto slei;
9568
    case M_SLEU_I:
9569
      s = "sltu";
9570
    slei:
9571
      used_at = 1;
9572
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9573
      macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
9574
      macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
9575
      break;
9576
 
9577
    case M_SLT_I:
9578
      if (imm_expr.X_op == O_constant
9579
          && imm_expr.X_add_number >= -0x8000
9580
          && imm_expr.X_add_number < 0x8000)
9581
        {
9582
          macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9583
          break;
9584
        }
9585
      used_at = 1;
9586
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9587
      macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
9588
      break;
9589
 
9590
    case M_SLTU_I:
9591
      if (imm_expr.X_op == O_constant
9592
          && imm_expr.X_add_number >= -0x8000
9593
          && imm_expr.X_add_number < 0x8000)
9594
        {
9595
          macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
9596
                       BFD_RELOC_LO16);
9597
          break;
9598
        }
9599
      used_at = 1;
9600
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9601
      macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
9602
      break;
9603
 
9604
    case M_SNE:
9605
      if (sreg == 0)
9606
        macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
9607
      else if (treg == 0)
9608
        macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
9609
      else
9610
        {
9611
          macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
9612
          macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
9613
        }
9614
      break;
9615
 
9616
    case M_SNE_I:
9617
      if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
9618
        {
9619
          macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
9620
          break;
9621
        }
9622
      if (sreg == 0)
9623
        {
9624
          as_warn (_("Instruction %s: result is always true"),
9625
                   ip->insn_mo->name);
9626
          macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
9627
                       dreg, 0, BFD_RELOC_LO16);
9628
          break;
9629
        }
9630
      if (CPU_HAS_SEQ (mips_opts.arch)
9631
          && -512 <= imm_expr.X_add_number
9632
          && imm_expr.X_add_number < 512)
9633
        {
9634
          macro_build (NULL, "snei", "t,r,+Q", dreg, sreg,
9635
                       (int) imm_expr.X_add_number);
9636
          break;
9637
        }
9638
      if (imm_expr.X_op == O_constant
9639
          && imm_expr.X_add_number >= 0
9640
          && imm_expr.X_add_number < 0x10000)
9641
        {
9642
          macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
9643
        }
9644
      else if (imm_expr.X_op == O_constant
9645
               && imm_expr.X_add_number > -0x8000
9646
               && imm_expr.X_add_number < 0)
9647
        {
9648
          imm_expr.X_add_number = -imm_expr.X_add_number;
9649
          macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
9650
                       "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9651
        }
9652
      else if (CPU_HAS_SEQ (mips_opts.arch))
9653
        {
9654
          used_at = 1;
9655
          load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9656
          macro_build (NULL, "sne", "d,v,t", dreg, sreg, AT);
9657
          break;
9658
        }
9659
      else
9660
        {
9661
          load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9662
          macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
9663
          used_at = 1;
9664
        }
9665
      macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
9666
      break;
9667
 
9668 160 khays
    case M_SUB_I:
9669
      s = "addi";
9670
      s2 = "sub";
9671
      goto do_subi;
9672
    case M_SUBU_I:
9673
      s = "addiu";
9674
      s2 = "subu";
9675
      goto do_subi;
9676 16 khays
    case M_DSUB_I:
9677
      dbl = 1;
9678 160 khays
      s = "daddi";
9679
      s2 = "dsub";
9680
      if (!mips_opts.micromips)
9681
        goto do_subi;
9682 16 khays
      if (imm_expr.X_op == O_constant
9683 160 khays
          && imm_expr.X_add_number > -0x200
9684
          && imm_expr.X_add_number <= 0x200)
9685 16 khays
        {
9686 160 khays
          macro_build (NULL, s, "t,r,.", dreg, sreg, -imm_expr.X_add_number);
9687 16 khays
          break;
9688
        }
9689 160 khays
      goto do_subi_i;
9690 16 khays
    case M_DSUBU_I:
9691
      dbl = 1;
9692 160 khays
      s = "daddiu";
9693
      s2 = "dsubu";
9694
    do_subi:
9695 16 khays
      if (imm_expr.X_op == O_constant
9696
          && imm_expr.X_add_number > -0x8000
9697
          && imm_expr.X_add_number <= 0x8000)
9698
        {
9699
          imm_expr.X_add_number = -imm_expr.X_add_number;
9700 160 khays
          macro_build (&imm_expr, s, "t,r,j", dreg, sreg, BFD_RELOC_LO16);
9701 16 khays
          break;
9702
        }
9703 160 khays
    do_subi_i:
9704 16 khays
      used_at = 1;
9705
      load_register (AT, &imm_expr, dbl);
9706 160 khays
      macro_build (NULL, s2, "d,v,t", dreg, sreg, AT);
9707 16 khays
      break;
9708
 
9709
    case M_TEQ_I:
9710
      s = "teq";
9711
      goto trap;
9712
    case M_TGE_I:
9713
      s = "tge";
9714
      goto trap;
9715
    case M_TGEU_I:
9716
      s = "tgeu";
9717
      goto trap;
9718
    case M_TLT_I:
9719
      s = "tlt";
9720
      goto trap;
9721
    case M_TLTU_I:
9722
      s = "tltu";
9723
      goto trap;
9724
    case M_TNE_I:
9725
      s = "tne";
9726
    trap:
9727
      used_at = 1;
9728
      load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
9729
      macro_build (NULL, s, "s,t", sreg, AT);
9730
      break;
9731
 
9732
    case M_TRUNCWS:
9733
    case M_TRUNCWD:
9734 160 khays
      gas_assert (!mips_opts.micromips);
9735 16 khays
      gas_assert (mips_opts.isa == ISA_MIPS1);
9736
      used_at = 1;
9737
      sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
9738
      dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
9739
 
9740
      /*
9741
       * Is the double cfc1 instruction a bug in the mips assembler;
9742
       * or is there a reason for it?
9743
       */
9744
      start_noreorder ();
9745
      macro_build (NULL, "cfc1", "t,G", treg, RA);
9746
      macro_build (NULL, "cfc1", "t,G", treg, RA);
9747
      macro_build (NULL, "nop", "");
9748
      expr1.X_add_number = 3;
9749
      macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
9750
      expr1.X_add_number = 2;
9751
      macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
9752
      macro_build (NULL, "ctc1", "t,G", AT, RA);
9753
      macro_build (NULL, "nop", "");
9754
      macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
9755
                   dreg, sreg);
9756
      macro_build (NULL, "ctc1", "t,G", treg, RA);
9757
      macro_build (NULL, "nop", "");
9758
      end_noreorder ();
9759
      break;
9760
 
9761 160 khays
    case M_ULH_A:
9762
      ab = 1;
9763 16 khays
    case M_ULH:
9764
      s = "lb";
9765 160 khays
      s2 = "lbu";
9766
      off = 1;
9767
      goto uld_st;
9768
    case M_ULHU_A:
9769
      ab = 1;
9770 16 khays
    case M_ULHU:
9771
      s = "lbu";
9772 160 khays
      s2 = "lbu";
9773
      off = 1;
9774
      goto uld_st;
9775
    case M_ULW_A:
9776
      ab = 1;
9777
    case M_ULW:
9778
      s = "lwl";
9779
      s2 = "lwr";
9780
      off12 = mips_opts.micromips;
9781
      off = 3;
9782
      goto uld_st;
9783
    case M_ULD_A:
9784
      ab = 1;
9785 16 khays
    case M_ULD:
9786
      s = "ldl";
9787
      s2 = "ldr";
9788 160 khays
      off12 = mips_opts.micromips;
9789 16 khays
      off = 7;
9790 160 khays
      goto uld_st;
9791
    case M_USH_A:
9792
      ab = 1;
9793
    case M_USH:
9794
      s = "sb";
9795
      s2 = "sb";
9796
      off = 1;
9797
      ust = 1;
9798
      goto uld_st;
9799
    case M_USW_A:
9800
      ab = 1;
9801
    case M_USW:
9802
      s = "swl";
9803
      s2 = "swr";
9804
      off12 = mips_opts.micromips;
9805 16 khays
      off = 3;
9806 160 khays
      ust = 1;
9807
      goto uld_st;
9808
    case M_USD_A:
9809
      ab = 1;
9810
    case M_USD:
9811
      s = "sdl";
9812
      s2 = "sdr";
9813
      off12 = mips_opts.micromips;
9814
      off = 7;
9815
      ust = 1;
9816
 
9817
    uld_st:
9818
      if (!ab && offset_expr.X_add_number >= 0x8000 - off)
9819 16 khays
        as_bad (_("Operand overflow"));
9820 160 khays
 
9821
      ep = &offset_expr;
9822
      expr1.X_add_number = 0;
9823
      if (ab)
9824 16 khays
        {
9825
          used_at = 1;
9826
          tempreg = AT;
9827 160 khays
          load_address (tempreg, ep, &used_at);
9828
          if (breg != 0)
9829
            macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
9830
                         tempreg, tempreg, breg);
9831
          breg = tempreg;
9832
          tempreg = treg;
9833
          ep = &expr1;
9834 16 khays
        }
9835 160 khays
      else if (off12
9836
               && (offset_expr.X_op != O_constant
9837
                   || !IS_SEXT_12BIT_NUM (offset_expr.X_add_number)
9838
                   || !IS_SEXT_12BIT_NUM (offset_expr.X_add_number + off)))
9839
        {
9840
          used_at = 1;
9841
          tempreg = AT;
9842
          macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", tempreg, breg,
9843
                       -1, offset_reloc[0], offset_reloc[1], offset_reloc[2]);
9844
          breg = tempreg;
9845
          tempreg = treg;
9846
          ep = &expr1;
9847
        }
9848
      else if (!ust && treg == breg)
9849
        {
9850
          used_at = 1;
9851
          tempreg = AT;
9852
        }
9853 16 khays
      else
9854 160 khays
        tempreg = treg;
9855 16 khays
 
9856 160 khays
      if (off == 1)
9857
        goto ulh_sh;
9858 16 khays
 
9859
      if (!target_big_endian)
9860 160 khays
        ep->X_add_number += off;
9861
      if (!off12)
9862
        macro_build (ep, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
9863 16 khays
      else
9864 160 khays
        macro_build (NULL, s, "t,~(b)",
9865
                     tempreg, (unsigned long) ep->X_add_number, breg);
9866
 
9867 16 khays
      if (!target_big_endian)
9868 160 khays
        ep->X_add_number -= off;
9869 16 khays
      else
9870 160 khays
        ep->X_add_number += off;
9871
      if (!off12)
9872
        macro_build (ep, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
9873
      else
9874
        macro_build (NULL, s2, "t,~(b)",
9875
                     tempreg, (unsigned long) ep->X_add_number, breg);
9876 16 khays
 
9877 160 khays
      /* If necessary, move the result in tempreg to the final destination.  */
9878
      if (!ust && treg != tempreg)
9879
        {
9880
          /* Protect second load's delay slot.  */
9881
          load_delay_nop ();
9882
          move_register (treg, tempreg);
9883
        }
9884 16 khays
      break;
9885
 
9886 160 khays
    ulh_sh:
9887 16 khays
      used_at = 1;
9888 160 khays
      if (target_big_endian == ust)
9889
        ep->X_add_number += off;
9890
      tempreg = ust || ab ? treg : AT;
9891
      macro_build (ep, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
9892 16 khays
 
9893 160 khays
      /* For halfword transfers we need a temporary register to shuffle
9894
         bytes.  Unfortunately for M_USH_A we have none available before
9895
         the next store as AT holds the base address.  We deal with this
9896
         case by clobbering TREG and then restoring it as with ULH.  */
9897
      tempreg = ust == ab ? treg : AT;
9898
      if (ust)
9899
        macro_build (NULL, "srl", SHFT_FMT, tempreg, treg, 8);
9900 16 khays
 
9901 160 khays
      if (target_big_endian == ust)
9902
        ep->X_add_number -= off;
9903 16 khays
      else
9904 160 khays
        ep->X_add_number += off;
9905
      macro_build (ep, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
9906 16 khays
 
9907 160 khays
      /* For M_USH_A re-retrieve the LSB.  */
9908
      if (ust && ab)
9909
        {
9910
          if (target_big_endian)
9911
            ep->X_add_number += off;
9912
          else
9913
            ep->X_add_number -= off;
9914
          macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
9915
        }
9916
      /* For ULH and M_USH_A OR the LSB in.  */
9917
      if (!ust || ab)
9918
        {
9919
          tempreg = !ab ? AT : treg;
9920
          macro_build (NULL, "sll", SHFT_FMT, tempreg, tempreg, 8);
9921
          macro_build (NULL, "or", "d,v,t", treg, treg, AT);
9922
        }
9923 16 khays
      break;
9924
 
9925
    default:
9926
      /* FIXME: Check if this is one of the itbl macros, since they
9927
         are added dynamically.  */
9928
      as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
9929
      break;
9930
    }
9931
  if (!mips_opts.at && used_at)
9932
    as_bad (_("Macro used $at after \".set noat\""));
9933
}
9934
 
9935
/* Implement macros in mips16 mode.  */
9936
 
9937
static void
9938
mips16_macro (struct mips_cl_insn *ip)
9939
{
9940
  int mask;
9941
  int xreg, yreg, zreg, tmp;
9942
  expressionS expr1;
9943
  int dbl;
9944
  const char *s, *s2, *s3;
9945
 
9946
  mask = ip->insn_mo->mask;
9947
 
9948
  xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
9949
  yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
9950
  zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
9951
 
9952
  expr1.X_op = O_constant;
9953
  expr1.X_op_symbol = NULL;
9954
  expr1.X_add_symbol = NULL;
9955
  expr1.X_add_number = 1;
9956
 
9957
  dbl = 0;
9958
 
9959
  switch (mask)
9960
    {
9961
    default:
9962
      internalError ();
9963
 
9964
    case M_DDIV_3:
9965
      dbl = 1;
9966
    case M_DIV_3:
9967
      s = "mflo";
9968
      goto do_div3;
9969
    case M_DREM_3:
9970
      dbl = 1;
9971
    case M_REM_3:
9972
      s = "mfhi";
9973
    do_div3:
9974
      start_noreorder ();
9975
      macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
9976
      expr1.X_add_number = 2;
9977
      macro_build (&expr1, "bnez", "x,p", yreg);
9978
      macro_build (NULL, "break", "6", 7);
9979
 
9980
      /* FIXME: The normal code checks for of -1 / -0x80000000 here,
9981
         since that causes an overflow.  We should do that as well,
9982
         but I don't see how to do the comparisons without a temporary
9983
         register.  */
9984
      end_noreorder ();
9985
      macro_build (NULL, s, "x", zreg);
9986
      break;
9987
 
9988
    case M_DIVU_3:
9989
      s = "divu";
9990
      s2 = "mflo";
9991
      goto do_divu3;
9992
    case M_REMU_3:
9993
      s = "divu";
9994
      s2 = "mfhi";
9995
      goto do_divu3;
9996
    case M_DDIVU_3:
9997
      s = "ddivu";
9998
      s2 = "mflo";
9999
      goto do_divu3;
10000
    case M_DREMU_3:
10001
      s = "ddivu";
10002
      s2 = "mfhi";
10003
    do_divu3:
10004
      start_noreorder ();
10005
      macro_build (NULL, s, "0,x,y", xreg, yreg);
10006
      expr1.X_add_number = 2;
10007
      macro_build (&expr1, "bnez", "x,p", yreg);
10008
      macro_build (NULL, "break", "6", 7);
10009
      end_noreorder ();
10010
      macro_build (NULL, s2, "x", zreg);
10011
      break;
10012
 
10013
    case M_DMUL:
10014
      dbl = 1;
10015
    case M_MUL:
10016
      macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
10017
      macro_build (NULL, "mflo", "x", zreg);
10018
      break;
10019
 
10020
    case M_DSUBU_I:
10021
      dbl = 1;
10022
      goto do_subu;
10023
    case M_SUBU_I:
10024
    do_subu:
10025
      if (imm_expr.X_op != O_constant)
10026
        as_bad (_("Unsupported large constant"));
10027
      imm_expr.X_add_number = -imm_expr.X_add_number;
10028
      macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
10029
      break;
10030
 
10031
    case M_SUBU_I_2:
10032
      if (imm_expr.X_op != O_constant)
10033
        as_bad (_("Unsupported large constant"));
10034
      imm_expr.X_add_number = -imm_expr.X_add_number;
10035
      macro_build (&imm_expr, "addiu", "x,k", xreg);
10036
      break;
10037
 
10038
    case M_DSUBU_I_2:
10039
      if (imm_expr.X_op != O_constant)
10040
        as_bad (_("Unsupported large constant"));
10041
      imm_expr.X_add_number = -imm_expr.X_add_number;
10042
      macro_build (&imm_expr, "daddiu", "y,j", yreg);
10043
      break;
10044
 
10045
    case M_BEQ:
10046
      s = "cmp";
10047
      s2 = "bteqz";
10048
      goto do_branch;
10049
    case M_BNE:
10050
      s = "cmp";
10051
      s2 = "btnez";
10052
      goto do_branch;
10053
    case M_BLT:
10054
      s = "slt";
10055
      s2 = "btnez";
10056
      goto do_branch;
10057
    case M_BLTU:
10058
      s = "sltu";
10059
      s2 = "btnez";
10060
      goto do_branch;
10061
    case M_BLE:
10062
      s = "slt";
10063
      s2 = "bteqz";
10064
      goto do_reverse_branch;
10065
    case M_BLEU:
10066
      s = "sltu";
10067
      s2 = "bteqz";
10068
      goto do_reverse_branch;
10069
    case M_BGE:
10070
      s = "slt";
10071
      s2 = "bteqz";
10072
      goto do_branch;
10073
    case M_BGEU:
10074
      s = "sltu";
10075
      s2 = "bteqz";
10076
      goto do_branch;
10077
    case M_BGT:
10078
      s = "slt";
10079
      s2 = "btnez";
10080
      goto do_reverse_branch;
10081
    case M_BGTU:
10082
      s = "sltu";
10083
      s2 = "btnez";
10084
 
10085
    do_reverse_branch:
10086
      tmp = xreg;
10087
      xreg = yreg;
10088
      yreg = tmp;
10089
 
10090
    do_branch:
10091
      macro_build (NULL, s, "x,y", xreg, yreg);
10092
      macro_build (&offset_expr, s2, "p");
10093
      break;
10094
 
10095
    case M_BEQ_I:
10096
      s = "cmpi";
10097
      s2 = "bteqz";
10098
      s3 = "x,U";
10099
      goto do_branch_i;
10100
    case M_BNE_I:
10101
      s = "cmpi";
10102
      s2 = "btnez";
10103
      s3 = "x,U";
10104
      goto do_branch_i;
10105
    case M_BLT_I:
10106
      s = "slti";
10107
      s2 = "btnez";
10108
      s3 = "x,8";
10109
      goto do_branch_i;
10110
    case M_BLTU_I:
10111
      s = "sltiu";
10112
      s2 = "btnez";
10113
      s3 = "x,8";
10114
      goto do_branch_i;
10115
    case M_BLE_I:
10116
      s = "slti";
10117
      s2 = "btnez";
10118
      s3 = "x,8";
10119
      goto do_addone_branch_i;
10120
    case M_BLEU_I:
10121
      s = "sltiu";
10122
      s2 = "btnez";
10123
      s3 = "x,8";
10124
      goto do_addone_branch_i;
10125
    case M_BGE_I:
10126
      s = "slti";
10127
      s2 = "bteqz";
10128
      s3 = "x,8";
10129
      goto do_branch_i;
10130
    case M_BGEU_I:
10131
      s = "sltiu";
10132
      s2 = "bteqz";
10133
      s3 = "x,8";
10134
      goto do_branch_i;
10135
    case M_BGT_I:
10136
      s = "slti";
10137
      s2 = "bteqz";
10138
      s3 = "x,8";
10139
      goto do_addone_branch_i;
10140
    case M_BGTU_I:
10141
      s = "sltiu";
10142
      s2 = "bteqz";
10143
      s3 = "x,8";
10144
 
10145
    do_addone_branch_i:
10146
      if (imm_expr.X_op != O_constant)
10147
        as_bad (_("Unsupported large constant"));
10148
      ++imm_expr.X_add_number;
10149
 
10150
    do_branch_i:
10151
      macro_build (&imm_expr, s, s3, xreg);
10152
      macro_build (&offset_expr, s2, "p");
10153
      break;
10154
 
10155
    case M_ABS:
10156
      expr1.X_add_number = 0;
10157
      macro_build (&expr1, "slti", "x,8", yreg);
10158
      if (xreg != yreg)
10159
        move_register (xreg, yreg);
10160
      expr1.X_add_number = 2;
10161
      macro_build (&expr1, "bteqz", "p");
10162
      macro_build (NULL, "neg", "x,w", xreg, xreg);
10163
    }
10164
}
10165
 
10166
/* For consistency checking, verify that all bits are specified either
10167
   by the match/mask part of the instruction definition, or by the
10168
   operand list.  */
10169
static int
10170
validate_mips_insn (const struct mips_opcode *opc)
10171
{
10172
  const char *p = opc->args;
10173
  char c;
10174
  unsigned long used_bits = opc->mask;
10175
 
10176
  if ((used_bits & opc->match) != opc->match)
10177
    {
10178
      as_bad (_("internal: bad mips opcode (mask error): %s %s"),
10179
              opc->name, opc->args);
10180
      return 0;
10181
    }
10182
#define USE_BITS(mask,shift)    (used_bits |= ((mask) << (shift)))
10183
  while (*p)
10184
    switch (c = *p++)
10185
      {
10186
      case ',': break;
10187
      case '(': break;
10188
      case ')': break;
10189
      case '+':
10190
        switch (c = *p++)
10191
          {
10192
          case '1': USE_BITS (OP_MASK_UDI1,     OP_SH_UDI1);    break;
10193
          case '2': USE_BITS (OP_MASK_UDI2,     OP_SH_UDI2);    break;
10194
          case '3': USE_BITS (OP_MASK_UDI3,     OP_SH_UDI3);    break;
10195
          case '4': USE_BITS (OP_MASK_UDI4,     OP_SH_UDI4);    break;
10196
          case 'A': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
10197
          case 'B': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
10198
          case 'C': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
10199
          case 'D': USE_BITS (OP_MASK_RD,       OP_SH_RD);
10200
                    USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
10201
          case 'E': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
10202
          case 'F': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
10203
          case 'G': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
10204
          case 'H': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
10205
          case 'I': break;
10206
          case 't': USE_BITS (OP_MASK_RT,       OP_SH_RT);      break;
10207
          case 'T': USE_BITS (OP_MASK_RT,       OP_SH_RT);
10208
                    USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
10209
          case 'x': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
10210
          case 'X': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
10211
          case 'p': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
10212
          case 'P': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
10213
          case 'Q': USE_BITS (OP_MASK_SEQI,     OP_SH_SEQI);    break;
10214
          case 's': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
10215
          case 'S': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
10216
          case 'z': USE_BITS (OP_MASK_RZ,       OP_SH_RZ);      break;
10217
          case 'Z': USE_BITS (OP_MASK_FZ,       OP_SH_FZ);      break;
10218
          case 'a': USE_BITS (OP_MASK_OFFSET_A, OP_SH_OFFSET_A); break;
10219
          case 'b': USE_BITS (OP_MASK_OFFSET_B, OP_SH_OFFSET_B); break;
10220
          case 'c': USE_BITS (OP_MASK_OFFSET_C, OP_SH_OFFSET_C); break;
10221
 
10222
          default:
10223
            as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
10224
                    c, opc->name, opc->args);
10225
            return 0;
10226
          }
10227
        break;
10228
      case '<': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
10229
      case '>': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
10230
      case 'A': break;
10231
      case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
10232
      case 'C': USE_BITS (OP_MASK_COPZ,         OP_SH_COPZ);    break;
10233
      case 'D': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
10234
      case 'E': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10235
      case 'F': break;
10236
      case 'G': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10237
      case 'H': USE_BITS (OP_MASK_SEL,          OP_SH_SEL);     break;
10238
      case 'I': break;
10239
      case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
10240
      case 'K': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10241
      case 'L': break;
10242
      case 'M': USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
10243
      case 'N': USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
10244
      case 'O': USE_BITS (OP_MASK_ALN,          OP_SH_ALN);     break;
10245
      case 'Q': USE_BITS (OP_MASK_VSEL,         OP_SH_VSEL);
10246
                USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10247
      case 'R': USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
10248
      case 'S': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
10249
      case 'T': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10250
      case 'V': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
10251
      case 'W': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10252
      case 'X': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
10253
      case 'Y': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
10254
      case 'Z': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
10255
      case 'a': USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
10256
      case 'b': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10257
      case 'c': USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
10258
      case 'd': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10259
      case 'f': break;
10260
      case 'h': USE_BITS (OP_MASK_PREFX,        OP_SH_PREFX);   break;
10261
      case 'i': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
10262
      case 'j': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
10263
      case 'k': USE_BITS (OP_MASK_CACHE,        OP_SH_CACHE);   break;
10264
      case 'l': break;
10265
      case 'o': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
10266
      case 'p': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
10267
      case 'q': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
10268
      case 'r': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10269
      case 's': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10270
      case 't': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10271
      case 'u': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
10272
      case 'v': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10273
      case 'w': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10274
      case 'x': break;
10275
      case 'z': break;
10276
      case 'P': USE_BITS (OP_MASK_PERFREG,      OP_SH_PERFREG); break;
10277
      case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
10278
                USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
10279
      case 'e': USE_BITS (OP_MASK_VECBYTE,      OP_SH_VECBYTE); break;
10280
      case '%': USE_BITS (OP_MASK_VECALIGN,     OP_SH_VECALIGN); break;
10281
      case '[': break;
10282
      case ']': break;
10283
      case '1': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
10284
      case '2': USE_BITS (OP_MASK_BP,           OP_SH_BP);      break;
10285
      case '3': USE_BITS (OP_MASK_SA3,          OP_SH_SA3);     break;
10286
      case '4': USE_BITS (OP_MASK_SA4,          OP_SH_SA4);     break;
10287
      case '5': USE_BITS (OP_MASK_IMM8,         OP_SH_IMM8);    break;
10288
      case '6': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
10289
      case '7': USE_BITS (OP_MASK_DSPACC,       OP_SH_DSPACC);  break;
10290
      case '8': USE_BITS (OP_MASK_WRDSP,        OP_SH_WRDSP);   break;
10291
      case '9': USE_BITS (OP_MASK_DSPACC_S,     OP_SH_DSPACC_S);break;
10292
      case '0': USE_BITS (OP_MASK_DSPSFT,       OP_SH_DSPSFT);  break;
10293
      case '\'': USE_BITS (OP_MASK_RDDSP,       OP_SH_RDDSP);   break;
10294
      case ':': USE_BITS (OP_MASK_DSPSFT_7,     OP_SH_DSPSFT_7);break;
10295
      case '@': USE_BITS (OP_MASK_IMM10,        OP_SH_IMM10);   break;
10296
      case '!': USE_BITS (OP_MASK_MT_U,         OP_SH_MT_U);    break;
10297
      case '$': USE_BITS (OP_MASK_MT_H,         OP_SH_MT_H);    break;
10298
      case '*': USE_BITS (OP_MASK_MTACC_T,      OP_SH_MTACC_T); break;
10299
      case '&': USE_BITS (OP_MASK_MTACC_D,      OP_SH_MTACC_D); break;
10300 160 khays
      case '\\': USE_BITS (OP_MASK_3BITPOS,     OP_SH_3BITPOS); break;
10301
      case '~': USE_BITS (OP_MASK_OFFSET12,     OP_SH_OFFSET12); break;
10302 16 khays
      case 'g': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
10303
      default:
10304
        as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
10305
                c, opc->name, opc->args);
10306
        return 0;
10307
      }
10308
#undef USE_BITS
10309
  if (used_bits != 0xffffffff)
10310
    {
10311
      as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
10312
              ~used_bits & 0xffffffff, opc->name, opc->args);
10313
      return 0;
10314
    }
10315
  return 1;
10316
}
10317
 
10318 160 khays
/* For consistency checking, verify that the length implied matches the
10319
   major opcode and that all bits are specified either by the match/mask
10320
   part of the instruction definition, or by the operand list.  */
10321
 
10322
static int
10323
validate_micromips_insn (const struct mips_opcode *opc)
10324
{
10325
  unsigned long match = opc->match;
10326
  unsigned long mask = opc->mask;
10327
  const char *p = opc->args;
10328
  unsigned long insn_bits;
10329
  unsigned long used_bits;
10330
  unsigned long major;
10331
  unsigned int length;
10332
  char e;
10333
  char c;
10334
 
10335
  if ((mask & match) != match)
10336
    {
10337
      as_bad (_("Internal error: bad microMIPS opcode (mask error): %s %s"),
10338
              opc->name, opc->args);
10339
      return 0;
10340
    }
10341
  length = micromips_insn_length (opc);
10342
  if (length != 2 && length != 4)
10343
    {
10344
      as_bad (_("Internal error: bad microMIPS opcode (incorrect length: %u): "
10345
                "%s %s"), length, opc->name, opc->args);
10346
      return 0;
10347
    }
10348
  major = match >> (10 + 8 * (length - 2));
10349
  if ((length == 2 && (major & 7) != 1 && (major & 6) != 2)
10350
      || (length == 4 && (major & 7) != 0 && (major & 4) != 4))
10351
    {
10352
      as_bad (_("Internal error: bad microMIPS opcode "
10353
                "(opcode/length mismatch): %s %s"), opc->name, opc->args);
10354
      return 0;
10355
    }
10356
 
10357
  /* Shift piecewise to avoid an overflow where unsigned long is 32-bit.  */
10358
  insn_bits = 1 << 4 * length;
10359
  insn_bits <<= 4 * length;
10360
  insn_bits -= 1;
10361
  used_bits = mask;
10362
#define USE_BITS(field) \
10363
  (used_bits |= MICROMIPSOP_MASK_##field << MICROMIPSOP_SH_##field)
10364
  while (*p)
10365
    switch (c = *p++)
10366
      {
10367
      case ',': break;
10368
      case '(': break;
10369
      case ')': break;
10370
      case '+':
10371
        e = c;
10372
        switch (c = *p++)
10373
          {
10374
          case 'A': USE_BITS (EXTLSB);  break;
10375
          case 'B': USE_BITS (INSMSB);  break;
10376
          case 'C': USE_BITS (EXTMSBD); break;
10377
          case 'D': USE_BITS (RS);      USE_BITS (SEL); break;
10378
          case 'E': USE_BITS (EXTLSB);  break;
10379
          case 'F': USE_BITS (INSMSB);  break;
10380
          case 'G': USE_BITS (EXTMSBD); break;
10381
          case 'H': USE_BITS (EXTMSBD); break;
10382
          default:
10383
            as_bad (_("Internal error: bad mips opcode "
10384
                      "(unknown extension operand type `%c%c'): %s %s"),
10385
                    e, c, opc->name, opc->args);
10386
            return 0;
10387
          }
10388
        break;
10389
      case 'm':
10390
        e = c;
10391
        switch (c = *p++)
10392
          {
10393
          case 'A': USE_BITS (IMMA);    break;
10394
          case 'B': USE_BITS (IMMB);    break;
10395
          case 'C': USE_BITS (IMMC);    break;
10396
          case 'D': USE_BITS (IMMD);    break;
10397
          case 'E': USE_BITS (IMME);    break;
10398
          case 'F': USE_BITS (IMMF);    break;
10399
          case 'G': USE_BITS (IMMG);    break;
10400
          case 'H': USE_BITS (IMMH);    break;
10401
          case 'I': USE_BITS (IMMI);    break;
10402
          case 'J': USE_BITS (IMMJ);    break;
10403
          case 'L': USE_BITS (IMML);    break;
10404
          case 'M': USE_BITS (IMMM);    break;
10405
          case 'N': USE_BITS (IMMN);    break;
10406
          case 'O': USE_BITS (IMMO);    break;
10407
          case 'P': USE_BITS (IMMP);    break;
10408
          case 'Q': USE_BITS (IMMQ);    break;
10409
          case 'U': USE_BITS (IMMU);    break;
10410
          case 'W': USE_BITS (IMMW);    break;
10411
          case 'X': USE_BITS (IMMX);    break;
10412
          case 'Y': USE_BITS (IMMY);    break;
10413
          case 'Z': break;
10414
          case 'a': break;
10415
          case 'b': USE_BITS (MB);      break;
10416
          case 'c': USE_BITS (MC);      break;
10417
          case 'd': USE_BITS (MD);      break;
10418
          case 'e': USE_BITS (ME);      break;
10419
          case 'f': USE_BITS (MF);      break;
10420
          case 'g': USE_BITS (MG);      break;
10421
          case 'h': USE_BITS (MH);      break;
10422
          case 'i': USE_BITS (MI);      break;
10423
          case 'j': USE_BITS (MJ);      break;
10424
          case 'l': USE_BITS (ML);      break;
10425
          case 'm': USE_BITS (MM);      break;
10426
          case 'n': USE_BITS (MN);      break;
10427
          case 'p': USE_BITS (MP);      break;
10428
          case 'q': USE_BITS (MQ);      break;
10429
          case 'r': break;
10430
          case 's': break;
10431
          case 't': break;
10432
          case 'x': break;
10433
          case 'y': break;
10434
          case 'z': break;
10435
          default:
10436
            as_bad (_("Internal error: bad mips opcode "
10437
                      "(unknown extension operand type `%c%c'): %s %s"),
10438
                    e, c, opc->name, opc->args);
10439
            return 0;
10440
          }
10441
        break;
10442
      case '.': USE_BITS (OFFSET10);    break;
10443
      case '1': USE_BITS (STYPE);       break;
10444
      case '<': USE_BITS (SHAMT);       break;
10445
      case '>': USE_BITS (SHAMT);       break;
10446
      case 'B': USE_BITS (CODE10);      break;
10447
      case 'C': USE_BITS (COPZ);        break;
10448
      case 'D': USE_BITS (FD);          break;
10449
      case 'E': USE_BITS (RT);          break;
10450
      case 'G': USE_BITS (RS);          break;
10451
      case 'H': USE_BITS (SEL); break;
10452
      case 'K': USE_BITS (RS);          break;
10453
      case 'M': USE_BITS (CCC);         break;
10454
      case 'N': USE_BITS (BCC);         break;
10455
      case 'R': USE_BITS (FR);          break;
10456
      case 'S': USE_BITS (FS);          break;
10457
      case 'T': USE_BITS (FT);          break;
10458
      case 'V': USE_BITS (FS);          break;
10459
      case '\\': USE_BITS (3BITPOS);    break;
10460
      case 'a': USE_BITS (TARGET);      break;
10461
      case 'b': USE_BITS (RS);          break;
10462
      case 'c': USE_BITS (CODE);        break;
10463
      case 'd': USE_BITS (RD);          break;
10464
      case 'h': USE_BITS (PREFX);       break;
10465
      case 'i': USE_BITS (IMMEDIATE);   break;
10466
      case 'j': USE_BITS (DELTA);       break;
10467
      case 'k': USE_BITS (CACHE);       break;
10468
      case 'n': USE_BITS (RT);          break;
10469
      case 'o': USE_BITS (DELTA);       break;
10470
      case 'p': USE_BITS (DELTA);       break;
10471
      case 'q': USE_BITS (CODE2);       break;
10472
      case 'r': USE_BITS (RS);          break;
10473
      case 's': USE_BITS (RS);          break;
10474
      case 't': USE_BITS (RT);          break;
10475
      case 'u': USE_BITS (IMMEDIATE);   break;
10476
      case 'v': USE_BITS (RS);          break;
10477
      case 'w': USE_BITS (RT);          break;
10478
      case 'y': USE_BITS (RS3);         break;
10479
      case 'z': break;
10480
      case '|': USE_BITS (TRAP);        break;
10481
      case '~': USE_BITS (OFFSET12);    break;
10482
      default:
10483
        as_bad (_("Internal error: bad microMIPS opcode "
10484
                  "(unknown operand type `%c'): %s %s"),
10485
                c, opc->name, opc->args);
10486
        return 0;
10487
      }
10488
#undef USE_BITS
10489
  if (used_bits != insn_bits)
10490
    {
10491
      if (~used_bits & insn_bits)
10492
        as_bad (_("Internal error: bad microMIPS opcode "
10493
                  "(bits 0x%lx undefined): %s %s"),
10494
                ~used_bits & insn_bits, opc->name, opc->args);
10495
      if (used_bits & ~insn_bits)
10496
        as_bad (_("Internal error: bad microMIPS opcode "
10497
                  "(bits 0x%lx defined): %s %s"),
10498
                used_bits & ~insn_bits, opc->name, opc->args);
10499
      return 0;
10500
    }
10501
  return 1;
10502
}
10503
 
10504 16 khays
/* UDI immediates.  */
10505
struct mips_immed {
10506
  char          type;
10507
  unsigned int  shift;
10508
  unsigned long mask;
10509
  const char *  desc;
10510
};
10511
 
10512
static const struct mips_immed mips_immed[] = {
10513
  { '1',        OP_SH_UDI1,     OP_MASK_UDI1,           0},
10514
  { '2',        OP_SH_UDI2,     OP_MASK_UDI2,           0},
10515
  { '3',        OP_SH_UDI3,     OP_MASK_UDI3,           0},
10516
  { '4',        OP_SH_UDI4,     OP_MASK_UDI4,           0},
10517
  { 0,0,0,0 }
10518
};
10519
 
10520
/* Check whether an odd floating-point register is allowed.  */
10521
static int
10522
mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
10523
{
10524
  const char *s = insn->name;
10525
 
10526
  if (insn->pinfo == INSN_MACRO)
10527
    /* Let a macro pass, we'll catch it later when it is expanded.  */
10528
    return 1;
10529
 
10530
  if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
10531
    {
10532
      /* Allow odd registers for single-precision ops.  */
10533
      switch (insn->pinfo & (FP_S | FP_D))
10534
        {
10535
        case FP_S:
10536
        case 0:
10537
          return 1;     /* both single precision - ok */
10538
        case FP_D:
10539
          return 0;      /* both double precision - fail */
10540
        default:
10541
          break;
10542
        }
10543
 
10544
      /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand.  */
10545
      s = strchr (insn->name, '.');
10546
      if (argnum == 2)
10547
        s = s != NULL ? strchr (s + 1, '.') : NULL;
10548
      return (s != NULL && (s[1] == 'w' || s[1] == 's'));
10549
    }
10550
 
10551
  /* Single-precision coprocessor loads and moves are OK too.  */
10552
  if ((insn->pinfo & FP_S)
10553
      && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
10554
                         | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
10555
    return 1;
10556
 
10557
  return 0;
10558
}
10559
 
10560 160 khays
/* Check if EXPR is a constant between MIN (inclusive) and MAX (exclusive)
10561
   taking bits from BIT up.  */
10562
static int
10563
expr_const_in_range (expressionS *ep, offsetT min, offsetT max, int bit)
10564
{
10565
  return (ep->X_op == O_constant
10566
          && (ep->X_add_number & ((1 << bit) - 1)) == 0
10567
          && ep->X_add_number >= min << bit
10568
          && ep->X_add_number < max << bit);
10569
}
10570
 
10571 16 khays
/* This routine assembles an instruction into its binary format.  As a
10572
   side effect, it sets one of the global variables imm_reloc or
10573
   offset_reloc to the type of relocation to do if one of the operands
10574
   is an address expression.  */
10575
 
10576
static void
10577
mips_ip (char *str, struct mips_cl_insn *ip)
10578
{
10579 160 khays
  bfd_boolean wrong_delay_slot_insns = FALSE;
10580
  bfd_boolean need_delay_slot_ok = TRUE;
10581
  struct mips_opcode *firstinsn = NULL;
10582
  const struct mips_opcode *past;
10583
  struct hash_control *hash;
10584 16 khays
  char *s;
10585
  const char *args;
10586
  char c = 0;
10587
  struct mips_opcode *insn;
10588
  char *argsStart;
10589
  unsigned int regno;
10590
  unsigned int lastregno;
10591 160 khays
  unsigned int destregno = 0;
10592 16 khays
  unsigned int lastpos = 0;
10593
  unsigned int limlo, limhi;
10594
  char *s_reset;
10595
  offsetT min_range, max_range;
10596 160 khays
  long opend;
10597
  char *name;
10598 16 khays
  int argnum;
10599
  unsigned int rtype;
10600 160 khays
  char *dot;
10601
  long end;
10602 16 khays
 
10603
  insn_error = NULL;
10604
 
10605 160 khays
  if (mips_opts.micromips)
10606
    {
10607
      hash = micromips_op_hash;
10608
      past = &micromips_opcodes[bfd_micromips_num_opcodes];
10609
    }
10610
  else
10611
    {
10612
      hash = op_hash;
10613
      past = &mips_opcodes[NUMOPCODES];
10614
    }
10615
  forced_insn_length = 0;
10616 16 khays
  insn = NULL;
10617 160 khays
 
10618
  /* We first try to match an instruction up to a space or to the end.  */
10619
  for (end = 0; str[end] != '\0' && !ISSPACE (str[end]); end++)
10620 16 khays
    continue;
10621
 
10622 160 khays
  /* Make a copy of the instruction so that we can fiddle with it.  */
10623
  name = alloca (end + 1);
10624
  memcpy (name, str, end);
10625
  name[end] = '\0';
10626
 
10627
  for (;;)
10628 16 khays
    {
10629 160 khays
      insn = (struct mips_opcode *) hash_find (hash, name);
10630 16 khays
 
10631 160 khays
      if (insn != NULL || !mips_opts.micromips)
10632
        break;
10633
      if (forced_insn_length)
10634
        break;
10635 16 khays
 
10636 160 khays
      /* See if there's an instruction size override suffix,
10637
         either `16' or `32', at the end of the mnemonic proper,
10638
         that defines the operation, i.e. before the first `.'
10639
         character if any.  Strip it and retry.  */
10640
      dot = strchr (name, '.');
10641
      opend = dot != NULL ? dot - name : end;
10642
      if (opend < 3)
10643
        break;
10644
      if (name[opend - 2] == '1' && name[opend - 1] == '6')
10645
        forced_insn_length = 2;
10646
      else if (name[opend - 2] == '3' && name[opend - 1] == '2')
10647
        forced_insn_length = 4;
10648
      else
10649
        break;
10650
      memcpy (name + opend - 2, name + opend, end - opend + 1);
10651
    }
10652 16 khays
  if (insn == NULL)
10653
    {
10654 160 khays
      insn_error = _("Unrecognized opcode");
10655
      return;
10656 16 khays
    }
10657
 
10658 160 khays
  /* For microMIPS instructions placed in a fixed-length branch delay slot
10659
     we make up to two passes over the relevant fragment of the opcode
10660
     table.  First we try instructions that meet the delay slot's length
10661
     requirement.  If none matched, then we retry with the remaining ones
10662
     and if one matches, then we use it and then issue an appropriate
10663
     warning later on.  */
10664
  argsStart = s = str + end;
10665 16 khays
  for (;;)
10666
    {
10667 160 khays
      bfd_boolean delay_slot_ok;
10668
      bfd_boolean size_ok;
10669 16 khays
      bfd_boolean ok;
10670
 
10671 160 khays
      gas_assert (strcmp (insn->name, name) == 0);
10672 16 khays
 
10673
      ok = is_opcode_valid (insn);
10674 160 khays
      size_ok = is_size_valid (insn);
10675
      delay_slot_ok = is_delay_slot_valid (insn);
10676
      if (!delay_slot_ok && !wrong_delay_slot_insns)
10677 16 khays
        {
10678 160 khays
          firstinsn = insn;
10679
          wrong_delay_slot_insns = TRUE;
10680
        }
10681
      if (!ok || !size_ok || delay_slot_ok != need_delay_slot_ok)
10682
        {
10683
          static char buf[256];
10684
 
10685
          if (insn + 1 < past && strcmp (insn->name, insn[1].name) == 0)
10686 16 khays
            {
10687
              ++insn;
10688
              continue;
10689
            }
10690 160 khays
          if (wrong_delay_slot_insns && need_delay_slot_ok)
10691 16 khays
            {
10692 160 khays
              gas_assert (firstinsn);
10693
              need_delay_slot_ok = FALSE;
10694
              past = insn + 1;
10695
              insn = firstinsn;
10696
              continue;
10697 16 khays
            }
10698 160 khays
 
10699
          if (insn_error)
10700
            return;
10701
 
10702
          if (!ok)
10703
            sprintf (buf, _("opcode not supported on this processor: %s (%s)"),
10704
                     mips_cpu_info_from_arch (mips_opts.arch)->name,
10705
                     mips_cpu_info_from_isa (mips_opts.isa)->name);
10706
          else
10707
            sprintf (buf, _("Unrecognized %u-bit version of microMIPS opcode"),
10708
                     8 * forced_insn_length);
10709
          insn_error = buf;
10710
 
10711
          return;
10712 16 khays
        }
10713
 
10714
      create_insn (ip, insn);
10715
      insn_error = NULL;
10716
      argnum = 1;
10717
      lastregno = 0xffffffff;
10718
      for (args = insn->args;; ++args)
10719
        {
10720
          int is_mdmx;
10721
 
10722
          s += strspn (s, " \t");
10723
          is_mdmx = 0;
10724
          switch (*args)
10725
            {
10726
            case '\0':          /* end of args */
10727
              if (*s == '\0')
10728
                return;
10729
              break;
10730
 
10731
            case '2': /* DSP 2-bit unsigned immediate in bit 11.  */
10732 160 khays
              gas_assert (!mips_opts.micromips);
10733 16 khays
              my_getExpression (&imm_expr, s);
10734
              check_absolute_expr (ip, &imm_expr);
10735
              if ((unsigned long) imm_expr.X_add_number != 1
10736
                  && (unsigned long) imm_expr.X_add_number != 3)
10737
                {
10738
                  as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
10739
                          (unsigned long) imm_expr.X_add_number);
10740
                }
10741 160 khays
              INSERT_OPERAND (0, BP, *ip, imm_expr.X_add_number);
10742 16 khays
              imm_expr.X_op = O_absent;
10743
              s = expr_end;
10744
              continue;
10745
 
10746
            case '3': /* DSP 3-bit unsigned immediate in bit 21.  */
10747 160 khays
              gas_assert (!mips_opts.micromips);
10748 16 khays
              my_getExpression (&imm_expr, s);
10749
              check_absolute_expr (ip, &imm_expr);
10750
              if (imm_expr.X_add_number & ~OP_MASK_SA3)
10751
                {
10752
                  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
10753
                          OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
10754
                }
10755 160 khays
              INSERT_OPERAND (0, SA3, *ip, imm_expr.X_add_number);
10756 16 khays
              imm_expr.X_op = O_absent;
10757
              s = expr_end;
10758
              continue;
10759
 
10760
            case '4': /* DSP 4-bit unsigned immediate in bit 21.  */
10761 160 khays
              gas_assert (!mips_opts.micromips);
10762 16 khays
              my_getExpression (&imm_expr, s);
10763
              check_absolute_expr (ip, &imm_expr);
10764
              if (imm_expr.X_add_number & ~OP_MASK_SA4)
10765
                {
10766
                  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
10767
                          OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
10768
                }
10769 160 khays
              INSERT_OPERAND (0, SA4, *ip, imm_expr.X_add_number);
10770 16 khays
              imm_expr.X_op = O_absent;
10771
              s = expr_end;
10772
              continue;
10773
 
10774
            case '5': /* DSP 8-bit unsigned immediate in bit 16.  */
10775 160 khays
              gas_assert (!mips_opts.micromips);
10776 16 khays
              my_getExpression (&imm_expr, s);
10777
              check_absolute_expr (ip, &imm_expr);
10778
              if (imm_expr.X_add_number & ~OP_MASK_IMM8)
10779
                {
10780
                  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
10781
                          OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
10782
                }
10783 160 khays
              INSERT_OPERAND (0, IMM8, *ip, imm_expr.X_add_number);
10784 16 khays
              imm_expr.X_op = O_absent;
10785
              s = expr_end;
10786
              continue;
10787
 
10788
            case '6': /* DSP 5-bit unsigned immediate in bit 21.  */
10789 160 khays
              gas_assert (!mips_opts.micromips);
10790 16 khays
              my_getExpression (&imm_expr, s);
10791
              check_absolute_expr (ip, &imm_expr);
10792
              if (imm_expr.X_add_number & ~OP_MASK_RS)
10793
                {
10794
                  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
10795
                          OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
10796
                }
10797 160 khays
              INSERT_OPERAND (0, RS, *ip, imm_expr.X_add_number);
10798 16 khays
              imm_expr.X_op = O_absent;
10799
              s = expr_end;
10800
              continue;
10801
 
10802
            case '7': /* Four DSP accumulators in bits 11,12.  */
10803 160 khays
              gas_assert (!mips_opts.micromips);
10804 16 khays
              if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
10805
                  s[3] >= '0' && s[3] <= '3')
10806
                {
10807
                  regno = s[3] - '0';
10808
                  s += 4;
10809 160 khays
                  INSERT_OPERAND (0, DSPACC, *ip, regno);
10810 16 khays
                  continue;
10811
                }
10812
              else
10813
                as_bad (_("Invalid dsp acc register"));
10814
              break;
10815
 
10816
            case '8': /* DSP 6-bit unsigned immediate in bit 11.  */
10817 160 khays
              gas_assert (!mips_opts.micromips);
10818 16 khays
              my_getExpression (&imm_expr, s);
10819
              check_absolute_expr (ip, &imm_expr);
10820
              if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
10821
                {
10822
                  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
10823
                          OP_MASK_WRDSP,
10824
                          (unsigned long) imm_expr.X_add_number);
10825
                }
10826 160 khays
              INSERT_OPERAND (0, WRDSP, *ip, imm_expr.X_add_number);
10827 16 khays
              imm_expr.X_op = O_absent;
10828
              s = expr_end;
10829
              continue;
10830
 
10831
            case '9': /* Four DSP accumulators in bits 21,22.  */
10832 160 khays
              gas_assert (!mips_opts.micromips);
10833 16 khays
              if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
10834
                  s[3] >= '0' && s[3] <= '3')
10835
                {
10836
                  regno = s[3] - '0';
10837
                  s += 4;
10838 160 khays
                  INSERT_OPERAND (0, DSPACC_S, *ip, regno);
10839 16 khays
                  continue;
10840
                }
10841
              else
10842
                as_bad (_("Invalid dsp acc register"));
10843
              break;
10844
 
10845
            case '0': /* DSP 6-bit signed immediate in bit 20.  */
10846 160 khays
              gas_assert (!mips_opts.micromips);
10847 16 khays
              my_getExpression (&imm_expr, s);
10848
              check_absolute_expr (ip, &imm_expr);
10849
              min_range = -((OP_MASK_DSPSFT + 1) >> 1);
10850
              max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
10851
              if (imm_expr.X_add_number < min_range ||
10852
                  imm_expr.X_add_number > max_range)
10853
                {
10854
                  as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
10855
                          (long) min_range, (long) max_range,
10856
                          (long) imm_expr.X_add_number);
10857
                }
10858 160 khays
              INSERT_OPERAND (0, DSPSFT, *ip, imm_expr.X_add_number);
10859 16 khays
              imm_expr.X_op = O_absent;
10860
              s = expr_end;
10861
              continue;
10862
 
10863
            case '\'': /* DSP 6-bit unsigned immediate in bit 16.  */
10864 160 khays
              gas_assert (!mips_opts.micromips);
10865 16 khays
              my_getExpression (&imm_expr, s);
10866
              check_absolute_expr (ip, &imm_expr);
10867
              if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
10868
                {
10869
                  as_bad (_("DSP immediate not in range 0..%d (%lu)"),
10870
                          OP_MASK_RDDSP,
10871
                          (unsigned long) imm_expr.X_add_number);
10872
                }
10873 160 khays
              INSERT_OPERAND (0, RDDSP, *ip, imm_expr.X_add_number);
10874 16 khays
              imm_expr.X_op = O_absent;
10875
              s = expr_end;
10876
              continue;
10877
 
10878
            case ':': /* DSP 7-bit signed immediate in bit 19.  */
10879 160 khays
              gas_assert (!mips_opts.micromips);
10880 16 khays
              my_getExpression (&imm_expr, s);
10881
              check_absolute_expr (ip, &imm_expr);
10882
              min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
10883
              max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
10884
              if (imm_expr.X_add_number < min_range ||
10885
                  imm_expr.X_add_number > max_range)
10886
                {
10887
                  as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
10888
                          (long) min_range, (long) max_range,
10889
                          (long) imm_expr.X_add_number);
10890
                }
10891 160 khays
              INSERT_OPERAND (0, DSPSFT_7, *ip, imm_expr.X_add_number);
10892 16 khays
              imm_expr.X_op = O_absent;
10893
              s = expr_end;
10894
              continue;
10895
 
10896
            case '@': /* DSP 10-bit signed immediate in bit 16.  */
10897 160 khays
              gas_assert (!mips_opts.micromips);
10898 16 khays
              my_getExpression (&imm_expr, s);
10899
              check_absolute_expr (ip, &imm_expr);
10900
              min_range = -((OP_MASK_IMM10 + 1) >> 1);
10901
              max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
10902
              if (imm_expr.X_add_number < min_range ||
10903
                  imm_expr.X_add_number > max_range)
10904
                {
10905
                  as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
10906
                          (long) min_range, (long) max_range,
10907
                          (long) imm_expr.X_add_number);
10908
                }
10909 160 khays
              INSERT_OPERAND (0, IMM10, *ip, imm_expr.X_add_number);
10910 16 khays
              imm_expr.X_op = O_absent;
10911
              s = expr_end;
10912
              continue;
10913
 
10914
            case '!': /* MT usermode flag bit.  */
10915 160 khays
              gas_assert (!mips_opts.micromips);
10916 16 khays
              my_getExpression (&imm_expr, s);
10917
              check_absolute_expr (ip, &imm_expr);
10918
              if (imm_expr.X_add_number & ~OP_MASK_MT_U)
10919
                as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
10920
                        (unsigned long) imm_expr.X_add_number);
10921 160 khays
              INSERT_OPERAND (0, MT_U, *ip, imm_expr.X_add_number);
10922 16 khays
              imm_expr.X_op = O_absent;
10923
              s = expr_end;
10924
              continue;
10925
 
10926
            case '$': /* MT load high flag bit.  */
10927 160 khays
              gas_assert (!mips_opts.micromips);
10928 16 khays
              my_getExpression (&imm_expr, s);
10929
              check_absolute_expr (ip, &imm_expr);
10930
              if (imm_expr.X_add_number & ~OP_MASK_MT_H)
10931
                as_bad (_("MT load high bit not 0 or 1 (%lu)"),
10932
                        (unsigned long) imm_expr.X_add_number);
10933 160 khays
              INSERT_OPERAND (0, MT_H, *ip, imm_expr.X_add_number);
10934 16 khays
              imm_expr.X_op = O_absent;
10935
              s = expr_end;
10936
              continue;
10937
 
10938
            case '*': /* Four DSP accumulators in bits 18,19.  */
10939 160 khays
              gas_assert (!mips_opts.micromips);
10940 16 khays
              if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
10941
                  s[3] >= '0' && s[3] <= '3')
10942
                {
10943
                  regno = s[3] - '0';
10944
                  s += 4;
10945 160 khays
                  INSERT_OPERAND (0, MTACC_T, *ip, regno);
10946 16 khays
                  continue;
10947
                }
10948
              else
10949
                as_bad (_("Invalid dsp/smartmips acc register"));
10950
              break;
10951
 
10952
            case '&': /* Four DSP accumulators in bits 13,14.  */
10953 160 khays
              gas_assert (!mips_opts.micromips);
10954 16 khays
              if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
10955
                  s[3] >= '0' && s[3] <= '3')
10956
                {
10957
                  regno = s[3] - '0';
10958
                  s += 4;
10959 160 khays
                  INSERT_OPERAND (0, MTACC_D, *ip, regno);
10960 16 khays
                  continue;
10961
                }
10962
              else
10963
                as_bad (_("Invalid dsp/smartmips acc register"));
10964
              break;
10965
 
10966 160 khays
            case '\\':          /* 3-bit bit position.  */
10967
              {
10968
                unsigned long mask = (!mips_opts.micromips
10969
                                      ? OP_MASK_3BITPOS
10970
                                      : MICROMIPSOP_MASK_3BITPOS);
10971
 
10972
                my_getExpression (&imm_expr, s);
10973
                check_absolute_expr (ip, &imm_expr);
10974
                if ((unsigned long) imm_expr.X_add_number > mask)
10975
                  as_warn (_("Bit position for %s not in range 0..%lu (%lu)"),
10976
                           ip->insn_mo->name,
10977
                           mask, (unsigned long) imm_expr.X_add_number);
10978
                INSERT_OPERAND (mips_opts.micromips,
10979
                                3BITPOS, *ip, imm_expr.X_add_number);
10980
                imm_expr.X_op = O_absent;
10981
                s = expr_end;
10982
              }
10983
              continue;
10984
 
10985 16 khays
            case ',':
10986
              ++argnum;
10987
              if (*s++ == *args)
10988
                continue;
10989
              s--;
10990
              switch (*++args)
10991
                {
10992
                case 'r':
10993
                case 'v':
10994 160 khays
                  INSERT_OPERAND (mips_opts.micromips, RS, *ip, lastregno);
10995 16 khays
                  continue;
10996
 
10997
                case 'w':
10998 160 khays
                  INSERT_OPERAND (mips_opts.micromips, RT, *ip, lastregno);
10999 16 khays
                  continue;
11000
 
11001
                case 'W':
11002 160 khays
                  gas_assert (!mips_opts.micromips);
11003
                  INSERT_OPERAND (0, FT, *ip, lastregno);
11004 16 khays
                  continue;
11005
 
11006
                case 'V':
11007 160 khays
                  INSERT_OPERAND (mips_opts.micromips, FS, *ip, lastregno);
11008 16 khays
                  continue;
11009
                }
11010
              break;
11011
 
11012
            case '(':
11013
              /* Handle optional base register.
11014
                 Either the base register is omitted or
11015
                 we must have a left paren.  */
11016
              /* This is dependent on the next operand specifier
11017
                 is a base register specification.  */
11018 160 khays
              gas_assert (args[1] == 'b'
11019
                          || (mips_opts.micromips
11020
                              && args[1] == 'm'
11021
                              && (args[2] == 'l' || args[2] == 'n'
11022
                                  || args[2] == 's' || args[2] == 'a')));
11023
              if (*s == '\0' && args[1] == 'b')
11024 16 khays
                return;
11025 160 khays
              /* Fall through.  */
11026 16 khays
 
11027
            case ')':           /* These must match exactly.  */
11028 160 khays
              if (*s++ == *args)
11029
                continue;
11030
              break;
11031
 
11032
            case '[':           /* These must match exactly.  */
11033 16 khays
            case ']':
11034 160 khays
              gas_assert (!mips_opts.micromips);
11035 16 khays
              if (*s++ == *args)
11036
                continue;
11037
              break;
11038
 
11039
            case '+':           /* Opcode extension character.  */
11040
              switch (*++args)
11041
                {
11042
                case '1':       /* UDI immediates.  */
11043
                case '2':
11044
                case '3':
11045
                case '4':
11046 160 khays
                  gas_assert (!mips_opts.micromips);
11047 16 khays
                  {
11048
                    const struct mips_immed *imm = mips_immed;
11049
 
11050
                    while (imm->type && imm->type != *args)
11051
                      ++imm;
11052
                    if (! imm->type)
11053
                      internalError ();
11054
                    my_getExpression (&imm_expr, s);
11055
                    check_absolute_expr (ip, &imm_expr);
11056
                    if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
11057
                      {
11058
                        as_warn (_("Illegal %s number (%lu, 0x%lx)"),
11059
                                 imm->desc ? imm->desc : ip->insn_mo->name,
11060
                                 (unsigned long) imm_expr.X_add_number,
11061
                                 (unsigned long) imm_expr.X_add_number);
11062
                        imm_expr.X_add_number &= imm->mask;
11063
                      }
11064
                    ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
11065
                                        << imm->shift);
11066
                    imm_expr.X_op = O_absent;
11067
                    s = expr_end;
11068
                  }
11069
                  continue;
11070
 
11071
                case 'A':               /* ins/ext position, becomes LSB.  */
11072
                  limlo = 0;
11073
                  limhi = 31;
11074
                  goto do_lsb;
11075
                case 'E':
11076
                  limlo = 32;
11077
                  limhi = 63;
11078
                  goto do_lsb;
11079
                do_lsb:
11080
                  my_getExpression (&imm_expr, s);
11081
                  check_absolute_expr (ip, &imm_expr);
11082
                  if ((unsigned long) imm_expr.X_add_number < limlo
11083
                      || (unsigned long) imm_expr.X_add_number > limhi)
11084
                    {
11085
                      as_bad (_("Improper position (%lu)"),
11086
                              (unsigned long) imm_expr.X_add_number);
11087
                      imm_expr.X_add_number = limlo;
11088
                    }
11089
                  lastpos = imm_expr.X_add_number;
11090 160 khays
                  INSERT_OPERAND (mips_opts.micromips,
11091
                                  EXTLSB, *ip, imm_expr.X_add_number);
11092 16 khays
                  imm_expr.X_op = O_absent;
11093
                  s = expr_end;
11094
                  continue;
11095
 
11096
                case 'B':               /* ins size, becomes MSB.  */
11097
                  limlo = 1;
11098
                  limhi = 32;
11099
                  goto do_msb;
11100
                case 'F':
11101
                  limlo = 33;
11102
                  limhi = 64;
11103
                  goto do_msb;
11104
                do_msb:
11105
                  my_getExpression (&imm_expr, s);
11106
                  check_absolute_expr (ip, &imm_expr);
11107
                  /* Check for negative input so that small negative numbers
11108
                     will not succeed incorrectly.  The checks against
11109
                     (pos+size) transitively check "size" itself,
11110
                     assuming that "pos" is reasonable.  */
11111
                  if ((long) imm_expr.X_add_number < 0
11112
                      || ((unsigned long) imm_expr.X_add_number
11113
                          + lastpos) < limlo
11114
                      || ((unsigned long) imm_expr.X_add_number
11115
                          + lastpos) > limhi)
11116
                    {
11117
                      as_bad (_("Improper insert size (%lu, position %lu)"),
11118
                              (unsigned long) imm_expr.X_add_number,
11119
                              (unsigned long) lastpos);
11120
                      imm_expr.X_add_number = limlo - lastpos;
11121
                    }
11122 160 khays
                  INSERT_OPERAND (mips_opts.micromips, INSMSB, *ip,
11123
                                  lastpos + imm_expr.X_add_number - 1);
11124 16 khays
                  imm_expr.X_op = O_absent;
11125
                  s = expr_end;
11126
                  continue;
11127
 
11128
                case 'C':               /* ext size, becomes MSBD.  */
11129
                  limlo = 1;
11130
                  limhi = 32;
11131
                  goto do_msbd;
11132
                case 'G':
11133
                  limlo = 33;
11134
                  limhi = 64;
11135
                  goto do_msbd;
11136
                case 'H':
11137
                  limlo = 33;
11138
                  limhi = 64;
11139
                  goto do_msbd;
11140
                do_msbd:
11141
                  my_getExpression (&imm_expr, s);
11142
                  check_absolute_expr (ip, &imm_expr);
11143
                  /* Check for negative input so that small negative numbers
11144
                     will not succeed incorrectly.  The checks against
11145
                     (pos+size) transitively check "size" itself,
11146
                     assuming that "pos" is reasonable.  */
11147
                  if ((long) imm_expr.X_add_number < 0
11148
                      || ((unsigned long) imm_expr.X_add_number
11149
                          + lastpos) < limlo
11150
                      || ((unsigned long) imm_expr.X_add_number
11151
                          + lastpos) > limhi)
11152
                    {
11153
                      as_bad (_("Improper extract size (%lu, position %lu)"),
11154
                              (unsigned long) imm_expr.X_add_number,
11155
                              (unsigned long) lastpos);
11156
                      imm_expr.X_add_number = limlo - lastpos;
11157
                    }
11158 160 khays
                  INSERT_OPERAND (mips_opts.micromips,
11159
                                  EXTMSBD, *ip, imm_expr.X_add_number - 1);
11160 16 khays
                  imm_expr.X_op = O_absent;
11161
                  s = expr_end;
11162
                  continue;
11163
 
11164
                case 'D':
11165
                  /* +D is for disassembly only; never match.  */
11166
                  break;
11167
 
11168
                case 'I':
11169
                  /* "+I" is like "I", except that imm2_expr is used.  */
11170
                  my_getExpression (&imm2_expr, s);
11171
                  if (imm2_expr.X_op != O_big
11172
                      && imm2_expr.X_op != O_constant)
11173
                  insn_error = _("absolute expression required");
11174
                  if (HAVE_32BIT_GPRS)
11175
                    normalize_constant_expr (&imm2_expr);
11176
                  s = expr_end;
11177
                  continue;
11178
 
11179
                case 'T': /* Coprocessor register.  */
11180 160 khays
                  gas_assert (!mips_opts.micromips);
11181 16 khays
                  /* +T is for disassembly only; never match.  */
11182
                  break;
11183
 
11184
                case 't': /* Coprocessor register number.  */
11185 160 khays
                  gas_assert (!mips_opts.micromips);
11186 16 khays
                  if (s[0] == '$' && ISDIGIT (s[1]))
11187
                    {
11188
                      ++s;
11189
                      regno = 0;
11190
                      do
11191
                        {
11192
                          regno *= 10;
11193
                          regno += *s - '0';
11194
                          ++s;
11195
                        }
11196
                      while (ISDIGIT (*s));
11197
                      if (regno > 31)
11198
                        as_bad (_("Invalid register number (%d)"), regno);
11199
                      else
11200
                        {
11201 160 khays
                          INSERT_OPERAND (0, RT, *ip, regno);
11202 16 khays
                          continue;
11203
                        }
11204
                    }
11205
                  else
11206
                    as_bad (_("Invalid coprocessor 0 register number"));
11207
                  break;
11208
 
11209
                case 'x':
11210
                  /* bbit[01] and bbit[01]32 bit index.  Give error if index
11211
                     is not in the valid range.  */
11212 160 khays
                  gas_assert (!mips_opts.micromips);
11213 16 khays
                  my_getExpression (&imm_expr, s);
11214
                  check_absolute_expr (ip, &imm_expr);
11215
                  if ((unsigned) imm_expr.X_add_number > 31)
11216
                    {
11217
                      as_bad (_("Improper bit index (%lu)"),
11218
                              (unsigned long) imm_expr.X_add_number);
11219
                      imm_expr.X_add_number = 0;
11220
                    }
11221 160 khays
                  INSERT_OPERAND (0, BBITIND, *ip, imm_expr.X_add_number);
11222 16 khays
                  imm_expr.X_op = O_absent;
11223
                  s = expr_end;
11224
                  continue;
11225
 
11226
                case 'X':
11227
                  /* bbit[01] bit index when bbit is used but we generate
11228
                     bbit[01]32 because the index is over 32.  Move to the
11229
                     next candidate if index is not in the valid range.  */
11230 160 khays
                  gas_assert (!mips_opts.micromips);
11231 16 khays
                  my_getExpression (&imm_expr, s);
11232
                  check_absolute_expr (ip, &imm_expr);
11233
                  if ((unsigned) imm_expr.X_add_number < 32
11234
                      || (unsigned) imm_expr.X_add_number > 63)
11235
                    break;
11236 160 khays
                  INSERT_OPERAND (0, BBITIND, *ip, imm_expr.X_add_number - 32);
11237 16 khays
                  imm_expr.X_op = O_absent;
11238
                  s = expr_end;
11239
                  continue;
11240
 
11241
                case 'p':
11242
                  /* cins, cins32, exts and exts32 position field.  Give error
11243
                     if it's not in the valid range.  */
11244 160 khays
                  gas_assert (!mips_opts.micromips);
11245 16 khays
                  my_getExpression (&imm_expr, s);
11246
                  check_absolute_expr (ip, &imm_expr);
11247
                  if ((unsigned) imm_expr.X_add_number > 31)
11248
                    {
11249
                      as_bad (_("Improper position (%lu)"),
11250
                              (unsigned long) imm_expr.X_add_number);
11251
                      imm_expr.X_add_number = 0;
11252
                    }
11253
                  /* Make the pos explicit to simplify +S.  */
11254
                  lastpos = imm_expr.X_add_number + 32;
11255 160 khays
                  INSERT_OPERAND (0, CINSPOS, *ip, imm_expr.X_add_number);
11256 16 khays
                  imm_expr.X_op = O_absent;
11257
                  s = expr_end;
11258
                  continue;
11259
 
11260
                case 'P':
11261
                  /* cins, cins32, exts and exts32 position field.  Move to
11262
                     the next candidate if it's not in the valid range.  */
11263 160 khays
                  gas_assert (!mips_opts.micromips);
11264 16 khays
                  my_getExpression (&imm_expr, s);
11265
                  check_absolute_expr (ip, &imm_expr);
11266
                  if ((unsigned) imm_expr.X_add_number < 32
11267
                      || (unsigned) imm_expr.X_add_number > 63)
11268
                    break;
11269
                  lastpos = imm_expr.X_add_number;
11270 160 khays
                  INSERT_OPERAND (0, CINSPOS, *ip, imm_expr.X_add_number - 32);
11271 16 khays
                  imm_expr.X_op = O_absent;
11272
                  s = expr_end;
11273
                  continue;
11274
 
11275
                case 's':
11276
                  /* cins and exts length-minus-one field.  */
11277 160 khays
                  gas_assert (!mips_opts.micromips);
11278 16 khays
                  my_getExpression (&imm_expr, s);
11279
                  check_absolute_expr (ip, &imm_expr);
11280
                  if ((unsigned long) imm_expr.X_add_number > 31)
11281
                    {
11282
                      as_bad (_("Improper size (%lu)"),
11283
                              (unsigned long) imm_expr.X_add_number);
11284
                      imm_expr.X_add_number = 0;
11285
                    }
11286 160 khays
                  INSERT_OPERAND (0, CINSLM1, *ip, imm_expr.X_add_number);
11287 16 khays
                  imm_expr.X_op = O_absent;
11288
                  s = expr_end;
11289
                  continue;
11290
 
11291
                case 'S':
11292
                  /* cins32/exts32 and cins/exts aliasing cint32/exts32
11293
                     length-minus-one field.  */
11294 160 khays
                  gas_assert (!mips_opts.micromips);
11295 16 khays
                  my_getExpression (&imm_expr, s);
11296
                  check_absolute_expr (ip, &imm_expr);
11297
                  if ((long) imm_expr.X_add_number < 0
11298
                      || (unsigned long) imm_expr.X_add_number + lastpos > 63)
11299
                    {
11300
                      as_bad (_("Improper size (%lu)"),
11301
                              (unsigned long) imm_expr.X_add_number);
11302
                      imm_expr.X_add_number = 0;
11303
                    }
11304 160 khays
                  INSERT_OPERAND (0, CINSLM1, *ip, imm_expr.X_add_number);
11305 16 khays
                  imm_expr.X_op = O_absent;
11306
                  s = expr_end;
11307
                  continue;
11308
 
11309
                case 'Q':
11310
                  /* seqi/snei immediate field.  */
11311 160 khays
                  gas_assert (!mips_opts.micromips);
11312 16 khays
                  my_getExpression (&imm_expr, s);
11313
                  check_absolute_expr (ip, &imm_expr);
11314
                  if ((long) imm_expr.X_add_number < -512
11315
                      || (long) imm_expr.X_add_number >= 512)
11316
                    {
11317
                      as_bad (_("Improper immediate (%ld)"),
11318
                               (long) imm_expr.X_add_number);
11319
                      imm_expr.X_add_number = 0;
11320
                    }
11321 160 khays
                  INSERT_OPERAND (0, SEQI, *ip, imm_expr.X_add_number);
11322 16 khays
                  imm_expr.X_op = O_absent;
11323
                  s = expr_end;
11324
                  continue;
11325
 
11326
                case 'a': /* 8-bit signed offset in bit 6 */
11327 160 khays
                  gas_assert (!mips_opts.micromips);
11328 16 khays
                  my_getExpression (&imm_expr, s);
11329
                  check_absolute_expr (ip, &imm_expr);
11330
                  min_range = -((OP_MASK_OFFSET_A + 1) >> 1);
11331
                  max_range = ((OP_MASK_OFFSET_A + 1) >> 1) - 1;
11332
                  if (imm_expr.X_add_number < min_range
11333
                      || imm_expr.X_add_number > max_range)
11334
                    {
11335
                      as_bad (_("Offset not in range %ld..%ld (%ld)"),
11336
                              (long) min_range, (long) max_range,
11337
                              (long) imm_expr.X_add_number);
11338
                    }
11339 160 khays
                  INSERT_OPERAND (0, OFFSET_A, *ip, imm_expr.X_add_number);
11340 16 khays
                  imm_expr.X_op = O_absent;
11341
                  s = expr_end;
11342
                  continue;
11343
 
11344
                case 'b': /* 8-bit signed offset in bit 3 */
11345 160 khays
                  gas_assert (!mips_opts.micromips);
11346 16 khays
                  my_getExpression (&imm_expr, s);
11347
                  check_absolute_expr (ip, &imm_expr);
11348
                  min_range = -((OP_MASK_OFFSET_B + 1) >> 1);
11349
                  max_range = ((OP_MASK_OFFSET_B + 1) >> 1) - 1;
11350
                  if (imm_expr.X_add_number < min_range
11351
                      || imm_expr.X_add_number > max_range)
11352
                    {
11353
                      as_bad (_("Offset not in range %ld..%ld (%ld)"),
11354
                              (long) min_range, (long) max_range,
11355
                              (long) imm_expr.X_add_number);
11356
                    }
11357 160 khays
                  INSERT_OPERAND (0, OFFSET_B, *ip, imm_expr.X_add_number);
11358 16 khays
                  imm_expr.X_op = O_absent;
11359
                  s = expr_end;
11360
                  continue;
11361
 
11362
                case 'c': /* 9-bit signed offset in bit 6 */
11363 160 khays
                  gas_assert (!mips_opts.micromips);
11364 16 khays
                  my_getExpression (&imm_expr, s);
11365
                  check_absolute_expr (ip, &imm_expr);
11366
                  min_range = -((OP_MASK_OFFSET_C + 1) >> 1);
11367
                  max_range = ((OP_MASK_OFFSET_C + 1) >> 1) - 1;
11368
                  /* We check the offset range before adjusted.  */
11369
                  min_range <<= 4;
11370
                  max_range <<= 4;
11371
                  if (imm_expr.X_add_number < min_range
11372
                      || imm_expr.X_add_number > max_range)
11373
                    {
11374
                      as_bad (_("Offset not in range %ld..%ld (%ld)"),
11375
                              (long) min_range, (long) max_range,
11376
                              (long) imm_expr.X_add_number);
11377
                    }
11378
                  if (imm_expr.X_add_number & 0xf)
11379
                    {
11380
                      as_bad (_("Offset not 16 bytes alignment (%ld)"),
11381
                              (long) imm_expr.X_add_number);
11382
                    }
11383
                  /* Right shift 4 bits to adjust the offset operand.  */
11384 160 khays
                  INSERT_OPERAND (0, OFFSET_C, *ip,
11385
                                  imm_expr.X_add_number >> 4);
11386 16 khays
                  imm_expr.X_op = O_absent;
11387
                  s = expr_end;
11388
                  continue;
11389
 
11390
                case 'z':
11391 160 khays
                  gas_assert (!mips_opts.micromips);
11392 16 khays
                  if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
11393
                    break;
11394
                  if (regno == AT && mips_opts.at)
11395
                    {
11396
                      if (mips_opts.at == ATREG)
11397
                        as_warn (_("used $at without \".set noat\""));
11398
                      else
11399
                        as_warn (_("used $%u with \".set at=$%u\""),
11400
                                 regno, mips_opts.at);
11401
                    }
11402 160 khays
                  INSERT_OPERAND (0, RZ, *ip, regno);
11403 16 khays
                  continue;
11404
 
11405
                case 'Z':
11406 160 khays
                  gas_assert (!mips_opts.micromips);
11407 16 khays
                  if (!reg_lookup (&s, RTYPE_FPU, &regno))
11408
                    break;
11409 160 khays
                  INSERT_OPERAND (0, FZ, *ip, regno);
11410 16 khays
                  continue;
11411
 
11412
                default:
11413 160 khays
                  as_bad (_("Internal error: bad %s opcode "
11414 16 khays
                            "(unknown extension operand type `+%c'): %s %s"),
11415 160 khays
                          mips_opts.micromips ? "microMIPS" : "MIPS",
11416 16 khays
                          *args, insn->name, insn->args);
11417
                  /* Further processing is fruitless.  */
11418
                  return;
11419
                }
11420
              break;
11421
 
11422 160 khays
            case '.':           /* 10-bit offset.  */
11423
              gas_assert (mips_opts.micromips);
11424
            case '~':           /* 12-bit offset.  */
11425
              {
11426
                int shift = *args == '.' ? 9 : 11;
11427
                size_t i;
11428
 
11429
                /* Check whether there is only a single bracketed expression
11430
                   left.  If so, it must be the base register and the
11431
                   constant must be zero.  */
11432
                if (*s == '(' && strchr (s + 1, '(') == 0)
11433
                  continue;
11434
 
11435
                /* If this value won't fit into the offset, then go find
11436
                   a macro that will generate a 16- or 32-bit offset code
11437
                   pattern.  */
11438
                i = my_getSmallExpression (&imm_expr, imm_reloc, s);
11439
                if ((i == 0 && (imm_expr.X_op != O_constant
11440
                                || imm_expr.X_add_number >= 1 << shift
11441
                                || imm_expr.X_add_number < -1 << shift))
11442
                    || i > 0)
11443
                  {
11444
                    imm_expr.X_op = O_absent;
11445
                    break;
11446
                  }
11447
                if (shift == 9)
11448
                  INSERT_OPERAND (1, OFFSET10, *ip, imm_expr.X_add_number);
11449
                else
11450
                  INSERT_OPERAND (mips_opts.micromips,
11451
                                  OFFSET12, *ip, imm_expr.X_add_number);
11452
                imm_expr.X_op = O_absent;
11453
                s = expr_end;
11454
              }
11455
              continue;
11456
 
11457 16 khays
            case '<':           /* must be at least one digit */
11458
              /*
11459
               * According to the manual, if the shift amount is greater
11460
               * than 31 or less than 0, then the shift amount should be
11461
               * mod 32.  In reality the mips assembler issues an error.
11462
               * We issue a warning and mask out all but the low 5 bits.
11463
               */
11464
              my_getExpression (&imm_expr, s);
11465
              check_absolute_expr (ip, &imm_expr);
11466
              if ((unsigned long) imm_expr.X_add_number > 31)
11467
                as_warn (_("Improper shift amount (%lu)"),
11468
                         (unsigned long) imm_expr.X_add_number);
11469 160 khays
              INSERT_OPERAND (mips_opts.micromips,
11470
                              SHAMT, *ip, imm_expr.X_add_number);
11471 16 khays
              imm_expr.X_op = O_absent;
11472
              s = expr_end;
11473
              continue;
11474
 
11475
            case '>':           /* shift amount minus 32 */
11476
              my_getExpression (&imm_expr, s);
11477
              check_absolute_expr (ip, &imm_expr);
11478
              if ((unsigned long) imm_expr.X_add_number < 32
11479
                  || (unsigned long) imm_expr.X_add_number > 63)
11480
                break;
11481 160 khays
              INSERT_OPERAND (mips_opts.micromips,
11482
                              SHAMT, *ip, imm_expr.X_add_number - 32);
11483 16 khays
              imm_expr.X_op = O_absent;
11484
              s = expr_end;
11485
              continue;
11486
 
11487
            case 'k':           /* CACHE code.  */
11488
            case 'h':           /* PREFX code.  */
11489
            case '1':           /* SYNC type.  */
11490
              my_getExpression (&imm_expr, s);
11491
              check_absolute_expr (ip, &imm_expr);
11492
              if ((unsigned long) imm_expr.X_add_number > 31)
11493
                as_warn (_("Invalid value for `%s' (%lu)"),
11494
                         ip->insn_mo->name,
11495
                         (unsigned long) imm_expr.X_add_number);
11496 160 khays
              switch (*args)
11497 16 khays
                {
11498 160 khays
                case 'k':
11499
                  if (mips_fix_cn63xxp1
11500
                      && !mips_opts.micromips
11501
                      && strcmp ("pref", insn->name) == 0)
11502 16 khays
                    switch (imm_expr.X_add_number)
11503
                      {
11504
                      case 5:
11505
                      case 25:
11506
                      case 26:
11507
                      case 27:
11508
                      case 28:
11509
                      case 29:
11510
                      case 30:
11511
                      case 31:  /* These are ok.  */
11512
                        break;
11513
 
11514
                      default:  /* The rest must be changed to 28.  */
11515
                        imm_expr.X_add_number = 28;
11516
                        break;
11517
                      }
11518 160 khays
                  INSERT_OPERAND (mips_opts.micromips,
11519
                                  CACHE, *ip, imm_expr.X_add_number);
11520
                  break;
11521
                case 'h':
11522
                  INSERT_OPERAND (mips_opts.micromips,
11523
                                  PREFX, *ip, imm_expr.X_add_number);
11524
                  break;
11525
                case '1':
11526
                  INSERT_OPERAND (mips_opts.micromips,
11527
                                  STYPE, *ip, imm_expr.X_add_number);
11528
                  break;
11529 16 khays
                }
11530
              imm_expr.X_op = O_absent;
11531
              s = expr_end;
11532
              continue;
11533
 
11534
            case 'c':           /* BREAK code.  */
11535 160 khays
              {
11536
                unsigned long mask = (mips_opts.micromips
11537
                                      ? MICROMIPSOP_MASK_CODE
11538
                                      : OP_MASK_CODE);
11539
 
11540
                my_getExpression (&imm_expr, s);
11541
                check_absolute_expr (ip, &imm_expr);
11542
                if ((unsigned long) imm_expr.X_add_number > mask)
11543
                  as_warn (_("Code for %s not in range 0..%lu (%lu)"),
11544
                           ip->insn_mo->name,
11545
                           mask, (unsigned long) imm_expr.X_add_number);
11546
                INSERT_OPERAND (mips_opts.micromips,
11547
                                CODE, *ip, imm_expr.X_add_number);
11548
                imm_expr.X_op = O_absent;
11549
                s = expr_end;
11550
              }
11551 16 khays
              continue;
11552
 
11553
            case 'q':           /* Lower BREAK code.  */
11554 160 khays
              {
11555
                unsigned long mask = (mips_opts.micromips
11556
                                      ? MICROMIPSOP_MASK_CODE2
11557
                                      : OP_MASK_CODE2);
11558
 
11559
                my_getExpression (&imm_expr, s);
11560
                check_absolute_expr (ip, &imm_expr);
11561
                if ((unsigned long) imm_expr.X_add_number > mask)
11562
                  as_warn (_("Lower code for %s not in range 0..%lu (%lu)"),
11563
                           ip->insn_mo->name,
11564
                           mask, (unsigned long) imm_expr.X_add_number);
11565
                INSERT_OPERAND (mips_opts.micromips,
11566
                                CODE2, *ip, imm_expr.X_add_number);
11567
                imm_expr.X_op = O_absent;
11568
                s = expr_end;
11569
              }
11570 16 khays
              continue;
11571
 
11572 160 khays
            case 'B':           /* 20- or 10-bit syscall/break/wait code.  */
11573
              {
11574
                unsigned long mask = (mips_opts.micromips
11575
                                      ? MICROMIPSOP_MASK_CODE10
11576
                                      : OP_MASK_CODE20);
11577
 
11578
                my_getExpression (&imm_expr, s);
11579
                check_absolute_expr (ip, &imm_expr);
11580
                if ((unsigned long) imm_expr.X_add_number > mask)
11581
                  as_warn (_("Code for %s not in range 0..%lu (%lu)"),
11582
                           ip->insn_mo->name,
11583
                           mask, (unsigned long) imm_expr.X_add_number);
11584
                if (mips_opts.micromips)
11585
                  INSERT_OPERAND (1, CODE10, *ip, imm_expr.X_add_number);
11586
                else
11587
                  INSERT_OPERAND (0, CODE20, *ip, imm_expr.X_add_number);
11588
                imm_expr.X_op = O_absent;
11589
                s = expr_end;
11590
              }
11591 16 khays
              continue;
11592
 
11593 160 khays
            case 'C':           /* 25- or 23-bit coprocessor code.  */
11594
              {
11595
                unsigned long mask = (mips_opts.micromips
11596
                                      ? MICROMIPSOP_MASK_COPZ
11597
                                      : OP_MASK_COPZ);
11598
 
11599
                my_getExpression (&imm_expr, s);
11600
                check_absolute_expr (ip, &imm_expr);
11601
                if ((unsigned long) imm_expr.X_add_number > mask)
11602
                  as_warn (_("Coproccesor code > %u bits (%lu)"),
11603
                           mips_opts.micromips ? 23U : 25U,
11604 16 khays
                           (unsigned long) imm_expr.X_add_number);
11605 160 khays
                INSERT_OPERAND (mips_opts.micromips,
11606
                                COPZ, *ip, imm_expr.X_add_number);
11607
                imm_expr.X_op = O_absent;
11608
                s = expr_end;
11609
              }
11610 16 khays
              continue;
11611
 
11612 160 khays
            case 'J':           /* 19-bit WAIT code.  */
11613
              gas_assert (!mips_opts.micromips);
11614 16 khays
              my_getExpression (&imm_expr, s);
11615
              check_absolute_expr (ip, &imm_expr);
11616
              if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
11617 160 khays
                {
11618
                  as_warn (_("Illegal 19-bit code (%lu)"),
11619 16 khays
                           (unsigned long) imm_expr.X_add_number);
11620 160 khays
                  imm_expr.X_add_number &= OP_MASK_CODE19;
11621
                }
11622
              INSERT_OPERAND (0, CODE19, *ip, imm_expr.X_add_number);
11623 16 khays
              imm_expr.X_op = O_absent;
11624
              s = expr_end;
11625
              continue;
11626
 
11627
            case 'P':           /* Performance register.  */
11628 160 khays
              gas_assert (!mips_opts.micromips);
11629 16 khays
              my_getExpression (&imm_expr, s);
11630
              check_absolute_expr (ip, &imm_expr);
11631
              if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
11632
                as_warn (_("Invalid performance register (%lu)"),
11633
                         (unsigned long) imm_expr.X_add_number);
11634 160 khays
              INSERT_OPERAND (0, PERFREG, *ip, imm_expr.X_add_number);
11635 16 khays
              imm_expr.X_op = O_absent;
11636
              s = expr_end;
11637
              continue;
11638
 
11639
            case 'G':           /* Coprocessor destination register.  */
11640 160 khays
              {
11641
                unsigned long opcode = ip->insn_opcode;
11642
                unsigned long mask;
11643
                unsigned int types;
11644
                int cop0;
11645 16 khays
 
11646 160 khays
                if (mips_opts.micromips)
11647
                  {
11648
                    mask = ~((MICROMIPSOP_MASK_RT << MICROMIPSOP_SH_RT)
11649
                             | (MICROMIPSOP_MASK_RS << MICROMIPSOP_SH_RS)
11650
                             | (MICROMIPSOP_MASK_SEL << MICROMIPSOP_SH_SEL));
11651
                    opcode &= mask;
11652
                    switch (opcode)
11653
                      {
11654
                      case 0x000000fc:                          /* mfc0  */
11655
                      case 0x000002fc:                          /* mtc0  */
11656
                      case 0x580000fc:                          /* dmfc0 */
11657
                      case 0x580002fc:                          /* dmtc0 */
11658
                        cop0 = 1;
11659
                        break;
11660
                      default:
11661
                        cop0 = 0;
11662
                        break;
11663
                      }
11664
                  }
11665
                else
11666
                  {
11667
                    opcode = (opcode >> OP_SH_OP) & OP_MASK_OP;
11668
                    cop0 = opcode == OP_OP_COP0;
11669
                  }
11670
                types = RTYPE_NUM | (cop0 ? RTYPE_CP0 : RTYPE_GP);
11671
                ok = reg_lookup (&s, types, &regno);
11672
                if (mips_opts.micromips)
11673
                  INSERT_OPERAND (1, RS, *ip, regno);
11674
                else
11675
                  INSERT_OPERAND (0, RD, *ip, regno);
11676
                if (ok)
11677
                  {
11678
                    lastregno = regno;
11679
                    continue;
11680
                  }
11681
              }
11682
              break;
11683
 
11684
            case 'y':           /* ALNV.PS source register.  */
11685
              gas_assert (mips_opts.micromips);
11686
              goto do_reg;
11687
            case 'x':           /* Ignore register name.  */
11688
            case 'U':           /* Destination register (CLO/CLZ).  */
11689
            case 'g':           /* Coprocessor destination register.  */
11690
              gas_assert (!mips_opts.micromips);
11691 16 khays
            case 'b':           /* Base register.  */
11692
            case 'd':           /* Destination register.  */
11693
            case 's':           /* Source register.  */
11694
            case 't':           /* Target register.  */
11695
            case 'r':           /* Both target and source.  */
11696
            case 'v':           /* Both dest and source.  */
11697
            case 'w':           /* Both dest and target.  */
11698
            case 'E':           /* Coprocessor target register.  */
11699
            case 'K':           /* RDHWR destination register.  */
11700
            case 'z':           /* Must be zero register.  */
11701 160 khays
            do_reg:
11702 16 khays
              s_reset = s;
11703
              if (*args == 'E' || *args == 'K')
11704
                ok = reg_lookup (&s, RTYPE_NUM, &regno);
11705
              else
11706
                {
11707
                  ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
11708
                  if (regno == AT && mips_opts.at)
11709
                    {
11710
                      if (mips_opts.at == ATREG)
11711
                        as_warn (_("Used $at without \".set noat\""));
11712
                      else
11713
                        as_warn (_("Used $%u with \".set at=$%u\""),
11714
                                 regno, mips_opts.at);
11715
                    }
11716
                }
11717
              if (ok)
11718
                {
11719
                  c = *args;
11720
                  if (*s == ' ')
11721
                    ++s;
11722
                  if (args[1] != *s)
11723
                    {
11724
                      if (c == 'r' || c == 'v' || c == 'w')
11725
                        {
11726
                          regno = lastregno;
11727
                          s = s_reset;
11728
                          ++args;
11729
                        }
11730
                    }
11731
                  /* 'z' only matches $0.  */
11732
                  if (c == 'z' && regno != 0)
11733
                    break;
11734
 
11735
                  if (c == 's' && !strncmp (ip->insn_mo->name, "jalr", 4))
11736
                    {
11737
                      if (regno == lastregno)
11738
                        {
11739
                          insn_error
11740
                            = _("Source and destination must be different");
11741
                          continue;
11742
                        }
11743
                      if (regno == 31 && lastregno == 0xffffffff)
11744
                        {
11745
                          insn_error
11746
                            = _("A destination register must be supplied");
11747
                          continue;
11748
                        }
11749
                    }
11750
                  /* Now that we have assembled one operand, we use the args
11751
                     string to figure out where it goes in the instruction.  */
11752
                  switch (c)
11753
                    {
11754
                    case 'r':
11755
                    case 's':
11756
                    case 'v':
11757
                    case 'b':
11758 160 khays
                      INSERT_OPERAND (mips_opts.micromips, RS, *ip, regno);
11759 16 khays
                      break;
11760 160 khays
 
11761
                    case 'K':
11762
                      if (mips_opts.micromips)
11763
                        INSERT_OPERAND (1, RS, *ip, regno);
11764
                      else
11765
                        INSERT_OPERAND (0, RD, *ip, regno);
11766
                      break;
11767
 
11768 16 khays
                    case 'd':
11769
                    case 'g':
11770 160 khays
                      INSERT_OPERAND (mips_opts.micromips, RD, *ip, regno);
11771 16 khays
                      break;
11772 160 khays
 
11773 16 khays
                    case 'U':
11774 160 khays
                      gas_assert (!mips_opts.micromips);
11775
                      INSERT_OPERAND (0, RD, *ip, regno);
11776
                      INSERT_OPERAND (0, RT, *ip, regno);
11777 16 khays
                      break;
11778 160 khays
 
11779 16 khays
                    case 'w':
11780
                    case 't':
11781
                    case 'E':
11782 160 khays
                      INSERT_OPERAND (mips_opts.micromips, RT, *ip, regno);
11783 16 khays
                      break;
11784 160 khays
 
11785
                    case 'y':
11786
                      gas_assert (mips_opts.micromips);
11787
                      INSERT_OPERAND (1, RS3, *ip, regno);
11788
                      break;
11789
 
11790 16 khays
                    case 'x':
11791
                      /* This case exists because on the r3000 trunc
11792
                         expands into a macro which requires a gp
11793
                         register.  On the r6000 or r4000 it is
11794
                         assembled into a single instruction which
11795
                         ignores the register.  Thus the insn version
11796
                         is MIPS_ISA2 and uses 'x', and the macro
11797
                         version is MIPS_ISA1 and uses 't'.  */
11798
                      break;
11799 160 khays
 
11800 16 khays
                    case 'z':
11801
                      /* This case is for the div instruction, which
11802
                         acts differently if the destination argument
11803
                         is $0.  This only matches $0, and is checked
11804
                         outside the switch.  */
11805
                      break;
11806
                    }
11807
                  lastregno = regno;
11808
                  continue;
11809
                }
11810
              switch (*args++)
11811
                {
11812
                case 'r':
11813
                case 'v':
11814 160 khays
                  INSERT_OPERAND (mips_opts.micromips, RS, *ip, lastregno);
11815 16 khays
                  continue;
11816 160 khays
 
11817 16 khays
                case 'w':
11818 160 khays
                  INSERT_OPERAND (mips_opts.micromips, RT, *ip, lastregno);
11819 16 khays
                  continue;
11820
                }
11821
              break;
11822
 
11823
            case 'O':           /* MDMX alignment immediate constant.  */
11824 160 khays
              gas_assert (!mips_opts.micromips);
11825 16 khays
              my_getExpression (&imm_expr, s);
11826
              check_absolute_expr (ip, &imm_expr);
11827
              if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
11828
                as_warn (_("Improper align amount (%ld), using low bits"),
11829
                         (long) imm_expr.X_add_number);
11830 160 khays
              INSERT_OPERAND (0, ALN, *ip, imm_expr.X_add_number);
11831 16 khays
              imm_expr.X_op = O_absent;
11832
              s = expr_end;
11833
              continue;
11834
 
11835
            case 'Q':           /* MDMX vector, element sel, or const.  */
11836
              if (s[0] != '$')
11837
                {
11838
                  /* MDMX Immediate.  */
11839 160 khays
                  gas_assert (!mips_opts.micromips);
11840 16 khays
                  my_getExpression (&imm_expr, s);
11841
                  check_absolute_expr (ip, &imm_expr);
11842
                  if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
11843
                    as_warn (_("Invalid MDMX Immediate (%ld)"),
11844
                             (long) imm_expr.X_add_number);
11845 160 khays
                  INSERT_OPERAND (0, FT, *ip, imm_expr.X_add_number);
11846 16 khays
                  if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
11847
                    ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
11848
                  else
11849
                    ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
11850
                  imm_expr.X_op = O_absent;
11851
                  s = expr_end;
11852
                  continue;
11853
                }
11854
              /* Not MDMX Immediate.  Fall through.  */
11855
            case 'X':           /* MDMX destination register.  */
11856
            case 'Y':           /* MDMX source register.  */
11857
            case 'Z':           /* MDMX target register.  */
11858
              is_mdmx = 1;
11859 160 khays
            case 'W':
11860
              gas_assert (!mips_opts.micromips);
11861 16 khays
            case 'D':           /* Floating point destination register.  */
11862
            case 'S':           /* Floating point source register.  */
11863
            case 'T':           /* Floating point target register.  */
11864
            case 'R':           /* Floating point source register.  */
11865
            case 'V':
11866
              rtype = RTYPE_FPU;
11867
              if (is_mdmx
11868
                  || (mips_opts.ase_mdmx
11869
                      && (ip->insn_mo->pinfo & FP_D)
11870
                      && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
11871
                                                | INSN_COPROC_MEMORY_DELAY
11872
                                                | INSN_LOAD_COPROC_DELAY
11873
                                                | INSN_LOAD_MEMORY_DELAY
11874
                                                | INSN_STORE_MEMORY))))
11875
                rtype |= RTYPE_VEC;
11876
              s_reset = s;
11877
              if (reg_lookup (&s, rtype, &regno))
11878
                {
11879
                  if ((regno & 1) != 0
11880
                      && HAVE_32BIT_FPRS
11881
                      && !mips_oddfpreg_ok (ip->insn_mo, argnum))
11882
                    as_warn (_("Float register should be even, was %d"),
11883
                             regno);
11884
 
11885
                  c = *args;
11886
                  if (*s == ' ')
11887
                    ++s;
11888
                  if (args[1] != *s)
11889
                    {
11890
                      if (c == 'V' || c == 'W')
11891
                        {
11892
                          regno = lastregno;
11893
                          s = s_reset;
11894
                          ++args;
11895
                        }
11896
                    }
11897
                  switch (c)
11898
                    {
11899
                    case 'D':
11900
                    case 'X':
11901 160 khays
                      INSERT_OPERAND (mips_opts.micromips, FD, *ip, regno);
11902 16 khays
                      break;
11903 160 khays
 
11904 16 khays
                    case 'V':
11905
                    case 'S':
11906
                    case 'Y':
11907 160 khays
                      INSERT_OPERAND (mips_opts.micromips, FS, *ip, regno);
11908 16 khays
                      break;
11909 160 khays
 
11910 16 khays
                    case 'Q':
11911
                      /* This is like 'Z', but also needs to fix the MDMX
11912
                         vector/scalar select bits.  Note that the
11913
                         scalar immediate case is handled above.  */
11914
                      if (*s == '[')
11915
                        {
11916
                          int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
11917
                          int max_el = (is_qh ? 3 : 7);
11918
                          s++;
11919
                          my_getExpression(&imm_expr, s);
11920
                          check_absolute_expr (ip, &imm_expr);
11921
                          s = expr_end;
11922
                          if (imm_expr.X_add_number > max_el)
11923
                            as_bad (_("Bad element selector %ld"),
11924
                                    (long) imm_expr.X_add_number);
11925
                          imm_expr.X_add_number &= max_el;
11926
                          ip->insn_opcode |= (imm_expr.X_add_number
11927
                                              << (OP_SH_VSEL +
11928
                                                  (is_qh ? 2 : 1)));
11929
                          imm_expr.X_op = O_absent;
11930
                          if (*s != ']')
11931
                            as_warn (_("Expecting ']' found '%s'"), s);
11932
                          else
11933
                            s++;
11934
                        }
11935
                      else
11936
                        {
11937
                          if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
11938
                            ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
11939
                                                << OP_SH_VSEL);
11940
                          else
11941
                            ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
11942
                                                OP_SH_VSEL);
11943
                        }
11944
                      /* Fall through.  */
11945
                    case 'W':
11946
                    case 'T':
11947
                    case 'Z':
11948 160 khays
                      INSERT_OPERAND (mips_opts.micromips, FT, *ip, regno);
11949 16 khays
                      break;
11950 160 khays
 
11951 16 khays
                    case 'R':
11952 160 khays
                      INSERT_OPERAND (mips_opts.micromips, FR, *ip, regno);
11953 16 khays
                      break;
11954
                    }
11955
                  lastregno = regno;
11956
                  continue;
11957
                }
11958
 
11959
              switch (*args++)
11960
                {
11961
                case 'V':
11962 160 khays
                  INSERT_OPERAND (mips_opts.micromips, FS, *ip, lastregno);
11963 16 khays
                  continue;
11964 160 khays
 
11965 16 khays
                case 'W':
11966 160 khays
                  INSERT_OPERAND (mips_opts.micromips, FT, *ip, lastregno);
11967 16 khays
                  continue;
11968
                }
11969
              break;
11970
 
11971
            case 'I':
11972
              my_getExpression (&imm_expr, s);
11973
              if (imm_expr.X_op != O_big
11974
                  && imm_expr.X_op != O_constant)
11975
                insn_error = _("absolute expression required");
11976
              if (HAVE_32BIT_GPRS)
11977
                normalize_constant_expr (&imm_expr);
11978
              s = expr_end;
11979
              continue;
11980
 
11981
            case 'A':
11982
              my_getExpression (&offset_expr, s);
11983
              normalize_address_expr (&offset_expr);
11984
              *imm_reloc = BFD_RELOC_32;
11985
              s = expr_end;
11986
              continue;
11987
 
11988
            case 'F':
11989
            case 'L':
11990
            case 'f':
11991
            case 'l':
11992
              {
11993
                int f64;
11994
                int using_gprs;
11995
                char *save_in;
11996
                char *err;
11997
                unsigned char temp[8];
11998
                int len;
11999
                unsigned int length;
12000
                segT seg;
12001
                subsegT subseg;
12002
                char *p;
12003
 
12004
                /* These only appear as the last operand in an
12005
                   instruction, and every instruction that accepts
12006
                   them in any variant accepts them in all variants.
12007
                   This means we don't have to worry about backing out
12008
                   any changes if the instruction does not match.
12009
 
12010
                   The difference between them is the size of the
12011
                   floating point constant and where it goes.  For 'F'
12012
                   and 'L' the constant is 64 bits; for 'f' and 'l' it
12013
                   is 32 bits.  Where the constant is placed is based
12014
                   on how the MIPS assembler does things:
12015
                    F -- .rdata
12016
                    L -- .lit8
12017
                    f -- immediate value
12018
                    l -- .lit4
12019
 
12020
                    The .lit4 and .lit8 sections are only used if
12021
                    permitted by the -G argument.
12022
 
12023
                    The code below needs to know whether the target register
12024
                    is 32 or 64 bits wide.  It relies on the fact 'f' and
12025
                    'F' are used with GPR-based instructions and 'l' and
12026
                    'L' are used with FPR-based instructions.  */
12027
 
12028
                f64 = *args == 'F' || *args == 'L';
12029
                using_gprs = *args == 'F' || *args == 'f';
12030
 
12031
                save_in = input_line_pointer;
12032
                input_line_pointer = s;
12033
                err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
12034
                length = len;
12035
                s = input_line_pointer;
12036
                input_line_pointer = save_in;
12037
                if (err != NULL && *err != '\0')
12038
                  {
12039
                    as_bad (_("Bad floating point constant: %s"), err);
12040
                    memset (temp, '\0', sizeof temp);
12041
                    length = f64 ? 8 : 4;
12042
                  }
12043
 
12044
                gas_assert (length == (unsigned) (f64 ? 8 : 4));
12045
 
12046
                if (*args == 'f'
12047
                    || (*args == 'l'
12048
                        && (g_switch_value < 4
12049
                            || (temp[0] == 0 && temp[1] == 0)
12050
                            || (temp[2] == 0 && temp[3] == 0))))
12051
                  {
12052
                    imm_expr.X_op = O_constant;
12053
                    if (!target_big_endian)
12054
                      imm_expr.X_add_number = bfd_getl32 (temp);
12055
                    else
12056
                      imm_expr.X_add_number = bfd_getb32 (temp);
12057
                  }
12058
                else if (length > 4
12059
                         && !mips_disable_float_construction
12060
                         /* Constants can only be constructed in GPRs and
12061
                            copied to FPRs if the GPRs are at least as wide
12062
                            as the FPRs.  Force the constant into memory if
12063
                            we are using 64-bit FPRs but the GPRs are only
12064
                            32 bits wide.  */
12065
                         && (using_gprs
12066
                             || !(HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
12067
                         && ((temp[0] == 0 && temp[1] == 0)
12068
                             || (temp[2] == 0 && temp[3] == 0))
12069
                         && ((temp[4] == 0 && temp[5] == 0)
12070
                             || (temp[6] == 0 && temp[7] == 0)))
12071
                  {
12072
                    /* The value is simple enough to load with a couple of
12073
                       instructions.  If using 32-bit registers, set
12074
                       imm_expr to the high order 32 bits and offset_expr to
12075
                       the low order 32 bits.  Otherwise, set imm_expr to
12076
                       the entire 64 bit constant.  */
12077
                    if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
12078
                      {
12079
                        imm_expr.X_op = O_constant;
12080
                        offset_expr.X_op = O_constant;
12081
                        if (!target_big_endian)
12082
                          {
12083
                            imm_expr.X_add_number = bfd_getl32 (temp + 4);
12084
                            offset_expr.X_add_number = bfd_getl32 (temp);
12085
                          }
12086
                        else
12087
                          {
12088
                            imm_expr.X_add_number = bfd_getb32 (temp);
12089
                            offset_expr.X_add_number = bfd_getb32 (temp + 4);
12090
                          }
12091
                        if (offset_expr.X_add_number == 0)
12092
                          offset_expr.X_op = O_absent;
12093
                      }
12094
                    else if (sizeof (imm_expr.X_add_number) > 4)
12095
                      {
12096
                        imm_expr.X_op = O_constant;
12097
                        if (!target_big_endian)
12098
                          imm_expr.X_add_number = bfd_getl64 (temp);
12099
                        else
12100
                          imm_expr.X_add_number = bfd_getb64 (temp);
12101
                      }
12102
                    else
12103
                      {
12104
                        imm_expr.X_op = O_big;
12105
                        imm_expr.X_add_number = 4;
12106
                        if (!target_big_endian)
12107
                          {
12108
                            generic_bignum[0] = bfd_getl16 (temp);
12109
                            generic_bignum[1] = bfd_getl16 (temp + 2);
12110
                            generic_bignum[2] = bfd_getl16 (temp + 4);
12111
                            generic_bignum[3] = bfd_getl16 (temp + 6);
12112
                          }
12113
                        else
12114
                          {
12115
                            generic_bignum[0] = bfd_getb16 (temp + 6);
12116
                            generic_bignum[1] = bfd_getb16 (temp + 4);
12117
                            generic_bignum[2] = bfd_getb16 (temp + 2);
12118
                            generic_bignum[3] = bfd_getb16 (temp);
12119
                          }
12120
                      }
12121
                  }
12122
                else
12123
                  {
12124
                    const char *newname;
12125
                    segT new_seg;
12126
 
12127
                    /* Switch to the right section.  */
12128
                    seg = now_seg;
12129
                    subseg = now_subseg;
12130
                    switch (*args)
12131
                      {
12132
                      default: /* unused default case avoids warnings.  */
12133
                      case 'L':
12134
                        newname = RDATA_SECTION_NAME;
12135
                        if (g_switch_value >= 8)
12136
                          newname = ".lit8";
12137
                        break;
12138
                      case 'F':
12139
                        newname = RDATA_SECTION_NAME;
12140
                        break;
12141
                      case 'l':
12142
                        gas_assert (g_switch_value >= 4);
12143
                        newname = ".lit4";
12144
                        break;
12145
                      }
12146
                    new_seg = subseg_new (newname, (subsegT) 0);
12147
                    if (IS_ELF)
12148
                      bfd_set_section_flags (stdoutput, new_seg,
12149
                                             (SEC_ALLOC
12150
                                              | SEC_LOAD
12151
                                              | SEC_READONLY
12152
                                              | SEC_DATA));
12153
                    frag_align (*args == 'l' ? 2 : 3, 0, 0);
12154
                    if (IS_ELF && strncmp (TARGET_OS, "elf", 3) != 0)
12155
                      record_alignment (new_seg, 4);
12156
                    else
12157
                      record_alignment (new_seg, *args == 'l' ? 2 : 3);
12158
                    if (seg == now_seg)
12159
                      as_bad (_("Can't use floating point insn in this section"));
12160
 
12161
                    /* Set the argument to the current address in the
12162
                       section.  */
12163
                    offset_expr.X_op = O_symbol;
12164
                    offset_expr.X_add_symbol = symbol_temp_new_now ();
12165
                    offset_expr.X_add_number = 0;
12166
 
12167
                    /* Put the floating point number into the section.  */
12168
                    p = frag_more ((int) length);
12169
                    memcpy (p, temp, length);
12170
 
12171
                    /* Switch back to the original section.  */
12172
                    subseg_set (seg, subseg);
12173
                  }
12174
              }
12175
              continue;
12176
 
12177
            case 'i':           /* 16-bit unsigned immediate.  */
12178
            case 'j':           /* 16-bit signed immediate.  */
12179
              *imm_reloc = BFD_RELOC_LO16;
12180
              if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
12181
                {
12182
                  int more;
12183
                  offsetT minval, maxval;
12184
 
12185 160 khays
                  more = (insn + 1 < past
12186 16 khays
                          && strcmp (insn->name, insn[1].name) == 0);
12187
 
12188
                  /* If the expression was written as an unsigned number,
12189
                     only treat it as signed if there are no more
12190
                     alternatives.  */
12191
                  if (more
12192
                      && *args == 'j'
12193
                      && sizeof (imm_expr.X_add_number) <= 4
12194
                      && imm_expr.X_op == O_constant
12195
                      && imm_expr.X_add_number < 0
12196
                      && imm_expr.X_unsigned
12197
                      && HAVE_64BIT_GPRS)
12198
                    break;
12199
 
12200
                  /* For compatibility with older assemblers, we accept
12201
                     0x8000-0xffff as signed 16-bit numbers when only
12202
                     signed numbers are allowed.  */
12203
                  if (*args == 'i')
12204
                    minval = 0, maxval = 0xffff;
12205
                  else if (more)
12206
                    minval = -0x8000, maxval = 0x7fff;
12207
                  else
12208
                    minval = -0x8000, maxval = 0xffff;
12209
 
12210
                  if (imm_expr.X_op != O_constant
12211
                      || imm_expr.X_add_number < minval
12212
                      || imm_expr.X_add_number > maxval)
12213
                    {
12214
                      if (more)
12215
                        break;
12216
                      if (imm_expr.X_op == O_constant
12217
                          || imm_expr.X_op == O_big)
12218
                        as_bad (_("Expression out of range"));
12219
                    }
12220
                }
12221
              s = expr_end;
12222
              continue;
12223
 
12224
            case 'o':           /* 16-bit offset.  */
12225
              offset_reloc[0] = BFD_RELOC_LO16;
12226
              offset_reloc[1] = BFD_RELOC_UNUSED;
12227
              offset_reloc[2] = BFD_RELOC_UNUSED;
12228
 
12229
              /* Check whether there is only a single bracketed expression
12230
                 left.  If so, it must be the base register and the
12231
                 constant must be zero.  */
12232
              if (*s == '(' && strchr (s + 1, '(') == 0)
12233
                {
12234
                  offset_expr.X_op = O_constant;
12235
                  offset_expr.X_add_number = 0;
12236
                  continue;
12237
                }
12238
 
12239
              /* If this value won't fit into a 16 bit offset, then go
12240
                 find a macro that will generate the 32 bit offset
12241
                 code pattern.  */
12242
              if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
12243
                  && (offset_expr.X_op != O_constant
12244
                      || offset_expr.X_add_number >= 0x8000
12245
                      || offset_expr.X_add_number < -0x8000))
12246
                break;
12247
 
12248
              s = expr_end;
12249
              continue;
12250
 
12251
            case 'p':           /* PC-relative offset.  */
12252
              *offset_reloc = BFD_RELOC_16_PCREL_S2;
12253
              my_getExpression (&offset_expr, s);
12254
              s = expr_end;
12255
              continue;
12256
 
12257
            case 'u':           /* Upper 16 bits.  */
12258
              if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
12259
                  && imm_expr.X_op == O_constant
12260
                  && (imm_expr.X_add_number < 0
12261
                      || imm_expr.X_add_number >= 0x10000))
12262
                as_bad (_("lui expression (%lu) not in range 0..65535"),
12263
                        (unsigned long) imm_expr.X_add_number);
12264
              s = expr_end;
12265
              continue;
12266
 
12267
            case 'a':           /* 26-bit address.  */
12268 160 khays
              *offset_reloc = BFD_RELOC_MIPS_JMP;
12269 16 khays
              my_getExpression (&offset_expr, s);
12270
              s = expr_end;
12271
              continue;
12272
 
12273
            case 'N':           /* 3-bit branch condition code.  */
12274
            case 'M':           /* 3-bit compare condition code.  */
12275
              rtype = RTYPE_CCC;
12276
              if (ip->insn_mo->pinfo & (FP_D | FP_S))
12277
                rtype |= RTYPE_FCC;
12278
              if (!reg_lookup (&s, rtype, &regno))
12279
                break;
12280
              if ((strcmp (str + strlen (str) - 3, ".ps") == 0
12281
                   || strcmp (str + strlen (str) - 5, "any2f") == 0
12282
                   || strcmp (str + strlen (str) - 5, "any2t") == 0)
12283
                  && (regno & 1) != 0)
12284
                as_warn (_("Condition code register should be even for %s, "
12285
                           "was %d"),
12286
                         str, regno);
12287
              if ((strcmp (str + strlen (str) - 5, "any4f") == 0
12288
                   || strcmp (str + strlen (str) - 5, "any4t") == 0)
12289
                  && (regno & 3) != 0)
12290
                as_warn (_("Condition code register should be 0 or 4 for %s, "
12291
                           "was %d"),
12292
                         str, regno);
12293
              if (*args == 'N')
12294 160 khays
                INSERT_OPERAND (mips_opts.micromips, BCC, *ip, regno);
12295 16 khays
              else
12296 160 khays
                INSERT_OPERAND (mips_opts.micromips, CCC, *ip, regno);
12297 16 khays
              continue;
12298
 
12299
            case 'H':
12300
              if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
12301
                s += 2;
12302
              if (ISDIGIT (*s))
12303
                {
12304
                  c = 0;
12305
                  do
12306
                    {
12307
                      c *= 10;
12308
                      c += *s - '0';
12309
                      ++s;
12310
                    }
12311
                  while (ISDIGIT (*s));
12312
                }
12313
              else
12314
                c = 8; /* Invalid sel value.  */
12315
 
12316
              if (c > 7)
12317
                as_bad (_("Invalid coprocessor sub-selection value (0-7)"));
12318 160 khays
              INSERT_OPERAND (mips_opts.micromips, SEL, *ip, c);
12319 16 khays
              continue;
12320
 
12321
            case 'e':
12322 160 khays
              gas_assert (!mips_opts.micromips);
12323 16 khays
              /* Must be at least one digit.  */
12324
              my_getExpression (&imm_expr, s);
12325
              check_absolute_expr (ip, &imm_expr);
12326
 
12327
              if ((unsigned long) imm_expr.X_add_number
12328
                  > (unsigned long) OP_MASK_VECBYTE)
12329
                {
12330
                  as_bad (_("bad byte vector index (%ld)"),
12331
                           (long) imm_expr.X_add_number);
12332
                  imm_expr.X_add_number = 0;
12333
                }
12334
 
12335 160 khays
              INSERT_OPERAND (0, VECBYTE, *ip, imm_expr.X_add_number);
12336 16 khays
              imm_expr.X_op = O_absent;
12337
              s = expr_end;
12338
              continue;
12339
 
12340
            case '%':
12341 160 khays
              gas_assert (!mips_opts.micromips);
12342 16 khays
              my_getExpression (&imm_expr, s);
12343
              check_absolute_expr (ip, &imm_expr);
12344
 
12345
              if ((unsigned long) imm_expr.X_add_number
12346
                  > (unsigned long) OP_MASK_VECALIGN)
12347
                {
12348
                  as_bad (_("bad byte vector index (%ld)"),
12349
                           (long) imm_expr.X_add_number);
12350
                  imm_expr.X_add_number = 0;
12351
                }
12352
 
12353 160 khays
              INSERT_OPERAND (0, VECALIGN, *ip, imm_expr.X_add_number);
12354 16 khays
              imm_expr.X_op = O_absent;
12355
              s = expr_end;
12356
              continue;
12357
 
12358 160 khays
            case 'm':           /* Opcode extension character.  */
12359
              gas_assert (mips_opts.micromips);
12360
              c = *++args;
12361
              switch (c)
12362
                {
12363
                case 'r':
12364
                  if (strncmp (s, "$pc", 3) == 0)
12365
                    {
12366
                      s += 3;
12367
                      continue;
12368
                    }
12369
                  break;
12370
 
12371
                case 'a':
12372
                case 'b':
12373
                case 'c':
12374
                case 'd':
12375
                case 'e':
12376
                case 'f':
12377
                case 'g':
12378
                case 'h':
12379
                case 'i':
12380
                case 'j':
12381
                case 'l':
12382
                case 'm':
12383
                case 'n':
12384
                case 'p':
12385
                case 'q':
12386
                case 's':
12387
                case 't':
12388
                case 'x':
12389
                case 'y':
12390
                case 'z':
12391
                  s_reset = s;
12392
                  ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
12393
                  if (regno == AT && mips_opts.at)
12394
                    {
12395
                      if (mips_opts.at == ATREG)
12396
                        as_warn (_("Used $at without \".set noat\""));
12397
                      else
12398
                        as_warn (_("Used $%u with \".set at=$%u\""),
12399
                                 regno, mips_opts.at);
12400
                    }
12401
                  if (!ok)
12402
                    {
12403
                      if (c == 'c')
12404
                        {
12405
                          gas_assert (args[1] == ',');
12406
                          regno = lastregno;
12407
                          ++args;
12408
                        }
12409
                      else if (c == 't')
12410
                        {
12411
                          gas_assert (args[1] == ',');
12412
                          ++args;
12413
                          continue;                     /* Nothing to do.  */
12414
                        }
12415
                      else
12416
                        break;
12417
                    }
12418
 
12419
                  if (c == 'j' && !strncmp (ip->insn_mo->name, "jalr", 4))
12420
                    {
12421
                      if (regno == lastregno)
12422
                        {
12423
                          insn_error
12424
                            = _("Source and destination must be different");
12425
                          continue;
12426
                        }
12427
                      if (regno == 31 && lastregno == 0xffffffff)
12428
                        {
12429
                          insn_error
12430
                            = _("A destination register must be supplied");
12431
                          continue;
12432
                        }
12433
                    }
12434
 
12435
                  if (*s == ' ')
12436
                    ++s;
12437
                  if (args[1] != *s)
12438
                    {
12439
                      if (c == 'e')
12440
                        {
12441
                          gas_assert (args[1] == ',');
12442
                          regno = lastregno;
12443
                          s = s_reset;
12444
                          ++args;
12445
                        }
12446
                      else if (c == 't')
12447
                        {
12448
                          gas_assert (args[1] == ',');
12449
                          s = s_reset;
12450
                          ++args;
12451
                          continue;                     /* Nothing to do.  */
12452
                        }
12453
                    }
12454
 
12455
                  /* Make sure regno is the same as lastregno.  */
12456
                  if (c == 't' && regno != lastregno)
12457
                    break;
12458
 
12459
                  /* Make sure regno is the same as destregno.  */
12460
                  if (c == 'x' && regno != destregno)
12461
                    break;
12462
 
12463
                  /* We need to save regno, before regno maps to the
12464
                     microMIPS register encoding.  */
12465
                  lastregno = regno;
12466
 
12467
                  if (c == 'f')
12468
                    destregno = regno;
12469
 
12470
                  switch (c)
12471
                    {
12472
                      case 'a':
12473
                        if (regno != GP)
12474
                          regno = ILLEGAL_REG;
12475
                        break;
12476
 
12477
                      case 'b':
12478
                        regno = mips32_to_micromips_reg_b_map[regno];
12479
                        break;
12480
 
12481
                      case 'c':
12482
                        regno = mips32_to_micromips_reg_c_map[regno];
12483
                        break;
12484
 
12485
                      case 'd':
12486
                        regno = mips32_to_micromips_reg_d_map[regno];
12487
                        break;
12488
 
12489
                      case 'e':
12490
                        regno = mips32_to_micromips_reg_e_map[regno];
12491
                        break;
12492
 
12493
                      case 'f':
12494
                        regno = mips32_to_micromips_reg_f_map[regno];
12495
                        break;
12496
 
12497
                      case 'g':
12498
                        regno = mips32_to_micromips_reg_g_map[regno];
12499
                        break;
12500
 
12501
                      case 'h':
12502
                        regno = mips32_to_micromips_reg_h_map[regno];
12503
                        break;
12504
 
12505
                      case 'i':
12506
                        switch (EXTRACT_OPERAND (1, MI, *ip))
12507
                          {
12508
                            case 4:
12509
                              if (regno == 21)
12510
                                regno = 3;
12511
                              else if (regno == 22)
12512
                                regno = 4;
12513
                              else if (regno == 5)
12514
                                regno = 5;
12515
                              else if (regno == 6)
12516
                                regno = 6;
12517
                              else if (regno == 7)
12518
                                regno = 7;
12519
                              else
12520
                                regno = ILLEGAL_REG;
12521
                              break;
12522
 
12523
                            case 5:
12524
                              if (regno == 6)
12525
                                regno = 0;
12526
                              else if (regno == 7)
12527
                                regno = 1;
12528
                              else
12529
                                regno = ILLEGAL_REG;
12530
                              break;
12531
 
12532
                            case 6:
12533
                              if (regno == 7)
12534
                                regno = 2;
12535
                              else
12536
                                regno = ILLEGAL_REG;
12537
                              break;
12538
 
12539
                            default:
12540
                              regno = ILLEGAL_REG;
12541
                              break;
12542
                          }
12543
                        break;
12544
 
12545
                      case 'l':
12546
                        regno = mips32_to_micromips_reg_l_map[regno];
12547
                        break;
12548
 
12549
                      case 'm':
12550
                        regno = mips32_to_micromips_reg_m_map[regno];
12551
                        break;
12552
 
12553
                      case 'n':
12554
                        regno = mips32_to_micromips_reg_n_map[regno];
12555
                        break;
12556
 
12557
                      case 'q':
12558
                        regno = mips32_to_micromips_reg_q_map[regno];
12559
                        break;
12560
 
12561
                      case 's':
12562
                        if (regno != SP)
12563
                          regno = ILLEGAL_REG;
12564
                        break;
12565
 
12566
                      case 'y':
12567
                        if (regno != 31)
12568
                          regno = ILLEGAL_REG;
12569
                        break;
12570
 
12571
                      case 'z':
12572
                        if (regno != ZERO)
12573
                          regno = ILLEGAL_REG;
12574
                        break;
12575
 
12576
                      case 'j': /* Do nothing.  */
12577
                      case 'p':
12578
                      case 't':
12579
                      case 'x':
12580
                        break;
12581
 
12582
                      default:
12583
                        internalError ();
12584
                    }
12585
 
12586
                  if (regno == ILLEGAL_REG)
12587
                    break;
12588
 
12589
                  switch (c)
12590
                    {
12591
                      case 'b':
12592
                        INSERT_OPERAND (1, MB, *ip, regno);
12593
                        break;
12594
 
12595
                      case 'c':
12596
                        INSERT_OPERAND (1, MC, *ip, regno);
12597
                        break;
12598
 
12599
                      case 'd':
12600
                        INSERT_OPERAND (1, MD, *ip, regno);
12601
                        break;
12602
 
12603
                      case 'e':
12604
                        INSERT_OPERAND (1, ME, *ip, regno);
12605
                        break;
12606
 
12607
                      case 'f':
12608
                        INSERT_OPERAND (1, MF, *ip, regno);
12609
                        break;
12610
 
12611
                      case 'g':
12612
                        INSERT_OPERAND (1, MG, *ip, regno);
12613
                        break;
12614
 
12615
                      case 'h':
12616
                        INSERT_OPERAND (1, MH, *ip, regno);
12617
                        break;
12618
 
12619
                      case 'i':
12620
                        INSERT_OPERAND (1, MI, *ip, regno);
12621
                        break;
12622
 
12623
                      case 'j':
12624
                        INSERT_OPERAND (1, MJ, *ip, regno);
12625
                        break;
12626
 
12627
                      case 'l':
12628
                        INSERT_OPERAND (1, ML, *ip, regno);
12629
                        break;
12630
 
12631
                      case 'm':
12632
                        INSERT_OPERAND (1, MM, *ip, regno);
12633
                        break;
12634
 
12635
                      case 'n':
12636
                        INSERT_OPERAND (1, MN, *ip, regno);
12637
                        break;
12638
 
12639
                      case 'p':
12640
                        INSERT_OPERAND (1, MP, *ip, regno);
12641
                        break;
12642
 
12643
                      case 'q':
12644
                        INSERT_OPERAND (1, MQ, *ip, regno);
12645
                        break;
12646
 
12647
                      case 'a': /* Do nothing.  */
12648
                      case 's': /* Do nothing.  */
12649
                      case 't': /* Do nothing.  */
12650
                      case 'x': /* Do nothing.  */
12651
                      case 'y': /* Do nothing.  */
12652
                      case 'z': /* Do nothing.  */
12653
                        break;
12654
 
12655
                      default:
12656
                        internalError ();
12657
                    }
12658
                  continue;
12659
 
12660
                case 'A':
12661
                  {
12662
                    bfd_reloc_code_real_type r[3];
12663
                    expressionS ep;
12664
                    int imm;
12665
 
12666
                    /* Check whether there is only a single bracketed
12667
                       expression left.  If so, it must be the base register
12668
                       and the constant must be zero.  */
12669
                    if (*s == '(' && strchr (s + 1, '(') == 0)
12670
                      {
12671
                        INSERT_OPERAND (1, IMMA, *ip, 0);
12672
                        continue;
12673
                      }
12674
 
12675
                    if (my_getSmallExpression (&ep, r, s) > 0
12676
                        || !expr_const_in_range (&ep, -64, 64, 2))
12677
                      break;
12678
 
12679
                    imm = ep.X_add_number >> 2;
12680
                    INSERT_OPERAND (1, IMMA, *ip, imm);
12681
                  }
12682
                  s = expr_end;
12683
                  continue;
12684
 
12685
                case 'B':
12686
                  {
12687
                    bfd_reloc_code_real_type r[3];
12688
                    expressionS ep;
12689
                    int imm;
12690
 
12691
                    if (my_getSmallExpression (&ep, r, s) > 0
12692
                        || ep.X_op != O_constant)
12693
                      break;
12694
 
12695
                    for (imm = 0; imm < 8; imm++)
12696
                      if (micromips_imm_b_map[imm] == ep.X_add_number)
12697
                        break;
12698
                    if (imm >= 8)
12699
                      break;
12700
 
12701
                    INSERT_OPERAND (1, IMMB, *ip, imm);
12702
                  }
12703
                  s = expr_end;
12704
                  continue;
12705
 
12706
                case 'C':
12707
                  {
12708
                    bfd_reloc_code_real_type r[3];
12709
                    expressionS ep;
12710
                    int imm;
12711
 
12712
                    if (my_getSmallExpression (&ep, r, s) > 0
12713
                        || ep.X_op != O_constant)
12714
                      break;
12715
 
12716
                    for (imm = 0; imm < 16; imm++)
12717
                      if (micromips_imm_c_map[imm] == ep.X_add_number)
12718
                        break;
12719
                    if (imm >= 16)
12720
                      break;
12721
 
12722
                    INSERT_OPERAND (1, IMMC, *ip, imm);
12723
                  }
12724
                  s = expr_end;
12725
                  continue;
12726
 
12727
                case 'D':       /* pc relative offset */
12728
                case 'E':       /* pc relative offset */
12729
                  my_getExpression (&offset_expr, s);
12730
                  if (offset_expr.X_op == O_register)
12731
                    break;
12732
 
12733
                  if (!forced_insn_length)
12734
                    *offset_reloc = (int) BFD_RELOC_UNUSED + c;
12735
                  else if (c == 'D')
12736
                    *offset_reloc = BFD_RELOC_MICROMIPS_10_PCREL_S1;
12737
                  else
12738
                    *offset_reloc = BFD_RELOC_MICROMIPS_7_PCREL_S1;
12739
                  s = expr_end;
12740
                  continue;
12741
 
12742
                case 'F':
12743
                  {
12744
                    bfd_reloc_code_real_type r[3];
12745
                    expressionS ep;
12746
                    int imm;
12747
 
12748
                    if (my_getSmallExpression (&ep, r, s) > 0
12749
                        || !expr_const_in_range (&ep, 0, 16, 0))
12750
                      break;
12751
 
12752
                    imm = ep.X_add_number;
12753
                    INSERT_OPERAND (1, IMMF, *ip, imm);
12754
                  }
12755
                  s = expr_end;
12756
                  continue;
12757
 
12758
                case 'G':
12759
                  {
12760
                    bfd_reloc_code_real_type r[3];
12761
                    expressionS ep;
12762
                    int imm;
12763
 
12764
                    /* Check whether there is only a single bracketed
12765
                       expression left.  If so, it must be the base register
12766
                       and the constant must be zero.  */
12767
                    if (*s == '(' && strchr (s + 1, '(') == 0)
12768
                      {
12769
                        INSERT_OPERAND (1, IMMG, *ip, 0);
12770
                        continue;
12771
                      }
12772
 
12773
                    if (my_getSmallExpression (&ep, r, s) > 0
12774
                        || !expr_const_in_range (&ep, -1, 15, 0))
12775
                      break;
12776
 
12777
                    imm = ep.X_add_number & 15;
12778
                    INSERT_OPERAND (1, IMMG, *ip, imm);
12779
                  }
12780
                  s = expr_end;
12781
                  continue;
12782
 
12783
                case 'H':
12784
                  {
12785
                    bfd_reloc_code_real_type r[3];
12786
                    expressionS ep;
12787
                    int imm;
12788
 
12789
                    /* Check whether there is only a single bracketed
12790
                       expression left.  If so, it must be the base register
12791
                       and the constant must be zero.  */
12792
                    if (*s == '(' && strchr (s + 1, '(') == 0)
12793
                      {
12794
                        INSERT_OPERAND (1, IMMH, *ip, 0);
12795
                        continue;
12796
                      }
12797
 
12798
                    if (my_getSmallExpression (&ep, r, s) > 0
12799
                        || !expr_const_in_range (&ep, 0, 16, 1))
12800
                      break;
12801
 
12802
                    imm = ep.X_add_number >> 1;
12803
                    INSERT_OPERAND (1, IMMH, *ip, imm);
12804
                  }
12805
                  s = expr_end;
12806
                  continue;
12807
 
12808
                case 'I':
12809
                  {
12810
                    bfd_reloc_code_real_type r[3];
12811
                    expressionS ep;
12812
                    int imm;
12813
 
12814
                    if (my_getSmallExpression (&ep, r, s) > 0
12815
                        || !expr_const_in_range (&ep, -1, 127, 0))
12816
                      break;
12817
 
12818
                    imm = ep.X_add_number & 127;
12819
                    INSERT_OPERAND (1, IMMI, *ip, imm);
12820
                  }
12821
                  s = expr_end;
12822
                  continue;
12823
 
12824
                case 'J':
12825
                  {
12826
                    bfd_reloc_code_real_type r[3];
12827
                    expressionS ep;
12828
                    int imm;
12829
 
12830
                    /* Check whether there is only a single bracketed
12831
                       expression left.  If so, it must be the base register
12832
                       and the constant must be zero.  */
12833
                    if (*s == '(' && strchr (s + 1, '(') == 0)
12834
                      {
12835
                        INSERT_OPERAND (1, IMMJ, *ip, 0);
12836
                        continue;
12837
                      }
12838
 
12839
                    if (my_getSmallExpression (&ep, r, s) > 0
12840
                        || !expr_const_in_range (&ep, 0, 16, 2))
12841
                      break;
12842
 
12843
                    imm = ep.X_add_number >> 2;
12844
                    INSERT_OPERAND (1, IMMJ, *ip, imm);
12845
                  }
12846
                  s = expr_end;
12847
                  continue;
12848
 
12849
                case 'L':
12850
                  {
12851
                    bfd_reloc_code_real_type r[3];
12852
                    expressionS ep;
12853
                    int imm;
12854
 
12855
                    /* Check whether there is only a single bracketed
12856
                       expression left.  If so, it must be the base register
12857
                       and the constant must be zero.  */
12858
                    if (*s == '(' && strchr (s + 1, '(') == 0)
12859
                      {
12860
                        INSERT_OPERAND (1, IMML, *ip, 0);
12861
                        continue;
12862
                      }
12863
 
12864
                    if (my_getSmallExpression (&ep, r, s) > 0
12865
                        || !expr_const_in_range (&ep, 0, 16, 0))
12866
                      break;
12867
 
12868
                    imm = ep.X_add_number;
12869
                    INSERT_OPERAND (1, IMML, *ip, imm);
12870
                  }
12871
                  s = expr_end;
12872
                  continue;
12873
 
12874
                case 'M':
12875
                  {
12876
                    bfd_reloc_code_real_type r[3];
12877
                    expressionS ep;
12878
                    int imm;
12879
 
12880
                    if (my_getSmallExpression (&ep, r, s) > 0
12881
                        || !expr_const_in_range (&ep, 1, 9, 0))
12882
                      break;
12883
 
12884
                    imm = ep.X_add_number & 7;
12885
                    INSERT_OPERAND (1, IMMM, *ip, imm);
12886
                  }
12887
                  s = expr_end;
12888
                  continue;
12889
 
12890
                case 'N':       /* Register list for lwm and swm.  */
12891
                  {
12892
                    /* A comma-separated list of registers and/or
12893
                       dash-separated contiguous ranges including
12894
                       both ra and a set of one or more registers
12895
                       starting at s0 up to s3 which have to be
12896
                       consecutive, e.g.:
12897
 
12898
                       s0, ra
12899
                       s0, s1, ra, s2, s3
12900
                       s0-s2, ra
12901
 
12902
                       and any permutations of these.  */
12903
                    unsigned int reglist;
12904
                    int imm;
12905
 
12906
                    if (!reglist_lookup (&s, RTYPE_NUM | RTYPE_GP, &reglist))
12907
                      break;
12908
 
12909
                    if ((reglist & 0xfff1ffff) != 0x80010000)
12910
                      break;
12911
 
12912
                    reglist = (reglist >> 17) & 7;
12913
                    reglist += 1;
12914
                    if ((reglist & -reglist) != reglist)
12915
                      break;
12916
 
12917
                    imm = ffs (reglist) - 1;
12918
                    INSERT_OPERAND (1, IMMN, *ip, imm);
12919
                  }
12920
                  continue;
12921
 
12922
                case 'O':       /* sdbbp 4-bit code.  */
12923
                  {
12924
                    bfd_reloc_code_real_type r[3];
12925
                    expressionS ep;
12926
                    int imm;
12927
 
12928
                    if (my_getSmallExpression (&ep, r, s) > 0
12929
                        || !expr_const_in_range (&ep, 0, 16, 0))
12930
                      break;
12931
 
12932
                    imm = ep.X_add_number;
12933
                    INSERT_OPERAND (1, IMMO, *ip, imm);
12934
                  }
12935
                  s = expr_end;
12936
                  continue;
12937
 
12938
                case 'P':
12939
                  {
12940
                    bfd_reloc_code_real_type r[3];
12941
                    expressionS ep;
12942
                    int imm;
12943
 
12944
                    if (my_getSmallExpression (&ep, r, s) > 0
12945
                        || !expr_const_in_range (&ep, 0, 32, 2))
12946
                      break;
12947
 
12948
                    imm = ep.X_add_number >> 2;
12949
                    INSERT_OPERAND (1, IMMP, *ip, imm);
12950
                  }
12951
                  s = expr_end;
12952
                  continue;
12953
 
12954
                case 'Q':
12955
                  {
12956
                    bfd_reloc_code_real_type r[3];
12957
                    expressionS ep;
12958
                    int imm;
12959
 
12960
                    if (my_getSmallExpression (&ep, r, s) > 0
12961
                        || !expr_const_in_range (&ep, -0x400000, 0x400000, 2))
12962
                      break;
12963
 
12964
                    imm = ep.X_add_number >> 2;
12965
                    INSERT_OPERAND (1, IMMQ, *ip, imm);
12966
                  }
12967
                  s = expr_end;
12968
                  continue;
12969
 
12970
                case 'U':
12971
                  {
12972
                    bfd_reloc_code_real_type r[3];
12973
                    expressionS ep;
12974
                    int imm;
12975
 
12976
                    /* Check whether there is only a single bracketed
12977
                       expression left.  If so, it must be the base register
12978
                       and the constant must be zero.  */
12979
                    if (*s == '(' && strchr (s + 1, '(') == 0)
12980
                      {
12981
                        INSERT_OPERAND (1, IMMU, *ip, 0);
12982
                        continue;
12983
                      }
12984
 
12985
                    if (my_getSmallExpression (&ep, r, s) > 0
12986
                        || !expr_const_in_range (&ep, 0, 32, 2))
12987
                      break;
12988
 
12989
                    imm = ep.X_add_number >> 2;
12990
                    INSERT_OPERAND (1, IMMU, *ip, imm);
12991
                  }
12992
                  s = expr_end;
12993
                  continue;
12994
 
12995
                case 'W':
12996
                  {
12997
                    bfd_reloc_code_real_type r[3];
12998
                    expressionS ep;
12999
                    int imm;
13000
 
13001
                    if (my_getSmallExpression (&ep, r, s) > 0
13002
                        || !expr_const_in_range (&ep, 0, 64, 2))
13003
                      break;
13004
 
13005
                    imm = ep.X_add_number >> 2;
13006
                    INSERT_OPERAND (1, IMMW, *ip, imm);
13007
                  }
13008
                  s = expr_end;
13009
                  continue;
13010
 
13011
                case 'X':
13012
                  {
13013
                    bfd_reloc_code_real_type r[3];
13014
                    expressionS ep;
13015
                    int imm;
13016
 
13017
                    if (my_getSmallExpression (&ep, r, s) > 0
13018
                        || !expr_const_in_range (&ep, -8, 8, 0))
13019
                      break;
13020
 
13021
                    imm = ep.X_add_number;
13022
                    INSERT_OPERAND (1, IMMX, *ip, imm);
13023
                  }
13024
                  s = expr_end;
13025
                  continue;
13026
 
13027
                case 'Y':
13028
                  {
13029
                    bfd_reloc_code_real_type r[3];
13030
                    expressionS ep;
13031
                    int imm;
13032
 
13033
                    if (my_getSmallExpression (&ep, r, s) > 0
13034
                        || expr_const_in_range (&ep, -2, 2, 2)
13035
                        || !expr_const_in_range (&ep, -258, 258, 2))
13036
                      break;
13037
 
13038
                    imm = ep.X_add_number >> 2;
13039
                    imm = ((imm >> 1) & ~0xff) | (imm & 0xff);
13040
                    INSERT_OPERAND (1, IMMY, *ip, imm);
13041
                  }
13042
                  s = expr_end;
13043
                  continue;
13044
 
13045
                case 'Z':
13046
                  {
13047
                    bfd_reloc_code_real_type r[3];
13048
                    expressionS ep;
13049
 
13050
                    if (my_getSmallExpression (&ep, r, s) > 0
13051
                        || !expr_const_in_range (&ep, 0, 1, 0))
13052
                      break;
13053
                  }
13054
                  s = expr_end;
13055
                  continue;
13056
 
13057
                default:
13058
                  as_bad (_("Internal error: bad microMIPS opcode "
13059
                            "(unknown extension operand type `m%c'): %s %s"),
13060
                          *args, insn->name, insn->args);
13061
                  /* Further processing is fruitless.  */
13062
                  return;
13063
                }
13064
              break;
13065
 
13066
            case 'n':           /* Register list for 32-bit lwm and swm.  */
13067
              gas_assert (mips_opts.micromips);
13068
              {
13069
                /* A comma-separated list of registers and/or
13070
                   dash-separated contiguous ranges including
13071
                   at least one of ra and a set of one or more
13072
                   registers starting at s0 up to s7 and then
13073
                   s8 which have to be consecutive, e.g.:
13074
 
13075
                   ra
13076
                   s0
13077
                   ra, s0, s1, s2
13078
                   s0-s8
13079
                   s0-s5, ra
13080
 
13081
                   and any permutations of these.  */
13082
                unsigned int reglist;
13083
                int imm;
13084
                int ra;
13085
 
13086
                if (!reglist_lookup (&s, RTYPE_NUM | RTYPE_GP, &reglist))
13087
                  break;
13088
 
13089
                if ((reglist & 0x3f00ffff) != 0)
13090
                  break;
13091
 
13092
                ra = (reglist >> 27) & 0x10;
13093
                reglist = ((reglist >> 22) & 0x100) | ((reglist >> 16) & 0xff);
13094
                reglist += 1;
13095
                if ((reglist & -reglist) != reglist)
13096
                  break;
13097
 
13098
                imm = (ffs (reglist) - 1) | ra;
13099
                INSERT_OPERAND (1, RT, *ip, imm);
13100
                imm_expr.X_op = O_absent;
13101
              }
13102
              continue;
13103
 
13104
            case '|':           /* 4-bit trap code.  */
13105
              gas_assert (mips_opts.micromips);
13106
              my_getExpression (&imm_expr, s);
13107
              check_absolute_expr (ip, &imm_expr);
13108
              if ((unsigned long) imm_expr.X_add_number
13109
                  > MICROMIPSOP_MASK_TRAP)
13110
                as_bad (_("Trap code (%lu) for %s not in 0..15 range"),
13111
                        (unsigned long) imm_expr.X_add_number,
13112
                        ip->insn_mo->name);
13113
              INSERT_OPERAND (1, TRAP, *ip, imm_expr.X_add_number);
13114
              imm_expr.X_op = O_absent;
13115
              s = expr_end;
13116
              continue;
13117
 
13118 16 khays
            default:
13119
              as_bad (_("Bad char = '%c'\n"), *args);
13120
              internalError ();
13121
            }
13122
          break;
13123
        }
13124
      /* Args don't match.  */
13125 160 khays
      s = argsStart;
13126
      insn_error = _("Illegal operands");
13127
      if (insn + 1 < past && !strcmp (insn->name, insn[1].name))
13128 16 khays
        {
13129
          ++insn;
13130
          continue;
13131
        }
13132 160 khays
      else if (wrong_delay_slot_insns && need_delay_slot_ok)
13133
        {
13134
          gas_assert (firstinsn);
13135
          need_delay_slot_ok = FALSE;
13136
          past = insn + 1;
13137
          insn = firstinsn;
13138
          continue;
13139
        }
13140 16 khays
      return;
13141
    }
13142
}
13143
 
13144
#define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
13145
 
13146
/* This routine assembles an instruction into its binary format when
13147
   assembling for the mips16.  As a side effect, it sets one of the
13148 160 khays
   global variables imm_reloc or offset_reloc to the type of relocation
13149
   to do if one of the operands is an address expression.  It also sets
13150
   forced_insn_length to the resulting instruction size in bytes if the
13151
   user explicitly requested a small or extended instruction.  */
13152 16 khays
 
13153
static void
13154
mips16_ip (char *str, struct mips_cl_insn *ip)
13155
{
13156
  char *s;
13157
  const char *args;
13158
  struct mips_opcode *insn;
13159
  char *argsstart;
13160
  unsigned int regno;
13161
  unsigned int lastregno = 0;
13162
  char *s_reset;
13163
  size_t i;
13164
 
13165
  insn_error = NULL;
13166
 
13167 160 khays
  forced_insn_length = 0;
13168 16 khays
 
13169
  for (s = str; ISLOWER (*s); ++s)
13170
    ;
13171
  switch (*s)
13172
    {
13173
    case '\0':
13174
      break;
13175
 
13176
    case ' ':
13177
      *s++ = '\0';
13178
      break;
13179
 
13180
    case '.':
13181
      if (s[1] == 't' && s[2] == ' ')
13182
        {
13183
          *s = '\0';
13184 160 khays
          forced_insn_length = 2;
13185 16 khays
          s += 3;
13186
          break;
13187
        }
13188
      else if (s[1] == 'e' && s[2] == ' ')
13189
        {
13190
          *s = '\0';
13191 160 khays
          forced_insn_length = 4;
13192 16 khays
          s += 3;
13193
          break;
13194
        }
13195
      /* Fall through.  */
13196
    default:
13197
      insn_error = _("unknown opcode");
13198
      return;
13199
    }
13200
 
13201 160 khays
  if (mips_opts.noautoextend && !forced_insn_length)
13202
    forced_insn_length = 2;
13203 16 khays
 
13204
  if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
13205
    {
13206
      insn_error = _("unrecognized opcode");
13207
      return;
13208
    }
13209
 
13210
  argsstart = s;
13211
  for (;;)
13212
    {
13213
      bfd_boolean ok;
13214
 
13215
      gas_assert (strcmp (insn->name, str) == 0);
13216
 
13217
      ok = is_opcode_valid_16 (insn);
13218
      if (! ok)
13219
        {
13220
          if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
13221
              && strcmp (insn->name, insn[1].name) == 0)
13222
            {
13223
              ++insn;
13224
              continue;
13225
            }
13226
          else
13227
            {
13228
              if (!insn_error)
13229
                {
13230
                  static char buf[100];
13231
                  sprintf (buf,
13232
                           _("opcode not supported on this processor: %s (%s)"),
13233
                           mips_cpu_info_from_arch (mips_opts.arch)->name,
13234
                           mips_cpu_info_from_isa (mips_opts.isa)->name);
13235
                  insn_error = buf;
13236
                }
13237
              return;
13238
            }
13239
        }
13240
 
13241
      create_insn (ip, insn);
13242
      imm_expr.X_op = O_absent;
13243
      imm_reloc[0] = BFD_RELOC_UNUSED;
13244
      imm_reloc[1] = BFD_RELOC_UNUSED;
13245
      imm_reloc[2] = BFD_RELOC_UNUSED;
13246
      imm2_expr.X_op = O_absent;
13247
      offset_expr.X_op = O_absent;
13248
      offset_reloc[0] = BFD_RELOC_UNUSED;
13249
      offset_reloc[1] = BFD_RELOC_UNUSED;
13250
      offset_reloc[2] = BFD_RELOC_UNUSED;
13251
      for (args = insn->args; 1; ++args)
13252
        {
13253
          int c;
13254
 
13255
          if (*s == ' ')
13256
            ++s;
13257
 
13258
          /* In this switch statement we call break if we did not find
13259
             a match, continue if we did find a match, or return if we
13260
             are done.  */
13261
 
13262
          c = *args;
13263
          switch (c)
13264
            {
13265
            case '\0':
13266
              if (*s == '\0')
13267
                {
13268
                  /* Stuff the immediate value in now, if we can.  */
13269
                  if (imm_expr.X_op == O_constant
13270
                      && *imm_reloc > BFD_RELOC_UNUSED
13271
                      && *imm_reloc != BFD_RELOC_MIPS16_GOT16
13272
                      && *imm_reloc != BFD_RELOC_MIPS16_CALL16
13273
                      && insn->pinfo != INSN_MACRO)
13274
                    {
13275
                      valueT tmp;
13276
 
13277
                      switch (*offset_reloc)
13278
                        {
13279
                          case BFD_RELOC_MIPS16_HI16_S:
13280
                            tmp = (imm_expr.X_add_number + 0x8000) >> 16;
13281
                            break;
13282
 
13283
                          case BFD_RELOC_MIPS16_HI16:
13284
                            tmp = imm_expr.X_add_number >> 16;
13285
                            break;
13286
 
13287
                          case BFD_RELOC_MIPS16_LO16:
13288
                            tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
13289
                                  - 0x8000;
13290
                            break;
13291
 
13292
                          case BFD_RELOC_UNUSED:
13293
                            tmp = imm_expr.X_add_number;
13294
                            break;
13295
 
13296
                          default:
13297
                            internalError ();
13298
                        }
13299
                      *offset_reloc = BFD_RELOC_UNUSED;
13300
 
13301
                      mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
13302 160 khays
                                    tmp, TRUE, forced_insn_length == 2,
13303
                                    forced_insn_length == 4, &ip->insn_opcode,
13304 16 khays
                                    &ip->use_extend, &ip->extend);
13305
                      imm_expr.X_op = O_absent;
13306
                      *imm_reloc = BFD_RELOC_UNUSED;
13307
                    }
13308
 
13309
                  return;
13310
                }
13311
              break;
13312
 
13313
            case ',':
13314
              if (*s++ == c)
13315
                continue;
13316
              s--;
13317
              switch (*++args)
13318
                {
13319
                case 'v':
13320
                  MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
13321
                  continue;
13322
                case 'w':
13323
                  MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
13324
                  continue;
13325
                }
13326
              break;
13327
 
13328
            case '(':
13329
            case ')':
13330
              if (*s++ == c)
13331
                continue;
13332
              break;
13333
 
13334
            case 'v':
13335
            case 'w':
13336
              if (s[0] != '$')
13337
                {
13338
                  if (c == 'v')
13339
                    MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
13340
                  else
13341
                    MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
13342
                  ++args;
13343
                  continue;
13344
                }
13345
              /* Fall through.  */
13346
            case 'x':
13347
            case 'y':
13348
            case 'z':
13349
            case 'Z':
13350
            case '0':
13351
            case 'S':
13352
            case 'R':
13353
            case 'X':
13354
            case 'Y':
13355
              s_reset = s;
13356
              if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
13357
                {
13358
                  if (c == 'v' || c == 'w')
13359
                    {
13360
                      if (c == 'v')
13361
                        MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
13362
                      else
13363
                        MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
13364
                      ++args;
13365
                      continue;
13366
                    }
13367
                  break;
13368
                }
13369
 
13370
              if (*s == ' ')
13371
                ++s;
13372
              if (args[1] != *s)
13373
                {
13374
                  if (c == 'v' || c == 'w')
13375
                    {
13376
                      regno = mips16_to_32_reg_map[lastregno];
13377
                      s = s_reset;
13378
                      ++args;
13379
                    }
13380
                }
13381
 
13382
              switch (c)
13383
                {
13384
                case 'x':
13385
                case 'y':
13386
                case 'z':
13387
                case 'v':
13388
                case 'w':
13389
                case 'Z':
13390
                  regno = mips32_to_16_reg_map[regno];
13391
                  break;
13392
 
13393
                case '0':
13394
                  if (regno != 0)
13395
                    regno = ILLEGAL_REG;
13396
                  break;
13397
 
13398
                case 'S':
13399
                  if (regno != SP)
13400
                    regno = ILLEGAL_REG;
13401
                  break;
13402
 
13403
                case 'R':
13404
                  if (regno != RA)
13405
                    regno = ILLEGAL_REG;
13406
                  break;
13407
 
13408
                case 'X':
13409
                case 'Y':
13410
                  if (regno == AT && mips_opts.at)
13411
                    {
13412
                      if (mips_opts.at == ATREG)
13413
                        as_warn (_("used $at without \".set noat\""));
13414
                      else
13415
                        as_warn (_("used $%u with \".set at=$%u\""),
13416
                                 regno, mips_opts.at);
13417
                    }
13418
                  break;
13419
 
13420
                default:
13421
                  internalError ();
13422
                }
13423
 
13424
              if (regno == ILLEGAL_REG)
13425
                break;
13426
 
13427
              switch (c)
13428
                {
13429
                case 'x':
13430
                case 'v':
13431
                  MIPS16_INSERT_OPERAND (RX, *ip, regno);
13432
                  break;
13433
                case 'y':
13434
                case 'w':
13435
                  MIPS16_INSERT_OPERAND (RY, *ip, regno);
13436
                  break;
13437
                case 'z':
13438
                  MIPS16_INSERT_OPERAND (RZ, *ip, regno);
13439
                  break;
13440
                case 'Z':
13441
                  MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
13442
                case '0':
13443
                case 'S':
13444
                case 'R':
13445
                  break;
13446
                case 'X':
13447
                  MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
13448
                  break;
13449
                case 'Y':
13450
                  regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
13451
                  MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
13452
                  break;
13453
                default:
13454
                  internalError ();
13455
                }
13456
 
13457
              lastregno = regno;
13458
              continue;
13459
 
13460
            case 'P':
13461
              if (strncmp (s, "$pc", 3) == 0)
13462
                {
13463
                  s += 3;
13464
                  continue;
13465
                }
13466
              break;
13467
 
13468
            case '5':
13469
            case 'H':
13470
            case 'W':
13471
            case 'D':
13472
            case 'j':
13473
            case 'V':
13474
            case 'C':
13475
            case 'U':
13476
            case 'k':
13477
            case 'K':
13478
              i = my_getSmallExpression (&imm_expr, imm_reloc, s);
13479
              if (i > 0)
13480
                {
13481
                  if (imm_expr.X_op != O_constant)
13482
                    {
13483 160 khays
                      forced_insn_length = 4;
13484 16 khays
                      ip->use_extend = TRUE;
13485
                      ip->extend = 0;
13486
                    }
13487
                  else
13488
                    {
13489
                      /* We need to relax this instruction.  */
13490
                      *offset_reloc = *imm_reloc;
13491
                      *imm_reloc = (int) BFD_RELOC_UNUSED + c;
13492
                    }
13493
                  s = expr_end;
13494
                  continue;
13495
                }
13496
              *imm_reloc = BFD_RELOC_UNUSED;
13497
              /* Fall through.  */
13498
            case '<':
13499
            case '>':
13500
            case '[':
13501
            case ']':
13502
            case '4':
13503
            case '8':
13504
              my_getExpression (&imm_expr, s);
13505
              if (imm_expr.X_op == O_register)
13506
                {
13507
                  /* What we thought was an expression turned out to
13508
                     be a register.  */
13509
 
13510
                  if (s[0] == '(' && args[1] == '(')
13511
                    {
13512
                      /* It looks like the expression was omitted
13513
                         before a register indirection, which means
13514
                         that the expression is implicitly zero.  We
13515
                         still set up imm_expr, so that we handle
13516
                         explicit extensions correctly.  */
13517
                      imm_expr.X_op = O_constant;
13518
                      imm_expr.X_add_number = 0;
13519
                      *imm_reloc = (int) BFD_RELOC_UNUSED + c;
13520
                      continue;
13521
                    }
13522
 
13523
                  break;
13524
                }
13525
 
13526
              /* We need to relax this instruction.  */
13527
              *imm_reloc = (int) BFD_RELOC_UNUSED + c;
13528
              s = expr_end;
13529
              continue;
13530
 
13531
            case 'p':
13532
            case 'q':
13533
            case 'A':
13534
            case 'B':
13535
            case 'E':
13536
              /* We use offset_reloc rather than imm_reloc for the PC
13537
                 relative operands.  This lets macros with both
13538
                 immediate and address operands work correctly.  */
13539
              my_getExpression (&offset_expr, s);
13540
 
13541
              if (offset_expr.X_op == O_register)
13542
                break;
13543
 
13544
              /* We need to relax this instruction.  */
13545
              *offset_reloc = (int) BFD_RELOC_UNUSED + c;
13546
              s = expr_end;
13547
              continue;
13548
 
13549
            case '6':           /* break code */
13550
              my_getExpression (&imm_expr, s);
13551
              check_absolute_expr (ip, &imm_expr);
13552
              if ((unsigned long) imm_expr.X_add_number > 63)
13553
                as_warn (_("Invalid value for `%s' (%lu)"),
13554
                         ip->insn_mo->name,
13555
                         (unsigned long) imm_expr.X_add_number);
13556
              MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
13557
              imm_expr.X_op = O_absent;
13558
              s = expr_end;
13559
              continue;
13560
 
13561
            case 'a':           /* 26 bit address */
13562
              my_getExpression (&offset_expr, s);
13563
              s = expr_end;
13564
              *offset_reloc = BFD_RELOC_MIPS16_JMP;
13565
              ip->insn_opcode <<= 16;
13566
              continue;
13567
 
13568
            case 'l':           /* register list for entry macro */
13569
            case 'L':           /* register list for exit macro */
13570
              {
13571
                int mask;
13572
 
13573
                if (c == 'l')
13574
                  mask = 0;
13575
                else
13576
                  mask = 7 << 3;
13577
                while (*s != '\0')
13578
                  {
13579
                    unsigned int freg, reg1, reg2;
13580
 
13581
                    while (*s == ' ' || *s == ',')
13582
                      ++s;
13583
                    if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
13584
                      freg = 0;
13585
                    else if (reg_lookup (&s, RTYPE_FPU, &reg1))
13586
                      freg = 1;
13587
                    else
13588
                      {
13589
                        as_bad (_("can't parse register list"));
13590
                        break;
13591
                      }
13592
                    if (*s == ' ')
13593
                      ++s;
13594
                    if (*s != '-')
13595
                      reg2 = reg1;
13596
                    else
13597
                      {
13598
                        ++s;
13599
                        if (!reg_lookup (&s, freg ? RTYPE_FPU
13600
                                         : (RTYPE_GP | RTYPE_NUM), &reg2))
13601
                          {
13602
                            as_bad (_("invalid register list"));
13603
                            break;
13604
                          }
13605
                      }
13606
                    if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
13607
                      {
13608
                        mask &= ~ (7 << 3);
13609
                        mask |= 5 << 3;
13610
                      }
13611
                    else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
13612
                      {
13613
                        mask &= ~ (7 << 3);
13614
                        mask |= 6 << 3;
13615
                      }
13616
                    else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
13617
                      mask |= (reg2 - 3) << 3;
13618
                    else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
13619
                      mask |= (reg2 - 15) << 1;
13620
                    else if (reg1 == RA && reg2 == RA)
13621
                      mask |= 1;
13622
                    else
13623
                      {
13624
                        as_bad (_("invalid register list"));
13625
                        break;
13626
                      }
13627
                  }
13628
                /* The mask is filled in in the opcode table for the
13629
                   benefit of the disassembler.  We remove it before
13630
                   applying the actual mask.  */
13631
                ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
13632
                ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
13633
              }
13634
            continue;
13635
 
13636
            case 'm':           /* Register list for save insn.  */
13637
            case 'M':           /* Register list for restore insn.  */
13638
              {
13639
                int opcode = 0;
13640
                int framesz = 0, seen_framesz = 0;
13641
                int nargs = 0, statics = 0, sregs = 0;
13642
 
13643
                while (*s != '\0')
13644
                  {
13645
                    unsigned int reg1, reg2;
13646
 
13647
                    SKIP_SPACE_TABS (s);
13648
                    while (*s == ',')
13649
                      ++s;
13650
                    SKIP_SPACE_TABS (s);
13651
 
13652
                    my_getExpression (&imm_expr, s);
13653
                    if (imm_expr.X_op == O_constant)
13654
                      {
13655
                        /* Handle the frame size.  */
13656
                        if (seen_framesz)
13657
                          {
13658
                            as_bad (_("more than one frame size in list"));
13659
                            break;
13660
                          }
13661
                        seen_framesz = 1;
13662
                        framesz = imm_expr.X_add_number;
13663
                        imm_expr.X_op = O_absent;
13664
                        s = expr_end;
13665
                        continue;
13666
                      }
13667
 
13668
                    if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
13669
                      {
13670
                        as_bad (_("can't parse register list"));
13671
                        break;
13672
                      }
13673
 
13674
                    while (*s == ' ')
13675
                      ++s;
13676
 
13677
                    if (*s != '-')
13678
                      reg2 = reg1;
13679
                    else
13680
                      {
13681
                        ++s;
13682
                        if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
13683
                            || reg2 < reg1)
13684
                          {
13685
                            as_bad (_("can't parse register list"));
13686
                            break;
13687
                          }
13688
                      }
13689
 
13690
                    while (reg1 <= reg2)
13691
                      {
13692
                        if (reg1 >= 4 && reg1 <= 7)
13693
                          {
13694
                            if (!seen_framesz)
13695
                                /* args $a0-$a3 */
13696
                                nargs |= 1 << (reg1 - 4);
13697
                            else
13698
                                /* statics $a0-$a3 */
13699
                                statics |= 1 << (reg1 - 4);
13700
                          }
13701
                        else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
13702
                          {
13703
                            /* $s0-$s8 */
13704
                            sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
13705
                          }
13706
                        else if (reg1 == 31)
13707
                          {
13708
                            /* Add $ra to insn.  */
13709
                            opcode |= 0x40;
13710
                          }
13711
                        else
13712
                          {
13713
                            as_bad (_("unexpected register in list"));
13714
                            break;
13715
                          }
13716
                        if (++reg1 == 24)
13717
                          reg1 = 30;
13718
                      }
13719
                  }
13720
 
13721
                /* Encode args/statics combination.  */
13722
                if (nargs & statics)
13723
                  as_bad (_("arg/static registers overlap"));
13724
                else if (nargs == 0xf)
13725
                  /* All $a0-$a3 are args.  */
13726
                  opcode |= MIPS16_ALL_ARGS << 16;
13727
                else if (statics == 0xf)
13728
                  /* All $a0-$a3 are statics.  */
13729
                  opcode |= MIPS16_ALL_STATICS << 16;
13730
                else
13731
                  {
13732
                    int narg = 0, nstat = 0;
13733
 
13734
                    /* Count arg registers.  */
13735
                    while (nargs & 0x1)
13736
                      {
13737
                        nargs >>= 1;
13738
                        narg++;
13739
                      }
13740
                    if (nargs != 0)
13741
                      as_bad (_("invalid arg register list"));
13742
 
13743
                    /* Count static registers.  */
13744
                    while (statics & 0x8)
13745
                      {
13746
                        statics = (statics << 1) & 0xf;
13747
                        nstat++;
13748
                      }
13749
                    if (statics != 0)
13750
                      as_bad (_("invalid static register list"));
13751
 
13752
                    /* Encode args/statics.  */
13753
                    opcode |= ((narg << 2) | nstat) << 16;
13754
                  }
13755
 
13756
                /* Encode $s0/$s1.  */
13757
                if (sregs & (1 << 0))            /* $s0 */
13758
                  opcode |= 0x20;
13759
                if (sregs & (1 << 1))           /* $s1 */
13760
                  opcode |= 0x10;
13761
                sregs >>= 2;
13762
 
13763
                if (sregs != 0)
13764
                  {
13765
                    /* Count regs $s2-$s8.  */
13766
                    int nsreg = 0;
13767
                    while (sregs & 1)
13768
                      {
13769
                        sregs >>= 1;
13770
                        nsreg++;
13771
                      }
13772
                    if (sregs != 0)
13773
                      as_bad (_("invalid static register list"));
13774
                    /* Encode $s2-$s8. */
13775
                    opcode |= nsreg << 24;
13776
                  }
13777
 
13778
                /* Encode frame size.  */
13779
                if (!seen_framesz)
13780
                  as_bad (_("missing frame size"));
13781
                else if ((framesz & 7) != 0 || framesz < 0
13782
                         || framesz > 0xff * 8)
13783
                  as_bad (_("invalid frame size"));
13784
                else if (framesz != 128 || (opcode >> 16) != 0)
13785
                  {
13786
                    framesz /= 8;
13787
                    opcode |= (((framesz & 0xf0) << 16)
13788
                             | (framesz & 0x0f));
13789
                  }
13790
 
13791
                /* Finally build the instruction.  */
13792
                if ((opcode >> 16) != 0 || framesz == 0)
13793
                  {
13794
                    ip->use_extend = TRUE;
13795
                    ip->extend = opcode >> 16;
13796
                  }
13797
                ip->insn_opcode |= opcode & 0x7f;
13798
              }
13799
            continue;
13800
 
13801
            case 'e':           /* extend code */
13802
              my_getExpression (&imm_expr, s);
13803
              check_absolute_expr (ip, &imm_expr);
13804
              if ((unsigned long) imm_expr.X_add_number > 0x7ff)
13805
                {
13806
                  as_warn (_("Invalid value for `%s' (%lu)"),
13807
                           ip->insn_mo->name,
13808
                           (unsigned long) imm_expr.X_add_number);
13809
                  imm_expr.X_add_number &= 0x7ff;
13810
                }
13811
              ip->insn_opcode |= imm_expr.X_add_number;
13812
              imm_expr.X_op = O_absent;
13813
              s = expr_end;
13814
              continue;
13815
 
13816
            default:
13817
              internalError ();
13818
            }
13819
          break;
13820
        }
13821
 
13822
      /* Args don't match.  */
13823
      if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
13824
          strcmp (insn->name, insn[1].name) == 0)
13825
        {
13826
          ++insn;
13827
          s = argsstart;
13828
          continue;
13829
        }
13830
 
13831
      insn_error = _("illegal operands");
13832
 
13833
      return;
13834
    }
13835
}
13836
 
13837
/* This structure holds information we know about a mips16 immediate
13838
   argument type.  */
13839
 
13840
struct mips16_immed_operand
13841
{
13842
  /* The type code used in the argument string in the opcode table.  */
13843
  int type;
13844
  /* The number of bits in the short form of the opcode.  */
13845
  int nbits;
13846
  /* The number of bits in the extended form of the opcode.  */
13847
  int extbits;
13848
  /* The amount by which the short form is shifted when it is used;
13849
     for example, the sw instruction has a shift count of 2.  */
13850
  int shift;
13851
  /* The amount by which the short form is shifted when it is stored
13852
     into the instruction code.  */
13853
  int op_shift;
13854
  /* Non-zero if the short form is unsigned.  */
13855
  int unsp;
13856
  /* Non-zero if the extended form is unsigned.  */
13857
  int extu;
13858
  /* Non-zero if the value is PC relative.  */
13859
  int pcrel;
13860
};
13861
 
13862
/* The mips16 immediate operand types.  */
13863
 
13864
static const struct mips16_immed_operand mips16_immed_operands[] =
13865
{
13866
  { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
13867
  { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
13868
  { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
13869
  { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
13870
  { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
13871
  { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
13872
  { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
13873
  { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
13874
  { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
13875
  { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
13876
  { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
13877
  { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
13878
  { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
13879
  { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
13880
  { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
13881
  { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
13882
  { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
13883
  { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
13884
  { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
13885
  { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
13886
  { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
13887
};
13888
 
13889
#define MIPS16_NUM_IMMED \
13890
  (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
13891
 
13892
/* Handle a mips16 instruction with an immediate value.  This or's the
13893
   small immediate value into *INSN.  It sets *USE_EXTEND to indicate
13894
   whether an extended value is needed; if one is needed, it sets
13895
   *EXTEND to the value.  The argument type is TYPE.  The value is VAL.
13896
   If SMALL is true, an unextended opcode was explicitly requested.
13897
   If EXT is true, an extended opcode was explicitly requested.  If
13898
   WARN is true, warn if EXT does not match reality.  */
13899
 
13900
static void
13901
mips16_immed (char *file, unsigned int line, int type, offsetT val,
13902
              bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
13903
              unsigned long *insn, bfd_boolean *use_extend,
13904
              unsigned short *extend)
13905
{
13906
  const struct mips16_immed_operand *op;
13907
  int mintiny, maxtiny;
13908
  bfd_boolean needext;
13909
 
13910
  op = mips16_immed_operands;
13911
  while (op->type != type)
13912
    {
13913
      ++op;
13914
      gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
13915
    }
13916
 
13917
  if (op->unsp)
13918
    {
13919
      if (type == '<' || type == '>' || type == '[' || type == ']')
13920
        {
13921
          mintiny = 1;
13922
          maxtiny = 1 << op->nbits;
13923
        }
13924
      else
13925
        {
13926
          mintiny = 0;
13927
          maxtiny = (1 << op->nbits) - 1;
13928
        }
13929
    }
13930
  else
13931
    {
13932
      mintiny = - (1 << (op->nbits - 1));
13933
      maxtiny = (1 << (op->nbits - 1)) - 1;
13934
    }
13935
 
13936
  /* Branch offsets have an implicit 0 in the lowest bit.  */
13937
  if (type == 'p' || type == 'q')
13938
    val /= 2;
13939
 
13940
  if ((val & ((1 << op->shift) - 1)) != 0
13941
      || val < (mintiny << op->shift)
13942
      || val > (maxtiny << op->shift))
13943
    needext = TRUE;
13944
  else
13945
    needext = FALSE;
13946
 
13947
  if (warn && ext && ! needext)
13948
    as_warn_where (file, line,
13949
                   _("extended operand requested but not required"));
13950
  if (small && needext)
13951
    as_bad_where (file, line, _("invalid unextended operand value"));
13952
 
13953
  if (small || (! ext && ! needext))
13954
    {
13955
      int insnval;
13956
 
13957
      *use_extend = FALSE;
13958
      insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
13959
      insnval <<= op->op_shift;
13960
      *insn |= insnval;
13961
    }
13962
  else
13963
    {
13964
      long minext, maxext;
13965
      int extval;
13966
 
13967
      if (op->extu)
13968
        {
13969
          minext = 0;
13970
          maxext = (1 << op->extbits) - 1;
13971
        }
13972
      else
13973
        {
13974
          minext = - (1 << (op->extbits - 1));
13975
          maxext = (1 << (op->extbits - 1)) - 1;
13976
        }
13977
      if (val < minext || val > maxext)
13978
        as_bad_where (file, line,
13979
                      _("operand value out of range for instruction"));
13980
 
13981
      *use_extend = TRUE;
13982
      if (op->extbits == 16)
13983
        {
13984
          extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
13985
          val &= 0x1f;
13986
        }
13987
      else if (op->extbits == 15)
13988
        {
13989
          extval = ((val >> 11) & 0xf) | (val & 0x7f0);
13990
          val &= 0xf;
13991
        }
13992
      else
13993
        {
13994
          extval = ((val & 0x1f) << 6) | (val & 0x20);
13995
          val = 0;
13996
        }
13997
 
13998
      *extend = (unsigned short) extval;
13999
      *insn |= val;
14000
    }
14001
}
14002
 
14003
struct percent_op_match
14004
{
14005
  const char *str;
14006
  bfd_reloc_code_real_type reloc;
14007
};
14008
 
14009
static const struct percent_op_match mips_percent_op[] =
14010
{
14011
  {"%lo", BFD_RELOC_LO16},
14012
#ifdef OBJ_ELF
14013
  {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
14014
  {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
14015
  {"%call16", BFD_RELOC_MIPS_CALL16},
14016
  {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
14017
  {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
14018
  {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
14019
  {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
14020
  {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
14021
  {"%got", BFD_RELOC_MIPS_GOT16},
14022
  {"%gp_rel", BFD_RELOC_GPREL16},
14023
  {"%half", BFD_RELOC_16},
14024
  {"%highest", BFD_RELOC_MIPS_HIGHEST},
14025
  {"%higher", BFD_RELOC_MIPS_HIGHER},
14026
  {"%neg", BFD_RELOC_MIPS_SUB},
14027
  {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
14028
  {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
14029
  {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
14030
  {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
14031
  {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
14032
  {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
14033
  {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
14034
#endif
14035
  {"%hi", BFD_RELOC_HI16_S}
14036
};
14037
 
14038
static const struct percent_op_match mips16_percent_op[] =
14039
{
14040
  {"%lo", BFD_RELOC_MIPS16_LO16},
14041
  {"%gprel", BFD_RELOC_MIPS16_GPREL},
14042
  {"%got", BFD_RELOC_MIPS16_GOT16},
14043
  {"%call16", BFD_RELOC_MIPS16_CALL16},
14044
  {"%hi", BFD_RELOC_MIPS16_HI16_S}
14045
};
14046
 
14047
 
14048
/* Return true if *STR points to a relocation operator.  When returning true,
14049
   move *STR over the operator and store its relocation code in *RELOC.
14050
   Leave both *STR and *RELOC alone when returning false.  */
14051
 
14052
static bfd_boolean
14053
parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
14054
{
14055
  const struct percent_op_match *percent_op;
14056
  size_t limit, i;
14057
 
14058
  if (mips_opts.mips16)
14059
    {
14060
      percent_op = mips16_percent_op;
14061
      limit = ARRAY_SIZE (mips16_percent_op);
14062
    }
14063
  else
14064
    {
14065
      percent_op = mips_percent_op;
14066
      limit = ARRAY_SIZE (mips_percent_op);
14067
    }
14068
 
14069
  for (i = 0; i < limit; i++)
14070
    if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
14071
      {
14072
        int len = strlen (percent_op[i].str);
14073
 
14074
        if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
14075
          continue;
14076
 
14077
        *str += strlen (percent_op[i].str);
14078
        *reloc = percent_op[i].reloc;
14079
 
14080
        /* Check whether the output BFD supports this relocation.
14081
           If not, issue an error and fall back on something safe.  */
14082
        if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
14083
          {
14084
            as_bad (_("relocation %s isn't supported by the current ABI"),
14085
                    percent_op[i].str);
14086
            *reloc = BFD_RELOC_UNUSED;
14087
          }
14088
        return TRUE;
14089
      }
14090
  return FALSE;
14091
}
14092
 
14093
 
14094
/* Parse string STR as a 16-bit relocatable operand.  Store the
14095
   expression in *EP and the relocations in the array starting
14096
   at RELOC.  Return the number of relocation operators used.
14097
 
14098
   On exit, EXPR_END points to the first character after the expression.  */
14099
 
14100
static size_t
14101
my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
14102
                       char *str)
14103
{
14104
  bfd_reloc_code_real_type reversed_reloc[3];
14105
  size_t reloc_index, i;
14106
  int crux_depth, str_depth;
14107
  char *crux;
14108
 
14109
  /* Search for the start of the main expression, recoding relocations
14110
     in REVERSED_RELOC.  End the loop with CRUX pointing to the start
14111
     of the main expression and with CRUX_DEPTH containing the number
14112
     of open brackets at that point.  */
14113
  reloc_index = -1;
14114
  str_depth = 0;
14115
  do
14116
    {
14117
      reloc_index++;
14118
      crux = str;
14119
      crux_depth = str_depth;
14120
 
14121
      /* Skip over whitespace and brackets, keeping count of the number
14122
         of brackets.  */
14123
      while (*str == ' ' || *str == '\t' || *str == '(')
14124
        if (*str++ == '(')
14125
          str_depth++;
14126
    }
14127
  while (*str == '%'
14128
         && reloc_index < (HAVE_NEWABI ? 3 : 1)
14129
         && parse_relocation (&str, &reversed_reloc[reloc_index]));
14130
 
14131
  my_getExpression (ep, crux);
14132
  str = expr_end;
14133
 
14134
  /* Match every open bracket.  */
14135
  while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
14136
    if (*str++ == ')')
14137
      crux_depth--;
14138
 
14139
  if (crux_depth > 0)
14140
    as_bad (_("unclosed '('"));
14141
 
14142
  expr_end = str;
14143
 
14144
  if (reloc_index != 0)
14145
    {
14146
      prev_reloc_op_frag = frag_now;
14147
      for (i = 0; i < reloc_index; i++)
14148
        reloc[i] = reversed_reloc[reloc_index - 1 - i];
14149
    }
14150
 
14151
  return reloc_index;
14152
}
14153
 
14154
static void
14155
my_getExpression (expressionS *ep, char *str)
14156
{
14157
  char *save_in;
14158
 
14159
  save_in = input_line_pointer;
14160
  input_line_pointer = str;
14161
  expression (ep);
14162
  expr_end = input_line_pointer;
14163
  input_line_pointer = save_in;
14164
}
14165
 
14166
char *
14167
md_atof (int type, char *litP, int *sizeP)
14168
{
14169
  return ieee_md_atof (type, litP, sizeP, target_big_endian);
14170
}
14171
 
14172
void
14173
md_number_to_chars (char *buf, valueT val, int n)
14174
{
14175
  if (target_big_endian)
14176
    number_to_chars_bigendian (buf, val, n);
14177
  else
14178
    number_to_chars_littleendian (buf, val, n);
14179
}
14180
 
14181
#ifdef OBJ_ELF
14182
static int support_64bit_objects(void)
14183
{
14184
  const char **list, **l;
14185
  int yes;
14186
 
14187
  list = bfd_target_list ();
14188
  for (l = list; *l != NULL; l++)
14189
    if (strcmp (*l, ELF_TARGET ("elf64-", "big")) == 0
14190
        || strcmp (*l, ELF_TARGET ("elf64-", "little")) == 0)
14191
      break;
14192
  yes = (*l != NULL);
14193
  free (list);
14194
  return yes;
14195
}
14196
#endif /* OBJ_ELF */
14197
 
14198
const char *md_shortopts = "O::g::G:";
14199
 
14200
enum options
14201
  {
14202
    OPTION_MARCH = OPTION_MD_BASE,
14203
    OPTION_MTUNE,
14204
    OPTION_MIPS1,
14205
    OPTION_MIPS2,
14206
    OPTION_MIPS3,
14207
    OPTION_MIPS4,
14208
    OPTION_MIPS5,
14209
    OPTION_MIPS32,
14210
    OPTION_MIPS64,
14211
    OPTION_MIPS32R2,
14212
    OPTION_MIPS64R2,
14213
    OPTION_MIPS16,
14214
    OPTION_NO_MIPS16,
14215
    OPTION_MIPS3D,
14216
    OPTION_NO_MIPS3D,
14217
    OPTION_MDMX,
14218
    OPTION_NO_MDMX,
14219
    OPTION_DSP,
14220
    OPTION_NO_DSP,
14221
    OPTION_MT,
14222
    OPTION_NO_MT,
14223
    OPTION_SMARTMIPS,
14224
    OPTION_NO_SMARTMIPS,
14225
    OPTION_DSPR2,
14226
    OPTION_NO_DSPR2,
14227 160 khays
    OPTION_MICROMIPS,
14228
    OPTION_NO_MICROMIPS,
14229
    OPTION_MCU,
14230
    OPTION_NO_MCU,
14231 16 khays
    OPTION_COMPAT_ARCH_BASE,
14232
    OPTION_M4650,
14233
    OPTION_NO_M4650,
14234
    OPTION_M4010,
14235
    OPTION_NO_M4010,
14236
    OPTION_M4100,
14237
    OPTION_NO_M4100,
14238
    OPTION_M3900,
14239
    OPTION_NO_M3900,
14240
    OPTION_M7000_HILO_FIX,
14241
    OPTION_MNO_7000_HILO_FIX,
14242
    OPTION_FIX_24K,
14243
    OPTION_NO_FIX_24K,
14244
    OPTION_FIX_LOONGSON2F_JUMP,
14245
    OPTION_NO_FIX_LOONGSON2F_JUMP,
14246
    OPTION_FIX_LOONGSON2F_NOP,
14247
    OPTION_NO_FIX_LOONGSON2F_NOP,
14248
    OPTION_FIX_VR4120,
14249
    OPTION_NO_FIX_VR4120,
14250
    OPTION_FIX_VR4130,
14251
    OPTION_NO_FIX_VR4130,
14252
    OPTION_FIX_CN63XXP1,
14253
    OPTION_NO_FIX_CN63XXP1,
14254
    OPTION_TRAP,
14255
    OPTION_BREAK,
14256
    OPTION_EB,
14257
    OPTION_EL,
14258
    OPTION_FP32,
14259
    OPTION_GP32,
14260
    OPTION_CONSTRUCT_FLOATS,
14261
    OPTION_NO_CONSTRUCT_FLOATS,
14262
    OPTION_FP64,
14263
    OPTION_GP64,
14264
    OPTION_RELAX_BRANCH,
14265
    OPTION_NO_RELAX_BRANCH,
14266
    OPTION_MSHARED,
14267
    OPTION_MNO_SHARED,
14268
    OPTION_MSYM32,
14269
    OPTION_MNO_SYM32,
14270
    OPTION_SOFT_FLOAT,
14271
    OPTION_HARD_FLOAT,
14272
    OPTION_SINGLE_FLOAT,
14273
    OPTION_DOUBLE_FLOAT,
14274
    OPTION_32,
14275
#ifdef OBJ_ELF
14276
    OPTION_CALL_SHARED,
14277
    OPTION_CALL_NONPIC,
14278
    OPTION_NON_SHARED,
14279
    OPTION_XGOT,
14280
    OPTION_MABI,
14281
    OPTION_N32,
14282
    OPTION_64,
14283
    OPTION_MDEBUG,
14284
    OPTION_NO_MDEBUG,
14285
    OPTION_PDR,
14286
    OPTION_NO_PDR,
14287
    OPTION_MVXWORKS_PIC,
14288
#endif /* OBJ_ELF */
14289
    OPTION_END_OF_ENUM
14290
  };
14291
 
14292
struct option md_longopts[] =
14293
{
14294
  /* Options which specify architecture.  */
14295
  {"march", required_argument, NULL, OPTION_MARCH},
14296
  {"mtune", required_argument, NULL, OPTION_MTUNE},
14297
  {"mips0", no_argument, NULL, OPTION_MIPS1},
14298
  {"mips1", no_argument, NULL, OPTION_MIPS1},
14299
  {"mips2", no_argument, NULL, OPTION_MIPS2},
14300
  {"mips3", no_argument, NULL, OPTION_MIPS3},
14301
  {"mips4", no_argument, NULL, OPTION_MIPS4},
14302
  {"mips5", no_argument, NULL, OPTION_MIPS5},
14303
  {"mips32", no_argument, NULL, OPTION_MIPS32},
14304
  {"mips64", no_argument, NULL, OPTION_MIPS64},
14305
  {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
14306
  {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
14307
 
14308
  /* Options which specify Application Specific Extensions (ASEs).  */
14309
  {"mips16", no_argument, NULL, OPTION_MIPS16},
14310
  {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
14311
  {"mips3d", no_argument, NULL, OPTION_MIPS3D},
14312
  {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
14313
  {"mdmx", no_argument, NULL, OPTION_MDMX},
14314
  {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
14315
  {"mdsp", no_argument, NULL, OPTION_DSP},
14316
  {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
14317
  {"mmt", no_argument, NULL, OPTION_MT},
14318
  {"mno-mt", no_argument, NULL, OPTION_NO_MT},
14319
  {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
14320
  {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
14321
  {"mdspr2", no_argument, NULL, OPTION_DSPR2},
14322
  {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
14323 160 khays
  {"mmicromips", no_argument, NULL, OPTION_MICROMIPS},
14324
  {"mno-micromips", no_argument, NULL, OPTION_NO_MICROMIPS},
14325
  {"mmcu", no_argument, NULL, OPTION_MCU},
14326
  {"mno-mcu", no_argument, NULL, OPTION_NO_MCU},
14327 16 khays
 
14328
  /* Old-style architecture options.  Don't add more of these.  */
14329
  {"m4650", no_argument, NULL, OPTION_M4650},
14330
  {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
14331
  {"m4010", no_argument, NULL, OPTION_M4010},
14332
  {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
14333
  {"m4100", no_argument, NULL, OPTION_M4100},
14334
  {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
14335
  {"m3900", no_argument, NULL, OPTION_M3900},
14336
  {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
14337
 
14338
  /* Options which enable bug fixes.  */
14339
  {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
14340
  {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
14341
  {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
14342
  {"mfix-loongson2f-jump", no_argument, NULL, OPTION_FIX_LOONGSON2F_JUMP},
14343
  {"mno-fix-loongson2f-jump", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_JUMP},
14344
  {"mfix-loongson2f-nop", no_argument, NULL, OPTION_FIX_LOONGSON2F_NOP},
14345
  {"mno-fix-loongson2f-nop", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_NOP},
14346
  {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
14347
  {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
14348
  {"mfix-vr4130",    no_argument, NULL, OPTION_FIX_VR4130},
14349
  {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
14350
  {"mfix-24k",    no_argument, NULL, OPTION_FIX_24K},
14351
  {"mno-fix-24k", no_argument, NULL, OPTION_NO_FIX_24K},
14352
  {"mfix-cn63xxp1", no_argument, NULL, OPTION_FIX_CN63XXP1},
14353
  {"mno-fix-cn63xxp1", no_argument, NULL, OPTION_NO_FIX_CN63XXP1},
14354
 
14355
  /* Miscellaneous options.  */
14356
  {"trap", no_argument, NULL, OPTION_TRAP},
14357
  {"no-break", no_argument, NULL, OPTION_TRAP},
14358
  {"break", no_argument, NULL, OPTION_BREAK},
14359
  {"no-trap", no_argument, NULL, OPTION_BREAK},
14360
  {"EB", no_argument, NULL, OPTION_EB},
14361
  {"EL", no_argument, NULL, OPTION_EL},
14362
  {"mfp32", no_argument, NULL, OPTION_FP32},
14363
  {"mgp32", no_argument, NULL, OPTION_GP32},
14364
  {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
14365
  {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
14366
  {"mfp64", no_argument, NULL, OPTION_FP64},
14367
  {"mgp64", no_argument, NULL, OPTION_GP64},
14368
  {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
14369
  {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
14370
  {"mshared", no_argument, NULL, OPTION_MSHARED},
14371
  {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
14372
  {"msym32", no_argument, NULL, OPTION_MSYM32},
14373
  {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
14374
  {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
14375
  {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
14376
  {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
14377
  {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
14378
 
14379
  /* Strictly speaking this next option is ELF specific,
14380
     but we allow it for other ports as well in order to
14381
     make testing easier.  */
14382
  {"32",          no_argument, NULL, OPTION_32},
14383
 
14384
  /* ELF-specific options.  */
14385
#ifdef OBJ_ELF
14386
  {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
14387
  {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
14388
  {"call_nonpic", no_argument, NULL, OPTION_CALL_NONPIC},
14389
  {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
14390
  {"xgot",        no_argument, NULL, OPTION_XGOT},
14391
  {"mabi", required_argument, NULL, OPTION_MABI},
14392
  {"n32",         no_argument, NULL, OPTION_N32},
14393
  {"64",          no_argument, NULL, OPTION_64},
14394
  {"mdebug", no_argument, NULL, OPTION_MDEBUG},
14395
  {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
14396
  {"mpdr", no_argument, NULL, OPTION_PDR},
14397
  {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
14398
  {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
14399
#endif /* OBJ_ELF */
14400
 
14401
  {NULL, no_argument, NULL, 0}
14402
};
14403
size_t md_longopts_size = sizeof (md_longopts);
14404
 
14405
/* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
14406
   NEW_VALUE.  Warn if another value was already specified.  Note:
14407
   we have to defer parsing the -march and -mtune arguments in order
14408
   to handle 'from-abi' correctly, since the ABI might be specified
14409
   in a later argument.  */
14410
 
14411
static void
14412
mips_set_option_string (const char **string_ptr, const char *new_value)
14413
{
14414
  if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
14415
    as_warn (_("A different %s was already specified, is now %s"),
14416
             string_ptr == &mips_arch_string ? "-march" : "-mtune",
14417
             new_value);
14418
 
14419
  *string_ptr = new_value;
14420
}
14421
 
14422
int
14423
md_parse_option (int c, char *arg)
14424
{
14425
  switch (c)
14426
    {
14427
    case OPTION_CONSTRUCT_FLOATS:
14428
      mips_disable_float_construction = 0;
14429
      break;
14430
 
14431
    case OPTION_NO_CONSTRUCT_FLOATS:
14432
      mips_disable_float_construction = 1;
14433
      break;
14434
 
14435
    case OPTION_TRAP:
14436
      mips_trap = 1;
14437
      break;
14438
 
14439
    case OPTION_BREAK:
14440
      mips_trap = 0;
14441
      break;
14442
 
14443
    case OPTION_EB:
14444
      target_big_endian = 1;
14445
      break;
14446
 
14447
    case OPTION_EL:
14448
      target_big_endian = 0;
14449
      break;
14450
 
14451
    case 'O':
14452
      if (arg == NULL)
14453
        mips_optimize = 1;
14454
      else if (arg[0] == '0')
14455
        mips_optimize = 0;
14456
      else if (arg[0] == '1')
14457
        mips_optimize = 1;
14458
      else
14459
        mips_optimize = 2;
14460
      break;
14461
 
14462
    case 'g':
14463
      if (arg == NULL)
14464
        mips_debug = 2;
14465
      else
14466
        mips_debug = atoi (arg);
14467
      break;
14468
 
14469
    case OPTION_MIPS1:
14470
      file_mips_isa = ISA_MIPS1;
14471
      break;
14472
 
14473
    case OPTION_MIPS2:
14474
      file_mips_isa = ISA_MIPS2;
14475
      break;
14476
 
14477
    case OPTION_MIPS3:
14478
      file_mips_isa = ISA_MIPS3;
14479
      break;
14480
 
14481
    case OPTION_MIPS4:
14482
      file_mips_isa = ISA_MIPS4;
14483
      break;
14484
 
14485
    case OPTION_MIPS5:
14486
      file_mips_isa = ISA_MIPS5;
14487
      break;
14488
 
14489
    case OPTION_MIPS32:
14490
      file_mips_isa = ISA_MIPS32;
14491
      break;
14492
 
14493
    case OPTION_MIPS32R2:
14494
      file_mips_isa = ISA_MIPS32R2;
14495
      break;
14496
 
14497
    case OPTION_MIPS64R2:
14498
      file_mips_isa = ISA_MIPS64R2;
14499
      break;
14500
 
14501
    case OPTION_MIPS64:
14502
      file_mips_isa = ISA_MIPS64;
14503
      break;
14504
 
14505
    case OPTION_MTUNE:
14506
      mips_set_option_string (&mips_tune_string, arg);
14507
      break;
14508
 
14509
    case OPTION_MARCH:
14510
      mips_set_option_string (&mips_arch_string, arg);
14511
      break;
14512
 
14513
    case OPTION_M4650:
14514
      mips_set_option_string (&mips_arch_string, "4650");
14515
      mips_set_option_string (&mips_tune_string, "4650");
14516
      break;
14517
 
14518
    case OPTION_NO_M4650:
14519
      break;
14520
 
14521
    case OPTION_M4010:
14522
      mips_set_option_string (&mips_arch_string, "4010");
14523
      mips_set_option_string (&mips_tune_string, "4010");
14524
      break;
14525
 
14526
    case OPTION_NO_M4010:
14527
      break;
14528
 
14529
    case OPTION_M4100:
14530
      mips_set_option_string (&mips_arch_string, "4100");
14531
      mips_set_option_string (&mips_tune_string, "4100");
14532
      break;
14533
 
14534
    case OPTION_NO_M4100:
14535
      break;
14536
 
14537
    case OPTION_M3900:
14538
      mips_set_option_string (&mips_arch_string, "3900");
14539
      mips_set_option_string (&mips_tune_string, "3900");
14540
      break;
14541
 
14542
    case OPTION_NO_M3900:
14543
      break;
14544
 
14545
    case OPTION_MDMX:
14546
      mips_opts.ase_mdmx = 1;
14547
      break;
14548
 
14549
    case OPTION_NO_MDMX:
14550
      mips_opts.ase_mdmx = 0;
14551
      break;
14552
 
14553
    case OPTION_DSP:
14554
      mips_opts.ase_dsp = 1;
14555
      mips_opts.ase_dspr2 = 0;
14556
      break;
14557
 
14558
    case OPTION_NO_DSP:
14559
      mips_opts.ase_dsp = 0;
14560
      mips_opts.ase_dspr2 = 0;
14561
      break;
14562
 
14563
    case OPTION_DSPR2:
14564
      mips_opts.ase_dspr2 = 1;
14565
      mips_opts.ase_dsp = 1;
14566
      break;
14567
 
14568
    case OPTION_NO_DSPR2:
14569
      mips_opts.ase_dspr2 = 0;
14570
      mips_opts.ase_dsp = 0;
14571
      break;
14572
 
14573
    case OPTION_MT:
14574
      mips_opts.ase_mt = 1;
14575
      break;
14576
 
14577
    case OPTION_NO_MT:
14578
      mips_opts.ase_mt = 0;
14579
      break;
14580
 
14581 160 khays
    case OPTION_MCU:
14582
      mips_opts.ase_mcu = 1;
14583
      break;
14584
 
14585
    case OPTION_NO_MCU:
14586
      mips_opts.ase_mcu = 0;
14587
      break;
14588
 
14589
    case OPTION_MICROMIPS:
14590
      if (mips_opts.mips16 == 1)
14591
        {
14592
          as_bad (_("-mmicromips cannot be used with -mips16"));
14593
          return 0;
14594
        }
14595
      mips_opts.micromips = 1;
14596
      mips_no_prev_insn ();
14597
      break;
14598
 
14599
    case OPTION_NO_MICROMIPS:
14600
      mips_opts.micromips = 0;
14601
      mips_no_prev_insn ();
14602
      break;
14603
 
14604 16 khays
    case OPTION_MIPS16:
14605 160 khays
      if (mips_opts.micromips == 1)
14606
        {
14607
          as_bad (_("-mips16 cannot be used with -micromips"));
14608
          return 0;
14609
        }
14610 16 khays
      mips_opts.mips16 = 1;
14611
      mips_no_prev_insn ();
14612
      break;
14613
 
14614
    case OPTION_NO_MIPS16:
14615
      mips_opts.mips16 = 0;
14616
      mips_no_prev_insn ();
14617
      break;
14618
 
14619
    case OPTION_MIPS3D:
14620
      mips_opts.ase_mips3d = 1;
14621
      break;
14622
 
14623
    case OPTION_NO_MIPS3D:
14624
      mips_opts.ase_mips3d = 0;
14625
      break;
14626
 
14627
    case OPTION_SMARTMIPS:
14628
      mips_opts.ase_smartmips = 1;
14629
      break;
14630
 
14631
    case OPTION_NO_SMARTMIPS:
14632
      mips_opts.ase_smartmips = 0;
14633
      break;
14634
 
14635
    case OPTION_FIX_24K:
14636
      mips_fix_24k = 1;
14637
      break;
14638
 
14639
    case OPTION_NO_FIX_24K:
14640
      mips_fix_24k = 0;
14641
      break;
14642
 
14643
    case OPTION_FIX_LOONGSON2F_JUMP:
14644
      mips_fix_loongson2f_jump = TRUE;
14645
      break;
14646
 
14647
    case OPTION_NO_FIX_LOONGSON2F_JUMP:
14648
      mips_fix_loongson2f_jump = FALSE;
14649
      break;
14650
 
14651
    case OPTION_FIX_LOONGSON2F_NOP:
14652
      mips_fix_loongson2f_nop = TRUE;
14653
      break;
14654
 
14655
    case OPTION_NO_FIX_LOONGSON2F_NOP:
14656
      mips_fix_loongson2f_nop = FALSE;
14657
      break;
14658
 
14659
    case OPTION_FIX_VR4120:
14660
      mips_fix_vr4120 = 1;
14661
      break;
14662
 
14663
    case OPTION_NO_FIX_VR4120:
14664
      mips_fix_vr4120 = 0;
14665
      break;
14666
 
14667
    case OPTION_FIX_VR4130:
14668
      mips_fix_vr4130 = 1;
14669
      break;
14670
 
14671
    case OPTION_NO_FIX_VR4130:
14672
      mips_fix_vr4130 = 0;
14673
      break;
14674
 
14675
    case OPTION_FIX_CN63XXP1:
14676
      mips_fix_cn63xxp1 = TRUE;
14677
      break;
14678
 
14679
    case OPTION_NO_FIX_CN63XXP1:
14680
      mips_fix_cn63xxp1 = FALSE;
14681
      break;
14682
 
14683
    case OPTION_RELAX_BRANCH:
14684
      mips_relax_branch = 1;
14685
      break;
14686
 
14687
    case OPTION_NO_RELAX_BRANCH:
14688
      mips_relax_branch = 0;
14689
      break;
14690
 
14691
    case OPTION_MSHARED:
14692
      mips_in_shared = TRUE;
14693
      break;
14694
 
14695
    case OPTION_MNO_SHARED:
14696
      mips_in_shared = FALSE;
14697
      break;
14698
 
14699
    case OPTION_MSYM32:
14700
      mips_opts.sym32 = TRUE;
14701
      break;
14702
 
14703
    case OPTION_MNO_SYM32:
14704
      mips_opts.sym32 = FALSE;
14705
      break;
14706
 
14707
#ifdef OBJ_ELF
14708
      /* When generating ELF code, we permit -KPIC and -call_shared to
14709
         select SVR4_PIC, and -non_shared to select no PIC.  This is
14710
         intended to be compatible with Irix 5.  */
14711
    case OPTION_CALL_SHARED:
14712
      if (!IS_ELF)
14713
        {
14714
          as_bad (_("-call_shared is supported only for ELF format"));
14715
          return 0;
14716
        }
14717
      mips_pic = SVR4_PIC;
14718
      mips_abicalls = TRUE;
14719
      break;
14720
 
14721
    case OPTION_CALL_NONPIC:
14722
      if (!IS_ELF)
14723
        {
14724
          as_bad (_("-call_nonpic is supported only for ELF format"));
14725
          return 0;
14726
        }
14727
      mips_pic = NO_PIC;
14728
      mips_abicalls = TRUE;
14729
      break;
14730
 
14731
    case OPTION_NON_SHARED:
14732
      if (!IS_ELF)
14733
        {
14734
          as_bad (_("-non_shared is supported only for ELF format"));
14735
          return 0;
14736
        }
14737
      mips_pic = NO_PIC;
14738
      mips_abicalls = FALSE;
14739
      break;
14740
 
14741
      /* The -xgot option tells the assembler to use 32 bit offsets
14742
         when accessing the got in SVR4_PIC mode.  It is for Irix
14743
         compatibility.  */
14744
    case OPTION_XGOT:
14745
      mips_big_got = 1;
14746
      break;
14747
#endif /* OBJ_ELF */
14748
 
14749
    case 'G':
14750
      g_switch_value = atoi (arg);
14751
      g_switch_seen = 1;
14752
      break;
14753
 
14754
      /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
14755
         and -mabi=64.  */
14756
    case OPTION_32:
14757
      if (IS_ELF)
14758
        mips_abi = O32_ABI;
14759
      /* We silently ignore -32 for non-ELF targets.  This greatly
14760
         simplifies the construction of the MIPS GAS test cases.  */
14761
      break;
14762
 
14763
#ifdef OBJ_ELF
14764
    case OPTION_N32:
14765
      if (!IS_ELF)
14766
        {
14767
          as_bad (_("-n32 is supported for ELF format only"));
14768
          return 0;
14769
        }
14770
      mips_abi = N32_ABI;
14771
      break;
14772
 
14773
    case OPTION_64:
14774
      if (!IS_ELF)
14775
        {
14776
          as_bad (_("-64 is supported for ELF format only"));
14777
          return 0;
14778
        }
14779
      mips_abi = N64_ABI;
14780
      if (!support_64bit_objects())
14781
        as_fatal (_("No compiled in support for 64 bit object file format"));
14782
      break;
14783
#endif /* OBJ_ELF */
14784
 
14785
    case OPTION_GP32:
14786
      file_mips_gp32 = 1;
14787
      break;
14788
 
14789
    case OPTION_GP64:
14790
      file_mips_gp32 = 0;
14791
      break;
14792
 
14793
    case OPTION_FP32:
14794
      file_mips_fp32 = 1;
14795
      break;
14796
 
14797
    case OPTION_FP64:
14798
      file_mips_fp32 = 0;
14799
      break;
14800
 
14801
    case OPTION_SINGLE_FLOAT:
14802
      file_mips_single_float = 1;
14803
      break;
14804
 
14805
    case OPTION_DOUBLE_FLOAT:
14806
      file_mips_single_float = 0;
14807
      break;
14808
 
14809
    case OPTION_SOFT_FLOAT:
14810
      file_mips_soft_float = 1;
14811
      break;
14812
 
14813
    case OPTION_HARD_FLOAT:
14814
      file_mips_soft_float = 0;
14815
      break;
14816
 
14817
#ifdef OBJ_ELF
14818
    case OPTION_MABI:
14819
      if (!IS_ELF)
14820
        {
14821
          as_bad (_("-mabi is supported for ELF format only"));
14822
          return 0;
14823
        }
14824
      if (strcmp (arg, "32") == 0)
14825
        mips_abi = O32_ABI;
14826
      else if (strcmp (arg, "o64") == 0)
14827
        mips_abi = O64_ABI;
14828
      else if (strcmp (arg, "n32") == 0)
14829
        mips_abi = N32_ABI;
14830
      else if (strcmp (arg, "64") == 0)
14831
        {
14832
          mips_abi = N64_ABI;
14833
          if (! support_64bit_objects())
14834
            as_fatal (_("No compiled in support for 64 bit object file "
14835
                        "format"));
14836
        }
14837
      else if (strcmp (arg, "eabi") == 0)
14838
        mips_abi = EABI_ABI;
14839
      else
14840
        {
14841
          as_fatal (_("invalid abi -mabi=%s"), arg);
14842
          return 0;
14843
        }
14844
      break;
14845
#endif /* OBJ_ELF */
14846
 
14847
    case OPTION_M7000_HILO_FIX:
14848
      mips_7000_hilo_fix = TRUE;
14849
      break;
14850
 
14851
    case OPTION_MNO_7000_HILO_FIX:
14852
      mips_7000_hilo_fix = FALSE;
14853
      break;
14854
 
14855
#ifdef OBJ_ELF
14856
    case OPTION_MDEBUG:
14857
      mips_flag_mdebug = TRUE;
14858
      break;
14859
 
14860
    case OPTION_NO_MDEBUG:
14861
      mips_flag_mdebug = FALSE;
14862
      break;
14863
 
14864
    case OPTION_PDR:
14865
      mips_flag_pdr = TRUE;
14866
      break;
14867
 
14868
    case OPTION_NO_PDR:
14869
      mips_flag_pdr = FALSE;
14870
      break;
14871
 
14872
    case OPTION_MVXWORKS_PIC:
14873
      mips_pic = VXWORKS_PIC;
14874
      break;
14875
#endif /* OBJ_ELF */
14876
 
14877
    default:
14878
      return 0;
14879
    }
14880
 
14881
    mips_fix_loongson2f = mips_fix_loongson2f_nop || mips_fix_loongson2f_jump;
14882
 
14883
  return 1;
14884
}
14885
 
14886
/* Set up globals to generate code for the ISA or processor
14887
   described by INFO.  */
14888
 
14889
static void
14890
mips_set_architecture (const struct mips_cpu_info *info)
14891
{
14892
  if (info != 0)
14893
    {
14894
      file_mips_arch = info->cpu;
14895
      mips_opts.arch = info->cpu;
14896
      mips_opts.isa = info->isa;
14897
    }
14898
}
14899
 
14900
 
14901
/* Likewise for tuning.  */
14902
 
14903
static void
14904
mips_set_tune (const struct mips_cpu_info *info)
14905
{
14906
  if (info != 0)
14907
    mips_tune = info->cpu;
14908
}
14909
 
14910
 
14911
void
14912
mips_after_parse_args (void)
14913
{
14914
  const struct mips_cpu_info *arch_info = 0;
14915
  const struct mips_cpu_info *tune_info = 0;
14916
 
14917
  /* GP relative stuff not working for PE */
14918
  if (strncmp (TARGET_OS, "pe", 2) == 0)
14919
    {
14920
      if (g_switch_seen && g_switch_value != 0)
14921
        as_bad (_("-G not supported in this configuration."));
14922
      g_switch_value = 0;
14923
    }
14924
 
14925
  if (mips_abi == NO_ABI)
14926
    mips_abi = MIPS_DEFAULT_ABI;
14927
 
14928
  /* The following code determines the architecture and register size.
14929
     Similar code was added to GCC 3.3 (see override_options() in
14930
     config/mips/mips.c).  The GAS and GCC code should be kept in sync
14931
     as much as possible.  */
14932
 
14933
  if (mips_arch_string != 0)
14934
    arch_info = mips_parse_cpu ("-march", mips_arch_string);
14935
 
14936
  if (file_mips_isa != ISA_UNKNOWN)
14937
    {
14938
      /* Handle -mipsN.  At this point, file_mips_isa contains the
14939
         ISA level specified by -mipsN, while arch_info->isa contains
14940
         the -march selection (if any).  */
14941
      if (arch_info != 0)
14942
        {
14943
          /* -march takes precedence over -mipsN, since it is more descriptive.
14944
             There's no harm in specifying both as long as the ISA levels
14945
             are the same.  */
14946
          if (file_mips_isa != arch_info->isa)
14947
            as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
14948
                    mips_cpu_info_from_isa (file_mips_isa)->name,
14949
                    mips_cpu_info_from_isa (arch_info->isa)->name);
14950
        }
14951
      else
14952
        arch_info = mips_cpu_info_from_isa (file_mips_isa);
14953
    }
14954
 
14955
  if (arch_info == 0)
14956
    arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
14957
 
14958
  if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
14959
    as_bad (_("-march=%s is not compatible with the selected ABI"),
14960
            arch_info->name);
14961
 
14962
  mips_set_architecture (arch_info);
14963
 
14964
  /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
14965
  if (mips_tune_string != 0)
14966
    tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
14967
 
14968
  if (tune_info == 0)
14969
    mips_set_tune (arch_info);
14970
  else
14971
    mips_set_tune (tune_info);
14972
 
14973
  if (file_mips_gp32 >= 0)
14974
    {
14975
      /* The user specified the size of the integer registers.  Make sure
14976
         it agrees with the ABI and ISA.  */
14977
      if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
14978
        as_bad (_("-mgp64 used with a 32-bit processor"));
14979
      else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
14980
        as_bad (_("-mgp32 used with a 64-bit ABI"));
14981
      else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
14982
        as_bad (_("-mgp64 used with a 32-bit ABI"));
14983
    }
14984
  else
14985
    {
14986
      /* Infer the integer register size from the ABI and processor.
14987
         Restrict ourselves to 32-bit registers if that's all the
14988
         processor has, or if the ABI cannot handle 64-bit registers.  */
14989
      file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
14990
                        || !ISA_HAS_64BIT_REGS (mips_opts.isa));
14991
    }
14992
 
14993
  switch (file_mips_fp32)
14994
    {
14995
    default:
14996
    case -1:
14997
      /* No user specified float register size.
14998
         ??? GAS treats single-float processors as though they had 64-bit
14999
         float registers (although it complains when double-precision
15000
         instructions are used).  As things stand, saying they have 32-bit
15001
         registers would lead to spurious "register must be even" messages.
15002
         So here we assume float registers are never smaller than the
15003
         integer ones.  */
15004
      if (file_mips_gp32 == 0)
15005
        /* 64-bit integer registers implies 64-bit float registers.  */
15006
        file_mips_fp32 = 0;
15007
      else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
15008
               && ISA_HAS_64BIT_FPRS (mips_opts.isa))
15009
        /* -mips3d and -mdmx imply 64-bit float registers, if possible.  */
15010
        file_mips_fp32 = 0;
15011
      else
15012
        /* 32-bit float registers.  */
15013
        file_mips_fp32 = 1;
15014
      break;
15015
 
15016
    /* The user specified the size of the float registers.  Check if it
15017
       agrees with the ABI and ISA.  */
15018
    case 0:
15019
      if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
15020
        as_bad (_("-mfp64 used with a 32-bit fpu"));
15021
      else if (ABI_NEEDS_32BIT_REGS (mips_abi)
15022
               && !ISA_HAS_MXHC1 (mips_opts.isa))
15023
        as_warn (_("-mfp64 used with a 32-bit ABI"));
15024
      break;
15025
    case 1:
15026
      if (ABI_NEEDS_64BIT_REGS (mips_abi))
15027
        as_warn (_("-mfp32 used with a 64-bit ABI"));
15028
      break;
15029
    }
15030
 
15031
  /* End of GCC-shared inference code.  */
15032
 
15033
  /* This flag is set when we have a 64-bit capable CPU but use only
15034
     32-bit wide registers.  Note that EABI does not use it.  */
15035
  if (ISA_HAS_64BIT_REGS (mips_opts.isa)
15036
      && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
15037
          || mips_abi == O32_ABI))
15038
    mips_32bitmode = 1;
15039
 
15040
  if (mips_opts.isa == ISA_MIPS1 && mips_trap)
15041
    as_bad (_("trap exception not supported at ISA 1"));
15042
 
15043
  /* If the selected architecture includes support for ASEs, enable
15044
     generation of code for them.  */
15045
  if (mips_opts.mips16 == -1)
15046
    mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
15047 160 khays
  if (mips_opts.micromips == -1)
15048
    mips_opts.micromips = (CPU_HAS_MICROMIPS (file_mips_arch)) ? 1 : 0;
15049 16 khays
  if (mips_opts.ase_mips3d == -1)
15050
    mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
15051
                            && file_mips_fp32 == 0) ? 1 : 0;
15052
  if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
15053
    as_bad (_("-mfp32 used with -mips3d"));
15054
 
15055
  if (mips_opts.ase_mdmx == -1)
15056
    mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
15057
                          && file_mips_fp32 == 0) ? 1 : 0;
15058
  if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
15059
    as_bad (_("-mfp32 used with -mdmx"));
15060
 
15061
  if (mips_opts.ase_smartmips == -1)
15062
    mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
15063
  if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
15064
    as_warn (_("%s ISA does not support SmartMIPS"),
15065
             mips_cpu_info_from_isa (mips_opts.isa)->name);
15066
 
15067
  if (mips_opts.ase_dsp == -1)
15068
    mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
15069
  if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
15070
    as_warn (_("%s ISA does not support DSP ASE"),
15071
             mips_cpu_info_from_isa (mips_opts.isa)->name);
15072
 
15073
  if (mips_opts.ase_dspr2 == -1)
15074
    {
15075
      mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
15076
      mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
15077
    }
15078
  if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
15079
    as_warn (_("%s ISA does not support DSP R2 ASE"),
15080
             mips_cpu_info_from_isa (mips_opts.isa)->name);
15081
 
15082
  if (mips_opts.ase_mt == -1)
15083
    mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
15084
  if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
15085
    as_warn (_("%s ISA does not support MT ASE"),
15086
             mips_cpu_info_from_isa (mips_opts.isa)->name);
15087
 
15088 160 khays
  if (mips_opts.ase_mcu == -1)
15089
    mips_opts.ase_mcu = (arch_info->flags & MIPS_CPU_ASE_MCU) ? 1 : 0;
15090
  if (mips_opts.ase_mcu && !ISA_SUPPORTS_MCU_ASE)
15091
      as_warn (_("%s ISA does not support MCU ASE"),
15092
               mips_cpu_info_from_isa (mips_opts.isa)->name);
15093
 
15094 16 khays
  file_mips_isa = mips_opts.isa;
15095
  file_ase_mips3d = mips_opts.ase_mips3d;
15096
  file_ase_mdmx = mips_opts.ase_mdmx;
15097
  file_ase_smartmips = mips_opts.ase_smartmips;
15098
  file_ase_dsp = mips_opts.ase_dsp;
15099
  file_ase_dspr2 = mips_opts.ase_dspr2;
15100
  file_ase_mt = mips_opts.ase_mt;
15101
  mips_opts.gp32 = file_mips_gp32;
15102
  mips_opts.fp32 = file_mips_fp32;
15103
  mips_opts.soft_float = file_mips_soft_float;
15104
  mips_opts.single_float = file_mips_single_float;
15105
 
15106
  if (mips_flag_mdebug < 0)
15107
    {
15108
#ifdef OBJ_MAYBE_ECOFF
15109
      if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
15110
        mips_flag_mdebug = 1;
15111
      else
15112
#endif /* OBJ_MAYBE_ECOFF */
15113
        mips_flag_mdebug = 0;
15114
    }
15115
}
15116
 
15117
void
15118
mips_init_after_args (void)
15119
{
15120
  /* initialize opcodes */
15121
  bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
15122
  mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
15123
}
15124
 
15125
long
15126
md_pcrel_from (fixS *fixP)
15127
{
15128
  valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
15129
  switch (fixP->fx_r_type)
15130
    {
15131 160 khays
    case BFD_RELOC_MICROMIPS_7_PCREL_S1:
15132
    case BFD_RELOC_MICROMIPS_10_PCREL_S1:
15133
      /* Return the address of the delay slot.  */
15134
      return addr + 2;
15135
 
15136
    case BFD_RELOC_MICROMIPS_16_PCREL_S1:
15137
    case BFD_RELOC_MICROMIPS_JMP:
15138 16 khays
    case BFD_RELOC_16_PCREL_S2:
15139
    case BFD_RELOC_MIPS_JMP:
15140
      /* Return the address of the delay slot.  */
15141
      return addr + 4;
15142 160 khays
 
15143 16 khays
    default:
15144
      /* We have no relocation type for PC relative MIPS16 instructions.  */
15145
      if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
15146
        as_bad_where (fixP->fx_file, fixP->fx_line,
15147
                      _("PC relative MIPS16 instruction references a different section"));
15148
      return addr;
15149
    }
15150
}
15151
 
15152
/* This is called before the symbol table is processed.  In order to
15153
   work with gcc when using mips-tfile, we must keep all local labels.
15154
   However, in other cases, we want to discard them.  If we were
15155
   called with -g, but we didn't see any debugging information, it may
15156
   mean that gcc is smuggling debugging information through to
15157
   mips-tfile, in which case we must generate all local labels.  */
15158
 
15159
void
15160
mips_frob_file_before_adjust (void)
15161
{
15162
#ifndef NO_ECOFF_DEBUGGING
15163
  if (ECOFF_DEBUGGING
15164
      && mips_debug != 0
15165
      && ! ecoff_debugging_seen)
15166
    flag_keep_locals = 1;
15167
#endif
15168
}
15169
 
15170
/* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
15171
   the corresponding LO16 reloc.  This is called before md_apply_fix and
15172
   tc_gen_reloc.  Unmatched relocs can only be generated by use of explicit
15173
   relocation operators.
15174
 
15175
   For our purposes, a %lo() expression matches a %got() or %hi()
15176
   expression if:
15177
 
15178
      (a) it refers to the same symbol; and
15179
      (b) the offset applied in the %lo() expression is no lower than
15180
          the offset applied in the %got() or %hi().
15181
 
15182
   (b) allows us to cope with code like:
15183
 
15184
        lui     $4,%hi(foo)
15185
        lh      $4,%lo(foo+2)($4)
15186
 
15187
   ...which is legal on RELA targets, and has a well-defined behaviour
15188
   if the user knows that adding 2 to "foo" will not induce a carry to
15189
   the high 16 bits.
15190
 
15191
   When several %lo()s match a particular %got() or %hi(), we use the
15192
   following rules to distinguish them:
15193
 
15194
     (1) %lo()s with smaller offsets are a better match than %lo()s with
15195
         higher offsets.
15196
 
15197
     (2) %lo()s with no matching %got() or %hi() are better than those
15198
         that already have a matching %got() or %hi().
15199
 
15200
     (3) later %lo()s are better than earlier %lo()s.
15201
 
15202
   These rules are applied in order.
15203
 
15204
   (1) means, among other things, that %lo()s with identical offsets are
15205
   chosen if they exist.
15206
 
15207
   (2) means that we won't associate several high-part relocations with
15208
   the same low-part relocation unless there's no alternative.  Having
15209
   several high parts for the same low part is a GNU extension; this rule
15210
   allows careful users to avoid it.
15211
 
15212
   (3) is purely cosmetic.  mips_hi_fixup_list is is in reverse order,
15213
   with the last high-part relocation being at the front of the list.
15214
   It therefore makes sense to choose the last matching low-part
15215
   relocation, all other things being equal.  It's also easier
15216
   to code that way.  */
15217
 
15218
void
15219
mips_frob_file (void)
15220
{
15221
  struct mips_hi_fixup *l;
15222
  bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
15223
 
15224
  for (l = mips_hi_fixup_list; l != NULL; l = l->next)
15225
    {
15226
      segment_info_type *seginfo;
15227
      bfd_boolean matched_lo_p;
15228
      fixS **hi_pos, **lo_pos, **pos;
15229
 
15230
      gas_assert (reloc_needs_lo_p (l->fixp->fx_r_type));
15231
 
15232
      /* If a GOT16 relocation turns out to be against a global symbol,
15233
         there isn't supposed to be a matching LO.  */
15234
      if (got16_reloc_p (l->fixp->fx_r_type)
15235
          && !pic_need_relax (l->fixp->fx_addsy, l->seg))
15236
        continue;
15237
 
15238
      /* Check quickly whether the next fixup happens to be a matching %lo.  */
15239
      if (fixup_has_matching_lo_p (l->fixp))
15240
        continue;
15241
 
15242
      seginfo = seg_info (l->seg);
15243
 
15244
      /* Set HI_POS to the position of this relocation in the chain.
15245
         Set LO_POS to the position of the chosen low-part relocation.
15246
         MATCHED_LO_P is true on entry to the loop if *POS is a low-part
15247
         relocation that matches an immediately-preceding high-part
15248
         relocation.  */
15249
      hi_pos = NULL;
15250
      lo_pos = NULL;
15251
      matched_lo_p = FALSE;
15252
      looking_for_rtype = matching_lo_reloc (l->fixp->fx_r_type);
15253
 
15254
      for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
15255
        {
15256
          if (*pos == l->fixp)
15257
            hi_pos = pos;
15258
 
15259
          if ((*pos)->fx_r_type == looking_for_rtype
15260
              && symbol_same_p ((*pos)->fx_addsy, l->fixp->fx_addsy)
15261
              && (*pos)->fx_offset >= l->fixp->fx_offset
15262
              && (lo_pos == NULL
15263
                  || (*pos)->fx_offset < (*lo_pos)->fx_offset
15264
                  || (!matched_lo_p
15265
                      && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
15266
            lo_pos = pos;
15267
 
15268
          matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
15269
                          && fixup_has_matching_lo_p (*pos));
15270
        }
15271
 
15272
      /* If we found a match, remove the high-part relocation from its
15273
         current position and insert it before the low-part relocation.
15274
         Make the offsets match so that fixup_has_matching_lo_p()
15275
         will return true.
15276
 
15277
         We don't warn about unmatched high-part relocations since some
15278
         versions of gcc have been known to emit dead "lui ...%hi(...)"
15279
         instructions.  */
15280
      if (lo_pos != NULL)
15281
        {
15282
          l->fixp->fx_offset = (*lo_pos)->fx_offset;
15283
          if (l->fixp->fx_next != *lo_pos)
15284
            {
15285
              *hi_pos = l->fixp->fx_next;
15286
              l->fixp->fx_next = *lo_pos;
15287
              *lo_pos = l->fixp;
15288
            }
15289
        }
15290
    }
15291
}
15292
 
15293
/* We may have combined relocations without symbols in the N32/N64 ABI.
15294
   We have to prevent gas from dropping them.  */
15295
 
15296
int
15297
mips_force_relocation (fixS *fixp)
15298
{
15299
  if (generic_force_reloc (fixp))
15300
    return 1;
15301
 
15302 160 khays
  /* We want to keep BFD_RELOC_MICROMIPS_*_PCREL_S1 relocation,
15303
     so that the linker relaxation can update targets.  */
15304
  if (fixp->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
15305
      || fixp->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
15306
      || fixp->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1)
15307
    return 1;
15308
 
15309 16 khays
  if (HAVE_NEWABI
15310
      && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
15311
      && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
15312
          || hi16_reloc_p (fixp->fx_r_type)
15313
          || lo16_reloc_p (fixp->fx_r_type)))
15314
    return 1;
15315
 
15316
  return 0;
15317
}
15318
 
15319
/* Apply a fixup to the object file.  */
15320
 
15321
void
15322
md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
15323
{
15324
  bfd_byte *buf;
15325
  long insn;
15326
  reloc_howto_type *howto;
15327
 
15328
  /* We ignore generic BFD relocations we don't know about.  */
15329
  howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
15330
  if (! howto)
15331
    return;
15332
 
15333 160 khays
  gas_assert (fixP->fx_size == 2
15334
              || fixP->fx_size == 4
15335 16 khays
              || fixP->fx_r_type == BFD_RELOC_16
15336
              || fixP->fx_r_type == BFD_RELOC_64
15337
              || fixP->fx_r_type == BFD_RELOC_CTOR
15338
              || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
15339 160 khays
              || fixP->fx_r_type == BFD_RELOC_MICROMIPS_SUB
15340 16 khays
              || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
15341
              || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
15342
              || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
15343
 
15344
  buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
15345
 
15346 160 khays
  gas_assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2
15347
              || fixP->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
15348
              || fixP->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
15349
              || fixP->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1);
15350 16 khays
 
15351
  /* Don't treat parts of a composite relocation as done.  There are two
15352
     reasons for this:
15353
 
15354
     (1) The second and third parts will be against 0 (RSS_UNDEF) but
15355
         should nevertheless be emitted if the first part is.
15356
 
15357
     (2) In normal usage, composite relocations are never assembly-time
15358
         constants.  The easiest way of dealing with the pathological
15359
         exceptions is to generate a relocation against STN_UNDEF and
15360
         leave everything up to the linker.  */
15361
  if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
15362
    fixP->fx_done = 1;
15363
 
15364
  switch (fixP->fx_r_type)
15365
    {
15366
    case BFD_RELOC_MIPS_TLS_GD:
15367
    case BFD_RELOC_MIPS_TLS_LDM:
15368
    case BFD_RELOC_MIPS_TLS_DTPREL32:
15369
    case BFD_RELOC_MIPS_TLS_DTPREL64:
15370
    case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
15371
    case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
15372
    case BFD_RELOC_MIPS_TLS_GOTTPREL:
15373
    case BFD_RELOC_MIPS_TLS_TPREL_HI16:
15374
    case BFD_RELOC_MIPS_TLS_TPREL_LO16:
15375 160 khays
    case BFD_RELOC_MICROMIPS_TLS_GD:
15376
    case BFD_RELOC_MICROMIPS_TLS_LDM:
15377
    case BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16:
15378
    case BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16:
15379
    case BFD_RELOC_MICROMIPS_TLS_GOTTPREL:
15380
    case BFD_RELOC_MICROMIPS_TLS_TPREL_HI16:
15381
    case BFD_RELOC_MICROMIPS_TLS_TPREL_LO16:
15382 16 khays
      S_SET_THREAD_LOCAL (fixP->fx_addsy);
15383
      /* fall through */
15384
 
15385
    case BFD_RELOC_MIPS_JMP:
15386
    case BFD_RELOC_MIPS_SHIFT5:
15387
    case BFD_RELOC_MIPS_SHIFT6:
15388
    case BFD_RELOC_MIPS_GOT_DISP:
15389
    case BFD_RELOC_MIPS_GOT_PAGE:
15390
    case BFD_RELOC_MIPS_GOT_OFST:
15391
    case BFD_RELOC_MIPS_SUB:
15392
    case BFD_RELOC_MIPS_INSERT_A:
15393
    case BFD_RELOC_MIPS_INSERT_B:
15394
    case BFD_RELOC_MIPS_DELETE:
15395
    case BFD_RELOC_MIPS_HIGHEST:
15396
    case BFD_RELOC_MIPS_HIGHER:
15397
    case BFD_RELOC_MIPS_SCN_DISP:
15398
    case BFD_RELOC_MIPS_REL16:
15399
    case BFD_RELOC_MIPS_RELGOT:
15400
    case BFD_RELOC_MIPS_JALR:
15401
    case BFD_RELOC_HI16:
15402
    case BFD_RELOC_HI16_S:
15403
    case BFD_RELOC_GPREL16:
15404
    case BFD_RELOC_MIPS_LITERAL:
15405
    case BFD_RELOC_MIPS_CALL16:
15406
    case BFD_RELOC_MIPS_GOT16:
15407
    case BFD_RELOC_GPREL32:
15408
    case BFD_RELOC_MIPS_GOT_HI16:
15409
    case BFD_RELOC_MIPS_GOT_LO16:
15410
    case BFD_RELOC_MIPS_CALL_HI16:
15411
    case BFD_RELOC_MIPS_CALL_LO16:
15412
    case BFD_RELOC_MIPS16_GPREL:
15413
    case BFD_RELOC_MIPS16_GOT16:
15414
    case BFD_RELOC_MIPS16_CALL16:
15415
    case BFD_RELOC_MIPS16_HI16:
15416
    case BFD_RELOC_MIPS16_HI16_S:
15417
    case BFD_RELOC_MIPS16_JMP:
15418 160 khays
    case BFD_RELOC_MICROMIPS_JMP:
15419
    case BFD_RELOC_MICROMIPS_GOT_DISP:
15420
    case BFD_RELOC_MICROMIPS_GOT_PAGE:
15421
    case BFD_RELOC_MICROMIPS_GOT_OFST:
15422
    case BFD_RELOC_MICROMIPS_SUB:
15423
    case BFD_RELOC_MICROMIPS_HIGHEST:
15424
    case BFD_RELOC_MICROMIPS_HIGHER:
15425
    case BFD_RELOC_MICROMIPS_SCN_DISP:
15426
    case BFD_RELOC_MICROMIPS_JALR:
15427
    case BFD_RELOC_MICROMIPS_HI16:
15428
    case BFD_RELOC_MICROMIPS_HI16_S:
15429
    case BFD_RELOC_MICROMIPS_GPREL16:
15430
    case BFD_RELOC_MICROMIPS_LITERAL:
15431
    case BFD_RELOC_MICROMIPS_CALL16:
15432
    case BFD_RELOC_MICROMIPS_GOT16:
15433
    case BFD_RELOC_MICROMIPS_GOT_HI16:
15434
    case BFD_RELOC_MICROMIPS_GOT_LO16:
15435
    case BFD_RELOC_MICROMIPS_CALL_HI16:
15436
    case BFD_RELOC_MICROMIPS_CALL_LO16:
15437 16 khays
      /* Nothing needed to do.  The value comes from the reloc entry.  */
15438
      break;
15439
 
15440
    case BFD_RELOC_64:
15441
      /* This is handled like BFD_RELOC_32, but we output a sign
15442
         extended value if we are only 32 bits.  */
15443
      if (fixP->fx_done)
15444
        {
15445
          if (8 <= sizeof (valueT))
15446
            md_number_to_chars ((char *) buf, *valP, 8);
15447
          else
15448
            {
15449
              valueT hiv;
15450
 
15451
              if ((*valP & 0x80000000) != 0)
15452
                hiv = 0xffffffff;
15453
              else
15454
                hiv = 0;
15455
              md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
15456
                                  *valP, 4);
15457
              md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
15458
                                  hiv, 4);
15459
            }
15460
        }
15461
      break;
15462
 
15463
    case BFD_RELOC_RVA:
15464
    case BFD_RELOC_32:
15465
    case BFD_RELOC_16:
15466
      /* If we are deleting this reloc entry, we must fill in the
15467
         value now.  This can happen if we have a .word which is not
15468
         resolved when it appears but is later defined.  */
15469
      if (fixP->fx_done)
15470
        md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
15471
      break;
15472
 
15473
    case BFD_RELOC_LO16:
15474
    case BFD_RELOC_MIPS16_LO16:
15475 160 khays
    case BFD_RELOC_MICROMIPS_LO16:
15476 16 khays
      /* FIXME: Now that embedded-PIC is gone, some of this code/comment
15477
         may be safe to remove, but if so it's not obvious.  */
15478
      /* When handling an embedded PIC switch statement, we can wind
15479
         up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
15480
      if (fixP->fx_done)
15481
        {
15482
          if (*valP + 0x8000 > 0xffff)
15483
            as_bad_where (fixP->fx_file, fixP->fx_line,
15484
                          _("relocation overflow"));
15485 160 khays
          /* 32-bit microMIPS instructions are divided into two halfwords.
15486
             Relocations always refer to the second halfword, regardless
15487
             of endianness.  */
15488
          if (target_big_endian || fixP->fx_r_type == BFD_RELOC_MICROMIPS_LO16)
15489 16 khays
            buf += 2;
15490
          md_number_to_chars ((char *) buf, *valP, 2);
15491
        }
15492
      break;
15493
 
15494
    case BFD_RELOC_16_PCREL_S2:
15495
      if ((*valP & 0x3) != 0)
15496
        as_bad_where (fixP->fx_file, fixP->fx_line,
15497
                      _("Branch to misaligned address (%lx)"), (long) *valP);
15498
 
15499
      /* We need to save the bits in the instruction since fixup_segment()
15500
         might be deleting the relocation entry (i.e., a branch within
15501
         the current segment).  */
15502
      if (! fixP->fx_done)
15503
        break;
15504
 
15505
      /* Update old instruction data.  */
15506
      if (target_big_endian)
15507
        insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
15508
      else
15509
        insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
15510
 
15511
      if (*valP + 0x20000 <= 0x3ffff)
15512
        {
15513
          insn |= (*valP >> 2) & 0xffff;
15514
          md_number_to_chars ((char *) buf, insn, 4);
15515
        }
15516
      else if (mips_pic == NO_PIC
15517
               && fixP->fx_done
15518
               && fixP->fx_frag->fr_address >= text_section->vma
15519
               && (fixP->fx_frag->fr_address
15520
                   < text_section->vma + bfd_get_section_size (text_section))
15521
               && ((insn & 0xffff0000) == 0x10000000     /* beq $0,$0 */
15522
                   || (insn & 0xffff0000) == 0x04010000  /* bgez $0 */
15523
                   || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
15524
        {
15525
          /* The branch offset is too large.  If this is an
15526
             unconditional branch, and we are not generating PIC code,
15527
             we can convert it to an absolute jump instruction.  */
15528
          if ((insn & 0xffff0000) == 0x04110000)         /* bgezal $0 */
15529
            insn = 0x0c000000;  /* jal */
15530
          else
15531
            insn = 0x08000000;  /* j */
15532
          fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
15533
          fixP->fx_done = 0;
15534
          fixP->fx_addsy = section_symbol (text_section);
15535
          *valP += md_pcrel_from (fixP);
15536
          md_number_to_chars ((char *) buf, insn, 4);
15537
        }
15538
      else
15539
        {
15540
          /* If we got here, we have branch-relaxation disabled,
15541
             and there's nothing we can do to fix this instruction
15542
             without turning it into a longer sequence.  */
15543
          as_bad_where (fixP->fx_file, fixP->fx_line,
15544
                        _("Branch out of range"));
15545
        }
15546
      break;
15547
 
15548 160 khays
    case BFD_RELOC_MICROMIPS_7_PCREL_S1:
15549
    case BFD_RELOC_MICROMIPS_10_PCREL_S1:
15550
    case BFD_RELOC_MICROMIPS_16_PCREL_S1:
15551
      /* We adjust the offset back to even.  */
15552
      if ((*valP & 0x1) != 0)
15553
        --(*valP);
15554
 
15555
      if (! fixP->fx_done)
15556
        break;
15557
 
15558
      /* Should never visit here, because we keep the relocation.  */
15559
      abort ();
15560
      break;
15561
 
15562 16 khays
    case BFD_RELOC_VTABLE_INHERIT:
15563
      fixP->fx_done = 0;
15564
      if (fixP->fx_addsy
15565
          && !S_IS_DEFINED (fixP->fx_addsy)
15566
          && !S_IS_WEAK (fixP->fx_addsy))
15567
        S_SET_WEAK (fixP->fx_addsy);
15568
      break;
15569
 
15570
    case BFD_RELOC_VTABLE_ENTRY:
15571
      fixP->fx_done = 0;
15572
      break;
15573
 
15574
    default:
15575
      internalError ();
15576
    }
15577
 
15578
  /* Remember value for tc_gen_reloc.  */
15579
  fixP->fx_addnumber = *valP;
15580
}
15581
 
15582
static symbolS *
15583
get_symbol (void)
15584
{
15585
  int c;
15586
  char *name;
15587
  symbolS *p;
15588
 
15589
  name = input_line_pointer;
15590
  c = get_symbol_end ();
15591
  p = (symbolS *) symbol_find_or_make (name);
15592
  *input_line_pointer = c;
15593
  return p;
15594
}
15595
 
15596
/* Align the current frag to a given power of two.  If a particular
15597
   fill byte should be used, FILL points to an integer that contains
15598
   that byte, otherwise FILL is null.
15599
 
15600
   The MIPS assembler also automatically adjusts any preceding
15601
   label.  */
15602
 
15603
static void
15604
mips_align (int to, int *fill, symbolS *label)
15605
{
15606
  mips_emit_delays ();
15607 160 khays
  mips_record_compressed_mode ();
15608 16 khays
  if (fill == NULL && subseg_text_p (now_seg))
15609
    frag_align_code (to, 0);
15610
  else
15611
    frag_align (to, fill ? *fill : 0, 0);
15612
  record_alignment (now_seg, to);
15613
  if (label != NULL)
15614
    {
15615
      gas_assert (S_GET_SEGMENT (label) == now_seg);
15616
      symbol_set_frag (label, frag_now);
15617
      S_SET_VALUE (label, (valueT) frag_now_fix ());
15618
    }
15619
}
15620
 
15621
/* Align to a given power of two.  .align 0 turns off the automatic
15622
   alignment used by the data creating pseudo-ops.  */
15623
 
15624
static void
15625
s_align (int x ATTRIBUTE_UNUSED)
15626
{
15627
  int temp, fill_value, *fill_ptr;
15628
  long max_alignment = 28;
15629
 
15630
  /* o Note that the assembler pulls down any immediately preceding label
15631
       to the aligned address.
15632
     o It's not documented but auto alignment is reinstated by
15633
       a .align pseudo instruction.
15634
     o Note also that after auto alignment is turned off the mips assembler
15635
       issues an error on attempt to assemble an improperly aligned data item.
15636
       We don't.  */
15637
 
15638
  temp = get_absolute_expression ();
15639
  if (temp > max_alignment)
15640
    as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
15641
  else if (temp < 0)
15642
    {
15643
      as_warn (_("Alignment negative: 0 assumed."));
15644
      temp = 0;
15645
    }
15646
  if (*input_line_pointer == ',')
15647
    {
15648
      ++input_line_pointer;
15649
      fill_value = get_absolute_expression ();
15650
      fill_ptr = &fill_value;
15651
    }
15652
  else
15653
    fill_ptr = 0;
15654
  if (temp)
15655
    {
15656
      segment_info_type *si = seg_info (now_seg);
15657
      struct insn_label_list *l = si->label_list;
15658
      /* Auto alignment should be switched on by next section change.  */
15659
      auto_align = 1;
15660
      mips_align (temp, fill_ptr, l != NULL ? l->label : NULL);
15661
    }
15662
  else
15663
    {
15664
      auto_align = 0;
15665
    }
15666
 
15667
  demand_empty_rest_of_line ();
15668
}
15669
 
15670
static void
15671
s_change_sec (int sec)
15672
{
15673
  segT seg;
15674
 
15675
#ifdef OBJ_ELF
15676
  /* The ELF backend needs to know that we are changing sections, so
15677
     that .previous works correctly.  We could do something like check
15678
     for an obj_section_change_hook macro, but that might be confusing
15679
     as it would not be appropriate to use it in the section changing
15680
     functions in read.c, since obj-elf.c intercepts those.  FIXME:
15681
     This should be cleaner, somehow.  */
15682
  if (IS_ELF)
15683
    obj_elf_section_change_hook ();
15684
#endif
15685
 
15686
  mips_emit_delays ();
15687
 
15688
  switch (sec)
15689
    {
15690
    case 't':
15691
      s_text (0);
15692
      break;
15693
    case 'd':
15694
      s_data (0);
15695
      break;
15696
    case 'b':
15697
      subseg_set (bss_section, (subsegT) get_absolute_expression ());
15698
      demand_empty_rest_of_line ();
15699
      break;
15700
 
15701
    case 'r':
15702
      seg = subseg_new (RDATA_SECTION_NAME,
15703
                        (subsegT) get_absolute_expression ());
15704
      if (IS_ELF)
15705
        {
15706
          bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
15707
                                                  | SEC_READONLY | SEC_RELOC
15708
                                                  | SEC_DATA));
15709
          if (strncmp (TARGET_OS, "elf", 3) != 0)
15710
            record_alignment (seg, 4);
15711
        }
15712
      demand_empty_rest_of_line ();
15713
      break;
15714
 
15715
    case 's':
15716
      seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
15717
      if (IS_ELF)
15718
        {
15719
          bfd_set_section_flags (stdoutput, seg,
15720
                                 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
15721
          if (strncmp (TARGET_OS, "elf", 3) != 0)
15722
            record_alignment (seg, 4);
15723
        }
15724
      demand_empty_rest_of_line ();
15725
      break;
15726
 
15727
    case 'B':
15728
      seg = subseg_new (".sbss", (subsegT) get_absolute_expression ());
15729
      if (IS_ELF)
15730
        {
15731
          bfd_set_section_flags (stdoutput, seg, SEC_ALLOC);
15732
          if (strncmp (TARGET_OS, "elf", 3) != 0)
15733
            record_alignment (seg, 4);
15734
        }
15735
      demand_empty_rest_of_line ();
15736
      break;
15737
    }
15738
 
15739
  auto_align = 1;
15740
}
15741
 
15742
void
15743
s_change_section (int ignore ATTRIBUTE_UNUSED)
15744
{
15745
#ifdef OBJ_ELF
15746
  char *section_name;
15747
  char c;
15748
  char next_c = 0;
15749
  int section_type;
15750
  int section_flag;
15751
  int section_entry_size;
15752
  int section_alignment;
15753
 
15754
  if (!IS_ELF)
15755
    return;
15756
 
15757
  section_name = input_line_pointer;
15758
  c = get_symbol_end ();
15759
  if (c)
15760
    next_c = *(input_line_pointer + 1);
15761
 
15762
  /* Do we have .section Name<,"flags">?  */
15763
  if (c != ',' || (c == ',' && next_c == '"'))
15764
    {
15765
      /* just after name is now '\0'.  */
15766
      *input_line_pointer = c;
15767
      input_line_pointer = section_name;
15768
      obj_elf_section (ignore);
15769
      return;
15770
    }
15771
  input_line_pointer++;
15772
 
15773
  /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
15774
  if (c == ',')
15775
    section_type = get_absolute_expression ();
15776
  else
15777
    section_type = 0;
15778
  if (*input_line_pointer++ == ',')
15779
    section_flag = get_absolute_expression ();
15780
  else
15781
    section_flag = 0;
15782
  if (*input_line_pointer++ == ',')
15783
    section_entry_size = get_absolute_expression ();
15784
  else
15785
    section_entry_size = 0;
15786
  if (*input_line_pointer++ == ',')
15787
    section_alignment = get_absolute_expression ();
15788
  else
15789
    section_alignment = 0;
15790
  /* FIXME: really ignore?  */
15791
  (void) section_alignment;
15792
 
15793
  section_name = xstrdup (section_name);
15794
 
15795
  /* When using the generic form of .section (as implemented by obj-elf.c),
15796
     there's no way to set the section type to SHT_MIPS_DWARF.  Users have
15797
     traditionally had to fall back on the more common @progbits instead.
15798
 
15799
     There's nothing really harmful in this, since bfd will correct
15800
     SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
15801
     means that, for backwards compatibility, the special_section entries
15802
     for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
15803
 
15804
     Even so, we shouldn't force users of the MIPS .section syntax to
15805
     incorrectly label the sections as SHT_PROGBITS.  The best compromise
15806
     seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
15807
     generic type-checking code.  */
15808
  if (section_type == SHT_MIPS_DWARF)
15809
    section_type = SHT_PROGBITS;
15810
 
15811
  obj_elf_change_section (section_name, section_type, section_flag,
15812
                          section_entry_size, 0, 0, 0);
15813
 
15814
  if (now_seg->name != section_name)
15815
    free (section_name);
15816
#endif /* OBJ_ELF */
15817
}
15818
 
15819
void
15820
mips_enable_auto_align (void)
15821
{
15822
  auto_align = 1;
15823
}
15824
 
15825
static void
15826
s_cons (int log_size)
15827
{
15828
  segment_info_type *si = seg_info (now_seg);
15829
  struct insn_label_list *l = si->label_list;
15830
  symbolS *label;
15831
 
15832
  label = l != NULL ? l->label : NULL;
15833
  mips_emit_delays ();
15834
  if (log_size > 0 && auto_align)
15835
    mips_align (log_size, 0, label);
15836
  cons (1 << log_size);
15837
  mips_clear_insn_labels ();
15838
}
15839
 
15840
static void
15841
s_float_cons (int type)
15842
{
15843
  segment_info_type *si = seg_info (now_seg);
15844
  struct insn_label_list *l = si->label_list;
15845
  symbolS *label;
15846
 
15847
  label = l != NULL ? l->label : NULL;
15848
 
15849
  mips_emit_delays ();
15850
 
15851
  if (auto_align)
15852
    {
15853
      if (type == 'd')
15854
        mips_align (3, 0, label);
15855
      else
15856
        mips_align (2, 0, label);
15857
    }
15858
 
15859
  float_cons (type);
15860
  mips_clear_insn_labels ();
15861
}
15862
 
15863
/* Handle .globl.  We need to override it because on Irix 5 you are
15864
   permitted to say
15865
       .globl foo .text
15866
   where foo is an undefined symbol, to mean that foo should be
15867
   considered to be the address of a function.  */
15868
 
15869
static void
15870
s_mips_globl (int x ATTRIBUTE_UNUSED)
15871
{
15872
  char *name;
15873
  int c;
15874
  symbolS *symbolP;
15875
  flagword flag;
15876
 
15877
  do
15878
    {
15879
      name = input_line_pointer;
15880
      c = get_symbol_end ();
15881
      symbolP = symbol_find_or_make (name);
15882
      S_SET_EXTERNAL (symbolP);
15883
 
15884
      *input_line_pointer = c;
15885
      SKIP_WHITESPACE ();
15886
 
15887
      /* On Irix 5, every global symbol that is not explicitly labelled as
15888
         being a function is apparently labelled as being an object.  */
15889
      flag = BSF_OBJECT;
15890
 
15891
      if (!is_end_of_line[(unsigned char) *input_line_pointer]
15892
          && (*input_line_pointer != ','))
15893
        {
15894
          char *secname;
15895
          asection *sec;
15896
 
15897
          secname = input_line_pointer;
15898
          c = get_symbol_end ();
15899
          sec = bfd_get_section_by_name (stdoutput, secname);
15900
          if (sec == NULL)
15901
            as_bad (_("%s: no such section"), secname);
15902
          *input_line_pointer = c;
15903
 
15904
          if (sec != NULL && (sec->flags & SEC_CODE) != 0)
15905
            flag = BSF_FUNCTION;
15906
        }
15907
 
15908
      symbol_get_bfdsym (symbolP)->flags |= flag;
15909
 
15910
      c = *input_line_pointer;
15911
      if (c == ',')
15912
        {
15913
          input_line_pointer++;
15914
          SKIP_WHITESPACE ();
15915
          if (is_end_of_line[(unsigned char) *input_line_pointer])
15916
            c = '\n';
15917
        }
15918
    }
15919
  while (c == ',');
15920
 
15921
  demand_empty_rest_of_line ();
15922
}
15923
 
15924
static void
15925
s_option (int x ATTRIBUTE_UNUSED)
15926
{
15927
  char *opt;
15928
  char c;
15929
 
15930
  opt = input_line_pointer;
15931
  c = get_symbol_end ();
15932
 
15933
  if (*opt == 'O')
15934
    {
15935
      /* FIXME: What does this mean?  */
15936
    }
15937
  else if (strncmp (opt, "pic", 3) == 0)
15938
    {
15939
      int i;
15940
 
15941
      i = atoi (opt + 3);
15942
      if (i == 0)
15943
        mips_pic = NO_PIC;
15944
      else if (i == 2)
15945
        {
15946
        mips_pic = SVR4_PIC;
15947
          mips_abicalls = TRUE;
15948
        }
15949
      else
15950
        as_bad (_(".option pic%d not supported"), i);
15951
 
15952
      if (mips_pic == SVR4_PIC)
15953
        {
15954
          if (g_switch_seen && g_switch_value != 0)
15955
            as_warn (_("-G may not be used with SVR4 PIC code"));
15956
          g_switch_value = 0;
15957
          bfd_set_gp_size (stdoutput, 0);
15958
        }
15959
    }
15960
  else
15961
    as_warn (_("Unrecognized option \"%s\""), opt);
15962
 
15963
  *input_line_pointer = c;
15964
  demand_empty_rest_of_line ();
15965
}
15966
 
15967
/* This structure is used to hold a stack of .set values.  */
15968
 
15969
struct mips_option_stack
15970
{
15971
  struct mips_option_stack *next;
15972
  struct mips_set_options options;
15973
};
15974
 
15975
static struct mips_option_stack *mips_opts_stack;
15976
 
15977
/* Handle the .set pseudo-op.  */
15978
 
15979
static void
15980
s_mipsset (int x ATTRIBUTE_UNUSED)
15981
{
15982
  char *name = input_line_pointer, ch;
15983
 
15984
  while (!is_end_of_line[(unsigned char) *input_line_pointer])
15985
    ++input_line_pointer;
15986
  ch = *input_line_pointer;
15987
  *input_line_pointer = '\0';
15988
 
15989
  if (strcmp (name, "reorder") == 0)
15990
    {
15991
      if (mips_opts.noreorder)
15992
        end_noreorder ();
15993
    }
15994
  else if (strcmp (name, "noreorder") == 0)
15995
    {
15996
      if (!mips_opts.noreorder)
15997
        start_noreorder ();
15998
    }
15999
  else if (strncmp (name, "at=", 3) == 0)
16000
    {
16001
      char *s = name + 3;
16002
 
16003
      if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
16004
        as_bad (_("Unrecognized register name `%s'"), s);
16005
    }
16006
  else if (strcmp (name, "at") == 0)
16007
    {
16008
      mips_opts.at = ATREG;
16009
    }
16010
  else if (strcmp (name, "noat") == 0)
16011
    {
16012
      mips_opts.at = ZERO;
16013
    }
16014
  else if (strcmp (name, "macro") == 0)
16015
    {
16016
      mips_opts.warn_about_macros = 0;
16017
    }
16018
  else if (strcmp (name, "nomacro") == 0)
16019
    {
16020
      if (mips_opts.noreorder == 0)
16021
        as_bad (_("`noreorder' must be set before `nomacro'"));
16022
      mips_opts.warn_about_macros = 1;
16023
    }
16024
  else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
16025
    {
16026
      mips_opts.nomove = 0;
16027
    }
16028
  else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
16029
    {
16030
      mips_opts.nomove = 1;
16031
    }
16032
  else if (strcmp (name, "bopt") == 0)
16033
    {
16034
      mips_opts.nobopt = 0;
16035
    }
16036
  else if (strcmp (name, "nobopt") == 0)
16037
    {
16038
      mips_opts.nobopt = 1;
16039
    }
16040
  else if (strcmp (name, "gp=default") == 0)
16041
    mips_opts.gp32 = file_mips_gp32;
16042
  else if (strcmp (name, "gp=32") == 0)
16043
    mips_opts.gp32 = 1;
16044
  else if (strcmp (name, "gp=64") == 0)
16045
    {
16046
      if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
16047
        as_warn (_("%s isa does not support 64-bit registers"),
16048
                 mips_cpu_info_from_isa (mips_opts.isa)->name);
16049
      mips_opts.gp32 = 0;
16050
    }
16051
  else if (strcmp (name, "fp=default") == 0)
16052
    mips_opts.fp32 = file_mips_fp32;
16053
  else if (strcmp (name, "fp=32") == 0)
16054
    mips_opts.fp32 = 1;
16055
  else if (strcmp (name, "fp=64") == 0)
16056
    {
16057
      if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
16058
        as_warn (_("%s isa does not support 64-bit floating point registers"),
16059
                 mips_cpu_info_from_isa (mips_opts.isa)->name);
16060
      mips_opts.fp32 = 0;
16061
    }
16062
  else if (strcmp (name, "softfloat") == 0)
16063
    mips_opts.soft_float = 1;
16064
  else if (strcmp (name, "hardfloat") == 0)
16065
    mips_opts.soft_float = 0;
16066
  else if (strcmp (name, "singlefloat") == 0)
16067
    mips_opts.single_float = 1;
16068
  else if (strcmp (name, "doublefloat") == 0)
16069
    mips_opts.single_float = 0;
16070
  else if (strcmp (name, "mips16") == 0
16071
           || strcmp (name, "MIPS-16") == 0)
16072 160 khays
    {
16073
      if (mips_opts.micromips == 1)
16074
        as_fatal (_("`mips16' cannot be used with `micromips'"));
16075
      mips_opts.mips16 = 1;
16076
    }
16077 16 khays
  else if (strcmp (name, "nomips16") == 0
16078
           || strcmp (name, "noMIPS-16") == 0)
16079
    mips_opts.mips16 = 0;
16080 160 khays
  else if (strcmp (name, "micromips") == 0)
16081
    {
16082
      if (mips_opts.mips16 == 1)
16083
        as_fatal (_("`micromips' cannot be used with `mips16'"));
16084
      mips_opts.micromips = 1;
16085
    }
16086
  else if (strcmp (name, "nomicromips") == 0)
16087
    mips_opts.micromips = 0;
16088 16 khays
  else if (strcmp (name, "smartmips") == 0)
16089
    {
16090
      if (!ISA_SUPPORTS_SMARTMIPS)
16091
        as_warn (_("%s ISA does not support SmartMIPS ASE"),
16092
                 mips_cpu_info_from_isa (mips_opts.isa)->name);
16093
      mips_opts.ase_smartmips = 1;
16094
    }
16095
  else if (strcmp (name, "nosmartmips") == 0)
16096
    mips_opts.ase_smartmips = 0;
16097
  else if (strcmp (name, "mips3d") == 0)
16098
    mips_opts.ase_mips3d = 1;
16099
  else if (strcmp (name, "nomips3d") == 0)
16100
    mips_opts.ase_mips3d = 0;
16101
  else if (strcmp (name, "mdmx") == 0)
16102
    mips_opts.ase_mdmx = 1;
16103
  else if (strcmp (name, "nomdmx") == 0)
16104
    mips_opts.ase_mdmx = 0;
16105
  else if (strcmp (name, "dsp") == 0)
16106
    {
16107
      if (!ISA_SUPPORTS_DSP_ASE)
16108
        as_warn (_("%s ISA does not support DSP ASE"),
16109
                 mips_cpu_info_from_isa (mips_opts.isa)->name);
16110
      mips_opts.ase_dsp = 1;
16111
      mips_opts.ase_dspr2 = 0;
16112
    }
16113
  else if (strcmp (name, "nodsp") == 0)
16114
    {
16115
      mips_opts.ase_dsp = 0;
16116
      mips_opts.ase_dspr2 = 0;
16117
    }
16118
  else if (strcmp (name, "dspr2") == 0)
16119
    {
16120
      if (!ISA_SUPPORTS_DSPR2_ASE)
16121
        as_warn (_("%s ISA does not support DSP R2 ASE"),
16122
                 mips_cpu_info_from_isa (mips_opts.isa)->name);
16123
      mips_opts.ase_dspr2 = 1;
16124
      mips_opts.ase_dsp = 1;
16125
    }
16126
  else if (strcmp (name, "nodspr2") == 0)
16127
    {
16128
      mips_opts.ase_dspr2 = 0;
16129
      mips_opts.ase_dsp = 0;
16130
    }
16131
  else if (strcmp (name, "mt") == 0)
16132
    {
16133
      if (!ISA_SUPPORTS_MT_ASE)
16134
        as_warn (_("%s ISA does not support MT ASE"),
16135
                 mips_cpu_info_from_isa (mips_opts.isa)->name);
16136
      mips_opts.ase_mt = 1;
16137
    }
16138
  else if (strcmp (name, "nomt") == 0)
16139
    mips_opts.ase_mt = 0;
16140 160 khays
  else if (strcmp (name, "mcu") == 0)
16141
    mips_opts.ase_mcu = 1;
16142
  else if (strcmp (name, "nomcu") == 0)
16143
    mips_opts.ase_mcu = 0;
16144 16 khays
  else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
16145
    {
16146
      int reset = 0;
16147
 
16148
      /* Permit the user to change the ISA and architecture on the fly.
16149
         Needless to say, misuse can cause serious problems.  */
16150
      if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
16151
        {
16152
          reset = 1;
16153
          mips_opts.isa = file_mips_isa;
16154
          mips_opts.arch = file_mips_arch;
16155
        }
16156
      else if (strncmp (name, "arch=", 5) == 0)
16157
        {
16158
          const struct mips_cpu_info *p;
16159
 
16160
          p = mips_parse_cpu("internal use", name + 5);
16161
          if (!p)
16162
            as_bad (_("unknown architecture %s"), name + 5);
16163
          else
16164
            {
16165
              mips_opts.arch = p->cpu;
16166
              mips_opts.isa = p->isa;
16167
            }
16168
        }
16169
      else if (strncmp (name, "mips", 4) == 0)
16170
        {
16171
          const struct mips_cpu_info *p;
16172
 
16173
          p = mips_parse_cpu("internal use", name);
16174
          if (!p)
16175
            as_bad (_("unknown ISA level %s"), name + 4);
16176
          else
16177
            {
16178
              mips_opts.arch = p->cpu;
16179
              mips_opts.isa = p->isa;
16180
            }
16181
        }
16182
      else
16183
        as_bad (_("unknown ISA or architecture %s"), name);
16184
 
16185
      switch (mips_opts.isa)
16186
        {
16187
        case  0:
16188
          break;
16189
        case ISA_MIPS1:
16190
        case ISA_MIPS2:
16191
        case ISA_MIPS32:
16192
        case ISA_MIPS32R2:
16193
          mips_opts.gp32 = 1;
16194
          mips_opts.fp32 = 1;
16195
          break;
16196
        case ISA_MIPS3:
16197
        case ISA_MIPS4:
16198
        case ISA_MIPS5:
16199
        case ISA_MIPS64:
16200
        case ISA_MIPS64R2:
16201
          mips_opts.gp32 = 0;
16202
          mips_opts.fp32 = 0;
16203
          break;
16204
        default:
16205
          as_bad (_("unknown ISA level %s"), name + 4);
16206
          break;
16207
        }
16208
      if (reset)
16209
        {
16210
          mips_opts.gp32 = file_mips_gp32;
16211
          mips_opts.fp32 = file_mips_fp32;
16212
        }
16213
    }
16214
  else if (strcmp (name, "autoextend") == 0)
16215
    mips_opts.noautoextend = 0;
16216
  else if (strcmp (name, "noautoextend") == 0)
16217
    mips_opts.noautoextend = 1;
16218
  else if (strcmp (name, "push") == 0)
16219
    {
16220
      struct mips_option_stack *s;
16221
 
16222
      s = (struct mips_option_stack *) xmalloc (sizeof *s);
16223
      s->next = mips_opts_stack;
16224
      s->options = mips_opts;
16225
      mips_opts_stack = s;
16226
    }
16227
  else if (strcmp (name, "pop") == 0)
16228
    {
16229
      struct mips_option_stack *s;
16230
 
16231
      s = mips_opts_stack;
16232
      if (s == NULL)
16233
        as_bad (_(".set pop with no .set push"));
16234
      else
16235
        {
16236
          /* If we're changing the reorder mode we need to handle
16237
             delay slots correctly.  */
16238
          if (s->options.noreorder && ! mips_opts.noreorder)
16239
            start_noreorder ();
16240
          else if (! s->options.noreorder && mips_opts.noreorder)
16241
            end_noreorder ();
16242
 
16243
          mips_opts = s->options;
16244
          mips_opts_stack = s->next;
16245
          free (s);
16246
        }
16247
    }
16248
  else if (strcmp (name, "sym32") == 0)
16249
    mips_opts.sym32 = TRUE;
16250
  else if (strcmp (name, "nosym32") == 0)
16251
    mips_opts.sym32 = FALSE;
16252
  else if (strchr (name, ','))
16253
    {
16254
      /* Generic ".set" directive; use the generic handler.  */
16255
      *input_line_pointer = ch;
16256
      input_line_pointer = name;
16257
      s_set (0);
16258
      return;
16259
    }
16260
  else
16261
    {
16262
      as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
16263
    }
16264
  *input_line_pointer = ch;
16265
  demand_empty_rest_of_line ();
16266
}
16267
 
16268
/* Handle the .abicalls pseudo-op.  I believe this is equivalent to
16269
   .option pic2.  It means to generate SVR4 PIC calls.  */
16270
 
16271
static void
16272
s_abicalls (int ignore ATTRIBUTE_UNUSED)
16273
{
16274
  mips_pic = SVR4_PIC;
16275
  mips_abicalls = TRUE;
16276
 
16277
  if (g_switch_seen && g_switch_value != 0)
16278
    as_warn (_("-G may not be used with SVR4 PIC code"));
16279
  g_switch_value = 0;
16280
 
16281
  bfd_set_gp_size (stdoutput, 0);
16282
  demand_empty_rest_of_line ();
16283
}
16284
 
16285
/* Handle the .cpload pseudo-op.  This is used when generating SVR4
16286
   PIC code.  It sets the $gp register for the function based on the
16287
   function address, which is in the register named in the argument.
16288
   This uses a relocation against _gp_disp, which is handled specially
16289
   by the linker.  The result is:
16290
        lui     $gp,%hi(_gp_disp)
16291
        addiu   $gp,$gp,%lo(_gp_disp)
16292
        addu    $gp,$gp,.cpload argument
16293
   The .cpload argument is normally $25 == $t9.
16294
 
16295
   The -mno-shared option changes this to:
16296
        lui     $gp,%hi(__gnu_local_gp)
16297
        addiu   $gp,$gp,%lo(__gnu_local_gp)
16298
   and the argument is ignored.  This saves an instruction, but the
16299
   resulting code is not position independent; it uses an absolute
16300
   address for __gnu_local_gp.  Thus code assembled with -mno-shared
16301
   can go into an ordinary executable, but not into a shared library.  */
16302
 
16303
static void
16304
s_cpload (int ignore ATTRIBUTE_UNUSED)
16305
{
16306
  expressionS ex;
16307
  int reg;
16308
  int in_shared;
16309
 
16310
  /* If we are not generating SVR4 PIC code, or if this is NewABI code,
16311
     .cpload is ignored.  */
16312
  if (mips_pic != SVR4_PIC || HAVE_NEWABI)
16313
    {
16314
      s_ignore (0);
16315
      return;
16316
    }
16317
 
16318
  /* .cpload should be in a .set noreorder section.  */
16319
  if (mips_opts.noreorder == 0)
16320
    as_warn (_(".cpload not in noreorder section"));
16321
 
16322
  reg = tc_get_register (0);
16323
 
16324
  /* If we need to produce a 64-bit address, we are better off using
16325
     the default instruction sequence.  */
16326
  in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
16327
 
16328
  ex.X_op = O_symbol;
16329
  ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
16330
                                         "__gnu_local_gp");
16331
  ex.X_op_symbol = NULL;
16332
  ex.X_add_number = 0;
16333
 
16334
  /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
16335
  symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
16336
 
16337
  macro_start ();
16338
  macro_build_lui (&ex, mips_gp_register);
16339
  macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
16340
               mips_gp_register, BFD_RELOC_LO16);
16341
  if (in_shared)
16342
    macro_build (NULL, "addu", "d,v,t", mips_gp_register,
16343
                 mips_gp_register, reg);
16344
  macro_end ();
16345
 
16346
  demand_empty_rest_of_line ();
16347
}
16348
 
16349
/* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
16350
     .cpsetup $reg1, offset|$reg2, label
16351
 
16352
   If offset is given, this results in:
16353
     sd         $gp, offset($sp)
16354
     lui        $gp, %hi(%neg(%gp_rel(label)))
16355
     addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
16356
     daddu      $gp, $gp, $reg1
16357
 
16358
   If $reg2 is given, this results in:
16359
     daddu      $reg2, $gp, $0
16360
     lui        $gp, %hi(%neg(%gp_rel(label)))
16361
     addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
16362
     daddu      $gp, $gp, $reg1
16363
   $reg1 is normally $25 == $t9.
16364
 
16365
   The -mno-shared option replaces the last three instructions with
16366
        lui     $gp,%hi(_gp)
16367
        addiu   $gp,$gp,%lo(_gp)  */
16368
 
16369
static void
16370
s_cpsetup (int ignore ATTRIBUTE_UNUSED)
16371
{
16372
  expressionS ex_off;
16373
  expressionS ex_sym;
16374
  int reg1;
16375
 
16376
  /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
16377
     We also need NewABI support.  */
16378
  if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16379
    {
16380
      s_ignore (0);
16381
      return;
16382
    }
16383
 
16384
  reg1 = tc_get_register (0);
16385
  SKIP_WHITESPACE ();
16386
  if (*input_line_pointer != ',')
16387
    {
16388
      as_bad (_("missing argument separator ',' for .cpsetup"));
16389
      return;
16390
    }
16391
  else
16392
    ++input_line_pointer;
16393
  SKIP_WHITESPACE ();
16394
  if (*input_line_pointer == '$')
16395
    {
16396
      mips_cpreturn_register = tc_get_register (0);
16397
      mips_cpreturn_offset = -1;
16398
    }
16399
  else
16400
    {
16401
      mips_cpreturn_offset = get_absolute_expression ();
16402
      mips_cpreturn_register = -1;
16403
    }
16404
  SKIP_WHITESPACE ();
16405
  if (*input_line_pointer != ',')
16406
    {
16407
      as_bad (_("missing argument separator ',' for .cpsetup"));
16408
      return;
16409
    }
16410
  else
16411
    ++input_line_pointer;
16412
  SKIP_WHITESPACE ();
16413
  expression (&ex_sym);
16414
 
16415
  macro_start ();
16416
  if (mips_cpreturn_register == -1)
16417
    {
16418
      ex_off.X_op = O_constant;
16419
      ex_off.X_add_symbol = NULL;
16420
      ex_off.X_op_symbol = NULL;
16421
      ex_off.X_add_number = mips_cpreturn_offset;
16422
 
16423
      macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
16424
                   BFD_RELOC_LO16, SP);
16425
    }
16426
  else
16427
    macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
16428
                 mips_gp_register, 0);
16429
 
16430
  if (mips_in_shared || HAVE_64BIT_SYMBOLS)
16431
    {
16432 160 khays
      macro_build (&ex_sym, "lui", LUI_FMT, mips_gp_register,
16433 16 khays
                   -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
16434
                   BFD_RELOC_HI16_S);
16435
 
16436
      macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
16437
                   mips_gp_register, -1, BFD_RELOC_GPREL16,
16438
                   BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
16439
 
16440
      macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
16441
                   mips_gp_register, reg1);
16442
    }
16443
  else
16444
    {
16445
      expressionS ex;
16446
 
16447
      ex.X_op = O_symbol;
16448
      ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
16449
      ex.X_op_symbol = NULL;
16450
      ex.X_add_number = 0;
16451
 
16452
      /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
16453
      symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
16454
 
16455
      macro_build_lui (&ex, mips_gp_register);
16456
      macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
16457
                   mips_gp_register, BFD_RELOC_LO16);
16458
    }
16459
 
16460
  macro_end ();
16461
 
16462
  demand_empty_rest_of_line ();
16463
}
16464
 
16465
static void
16466
s_cplocal (int ignore ATTRIBUTE_UNUSED)
16467
{
16468
  /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
16469
     .cplocal is ignored.  */
16470
  if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16471
    {
16472
      s_ignore (0);
16473
      return;
16474
    }
16475
 
16476
  mips_gp_register = tc_get_register (0);
16477
  demand_empty_rest_of_line ();
16478
}
16479
 
16480
/* Handle the .cprestore pseudo-op.  This stores $gp into a given
16481
   offset from $sp.  The offset is remembered, and after making a PIC
16482
   call $gp is restored from that location.  */
16483
 
16484
static void
16485
s_cprestore (int ignore ATTRIBUTE_UNUSED)
16486
{
16487
  expressionS ex;
16488
 
16489
  /* If we are not generating SVR4 PIC code, or if this is NewABI code,
16490
     .cprestore is ignored.  */
16491
  if (mips_pic != SVR4_PIC || HAVE_NEWABI)
16492
    {
16493
      s_ignore (0);
16494
      return;
16495
    }
16496
 
16497
  mips_cprestore_offset = get_absolute_expression ();
16498
  mips_cprestore_valid = 1;
16499
 
16500
  ex.X_op = O_constant;
16501
  ex.X_add_symbol = NULL;
16502
  ex.X_op_symbol = NULL;
16503
  ex.X_add_number = mips_cprestore_offset;
16504
 
16505
  macro_start ();
16506
  macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
16507
                                SP, HAVE_64BIT_ADDRESSES);
16508
  macro_end ();
16509
 
16510
  demand_empty_rest_of_line ();
16511
}
16512
 
16513
/* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
16514
   was given in the preceding .cpsetup, it results in:
16515
     ld         $gp, offset($sp)
16516
 
16517
   If a register $reg2 was given there, it results in:
16518
     daddu      $gp, $reg2, $0  */
16519
 
16520
static void
16521
s_cpreturn (int ignore ATTRIBUTE_UNUSED)
16522
{
16523
  expressionS ex;
16524
 
16525
  /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
16526
     We also need NewABI support.  */
16527
  if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16528
    {
16529
      s_ignore (0);
16530
      return;
16531
    }
16532
 
16533
  macro_start ();
16534
  if (mips_cpreturn_register == -1)
16535
    {
16536
      ex.X_op = O_constant;
16537
      ex.X_add_symbol = NULL;
16538
      ex.X_op_symbol = NULL;
16539
      ex.X_add_number = mips_cpreturn_offset;
16540
 
16541
      macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
16542
    }
16543
  else
16544
    macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
16545
                 mips_cpreturn_register, 0);
16546
  macro_end ();
16547
 
16548
  demand_empty_rest_of_line ();
16549
}
16550
 
16551
/* Handle the .dtprelword and .dtpreldword pseudo-ops.  They generate
16552
   a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
16553
   use in DWARF debug information.  */
16554
 
16555
static void
16556
s_dtprel_internal (size_t bytes)
16557
{
16558
  expressionS ex;
16559
  char *p;
16560
 
16561
  expression (&ex);
16562
 
16563
  if (ex.X_op != O_symbol)
16564
    {
16565
      as_bad (_("Unsupported use of %s"), (bytes == 8
16566
                                           ? ".dtpreldword"
16567
                                           : ".dtprelword"));
16568
      ignore_rest_of_line ();
16569
    }
16570
 
16571
  p = frag_more (bytes);
16572
  md_number_to_chars (p, 0, bytes);
16573
  fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
16574
               (bytes == 8
16575
                ? BFD_RELOC_MIPS_TLS_DTPREL64
16576
                : BFD_RELOC_MIPS_TLS_DTPREL32));
16577
 
16578
  demand_empty_rest_of_line ();
16579
}
16580
 
16581
/* Handle .dtprelword.  */
16582
 
16583
static void
16584
s_dtprelword (int ignore ATTRIBUTE_UNUSED)
16585
{
16586
  s_dtprel_internal (4);
16587
}
16588
 
16589
/* Handle .dtpreldword.  */
16590
 
16591
static void
16592
s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
16593
{
16594
  s_dtprel_internal (8);
16595
}
16596
 
16597
/* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
16598
   code.  It sets the offset to use in gp_rel relocations.  */
16599
 
16600
static void
16601
s_gpvalue (int ignore ATTRIBUTE_UNUSED)
16602
{
16603
  /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
16604
     We also need NewABI support.  */
16605
  if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
16606
    {
16607
      s_ignore (0);
16608
      return;
16609
    }
16610
 
16611
  mips_gprel_offset = get_absolute_expression ();
16612
 
16613
  demand_empty_rest_of_line ();
16614
}
16615
 
16616
/* Handle the .gpword pseudo-op.  This is used when generating PIC
16617
   code.  It generates a 32 bit GP relative reloc.  */
16618
 
16619
static void
16620
s_gpword (int ignore ATTRIBUTE_UNUSED)
16621
{
16622
  segment_info_type *si;
16623
  struct insn_label_list *l;
16624
  symbolS *label;
16625
  expressionS ex;
16626
  char *p;
16627
 
16628
  /* When not generating PIC code, this is treated as .word.  */
16629
  if (mips_pic != SVR4_PIC)
16630
    {
16631
      s_cons (2);
16632
      return;
16633
    }
16634
 
16635
  si = seg_info (now_seg);
16636
  l = si->label_list;
16637
  label = l != NULL ? l->label : NULL;
16638
  mips_emit_delays ();
16639
  if (auto_align)
16640
    mips_align (2, 0, label);
16641
 
16642
  expression (&ex);
16643
  mips_clear_insn_labels ();
16644
 
16645
  if (ex.X_op != O_symbol || ex.X_add_number != 0)
16646
    {
16647
      as_bad (_("Unsupported use of .gpword"));
16648
      ignore_rest_of_line ();
16649
    }
16650
 
16651
  p = frag_more (4);
16652
  md_number_to_chars (p, 0, 4);
16653
  fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
16654
               BFD_RELOC_GPREL32);
16655
 
16656
  demand_empty_rest_of_line ();
16657
}
16658
 
16659
static void
16660
s_gpdword (int ignore ATTRIBUTE_UNUSED)
16661
{
16662
  segment_info_type *si;
16663
  struct insn_label_list *l;
16664
  symbolS *label;
16665
  expressionS ex;
16666
  char *p;
16667
 
16668
  /* When not generating PIC code, this is treated as .dword.  */
16669
  if (mips_pic != SVR4_PIC)
16670
    {
16671
      s_cons (3);
16672
      return;
16673
    }
16674
 
16675
  si = seg_info (now_seg);
16676
  l = si->label_list;
16677
  label = l != NULL ? l->label : NULL;
16678
  mips_emit_delays ();
16679
  if (auto_align)
16680
    mips_align (3, 0, label);
16681
 
16682
  expression (&ex);
16683
  mips_clear_insn_labels ();
16684
 
16685
  if (ex.X_op != O_symbol || ex.X_add_number != 0)
16686
    {
16687
      as_bad (_("Unsupported use of .gpdword"));
16688
      ignore_rest_of_line ();
16689
    }
16690
 
16691
  p = frag_more (8);
16692
  md_number_to_chars (p, 0, 8);
16693
  fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
16694
               BFD_RELOC_GPREL32)->fx_tcbit = 1;
16695
 
16696
  /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
16697
  fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
16698
           FALSE, BFD_RELOC_64)->fx_tcbit = 1;
16699
 
16700
  demand_empty_rest_of_line ();
16701
}
16702
 
16703
/* Handle the .cpadd pseudo-op.  This is used when dealing with switch
16704
   tables in SVR4 PIC code.  */
16705
 
16706
static void
16707
s_cpadd (int ignore ATTRIBUTE_UNUSED)
16708
{
16709
  int reg;
16710
 
16711
  /* This is ignored when not generating SVR4 PIC code.  */
16712
  if (mips_pic != SVR4_PIC)
16713
    {
16714
      s_ignore (0);
16715
      return;
16716
    }
16717
 
16718
  /* Add $gp to the register named as an argument.  */
16719
  macro_start ();
16720
  reg = tc_get_register (0);
16721
  macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
16722
  macro_end ();
16723
 
16724
  demand_empty_rest_of_line ();
16725
}
16726
 
16727
/* Handle the .insn pseudo-op.  This marks instruction labels in
16728 160 khays
   mips16/micromips mode.  This permits the linker to handle them specially,
16729 16 khays
   such as generating jalx instructions when needed.  We also make
16730
   them odd for the duration of the assembly, in order to generate the
16731
   right sort of code.  We will make them even in the adjust_symtab
16732
   routine, while leaving them marked.  This is convenient for the
16733
   debugger and the disassembler.  The linker knows to make them odd
16734
   again.  */
16735
 
16736
static void
16737
s_insn (int ignore ATTRIBUTE_UNUSED)
16738
{
16739 160 khays
  mips_mark_labels ();
16740 16 khays
 
16741
  demand_empty_rest_of_line ();
16742
}
16743
 
16744
/* Handle a .stabn directive.  We need these in order to mark a label
16745
   as being a mips16 text label correctly.  Sometimes the compiler
16746
   will emit a label, followed by a .stabn, and then switch sections.
16747
   If the label and .stabn are in mips16 mode, then the label is
16748
   really a mips16 text label.  */
16749
 
16750
static void
16751
s_mips_stab (int type)
16752
{
16753
  if (type == 'n')
16754 160 khays
    mips_mark_labels ();
16755 16 khays
 
16756
  s_stab (type);
16757
}
16758
 
16759
/* Handle the .weakext pseudo-op as defined in Kane and Heinrich.  */
16760
 
16761
static void
16762
s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
16763
{
16764
  char *name;
16765
  int c;
16766
  symbolS *symbolP;
16767
  expressionS exp;
16768
 
16769
  name = input_line_pointer;
16770
  c = get_symbol_end ();
16771
  symbolP = symbol_find_or_make (name);
16772
  S_SET_WEAK (symbolP);
16773
  *input_line_pointer = c;
16774
 
16775
  SKIP_WHITESPACE ();
16776
 
16777
  if (! is_end_of_line[(unsigned char) *input_line_pointer])
16778
    {
16779
      if (S_IS_DEFINED (symbolP))
16780
        {
16781
          as_bad (_("ignoring attempt to redefine symbol %s"),
16782
                  S_GET_NAME (symbolP));
16783
          ignore_rest_of_line ();
16784
          return;
16785
        }
16786
 
16787
      if (*input_line_pointer == ',')
16788
        {
16789
          ++input_line_pointer;
16790
          SKIP_WHITESPACE ();
16791
        }
16792
 
16793
      expression (&exp);
16794
      if (exp.X_op != O_symbol)
16795
        {
16796
          as_bad (_("bad .weakext directive"));
16797
          ignore_rest_of_line ();
16798
          return;
16799
        }
16800
      symbol_set_value_expression (symbolP, &exp);
16801
    }
16802
 
16803
  demand_empty_rest_of_line ();
16804
}
16805
 
16806
/* Parse a register string into a number.  Called from the ECOFF code
16807
   to parse .frame.  The argument is non-zero if this is the frame
16808
   register, so that we can record it in mips_frame_reg.  */
16809
 
16810
int
16811
tc_get_register (int frame)
16812
{
16813
  unsigned int reg;
16814
 
16815
  SKIP_WHITESPACE ();
16816
  if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
16817
    reg = 0;
16818
  if (frame)
16819
    {
16820
      mips_frame_reg = reg != 0 ? reg : SP;
16821
      mips_frame_reg_valid = 1;
16822
      mips_cprestore_valid = 0;
16823
    }
16824
  return reg;
16825
}
16826
 
16827
valueT
16828
md_section_align (asection *seg, valueT addr)
16829
{
16830
  int align = bfd_get_section_alignment (stdoutput, seg);
16831
 
16832
  if (IS_ELF)
16833
    {
16834
      /* We don't need to align ELF sections to the full alignment.
16835
         However, Irix 5 may prefer that we align them at least to a 16
16836
         byte boundary.  We don't bother to align the sections if we
16837
         are targeted for an embedded system.  */
16838
      if (strncmp (TARGET_OS, "elf", 3) == 0)
16839
        return addr;
16840
      if (align > 4)
16841
        align = 4;
16842
    }
16843
 
16844
  return ((addr + (1 << align) - 1) & (-1 << align));
16845
}
16846
 
16847
/* Utility routine, called from above as well.  If called while the
16848
   input file is still being read, it's only an approximation.  (For
16849
   example, a symbol may later become defined which appeared to be
16850
   undefined earlier.)  */
16851
 
16852
static int
16853
nopic_need_relax (symbolS *sym, int before_relaxing)
16854
{
16855
  if (sym == 0)
16856
    return 0;
16857
 
16858
  if (g_switch_value > 0)
16859
    {
16860
      const char *symname;
16861
      int change;
16862
 
16863
      /* Find out whether this symbol can be referenced off the $gp
16864
         register.  It can be if it is smaller than the -G size or if
16865
         it is in the .sdata or .sbss section.  Certain symbols can
16866
         not be referenced off the $gp, although it appears as though
16867
         they can.  */
16868
      symname = S_GET_NAME (sym);
16869
      if (symname != (const char *) NULL
16870
          && (strcmp (symname, "eprol") == 0
16871
              || strcmp (symname, "etext") == 0
16872
              || strcmp (symname, "_gp") == 0
16873
              || strcmp (symname, "edata") == 0
16874
              || strcmp (symname, "_fbss") == 0
16875
              || strcmp (symname, "_fdata") == 0
16876
              || strcmp (symname, "_ftext") == 0
16877
              || strcmp (symname, "end") == 0
16878
              || strcmp (symname, "_gp_disp") == 0))
16879
        change = 1;
16880
      else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
16881
               && (0
16882
#ifndef NO_ECOFF_DEBUGGING
16883
                   || (symbol_get_obj (sym)->ecoff_extern_size != 0
16884
                       && (symbol_get_obj (sym)->ecoff_extern_size
16885
                           <= g_switch_value))
16886
#endif
16887
                   /* We must defer this decision until after the whole
16888
                      file has been read, since there might be a .extern
16889
                      after the first use of this symbol.  */
16890
                   || (before_relaxing
16891
#ifndef NO_ECOFF_DEBUGGING
16892
                       && symbol_get_obj (sym)->ecoff_extern_size == 0
16893
#endif
16894
                       && S_GET_VALUE (sym) == 0)
16895
                   || (S_GET_VALUE (sym) != 0
16896
                       && S_GET_VALUE (sym) <= g_switch_value)))
16897
        change = 0;
16898
      else
16899
        {
16900
          const char *segname;
16901
 
16902
          segname = segment_name (S_GET_SEGMENT (sym));
16903
          gas_assert (strcmp (segname, ".lit8") != 0
16904
                  && strcmp (segname, ".lit4") != 0);
16905
          change = (strcmp (segname, ".sdata") != 0
16906
                    && strcmp (segname, ".sbss") != 0
16907
                    && strncmp (segname, ".sdata.", 7) != 0
16908
                    && strncmp (segname, ".sbss.", 6) != 0
16909
                    && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
16910
                    && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
16911
        }
16912
      return change;
16913
    }
16914
  else
16915
    /* We are not optimizing for the $gp register.  */
16916
    return 1;
16917
}
16918
 
16919
 
16920
/* Return true if the given symbol should be considered local for SVR4 PIC.  */
16921
 
16922
static bfd_boolean
16923
pic_need_relax (symbolS *sym, asection *segtype)
16924
{
16925
  asection *symsec;
16926
 
16927
  /* Handle the case of a symbol equated to another symbol.  */
16928
  while (symbol_equated_reloc_p (sym))
16929
    {
16930
      symbolS *n;
16931
 
16932
      /* It's possible to get a loop here in a badly written program.  */
16933
      n = symbol_get_value_expression (sym)->X_add_symbol;
16934
      if (n == sym)
16935
        break;
16936
      sym = n;
16937
    }
16938
 
16939
  if (symbol_section_p (sym))
16940
    return TRUE;
16941
 
16942
  symsec = S_GET_SEGMENT (sym);
16943
 
16944
  /* This must duplicate the test in adjust_reloc_syms.  */
16945
  return (symsec != &bfd_und_section
16946
          && symsec != &bfd_abs_section
16947
          && !bfd_is_com_section (symsec)
16948
          && !s_is_linkonce (sym, segtype)
16949
#ifdef OBJ_ELF
16950
          /* A global or weak symbol is treated as external.  */
16951
          && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
16952
#endif
16953
          );
16954
}
16955
 
16956
 
16957
/* Given a mips16 variant frag FRAGP, return non-zero if it needs an
16958
   extended opcode.  SEC is the section the frag is in.  */
16959
 
16960
static int
16961
mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
16962
{
16963
  int type;
16964
  const struct mips16_immed_operand *op;
16965
  offsetT val;
16966
  int mintiny, maxtiny;
16967
  segT symsec;
16968
  fragS *sym_frag;
16969
 
16970
  if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
16971
    return 0;
16972
  if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
16973
    return 1;
16974
 
16975
  type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
16976
  op = mips16_immed_operands;
16977
  while (op->type != type)
16978
    {
16979
      ++op;
16980
      gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
16981
    }
16982
 
16983
  if (op->unsp)
16984
    {
16985
      if (type == '<' || type == '>' || type == '[' || type == ']')
16986
        {
16987
          mintiny = 1;
16988
          maxtiny = 1 << op->nbits;
16989
        }
16990
      else
16991
        {
16992
          mintiny = 0;
16993
          maxtiny = (1 << op->nbits) - 1;
16994
        }
16995
    }
16996
  else
16997
    {
16998
      mintiny = - (1 << (op->nbits - 1));
16999
      maxtiny = (1 << (op->nbits - 1)) - 1;
17000
    }
17001
 
17002
  sym_frag = symbol_get_frag (fragp->fr_symbol);
17003
  val = S_GET_VALUE (fragp->fr_symbol);
17004
  symsec = S_GET_SEGMENT (fragp->fr_symbol);
17005
 
17006
  if (op->pcrel)
17007
    {
17008
      addressT addr;
17009
 
17010
      /* We won't have the section when we are called from
17011
         mips_relax_frag.  However, we will always have been called
17012
         from md_estimate_size_before_relax first.  If this is a
17013
         branch to a different section, we mark it as such.  If SEC is
17014
         NULL, and the frag is not marked, then it must be a branch to
17015
         the same section.  */
17016
      if (sec == NULL)
17017
        {
17018
          if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
17019
            return 1;
17020
        }
17021
      else
17022
        {
17023
          /* Must have been called from md_estimate_size_before_relax.  */
17024
          if (symsec != sec)
17025
            {
17026
              fragp->fr_subtype =
17027
                RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17028
 
17029
              /* FIXME: We should support this, and let the linker
17030
                 catch branches and loads that are out of range.  */
17031
              as_bad_where (fragp->fr_file, fragp->fr_line,
17032
                            _("unsupported PC relative reference to different section"));
17033
 
17034
              return 1;
17035
            }
17036
          if (fragp != sym_frag && sym_frag->fr_address == 0)
17037
            /* Assume non-extended on the first relaxation pass.
17038
               The address we have calculated will be bogus if this is
17039
               a forward branch to another frag, as the forward frag
17040
               will have fr_address == 0.  */
17041
            return 0;
17042
        }
17043
 
17044
      /* In this case, we know for sure that the symbol fragment is in
17045
         the same section.  If the relax_marker of the symbol fragment
17046
         differs from the relax_marker of this fragment, we have not
17047
         yet adjusted the symbol fragment fr_address.  We want to add
17048
         in STRETCH in order to get a better estimate of the address.
17049
         This particularly matters because of the shift bits.  */
17050
      if (stretch != 0
17051
          && sym_frag->relax_marker != fragp->relax_marker)
17052
        {
17053
          fragS *f;
17054
 
17055
          /* Adjust stretch for any alignment frag.  Note that if have
17056
             been expanding the earlier code, the symbol may be
17057
             defined in what appears to be an earlier frag.  FIXME:
17058
             This doesn't handle the fr_subtype field, which specifies
17059
             a maximum number of bytes to skip when doing an
17060
             alignment.  */
17061
          for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
17062
            {
17063
              if (f->fr_type == rs_align || f->fr_type == rs_align_code)
17064
                {
17065
                  if (stretch < 0)
17066
                    stretch = - ((- stretch)
17067
                                 & ~ ((1 << (int) f->fr_offset) - 1));
17068
                  else
17069
                    stretch &= ~ ((1 << (int) f->fr_offset) - 1);
17070
                  if (stretch == 0)
17071
                    break;
17072
                }
17073
            }
17074
          if (f != NULL)
17075
            val += stretch;
17076
        }
17077
 
17078
      addr = fragp->fr_address + fragp->fr_fix;
17079
 
17080
      /* The base address rules are complicated.  The base address of
17081
         a branch is the following instruction.  The base address of a
17082
         PC relative load or add is the instruction itself, but if it
17083
         is in a delay slot (in which case it can not be extended) use
17084
         the address of the instruction whose delay slot it is in.  */
17085
      if (type == 'p' || type == 'q')
17086
        {
17087
          addr += 2;
17088
 
17089
          /* If we are currently assuming that this frag should be
17090
             extended, then, the current address is two bytes
17091
             higher.  */
17092
          if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
17093
            addr += 2;
17094
 
17095
          /* Ignore the low bit in the target, since it will be set
17096
             for a text label.  */
17097
          if ((val & 1) != 0)
17098
            --val;
17099
        }
17100
      else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
17101
        addr -= 4;
17102
      else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
17103
        addr -= 2;
17104
 
17105
      val -= addr & ~ ((1 << op->shift) - 1);
17106
 
17107
      /* Branch offsets have an implicit 0 in the lowest bit.  */
17108
      if (type == 'p' || type == 'q')
17109
        val /= 2;
17110
 
17111
      /* If any of the shifted bits are set, we must use an extended
17112
         opcode.  If the address depends on the size of this
17113
         instruction, this can lead to a loop, so we arrange to always
17114
         use an extended opcode.  We only check this when we are in
17115
         the main relaxation loop, when SEC is NULL.  */
17116
      if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
17117
        {
17118
          fragp->fr_subtype =
17119
            RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17120
          return 1;
17121
        }
17122
 
17123
      /* If we are about to mark a frag as extended because the value
17124
         is precisely maxtiny + 1, then there is a chance of an
17125
         infinite loop as in the following code:
17126
             la $4,foo
17127
             .skip      1020
17128
             .align     2
17129
           foo:
17130
         In this case when the la is extended, foo is 0x3fc bytes
17131
         away, so the la can be shrunk, but then foo is 0x400 away, so
17132
         the la must be extended.  To avoid this loop, we mark the
17133
         frag as extended if it was small, and is about to become
17134
         extended with a value of maxtiny + 1.  */
17135
      if (val == ((maxtiny + 1) << op->shift)
17136
          && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
17137
          && sec == NULL)
17138
        {
17139
          fragp->fr_subtype =
17140
            RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
17141
          return 1;
17142
        }
17143
    }
17144
  else if (symsec != absolute_section && sec != NULL)
17145
    as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
17146
 
17147
  if ((val & ((1 << op->shift) - 1)) != 0
17148
      || val < (mintiny << op->shift)
17149
      || val > (maxtiny << op->shift))
17150
    return 1;
17151
  else
17152
    return 0;
17153
}
17154
 
17155
/* Compute the length of a branch sequence, and adjust the
17156
   RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
17157
   worst-case length is computed, with UPDATE being used to indicate
17158
   whether an unconditional (-1), branch-likely (+1) or regular (0)
17159
   branch is to be computed.  */
17160
static int
17161
relaxed_branch_length (fragS *fragp, asection *sec, int update)
17162
{
17163
  bfd_boolean toofar;
17164
  int length;
17165
 
17166
  if (fragp
17167
      && S_IS_DEFINED (fragp->fr_symbol)
17168
      && sec == S_GET_SEGMENT (fragp->fr_symbol))
17169
    {
17170
      addressT addr;
17171
      offsetT val;
17172
 
17173
      val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17174
 
17175
      addr = fragp->fr_address + fragp->fr_fix + 4;
17176
 
17177
      val -= addr;
17178
 
17179
      toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
17180
    }
17181
  else if (fragp)
17182
    /* If the symbol is not defined or it's in a different segment,
17183
       assume the user knows what's going on and emit a short
17184
       branch.  */
17185
    toofar = FALSE;
17186
  else
17187
    toofar = TRUE;
17188
 
17189
  if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
17190
    fragp->fr_subtype
17191
      = RELAX_BRANCH_ENCODE (RELAX_BRANCH_AT (fragp->fr_subtype),
17192
                             RELAX_BRANCH_UNCOND (fragp->fr_subtype),
17193
                             RELAX_BRANCH_LIKELY (fragp->fr_subtype),
17194
                             RELAX_BRANCH_LINK (fragp->fr_subtype),
17195
                             toofar);
17196
 
17197
  length = 4;
17198
  if (toofar)
17199
    {
17200
      if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
17201
        length += 8;
17202
 
17203
      if (mips_pic != NO_PIC)
17204
        {
17205
          /* Additional space for PIC loading of target address.  */
17206
          length += 8;
17207
          if (mips_opts.isa == ISA_MIPS1)
17208
            /* Additional space for $at-stabilizing nop.  */
17209
            length += 4;
17210
        }
17211
 
17212
      /* If branch is conditional.  */
17213
      if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
17214
        length += 8;
17215
    }
17216
 
17217
  return length;
17218
}
17219
 
17220 160 khays
/* Compute the length of a branch sequence, and adjust the
17221
   RELAX_MICROMIPS_TOOFAR32 bit accordingly.  If FRAGP is NULL, the
17222
   worst-case length is computed, with UPDATE being used to indicate
17223
   whether an unconditional (-1), or regular (0) branch is to be
17224
   computed.  */
17225
 
17226
static int
17227
relaxed_micromips_32bit_branch_length (fragS *fragp, asection *sec, int update)
17228
{
17229
  bfd_boolean toofar;
17230
  int length;
17231
 
17232
  if (fragp
17233
      && S_IS_DEFINED (fragp->fr_symbol)
17234
      && sec == S_GET_SEGMENT (fragp->fr_symbol))
17235
    {
17236
      addressT addr;
17237
      offsetT val;
17238
 
17239
      val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17240
      /* Ignore the low bit in the target, since it will be set
17241
         for a text label.  */
17242
      if ((val & 1) != 0)
17243
        --val;
17244
 
17245
      addr = fragp->fr_address + fragp->fr_fix + 4;
17246
 
17247
      val -= addr;
17248
 
17249
      toofar = val < - (0x8000 << 1) || val >= (0x8000 << 1);
17250
    }
17251
  else if (fragp)
17252
    /* If the symbol is not defined or it's in a different segment,
17253
       assume the user knows what's going on and emit a short
17254
       branch.  */
17255
    toofar = FALSE;
17256
  else
17257
    toofar = TRUE;
17258
 
17259
  if (fragp && update
17260
      && toofar != RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
17261
    fragp->fr_subtype = (toofar
17262
                         ? RELAX_MICROMIPS_MARK_TOOFAR32 (fragp->fr_subtype)
17263
                         : RELAX_MICROMIPS_CLEAR_TOOFAR32 (fragp->fr_subtype));
17264
 
17265
  length = 4;
17266
  if (toofar)
17267
    {
17268
      bfd_boolean compact_known = fragp != NULL;
17269
      bfd_boolean compact = FALSE;
17270
      bfd_boolean uncond;
17271
 
17272
      if (compact_known)
17273
        compact = RELAX_MICROMIPS_COMPACT (fragp->fr_subtype);
17274
      if (fragp)
17275
        uncond = RELAX_MICROMIPS_UNCOND (fragp->fr_subtype);
17276
      else
17277
        uncond = update < 0;
17278
 
17279
      /* If label is out of range, we turn branch <br>:
17280
 
17281
                <br>    label                   # 4 bytes
17282
            0:
17283
 
17284
         into:
17285
 
17286
                j       label                   # 4 bytes
17287
                nop                             # 2 bytes if compact && !PIC
17288
            0:
17289
       */
17290
      if (mips_pic == NO_PIC && (!compact_known || compact))
17291
        length += 2;
17292
 
17293
      /* If assembling PIC code, we further turn:
17294
 
17295
                        j       label                   # 4 bytes
17296
 
17297
         into:
17298
 
17299
                        lw/ld   at, %got(label)(gp)     # 4 bytes
17300
                        d/addiu at, %lo(label)          # 4 bytes
17301
                        jr/c    at                      # 2 bytes
17302
       */
17303
      if (mips_pic != NO_PIC)
17304
        length += 6;
17305
 
17306
      /* If branch <br> is conditional, we prepend negated branch <brneg>:
17307
 
17308
                        <brneg> 0f                      # 4 bytes
17309
                        nop                             # 2 bytes if !compact
17310
       */
17311
      if (!uncond)
17312
        length += (compact_known && compact) ? 4 : 6;
17313
    }
17314
 
17315
  return length;
17316
}
17317
 
17318
/* Compute the length of a branch, and adjust the RELAX_MICROMIPS_TOOFAR16
17319
   bit accordingly.  */
17320
 
17321
static int
17322
relaxed_micromips_16bit_branch_length (fragS *fragp, asection *sec, int update)
17323
{
17324
  bfd_boolean toofar;
17325
 
17326
  if (fragp
17327
      && S_IS_DEFINED (fragp->fr_symbol)
17328
      && sec == S_GET_SEGMENT (fragp->fr_symbol))
17329
    {
17330
      addressT addr;
17331
      offsetT val;
17332
      int type;
17333
 
17334
      val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
17335
      /* Ignore the low bit in the target, since it will be set
17336
         for a text label.  */
17337
      if ((val & 1) != 0)
17338
        --val;
17339
 
17340
      /* Assume this is a 2-byte branch.  */
17341
      addr = fragp->fr_address + fragp->fr_fix + 2;
17342
 
17343
      /* We try to avoid the infinite loop by not adding 2 more bytes for
17344
         long branches.  */
17345
 
17346
      val -= addr;
17347
 
17348
      type = RELAX_MICROMIPS_TYPE (fragp->fr_subtype);
17349
      if (type == 'D')
17350
        toofar = val < - (0x200 << 1) || val >= (0x200 << 1);
17351
      else if (type == 'E')
17352
        toofar = val < - (0x40 << 1) || val >= (0x40 << 1);
17353
      else
17354
        abort ();
17355
    }
17356
  else
17357
    /* If the symbol is not defined or it's in a different segment,
17358
       we emit a normal 32-bit branch.  */
17359
    toofar = TRUE;
17360
 
17361
  if (fragp && update
17362
      && toofar != RELAX_MICROMIPS_TOOFAR16 (fragp->fr_subtype))
17363
    fragp->fr_subtype
17364
      = toofar ? RELAX_MICROMIPS_MARK_TOOFAR16 (fragp->fr_subtype)
17365
               : RELAX_MICROMIPS_CLEAR_TOOFAR16 (fragp->fr_subtype);
17366
 
17367
  if (toofar)
17368
    return 4;
17369
 
17370
  return 2;
17371
}
17372
 
17373 16 khays
/* Estimate the size of a frag before relaxing.  Unless this is the
17374
   mips16, we are not really relaxing here, and the final size is
17375
   encoded in the subtype information.  For the mips16, we have to
17376
   decide whether we are using an extended opcode or not.  */
17377
 
17378
int
17379
md_estimate_size_before_relax (fragS *fragp, asection *segtype)
17380
{
17381
  int change;
17382
 
17383
  if (RELAX_BRANCH_P (fragp->fr_subtype))
17384
    {
17385
 
17386
      fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
17387
 
17388
      return fragp->fr_var;
17389
    }
17390
 
17391
  if (RELAX_MIPS16_P (fragp->fr_subtype))
17392
    /* We don't want to modify the EXTENDED bit here; it might get us
17393
       into infinite loops.  We change it only in mips_relax_frag().  */
17394
    return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
17395
 
17396 160 khays
  if (RELAX_MICROMIPS_P (fragp->fr_subtype))
17397
    {
17398
      int length = 4;
17399
 
17400
      if (RELAX_MICROMIPS_TYPE (fragp->fr_subtype) != 0)
17401
        length = relaxed_micromips_16bit_branch_length (fragp, segtype, FALSE);
17402
      if (length == 4 && RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype))
17403
        length = relaxed_micromips_32bit_branch_length (fragp, segtype, FALSE);
17404
      fragp->fr_var = length;
17405
 
17406
      return length;
17407
    }
17408
 
17409 16 khays
  if (mips_pic == NO_PIC)
17410
    change = nopic_need_relax (fragp->fr_symbol, 0);
17411
  else if (mips_pic == SVR4_PIC)
17412
    change = pic_need_relax (fragp->fr_symbol, segtype);
17413
  else if (mips_pic == VXWORKS_PIC)
17414
    /* For vxworks, GOT16 relocations never have a corresponding LO16.  */
17415
    change = 0;
17416
  else
17417
    abort ();
17418
 
17419
  if (change)
17420
    {
17421
      fragp->fr_subtype |= RELAX_USE_SECOND;
17422
      return -RELAX_FIRST (fragp->fr_subtype);
17423
    }
17424
  else
17425
    return -RELAX_SECOND (fragp->fr_subtype);
17426
}
17427
 
17428
/* This is called to see whether a reloc against a defined symbol
17429
   should be converted into a reloc against a section.  */
17430
 
17431
int
17432
mips_fix_adjustable (fixS *fixp)
17433
{
17434
  if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
17435
      || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
17436
    return 0;
17437
 
17438
  if (fixp->fx_addsy == NULL)
17439
    return 1;
17440
 
17441
  /* If symbol SYM is in a mergeable section, relocations of the form
17442
     SYM + 0 can usually be made section-relative.  The mergeable data
17443
     is then identified by the section offset rather than by the symbol.
17444
 
17445
     However, if we're generating REL LO16 relocations, the offset is split
17446
     between the LO16 and parterning high part relocation.  The linker will
17447
     need to recalculate the complete offset in order to correctly identify
17448
     the merge data.
17449
 
17450
     The linker has traditionally not looked for the parterning high part
17451
     relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
17452
     placed anywhere.  Rather than break backwards compatibility by changing
17453
     this, it seems better not to force the issue, and instead keep the
17454
     original symbol.  This will work with either linker behavior.  */
17455
  if ((lo16_reloc_p (fixp->fx_r_type)
17456
       || reloc_needs_lo_p (fixp->fx_r_type))
17457
      && HAVE_IN_PLACE_ADDENDS
17458
      && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
17459
    return 0;
17460
 
17461
  /* There is no place to store an in-place offset for JALR relocations.
17462
     Likewise an in-range offset of PC-relative relocations may overflow
17463
     the in-place relocatable field if recalculated against the start
17464
     address of the symbol's containing section.  */
17465
  if (HAVE_IN_PLACE_ADDENDS
17466 160 khays
      && (fixp->fx_pcrel || jalr_reloc_p (fixp->fx_r_type)))
17467 16 khays
    return 0;
17468
 
17469
#ifdef OBJ_ELF
17470
  /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
17471
     to a floating-point stub.  The same is true for non-R_MIPS16_26
17472
     relocations against MIPS16 functions; in this case, the stub becomes
17473
     the function's canonical address.
17474
 
17475
     Floating-point stubs are stored in unique .mips16.call.* or
17476
     .mips16.fn.* sections.  If a stub T for function F is in section S,
17477
     the first relocation in section S must be against F; this is how the
17478
     linker determines the target function.  All relocations that might
17479
     resolve to T must also be against F.  We therefore have the following
17480
     restrictions, which are given in an intentionally-redundant way:
17481
 
17482
       1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
17483
          symbols.
17484
 
17485
       2. We cannot reduce a stub's relocations against non-MIPS16 symbols
17486
          if that stub might be used.
17487
 
17488
       3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
17489
          symbols.
17490
 
17491
       4. We cannot reduce a stub's relocations against MIPS16 symbols if
17492
          that stub might be used.
17493
 
17494
     There is a further restriction:
17495
 
17496 160 khays
       5. We cannot reduce jump relocations (R_MIPS_26, R_MIPS16_26 or
17497
          R_MICROMIPS_26_S1) against MIPS16 or microMIPS symbols on
17498
          targets with in-place addends; the relocation field cannot
17499 16 khays
          encode the low bit.
17500
 
17501 160 khays
     For simplicity, we deal with (3)-(4) by not reducing _any_ relocation
17502
     against a MIPS16 symbol.  We deal with (5) by by not reducing any
17503
     such relocations on REL targets.
17504 16 khays
 
17505
     We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
17506
     relocation against some symbol R, no relocation against R may be
17507
     reduced.  (Note that this deals with (2) as well as (1) because
17508
     relocations against global symbols will never be reduced on ELF
17509
     targets.)  This approach is a little simpler than trying to detect
17510
     stub sections, and gives the "all or nothing" per-symbol consistency
17511
     that we have for MIPS16 symbols.  */
17512
  if (IS_ELF
17513
      && fixp->fx_subsy == NULL
17514
      && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
17515 160 khays
          || *symbol_get_tc (fixp->fx_addsy)
17516
          || (HAVE_IN_PLACE_ADDENDS
17517
              && ELF_ST_IS_MICROMIPS (S_GET_OTHER (fixp->fx_addsy))
17518
              && jmp_reloc_p (fixp->fx_r_type))))
17519 16 khays
    return 0;
17520
#endif
17521
 
17522
  return 1;
17523
}
17524
 
17525
/* Translate internal representation of relocation info to BFD target
17526
   format.  */
17527
 
17528
arelent **
17529
tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
17530
{
17531
  static arelent *retval[4];
17532
  arelent *reloc;
17533
  bfd_reloc_code_real_type code;
17534
 
17535
  memset (retval, 0, sizeof(retval));
17536
  reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
17537
  reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
17538
  *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
17539
  reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
17540
 
17541
  if (fixp->fx_pcrel)
17542
    {
17543 160 khays
      gas_assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2
17544
                  || fixp->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
17545
                  || fixp->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
17546
                  || fixp->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1);
17547 16 khays
 
17548
      /* At this point, fx_addnumber is "symbol offset - pcrel address".
17549
         Relocations want only the symbol offset.  */
17550
      reloc->addend = fixp->fx_addnumber + reloc->address;
17551
      if (!IS_ELF)
17552
        {
17553
          /* A gruesome hack which is a result of the gruesome gas
17554
             reloc handling.  What's worse, for COFF (as opposed to
17555
             ECOFF), we might need yet another copy of reloc->address.
17556
             See bfd_install_relocation.  */
17557
          reloc->addend += reloc->address;
17558
        }
17559
    }
17560
  else
17561
    reloc->addend = fixp->fx_addnumber;
17562
 
17563
  /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
17564
     entry to be used in the relocation's section offset.  */
17565
  if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
17566
    {
17567
      reloc->address = reloc->addend;
17568
      reloc->addend = 0;
17569
    }
17570
 
17571
  code = fixp->fx_r_type;
17572
 
17573
  reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
17574
  if (reloc->howto == NULL)
17575
    {
17576
      as_bad_where (fixp->fx_file, fixp->fx_line,
17577
                    _("Can not represent %s relocation in this object file format"),
17578
                    bfd_get_reloc_code_name (code));
17579
      retval[0] = NULL;
17580
    }
17581
 
17582
  return retval;
17583
}
17584
 
17585
/* Relax a machine dependent frag.  This returns the amount by which
17586
   the current size of the frag should change.  */
17587
 
17588
int
17589
mips_relax_frag (asection *sec, fragS *fragp, long stretch)
17590
{
17591
  if (RELAX_BRANCH_P (fragp->fr_subtype))
17592
    {
17593
      offsetT old_var = fragp->fr_var;
17594
 
17595
      fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
17596
 
17597
      return fragp->fr_var - old_var;
17598
    }
17599
 
17600 160 khays
  if (RELAX_MICROMIPS_P (fragp->fr_subtype))
17601
    {
17602
      offsetT old_var = fragp->fr_var;
17603
      offsetT new_var = 4;
17604
 
17605
      if (RELAX_MICROMIPS_TYPE (fragp->fr_subtype) != 0)
17606
        new_var = relaxed_micromips_16bit_branch_length (fragp, sec, TRUE);
17607
      if (new_var == 4 && RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype))
17608
        new_var = relaxed_micromips_32bit_branch_length (fragp, sec, TRUE);
17609
      fragp->fr_var = new_var;
17610
 
17611
      return new_var - old_var;
17612
    }
17613
 
17614 16 khays
  if (! RELAX_MIPS16_P (fragp->fr_subtype))
17615
    return 0;
17616
 
17617
  if (mips16_extended_frag (fragp, NULL, stretch))
17618
    {
17619
      if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
17620
        return 0;
17621
      fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
17622
      return 2;
17623
    }
17624
  else
17625
    {
17626
      if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
17627
        return 0;
17628
      fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
17629
      return -2;
17630
    }
17631
 
17632
  return 0;
17633
}
17634
 
17635
/* Convert a machine dependent frag.  */
17636
 
17637
void
17638
md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
17639
{
17640
  if (RELAX_BRANCH_P (fragp->fr_subtype))
17641
    {
17642
      bfd_byte *buf;
17643
      unsigned long insn;
17644
      expressionS exp;
17645
      fixS *fixp;
17646
 
17647
      buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
17648
 
17649
      if (target_big_endian)
17650
        insn = bfd_getb32 (buf);
17651
      else
17652
        insn = bfd_getl32 (buf);
17653
 
17654
      if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
17655
        {
17656
          /* We generate a fixup instead of applying it right now
17657
             because, if there are linker relaxations, we're going to
17658
             need the relocations.  */
17659
          exp.X_op = O_symbol;
17660
          exp.X_add_symbol = fragp->fr_symbol;
17661
          exp.X_add_number = fragp->fr_offset;
17662
 
17663
          fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
17664
                              4, &exp, TRUE, BFD_RELOC_16_PCREL_S2);
17665
          fixp->fx_file = fragp->fr_file;
17666
          fixp->fx_line = fragp->fr_line;
17667
 
17668
          md_number_to_chars ((char *) buf, insn, 4);
17669
          buf += 4;
17670
        }
17671
      else
17672
        {
17673
          int i;
17674
 
17675
          as_warn_where (fragp->fr_file, fragp->fr_line,
17676
                         _("Relaxed out-of-range branch into a jump"));
17677
 
17678
          if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
17679
            goto uncond;
17680
 
17681
          if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
17682
            {
17683
              /* Reverse the branch.  */
17684
              switch ((insn >> 28) & 0xf)
17685
                {
17686
                case 4:
17687
                  /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
17688
                     have the condition reversed by tweaking a single
17689
                     bit, and their opcodes all have 0x4???????.  */
17690
                  gas_assert ((insn & 0xf1000000) == 0x41000000);
17691
                  insn ^= 0x00010000;
17692
                  break;
17693
 
17694
                case 0:
17695
                  /* bltz       0x04000000      bgez    0x04010000
17696
                     bltzal     0x04100000      bgezal  0x04110000  */
17697
                  gas_assert ((insn & 0xfc0e0000) == 0x04000000);
17698
                  insn ^= 0x00010000;
17699
                  break;
17700
 
17701
                case 1:
17702
                  /* beq        0x10000000      bne     0x14000000
17703
                     blez       0x18000000      bgtz    0x1c000000  */
17704
                  insn ^= 0x04000000;
17705
                  break;
17706
 
17707
                default:
17708
                  abort ();
17709
                }
17710
            }
17711
 
17712
          if (RELAX_BRANCH_LINK (fragp->fr_subtype))
17713
            {
17714
              /* Clear the and-link bit.  */
17715
              gas_assert ((insn & 0xfc1c0000) == 0x04100000);
17716
 
17717
              /* bltzal         0x04100000      bgezal  0x04110000
17718
                 bltzall        0x04120000      bgezall 0x04130000  */
17719
              insn &= ~0x00100000;
17720
            }
17721
 
17722
          /* Branch over the branch (if the branch was likely) or the
17723
             full jump (not likely case).  Compute the offset from the
17724
             current instruction to branch to.  */
17725
          if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
17726
            i = 16;
17727
          else
17728
            {
17729
              /* How many bytes in instructions we've already emitted?  */
17730
              i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
17731
              /* How many bytes in instructions from here to the end?  */
17732
              i = fragp->fr_var - i;
17733
            }
17734
          /* Convert to instruction count.  */
17735
          i >>= 2;
17736
          /* Branch counts from the next instruction.  */
17737
          i--;
17738
          insn |= i;
17739
          /* Branch over the jump.  */
17740
          md_number_to_chars ((char *) buf, insn, 4);
17741
          buf += 4;
17742
 
17743
          /* nop */
17744
          md_number_to_chars ((char *) buf, 0, 4);
17745
          buf += 4;
17746
 
17747
          if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
17748
            {
17749
              /* beql $0, $0, 2f */
17750
              insn = 0x50000000;
17751
              /* Compute the PC offset from the current instruction to
17752
                 the end of the variable frag.  */
17753
              /* How many bytes in instructions we've already emitted?  */
17754
              i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
17755
              /* How many bytes in instructions from here to the end?  */
17756
              i = fragp->fr_var - i;
17757
              /* Convert to instruction count.  */
17758
              i >>= 2;
17759
              /* Don't decrement i, because we want to branch over the
17760
                 delay slot.  */
17761
 
17762
              insn |= i;
17763
              md_number_to_chars ((char *) buf, insn, 4);
17764
              buf += 4;
17765
 
17766
              md_number_to_chars ((char *) buf, 0, 4);
17767
              buf += 4;
17768
            }
17769
 
17770
        uncond:
17771
          if (mips_pic == NO_PIC)
17772
            {
17773
              /* j or jal.  */
17774
              insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
17775
                      ? 0x0c000000 : 0x08000000);
17776
              exp.X_op = O_symbol;
17777
              exp.X_add_symbol = fragp->fr_symbol;
17778
              exp.X_add_number = fragp->fr_offset;
17779
 
17780
              fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
17781
                                  4, &exp, FALSE, BFD_RELOC_MIPS_JMP);
17782
              fixp->fx_file = fragp->fr_file;
17783
              fixp->fx_line = fragp->fr_line;
17784
 
17785
              md_number_to_chars ((char *) buf, insn, 4);
17786
              buf += 4;
17787
            }
17788
          else
17789
            {
17790
              unsigned long at = RELAX_BRANCH_AT (fragp->fr_subtype);
17791
 
17792
              /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
17793
              insn = HAVE_64BIT_ADDRESSES ? 0xdf800000 : 0x8f800000;
17794
              insn |= at << OP_SH_RT;
17795
              exp.X_op = O_symbol;
17796
              exp.X_add_symbol = fragp->fr_symbol;
17797
              exp.X_add_number = fragp->fr_offset;
17798
 
17799
              if (fragp->fr_offset)
17800
                {
17801
                  exp.X_add_symbol = make_expr_symbol (&exp);
17802
                  exp.X_add_number = 0;
17803
                }
17804
 
17805
              fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
17806
                                  4, &exp, FALSE, BFD_RELOC_MIPS_GOT16);
17807
              fixp->fx_file = fragp->fr_file;
17808
              fixp->fx_line = fragp->fr_line;
17809
 
17810
              md_number_to_chars ((char *) buf, insn, 4);
17811
              buf += 4;
17812
 
17813
              if (mips_opts.isa == ISA_MIPS1)
17814
                {
17815
                  /* nop */
17816
                  md_number_to_chars ((char *) buf, 0, 4);
17817
                  buf += 4;
17818
                }
17819
 
17820
              /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
17821
              insn = HAVE_64BIT_ADDRESSES ? 0x64000000 : 0x24000000;
17822
              insn |= at << OP_SH_RS | at << OP_SH_RT;
17823
 
17824
              fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
17825
                                  4, &exp, FALSE, BFD_RELOC_LO16);
17826
              fixp->fx_file = fragp->fr_file;
17827
              fixp->fx_line = fragp->fr_line;
17828
 
17829
              md_number_to_chars ((char *) buf, insn, 4);
17830
              buf += 4;
17831
 
17832
              /* j(al)r $at.  */
17833
              if (RELAX_BRANCH_LINK (fragp->fr_subtype))
17834
                insn = 0x0000f809;
17835
              else
17836
                insn = 0x00000008;
17837
              insn |= at << OP_SH_RS;
17838
 
17839
              md_number_to_chars ((char *) buf, insn, 4);
17840
              buf += 4;
17841
            }
17842
        }
17843
 
17844
      gas_assert (buf == (bfd_byte *)fragp->fr_literal
17845
              + fragp->fr_fix + fragp->fr_var);
17846
 
17847
      fragp->fr_fix += fragp->fr_var;
17848
 
17849
      return;
17850
    }
17851
 
17852 160 khays
  /* Relax microMIPS branches.  */
17853
  if (RELAX_MICROMIPS_P (fragp->fr_subtype))
17854
    {
17855
      bfd_byte *buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
17856
      bfd_boolean compact = RELAX_MICROMIPS_COMPACT (fragp->fr_subtype);
17857
      bfd_boolean al = RELAX_MICROMIPS_LINK (fragp->fr_subtype);
17858
      int type = RELAX_MICROMIPS_TYPE (fragp->fr_subtype);
17859
      bfd_boolean short_ds;
17860
      unsigned long insn;
17861
      expressionS exp;
17862
      fixS *fixp;
17863
 
17864
      exp.X_op = O_symbol;
17865
      exp.X_add_symbol = fragp->fr_symbol;
17866
      exp.X_add_number = fragp->fr_offset;
17867
 
17868
      fragp->fr_fix += fragp->fr_var;
17869
 
17870
      /* Handle 16-bit branches that fit or are forced to fit.  */
17871
      if (type != 0 && !RELAX_MICROMIPS_TOOFAR16 (fragp->fr_subtype))
17872
        {
17873
          /* We generate a fixup instead of applying it right now,
17874
             because if there is linker relaxation, we're going to
17875
             need the relocations.  */
17876
          if (type == 'D')
17877
            fixp = fix_new_exp (fragp,
17878
                                buf - (bfd_byte *) fragp->fr_literal,
17879
                                2, &exp, TRUE,
17880
                                BFD_RELOC_MICROMIPS_10_PCREL_S1);
17881
          else if (type == 'E')
17882
            fixp = fix_new_exp (fragp,
17883
                                buf - (bfd_byte *) fragp->fr_literal,
17884
                                2, &exp, TRUE,
17885
                                BFD_RELOC_MICROMIPS_7_PCREL_S1);
17886
          else
17887
            abort ();
17888
 
17889
          fixp->fx_file = fragp->fr_file;
17890
          fixp->fx_line = fragp->fr_line;
17891
 
17892
          /* These relocations can have an addend that won't fit in
17893
             2 octets.  */
17894
          fixp->fx_no_overflow = 1;
17895
 
17896
          return;
17897
        }
17898
 
17899
      /* Handle 32-bit branches that fit or are forced to fit.  */
17900
      if (!RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype)
17901
          || !RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
17902
        {
17903
          /* We generate a fixup instead of applying it right now,
17904
             because if there is linker relaxation, we're going to
17905
             need the relocations.  */
17906
          fixp = fix_new_exp (fragp, buf - (bfd_byte *) fragp->fr_literal,
17907
                              4, &exp, TRUE, BFD_RELOC_MICROMIPS_16_PCREL_S1);
17908
          fixp->fx_file = fragp->fr_file;
17909
          fixp->fx_line = fragp->fr_line;
17910
 
17911
          if (type == 0)
17912
            return;
17913
        }
17914
 
17915
      /* Relax 16-bit branches to 32-bit branches.  */
17916
      if (type != 0)
17917
        {
17918
          if (target_big_endian)
17919
            insn = bfd_getb16 (buf);
17920
          else
17921
            insn = bfd_getl16 (buf);
17922
 
17923
          if ((insn & 0xfc00) == 0xcc00)                /* b16  */
17924
            insn = 0x94000000;                          /* beq  */
17925
          else if ((insn & 0xdc00) == 0x8c00)           /* beqz16/bnez16  */
17926
            {
17927
              unsigned long regno;
17928
 
17929
              regno = (insn >> MICROMIPSOP_SH_MD) & MICROMIPSOP_MASK_MD;
17930
              regno = micromips_to_32_reg_d_map [regno];
17931
              insn = ((insn & 0x2000) << 16) | 0x94000000;      /* beq/bne  */
17932
              insn |= regno << MICROMIPSOP_SH_RS;
17933
            }
17934
          else
17935
            abort ();
17936
 
17937
          /* Nothing else to do, just write it out.  */
17938
          if (!RELAX_MICROMIPS_RELAX32 (fragp->fr_subtype)
17939
              || !RELAX_MICROMIPS_TOOFAR32 (fragp->fr_subtype))
17940
            {
17941
              md_number_to_chars ((char *) buf, insn >> 16, 2);
17942
              buf += 2;
17943
              md_number_to_chars ((char *) buf, insn & 0xffff, 2);
17944
              buf += 2;
17945
 
17946
              gas_assert (buf == ((bfd_byte *) fragp->fr_literal
17947
                                  + fragp->fr_fix));
17948
              return;
17949
            }
17950
        }
17951
      else
17952
        {
17953
          unsigned long next;
17954
 
17955
          if (target_big_endian)
17956
            {
17957
              insn = bfd_getb16 (buf);
17958
              next = bfd_getb16 (buf + 2);
17959
            }
17960
          else
17961
            {
17962
              insn = bfd_getl16 (buf);
17963
              next = bfd_getl16 (buf + 2);
17964
            }
17965
          insn = (insn << 16) | next;
17966
        }
17967
 
17968
      /* Relax 32-bit branches to a sequence of instructions.  */
17969
      as_warn_where (fragp->fr_file, fragp->fr_line,
17970
                     _("Relaxed out-of-range branch into a jump"));
17971
 
17972
      /* Set the short-delay-slot bit.  */
17973
      short_ds = al && (insn & 0x02000000) != 0;
17974
 
17975
      if (!RELAX_MICROMIPS_UNCOND (fragp->fr_subtype))
17976
        {
17977
          symbolS *l;
17978
 
17979
          /* Reverse the branch.  */
17980
          if ((insn & 0xfc000000) == 0x94000000                 /* beq  */
17981
              || (insn & 0xfc000000) == 0xb4000000)             /* bne  */
17982
            insn ^= 0x20000000;
17983
          else if ((insn & 0xffe00000) == 0x40000000            /* bltz  */
17984
                   || (insn & 0xffe00000) == 0x40400000         /* bgez  */
17985
                   || (insn & 0xffe00000) == 0x40800000         /* blez  */
17986
                   || (insn & 0xffe00000) == 0x40c00000         /* bgtz  */
17987
                   || (insn & 0xffe00000) == 0x40a00000         /* bnezc  */
17988
                   || (insn & 0xffe00000) == 0x40e00000         /* beqzc  */
17989
                   || (insn & 0xffe00000) == 0x40200000         /* bltzal  */
17990
                   || (insn & 0xffe00000) == 0x40600000         /* bgezal  */
17991
                   || (insn & 0xffe00000) == 0x42200000         /* bltzals  */
17992
                   || (insn & 0xffe00000) == 0x42600000)        /* bgezals  */
17993
            insn ^= 0x00400000;
17994
          else if ((insn & 0xffe30000) == 0x43800000            /* bc1f  */
17995
                   || (insn & 0xffe30000) == 0x43a00000         /* bc1t  */
17996
                   || (insn & 0xffe30000) == 0x42800000         /* bc2f  */
17997
                   || (insn & 0xffe30000) == 0x42a00000)        /* bc2t  */
17998
            insn ^= 0x00200000;
17999
          else
18000
            abort ();
18001
 
18002
          if (al)
18003
            {
18004
              /* Clear the and-link and short-delay-slot bits.  */
18005
              gas_assert ((insn & 0xfda00000) == 0x40200000);
18006
 
18007
              /* bltzal  0x40200000     bgezal  0x40600000  */
18008
              /* bltzals 0x42200000     bgezals 0x42600000  */
18009
              insn &= ~0x02200000;
18010
            }
18011
 
18012
          /* Make a label at the end for use with the branch.  */
18013
          l = symbol_new (micromips_label_name (), asec, fragp->fr_fix, fragp);
18014
          micromips_label_inc ();
18015
#if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
18016
          if (IS_ELF)
18017
            S_SET_OTHER (l, ELF_ST_SET_MICROMIPS (S_GET_OTHER (l)));
18018
#endif
18019
 
18020
          /* Refer to it.  */
18021
          fixp = fix_new (fragp, buf - (bfd_byte *) fragp->fr_literal,
18022
                          4, l, 0, TRUE, BFD_RELOC_MICROMIPS_16_PCREL_S1);
18023
          fixp->fx_file = fragp->fr_file;
18024
          fixp->fx_line = fragp->fr_line;
18025
 
18026
          /* Branch over the jump.  */
18027
          md_number_to_chars ((char *) buf, insn >> 16, 2);
18028
          buf += 2;
18029
          md_number_to_chars ((char *) buf, insn & 0xffff, 2);
18030
          buf += 2;
18031
 
18032
          if (!compact)
18033
            {
18034
              /* nop  */
18035
              insn = 0x0c00;
18036
              md_number_to_chars ((char *) buf, insn, 2);
18037
              buf += 2;
18038
            }
18039
        }
18040
 
18041
      if (mips_pic == NO_PIC)
18042
        {
18043
          unsigned long jal = short_ds ? 0x74000000 : 0xf4000000; /* jal/s  */
18044
 
18045
          /* j/jal/jals <sym>  R_MICROMIPS_26_S1  */
18046
          insn = al ? jal : 0xd4000000;
18047
 
18048
          fixp = fix_new_exp (fragp, buf - (bfd_byte *) fragp->fr_literal,
18049
                              4, &exp, FALSE, BFD_RELOC_MICROMIPS_JMP);
18050
          fixp->fx_file = fragp->fr_file;
18051
          fixp->fx_line = fragp->fr_line;
18052
 
18053
          md_number_to_chars ((char *) buf, insn >> 16, 2);
18054
          buf += 2;
18055
          md_number_to_chars ((char *) buf, insn & 0xffff, 2);
18056
          buf += 2;
18057
 
18058
          if (compact)
18059
            {
18060
              /* nop  */
18061
              insn = 0x0c00;
18062
              md_number_to_chars ((char *) buf, insn, 2);
18063
              buf += 2;
18064
            }
18065
        }
18066
      else
18067
        {
18068
          unsigned long at = RELAX_MICROMIPS_AT (fragp->fr_subtype);
18069
          unsigned long jalr = short_ds ? 0x45e0 : 0x45c0;      /* jalr/s  */
18070
          unsigned long jr = compact ? 0x45a0 : 0x4580;         /* jr/c  */
18071
 
18072
          /* lw/ld $at, <sym>($gp)  R_MICROMIPS_GOT16  */
18073
          insn = HAVE_64BIT_ADDRESSES ? 0xdc1c0000 : 0xfc1c0000;
18074
          insn |= at << MICROMIPSOP_SH_RT;
18075
 
18076
          if (exp.X_add_number)
18077
            {
18078
              exp.X_add_symbol = make_expr_symbol (&exp);
18079
              exp.X_add_number = 0;
18080
            }
18081
 
18082
          fixp = fix_new_exp (fragp, buf - (bfd_byte *) fragp->fr_literal,
18083
                              4, &exp, FALSE, BFD_RELOC_MICROMIPS_GOT16);
18084
          fixp->fx_file = fragp->fr_file;
18085
          fixp->fx_line = fragp->fr_line;
18086
 
18087
          md_number_to_chars ((char *) buf, insn >> 16, 2);
18088
          buf += 2;
18089
          md_number_to_chars ((char *) buf, insn & 0xffff, 2);
18090
          buf += 2;
18091
 
18092
          /* d/addiu $at, $at, <sym>  R_MICROMIPS_LO16  */
18093
          insn = HAVE_64BIT_ADDRESSES ? 0x5c000000 : 0x30000000;
18094
          insn |= at << MICROMIPSOP_SH_RT | at << MICROMIPSOP_SH_RS;
18095
 
18096
          fixp = fix_new_exp (fragp, buf - (bfd_byte *) fragp->fr_literal,
18097
                              4, &exp, FALSE, BFD_RELOC_MICROMIPS_LO16);
18098
          fixp->fx_file = fragp->fr_file;
18099
          fixp->fx_line = fragp->fr_line;
18100
 
18101
          md_number_to_chars ((char *) buf, insn >> 16, 2);
18102
          buf += 2;
18103
          md_number_to_chars ((char *) buf, insn & 0xffff, 2);
18104
          buf += 2;
18105
 
18106
          /* jr/jrc/jalr/jalrs $at  */
18107
          insn = al ? jalr : jr;
18108
          insn |= at << MICROMIPSOP_SH_MJ;
18109
 
18110
          md_number_to_chars ((char *) buf, insn & 0xffff, 2);
18111
          buf += 2;
18112
        }
18113
 
18114
      gas_assert (buf == (bfd_byte *) fragp->fr_literal + fragp->fr_fix);
18115
      return;
18116
    }
18117
 
18118 16 khays
  if (RELAX_MIPS16_P (fragp->fr_subtype))
18119
    {
18120
      int type;
18121
      const struct mips16_immed_operand *op;
18122
      bfd_boolean small, ext;
18123
      offsetT val;
18124
      bfd_byte *buf;
18125
      unsigned long insn;
18126
      bfd_boolean use_extend;
18127
      unsigned short extend;
18128
 
18129
      type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
18130
      op = mips16_immed_operands;
18131
      while (op->type != type)
18132
        ++op;
18133
 
18134
      if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
18135
        {
18136
          small = FALSE;
18137
          ext = TRUE;
18138
        }
18139
      else
18140
        {
18141
          small = TRUE;
18142
          ext = FALSE;
18143
        }
18144
 
18145
      val = resolve_symbol_value (fragp->fr_symbol);
18146
      if (op->pcrel)
18147
        {
18148
          addressT addr;
18149
 
18150
          addr = fragp->fr_address + fragp->fr_fix;
18151
 
18152
          /* The rules for the base address of a PC relative reloc are
18153
             complicated; see mips16_extended_frag.  */
18154
          if (type == 'p' || type == 'q')
18155
            {
18156
              addr += 2;
18157
              if (ext)
18158
                addr += 2;
18159
              /* Ignore the low bit in the target, since it will be
18160
                 set for a text label.  */
18161
              if ((val & 1) != 0)
18162
                --val;
18163
            }
18164
          else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
18165
            addr -= 4;
18166
          else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
18167
            addr -= 2;
18168
 
18169
          addr &= ~ (addressT) ((1 << op->shift) - 1);
18170
          val -= addr;
18171
 
18172
          /* Make sure the section winds up with the alignment we have
18173
             assumed.  */
18174
          if (op->shift > 0)
18175
            record_alignment (asec, op->shift);
18176
        }
18177
 
18178
      if (ext
18179
          && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
18180
              || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
18181
        as_warn_where (fragp->fr_file, fragp->fr_line,
18182
                       _("extended instruction in delay slot"));
18183
 
18184
      buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
18185
 
18186
      if (target_big_endian)
18187
        insn = bfd_getb16 (buf);
18188
      else
18189
        insn = bfd_getl16 (buf);
18190
 
18191
      mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
18192
                    RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
18193
                    small, ext, &insn, &use_extend, &extend);
18194
 
18195
      if (use_extend)
18196
        {
18197
          md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
18198
          fragp->fr_fix += 2;
18199
          buf += 2;
18200
        }
18201
 
18202
      md_number_to_chars ((char *) buf, insn, 2);
18203
      fragp->fr_fix += 2;
18204
      buf += 2;
18205
    }
18206
  else
18207
    {
18208 160 khays
      relax_substateT subtype = fragp->fr_subtype;
18209
      bfd_boolean second_longer = (subtype & RELAX_SECOND_LONGER) != 0;
18210
      bfd_boolean use_second = (subtype & RELAX_USE_SECOND) != 0;
18211 16 khays
      int first, second;
18212
      fixS *fixp;
18213
 
18214 160 khays
      first = RELAX_FIRST (subtype);
18215
      second = RELAX_SECOND (subtype);
18216 16 khays
      fixp = (fixS *) fragp->fr_opcode;
18217
 
18218 160 khays
      /* If the delay slot chosen does not match the size of the instruction,
18219
         then emit a warning.  */
18220
      if ((!use_second && (subtype & RELAX_DELAY_SLOT_SIZE_FIRST) != 0)
18221
           || (use_second && (subtype & RELAX_DELAY_SLOT_SIZE_SECOND) != 0))
18222
        {
18223
          relax_substateT s;
18224
          const char *msg;
18225
 
18226
          s = subtype & (RELAX_DELAY_SLOT_16BIT
18227
                         | RELAX_DELAY_SLOT_SIZE_FIRST
18228
                         | RELAX_DELAY_SLOT_SIZE_SECOND);
18229
          msg = macro_warning (s);
18230
          if (msg != NULL)
18231
            as_warn_where (fragp->fr_file, fragp->fr_line, msg);
18232
          subtype &= ~s;
18233
        }
18234
 
18235 16 khays
      /* Possibly emit a warning if we've chosen the longer option.  */
18236 160 khays
      if (use_second == second_longer)
18237 16 khays
        {
18238 160 khays
          relax_substateT s;
18239
          const char *msg;
18240
 
18241
          s = (subtype
18242
               & (RELAX_SECOND_LONGER | RELAX_NOMACRO | RELAX_DELAY_SLOT));
18243
          msg = macro_warning (s);
18244
          if (msg != NULL)
18245
            as_warn_where (fragp->fr_file, fragp->fr_line, msg);
18246
          subtype &= ~s;
18247 16 khays
        }
18248
 
18249
      /* Go through all the fixups for the first sequence.  Disable them
18250
         (by marking them as done) if we're going to use the second
18251
         sequence instead.  */
18252
      while (fixp
18253
             && fixp->fx_frag == fragp
18254
             && fixp->fx_where < fragp->fr_fix - second)
18255
        {
18256 160 khays
          if (subtype & RELAX_USE_SECOND)
18257 16 khays
            fixp->fx_done = 1;
18258
          fixp = fixp->fx_next;
18259
        }
18260
 
18261
      /* Go through the fixups for the second sequence.  Disable them if
18262
         we're going to use the first sequence, otherwise adjust their
18263
         addresses to account for the relaxation.  */
18264
      while (fixp && fixp->fx_frag == fragp)
18265
        {
18266 160 khays
          if (subtype & RELAX_USE_SECOND)
18267 16 khays
            fixp->fx_where -= first;
18268
          else
18269
            fixp->fx_done = 1;
18270
          fixp = fixp->fx_next;
18271
        }
18272
 
18273
      /* Now modify the frag contents.  */
18274 160 khays
      if (subtype & RELAX_USE_SECOND)
18275 16 khays
        {
18276
          char *start;
18277
 
18278
          start = fragp->fr_literal + fragp->fr_fix - first - second;
18279
          memmove (start, start + first, second);
18280
          fragp->fr_fix -= first;
18281
        }
18282
      else
18283
        fragp->fr_fix -= second;
18284
    }
18285
}
18286
 
18287
#ifdef OBJ_ELF
18288
 
18289
/* This function is called after the relocs have been generated.
18290
   We've been storing mips16 text labels as odd.  Here we convert them
18291
   back to even for the convenience of the debugger.  */
18292
 
18293
void
18294
mips_frob_file_after_relocs (void)
18295
{
18296
  asymbol **syms;
18297
  unsigned int count, i;
18298
 
18299
  if (!IS_ELF)
18300
    return;
18301
 
18302
  syms = bfd_get_outsymbols (stdoutput);
18303
  count = bfd_get_symcount (stdoutput);
18304
  for (i = 0; i < count; i++, syms++)
18305 160 khays
    if (ELF_ST_IS_COMPRESSED (elf_symbol (*syms)->internal_elf_sym.st_other)
18306
        && ((*syms)->value & 1) != 0)
18307
      {
18308
        (*syms)->value &= ~1;
18309
        /* If the symbol has an odd size, it was probably computed
18310
           incorrectly, so adjust that as well.  */
18311
        if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
18312
          ++elf_symbol (*syms)->internal_elf_sym.st_size;
18313
      }
18314 16 khays
}
18315
 
18316
#endif
18317
 
18318
/* This function is called whenever a label is defined, including fake
18319
   labels instantiated off the dot special symbol.  It is used when
18320
   handling branch delays; if a branch has a label, we assume we cannot
18321
   move it.  This also bumps the value of the symbol by 1 in compressed
18322
   code.  */
18323
 
18324
void
18325
mips_record_label (symbolS *sym)
18326
{
18327
  segment_info_type *si = seg_info (now_seg);
18328
  struct insn_label_list *l;
18329
 
18330
  if (free_insn_labels == NULL)
18331
    l = (struct insn_label_list *) xmalloc (sizeof *l);
18332
  else
18333
    {
18334
      l = free_insn_labels;
18335
      free_insn_labels = l->next;
18336
    }
18337
 
18338
  l->label = sym;
18339
  l->next = si->label_list;
18340
  si->label_list = l;
18341
}
18342
 
18343
/* This function is called as tc_frob_label() whenever a label is defined
18344
   and adds a DWARF-2 record we only want for true labels.  */
18345
 
18346
void
18347
mips_define_label (symbolS *sym)
18348
{
18349
  mips_record_label (sym);
18350
#ifdef OBJ_ELF
18351
  dwarf2_emit_label (sym);
18352
#endif
18353
}
18354
 
18355
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
18356
 
18357
/* Some special processing for a MIPS ELF file.  */
18358
 
18359
void
18360
mips_elf_final_processing (void)
18361
{
18362
  /* Write out the register information.  */
18363
  if (mips_abi != N64_ABI)
18364
    {
18365
      Elf32_RegInfo s;
18366
 
18367
      s.ri_gprmask = mips_gprmask;
18368
      s.ri_cprmask[0] = mips_cprmask[0];
18369
      s.ri_cprmask[1] = mips_cprmask[1];
18370
      s.ri_cprmask[2] = mips_cprmask[2];
18371
      s.ri_cprmask[3] = mips_cprmask[3];
18372
      /* The gp_value field is set by the MIPS ELF backend.  */
18373
 
18374
      bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
18375
                                       ((Elf32_External_RegInfo *)
18376
                                        mips_regmask_frag));
18377
    }
18378
  else
18379
    {
18380
      Elf64_Internal_RegInfo s;
18381
 
18382
      s.ri_gprmask = mips_gprmask;
18383
      s.ri_pad = 0;
18384
      s.ri_cprmask[0] = mips_cprmask[0];
18385
      s.ri_cprmask[1] = mips_cprmask[1];
18386
      s.ri_cprmask[2] = mips_cprmask[2];
18387
      s.ri_cprmask[3] = mips_cprmask[3];
18388
      /* The gp_value field is set by the MIPS ELF backend.  */
18389
 
18390
      bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
18391
                                       ((Elf64_External_RegInfo *)
18392
                                        mips_regmask_frag));
18393
    }
18394
 
18395
  /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
18396
     sort of BFD interface for this.  */
18397
  if (mips_any_noreorder)
18398
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
18399
  if (mips_pic != NO_PIC)
18400
    {
18401
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
18402
      elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
18403
    }
18404
  if (mips_abicalls)
18405
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
18406
 
18407
  /* Set MIPS ELF flags for ASEs.  */
18408
  /* We may need to define a new flag for DSP ASE, and set this flag when
18409
     file_ase_dsp is true.  */
18410
  /* Same for DSP R2.  */
18411
  /* We may need to define a new flag for MT ASE, and set this flag when
18412
     file_ase_mt is true.  */
18413
  if (file_ase_mips16)
18414
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
18415 160 khays
  if (file_ase_micromips)
18416
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MICROMIPS;
18417 16 khays
#if 0 /* XXX FIXME */
18418
  if (file_ase_mips3d)
18419
    elf_elfheader (stdoutput)->e_flags |= ???;
18420
#endif
18421
  if (file_ase_mdmx)
18422
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
18423
 
18424
  /* Set the MIPS ELF ABI flags.  */
18425
  if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
18426
    elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
18427
  else if (mips_abi == O64_ABI)
18428
    elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
18429
  else if (mips_abi == EABI_ABI)
18430
    {
18431
      if (!file_mips_gp32)
18432
        elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
18433
      else
18434
        elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
18435
    }
18436
  else if (mips_abi == N32_ABI)
18437
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
18438
 
18439
  /* Nothing to do for N64_ABI.  */
18440
 
18441
  if (mips_32bitmode)
18442
    elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
18443
 
18444
#if 0 /* XXX FIXME */
18445
  /* 32 bit code with 64 bit FP registers.  */
18446
  if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
18447
    elf_elfheader (stdoutput)->e_flags |= ???;
18448
#endif
18449
}
18450
 
18451
#endif /* OBJ_ELF || OBJ_MAYBE_ELF */
18452
 
18453
typedef struct proc {
18454
  symbolS *func_sym;
18455
  symbolS *func_end_sym;
18456
  unsigned long reg_mask;
18457
  unsigned long reg_offset;
18458
  unsigned long fpreg_mask;
18459
  unsigned long fpreg_offset;
18460
  unsigned long frame_offset;
18461
  unsigned long frame_reg;
18462
  unsigned long pc_reg;
18463
} procS;
18464
 
18465
static procS cur_proc;
18466
static procS *cur_proc_ptr;
18467
static int numprocs;
18468
 
18469 160 khays
/* Implement NOP_OPCODE.  We encode a MIPS16 nop as "1", a microMIPS nop
18470
   as "2", and a normal nop as "0".  */
18471 16 khays
 
18472 160 khays
#define NOP_OPCODE_MIPS         0
18473
#define NOP_OPCODE_MIPS16       1
18474
#define NOP_OPCODE_MICROMIPS    2
18475
 
18476 16 khays
char
18477
mips_nop_opcode (void)
18478
{
18479 160 khays
  if (seg_info (now_seg)->tc_segment_info_data.micromips)
18480
    return NOP_OPCODE_MICROMIPS;
18481
  else if (seg_info (now_seg)->tc_segment_info_data.mips16)
18482
    return NOP_OPCODE_MIPS16;
18483
  else
18484
    return NOP_OPCODE_MIPS;
18485 16 khays
}
18486
 
18487 160 khays
/* Fill in an rs_align_code fragment.  Unlike elsewhere we want to use
18488
   32-bit microMIPS NOPs here (if applicable).  */
18489 16 khays
 
18490
void
18491
mips_handle_align (fragS *fragp)
18492
{
18493 160 khays
  char nop_opcode;
18494 16 khays
  char *p;
18495
  int bytes, size, excess;
18496
  valueT opcode;
18497
 
18498
  if (fragp->fr_type != rs_align_code)
18499
    return;
18500
 
18501
  p = fragp->fr_literal + fragp->fr_fix;
18502 160 khays
  nop_opcode = *p;
18503
  switch (nop_opcode)
18504 16 khays
    {
18505 160 khays
    case NOP_OPCODE_MICROMIPS:
18506
      opcode = micromips_nop32_insn.insn_opcode;
18507
      size = 4;
18508
      break;
18509
    case NOP_OPCODE_MIPS16:
18510 16 khays
      opcode = mips16_nop_insn.insn_opcode;
18511
      size = 2;
18512 160 khays
      break;
18513
    case NOP_OPCODE_MIPS:
18514
    default:
18515 16 khays
      opcode = nop_insn.insn_opcode;
18516
      size = 4;
18517 160 khays
      break;
18518 16 khays
    }
18519
 
18520
  bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
18521
  excess = bytes % size;
18522 160 khays
 
18523
  /* Handle the leading part if we're not inserting a whole number of
18524
     instructions, and make it the end of the fixed part of the frag.
18525
     Try to fit in a short microMIPS NOP if applicable and possible,
18526
     and use zeroes otherwise.  */
18527
  gas_assert (excess < 4);
18528
  fragp->fr_fix += excess;
18529
  switch (excess)
18530 16 khays
    {
18531 160 khays
    case 3:
18532
      *p++ = '\0';
18533
      /* Fall through.  */
18534
    case 2:
18535
      if (nop_opcode == NOP_OPCODE_MICROMIPS)
18536
        {
18537
          md_number_to_chars (p, micromips_nop16_insn.insn_opcode, 2);
18538
          p += 2;
18539
          break;
18540
        }
18541
      *p++ = '\0';
18542
      /* Fall through.  */
18543
    case 1:
18544
      *p++ = '\0';
18545
      /* Fall through.  */
18546
    case 0:
18547
      break;
18548 16 khays
    }
18549
 
18550
  md_number_to_chars (p, opcode, size);
18551
  fragp->fr_var = size;
18552
}
18553
 
18554
static void
18555
md_obj_begin (void)
18556
{
18557
}
18558
 
18559
static void
18560
md_obj_end (void)
18561
{
18562
  /* Check for premature end, nesting errors, etc.  */
18563
  if (cur_proc_ptr)
18564
    as_warn (_("missing .end at end of assembly"));
18565
}
18566
 
18567
static long
18568
get_number (void)
18569
{
18570
  int negative = 0;
18571
  long val = 0;
18572
 
18573
  if (*input_line_pointer == '-')
18574
    {
18575
      ++input_line_pointer;
18576
      negative = 1;
18577
    }
18578
  if (!ISDIGIT (*input_line_pointer))
18579
    as_bad (_("expected simple number"));
18580
  if (input_line_pointer[0] == '0')
18581
    {
18582
      if (input_line_pointer[1] == 'x')
18583
        {
18584
          input_line_pointer += 2;
18585
          while (ISXDIGIT (*input_line_pointer))
18586
            {
18587
              val <<= 4;
18588
              val |= hex_value (*input_line_pointer++);
18589
            }
18590
          return negative ? -val : val;
18591
        }
18592
      else
18593
        {
18594
          ++input_line_pointer;
18595
          while (ISDIGIT (*input_line_pointer))
18596
            {
18597
              val <<= 3;
18598
              val |= *input_line_pointer++ - '0';
18599
            }
18600
          return negative ? -val : val;
18601
        }
18602
    }
18603
  if (!ISDIGIT (*input_line_pointer))
18604
    {
18605
      printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
18606
              *input_line_pointer, *input_line_pointer);
18607
      as_warn (_("invalid number"));
18608
      return -1;
18609
    }
18610
  while (ISDIGIT (*input_line_pointer))
18611
    {
18612
      val *= 10;
18613
      val += *input_line_pointer++ - '0';
18614
    }
18615
  return negative ? -val : val;
18616
}
18617
 
18618
/* The .file directive; just like the usual .file directive, but there
18619
   is an initial number which is the ECOFF file index.  In the non-ECOFF
18620
   case .file implies DWARF-2.  */
18621
 
18622
static void
18623
s_mips_file (int x ATTRIBUTE_UNUSED)
18624
{
18625
  static int first_file_directive = 0;
18626
 
18627
  if (ECOFF_DEBUGGING)
18628
    {
18629
      get_number ();
18630
      s_app_file (0);
18631
    }
18632
  else
18633
    {
18634
      char *filename;
18635
 
18636
      filename = dwarf2_directive_file (0);
18637
 
18638
      /* Versions of GCC up to 3.1 start files with a ".file"
18639
         directive even for stabs output.  Make sure that this
18640
         ".file" is handled.  Note that you need a version of GCC
18641
         after 3.1 in order to support DWARF-2 on MIPS.  */
18642
      if (filename != NULL && ! first_file_directive)
18643
        {
18644
          (void) new_logical_line (filename, -1);
18645
          s_app_file_string (filename, 0);
18646
        }
18647
      first_file_directive = 1;
18648
    }
18649
}
18650
 
18651
/* The .loc directive, implying DWARF-2.  */
18652
 
18653
static void
18654
s_mips_loc (int x ATTRIBUTE_UNUSED)
18655
{
18656
  if (!ECOFF_DEBUGGING)
18657
    dwarf2_directive_loc (0);
18658
}
18659
 
18660
/* The .end directive.  */
18661
 
18662
static void
18663
s_mips_end (int x ATTRIBUTE_UNUSED)
18664
{
18665
  symbolS *p;
18666
 
18667
  /* Following functions need their own .frame and .cprestore directives.  */
18668
  mips_frame_reg_valid = 0;
18669
  mips_cprestore_valid = 0;
18670
 
18671
  if (!is_end_of_line[(unsigned char) *input_line_pointer])
18672
    {
18673
      p = get_symbol ();
18674
      demand_empty_rest_of_line ();
18675
    }
18676
  else
18677
    p = NULL;
18678
 
18679
  if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
18680
    as_warn (_(".end not in text section"));
18681
 
18682
  if (!cur_proc_ptr)
18683
    {
18684
      as_warn (_(".end directive without a preceding .ent directive."));
18685
      demand_empty_rest_of_line ();
18686
      return;
18687
    }
18688
 
18689
  if (p != NULL)
18690
    {
18691
      gas_assert (S_GET_NAME (p));
18692
      if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
18693
        as_warn (_(".end symbol does not match .ent symbol."));
18694
 
18695
      if (debug_type == DEBUG_STABS)
18696
        stabs_generate_asm_endfunc (S_GET_NAME (p),
18697
                                    S_GET_NAME (p));
18698
    }
18699
  else
18700
    as_warn (_(".end directive missing or unknown symbol"));
18701
 
18702
#ifdef OBJ_ELF
18703
  /* Create an expression to calculate the size of the function.  */
18704
  if (p && cur_proc_ptr)
18705
    {
18706
      OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
18707
      expressionS *exp = xmalloc (sizeof (expressionS));
18708
 
18709
      obj->size = exp;
18710
      exp->X_op = O_subtract;
18711
      exp->X_add_symbol = symbol_temp_new_now ();
18712
      exp->X_op_symbol = p;
18713
      exp->X_add_number = 0;
18714
 
18715
      cur_proc_ptr->func_end_sym = exp->X_add_symbol;
18716
    }
18717
 
18718
  /* Generate a .pdr section.  */
18719
  if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
18720
    {
18721
      segT saved_seg = now_seg;
18722
      subsegT saved_subseg = now_subseg;
18723
      expressionS exp;
18724
      char *fragp;
18725
 
18726
#ifdef md_flush_pending_output
18727
      md_flush_pending_output ();
18728
#endif
18729
 
18730
      gas_assert (pdr_seg);
18731
      subseg_set (pdr_seg, 0);
18732
 
18733
      /* Write the symbol.  */
18734
      exp.X_op = O_symbol;
18735
      exp.X_add_symbol = p;
18736
      exp.X_add_number = 0;
18737
      emit_expr (&exp, 4);
18738
 
18739
      fragp = frag_more (7 * 4);
18740
 
18741
      md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
18742
      md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
18743
      md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
18744
      md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
18745
      md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
18746
      md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
18747
      md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
18748
 
18749
      subseg_set (saved_seg, saved_subseg);
18750
    }
18751
#endif /* OBJ_ELF */
18752
 
18753
  cur_proc_ptr = NULL;
18754
}
18755
 
18756
/* The .aent and .ent directives.  */
18757
 
18758
static void
18759
s_mips_ent (int aent)
18760
{
18761
  symbolS *symbolP;
18762
 
18763
  symbolP = get_symbol ();
18764
  if (*input_line_pointer == ',')
18765
    ++input_line_pointer;
18766
  SKIP_WHITESPACE ();
18767
  if (ISDIGIT (*input_line_pointer)
18768
      || *input_line_pointer == '-')
18769
    get_number ();
18770
 
18771
  if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
18772
    as_warn (_(".ent or .aent not in text section."));
18773
 
18774
  if (!aent && cur_proc_ptr)
18775
    as_warn (_("missing .end"));
18776
 
18777
  if (!aent)
18778
    {
18779
      /* This function needs its own .frame and .cprestore directives.  */
18780
      mips_frame_reg_valid = 0;
18781
      mips_cprestore_valid = 0;
18782
 
18783
      cur_proc_ptr = &cur_proc;
18784
      memset (cur_proc_ptr, '\0', sizeof (procS));
18785
 
18786
      cur_proc_ptr->func_sym = symbolP;
18787
 
18788
      ++numprocs;
18789
 
18790
      if (debug_type == DEBUG_STABS)
18791
        stabs_generate_asm_func (S_GET_NAME (symbolP),
18792
                                 S_GET_NAME (symbolP));
18793
    }
18794
 
18795
  symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
18796
 
18797
  demand_empty_rest_of_line ();
18798
}
18799
 
18800
/* The .frame directive. If the mdebug section is present (IRIX 5 native)
18801
   then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
18802
   s_mips_frame is used so that we can set the PDR information correctly.
18803
   We can't use the ecoff routines because they make reference to the ecoff
18804
   symbol table (in the mdebug section).  */
18805
 
18806
static void
18807
s_mips_frame (int ignore ATTRIBUTE_UNUSED)
18808
{
18809
#ifdef OBJ_ELF
18810
  if (IS_ELF && !ECOFF_DEBUGGING)
18811
    {
18812
      long val;
18813
 
18814
      if (cur_proc_ptr == (procS *) NULL)
18815
        {
18816
          as_warn (_(".frame outside of .ent"));
18817
          demand_empty_rest_of_line ();
18818
          return;
18819
        }
18820
 
18821
      cur_proc_ptr->frame_reg = tc_get_register (1);
18822
 
18823
      SKIP_WHITESPACE ();
18824
      if (*input_line_pointer++ != ','
18825
          || get_absolute_expression_and_terminator (&val) != ',')
18826
        {
18827
          as_warn (_("Bad .frame directive"));
18828
          --input_line_pointer;
18829
          demand_empty_rest_of_line ();
18830
          return;
18831
        }
18832
 
18833
      cur_proc_ptr->frame_offset = val;
18834
      cur_proc_ptr->pc_reg = tc_get_register (0);
18835
 
18836
      demand_empty_rest_of_line ();
18837
    }
18838
  else
18839
#endif /* OBJ_ELF */
18840
    s_ignore (ignore);
18841
}
18842
 
18843
/* The .fmask and .mask directives. If the mdebug section is present
18844
   (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
18845
   embedded targets, s_mips_mask is used so that we can set the PDR
18846
   information correctly. We can't use the ecoff routines because they
18847
   make reference to the ecoff symbol table (in the mdebug section).  */
18848
 
18849
static void
18850
s_mips_mask (int reg_type)
18851
{
18852
#ifdef OBJ_ELF
18853
  if (IS_ELF && !ECOFF_DEBUGGING)
18854
    {
18855
      long mask, off;
18856
 
18857
      if (cur_proc_ptr == (procS *) NULL)
18858
        {
18859
          as_warn (_(".mask/.fmask outside of .ent"));
18860
          demand_empty_rest_of_line ();
18861
          return;
18862
        }
18863
 
18864
      if (get_absolute_expression_and_terminator (&mask) != ',')
18865
        {
18866
          as_warn (_("Bad .mask/.fmask directive"));
18867
          --input_line_pointer;
18868
          demand_empty_rest_of_line ();
18869
          return;
18870
        }
18871
 
18872
      off = get_absolute_expression ();
18873
 
18874
      if (reg_type == 'F')
18875
        {
18876
          cur_proc_ptr->fpreg_mask = mask;
18877
          cur_proc_ptr->fpreg_offset = off;
18878
        }
18879
      else
18880
        {
18881
          cur_proc_ptr->reg_mask = mask;
18882
          cur_proc_ptr->reg_offset = off;
18883
        }
18884
 
18885
      demand_empty_rest_of_line ();
18886
    }
18887
  else
18888
#endif /* OBJ_ELF */
18889
    s_ignore (reg_type);
18890
}
18891
 
18892
/* A table describing all the processors gas knows about.  Names are
18893
   matched in the order listed.
18894
 
18895
   To ease comparison, please keep this table in the same order as
18896
   gcc's mips_cpu_info_table[].  */
18897
static const struct mips_cpu_info mips_cpu_info_table[] =
18898
{
18899
  /* Entries for generic ISAs */
18900
  { "mips1",          MIPS_CPU_IS_ISA,          ISA_MIPS1,      CPU_R3000 },
18901
  { "mips2",          MIPS_CPU_IS_ISA,          ISA_MIPS2,      CPU_R6000 },
18902
  { "mips3",          MIPS_CPU_IS_ISA,          ISA_MIPS3,      CPU_R4000 },
18903
  { "mips4",          MIPS_CPU_IS_ISA,          ISA_MIPS4,      CPU_R8000 },
18904
  { "mips5",          MIPS_CPU_IS_ISA,          ISA_MIPS5,      CPU_MIPS5 },
18905
  { "mips32",         MIPS_CPU_IS_ISA,          ISA_MIPS32,     CPU_MIPS32 },
18906
  { "mips32r2",       MIPS_CPU_IS_ISA,          ISA_MIPS32R2,   CPU_MIPS32R2 },
18907
  { "mips64",         MIPS_CPU_IS_ISA,          ISA_MIPS64,     CPU_MIPS64 },
18908
  { "mips64r2",       MIPS_CPU_IS_ISA,          ISA_MIPS64R2,   CPU_MIPS64R2 },
18909
 
18910
  /* MIPS I */
18911
  { "r3000",          0,                 ISA_MIPS1,      CPU_R3000 },
18912
  { "r2000",          0,                 ISA_MIPS1,      CPU_R3000 },
18913
  { "r3900",          0,                 ISA_MIPS1,      CPU_R3900 },
18914
 
18915
  /* MIPS II */
18916
  { "r6000",          0,                 ISA_MIPS2,      CPU_R6000 },
18917
 
18918
  /* MIPS III */
18919
  { "r4000",          0,                 ISA_MIPS3,      CPU_R4000 },
18920
  { "r4010",          0,                 ISA_MIPS2,      CPU_R4010 },
18921
  { "vr4100",         0,                 ISA_MIPS3,      CPU_VR4100 },
18922
  { "vr4111",         0,                 ISA_MIPS3,      CPU_R4111 },
18923
  { "vr4120",         0,                 ISA_MIPS3,      CPU_VR4120 },
18924
  { "vr4130",         0,                 ISA_MIPS3,      CPU_VR4120 },
18925
  { "vr4181",         0,                 ISA_MIPS3,      CPU_R4111 },
18926
  { "vr4300",         0,                 ISA_MIPS3,      CPU_R4300 },
18927
  { "r4400",          0,                 ISA_MIPS3,      CPU_R4400 },
18928
  { "r4600",          0,                 ISA_MIPS3,      CPU_R4600 },
18929
  { "orion",          0,                 ISA_MIPS3,      CPU_R4600 },
18930
  { "r4650",          0,                 ISA_MIPS3,      CPU_R4650 },
18931
  /* ST Microelectronics Loongson 2E and 2F cores */
18932
  { "loongson2e",     0,                 ISA_MIPS3,   CPU_LOONGSON_2E },
18933
  { "loongson2f",     0,                 ISA_MIPS3,   CPU_LOONGSON_2F },
18934
 
18935
  /* MIPS IV */
18936
  { "r8000",          0,                 ISA_MIPS4,      CPU_R8000 },
18937
  { "r10000",         0,                 ISA_MIPS4,      CPU_R10000 },
18938
  { "r12000",         0,                 ISA_MIPS4,      CPU_R12000 },
18939
  { "r14000",         0,                 ISA_MIPS4,      CPU_R14000 },
18940
  { "r16000",         0,                 ISA_MIPS4,      CPU_R16000 },
18941
  { "vr5000",         0,                 ISA_MIPS4,      CPU_R5000 },
18942
  { "vr5400",         0,                 ISA_MIPS4,      CPU_VR5400 },
18943
  { "vr5500",         0,                 ISA_MIPS4,      CPU_VR5500 },
18944
  { "rm5200",         0,                 ISA_MIPS4,      CPU_R5000 },
18945
  { "rm5230",         0,                 ISA_MIPS4,      CPU_R5000 },
18946
  { "rm5231",         0,                 ISA_MIPS4,      CPU_R5000 },
18947
  { "rm5261",         0,                 ISA_MIPS4,      CPU_R5000 },
18948
  { "rm5721",         0,                 ISA_MIPS4,      CPU_R5000 },
18949
  { "rm7000",         0,                 ISA_MIPS4,      CPU_RM7000 },
18950
  { "rm9000",         0,                 ISA_MIPS4,      CPU_RM9000 },
18951
 
18952
  /* MIPS 32 */
18953
  { "4kc",            0,                 ISA_MIPS32,     CPU_MIPS32 },
18954
  { "4km",            0,                 ISA_MIPS32,     CPU_MIPS32 },
18955
  { "4kp",            0,                 ISA_MIPS32,     CPU_MIPS32 },
18956
  { "4ksc",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32,     CPU_MIPS32 },
18957
 
18958
  /* MIPS 32 Release 2 */
18959
  { "4kec",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18960
  { "4kem",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18961
  { "4kep",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18962
  { "4ksd",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32R2,   CPU_MIPS32R2 },
18963
  { "m4k",            0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18964
  { "m4kp",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18965 160 khays
  { "m14k",           MIPS_CPU_ASE_MCU,         ISA_MIPS32R2,   CPU_MIPS32R2 },
18966
  { "m14kc",          MIPS_CPU_ASE_MCU,         ISA_MIPS32R2,   CPU_MIPS32R2 },
18967 16 khays
  { "24kc",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18968
  { "24kf2_1",        0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18969
  { "24kf",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18970
  { "24kf1_1",        0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18971
  /* Deprecated forms of the above.  */
18972
  { "24kfx",          0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18973
  { "24kx",           0,                 ISA_MIPS32R2,   CPU_MIPS32R2 },
18974
  /* 24KE is a 24K with DSP ASE, other ASEs are optional.  */
18975
  { "24kec",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
18976
  { "24kef2_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
18977
  { "24kef",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
18978
  { "24kef1_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
18979
  /* Deprecated forms of the above.  */
18980
  { "24kefx",         MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
18981
  { "24kex",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
18982
  /* 34K is a 24K with DSP and MT ASE, other ASEs are optional.  */
18983
  { "34kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
18984
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
18985
  { "34kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
18986
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
18987
  { "34kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
18988
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
18989
  { "34kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
18990
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
18991
  /* Deprecated forms of the above.  */
18992
  { "34kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
18993
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
18994
  { "34kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
18995
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
18996
  /* 74K with DSP and DSPR2 ASE, other ASEs are optional.  */
18997
  { "74kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
18998
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
18999
  { "74kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19000
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
19001
  { "74kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19002
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
19003
  { "74kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19004
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
19005
  { "74kf3_2",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19006
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
19007
  /* Deprecated forms of the above.  */
19008
  { "74kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19009
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
19010
  { "74kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
19011
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
19012
  /* 1004K cores are multiprocessor versions of the 34K.  */
19013
  { "1004kc",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19014
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
19015
  { "1004kf2_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19016
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
19017
  { "1004kf",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19018
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
19019
  { "1004kf1_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
19020
                                                ISA_MIPS32R2,   CPU_MIPS32R2 },
19021
 
19022
  /* MIPS 64 */
19023
  { "5kc",            0,                 ISA_MIPS64,     CPU_MIPS64 },
19024
  { "5kf",            0,                 ISA_MIPS64,     CPU_MIPS64 },
19025
  { "20kc",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
19026
  { "25kf",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
19027
 
19028
  /* Broadcom SB-1 CPU core */
19029
  { "sb1",            MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
19030
                                                ISA_MIPS64,     CPU_SB1 },
19031
  /* Broadcom SB-1A CPU core */
19032
  { "sb1a",           MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
19033
                                                ISA_MIPS64,     CPU_SB1 },
19034
 
19035
  { "loongson3a",     0,                 ISA_MIPS64,     CPU_LOONGSON_3A },
19036
 
19037
  /* MIPS 64 Release 2 */
19038
 
19039
  /* Cavium Networks Octeon CPU core */
19040
  { "octeon",         0,      ISA_MIPS64R2,   CPU_OCTEON },
19041
 
19042
  /* RMI Xlr */
19043
  { "xlr",            0,      ISA_MIPS64,     CPU_XLR },
19044
 
19045
  /* End marker */
19046
  { NULL, 0, 0, 0 }
19047
};
19048
 
19049
 
19050
/* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
19051
   with a final "000" replaced by "k".  Ignore case.
19052
 
19053
   Note: this function is shared between GCC and GAS.  */
19054
 
19055
static bfd_boolean
19056
mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
19057
{
19058
  while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
19059
    given++, canonical++;
19060
 
19061
  return ((*given == 0 && *canonical == 0)
19062
          || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
19063
}
19064
 
19065
 
19066
/* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
19067
   CPU name.  We've traditionally allowed a lot of variation here.
19068
 
19069
   Note: this function is shared between GCC and GAS.  */
19070
 
19071
static bfd_boolean
19072
mips_matching_cpu_name_p (const char *canonical, const char *given)
19073
{
19074
  /* First see if the name matches exactly, or with a final "000"
19075
     turned into "k".  */
19076
  if (mips_strict_matching_cpu_name_p (canonical, given))
19077
    return TRUE;
19078
 
19079
  /* If not, try comparing based on numerical designation alone.
19080
     See if GIVEN is an unadorned number, or 'r' followed by a number.  */
19081
  if (TOLOWER (*given) == 'r')
19082
    given++;
19083
  if (!ISDIGIT (*given))
19084
    return FALSE;
19085
 
19086
  /* Skip over some well-known prefixes in the canonical name,
19087
     hoping to find a number there too.  */
19088
  if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
19089
    canonical += 2;
19090
  else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
19091
    canonical += 2;
19092
  else if (TOLOWER (canonical[0]) == 'r')
19093
    canonical += 1;
19094
 
19095
  return mips_strict_matching_cpu_name_p (canonical, given);
19096
}
19097
 
19098
 
19099
/* Parse an option that takes the name of a processor as its argument.
19100
   OPTION is the name of the option and CPU_STRING is the argument.
19101
   Return the corresponding processor enumeration if the CPU_STRING is
19102
   recognized, otherwise report an error and return null.
19103
 
19104
   A similar function exists in GCC.  */
19105
 
19106
static const struct mips_cpu_info *
19107
mips_parse_cpu (const char *option, const char *cpu_string)
19108
{
19109
  const struct mips_cpu_info *p;
19110
 
19111
  /* 'from-abi' selects the most compatible architecture for the given
19112
     ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
19113
     EABIs, we have to decide whether we're using the 32-bit or 64-bit
19114
     version.  Look first at the -mgp options, if given, otherwise base
19115
     the choice on MIPS_DEFAULT_64BIT.
19116
 
19117
     Treat NO_ABI like the EABIs.  One reason to do this is that the
19118
     plain 'mips' and 'mips64' configs have 'from-abi' as their default
19119
     architecture.  This code picks MIPS I for 'mips' and MIPS III for
19120
     'mips64', just as we did in the days before 'from-abi'.  */
19121
  if (strcasecmp (cpu_string, "from-abi") == 0)
19122
    {
19123
      if (ABI_NEEDS_32BIT_REGS (mips_abi))
19124
        return mips_cpu_info_from_isa (ISA_MIPS1);
19125
 
19126
      if (ABI_NEEDS_64BIT_REGS (mips_abi))
19127
        return mips_cpu_info_from_isa (ISA_MIPS3);
19128
 
19129
      if (file_mips_gp32 >= 0)
19130
        return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
19131
 
19132
      return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
19133
                                     ? ISA_MIPS3
19134
                                     : ISA_MIPS1);
19135
    }
19136
 
19137
  /* 'default' has traditionally been a no-op.  Probably not very useful.  */
19138
  if (strcasecmp (cpu_string, "default") == 0)
19139
    return 0;
19140
 
19141
  for (p = mips_cpu_info_table; p->name != 0; p++)
19142
    if (mips_matching_cpu_name_p (p->name, cpu_string))
19143
      return p;
19144
 
19145
  as_bad (_("Bad value (%s) for %s"), cpu_string, option);
19146
  return 0;
19147
}
19148
 
19149
/* Return the canonical processor information for ISA (a member of the
19150
   ISA_MIPS* enumeration).  */
19151
 
19152
static const struct mips_cpu_info *
19153
mips_cpu_info_from_isa (int isa)
19154
{
19155
  int i;
19156
 
19157
  for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19158
    if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
19159
        && isa == mips_cpu_info_table[i].isa)
19160
      return (&mips_cpu_info_table[i]);
19161
 
19162
  return NULL;
19163
}
19164
 
19165
static const struct mips_cpu_info *
19166
mips_cpu_info_from_arch (int arch)
19167
{
19168
  int i;
19169
 
19170
  for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19171
    if (arch == mips_cpu_info_table[i].cpu)
19172
      return (&mips_cpu_info_table[i]);
19173
 
19174
  return NULL;
19175
}
19176
 
19177
static void
19178
show (FILE *stream, const char *string, int *col_p, int *first_p)
19179
{
19180
  if (*first_p)
19181
    {
19182
      fprintf (stream, "%24s", "");
19183
      *col_p = 24;
19184
    }
19185
  else
19186
    {
19187
      fprintf (stream, ", ");
19188
      *col_p += 2;
19189
    }
19190
 
19191
  if (*col_p + strlen (string) > 72)
19192
    {
19193
      fprintf (stream, "\n%24s", "");
19194
      *col_p = 24;
19195
    }
19196
 
19197
  fprintf (stream, "%s", string);
19198
  *col_p += strlen (string);
19199
 
19200
  *first_p = 0;
19201
}
19202
 
19203
void
19204
md_show_usage (FILE *stream)
19205
{
19206
  int column, first;
19207
  size_t i;
19208
 
19209
  fprintf (stream, _("\
19210
MIPS options:\n\
19211
-EB                     generate big endian output\n\
19212
-EL                     generate little endian output\n\
19213
-g, -g2                 do not remove unneeded NOPs or swap branches\n\
19214
-G NUM                  allow referencing objects up to NUM bytes\n\
19215
                        implicitly with the gp register [default 8]\n"));
19216
  fprintf (stream, _("\
19217
-mips1                  generate MIPS ISA I instructions\n\
19218
-mips2                  generate MIPS ISA II instructions\n\
19219
-mips3                  generate MIPS ISA III instructions\n\
19220
-mips4                  generate MIPS ISA IV instructions\n\
19221
-mips5                  generate MIPS ISA V instructions\n\
19222
-mips32                 generate MIPS32 ISA instructions\n\
19223
-mips32r2               generate MIPS32 release 2 ISA instructions\n\
19224
-mips64                 generate MIPS64 ISA instructions\n\
19225
-mips64r2               generate MIPS64 release 2 ISA instructions\n\
19226
-march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
19227
 
19228
  first = 1;
19229
 
19230
  for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
19231
    show (stream, mips_cpu_info_table[i].name, &column, &first);
19232
  show (stream, "from-abi", &column, &first);
19233
  fputc ('\n', stream);
19234
 
19235
  fprintf (stream, _("\
19236
-mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
19237
-no-mCPU                don't generate code specific to CPU.\n\
19238
                        For -mCPU and -no-mCPU, CPU must be one of:\n"));
19239
 
19240
  first = 1;
19241
 
19242
  show (stream, "3900", &column, &first);
19243
  show (stream, "4010", &column, &first);
19244
  show (stream, "4100", &column, &first);
19245
  show (stream, "4650", &column, &first);
19246
  fputc ('\n', stream);
19247
 
19248
  fprintf (stream, _("\
19249
-mips16                 generate mips16 instructions\n\
19250
-no-mips16              do not generate mips16 instructions\n"));
19251
  fprintf (stream, _("\
19252 160 khays
-mmicromips             generate microMIPS instructions\n\
19253
-mno-micromips          do not generate microMIPS instructions\n"));
19254
  fprintf (stream, _("\
19255 16 khays
-msmartmips             generate smartmips instructions\n\
19256
-mno-smartmips          do not generate smartmips instructions\n"));
19257
  fprintf (stream, _("\
19258
-mdsp                   generate DSP instructions\n\
19259
-mno-dsp                do not generate DSP instructions\n"));
19260
  fprintf (stream, _("\
19261
-mdspr2                 generate DSP R2 instructions\n\
19262
-mno-dspr2              do not generate DSP R2 instructions\n"));
19263
  fprintf (stream, _("\
19264
-mmt                    generate MT instructions\n\
19265
-mno-mt                 do not generate MT instructions\n"));
19266
  fprintf (stream, _("\
19267 160 khays
-mmcu                   generate MCU instructions\n\
19268
-mno-mcu                do not generate MCU instructions\n"));
19269
  fprintf (stream, _("\
19270 16 khays
-mfix-loongson2f-jump   work around Loongson2F JUMP instructions\n\
19271
-mfix-loongson2f-nop    work around Loongson2F NOP errata\n\
19272
-mfix-vr4120            work around certain VR4120 errata\n\
19273
-mfix-vr4130            work around VR4130 mflo/mfhi errata\n\
19274
-mfix-24k               insert a nop after ERET and DERET instructions\n\
19275
-mfix-cn63xxp1          work around CN63XXP1 PREF errata\n\
19276
-mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
19277
-mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
19278
-msym32                 assume all symbols have 32-bit values\n\
19279
-O0                     remove unneeded NOPs, do not swap branches\n\
19280
-O                      remove unneeded NOPs and swap branches\n\
19281
--trap, --no-break      trap exception on div by 0 and mult overflow\n\
19282
--break, --no-trap      break exception on div by 0 and mult overflow\n"));
19283
  fprintf (stream, _("\
19284
-mhard-float            allow floating-point instructions\n\
19285
-msoft-float            do not allow floating-point instructions\n\
19286
-msingle-float          only allow 32-bit floating-point operations\n\
19287
-mdouble-float          allow 32-bit and 64-bit floating-point operations\n\
19288
--[no-]construct-floats [dis]allow floating point values to be constructed\n"
19289
                     ));
19290
#ifdef OBJ_ELF
19291
  fprintf (stream, _("\
19292
-KPIC, -call_shared     generate SVR4 position independent code\n\
19293
-call_nonpic            generate non-PIC code that can operate with DSOs\n\
19294
-mvxworks-pic           generate VxWorks position independent code\n\
19295
-non_shared             do not generate code that can operate with DSOs\n\
19296
-xgot                   assume a 32 bit GOT\n\
19297
-mpdr, -mno-pdr         enable/disable creation of .pdr sections\n\
19298
-mshared, -mno-shared   disable/enable .cpload optimization for\n\
19299
                        position dependent (non shared) code\n\
19300
-mabi=ABI               create ABI conformant object file for:\n"));
19301
 
19302
  first = 1;
19303
 
19304
  show (stream, "32", &column, &first);
19305
  show (stream, "o64", &column, &first);
19306
  show (stream, "n32", &column, &first);
19307
  show (stream, "64", &column, &first);
19308
  show (stream, "eabi", &column, &first);
19309
 
19310
  fputc ('\n', stream);
19311
 
19312
  fprintf (stream, _("\
19313
-32                     create o32 ABI object file (default)\n\
19314
-n32                    create n32 ABI object file\n\
19315
-64                     create 64 ABI object file\n"));
19316
#endif
19317
}
19318
 
19319
#ifdef TE_IRIX
19320
enum dwarf2_format
19321
mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
19322
{
19323
  if (HAVE_64BIT_SYMBOLS)
19324
    return dwarf2_format_64bit_irix;
19325
  else
19326
    return dwarf2_format_32bit;
19327
}
19328
#endif
19329
 
19330
int
19331
mips_dwarf2_addr_size (void)
19332
{
19333
  if (HAVE_64BIT_OBJECTS)
19334
    return 8;
19335
  else
19336
    return 4;
19337
}
19338
 
19339
/* Standard calling conventions leave the CFA at SP on entry.  */
19340
void
19341
mips_cfi_frame_initial_instructions (void)
19342
{
19343
  cfi_add_CFA_def_cfa_register (SP);
19344
}
19345
 
19346
int
19347
tc_mips_regname_to_dw2regnum (char *regname)
19348
{
19349
  unsigned int regnum = -1;
19350
  unsigned int reg;
19351
 
19352
  if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
19353
    regnum = reg;
19354
 
19355
  return regnum;
19356
}

powered by: WebSVN 2.1.0

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