]> Git Repo - binutils.git/blob - gas/config/tc-mips.c
c34cdf440acc64e13964442fa76b568a574b96a1
[binutils.git] / gas / config / tc-mips.c
1 /* tc-mips.c -- assemble code for a MIPS chip.
2    Copyright (C) 1993 Free Software Foundation, Inc.
3    Contributed by the OSF and Ralph Campbell.
4    Written by Keith Knowles and Ralph Campbell, working independently.
5    Modified for ECOFF and R4000 support by Ian Lance Taylor of Cygnus
6    Support.
7
8    This file is part of GAS.
9
10    GAS is free software; you can redistribute it and/or modify
11    it under the terms of the GNU General Public License as published by
12    the Free Software Foundation; either version 2, or (at your option)
13    any later version.
14
15    GAS is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18    GNU General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with GAS; see the file COPYING.  If not, write to
22    the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
23
24 #include "as.h"
25 #include "config.h"
26
27 #include <ctype.h>
28
29 #ifndef __STDC__
30 #ifndef NO_STDARG
31 #define NO_STDARG
32 #endif
33 #endif
34
35 #ifndef NO_STDARG
36 #include <stdarg.h>
37 #else
38 #ifndef NO_VARARGS
39 #include <varargs.h>
40 #endif /* NO_VARARGS */
41 #endif /* NO_STDARG */
42
43 #include "opcode/mips.h"
44
45 #ifdef OBJ_ELF
46 #include "elf/mips.h"
47
48 static char *mips_regmask_frag;
49 #endif
50
51 #define AT  1
52 #define PIC_CALL_REG 25
53 #define GP  28
54 #define SP  29
55 #define FP  30
56 #define RA  31
57
58 /* Decide whether to do GP reference optimizations based on the object
59    file format.  */
60 #undef GPOPT
61 #ifdef OBJ_ECOFF
62 #define GPOPT
63 #endif
64 #ifdef OBJ_ELF
65 #define GPOPT
66 #endif
67
68 /* The default target format to use.  */
69 #ifdef OBJ_AOUT
70 #ifdef TARGET_BYTES_BIG_ENDIAN
71 #define DEFAULT_TARGET_FORMAT "a.out-mips-big"
72 #else
73 #define DEFAULT_TARGET_FORMAT "a.out-mips-little"
74 #endif
75 #endif /* OBJ_AOUT */
76 #ifdef OBJ_ECOFF
77 #ifdef TARGET_BYTES_BIG_ENDIAN
78 #define DEFAULT_TARGET_FORMAT "ecoff-bigmips"
79 #else
80 #define DEFAULT_TARGET_FORMAT "ecoff-littlemips"
81 #endif
82 #endif /* OBJ_ECOFF */
83 #ifdef OBJ_ELF
84 #ifdef TARGET_BYTES_BIG_ENDIAN
85 #define DEFAULT_TARGET_FORMAT "elf32-bigmips"
86 #else
87 #define DEFAULT_TARGET_FORMAT "elf32-littlemips"
88 #endif
89 #endif /* OBJ_ELF */
90
91 const char *mips_target_format = DEFAULT_TARGET_FORMAT;
92
93 /* The name of the readonly data section.  */
94 #ifdef OBJ_AOUT
95 #define RDATA_SECTION_NAME ".data"
96 #endif
97 #ifdef OBJ_ECOFF
98 #define RDATA_SECTION_NAME ".rdata"
99 #endif
100 #ifdef OBJ_ELF
101 #define RDATA_SECTION_NAME ".rodata"
102 #endif
103
104 /* These variables are filled in with the masks of registers used.
105    The object format code reads them and puts them in the appropriate
106    place.  */
107 unsigned long mips_gprmask;
108 unsigned long mips_cprmask[4];
109
110 /* MIPS ISA (Instruction Set Architecture) level (may be changed
111    temporarily using .set mipsN).  */
112 static int mips_isa = -1;
113
114 /* MIPS ISA we are using for this output file.  */
115 static int file_mips_isa;
116
117 /* MIPS PIC level.  */
118
119 enum mips_pic_level
120 {
121   /* Do not generate PIC code.  */
122   NO_PIC,
123
124   /* Generate PIC code as in Irix 4.  This is not implemented, and I'm
125      not sure what it is supposed to do.  */
126   IRIX4_PIC,
127
128   /* Generate PIC code as in the SVR4 MIPS ABI.  */
129   SVR4_PIC,
130
131   /* Generate PIC code without using a global offset table: the data
132      segment has a maximum size of 64K, all data references are off
133      the $gp register, and all text references are PC relative.  This
134      is used on some embedded systems.  */
135   EMBEDDED_PIC
136 };
137
138 static enum mips_pic_level mips_pic;
139
140 /* 1 if trap instructions should used for overflow rather than break
141    instructions.  */
142 static int mips_trap;
143
144 static int mips_warn_about_macros;
145 static int mips_noreorder;
146 static int mips_any_noreorder;
147 static int mips_nomove;
148 static int mips_noat;
149 static int mips_nobopt;
150
151 #ifdef GPOPT
152 /* The size of the small data section.  */
153 static int g_switch_value = 8;
154 /* Whether the -G option was used.  */
155 static int g_switch_seen = 0;
156 #endif
157
158 #define N_RMASK 0xc4
159 #define N_VFP   0xd4
160
161 /* handle of the OPCODE hash table */
162 static struct hash_control *op_hash = NULL;
163
164 /* This array holds the chars that always start a comment.  If the
165     pre-processor is disabled, these aren't very useful */
166 const char comment_chars[] = "#";
167
168 /* This array holds the chars that only start a comment at the beginning of
169    a line.  If the line seems to have the form '# 123 filename'
170    .line and .file directives will appear in the pre-processed output */
171 /* Note that input_file.c hand checks for '#' at the beginning of the
172    first line of the input file.  This is because the compiler outputs
173    #NO_APP at the beginning of its output. */
174 /* Also note that C style comments are always supported.  */
175 const char line_comment_chars[] = "#";
176
177 /* This array holds machine specific line separator characters. */
178 const char line_separator_chars[] = "";
179
180 /* Chars that can be used to separate mant from exp in floating point nums */
181 const char EXP_CHARS[] = "eE";
182
183 /* Chars that mean this number is a floating point constant */
184 /* As in 0f12.456 */
185 /* or    0d1.2345e12 */
186 const char FLT_CHARS[] = "rRsSfFdDxXpP";
187
188 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
189    changed in read.c .  Ideally it shouldn't have to know about it at all,
190    but nothing is ideal around here.
191  */
192
193 static char *insn_error;
194
195 static int byte_order = BYTE_ORDER;
196
197 static int auto_align = 1;
198
199 /* Symbol labelling the current insn.  */
200 static symbolS *insn_label;
201
202 /* When outputting SVR4 PIC code, the assembler needs to know the
203    offset in the stack frame from which to restore the $gp register.
204    This is set by the .cprestore pseudo-op, and saved in this
205    variable.  */
206 static offsetT mips_cprestore_offset = -1;
207
208 /* This is the register which holds the stack frame, as set by the
209    .frame pseudo-op.  This is needed to implement .cprestore.  */
210 static int mips_frame_reg = SP;
211
212 /* To output NOP instructions correctly, we need to keep information
213    about the previous two instructions.  */
214
215 /* Whether we are optimizing.  The default value of 2 means to remove
216    unneeded NOPs and swap branch instructions when possible.  A value
217    of 1 means to not swap branches.  A value of 0 means to always
218    insert NOPs.  */
219 static int mips_optimize = 2;
220
221 /* The previous instruction.  */
222 static struct mips_cl_insn prev_insn;
223
224 /* The instruction before prev_insn.  */
225 static struct mips_cl_insn prev_prev_insn;
226
227 /* If we don't want information for prev_insn or prev_prev_insn, we
228    point the insn_mo field at this dummy integer.  */
229 static const struct mips_opcode dummy_opcode = { 0 };
230
231 /* Non-zero if prev_insn is valid.  */
232 static int prev_insn_valid;
233
234 /* The frag for the previous instruction.  */
235 static struct frag *prev_insn_frag;
236
237 /* The offset into prev_insn_frag for the previous instruction.  */
238 static long prev_insn_where;
239
240 /* The reloc for the previous instruction, if any.  */
241 static fixS *prev_insn_fixp;
242
243 /* Non-zero if the previous instruction was in a delay slot.  */
244 static int prev_insn_is_delay_slot;
245
246 /* Non-zero if the previous instruction was in a .set noreorder.  */
247 static int prev_insn_unreordered;
248
249 /* Non-zero if the previous previous instruction was in a .set
250    noreorder.  */
251 static int prev_prev_insn_unreordered;
252 \f
253 /* Since the MIPS does not have multiple forms of PC relative
254    instructions, we do not have to do relaxing as is done on other
255    platforms.  However, we do have to handle GP relative addressing
256    correctly, which turns out to be a similar problem.
257
258    Every macro that refers to a symbol can occur in (at least) two
259    forms, one with GP relative addressing and one without.  For
260    example, loading a global variable into a register generally uses
261    a macro instruction like this:
262      lw $4,i
263    If i can be addressed off the GP register (this is true if it is in
264    the .sbss or .sdata section, or if it is known to be smaller than
265    the -G argument) this will generate the following instruction:
266      lw $4,i($gp)
267    This instruction will use a GPREL reloc.  If i can not be addressed
268    off the GP register, the following instruction sequence will be used:
269      lui $at,i
270      lw $4,i($at)
271    In this case the first instruction will have a HI16 reloc, and the
272    second reloc will have a LO16 reloc.  Both relocs will be against
273    the symbol i.
274
275    The issue here is that we may not know whether i is GP addressable
276    until after we see the instruction that uses it.  Therefore, we
277    want to be able to choose the final instruction sequence only at
278    the end of the assembly.  This is similar to the way other
279    platforms choose the size of a PC relative instruction only at the
280    end of assembly.
281
282    When generating position independent code we do not use GP
283    addressing in quite the same way, but the issue still arises as
284    external symbols and local symbols must be handled differently.
285
286    We handle these issues by actually generating both possible
287    instruction sequences.  The longer one is put in a frag_var with
288    type rs_machine_dependent.  We encode what to do with the frag in
289    the subtype field.  We encode (1) the number of existing bytes to
290    replace, (2) the number of new bytes to use, (3) the offset from
291    the start of the existing bytes to the first reloc we must generate
292    (that is, the offset is applied from the start of the existing
293    bytes after they are replaced by the new bytes, if any), (4) the
294    offset from the start of the existing bytes to the second reloc,
295    (5) whether a third reloc is needed (the third reloc is always four
296    bytes after the second reloc), and (6) whether to warn if this
297    variant is used (this is sometimes needed if .set nomacro or .set
298    noat is in effect).  All these numbers are reasonably small.
299
300    Generating two instruction sequences must be handled carefully to
301    ensure that delay slots are handled correctly.  Fortunately, there
302    are a limited number of cases.  When the second instruction
303    sequence is generated, append_insn is directed to maintain the
304    existing delay slot information, so it continues to apply to any
305    code after the second instruction sequence.  This means that the
306    second instruction sequence must not impose any requirements not
307    required by the first instruction sequence.
308
309    These variant frags are then handled in functions called by the
310    machine independent code.  md_estimate_size_before_relax returns
311    the final size of the frag.  md_convert_frag sets up the final form
312    of the frag.  tc_gen_reloc adjust the first reloc and adds a second
313    one if needed.  */
314 #define RELAX_ENCODE(old, new, reloc1, reloc2, reloc3, warn) \
315   ((relax_substateT) \
316    (((old) << 24) \
317     | ((new) << 16) \
318     | (((reloc1) + 64) << 9) \
319     | (((reloc2) + 64) << 2) \
320     | ((reloc3) ? (1 << 1) : 0) \
321     | ((warn) ? 1 : 0)))
322 #define RELAX_OLD(i) (((i) >> 24) & 0xff)
323 #define RELAX_NEW(i) (((i) >> 16) & 0xff)
324 #define RELAX_RELOC1(i) ((((i) >> 9) & 0x7f) - 64)
325 #define RELAX_RELOC2(i) ((((i) >> 2) & 0x7f) - 64)
326 #define RELAX_RELOC3(i) (((i) >> 1) & 1)
327 #define RELAX_WARN(i) ((i) & 1)
328 \f
329 /* Prototypes for static functions.  */
330
331 #ifdef __STDC__
332 #define internalError() \
333     as_fatal ("internal Error, line %d, %s", __LINE__, __FILE__)
334 #else
335 #define internalError() as_fatal ("MIPS internal Error");
336 #endif
337
338 static int insn_uses_reg PARAMS ((struct mips_cl_insn *ip,
339                                   unsigned int reg, int fpr));
340 static void append_insn PARAMS ((char *place,
341                                  struct mips_cl_insn * ip,
342                                  expressionS * p,
343                                  bfd_reloc_code_real_type r));
344 static void mips_no_prev_insn PARAMS ((void));
345 static void mips_emit_delays PARAMS ((void));
346 static void macro_build PARAMS ((char *place, int *counter, expressionS * ep,
347                                  const char *name, const char *fmt,
348                                  ...));
349 static void macro_build_lui PARAMS ((char *place, int *counter,
350                                      expressionS * ep, int regnum));
351 static void set_at PARAMS ((int *counter, int reg, int unsignedp));
352 static void check_absolute_expr PARAMS ((struct mips_cl_insn * ip,
353                                          expressionS *));
354 static void load_register PARAMS ((int *counter, int reg, expressionS * ep));
355 static void load_address PARAMS ((int *counter, int reg, expressionS *ep));
356 static void macro PARAMS ((struct mips_cl_insn * ip));
357 #ifdef LOSING_COMPILER
358 static void macro2 PARAMS ((struct mips_cl_insn * ip));
359 #endif
360 static void mips_ip PARAMS ((char *str, struct mips_cl_insn * ip));
361 static int my_getSmallExpression PARAMS ((expressionS * ep, char *str));
362 static void my_getExpression PARAMS ((expressionS * ep, char *str));
363 static symbolS *get_symbol PARAMS ((void));
364 static void mips_align PARAMS ((int to, int fill, symbolS *label));
365 static void s_align PARAMS ((int));
366 static void s_stringer PARAMS ((int));
367 static void s_change_sec PARAMS ((int));
368 static void s_cons PARAMS ((int));
369 static void s_err PARAMS ((int));
370 static void s_extern PARAMS ((int));
371 static void s_float_cons PARAMS ((int));
372 static void s_option PARAMS ((int));
373 static void s_mipsset PARAMS ((int));
374 static void s_mips_space PARAMS ((int));
375 static void s_abicalls PARAMS ((int));
376 static void s_cpload PARAMS ((int));
377 static void s_cprestore PARAMS ((int));
378 static void s_gpword PARAMS ((int));
379 static void s_cpadd PARAMS ((int));
380 #ifndef ECOFF_DEBUGGING
381 static void md_obj_begin PARAMS ((void));
382 static void md_obj_end PARAMS ((void));
383 static long get_number PARAMS ((void));
384 static void s_ent PARAMS ((int));
385 static void s_mipsend PARAMS ((int));
386 static void s_file PARAMS ((int));
387 #if 0
388 static void s_frame PARAMS ((int));
389 static void s_loc PARAMS ((int));
390 static void s_mask PARAMS ((char));
391 #endif
392 #endif
393 \f
394 /* Pseudo-op table.
395
396    The following pseudo-ops from the Kane and Heinrich MIPS book
397    should be defined here, but are currently unsupported: .alias,
398    .galive, .gjaldef, .gjrlive, .livereg, .noalias.
399
400    The following pseudo-ops from the Kane and Heinrich MIPS book are
401    specific to the type of debugging information being generated, and
402    should be defined by the object format: .aent, .begin, .bend,
403    .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
404    .vreg.
405
406    The following pseudo-ops from the Kane and Heinrich MIPS book are
407    not MIPS CPU specific, but are also not specific to the object file
408    format.  This file is probably the best place to define them, but
409    they are not currently supported: .asm0, .endr, .lab, .repeat,
410    .struct, .weakext.  */
411
412 const pseudo_typeS md_pseudo_table[] =
413 {
414  /* MIPS specific pseudo-ops.  */
415   {"option", s_option, 0},
416   {"set", s_mipsset, 0},
417   {"rdata", s_change_sec, 'r'},
418   {"sdata", s_change_sec, 's'},
419   {"livereg", s_ignore, 0},
420   { "abicalls", s_abicalls, 0},
421   { "cpload", s_cpload, 0},
422   { "cprestore", s_cprestore, 0},
423   { "gpword", s_gpword, 0},
424   { "cpadd", s_cpadd, 0},
425
426  /* Relatively generic pseudo-ops that happen to be used on MIPS
427      chips.  */
428   {"asciiz", s_stringer, 1},
429   {"bss", s_change_sec, 'b'},
430   {"err", s_err, 0},
431   {"half", s_cons, 1},
432   {"dword", s_cons, 3},
433
434  /* These pseudo-ops are defined in read.c, but must be overridden
435      here for one reason or another.  */
436   {"align", s_align, 0},
437   {"ascii", s_stringer, 0},
438   {"asciz", s_stringer, 1},
439   {"byte", s_cons, 0},
440   {"data", s_change_sec, 'd'},
441   {"double", s_float_cons, 'd'},
442   {"extern", s_extern, 0},
443   {"float", s_float_cons, 'f'},
444   {"hword", s_cons, 1},
445   {"int", s_cons, 2},
446   {"long", s_cons, 2},
447   {"octa", s_cons, 4},
448   {"quad", s_cons, 3},
449   {"short", s_cons, 1},
450   {"single", s_float_cons, 'f'},
451   {"space", s_mips_space, 0},
452   {"text", s_change_sec, 't'},
453   {"word", s_cons, 2},
454
455 #ifndef ECOFF_DEBUGGING
456  /* These pseudo-ops should be defined by the object file format.
457     However, a.out doesn't support them, so we have versions here.  */
458   {"aent", s_ent, 1},
459   {"bgnb", s_ignore, 0},
460   {"end", s_mipsend, 0},
461   {"endb", s_ignore, 0},
462   {"ent", s_ent, 0},
463   {"file", s_file, 0},
464   {"fmask", s_ignore, 'F'},
465   {"frame", s_ignore, 0},
466   {"loc", s_ignore, 0},
467   {"mask", s_ignore, 'R'},
468   {"verstamp", s_ignore, 0},
469 #endif
470
471  /* Sentinel.  */
472   {NULL}
473 };
474 \f
475 const relax_typeS md_relax_table[] =
476 {
477   { 0 }
478 };
479
480 static char *expr_end;
481
482 static expressionS imm_expr;
483 static expressionS offset_expr;
484 static bfd_reloc_code_real_type imm_reloc;
485 static bfd_reloc_code_real_type offset_reloc;
486
487 /* FIXME: This should be handled in a different way.  */
488 extern int target_big_endian;
489
490 /*
491  * This function is called once, at assembler startup time.  It should
492  * set up all the tables, etc. that the MD part of the assembler will need.
493  */
494 void
495 md_begin ()
496 {
497   boolean ok = false;
498   register const char *retval = NULL;
499   register unsigned int i = 0;
500
501   if (mips_isa == -1)
502     {
503       if (strcmp (TARGET_CPU, "mips") == 0)
504         mips_isa = 1;
505       else if (strcmp (TARGET_CPU, "r6000") == 0
506                || strcmp (TARGET_CPU, "mips2") == 0)
507         mips_isa = 2;
508       else if (strcmp (TARGET_CPU, "mips64") == 0
509                || strcmp (TARGET_CPU, "r4000") == 0
510                || strcmp (TARGET_CPU, "mips3") == 0)
511         mips_isa = 3;
512       else
513         mips_isa = 1;
514     }
515
516   if (mips_isa < 2 && mips_trap)
517     as_bad ("trap exception not supported at ISA 1");
518
519   switch (mips_isa)
520     {
521     case 1:
522       ok = bfd_set_arch_mach (stdoutput, bfd_arch_mips, 3000);
523       break;
524     case 2:
525       ok = bfd_set_arch_mach (stdoutput, bfd_arch_mips, 6000);
526       break;
527     case 3:
528       ok = bfd_set_arch_mach (stdoutput, bfd_arch_mips, 4000);
529       break;
530     }
531   if (! ok)
532     as_warn ("Could not set architecture and machine");
533
534   file_mips_isa = mips_isa;
535
536   op_hash = hash_new ();
537
538   for (i = 0; i < NUMOPCODES;)
539     {
540       const char *name = mips_opcodes[i].name;
541
542       retval = hash_insert (op_hash, name, (PTR) &mips_opcodes[i]);
543       if (retval != NULL)
544         {
545           fprintf (stderr, "internal error: can't hash `%s': %s\n",
546                    mips_opcodes[i].name, retval);
547           as_fatal ("Broken assembler.  No assembly attempted.");
548         }
549       do
550         {
551           if (mips_opcodes[i].pinfo != INSN_MACRO
552               && ((mips_opcodes[i].match & mips_opcodes[i].mask)
553                   != mips_opcodes[i].match))
554             {
555               fprintf (stderr, "internal error: bad opcode: `%s' \"%s\"\n",
556                        mips_opcodes[i].name, mips_opcodes[i].args);
557               as_fatal ("Broken assembler.  No assembly attempted.");
558             }
559           ++i;
560         }
561       while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
562     }
563
564   mips_no_prev_insn ();
565
566   mips_gprmask = 0;
567   mips_cprmask[0] = 0;
568   mips_cprmask[1] = 0;
569   mips_cprmask[2] = 0;
570   mips_cprmask[3] = 0;
571
572   /* set the default alignment for the text section (2**2) */
573   record_alignment (text_section, 2);
574
575   /* FIXME: This should be handled in a different way.  */
576   target_big_endian = byte_order == BIG_ENDIAN;
577
578 #ifdef GPOPT
579   bfd_set_gp_size (stdoutput, g_switch_value);
580 #endif
581
582 #ifdef OBJ_ELF
583   /* Sections must be aligned to 16 byte boundaries.  */
584   (void) bfd_set_section_alignment (stdoutput, text_section, 4);
585   (void) bfd_set_section_alignment (stdoutput, data_section, 4);
586   (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
587
588   /* Create a .reginfo section for register masks and a .mdebug
589      section for debugging information.  */
590   {
591     segT seg;
592     subsegT subseg;
593     segT sec;
594
595     seg = now_seg;
596     subseg = now_subseg;
597     sec = subseg_new (".reginfo", (subsegT) 0);
598
599     /* The ABI says this section should be loaded so that the running
600        program can access it.  */
601     (void) bfd_set_section_flags (stdoutput, sec,
602                                   (SEC_ALLOC | SEC_LOAD
603                                    | SEC_READONLY | SEC_DATA));
604     (void) bfd_set_section_alignment (stdoutput, sec, 2);
605
606     mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
607
608 #ifdef ECOFF_DEBUGGING
609     sec = subseg_new (".mdebug", (subsegT) 0);
610     (void) bfd_set_section_flags (stdoutput, sec,
611                                   SEC_HAS_CONTENTS | SEC_READONLY);
612     (void) bfd_set_section_alignment (stdoutput, sec, 2);
613 #endif
614
615     subseg_set (seg, subseg);
616   }
617 #endif /* OBJ_ELF */
618
619 #ifndef ECOFF_DEBUGGING
620   md_obj_begin ();
621 #endif
622 }
623
624 void
625 md_mips_end ()
626 {
627 #ifndef ECOFF_DEBUGGING
628   md_obj_end ();
629 #endif
630 }
631
632 void
633 md_assemble (str)
634      char *str;
635 {
636   struct mips_cl_insn insn;
637
638   imm_expr.X_op = O_absent;
639   offset_expr.X_op = O_absent;
640
641   mips_ip (str, &insn);
642   if (insn_error)
643     {
644       as_bad ("%s `%s'", insn_error, str);
645       return;
646     }
647   if (insn.insn_mo->pinfo == INSN_MACRO)
648     {
649       macro (&insn);
650     }
651   else
652     {
653       if (imm_expr.X_op != O_absent)
654         append_insn ((char *) NULL, &insn, &imm_expr, imm_reloc);
655       else if (offset_expr.X_op != O_absent)
656         append_insn ((char *) NULL, &insn, &offset_expr, offset_reloc);
657       else
658         append_insn ((char *) NULL, &insn, NULL, BFD_RELOC_UNUSED);
659     }
660 }
661
662 /* See whether instruction IP reads register REG.  If FPR is non-zero,
663    REG is a floating point register.  */
664
665 static int
666 insn_uses_reg (ip, reg, fpr)
667      struct mips_cl_insn *ip;
668      unsigned int reg;
669      int fpr;
670 {
671   /* Don't report on general register 0, since it never changes.  */
672   if (! fpr && reg == 0)
673     return 0;
674
675   if (fpr)
676     {
677       /* If we are called with either $f0 or $f1, we must check $f0.
678          This is not optimal, because it will introduce an unnecessary
679          NOP between "lwc1 $f0" and "swc1 $f1".  To fix this we would
680          need to distinguish reading both $f0 and $f1 or just one of
681          them.  Note that we don't have to check the other way,
682          because there is no instruction that sets both $f0 and $f1
683          and requires a delay.  */
684       if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
685           && (((ip->insn_opcode >> OP_SH_FS) & OP_MASK_FS)
686               == (reg &~ (unsigned) 1)))
687         return 1;
688       if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
689           && (((ip->insn_opcode >> OP_SH_FT) & OP_MASK_FT)
690               == (reg &~ (unsigned) 1)))
691         return 1;
692     }
693   else
694     {
695       if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
696           && ((ip->insn_opcode >> OP_SH_RS) & OP_MASK_RS) == reg)
697         return 1;
698       if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
699           && ((ip->insn_opcode >> OP_SH_RT) & OP_MASK_RT) == reg)
700         return 1;
701     }
702
703   return 0;
704 }
705
706 /* Output an instruction.  PLACE is where to put the instruction; if
707    it is NULL, this uses frag_more to get room.  IP is the instruction
708    information.  ADDRESS_EXPR is an operand of the instruction to be
709    used with RELOC_TYPE.  */
710
711 static void
712 append_insn (place, ip, address_expr, reloc_type)
713      char *place;
714      struct mips_cl_insn *ip;
715      expressionS *address_expr;
716      bfd_reloc_code_real_type reloc_type;
717 {
718   register unsigned long prev_pinfo, pinfo;
719   char *f;
720   fixS *fixp;
721   int nops = 0;
722
723   prev_pinfo = prev_insn.insn_mo->pinfo;
724   pinfo = ip->insn_mo->pinfo;
725
726   if (place == NULL && ! mips_noreorder)
727     {
728       /* If the previous insn required any delay slots, see if we need
729          to insert a NOP or two.  There are eight kinds of possible
730          hazards, of which an instruction can have at most one type.
731          (1) a load from memory delay
732          (2) a load from a coprocessor delay
733          (3) an unconditional branch delay
734          (4) a conditional branch delay
735          (5) a move to coprocessor register delay
736          (6) a load coprocessor register from memory delay
737          (7) a coprocessor condition code delay
738          (8) a HI/LO special register delay
739
740          There are a lot of optimizations we could do that we don't.
741          In particular, we do not, in general, reorder instructions.
742          If you use gcc with optimization, it will reorder
743          instructions and generally do much more optimization then we
744          do here; repeating all that work in the assembler would only
745          benefit hand written assembly code, and does not seem worth
746          it.  */
747
748       /* This is how a NOP is emitted.  */
749 #define emit_nop() md_number_to_chars (frag_more (4), 0, 4)
750
751       /* The previous insn might require a delay slot, depending upon
752          the contents of the current insn.  */
753       if ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
754           || (mips_isa < 2
755               && (prev_pinfo & INSN_LOAD_MEMORY_DELAY)))
756         {
757           /* A load from a coprocessor or from memory.  All load
758              delays delay the use of general register rt for one
759              instruction on the r3000.  The r6000 and r4000 use
760              interlocks.  */
761           know (prev_pinfo & INSN_WRITE_GPR_T);
762           if (mips_optimize == 0
763               || insn_uses_reg (ip,
764                                 ((prev_insn.insn_opcode >> OP_SH_RT)
765                                  & OP_MASK_RT),
766                                 0))
767             ++nops;
768         }
769       else if ((prev_pinfo & INSN_COPROC_MOVE_DELAY)
770                || (mips_isa < 2
771                    && (prev_pinfo & INSN_COPROC_MEMORY_DELAY)))
772         {
773           /* A generic coprocessor delay.  The previous instruction
774              modified a coprocessor general or control register.  If
775              it modified a control register, we need to avoid any
776              coprocessor instruction (this is probably not always
777              required, but it sometimes is).  If it modified a general
778              register, we avoid using that register.
779
780              On the r6000 and r4000 loading a coprocessor register
781              from memory is interlocked, and does not require a delay.
782
783              This case is not handled very well.  There is no special
784              knowledge of CP0 handling, and the coprocessors other
785              than the floating point unit are not distinguished at
786              all.  */
787           if (prev_pinfo & INSN_WRITE_FPR_T)
788             {
789               if (mips_optimize == 0
790                   || insn_uses_reg (ip,
791                                     ((prev_insn.insn_opcode >> OP_SH_FT)
792                                      & OP_MASK_FT),
793                                     1))
794                 ++nops;
795             }
796           else if (prev_pinfo & INSN_WRITE_FPR_S)
797             {
798               if (mips_optimize == 0
799                   || insn_uses_reg (ip,
800                                     ((prev_insn.insn_opcode >> OP_SH_FS)
801                                      & OP_MASK_FS),
802                                     1))
803                 ++nops;
804             }
805           else
806             {
807               /* We don't know exactly what the previous instruction
808                  does.  If the current instruction uses a coprocessor
809                  register, we must insert a NOP.  If previous
810                  instruction may set the condition codes, and the
811                  current instruction uses them, we must insert two
812                  NOPS.  */
813               if (mips_optimize == 0
814                   || ((prev_pinfo & INSN_WRITE_COND_CODE)
815                       && (pinfo & INSN_READ_COND_CODE)))
816                 nops += 2;
817               else if (pinfo & INSN_COP)
818                 ++nops;
819             }
820         }
821       else if (prev_pinfo & INSN_WRITE_COND_CODE)
822         {
823           /* The previous instruction sets the coprocessor condition
824              codes, but does not require a general coprocessor delay
825              (this means it is a floating point comparison
826              instruction).  If this instruction uses the condition
827              codes, we need to insert a single NOP.  */
828           if (mips_optimize == 0
829               || (pinfo & INSN_READ_COND_CODE))
830             ++nops;
831         }
832       else if (prev_pinfo & INSN_READ_LO)
833         {
834           /* The previous instruction reads the LO register; if the
835              current instruction writes to the LO register, we must
836              insert two NOPS.  */
837           if (mips_optimize == 0
838               || (pinfo & INSN_WRITE_LO))
839             nops += 2;
840         }
841       else if (prev_insn.insn_mo->pinfo & INSN_READ_HI)
842         {
843           /* The previous instruction reads the HI register; if the
844              current instruction writes to the HI register, we must
845              insert a NOP.  */
846           if (mips_optimize == 0
847               || (pinfo & INSN_WRITE_HI))
848             nops += 2;
849         }
850
851       /* There are two cases which require two intervening
852          instructions: 1) setting the condition codes using a move to
853          coprocessor instruction which requires a general coprocessor
854          delay and then reading the condition codes 2) reading the HI
855          or LO register and then writing to it.  If we are not already
856          emitting a NOP instruction, we must check for these cases
857          compared to the instruction previous to the previous
858          instruction.  */
859       if (nops == 0
860           && (((prev_prev_insn.insn_mo->pinfo & INSN_COPROC_MOVE_DELAY)
861                && (prev_prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE)
862                && (pinfo & INSN_READ_COND_CODE))
863               || ((prev_prev_insn.insn_mo->pinfo & INSN_READ_LO)
864                   && (pinfo & INSN_WRITE_LO))
865               || ((prev_prev_insn.insn_mo->pinfo & INSN_READ_HI)
866                   && (pinfo & INSN_WRITE_HI))))
867         ++nops;
868
869       /* If we are being given a nop instruction, don't bother with
870          one of the nops we would otherwise output.  This will only
871          happen when a nop instruction is used with mips_optimize set
872          to 0.  */
873       if (nops > 0 && ip->insn_opcode == 0)
874         --nops;
875
876       /* Now emit the right number of NOP instructions.  */
877       if (nops > 0)
878         {
879           emit_nop ();
880           if (nops > 1)
881             emit_nop ();
882           if (listing)
883             listing_prev_line ();
884           if (insn_label != NULL)
885             {
886               assert (S_GET_SEGMENT (insn_label) == now_seg);
887               insn_label->sy_frag = frag_now;
888               S_SET_VALUE (insn_label, (valueT) frag_now_fix ());
889             }
890         }
891     }
892   
893   if (place == NULL)
894     f = frag_more (4);
895   else
896     f = place;
897   fixp = NULL;
898   if (address_expr != NULL)
899     {
900       if (address_expr->X_op == O_constant)
901         {
902           switch (reloc_type)
903             {
904             case BFD_RELOC_32:
905               ip->insn_opcode |= address_expr->X_add_number;
906               break;
907
908             case BFD_RELOC_LO16:
909               ip->insn_opcode |= address_expr->X_add_number & 0xffff;
910               break;
911
912             case BFD_RELOC_MIPS_JMP:
913             case BFD_RELOC_16_PCREL_S2:
914               goto need_reloc;
915
916             default:
917               internalError ();
918             }
919         }
920       else
921         {
922           assert (reloc_type != BFD_RELOC_UNUSED);
923         need_reloc:
924           /* Don't generate a reloc if we are writing into a variant
925              frag.  */
926           if (place == NULL)
927             fixp = fix_new_exp (frag_now, f - frag_now->fr_literal, 4,
928                                 address_expr,
929                                 reloc_type == BFD_RELOC_16_PCREL_S2,
930                                 reloc_type);
931         }
932     }
933
934   md_number_to_chars (f, ip->insn_opcode, 4);
935
936   /* Update the register mask information.  */
937   if (pinfo & INSN_WRITE_GPR_D)
938     mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD);
939   if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
940     mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RT) & OP_MASK_RT);
941   if (pinfo & INSN_READ_GPR_S)
942     mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RS) & OP_MASK_RS);
943   if (pinfo & INSN_WRITE_GPR_31)
944     mips_gprmask |= 1 << 31;
945   if (pinfo & INSN_WRITE_FPR_D)
946     mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FD) & OP_MASK_FD);
947   if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
948     mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FS) & OP_MASK_FS);
949   if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
950     mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FT) & OP_MASK_FT);
951   if (pinfo & INSN_COP)
952     {
953       /* We don't keep enough information to sort these cases out.  */
954     }
955   /* Never set the bit for $0, which is always zero.  */
956   mips_gprmask &=~ 1 << 0;
957
958   if (place == NULL && ! mips_noreorder)
959     {
960       /* Filling the branch delay slot is more complex.  We try to
961          switch the branch with the previous instruction, which we can
962          do if the previous instruction does not set up a condition
963          that the branch tests and if the branch is not itself the
964          target of any branch.  */
965       if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
966           || (pinfo & INSN_COND_BRANCH_DELAY))
967         {
968           if (mips_optimize < 2
969               /* If we have seen .set volatile or .set nomove, don't
970                  optimize.  */
971               || mips_nomove != 0
972               /* If we had to emit any NOP instructions, then we
973                  already know we can not swap.  */
974               || nops != 0
975               /* If we don't even know the previous insn, we can not
976                  swap. */
977               || ! prev_insn_valid
978               /* If the previous insn is already in a branch delay
979                  slot, then we can not swap.  */
980               || prev_insn_is_delay_slot
981               /* If the previous previous insn was in a .set
982                  noreorder, we can't swap.  Actually, the MIPS
983                  assembler will swap in this situation.  However, gcc
984                  configured -with-gnu-as will generate code like
985                    .set noreorder
986                    lw   $4,XXX
987                    .set reorder
988                    INSN
989                    bne  $4,$0,foo
990                  in which we can not swap the bne and INSN.  If gcc is
991                  not configured -with-gnu-as, it does not output the
992                  .set pseudo-ops.  We don't have to check
993                  prev_insn_unreordered, because prev_insn_valid will
994                  be 0 in that case.  We don't want to use
995                  prev_prev_insn_valid, because we do want to be able
996                  to swap at the start of a function.  */
997               || prev_prev_insn_unreordered
998               /* If the branch is itself the target of a branch, we
999                  can not swap.  We cheat on this; all we check for is
1000                  whether there is a label on this instruction.  If
1001                  there are any branches to anything other than a
1002                  label, users must use .set noreorder.  */
1003               || insn_label != NULL
1004               /* If the previous instruction is in a variant frag, we
1005                  can not do the swap.  */
1006               || prev_insn_frag->fr_type == rs_machine_dependent
1007               /* If the branch reads the condition codes, we don't
1008                  even try to swap, because in the sequence
1009                    ctc1 $X,$31
1010                    INSN
1011                    INSN
1012                    bc1t LABEL
1013                  we can not swap, and I don't feel like handling that
1014                  case.  */
1015               || (pinfo & INSN_READ_COND_CODE)
1016               /* We can not swap with an instruction that requires a
1017                  delay slot, becase the target of the branch might
1018                  interfere with that instruction.  */
1019               || (prev_pinfo
1020                   & (INSN_LOAD_COPROC_DELAY
1021                      | INSN_COPROC_MOVE_DELAY
1022                      | INSN_WRITE_COND_CODE
1023                      | INSN_READ_LO
1024                      | INSN_READ_HI))
1025               || (mips_isa < 2
1026                   && (prev_pinfo
1027                       & (INSN_LOAD_MEMORY_DELAY
1028                          | INSN_COPROC_MEMORY_DELAY)))
1029               /* We can not swap with a branch instruction.  */
1030               || (prev_pinfo
1031                   & (INSN_UNCOND_BRANCH_DELAY
1032                      | INSN_COND_BRANCH_DELAY
1033                      | INSN_COND_BRANCH_LIKELY))
1034               /* We do not swap with a trap instruction, since it
1035                  complicates trap handlers to have the trap
1036                  instruction be in a delay slot.  */
1037               || (prev_pinfo & INSN_TRAP)
1038               /* If the branch reads a register that the previous
1039                  instruction sets, we can not swap.  */
1040               || ((prev_pinfo & INSN_WRITE_GPR_T)
1041                   && insn_uses_reg (ip,
1042                                     ((prev_insn.insn_opcode >> OP_SH_RT)
1043                                      & OP_MASK_RT),
1044                                     0))
1045               || ((prev_pinfo & INSN_WRITE_GPR_D)
1046                   && insn_uses_reg (ip,
1047                                     ((prev_insn.insn_opcode >> OP_SH_RD)
1048                                      & OP_MASK_RD),
1049                                     0))
1050               /* If the branch writes a register that the previous
1051                  instruction sets, we can not swap (we know that
1052                  branches write only to RD or to $31).  */
1053               || ((prev_pinfo & INSN_WRITE_GPR_T)
1054                   && (((pinfo & INSN_WRITE_GPR_D)
1055                        && (((prev_insn.insn_opcode >> OP_SH_RT) & OP_MASK_RT)
1056                            == ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD)))
1057                       || ((pinfo & INSN_WRITE_GPR_31)
1058                           && (((prev_insn.insn_opcode >> OP_SH_RT)
1059                                & OP_MASK_RT)
1060                               == 31))))
1061               || ((prev_pinfo & INSN_WRITE_GPR_D)
1062                   && (((pinfo & INSN_WRITE_GPR_D)
1063                        && (((prev_insn.insn_opcode >> OP_SH_RD) & OP_MASK_RD)
1064                            == ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD)))
1065                       || ((pinfo & INSN_WRITE_GPR_31)
1066                           && (((prev_insn.insn_opcode >> OP_SH_RD)
1067                                & OP_MASK_RD)
1068                               == 31))))
1069               /* If the branch writes a register that the previous
1070                  instruction reads, we can not swap (we know that
1071                  branches only write to RD or to $31).  */
1072               || ((pinfo & INSN_WRITE_GPR_D)
1073                   && insn_uses_reg (&prev_insn,
1074                                     ((ip->insn_opcode >> OP_SH_RD)
1075                                      & OP_MASK_RD),
1076                                     0))
1077               || ((pinfo & INSN_WRITE_GPR_31)
1078                   && insn_uses_reg (&prev_insn, 31, 0))
1079               /* If we are generating embedded PIC code, the branch
1080                  might be expanded into a sequence which uses $at, so
1081                  we can't swap with an instruction which reads it.  */
1082               || (mips_pic == EMBEDDED_PIC
1083                   && insn_uses_reg (&prev_insn, AT, 0))
1084               /* If the previous previous instruction has a load
1085                  delay, and sets a register that the branch reads, we
1086                  can not swap.  */
1087               || (((prev_prev_insn.insn_mo->pinfo & INSN_LOAD_COPROC_DELAY)
1088                    || (mips_isa < 2
1089                        && (prev_prev_insn.insn_mo->pinfo
1090                            & INSN_LOAD_MEMORY_DELAY)))
1091                   && insn_uses_reg (ip,
1092                                     ((prev_prev_insn.insn_opcode >> OP_SH_RT)
1093                                      & OP_MASK_RT),
1094                                     0)))
1095             {
1096               /* We could do even better for unconditional branches to
1097                  portions of this object file; we could pick up the
1098                  instruction at the destination, put it in the delay
1099                  slot, and bump the destination address.  */
1100               emit_nop ();
1101               /* Update the previous insn information.  */
1102               prev_prev_insn = *ip;
1103               prev_insn.insn_mo = &dummy_opcode;
1104             }
1105           else
1106             {
1107               char *prev_f;
1108               char temp[4];
1109
1110               /* It looks like we can actually do the swap.  */
1111               prev_f = prev_insn_frag->fr_literal + prev_insn_where;
1112               memcpy (temp, prev_f, 4);
1113               memcpy (prev_f, f, 4);
1114               memcpy (f, temp, 4);
1115               if (prev_insn_fixp)
1116                 {
1117                   prev_insn_fixp->fx_frag = frag_now;
1118                   prev_insn_fixp->fx_where = f - frag_now->fr_literal;
1119                 }
1120               if (fixp)
1121                 {
1122                   fixp->fx_frag = prev_insn_frag;
1123                   fixp->fx_where = prev_insn_where;
1124                 }
1125               /* Update the previous insn information; leave prev_insn
1126                  unchanged.  */
1127               prev_prev_insn = *ip;
1128             }
1129           prev_insn_is_delay_slot = 1;
1130
1131           /* If that was an unconditional branch, forget the previous
1132              insn information.  */
1133           if (pinfo & INSN_UNCOND_BRANCH_DELAY)
1134             {
1135               prev_prev_insn.insn_mo = &dummy_opcode;
1136               prev_insn.insn_mo = &dummy_opcode;
1137             }
1138         }
1139       else if (pinfo & INSN_COND_BRANCH_LIKELY)
1140         {
1141           /* We don't yet optimize a branch likely.  What we should do
1142              is look at the target, copy the instruction found there
1143              into the delay slot, and increment the branch to jump to
1144              the next instruction.  */
1145           emit_nop ();
1146           /* Update the previous insn information.  */
1147           prev_prev_insn = *ip;
1148           prev_insn.insn_mo = &dummy_opcode;
1149         }
1150       else
1151         {
1152           /* Update the previous insn information.  */
1153           if (nops > 0)
1154             prev_prev_insn.insn_mo = &dummy_opcode;
1155           else
1156             prev_prev_insn = prev_insn;
1157           prev_insn = *ip;
1158
1159           /* Any time we see a branch, we always fill the delay slot
1160              immediately; since this insn is not a branch, we know it
1161              is not in a delay slot.  */
1162           prev_insn_is_delay_slot = 0;
1163         }
1164
1165       prev_prev_insn_unreordered = prev_insn_unreordered;
1166       prev_insn_unreordered = 0;
1167       prev_insn_frag = frag_now;
1168       prev_insn_where = f - frag_now->fr_literal;
1169       prev_insn_fixp = fixp;
1170       prev_insn_valid = 1;
1171     }
1172
1173   /* We just output an insn, so the next one doesn't have a label.  */
1174   insn_label = NULL;
1175 }
1176
1177 /* This function forgets that there was any previous instruction or
1178    label.  */
1179
1180 static void
1181 mips_no_prev_insn ()
1182 {
1183   prev_insn.insn_mo = &dummy_opcode;
1184   prev_prev_insn.insn_mo = &dummy_opcode;
1185   prev_insn_valid = 0;
1186   prev_insn_is_delay_slot = 0;
1187   prev_insn_unreordered = 0;
1188   prev_prev_insn_unreordered = 0;
1189   insn_label = NULL;
1190 }
1191
1192 /* This function must be called whenever we turn on noreorder or emit
1193    something other than instructions.  It inserts any NOPS which might
1194    be needed by the previous instruction, and clears the information
1195    kept for the previous instructions.  */
1196
1197 static void
1198 mips_emit_delays ()
1199 {
1200   if (! mips_noreorder)
1201     {
1202       int nop;
1203
1204       nop = 0;
1205       if ((prev_insn.insn_mo->pinfo
1206            & (INSN_LOAD_COPROC_DELAY
1207               | INSN_COPROC_MOVE_DELAY
1208               | INSN_WRITE_COND_CODE
1209               | INSN_READ_LO
1210               | INSN_READ_HI))
1211           || (mips_isa < 2
1212               && (prev_insn.insn_mo->pinfo
1213                   & (INSN_LOAD_MEMORY_DELAY
1214                      | INSN_COPROC_MEMORY_DELAY))))
1215         {
1216           nop = 1;
1217           if ((prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE)
1218               || (prev_insn.insn_mo->pinfo & INSN_READ_HI)
1219               || (prev_insn.insn_mo->pinfo & INSN_READ_LO))
1220             emit_nop ();
1221         }
1222       else if ((prev_prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE)
1223                || (prev_prev_insn.insn_mo->pinfo & INSN_READ_HI)
1224                || (prev_prev_insn.insn_mo->pinfo & INSN_READ_LO))
1225         nop = 1;
1226       if (nop)
1227         {
1228           emit_nop ();
1229           if (insn_label != NULL)
1230             {
1231               assert (S_GET_SEGMENT (insn_label) == now_seg);
1232               insn_label->sy_frag = frag_now;
1233               S_SET_VALUE (insn_label, (valueT) frag_now_fix ());
1234             }
1235         }
1236     }
1237
1238   mips_no_prev_insn ();
1239 }
1240
1241 /* Build an instruction created by a macro expansion.  This is passed
1242    a pointer to the count of instructions created so far, an
1243    expression, the name of the instruction to build, an operand format
1244    string, and corresponding arguments.  */
1245
1246 #ifndef NO_STDARG
1247 static void
1248 macro_build (char *place,
1249              int *counter,
1250              expressionS * ep,
1251              const char *name,
1252              const char *fmt,
1253              ...)
1254 #else /* ! defined (NO_STDARG) */
1255 static void
1256 macro_build (place, counter, ep, name, fmt, va_alist)
1257      char *place;
1258      int *counter;
1259      expressionS *ep;
1260      const char *name;
1261      const char *fmt;
1262      va_dcl
1263 #endif /* ! defined (NO_STDARG) */
1264 {
1265   struct mips_cl_insn insn;
1266   bfd_reloc_code_real_type r;
1267   va_list args;
1268
1269 #ifndef NO_STDARG
1270   va_start (args, fmt);
1271 #else
1272   va_start (args);
1273 #endif
1274
1275   /*
1276    * If the macro is about to expand into a second instruction,
1277    * print a warning if needed. We need to pass ip as a parameter
1278    * to generate a better warning message here...
1279    */
1280   if (mips_warn_about_macros && place == NULL && *counter == 1)
1281     as_warn ("Macro instruction expanded into multiple instructions");
1282
1283   if (place == NULL)
1284     *counter += 1;              /* bump instruction counter */
1285
1286   r = BFD_RELOC_UNUSED;
1287   insn.insn_mo = (struct mips_opcode *) hash_find (op_hash, name);
1288   assert (insn.insn_mo);
1289   assert (strcmp (name, insn.insn_mo->name) == 0);
1290
1291   while (strcmp (fmt, insn.insn_mo->args) != 0
1292          || insn.insn_mo->pinfo == INSN_MACRO)
1293     {
1294       ++insn.insn_mo;
1295       assert (insn.insn_mo->name);
1296       assert (strcmp (name, insn.insn_mo->name) == 0);
1297     }
1298   insn.insn_opcode = insn.insn_mo->match;
1299   for (;;)
1300     {
1301       switch (*fmt++)
1302         {
1303         case '\0':
1304           break;
1305
1306         case ',':
1307         case '(':
1308         case ')':
1309           continue;
1310
1311         case 't':
1312         case 'w':
1313         case 'E':
1314           insn.insn_opcode |= va_arg (args, int) << 16;
1315           continue;
1316
1317         case 'c':
1318         case 'T':
1319         case 'W':
1320           insn.insn_opcode |= va_arg (args, int) << 16;
1321           continue;
1322
1323         case 'd':
1324         case 'G':
1325           insn.insn_opcode |= va_arg (args, int) << 11;
1326           continue;
1327
1328         case 'V':
1329         case 'S':
1330           insn.insn_opcode |= va_arg (args, int) << 11;
1331           continue;
1332
1333         case 'z':
1334           continue;
1335
1336         case '<':
1337           insn.insn_opcode |= va_arg (args, int) << 6;
1338           continue;
1339
1340         case 'D':
1341           insn.insn_opcode |= va_arg (args, int) << 6;
1342           continue;
1343
1344         case 'B':
1345           insn.insn_opcode |= va_arg (args, int) << 6;
1346           continue;
1347
1348         case 'b':
1349         case 's':
1350         case 'r':
1351         case 'v':
1352           insn.insn_opcode |= va_arg (args, int) << 21;
1353           continue;
1354
1355         case 'i':
1356         case 'j':
1357         case 'o':
1358           r = (bfd_reloc_code_real_type) va_arg (args, int);
1359           assert (r == BFD_RELOC_MIPS_GPREL
1360                   || r == BFD_RELOC_MIPS_LITERAL
1361                   || r == BFD_RELOC_LO16
1362                   || r == BFD_RELOC_MIPS_GOT16
1363                   || r == BFD_RELOC_MIPS_CALL16
1364                   || (ep->X_op == O_subtract
1365                       && now_seg == text_section
1366                       && S_GET_SEGMENT (ep->X_op_symbol) == text_section
1367                       && r == BFD_RELOC_PCREL_LO16));
1368           continue;
1369
1370         case 'u':
1371           r = (bfd_reloc_code_real_type) va_arg (args, int);
1372           assert (ep != NULL
1373                   && (ep->X_op == O_constant
1374                       || (ep->X_op == O_symbol
1375                           && (r == BFD_RELOC_HI16_S
1376                               || r == BFD_RELOC_HI16))
1377                       || (ep->X_op == O_subtract
1378                           && now_seg == text_section
1379                           && S_GET_SEGMENT (ep->X_op_symbol) == text_section
1380                           && r == BFD_RELOC_PCREL_HI16_S)));
1381           if (ep->X_op == O_constant)
1382             {
1383               insn.insn_opcode |= (ep->X_add_number >> 16) & 0xffff;
1384               ep = NULL;
1385               r = BFD_RELOC_UNUSED;
1386             }
1387           continue;
1388
1389         case 'p':
1390           assert (ep != NULL);
1391           /*
1392            * This allows macro() to pass an immediate expression for
1393            * creating short branches without creating a symbol.
1394            * Note that the expression still might come from the assembly
1395            * input, in which case the value is not checked for range nor
1396            * is a relocation entry generated (yuck).
1397            */
1398           if (ep->X_op == O_constant)
1399             {
1400               insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
1401               ep = NULL;
1402             }
1403           else
1404             r = BFD_RELOC_16_PCREL_S2;
1405           continue;
1406
1407         case 'a':
1408           assert (ep != NULL);
1409           r = BFD_RELOC_MIPS_JMP;
1410           continue;
1411
1412         default:
1413           internalError ();
1414         }
1415       break;
1416     }
1417   va_end (args);
1418   assert (r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
1419
1420   append_insn (place, &insn, ep, r);
1421 }
1422
1423 /*
1424  * Generate a "lui" instruction.
1425  */
1426 static void
1427 macro_build_lui (place, counter, ep, regnum)
1428      char *place;
1429      int *counter;
1430      expressionS *ep;
1431      int regnum;
1432 {
1433   expressionS high_expr;
1434   struct mips_cl_insn insn;
1435   bfd_reloc_code_real_type r;
1436   CONST char *name = "lui";
1437   CONST char *fmt = "t,u";
1438
1439   if (place == NULL)
1440     high_expr = *ep;
1441   else
1442     {
1443       high_expr.X_op = O_constant;
1444       high_expr.X_add_number = 0;
1445     }
1446
1447   if (high_expr.X_op == O_constant)
1448     {
1449       /* we can compute the instruction now without a relocation entry */
1450       if (high_expr.X_add_number & 0x8000)
1451         high_expr.X_add_number += 0x10000;
1452       high_expr.X_add_number =
1453         ((unsigned long) high_expr.X_add_number >> 16) & 0xffff;
1454       r = BFD_RELOC_UNUSED;
1455     }
1456   else
1457     {
1458       assert (ep->X_op == O_symbol);
1459       /* _gp_disp is a special case, used from s_cpload.  */
1460       assert (mips_pic == NO_PIC
1461               || strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0);
1462       r = BFD_RELOC_HI16_S;
1463     }
1464
1465   /*
1466    * If the macro is about to expand into a second instruction,
1467    * print a warning if needed. We need to pass ip as a parameter
1468    * to generate a better warning message here...
1469    */
1470   if (mips_warn_about_macros && place == NULL && *counter == 1)
1471     as_warn ("Macro instruction expanded into multiple instructions");
1472
1473   if (place == NULL)
1474     *counter += 1;              /* bump instruction counter */
1475
1476   insn.insn_mo = (struct mips_opcode *) hash_find (op_hash, name);
1477   assert (insn.insn_mo);
1478   assert (strcmp (name, insn.insn_mo->name) == 0);
1479   assert (strcmp (fmt, insn.insn_mo->args) == 0);
1480
1481   insn.insn_opcode = insn.insn_mo->match | (regnum << OP_SH_RT);
1482   if (r == BFD_RELOC_UNUSED)
1483     {
1484       insn.insn_opcode |= high_expr.X_add_number;
1485       append_insn (place, &insn, NULL, r);
1486     }
1487   else
1488     append_insn (place, &insn, &high_expr, r);
1489 }
1490
1491 /*                      set_at()
1492  * Generates code to set the $at register to true (one)
1493  * if reg is less than the immediate expression.
1494  */
1495 static void
1496 set_at (counter, reg, unsignedp)
1497      int *counter;
1498      int reg;
1499      int unsignedp;
1500 {
1501   if (imm_expr.X_add_number >= -0x8000 && imm_expr.X_add_number < 0x8000)
1502     macro_build ((char *) NULL, counter, &imm_expr,
1503                  unsignedp ? "sltiu" : "slti",
1504                  "t,r,j", AT, reg, (int) BFD_RELOC_LO16);
1505   else
1506     {
1507       load_register (counter, AT, &imm_expr);
1508       macro_build ((char *) NULL, counter, NULL,
1509                    unsignedp ? "sltu" : "slt",
1510                    "d,v,t", AT, reg, AT);
1511     }
1512 }
1513
1514 /* Warn if an expression is not a constant.  */
1515
1516 static void
1517 check_absolute_expr (ip, ex)
1518      struct mips_cl_insn *ip;
1519      expressionS *ex;
1520 {
1521   if (ex->X_op != O_constant)
1522     as_warn ("Instruction %s requires absolute expression", ip->insn_mo->name);
1523 }
1524
1525 /*                      load_register()
1526  *  This routine generates the least number of instructions neccessary to load
1527  *  an absolute expression value into a register.
1528  */
1529 static void
1530 load_register (counter, reg, ep)
1531      int *counter;
1532      int reg;
1533      expressionS *ep;
1534 {
1535   assert (ep->X_op == O_constant);
1536   if (ep->X_add_number >= -0x8000 && ep->X_add_number < 0x8000)
1537     macro_build ((char *) NULL, counter, ep,
1538                  mips_isa < 3 ? "addiu" : "daddiu",
1539                  "t,r,j", reg, 0, (int) BFD_RELOC_LO16);
1540   else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
1541     macro_build ((char *) NULL, counter, ep, "ori", "t,r,i", reg, 0,
1542                  (int) BFD_RELOC_LO16);
1543   else if ((ep->X_add_number &~ (offsetT) 0x7fffffff) == 0
1544            || ((ep->X_add_number &~ (offsetT) 0x7fffffff)
1545                == ~ (offsetT) 0x7fffffff))
1546     {
1547       macro_build ((char *) NULL, counter, ep, "lui", "t,u", reg,
1548                    (int) BFD_RELOC_HI16);
1549       if ((ep->X_add_number & 0xffff) != 0)
1550         macro_build ((char *) NULL, counter, ep, "ori", "t,r,i", reg, reg,
1551                      (int) BFD_RELOC_LO16);
1552     }
1553   else if (mips_isa < 3)
1554     {
1555       as_bad ("Number larger than 32 bits");
1556       macro_build ((char *) NULL, counter, ep, "addiu", "t,r,j", reg, 0,
1557                    (int) BFD_RELOC_LO16);
1558     }
1559   else
1560     {
1561       int shift;
1562       expressionS hi32, lo32;
1563
1564       hi32 = *ep;
1565       shift = 32;
1566       hi32.X_add_number >>= shift;
1567       hi32.X_add_number &= 0xffffffff;
1568       if ((hi32.X_add_number & 0x80000000) != 0)
1569         hi32.X_add_number |= ~ (offsetT) 0xffffffff;
1570       load_register (counter, reg, &hi32);
1571       lo32 = *ep;
1572       lo32.X_add_number &= 0xffffffff;
1573       if ((lo32.X_add_number & 0xffff0000) == 0)
1574         macro_build ((char *) NULL, counter, NULL, "dsll32", "d,w,<", reg,
1575                      reg, 0);
1576       else
1577         {
1578           expressionS mid16;
1579
1580           macro_build ((char *) NULL, counter, NULL, "dsll", "d,w,<", reg,
1581                        reg, 16);
1582           mid16 = lo32;
1583           mid16.X_add_number >>= 16;
1584           macro_build ((char *) NULL, counter, &mid16, "ori", "t,r,i", reg,
1585                        reg, (int) BFD_RELOC_LO16);
1586           macro_build ((char *) NULL, counter, NULL, "dsll", "d,w,<", reg,
1587                        reg, 16);
1588         }
1589       if ((lo32.X_add_number & 0xffff) != 0)
1590         macro_build ((char *) NULL, counter, &lo32, "ori", "t,r,i", reg, reg,
1591                      (int) BFD_RELOC_LO16);
1592     }
1593 }
1594
1595 /* Load an address into a register.  */
1596
1597 static void
1598 load_address (counter, reg, ep)
1599      int *counter;
1600      int reg;
1601      expressionS *ep;
1602 {
1603   char *p;
1604
1605   if (ep->X_op != O_constant
1606       && ep->X_op != O_symbol)
1607     {
1608       as_bad ("expression too complex");
1609       ep->X_op = O_constant;
1610     }
1611
1612   if (ep->X_op == O_constant)
1613     {
1614       load_register (counter, reg, ep);
1615       return;
1616     }
1617
1618   if (mips_pic == NO_PIC)
1619     {
1620       /* If this is a reference to a GP relative symbol, we want
1621            addiu        $reg,$gp,<sym>          (BFD_RELOC_MIPS_GPREL)
1622          Otherwise we want
1623            lui          $reg,<sym>              (BFD_RELOC_HI16_S)
1624            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
1625          If we have an addend, we always use the latter form.  */
1626       if (ep->X_add_number != 0)
1627         p = NULL;
1628       else
1629         {
1630           frag_grow (20);
1631           macro_build ((char *) NULL, counter, ep,
1632                        mips_isa < 3 ? "addiu" : "daddiu",
1633                        "t,r,j", reg, GP, (int) BFD_RELOC_MIPS_GPREL);
1634           p = frag_var (rs_machine_dependent, 8, 0,
1635                         RELAX_ENCODE (4, 8, -4, 0, 0, mips_warn_about_macros),
1636                         ep->X_add_symbol, (long) 0, (char *) NULL);
1637         }
1638       macro_build_lui (p, counter, ep, reg);
1639       if (p != NULL)
1640         p += 4;
1641       macro_build (p, counter, ep,
1642                    mips_isa < 3 ? "addiu" : "daddiu",
1643                    "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
1644     }
1645   else if (mips_pic == SVR4_PIC)
1646     {
1647       expressionS ex;
1648
1649       /* If this is a reference to an external symbol, we want
1650            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
1651          Otherwise we want
1652            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
1653            nop
1654            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
1655          If there is a constant, it must be added in after.  */
1656       ex.X_add_number = ep->X_add_number;
1657       ep->X_add_number = 0;
1658       frag_grow (20);
1659       macro_build ((char *) NULL, counter, ep,
1660                    mips_isa < 3 ? "lw" : "ld",
1661                    "t,o(b)", reg, (int) BFD_RELOC_MIPS_GOT16, GP);
1662       macro_build ((char *) NULL, counter, (expressionS *) NULL, "nop", "");
1663       p = frag_var (rs_machine_dependent, 4, 0,
1664                     RELAX_ENCODE (0, 4, -8, 0, 0, mips_warn_about_macros),
1665                     ep->X_add_symbol, (long) 0, (char *) NULL);
1666       macro_build (p, counter, ep,
1667                    mips_isa < 3 ? "addiu" : "daddiu",
1668                    "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
1669       if (ex.X_add_number != 0)
1670         {
1671           if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
1672             as_bad ("PIC code offset overflow (max 16 signed bits)");
1673           ex.X_op = O_constant;
1674           macro_build (p, counter, &ex,
1675                        mips_isa < 3 ? "addiu" : "daddiu",
1676                        "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
1677         }
1678     }
1679   else if (mips_pic == EMBEDDED_PIC)
1680     {
1681       /* We always do
1682            addiu        $reg,$gp,<sym>          (BFD_RELOC_MIPS_GPREL)
1683          */
1684       macro_build ((char *) NULL, counter, ep,
1685                    mips_isa < 3 ? "addiu" : "daddiu",
1686                    "t,r,j", reg, GP, (int) BFD_RELOC_MIPS_GPREL);
1687     }
1688   else
1689     abort ();
1690 }
1691
1692 /*
1693  *                      Build macros
1694  *   This routine implements the seemingly endless macro or synthesized
1695  * instructions and addressing modes in the mips assembly language. Many
1696  * of these macros are simple and are similar to each other. These could
1697  * probably be handled by some kind of table or grammer aproach instead of
1698  * this verbose method. Others are not simple macros but are more like
1699  * optimizing code generation.
1700  *   One interesting optimization is when several store macros appear
1701  * consecutivly that would load AT with the upper half of the same address.
1702  * The ensuing load upper instructions are ommited. This implies some kind
1703  * of global optimization. We currently only optimize within a single macro.
1704  *   For many of the load and store macros if the address is specified as a
1705  * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
1706  * first load register 'at' with zero and use it as the base register. The
1707  * mips assembler simply uses register $zero. Just one tiny optimization
1708  * we're missing.
1709  */
1710 static void
1711 macro (ip)
1712      struct mips_cl_insn *ip;
1713 {
1714   register int treg, sreg, dreg, breg;
1715   int tempreg;
1716   int mask;
1717   int icnt = 0;
1718   int used_at;
1719   expressionS expr1;
1720   const char *s;
1721   const char *s2;
1722   const char *fmt;
1723   int likely = 0;
1724   int dbl = 0;
1725   int coproc = 0;
1726   offsetT maxnum;
1727   bfd_reloc_code_real_type r;
1728   char *p;
1729
1730   treg = (ip->insn_opcode >> 16) & 0x1f;
1731   dreg = (ip->insn_opcode >> 11) & 0x1f;
1732   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
1733   mask = ip->insn_mo->mask;
1734
1735   expr1.X_op = O_constant;
1736   expr1.X_op_symbol = NULL;
1737   expr1.X_add_symbol = NULL;
1738   expr1.X_add_number = 1;
1739
1740   switch (mask)
1741     {
1742     case M_DABS:
1743       dbl = 1;
1744     case M_ABS:
1745       /* bgez $a0,.+12
1746          move v0,$a0
1747          sub v0,$zero,$a0
1748          */
1749
1750       mips_emit_delays ();
1751       ++mips_noreorder;
1752       mips_any_noreorder = 1;
1753
1754       expr1.X_add_number = 8;
1755       macro_build ((char *) NULL, &icnt, &expr1, "bgez", "s,p", sreg);
1756       if (dreg == sreg)
1757         macro_build ((char *) NULL, &icnt, NULL, "nop", "", 0);
1758       else
1759         macro_build ((char *) NULL, &icnt, NULL, "move", "d,s", dreg, sreg, 0);
1760       macro_build ((char *) NULL, &icnt, NULL,
1761                    dbl ? "dsub" : "sub",
1762                    "d,v,t", dreg, 0, sreg);
1763
1764       --mips_noreorder;
1765       return;
1766
1767     case M_ADD_I:
1768       s = "addi";
1769       s2 = "add";
1770       goto do_addi;
1771     case M_ADDU_I:
1772       s = "addiu";
1773       s2 = "addu";
1774       goto do_addi;
1775     case M_DADD_I:
1776       dbl = 1;
1777       s = "daddi";
1778       s2 = "dadd";
1779       goto do_addi;
1780     case M_DADDU_I:
1781       dbl = 1;
1782       s = "daddiu";
1783       s2 = "daddu";
1784     do_addi:
1785       if (imm_expr.X_add_number >= -0x8000 && imm_expr.X_add_number < 0x8000)
1786         {
1787           macro_build ((char *) NULL, &icnt, &imm_expr, s, "t,r,j", treg, sreg,
1788                        (int) BFD_RELOC_LO16);
1789           return;
1790         }
1791       load_register (&icnt, AT, &imm_expr);
1792       macro_build ((char *) NULL, &icnt, NULL, s2, "d,v,t", treg, sreg, AT);
1793       break;
1794
1795     case M_AND_I:
1796       s = "andi";
1797       s2 = "and";
1798       goto do_bit;
1799     case M_OR_I:
1800       s = "ori";
1801       s2 = "or";
1802       goto do_bit;
1803     case M_NOR_I:
1804       s = "";
1805       s2 = "nor";
1806       goto do_bit;
1807     case M_XOR_I:
1808       s = "xori";
1809       s2 = "xor";
1810     do_bit:
1811       if (imm_expr.X_add_number >= 0 && imm_expr.X_add_number < 0x10000)
1812         {
1813           if (mask != M_NOR_I)
1814             macro_build ((char *) NULL, &icnt, &imm_expr, s, "t,r,i", treg,
1815                          sreg, (int) BFD_RELOC_LO16);
1816           else
1817             {
1818               macro_build ((char *) NULL, &icnt, &imm_expr, "ori", "t,r,i",
1819                            treg, sreg, (int) BFD_RELOC_LO16);
1820               macro_build ((char *) NULL, &icnt, NULL, "nor", "d,v,t",
1821                            treg, treg, 0);
1822             }
1823           return;
1824         }
1825
1826       load_register (&icnt, AT, &imm_expr);
1827       macro_build ((char *) NULL, &icnt, NULL, s2, "d,v,t", treg, sreg, AT);
1828       break;
1829
1830     case M_BEQ_I:
1831       s = "beq";
1832       goto beq_i;
1833     case M_BEQL_I:
1834       s = "beql";
1835       likely = 1;
1836       goto beq_i;
1837     case M_BNE_I:
1838       s = "bne";
1839       goto beq_i;
1840     case M_BNEL_I:
1841       s = "bnel";
1842       likely = 1;
1843     beq_i:
1844       if (imm_expr.X_add_number == 0)
1845         {
1846           macro_build ((char *) NULL, &icnt, &offset_expr, s, "s,t,p", sreg,
1847                        0);
1848           return;
1849         }
1850       load_register (&icnt, AT, &imm_expr);
1851       macro_build ((char *) NULL, &icnt, &offset_expr, s, "s,t,p", sreg, AT);
1852       break;
1853
1854     case M_BGEL:
1855       likely = 1;
1856     case M_BGE:
1857       if (treg == 0)
1858         {
1859           macro_build ((char *) NULL, &icnt, &offset_expr,
1860                        likely ? "bgezl" : "bgez",
1861                        "s,p", sreg);
1862           return;
1863         }
1864       if (sreg == 0)
1865         {
1866           macro_build ((char *) NULL, &icnt, &offset_expr,
1867                        likely ? "blezl" : "blez",
1868                        "s,p", treg);
1869           return;
1870         }
1871       macro_build ((char *) NULL, &icnt, NULL, "slt", "d,v,t", AT, sreg, treg);
1872       macro_build ((char *) NULL, &icnt, &offset_expr,
1873                    likely ? "beql" : "beq",
1874                    "s,t,p", AT, 0);
1875       break;
1876
1877     case M_BGTL_I:
1878       likely = 1;
1879     case M_BGT_I:
1880       /* check for > max integer */
1881       maxnum = 0x7fffffff;
1882       if (mips_isa >= 3)
1883         {
1884           maxnum <<= 16;
1885           maxnum |= 0xffff;
1886           maxnum <<= 16;
1887           maxnum |= 0xffff;
1888         }
1889       if (imm_expr.X_add_number >= maxnum)
1890         {
1891         do_false:
1892           /* result is always false */
1893           if (! likely)
1894             {
1895               as_warn ("Branch %s is always false (nop)", ip->insn_mo->name);
1896               macro_build ((char *) NULL, &icnt, NULL, "nop", "", 0);
1897             }
1898           else
1899             {
1900               as_warn ("Branch likely %s is always false", ip->insn_mo->name);
1901               macro_build ((char *) NULL, &icnt, &offset_expr, "bnel",
1902                            "s,t,p", 0, 0);
1903             }
1904           return;
1905         }
1906       imm_expr.X_add_number++;
1907       /* FALLTHROUGH */
1908     case M_BGE_I:
1909     case M_BGEL_I:
1910       if (mask == M_BGEL_I)
1911         likely = 1;
1912       if (imm_expr.X_add_number == 0)
1913         {
1914           macro_build ((char *) NULL, &icnt, &offset_expr,
1915                        likely ? "bgezl" : "bgez",
1916                        "s,p", sreg);
1917           return;
1918         }
1919       if (imm_expr.X_add_number == 1)
1920         {
1921           macro_build ((char *) NULL, &icnt, &offset_expr,
1922                        likely ? "bgtzl" : "bgtz",
1923                        "s,p", sreg);
1924           return;
1925         }
1926       maxnum = 0x7fffffff;
1927       if (mips_isa >= 3)
1928         {
1929           maxnum <<= 16;
1930           maxnum |= 0xffff;
1931           maxnum <<= 16;
1932           maxnum |= 0xffff;
1933         }
1934       maxnum = - maxnum - 1;
1935       if (imm_expr.X_add_number <= maxnum)
1936         {
1937         do_true:
1938           /* result is always true */
1939           as_warn ("Branch %s is always true", ip->insn_mo->name);
1940           macro_build ((char *) NULL, &icnt, &offset_expr, "b", "p");
1941           return;
1942         }
1943       set_at (&icnt, sreg, 0);
1944       macro_build ((char *) NULL, &icnt, &offset_expr,
1945                    likely ? "beql" : "beq",
1946                    "s,t,p", AT, 0);
1947       break;
1948
1949     case M_BGEUL:
1950       likely = 1;
1951     case M_BGEU:
1952       if (treg == 0)
1953         goto do_true;
1954       if (sreg == 0)
1955         {
1956           macro_build ((char *) NULL, &icnt, &offset_expr,
1957                        likely ? "beql" : "beq",
1958                        "s,t,p", 0, treg);
1959           return;
1960         }
1961       macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", AT, sreg,
1962                    treg);
1963       macro_build ((char *) NULL, &icnt, &offset_expr,
1964                    likely ? "beql" : "beq",
1965                    "s,t,p", AT, 0);
1966       break;
1967
1968     case M_BGTUL_I:
1969       likely = 1;
1970     case M_BGTU_I:
1971       if (sreg == 0 || imm_expr.X_add_number == -1)
1972         goto do_false;
1973       imm_expr.X_add_number++;
1974       /* FALLTHROUGH */
1975     case M_BGEU_I:
1976     case M_BGEUL_I:
1977       if (mask == M_BGEUL_I)
1978         likely = 1;
1979       if (imm_expr.X_add_number == 0)
1980         goto do_true;
1981       if (imm_expr.X_add_number == 1)
1982         {
1983           macro_build ((char *) NULL, &icnt, &offset_expr,
1984                        likely ? "bnel" : "bne",
1985                        "s,t,p", sreg, 0);
1986           return;
1987         }
1988       set_at (&icnt, sreg, 1);
1989       macro_build ((char *) NULL, &icnt, &offset_expr,
1990                    likely ? "beql" : "beq",
1991                    "s,t,p", AT, 0);
1992       break;
1993
1994     case M_BGTL:
1995       likely = 1;
1996     case M_BGT:
1997       if (treg == 0)
1998         {
1999           macro_build ((char *) NULL, &icnt, &offset_expr,
2000                        likely ? "bgtzl" : "bgtz",
2001                        "s,p", sreg);
2002           return;
2003         }
2004       if (sreg == 0)
2005         {
2006           macro_build ((char *) NULL, &icnt, &offset_expr,
2007                        likely ? "bltzl" : "bltz",
2008                        "s,p", treg);
2009           return;
2010         }
2011       macro_build ((char *) NULL, &icnt, NULL, "slt", "d,v,t", AT, treg, sreg);
2012       macro_build ((char *) NULL, &icnt, &offset_expr,
2013                    likely ? "bnel" : "bne",
2014                    "s,t,p", AT, 0);
2015       break;
2016
2017     case M_BGTUL:
2018       likely = 1;
2019     case M_BGTU:
2020       if (treg == 0)
2021         {
2022           macro_build ((char *) NULL, &icnt, &offset_expr,
2023                        likely ? "bnel" : "bne",
2024                        "s,t,p", sreg, 0);
2025           return;
2026         }
2027       if (sreg == 0)
2028         goto do_false;
2029       macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", AT, treg,
2030                    sreg);
2031       macro_build ((char *) NULL, &icnt, &offset_expr,
2032                    likely ? "bnel" : "bne",
2033                    "s,t,p", AT, 0);
2034       break;
2035
2036     case M_BLEL:
2037       likely = 1;
2038     case M_BLE:
2039       if (treg == 0)
2040         {
2041           macro_build ((char *) NULL, &icnt, &offset_expr,
2042                        likely ? "blezl" : "blez",
2043                        "s,p", sreg);
2044           return;
2045         }
2046       if (sreg == 0)
2047         {
2048           macro_build ((char *) NULL, &icnt, &offset_expr,
2049                        likely ? "bgezl" : "bgez",
2050                        "s,p", treg);
2051           return;
2052         }
2053       macro_build ((char *) NULL, &icnt, NULL, "slt", "d,v,t", AT, treg, sreg);
2054       macro_build ((char *) NULL, &icnt, &offset_expr,
2055                    likely ? "beql" : "beq",
2056                    "s,t,p", AT, 0);
2057       break;
2058
2059     case M_BLEL_I:
2060       likely = 1;
2061     case M_BLE_I:
2062       maxnum = 0x7fffffff;
2063       if (mips_isa >= 3)
2064         {
2065           maxnum <<= 16;
2066           maxnum |= 0xffff;
2067           maxnum <<= 16;
2068           maxnum |= 0xffff;
2069         }
2070       if (imm_expr.X_add_number >= maxnum)
2071         goto do_true;
2072       imm_expr.X_add_number++;
2073       /* FALLTHROUGH */
2074     case M_BLT_I:
2075     case M_BLTL_I:
2076       if (mask == M_BLTL_I)
2077         likely = 1;
2078       if (imm_expr.X_add_number == 0)
2079         {
2080           macro_build ((char *) NULL, &icnt, &offset_expr,
2081                        likely ? "bltzl" : "bltz",
2082                        "s,p", sreg);
2083           return;
2084         }
2085       if (imm_expr.X_add_number == 1)
2086         {
2087           macro_build ((char *) NULL, &icnt, &offset_expr,
2088                        likely ? "blezl" : "blez",
2089                        "s,p", sreg);
2090           return;
2091         }
2092       set_at (&icnt, sreg, 0);
2093       macro_build ((char *) NULL, &icnt, &offset_expr,
2094                    likely ? "bnel" : "bne",
2095                    "s,t,p", AT, 0);
2096       break;
2097
2098     case M_BLEUL:
2099       likely = 1;
2100     case M_BLEU:
2101       if (treg == 0)
2102         {
2103           macro_build ((char *) NULL, &icnt, &offset_expr,
2104                        likely ? "beql" : "beq",
2105                        "s,t,p", sreg, 0);
2106           return;
2107         }
2108       if (sreg == 0)
2109         goto do_true;
2110       macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", AT, treg,
2111                    sreg);
2112       macro_build ((char *) NULL, &icnt, &offset_expr,
2113                    likely ? "beql" : "beq",
2114                    "s,t,p", AT, 0);
2115       break;
2116
2117     case M_BLEUL_I:
2118       likely = 1;
2119     case M_BLEU_I:
2120       if (sreg == 0 || imm_expr.X_add_number == -1)
2121         goto do_true;
2122       imm_expr.X_add_number++;
2123       /* FALLTHROUGH */
2124     case M_BLTU_I:
2125     case M_BLTUL_I:
2126       if (mask == M_BLTUL_I)
2127         likely = 1;
2128       if (imm_expr.X_add_number == 0)
2129         goto do_false;
2130       if (imm_expr.X_add_number == 1)
2131         {
2132           macro_build ((char *) NULL, &icnt, &offset_expr,
2133                        likely ? "beql" : "beq",
2134                        "s,t,p", sreg, 0);
2135           return;
2136         }
2137       set_at (&icnt, sreg, 1);
2138       macro_build ((char *) NULL, &icnt, &offset_expr,
2139                    likely ? "bnel" : "bne",
2140                    "s,t,p", AT, 0);
2141       break;
2142
2143     case M_BLTL:
2144       likely = 1;
2145     case M_BLT:
2146       if (treg == 0)
2147         {
2148           macro_build ((char *) NULL, &icnt, &offset_expr,
2149                        likely ? "bltzl" : "bltz",
2150                        "s,p", sreg);
2151           return;
2152         }
2153       if (sreg == 0)
2154         {
2155           macro_build ((char *) NULL, &icnt, &offset_expr,
2156                        likely ? "bgtzl" : "bgtz",
2157                        "s,p", treg);
2158           return;
2159         }
2160       macro_build ((char *) NULL, &icnt, NULL, "slt", "d,v,t", AT, sreg, treg);
2161       macro_build ((char *) NULL, &icnt, &offset_expr,
2162                    likely ? "bnel" : "bne",
2163                    "s,t,p", AT, 0);
2164       break;
2165
2166     case M_BLTUL:
2167       likely = 1;
2168     case M_BLTU:
2169       if (treg == 0)
2170         goto do_false;
2171       if (sreg == 0)
2172         {
2173           macro_build ((char *) NULL, &icnt, &offset_expr,
2174                        likely ? "bnel" : "bne",
2175                        "s,t,p", 0, treg);
2176           return;
2177         }
2178       macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", AT, sreg,
2179                    treg);
2180       macro_build ((char *) NULL, &icnt, &offset_expr,
2181                    likely ? "bnel" : "bne",
2182                    "s,t,p", AT, 0);
2183       break;
2184
2185     case M_DDIV_3:
2186       dbl = 1;
2187     case M_DIV_3:
2188       s = "mflo";
2189       goto do_div3;
2190     case M_DREM_3:
2191       dbl = 1;
2192     case M_REM_3:
2193       s = "mfhi";
2194     do_div3:
2195       if (treg == 0)
2196         {
2197           as_warn ("Divide by zero.");
2198           if (mips_trap)
2199             macro_build ((char *) NULL, &icnt, NULL, "teq", "s,t", 0, 0);
2200           else
2201             macro_build ((char *) NULL, &icnt, NULL, "break", "c", 7);
2202           return;
2203         }
2204
2205       mips_emit_delays ();
2206       ++mips_noreorder;
2207       mips_any_noreorder = 1;
2208       macro_build ((char *) NULL, &icnt, NULL,
2209                    dbl ? "ddiv" : "div",
2210                    "z,s,t", sreg, treg);
2211       if (mips_trap)
2212         macro_build ((char *) NULL, &icnt, NULL, "teq", "s,t", treg, 0);
2213       else
2214         {
2215           expr1.X_add_number = 8;
2216           macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", treg, 0);
2217           macro_build ((char *) NULL, &icnt, NULL, "nop", "", 0);
2218           macro_build ((char *) NULL, &icnt, NULL, "break", "c", 7);
2219         }
2220       expr1.X_add_number = -1;
2221       macro_build ((char *) NULL, &icnt, &expr1,
2222                    dbl ? "daddiu" : "addiu",
2223                    "t,r,j", AT, 0, (int) BFD_RELOC_LO16);
2224       expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
2225       macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", treg, AT);
2226       if (dbl)
2227         {
2228           expr1.X_add_number = 1;
2229           macro_build ((char *) NULL, &icnt, &expr1, "daddiu", "t,r,j", AT, 0,
2230                        (int) BFD_RELOC_LO16);
2231           macro_build ((char *) NULL, &icnt, NULL, "dsll32", "d,w,<", AT, AT,
2232                        31);
2233         }
2234       else
2235         {
2236           expr1.X_add_number = 0x80000000;
2237           macro_build ((char *) NULL, &icnt, &expr1, "lui", "t,u", AT,
2238                        (int) BFD_RELOC_HI16);
2239         }
2240       if (mips_trap)
2241         macro_build ((char *) NULL, &icnt, NULL, "teq", "s,t", sreg, AT);
2242       else
2243         {
2244           expr1.X_add_number = 8;
2245           macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", sreg, AT);
2246           macro_build ((char *) NULL, &icnt, NULL, "nop", "", 0);
2247           macro_build ((char *) NULL, &icnt, NULL, "break", "c", 6);
2248         }
2249       --mips_noreorder;
2250       macro_build ((char *) NULL, &icnt, NULL, s, "d", dreg);
2251       break;
2252
2253     case M_DIV_3I:
2254       s = "div";
2255       s2 = "mflo";
2256       goto do_divi;
2257     case M_DIVU_3I:
2258       s = "divu";
2259       s2 = "mflo";
2260       goto do_divi;
2261     case M_REM_3I:
2262       s = "div";
2263       s2 = "mfhi";
2264       goto do_divi;
2265     case M_REMU_3I:
2266       s = "divu";
2267       s2 = "mfhi";
2268       goto do_divi;
2269     case M_DDIV_3I:
2270       dbl = 1;
2271       s = "ddiv";
2272       s2 = "mflo";
2273       goto do_divi;
2274     case M_DDIVU_3I:
2275       dbl = 1;
2276       s = "ddivu";
2277       s2 = "mflo";
2278       goto do_divi;
2279     case M_DREM_3I:
2280       dbl = 1;
2281       s = "ddiv";
2282       s2 = "mfhi";
2283       goto do_divi;
2284     case M_DREMU_3I:
2285       dbl = 1;
2286       s = "ddivu";
2287       s2 = "mfhi";
2288     do_divi:
2289       if (imm_expr.X_add_number == 0)
2290         {
2291           as_warn ("Divide by zero.");
2292           if (mips_trap)
2293             macro_build ((char *) NULL, &icnt, NULL, "teq", "s,t", 0, 0);
2294           else
2295             macro_build ((char *) NULL, &icnt, NULL, "break", "c", 7);
2296           return;
2297         }
2298       if (imm_expr.X_add_number == 1)
2299         {
2300           if (strcmp (s2, "mflo") == 0)
2301             macro_build ((char *) NULL, &icnt, NULL, "move", "d,s", dreg,
2302                          sreg);
2303           else
2304             macro_build ((char *) NULL, &icnt, NULL, "move", "d,s", dreg, 0);
2305           return;
2306         }
2307       if (imm_expr.X_add_number == -1
2308           && s[strlen (s) - 1] != 'u')
2309         {
2310           if (strcmp (s2, "mflo") == 0)
2311             {
2312               if (dbl)
2313                 macro_build ((char *) NULL, &icnt, NULL, "dneg", "d,w", dreg,
2314                              sreg);
2315               else
2316                 macro_build ((char *) NULL, &icnt, NULL, "neg", "d,w", dreg,
2317                              sreg);
2318             }
2319           else
2320             macro_build ((char *) NULL, &icnt, NULL, "move", "d,s", dreg, 0);
2321           return;
2322         }
2323
2324       load_register (&icnt, AT, &imm_expr);
2325       macro_build ((char *) NULL, &icnt, NULL, s, "z,s,t", sreg, AT);
2326       macro_build ((char *) NULL, &icnt, NULL, s2, "d", dreg);
2327       break;
2328
2329     case M_DIVU_3:
2330       s = "divu";
2331       s2 = "mflo";
2332       goto do_divu3;
2333     case M_REMU_3:
2334       s = "divu";
2335       s2 = "mfhi";
2336       goto do_divu3;
2337     case M_DDIVU_3:
2338       s = "ddivu";
2339       s2 = "mflo";
2340       goto do_divu3;
2341     case M_DREMU_3:
2342       s = "ddivu";
2343       s2 = "mfhi";
2344     do_divu3:
2345       mips_emit_delays ();
2346       ++mips_noreorder;
2347       mips_any_noreorder = 1;
2348       macro_build ((char *) NULL, &icnt, NULL, s, "z,s,t", sreg, treg);
2349       if (mips_trap)
2350         macro_build ((char *) NULL, &icnt, NULL, "teq", "s,t", treg, 0);
2351       else
2352         {
2353           expr1.X_add_number = 8;
2354           macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", treg, 0);
2355           macro_build ((char *) NULL, &icnt, NULL, "nop", "", 0);
2356           macro_build ((char *) NULL, &icnt, NULL, "break", "c", 7);
2357         }
2358       --mips_noreorder;
2359       macro_build ((char *) NULL, &icnt, NULL, s2, "d", dreg);
2360       return;
2361
2362     case M_LA_AB:
2363       /* Load the address of a symbol into a register.  If breg is not
2364          zero, we then add a base register to it.  */
2365
2366       /* When generating embedded PIC code, we permit expressions of
2367          the form
2368            la   $4,foo-bar
2369          where bar is an address in the .text section.  These are used
2370          when getting the addresses of functions.  We don't permit
2371          X_add_number to be non-zero, because if the symbol is
2372          external the relaxing code needs to know that any addend is
2373          purely the offset to X_op_symbol.  */
2374       if (mips_pic == EMBEDDED_PIC
2375           && offset_expr.X_op == O_subtract
2376           && now_seg == text_section
2377           && S_GET_SEGMENT (offset_expr.X_op_symbol) == text_section
2378           && breg == 0
2379           && offset_expr.X_add_number == 0)
2380         {
2381           macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
2382                        treg, (int) BFD_RELOC_PCREL_HI16_S);
2383           macro_build ((char *) NULL, &icnt, &offset_expr,
2384                        mips_isa < 3 ? "addiu" : "daddiu",
2385                        "t,r,j", treg, treg, (int) BFD_RELOC_PCREL_LO16);
2386           return;
2387         }
2388
2389       if (offset_expr.X_op != O_symbol
2390           && offset_expr.X_op != O_constant)
2391         {
2392           as_bad ("expression too complex");
2393           offset_expr.X_op = O_constant;
2394         }
2395
2396       if (treg == breg)
2397         {
2398           tempreg = AT;
2399           used_at = 1;
2400         }
2401       else
2402         {
2403           tempreg = treg;
2404           used_at = 0;
2405         }
2406
2407       if (offset_expr.X_op == O_constant)
2408         load_register (&icnt, tempreg, &offset_expr);
2409       else if (mips_pic == NO_PIC)
2410         {
2411           /* If this is a reference to an GP relative symbol, we want
2412                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_MIPS_GPREL)
2413              Otherwise we want
2414                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
2415                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
2416              If we have a constant, we need two instructions anyhow,
2417              so we may as well always use the latter form.  */
2418           if (offset_expr.X_add_number != 0)
2419             p = NULL;
2420           else
2421             {
2422               frag_grow (20);
2423               macro_build ((char *) NULL, &icnt, &offset_expr,
2424                            mips_isa < 3 ? "addiu" : "daddiu",
2425                            "t,r,j", tempreg, GP, (int) BFD_RELOC_MIPS_GPREL);
2426               p = frag_var (rs_machine_dependent, 8, 0,
2427                             RELAX_ENCODE (4, 8, 0, 4, 0,
2428                                           mips_warn_about_macros),
2429                             offset_expr.X_add_symbol, (long) 0,
2430                             (char *) NULL);
2431             }
2432           macro_build_lui (p, &icnt, &offset_expr, tempreg);
2433           if (p != NULL)
2434             p += 4;
2435           macro_build (p, &icnt, &offset_expr,
2436                        mips_isa < 3 ? "addiu" : "daddiu",
2437                        "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
2438         }
2439       else if (mips_pic == SVR4_PIC)
2440         {
2441           /* If this is a reference to an external symbol, and there
2442              is no constant, we want
2443                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
2444              For a local symbol, we want
2445                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
2446                nop
2447                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
2448
2449              If we have a small constant, and this is a reference to
2450              an external symbol, we want
2451                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
2452                nop
2453                addiu    $tempreg,$tempreg,<constant>
2454              For a local symbol, we want the same instruction
2455              sequence, but we output a BFD_RELOC_LO16 reloc on the
2456              addiu instruction.
2457
2458              If we have a large constant, and this is a reference to
2459              an external symbol, we want
2460                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
2461                lui      $at,<hiconstant>
2462                addiu    $at,$at,<loconstant>
2463                addu     $tempreg,$tempreg,$at
2464              For a local symbol, we want the same instruction
2465              sequence, but we output a BFD_RELOC_LO16 reloc on the
2466              addiu instruction.  */
2467           expr1.X_add_number = offset_expr.X_add_number;
2468           offset_expr.X_add_number = 0;
2469           frag_grow (32);
2470           macro_build ((char *) NULL, &icnt, &offset_expr,
2471                        mips_isa < 3 ? "lw" : "ld",
2472                        "t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT16, GP);
2473           if (expr1.X_add_number == 0)
2474             {
2475               int off;
2476
2477               if (breg == 0)
2478                 off = 0;
2479               else
2480                 {
2481                   /* We're going to put in an addu instruction using
2482                      tempreg, so we may as well insert the nop right
2483                      now.  */
2484                   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
2485                                "nop", "");
2486                   off = 4;
2487                 }
2488               p = frag_var (rs_machine_dependent, 8 - off, 0,
2489                             RELAX_ENCODE (0, 8 - off, -4 - off, 4 - off, 0,
2490                                           (breg == 0
2491                                            ? mips_warn_about_macros
2492                                            : 0)),
2493                             offset_expr.X_add_symbol, (long) 0,
2494                             (char *) NULL);
2495               if (breg == 0)
2496                 {
2497                   macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
2498                   p += 4;
2499                 }
2500               macro_build (p, &icnt, &expr1,
2501                            mips_isa < 3 ? "addiu" : "daddiu",
2502                            "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
2503               /* FIXME: If breg == 0, and the next instruction uses
2504                  $tempreg, then if this variant case is used an extra
2505                  nop will be generated.  */
2506             }
2507           else if (expr1.X_add_number >= -0x8000
2508                    && expr1.X_add_number < 0x8000)
2509             {
2510               macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
2511                            "nop", "");
2512               macro_build ((char *) NULL, &icnt, &expr1,
2513                            mips_isa < 3 ? "addiu" : "daddiu",
2514                            "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
2515               (void) frag_var (rs_machine_dependent, 0, 0,
2516                                RELAX_ENCODE (0, 0, -12, -4, 0, 0),
2517                                offset_expr.X_add_symbol, (long) 0,
2518                                (char *) NULL);
2519             }
2520           else
2521             {
2522               int off1;
2523
2524               /* If we are going to add in a base register, and the
2525                  target register and the base register are the same,
2526                  then we are using AT as a temporary register.  Since
2527                  we want to load the constant into AT, we add our
2528                  current AT (from the global offset table) and the
2529                  register into the register now, and pretend we were
2530                  not using a base register.  */
2531               if (breg != treg)
2532                 off1 = 0;
2533               else
2534                 {
2535                   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
2536                                "nop", "");
2537                   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
2538                                mips_isa < 3 ? "addu" : "daddu",
2539                                "d,v,t", treg, AT, breg);
2540                   breg = 0;
2541                   tempreg = treg;
2542                   off1 = -8;
2543                 }
2544
2545               macro_build_lui ((char *) NULL, &icnt, &expr1, AT);
2546               macro_build ((char *) NULL, &icnt, &expr1,
2547                            mips_isa < 3 ? "addiu" : "daddiu",
2548                            "t,r,j", AT, AT, (int) BFD_RELOC_LO16);
2549               macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
2550                            mips_isa < 3 ? "addu" : "daddu",
2551                            "d,v,t", tempreg, tempreg, AT);
2552               (void) frag_var (rs_machine_dependent, 0, 0,
2553                                RELAX_ENCODE (0, 0, -16 + off1, -8, 0, 0),
2554                                offset_expr.X_add_symbol, (long) 0,
2555                                (char *) NULL);
2556               used_at = 1;
2557             }
2558         }
2559       else if (mips_pic == EMBEDDED_PIC)
2560         {
2561           /* We use
2562                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_MIPS_GPREL)
2563              */
2564           macro_build ((char *) NULL, &icnt, &offset_expr,
2565                        mips_isa < 3 ? "addiu" : "daddiu",
2566                        "t,r,j", tempreg, GP, (int) BFD_RELOC_MIPS_GPREL);
2567         }
2568       else
2569         abort ();
2570
2571       if (breg != 0)
2572         macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
2573                      mips_isa < 3 ? "addu" : "daddu",
2574                      "d,v,t", treg, tempreg, breg);
2575
2576       if (! used_at)
2577         return;
2578
2579       break;
2580
2581     case M_J_A:
2582       /* The j instruction may not be used in PIC code, since it
2583          requires an absolute address.  We convert it to a b
2584          instruction.  */
2585       if (mips_pic == NO_PIC)
2586         macro_build ((char *) NULL, &icnt, &offset_expr, "j", "a");
2587       else
2588         macro_build ((char *) NULL, &icnt, &offset_expr, "b", "p");
2589       return;
2590
2591       /* The jal instructions must be handled as macros because when
2592          generating PIC code they expand to multi-instruction
2593          sequences.  Normally they are simple instructions.  */
2594     case M_JAL_1:
2595       dreg = RA;
2596       /* Fall through.  */
2597     case M_JAL_2:
2598       if (mips_pic == NO_PIC
2599           || mips_pic == EMBEDDED_PIC)
2600         macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "jalr",
2601                      "d,s", dreg, sreg);
2602       else if (mips_pic == SVR4_PIC)
2603         {
2604           if (sreg != PIC_CALL_REG)
2605             as_warn ("MIPS PIC call to register other than $25");
2606       
2607           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "jalr",
2608                        "d,s", dreg, sreg);
2609           if (mips_cprestore_offset < 0)
2610             as_warn ("No .cprestore pseudo-op used in PIC code");
2611           else
2612             {
2613               expr1.X_add_number = mips_cprestore_offset;
2614               macro_build ((char *) NULL, &icnt, &expr1,
2615                            mips_isa < 3 ? "lw" : "ld",
2616                            "t,o(b)", GP, (int) BFD_RELOC_LO16, mips_frame_reg);
2617             }
2618         }
2619       else
2620         abort ();
2621
2622       return;
2623
2624     case M_JAL_A:
2625       if (mips_pic == NO_PIC)
2626         macro_build ((char *) NULL, &icnt, &offset_expr, "jal", "a");
2627       else if (mips_pic == SVR4_PIC)
2628         {
2629           /* If this is a reference to an external symbol, we want
2630                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
2631                nop
2632                jalr     $25
2633                nop
2634                lw       $gp,cprestore($sp)
2635              The cprestore value is set using the .cprestore
2636              pseudo-op.  If the symbol is not external, we want
2637                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
2638                nop
2639                addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
2640                jalr     $25
2641                nop
2642                lw       $gp,cprestore($sp)
2643              */
2644           frag_grow (20);
2645           macro_build ((char *) NULL, &icnt, &offset_expr,
2646                        mips_isa < 3 ? "lw" : "ld",
2647                        "t,o(b)", PIC_CALL_REG,
2648                        (int) BFD_RELOC_MIPS_CALL16, GP);
2649           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
2650           p = frag_var (rs_machine_dependent, 4, 0,
2651                         RELAX_ENCODE (0, 4, -8, 0, 0, 0),
2652                         offset_expr.X_add_symbol, (long) 0, (char *) NULL);
2653           macro_build (p, &icnt, &offset_expr,
2654                        mips_isa < 3 ? "addiu" : "daddiu",
2655                        "t,r,j", PIC_CALL_REG, PIC_CALL_REG,
2656                        (int) BFD_RELOC_LO16);
2657           macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
2658                        "jalr", "s", PIC_CALL_REG);
2659           if (mips_cprestore_offset < 0)
2660             as_warn ("No .cprestore pseudo-op used in PIC code");
2661           else
2662             {
2663               if (mips_noreorder)
2664                 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
2665                              "nop", "");
2666               expr1.X_add_number = mips_cprestore_offset;
2667               macro_build ((char *) NULL, &icnt, &expr1,
2668                            mips_isa < 3 ? "lw" : "ld",
2669                            "t,o(b)", GP, (int) BFD_RELOC_LO16,
2670                            mips_frame_reg);
2671             }
2672         }
2673       else if (mips_pic == EMBEDDED_PIC)
2674         {
2675           macro_build ((char *) NULL, &icnt, &offset_expr, "bal", "p");
2676           /* The linker may expand the call to a longer sequence which
2677              uses $at, so we must break rather than return.  */
2678           break;
2679         }
2680       else
2681         abort ();
2682
2683       return;
2684
2685     case M_LB_AB:
2686       s = "lb";
2687       goto ld;
2688     case M_LBU_AB:
2689       s = "lbu";
2690       goto ld;
2691     case M_LH_AB:
2692       s = "lh";
2693       goto ld;
2694     case M_LHU_AB:
2695       s = "lhu";
2696       goto ld;
2697     case M_LW_AB:
2698       s = "lw";
2699       goto ld;
2700     case M_LWC0_AB:
2701       s = "lwc0";
2702       coproc = 1;
2703       goto ld;
2704     case M_LWC1_AB:
2705       s = "lwc1";
2706       coproc = 1;
2707       goto ld;
2708     case M_LWC2_AB:
2709       s = "lwc2";
2710       coproc = 1;
2711       goto ld;
2712     case M_LWC3_AB:
2713       s = "lwc3";
2714       coproc = 1;
2715       goto ld;
2716     case M_LWL_AB:
2717       s = "lwl";
2718       goto ld;
2719     case M_LWR_AB:
2720       s = "lwr";
2721       goto ld;
2722     case M_LDC1_AB:
2723       s = "ldc1";
2724       coproc = 1;
2725       goto ld;
2726     case M_LDC2_AB:
2727       s = "ldc2";
2728       coproc = 1;
2729       goto ld;
2730     case M_LDC3_AB:
2731       s = "ldc3";
2732       coproc = 1;
2733       goto ld;
2734     case M_LDL_AB:
2735       s = "ldl";
2736       goto ld;
2737     case M_LDR_AB:
2738       s = "ldr";
2739       goto ld;
2740     case M_LL_AB:
2741       s = "ll";
2742       goto ld;
2743     case M_LLD_AB:
2744       s = "lld";
2745       goto ld;
2746     case M_LWU_AB:
2747       s = "lwu";
2748     ld:
2749       if (breg == treg || coproc)
2750         {
2751           tempreg = AT;
2752           used_at = 1;
2753         }
2754       else
2755         {
2756           tempreg = treg;
2757           used_at = 0;
2758         }
2759       goto ld_st;
2760     case M_SB_AB:
2761       s = "sb";
2762       goto st;
2763     case M_SH_AB:
2764       s = "sh";
2765       goto st;
2766     case M_SW_AB:
2767       s = "sw";
2768       goto st;
2769     case M_SWC0_AB:
2770       s = "swc0";
2771       coproc = 1;
2772       goto st;
2773     case M_SWC1_AB:
2774       s = "swc1";
2775       coproc = 1;
2776       goto st;
2777     case M_SWC2_AB:
2778       s = "swc2";
2779       coproc = 1;
2780       goto st;
2781     case M_SWC3_AB:
2782       s = "swc3";
2783       coproc = 1;
2784       goto st;
2785     case M_SWL_AB:
2786       s = "swl";
2787       goto st;
2788     case M_SWR_AB:
2789       s = "swr";
2790       goto st;
2791     case M_SC_AB:
2792       s = "sc";
2793       goto st;
2794     case M_SCD_AB:
2795       s = "scd";
2796       goto st;
2797     case M_SDC1_AB:
2798       s = "sdc1";
2799       coproc = 1;
2800       goto st;
2801     case M_SDC2_AB:
2802       s = "sdc2";
2803       coproc = 1;
2804       goto st;
2805     case M_SDC3_AB:
2806       s = "sdc3";
2807       coproc = 1;
2808       goto st;
2809     case M_SDL_AB:
2810       s = "sdl";
2811       goto st;
2812     case M_SDR_AB:
2813       s = "sdr";
2814     st:
2815       tempreg = AT;
2816       used_at = 1;
2817     ld_st:
2818       if (mask == M_LWC1_AB
2819           || mask == M_SWC1_AB
2820           || mask == M_LDC1_AB
2821           || mask == M_SDC1_AB
2822           || mask == M_L_DAB
2823           || mask == M_S_DAB)
2824         fmt = "T,o(b)";
2825       else if (coproc)
2826         fmt = "E,o(b)";
2827       else
2828         fmt = "t,o(b)";
2829
2830       if (offset_expr.X_op != O_constant
2831           && offset_expr.X_op != O_symbol)
2832         {
2833           as_bad ("expression too complex");
2834           offset_expr.X_op = O_constant;
2835         }
2836
2837       /* A constant expression in PIC code can be handled just as it
2838          is in non PIC code.  */
2839       if (mips_pic == NO_PIC
2840           || offset_expr.X_op == O_constant)
2841         {
2842           /* If this is a reference to a GP relative symbol, and there
2843              is no base register, we want
2844                <op>     $treg,<sym>($gp)        (BFD_RELOC_MIPS_GPREL)
2845              Otherwise, if there is no base register, we want
2846                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
2847                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
2848              If we have a constant, we need two instructions anyhow,
2849              so we always use the latter form.
2850
2851              If we have a base register, and this is a reference to a
2852              GP relative symbol, we want
2853                addu     $tempreg,$breg,$gp
2854                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GPREL)
2855              Otherwise we want
2856                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
2857                addu     $tempreg,$tempreg,$breg
2858                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
2859              With a constant we always use the latter case.  */
2860           if (breg == 0)
2861             {
2862               if (offset_expr.X_add_number != 0)
2863                 p = NULL;
2864               else
2865                 {
2866                   frag_grow (20);
2867                   macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
2868                                treg, (int) BFD_RELOC_MIPS_GPREL, GP);
2869                   p = frag_var (rs_machine_dependent, 8, 0,
2870                                 RELAX_ENCODE (4, 8, 0, 4, 0,
2871                                               (mips_warn_about_macros
2872                                                || (used_at && mips_noat))),
2873                                 offset_expr.X_add_symbol, (long) 0,
2874                                 (char *) NULL);
2875                   used_at = 0;
2876                 }
2877               macro_build_lui (p, &icnt, &offset_expr, tempreg);
2878               if (p != NULL)
2879                 p += 4;
2880               macro_build (p, &icnt, &offset_expr, s, fmt, treg,
2881                            (int) BFD_RELOC_LO16, tempreg);
2882             }
2883           else
2884             {
2885               if (offset_expr.X_add_number != 0)
2886                 p = NULL;
2887               else
2888                 {
2889                   frag_grow (28);
2890                   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
2891                                mips_isa < 3 ? "addu" : "daddu",
2892                                "d,v,t", tempreg, breg, GP);
2893                   macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
2894                                treg, (int) BFD_RELOC_MIPS_GPREL, tempreg);
2895                   p = frag_var (rs_machine_dependent, 12, 0,
2896                                 RELAX_ENCODE (8, 12, 0, 8, 0, 0),
2897                                 offset_expr.X_add_symbol, (long) 0,
2898                                 (char *) NULL);
2899                 }
2900               macro_build_lui (p, &icnt, &offset_expr, tempreg);
2901               if (p != NULL)
2902                 p += 4;
2903               macro_build (p, &icnt, (expressionS *) NULL,
2904                            mips_isa < 3 ? "addu" : "daddu",
2905                            "d,v,t", tempreg, tempreg, breg);
2906               if (p != NULL)
2907                 p += 4;
2908               macro_build (p, &icnt, &offset_expr, s, fmt, treg,
2909                            (int) BFD_RELOC_LO16, tempreg);
2910             }
2911         }
2912       else if (mips_pic == SVR4_PIC)
2913         {
2914           /* If this is a reference to an external symbol, we want
2915                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
2916                nop
2917                <op>     $treg,0($tempreg)
2918              Otherwise we want
2919                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
2920                nop
2921                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
2922                <op>     $treg,0($tempreg)
2923              If there is a base register, we add it to $tempreg before
2924              the <op>.  If there is a constant, we stick it in the
2925              <op> instruction.  We don't handle constants larger than
2926              16 bits, because we have no way to load the upper 16 bits
2927              (actually, we could handle them for the subset of cases
2928              in which we are not using $at).  */
2929           assert (offset_expr.X_op == O_symbol);
2930           expr1.X_add_number = offset_expr.X_add_number;
2931           offset_expr.X_add_number = 0;
2932           if (expr1.X_add_number < -0x8000
2933               || expr1.X_add_number >= 0x8000)
2934             as_bad ("PIC code offset overflow (max 16 signed bits)");
2935           frag_grow (20);
2936           macro_build ((char *) NULL, &icnt, &offset_expr,
2937                        mips_isa < 3 ? "lw" : "ld",
2938                        "t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT16, GP);
2939           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
2940           p = frag_var (rs_machine_dependent, 4, 0, 
2941                         RELAX_ENCODE (0, 4, -8, 0, 0, 0),
2942                         offset_expr.X_add_symbol, (long) 0,
2943                         (char *) NULL);
2944           macro_build (p, &icnt, &offset_expr,
2945                        mips_isa < 3 ? "addiu" : "daddiu",
2946                        "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
2947           if (breg != 0)
2948             macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
2949                          mips_isa < 3 ? "addu" : "daddu",
2950                          "d,v,t", tempreg, tempreg, breg);
2951           macro_build ((char *) NULL, &icnt, &expr1, s, fmt, treg,
2952                        (int) BFD_RELOC_LO16, tempreg);
2953         }
2954       else if (mips_pic == EMBEDDED_PIC)
2955         {
2956           /* If there is no base register, we want
2957                <op>     $treg,<sym>($gp)        (BFD_RELOC_MIPS_GPREL)
2958              If there is a base register, we want
2959                addu     $tempreg,$breg,$gp
2960                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GPREL)
2961              */
2962           assert (offset_expr.X_op == O_symbol);
2963           if (breg == 0)
2964             {
2965               macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
2966                            treg, (int) BFD_RELOC_MIPS_GPREL, GP);
2967               used_at = 0;
2968             }
2969           else
2970             {
2971               macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
2972                            mips_isa < 3 ? "addu" : "daddu",
2973                            "d,v,t", tempreg, breg, GP);
2974               macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
2975                            treg, (int) BFD_RELOC_MIPS_GPREL, tempreg);
2976             }
2977         }
2978       else
2979         abort ();
2980
2981       if (! used_at)
2982         return;
2983
2984       break;
2985
2986     case M_LI:
2987     case M_LI_S:
2988       load_register (&icnt, treg, &imm_expr);
2989       return;
2990
2991     case M_LI_SS:
2992       if (mips_pic == NO_PIC)
2993         {
2994           assert (offset_expr.X_op == O_symbol
2995                   && strcmp (segment_name (S_GET_SEGMENT
2996                                            (offset_expr.X_add_symbol)),
2997                              ".lit4") == 0
2998                   && offset_expr.X_add_number == 0);
2999           macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
3000                        treg, (int) BFD_RELOC_MIPS_LITERAL, GP);
3001           return;
3002         }
3003       else if (mips_pic == SVR4_PIC
3004                || mips_pic == EMBEDDED_PIC)
3005         {
3006           assert (imm_expr.X_op == O_constant);
3007           load_register (&icnt, AT, &imm_expr);
3008           macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
3009                        "mtc1", "t,G", AT, treg);
3010           break;
3011         }
3012       else
3013         {
3014           abort ();
3015           return;
3016         }
3017
3018     case M_LI_D:
3019       /* We know that sym is in the .rdata section.  First we get the
3020          upper 16 bits of the address.  */
3021       if (mips_pic == NO_PIC)
3022         {
3023           /* FIXME: This won't work for a 64 bit address.  */
3024           macro_build_lui ((char *) NULL, &icnt, &offset_expr, AT);
3025         }
3026       else if (mips_pic == SVR4_PIC)
3027         {
3028           macro_build ((char *) NULL, &icnt, &offset_expr,
3029                        mips_isa < 3 ? "lw" : "ld",
3030                        "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16, GP);
3031         }
3032       else if (mips_pic == EMBEDDED_PIC)
3033         {
3034           /* For embedded PIC we pick up the entire address off $gp in
3035              a single instruction.  */
3036           macro_build ((char *) NULL, &icnt, &offset_expr,
3037                        mips_isa < 3 ? "addiu" : "daddiu",
3038                        "t,r,j", AT, GP, (int) BFD_RELOC_MIPS_GPREL);
3039           offset_expr.X_op = O_constant;
3040           offset_expr.X_add_number = 0;
3041         }
3042       else
3043         abort ();
3044         
3045       /* Now we load the register(s).  */
3046       if (mips_isa >= 3)
3047         macro_build ((char *) NULL, &icnt, &offset_expr, "ld", "t,o(b)",
3048                      treg, (int) BFD_RELOC_LO16, AT);
3049       else
3050         {
3051           macro_build ((char *) NULL, &icnt, &offset_expr, "lw", "t,o(b)",
3052                        treg, (int) BFD_RELOC_LO16, AT);
3053           if (treg != 31)
3054             {
3055               /* FIXME: How in the world do we deal with the possible
3056                  overflow here?  */
3057               offset_expr.X_add_number += 4;
3058               macro_build ((char *) NULL, &icnt, &offset_expr, "lw", "t,o(b)",
3059                            treg + 1, (int) BFD_RELOC_LO16, AT);
3060             }
3061         }
3062
3063       /* To avoid confusion in tc_gen_reloc, we must ensure that this
3064          does not become a variant frag.  */
3065       frag_wane (frag_now);
3066       frag_new (0);
3067
3068       break;
3069
3070     case M_LI_DD:
3071       if (mips_pic == NO_PIC
3072           || mips_pic == EMBEDDED_PIC)
3073         {
3074           /* Load a floating point number from the .lit8 section.  */
3075           assert (offset_expr.X_op == O_symbol
3076                   && strcmp (segment_name (S_GET_SEGMENT
3077                                            (offset_expr.X_add_symbol)),
3078                              ".lit8") == 0
3079                   && offset_expr.X_add_number == 0);
3080           if (mips_isa >= 2)
3081             {
3082               macro_build ((char *) NULL, &icnt, &offset_expr, "ldc1",
3083                            "T,o(b)", treg, (int) BFD_RELOC_MIPS_LITERAL, GP);
3084               return;
3085             }
3086           breg = GP;
3087           r = BFD_RELOC_MIPS_LITERAL;
3088           goto dob;
3089         }
3090       else if (mips_pic == SVR4_PIC)
3091         {
3092           /* Load the double from the .rdata section.  */
3093           macro_build ((char *) NULL, &icnt, &offset_expr,
3094                        mips_isa < 3 ? "lw" : "ld",
3095                        "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16, GP);
3096           if (mips_isa >= 2)
3097             {
3098               macro_build ((char *) NULL, &icnt, &offset_expr, "ldc1",
3099                            "T,o(b)", treg, (int) BFD_RELOC_LO16, GP);
3100               break;
3101             }
3102           breg = AT;
3103           r = BFD_RELOC_LO16;
3104           goto dob;
3105         }
3106       else
3107         abort ();
3108
3109     case M_L_DOB:
3110       /* Even on a big endian machine $fn comes before $fn+1.  We have
3111          to adjust when loading from memory.  */
3112       r = BFD_RELOC_LO16;
3113     dob:
3114       assert (mips_isa < 2);
3115       macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
3116                    byte_order == LITTLE_ENDIAN ? treg : treg + 1,
3117                    (int) r, breg);
3118       /* FIXME: A possible overflow which I don't know how to deal
3119          with.  */
3120       offset_expr.X_add_number += 4;
3121       macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
3122                    byte_order == LITTLE_ENDIAN ? treg + 1 : treg,
3123                    (int) r, breg);
3124
3125       /* To avoid confusion in tc_gen_reloc, we must ensure that this
3126          does not become a variant frag.  */
3127       frag_wane (frag_now);
3128       frag_new (0);
3129
3130       if (breg != AT)
3131         return;
3132       break;
3133
3134     case M_L_DAB:
3135       /*
3136        * The MIPS assembler seems to check for X_add_number not
3137        * being double aligned and generating:
3138        *        lui     at,%hi(foo+1)
3139        *        addu    at,at,v1
3140        *        addiu   at,at,%lo(foo+1)
3141        *        lwc1    f2,0(at)
3142        *        lwc1    f3,4(at)
3143        * But, the resulting address is the same after relocation so why
3144        * generate the extra instruction?
3145        */
3146       coproc = 1;
3147       if (mips_isa >= 2)
3148         {
3149           s = "ldc1";
3150           goto ld;
3151         }
3152
3153       s = "lwc1";
3154       fmt = "T,o(b)";
3155       goto ldd_std;
3156
3157     case M_S_DAB:
3158       if (mips_isa >= 2)
3159         {
3160           s = "sdc1";
3161           goto st;
3162         }
3163
3164       s = "swc1";
3165       fmt = "T,o(b)";
3166       coproc = 1;
3167       goto ldd_std;
3168
3169     case M_LD_AB:
3170       if (mips_isa >= 3)
3171         {
3172           s = "ld";
3173           goto ld;
3174         }
3175
3176       s = "lw";
3177       fmt = "t,o(b)";
3178       goto ldd_std;
3179
3180     case M_SD_AB:
3181       if (mips_isa >= 3)
3182         {
3183           s = "sd";
3184           goto st;
3185         }
3186
3187       s = "sw";
3188       fmt = "t,o(b)";
3189
3190     ldd_std:
3191       if (offset_expr.X_op != O_symbol
3192           && offset_expr.X_op != O_constant)
3193         {
3194           as_bad ("expression too complex");
3195           offset_expr.X_op = O_constant;
3196         }
3197
3198       /* Even on a big endian machine $fn comes before $fn+1.  We have
3199          to adjust when loading from memory.  We set coproc if we must
3200          load $fn+1 first.  */
3201       if (byte_order == LITTLE_ENDIAN)
3202         coproc = 0;
3203
3204       if (mips_pic == NO_PIC
3205           || offset_expr.X_op == O_constant)
3206         {
3207           /* If this is a reference to a GP relative symbol, we want
3208                <op>     $treg,<sym>($gp)        (BFD_RELOC_MIPS_GPREL)
3209                <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_MIPS_GPREL)
3210              If we have a base register, we use this
3211                addu     $at,$breg,$gp
3212                <op>     $treg,<sym>($at)        (BFD_RELOC_MIPS_GPREL)
3213                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_MIPS_GPREL)
3214              If this is not a GP relative symbol, we want
3215                lui      $at,<sym>               (BFD_RELOC_HI16_S)
3216                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
3217                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
3218              If there is a base register, we add it to $at after the
3219              lui instruction.  If there is a constant, we always use
3220              the last case.  */
3221           if (offset_expr.X_add_number != 0)
3222             {
3223               p = NULL;
3224               used_at = 1;
3225             }
3226           else
3227             {
3228               int off;
3229
3230               if (breg == 0)
3231                 {
3232                   frag_grow (28);
3233                   tempreg = GP;
3234                   off = 0;
3235                   used_at = 0;
3236                 }
3237               else
3238                 {
3239                   frag_grow (36);
3240                   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
3241                                mips_isa < 3 ? "addu" : "daddu",
3242                                "d,v,t", AT, breg, GP);
3243                   tempreg = AT;
3244                   off = 4;
3245                   used_at = 1;
3246                 }
3247
3248               macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
3249                            coproc ? treg + 1 : treg,
3250                            (int) BFD_RELOC_MIPS_GPREL, tempreg);
3251               offset_expr.X_add_number += 4;
3252               macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
3253                            coproc ? treg : treg + 1,
3254                            (int) BFD_RELOC_MIPS_GPREL, tempreg);
3255               p = frag_var (rs_machine_dependent, 12 + off, 0,
3256                             RELAX_ENCODE (8 + off, 12 + off, 0, 4 + off, 1,
3257                                           used_at && mips_noat),
3258                             offset_expr.X_add_symbol, (long) 0,
3259                             (char *) NULL);
3260
3261               /* We just generated two relocs.  When tc_gen_reloc
3262                  handles this case, it will skip the first reloc and
3263                  handle the second.  The second reloc already has an
3264                  extra addend of 4, which we added above.  We must
3265                  subtract it out, and then subtract another 4 to make
3266                  the first reloc come out right.  The second reloc
3267                  will come out right because we are going to add 4 to
3268                  offset_expr when we build its instruction below.  */
3269               offset_expr.X_add_number -= 8;
3270               offset_expr.X_op = O_constant;
3271             }
3272           macro_build_lui (p, &icnt, &offset_expr, AT);
3273           if (p != NULL)
3274             p += 4;
3275           if (breg != 0)
3276             {
3277               macro_build (p, &icnt, (expressionS *) NULL,
3278                            mips_isa < 3 ? "addu" : "daddu",
3279                            "d,v,t", AT, breg, AT);
3280               if (p != NULL)
3281                 p += 4;
3282             }
3283           macro_build (p, &icnt, &offset_expr, s, fmt,
3284                        coproc ? treg + 1 : treg,
3285                        (int) BFD_RELOC_LO16, AT);
3286           if (p != NULL)
3287             p += 4;
3288           /* FIXME: How do we handle overflow here?  */
3289           offset_expr.X_add_number += 4;
3290           macro_build (p, &icnt, &offset_expr, s, fmt,
3291                        coproc ? treg : treg + 1,
3292                        (int) BFD_RELOC_LO16, AT);
3293         }         
3294       else if (mips_pic == SVR4_PIC)
3295         {
3296           int off;
3297
3298           /* If this is a reference to an external symbol, we want
3299                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
3300                nop
3301                <op>     $treg,0($at)
3302                <op>     $treg+1,4($at)
3303              Otherwise we want
3304                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
3305                nop
3306                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
3307                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
3308              If there is a base register we add it to $at before the
3309              lwc1 instructions.  If there is a constant we include it
3310              in the lwc1 instructions.  */
3311           used_at = 1;
3312           expr1.X_add_number = offset_expr.X_add_number;
3313           offset_expr.X_add_number = 0;
3314           if (expr1.X_add_number < -0x8000
3315               || expr1.X_add_number >= 0x8000 - 4)
3316             as_bad ("PIC code offset overflow (max 16 signed bits)");
3317           if (breg == 0)
3318             off = 0;
3319           else
3320             off = 4;
3321           frag_grow (24 + off);
3322           macro_build ((char *) NULL, &icnt, &offset_expr,
3323                        mips_isa < 3 ? "lw" : "ld",
3324                        "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16, GP);
3325           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
3326           if (breg != 0)
3327             macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
3328                          mips_isa < 3 ? "addu" : "daddu",
3329                          "d,v,t", AT, breg, AT);
3330           macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
3331                        coproc ? treg + 1 : treg,
3332                        (int) BFD_RELOC_LO16, AT);
3333           expr1.X_add_number += 4;
3334           macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
3335                        coproc ? treg : treg + 1,
3336                        (int) BFD_RELOC_LO16, AT);
3337           (void) frag_var (rs_machine_dependent, 0, 0,
3338                            RELAX_ENCODE (0, 0, -16 - off, -8, 1, 0),
3339                            offset_expr.X_add_symbol, (long) 0,
3340                            (char *) NULL);
3341         }
3342       else if (mips_pic == EMBEDDED_PIC)
3343         {
3344           /* If there is no base register, we use
3345                <op>     $treg,<sym>($gp)        (BFD_RELOC_MIPS_GPREL)
3346                <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_MIPS_GPREL)
3347              If we have a base register, we use
3348                addu     $at,$breg,$gp
3349                <op>     $treg,<sym>($at)        (BFD_RELOC_MIPS_GPREL)
3350                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_MIPS_GPREL)
3351              */
3352           if (breg == 0)
3353             {
3354               tempreg = GP;
3355               used_at = 0;
3356             }
3357           else
3358             {
3359               macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
3360                            mips_isa < 3 ? "addu" : "daddu",
3361                            "d,v,t", AT, breg, GP);
3362               tempreg = AT;
3363               used_at = 1;
3364             }
3365
3366           macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
3367                        coproc ? treg + 1 : treg,
3368                        (int) BFD_RELOC_MIPS_GPREL, tempreg);
3369           offset_expr.X_add_number += 4;
3370           macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
3371                        coproc ? treg : treg + 1,
3372                        (int) BFD_RELOC_MIPS_GPREL, tempreg);
3373         }
3374       else
3375         abort ();
3376
3377       if (! used_at)
3378         return;
3379
3380       break;
3381
3382     case M_LD_OB:
3383       s = "lw";
3384       goto sd_ob;
3385     case M_SD_OB:
3386       s = "sw";
3387     sd_ob:
3388       assert (mips_isa < 3);
3389       macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg,
3390                    (int) BFD_RELOC_LO16, breg);
3391       offset_expr.X_add_number += 4;
3392       macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg + 1,
3393                    (int) BFD_RELOC_LO16, breg);
3394       return;
3395 #ifdef LOSING_COMPILER
3396     default:
3397       macro2 (ip);
3398       return;
3399     }
3400   if (mips_noat)
3401     as_warn ("Macro used $at after \".set noat\"");
3402 }
3403           
3404 static void
3405 macro2 (ip)
3406      struct mips_cl_insn *ip;
3407 {
3408   register int treg, sreg, dreg, breg;
3409   int tempreg;
3410   int mask;
3411   int icnt = 0;
3412   int used_at;
3413   expressionS expr1;
3414   const char *s;
3415   const char *s2;
3416   const char *fmt;
3417   int likely = 0;
3418   int dbl = 0;
3419   int coproc = 0;
3420   offsetT maxnum;
3421   bfd_reloc_code_real_type r;
3422   char *p;
3423           
3424   treg = (ip->insn_opcode >> 16) & 0x1f;
3425   dreg = (ip->insn_opcode >> 11) & 0x1f;
3426   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
3427   mask = ip->insn_mo->mask;
3428           
3429   expr1.X_op = O_constant;
3430   expr1.X_op_symbol = NULL;
3431   expr1.X_add_symbol = NULL;
3432   expr1.X_add_number = 1;
3433           
3434   switch (mask)
3435     {
3436 #endif /* LOSING_COMPILER */
3437
3438     case M_DMUL:
3439       dbl = 1;
3440     case M_MUL:
3441       macro_build ((char *) NULL, &icnt, NULL,
3442                    dbl ? "dmultu" : "multu",
3443                    "s,t", sreg, treg);
3444       macro_build ((char *) NULL, &icnt, NULL, "mflo", "d", dreg);
3445       return;
3446
3447     case M_DMUL_I:
3448       dbl = 1;
3449     case M_MUL_I:
3450       /* The MIPS assembler some times generates shifts and adds.  I'm
3451          not trying to be that fancy. GCC should do this for us
3452          anyway.  */
3453       load_register (&icnt, AT, &imm_expr);
3454       macro_build ((char *) NULL, &icnt, NULL,
3455                    dbl ? "dmult" : "mult",
3456                    "s,t", sreg, AT);
3457       macro_build ((char *) NULL, &icnt, NULL, "mflo", "d", dreg);
3458       break;
3459
3460     case M_DMULO:
3461       dbl = 1;
3462     case M_MULO:
3463       mips_emit_delays ();
3464       ++mips_noreorder;
3465       mips_any_noreorder = 1;
3466       macro_build ((char *) NULL, &icnt, NULL,
3467                    dbl ? "dmult" : "mult",
3468                    "s,t", sreg, treg);
3469       macro_build ((char *) NULL, &icnt, NULL, "mflo", "d", dreg);
3470       macro_build ((char *) NULL, &icnt, NULL,
3471                    dbl ? "dsra32" : "sra",
3472                    "d,w,<", dreg, dreg, 31);
3473       macro_build ((char *) NULL, &icnt, NULL, "mfhi", "d", AT);
3474       if (mips_trap)
3475         macro_build ((char *) NULL, &icnt, NULL, "tne", "s,t", dreg, AT);
3476       else
3477         {
3478           expr1.X_add_number = 8;
3479           macro_build ((char *) NULL, &icnt, &expr1, "beq", "s,t,p", dreg, AT);
3480           macro_build ((char *) NULL, &icnt, NULL, "nop", "", 0);
3481           macro_build ((char *) NULL, &icnt, NULL, "break", "c", 6);
3482         }
3483       --mips_noreorder;
3484       macro_build ((char *) NULL, &icnt, NULL, "mflo", "d", dreg);
3485       break;
3486
3487     case M_DMULOU:
3488       dbl = 1;
3489     case M_MULOU:
3490       mips_emit_delays ();
3491       ++mips_noreorder;
3492       mips_any_noreorder = 1;
3493       macro_build ((char *) NULL, &icnt, NULL,
3494                    dbl ? "dmultu" : "multu",
3495                    "s,t", sreg, treg);
3496       macro_build ((char *) NULL, &icnt, NULL, "mfhi", "d", AT);
3497       macro_build ((char *) NULL, &icnt, NULL, "mflo", "d", dreg);
3498       if (mips_trap)
3499         macro_build ((char *) NULL, &icnt, NULL, "tne", "s,t", AT, 0);
3500       else
3501         {
3502           expr1.X_add_number = 8;
3503           macro_build ((char *) NULL, &icnt, &expr1, "beq", "s,t,p", AT, 0);
3504           macro_build ((char *) NULL, &icnt, NULL, "nop", "", 0);
3505           macro_build ((char *) NULL, &icnt, NULL, "break", "c", 6);
3506         }
3507       --mips_noreorder;
3508       break;
3509
3510     case M_ROL:
3511       macro_build ((char *) NULL, &icnt, NULL, "subu", "d,v,t", AT, 0, treg);
3512       macro_build ((char *) NULL, &icnt, NULL, "srlv", "d,t,s", AT, sreg, AT);
3513       macro_build ((char *) NULL, &icnt, NULL, "sllv", "d,t,s", dreg, sreg,
3514                    treg);
3515       macro_build ((char *) NULL, &icnt, NULL, "or", "d,v,t", dreg, dreg, AT);
3516       break;
3517
3518     case M_ROL_I:
3519       macro_build ((char *) NULL, &icnt, NULL, "sll", "d,w,<", AT, sreg,
3520                    imm_expr.X_add_number & 0x1f);
3521       macro_build ((char *) NULL, &icnt, NULL, "srl", "d,w,<", dreg, sreg,
3522                    (0 - imm_expr.X_add_number) & 0x1f);
3523       macro_build ((char *) NULL, &icnt, NULL, "or", "d,v,t", dreg, dreg, AT);
3524       break;
3525
3526     case M_ROR:
3527       macro_build ((char *) NULL, &icnt, NULL, "subu", "d,v,t", AT, 0, treg);
3528       macro_build ((char *) NULL, &icnt, NULL, "sllv", "d,t,s", AT, sreg, AT);
3529       macro_build ((char *) NULL, &icnt, NULL, "srlv", "d,t,s", dreg, sreg,
3530                    treg);
3531       macro_build ((char *) NULL, &icnt, NULL, "or", "d,v,t", dreg, dreg, AT);
3532       break;
3533
3534     case M_ROR_I:
3535       macro_build ((char *) NULL, &icnt, NULL, "srl", "d,w,<", AT, sreg,
3536                    imm_expr.X_add_number & 0x1f);
3537       macro_build ((char *) NULL, &icnt, NULL, "sll", "d,w,<", dreg, sreg,
3538                    (0 - imm_expr.X_add_number) & 0x1f);
3539       macro_build ((char *) NULL, &icnt, NULL, "or", "d,v,t", dreg, dreg, AT);
3540       break;
3541
3542     case M_S_DOB:
3543       assert (mips_isa < 2);
3544       /* Even on a big endian machine $fn comes before $fn+1.  We have
3545          to adjust when storing to memory.  */
3546       macro_build ((char *) NULL, &icnt, &offset_expr, "swc1", "T,o(b)",
3547                    byte_order == LITTLE_ENDIAN ? treg : treg + 1,
3548                    (int) BFD_RELOC_LO16, breg);
3549       offset_expr.X_add_number += 4;
3550       macro_build ((char *) NULL, &icnt, &offset_expr, "swc1", "T,o(b)",
3551                    byte_order == LITTLE_ENDIAN ? treg + 1 : treg,
3552                    (int) BFD_RELOC_LO16, breg);
3553       return;
3554
3555     case M_SEQ:
3556       if (sreg == 0)
3557         macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
3558                      treg, (int) BFD_RELOC_LO16);
3559       else if (treg == 0)
3560         macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
3561                      sreg, (int) BFD_RELOC_LO16);
3562       else
3563         {
3564           macro_build ((char *) NULL, &icnt, NULL, "xor", "d,v,t", dreg,
3565                        sreg, treg);
3566           macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
3567                        dreg, (int) BFD_RELOC_LO16);
3568         }
3569       return;
3570
3571     case M_SEQ_I:
3572       if (imm_expr.X_add_number == 0)
3573         {
3574           macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
3575                        sreg, (int) BFD_RELOC_LO16);
3576           return;
3577         }
3578       if (sreg == 0)
3579         {
3580           as_warn ("Instruction %s: result is always false",
3581                    ip->insn_mo->name);
3582           macro_build ((char *) NULL, &icnt, NULL, "move", "d,s", dreg, 0);
3583           return;
3584         }
3585       if (imm_expr.X_add_number >= 0 && imm_expr.X_add_number < 0x10000)
3586         {
3587           macro_build ((char *) NULL, &icnt, &imm_expr, "xori", "t,r,i", dreg,
3588                        sreg, (int) BFD_RELOC_LO16);
3589           used_at = 0;
3590         }
3591       else if (imm_expr.X_add_number > -0x8000 && imm_expr.X_add_number < 0)
3592         {
3593           imm_expr.X_add_number = -imm_expr.X_add_number;
3594           macro_build ((char *) NULL, &icnt, &imm_expr,
3595                        mips_isa < 3 ? "addiu" : "daddiu",
3596                        "t,r,j", dreg, sreg,
3597                        (int) BFD_RELOC_LO16);
3598           used_at = 0;
3599         }
3600       else
3601         {
3602           load_register (&icnt, AT, &imm_expr);
3603           macro_build ((char *) NULL, &icnt, NULL, "xor", "d,v,t", dreg,
3604                        sreg, AT);
3605           used_at = 1;
3606         }
3607       macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg, dreg,
3608                    (int) BFD_RELOC_LO16);
3609       if (used_at)
3610         break;
3611       return;
3612
3613     case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
3614       s = "slt";
3615       goto sge;
3616     case M_SGEU:
3617       s = "sltu";
3618     sge:
3619       macro_build ((char *) NULL, &icnt, NULL, s, "d,v,t", dreg, sreg, treg);
3620       macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
3621                    (int) BFD_RELOC_LO16);
3622       return;
3623
3624     case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
3625     case M_SGEU_I:
3626       if (imm_expr.X_add_number >= -0x8000 && imm_expr.X_add_number < 0x8000)
3627         {
3628           macro_build ((char *) NULL, &icnt, &expr1,
3629                        mask == M_SGE_I ? "slti" : "sltiu",
3630                        "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
3631           used_at = 0;
3632         }
3633       else
3634         {
3635           load_register (&icnt, AT, &imm_expr);
3636           macro_build ((char *) NULL, &icnt, NULL,
3637                        mask == M_SGE_I ? "slt" : "sltu",
3638                        "d,v,t", dreg, sreg, AT);
3639           used_at = 1;
3640         }
3641       macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
3642                    (int) BFD_RELOC_LO16);
3643       if (used_at)
3644         break;
3645       return;
3646
3647     case M_SGT:         /* sreg > treg  <==>  treg < sreg */
3648       s = "slt";
3649       goto sgt;
3650     case M_SGTU:
3651       s = "sltu";
3652     sgt:
3653       macro_build ((char *) NULL, &icnt, NULL, s, "d,v,t", dreg, treg, sreg);
3654       return;
3655
3656     case M_SGT_I:               /* sreg > I  <==>  I < sreg */
3657       s = "slt";
3658       goto sgti;
3659     case M_SGTU_I:
3660       s = "sltu";
3661     sgti:
3662       load_register (&icnt, AT, &imm_expr);
3663       macro_build ((char *) NULL, &icnt, NULL, s, "d,v,t", dreg, AT, sreg);
3664       break;
3665
3666     case M_SLE:         /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
3667       s = "slt";
3668       goto sle;
3669     case M_SLEU:
3670       s = "sltu";
3671     sle:
3672       macro_build ((char *) NULL, &icnt, NULL, s, "d,v,t", dreg, treg, sreg);
3673       macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
3674                    (int) BFD_RELOC_LO16);
3675       return;
3676
3677     case M_SLE_I:               /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
3678       s = "slt";
3679       goto slei;
3680     case M_SLEU_I:
3681       s = "sltu";
3682     slei:
3683       load_register (&icnt, AT, &imm_expr);
3684       macro_build ((char *) NULL, &icnt, NULL, s, "d,v,t", dreg, AT, sreg);
3685       macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
3686                    (int) BFD_RELOC_LO16);
3687       break;
3688
3689     case M_SLT_I:
3690       if (imm_expr.X_add_number >= -0x8000 && imm_expr.X_add_number < 0x8000)
3691         {
3692           macro_build ((char *) NULL, &icnt, &imm_expr, "slti", "t,r,j",
3693                        dreg, sreg, (int) BFD_RELOC_LO16);
3694           return;
3695         }
3696       load_register (&icnt, AT, &imm_expr);
3697       macro_build ((char *) NULL, &icnt, NULL, "slt", "d,v,t", dreg, sreg, AT);
3698       break;
3699
3700     case M_SLTU_I:
3701       if (imm_expr.X_add_number >= -0x8000 && imm_expr.X_add_number < 0x8000)
3702         {
3703           macro_build ((char *) NULL, &icnt, &imm_expr, "sltiu", "t,r,j",
3704                        dreg, sreg, (int) BFD_RELOC_LO16);
3705           return;
3706         }
3707       load_register (&icnt, AT, &imm_expr);
3708       macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", dreg, sreg,
3709                    AT);
3710       break;
3711
3712     case M_SNE:
3713       if (sreg == 0)
3714         macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", dreg, 0,
3715                      treg);
3716       else if (treg == 0)
3717         macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", dreg, 0,
3718                      sreg);
3719       else
3720         {
3721           macro_build ((char *) NULL, &icnt, NULL, "xor", "d,v,t", dreg,
3722                        sreg, treg);
3723           macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", dreg, 0,
3724                        dreg);
3725         }
3726       return;
3727
3728     case M_SNE_I:
3729       if (imm_expr.X_add_number == 0)
3730         {
3731           macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", dreg, 0,
3732                        sreg);
3733           return;
3734         }
3735       if (sreg == 0)
3736         {
3737           as_warn ("Instruction %s: result is always true",
3738                    ip->insn_mo->name);
3739           macro_build ((char *) NULL, &icnt, &expr1,
3740                        mips_isa < 3 ? "addiu" : "daddiu",
3741                        "t,r,j", dreg, 0, (int) BFD_RELOC_LO16);
3742           return;
3743         }
3744       if (imm_expr.X_add_number >= 0 && imm_expr.X_add_number < 0x10000)
3745         {
3746           macro_build ((char *) NULL, &icnt, &imm_expr, "xori", "t,r,i",
3747                        dreg, sreg, (int) BFD_RELOC_LO16);
3748           used_at = 0;
3749         }
3750       else if (imm_expr.X_add_number > -0x8000 && imm_expr.X_add_number < 0)
3751         {
3752           imm_expr.X_add_number = -imm_expr.X_add_number;
3753           macro_build ((char *) NULL, &icnt, &imm_expr,
3754                        mips_isa < 3 ? "addiu" : "daddiu",
3755                        "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
3756           used_at = 0;
3757         }
3758       else
3759         {
3760           load_register (&icnt, AT, &imm_expr);
3761           macro_build ((char *) NULL, &icnt, NULL, "xor", "d,v,t", dreg,
3762                        sreg, AT);
3763           used_at = 1;
3764         }
3765       macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", dreg, 0, dreg);
3766       if (used_at)
3767         break;
3768       return;
3769
3770     case M_DSUB_I:
3771       dbl = 1;
3772     case M_SUB_I:
3773       if (imm_expr.X_add_number > -0x8000 && imm_expr.X_add_number <= 0x8000)
3774         {
3775           imm_expr.X_add_number = -imm_expr.X_add_number;
3776           macro_build ((char *) NULL, &icnt, &imm_expr,
3777                        dbl ? "daddi" : "addi",
3778                        "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
3779           return;
3780         }
3781       load_register (&icnt, AT, &imm_expr);
3782       macro_build ((char *) NULL, &icnt, NULL,
3783                    dbl ? "dsub" : "sub",
3784                    "d,v,t", dreg, sreg, AT);
3785       break;
3786
3787     case M_DSUBU_I:
3788       dbl = 1;
3789     case M_SUBU_I:
3790       if (imm_expr.X_add_number > -0x8000 && imm_expr.X_add_number <= 0x8000)
3791         {
3792           imm_expr.X_add_number = -imm_expr.X_add_number;
3793           macro_build ((char *) NULL, &icnt, &imm_expr,
3794                        dbl ? "daddiu" : "addiu",
3795                        "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
3796           return;
3797         }
3798       load_register (&icnt, AT, &imm_expr);
3799       macro_build ((char *) NULL, &icnt, NULL,
3800                    dbl ? "dsubu" : "subu",
3801                    "d,v,t", dreg, sreg, AT);
3802       break;
3803
3804     case M_TEQ_I:
3805       s = "teq";
3806       goto trap;
3807     case M_TGE_I:
3808       s = "tge";
3809       goto trap;
3810     case M_TGEU_I:
3811       s = "tgeu";
3812       goto trap;
3813     case M_TLT_I:
3814       s = "tlt";
3815       goto trap;
3816     case M_TLTU_I:
3817       s = "tltu";
3818       goto trap;
3819     case M_TNE_I:
3820       s = "tne";
3821     trap:
3822       load_register (&icnt, AT, &imm_expr);
3823       macro_build ((char *) NULL, &icnt, NULL, s, "s,t", sreg, AT);
3824       break;
3825
3826     case M_TRUNCWD:
3827     case M_TRUNCWS:
3828       assert (mips_isa < 2);
3829       sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
3830       dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
3831
3832       /*
3833        * Is the double cfc1 instruction a bug in the mips assembler;
3834        * or is there a reason for it?
3835        */
3836       mips_emit_delays ();
3837       ++mips_noreorder;
3838       mips_any_noreorder = 1;
3839       macro_build ((char *) NULL, &icnt, NULL, "cfc1", "t,G", treg, 31);
3840       macro_build ((char *) NULL, &icnt, NULL, "cfc1", "t,G", treg, 31);
3841       macro_build ((char *) NULL, &icnt, NULL, "nop", "");
3842       expr1.X_add_number = 3;
3843       macro_build ((char *) NULL, &icnt, &expr1, "ori", "t,r,i", AT, treg,
3844                    (int) BFD_RELOC_LO16);
3845       expr1.X_add_number = 2;
3846       macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", AT, AT,
3847                      (int) BFD_RELOC_LO16);
3848       macro_build ((char *) NULL, &icnt, NULL, "ctc1", "t,G", AT, 31);
3849       macro_build ((char *) NULL, &icnt, NULL, "nop", "");
3850       macro_build ((char *) NULL, &icnt, NULL,
3851               mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S", dreg, sreg);
3852       macro_build ((char *) NULL, &icnt, NULL, "ctc1", "t,G", treg, 31);
3853       macro_build ((char *) NULL, &icnt, NULL, "nop", "");
3854       --mips_noreorder;
3855       break;
3856
3857     case M_ULH:
3858       s = "lb";
3859       goto ulh;
3860     case M_ULHU:
3861       s = "lbu";
3862     ulh:
3863       if (offset_expr.X_add_number >= 0x7fff)
3864         as_bad ("operand overflow");
3865       /* avoid load delay */
3866       if (byte_order == LITTLE_ENDIAN)
3867         offset_expr.X_add_number += 1;
3868       macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg,
3869                    (int) BFD_RELOC_LO16, breg);
3870       if (byte_order == LITTLE_ENDIAN)
3871         offset_expr.X_add_number -= 1;
3872       else
3873         offset_expr.X_add_number += 1;
3874       macro_build ((char *) NULL, &icnt, &offset_expr, "lbu", "t,o(b)", AT,
3875                    (int) BFD_RELOC_LO16, breg);
3876       macro_build ((char *) NULL, &icnt, NULL, "sll", "d,w,<", treg, treg, 8);
3877       macro_build ((char *) NULL, &icnt, NULL, "or", "d,v,t", treg, treg, AT);
3878       break;
3879
3880     case M_ULW:
3881       if (offset_expr.X_add_number >= 0x7ffd)
3882         as_bad ("operand overflow");
3883       if (byte_order == LITTLE_ENDIAN)
3884         offset_expr.X_add_number += 3;
3885       macro_build ((char *) NULL, &icnt, &offset_expr, "lwl", "t,o(b)", treg,
3886                    (int) BFD_RELOC_LO16, breg);
3887       if (byte_order == LITTLE_ENDIAN)
3888         offset_expr.X_add_number -= 3;
3889       else
3890         offset_expr.X_add_number += 3;
3891       macro_build ((char *) NULL, &icnt, &offset_expr, "lwr", "t,o(b)", treg,
3892                    (int) BFD_RELOC_LO16, breg);
3893       return;
3894
3895     case M_ULH_A:
3896     case M_ULHU_A:
3897     case M_ULW_A:
3898       load_address (&icnt, AT, &offset_expr);
3899       if (mask == M_ULW_A)
3900         {
3901           if (byte_order == LITTLE_ENDIAN)
3902             expr1.X_add_number = 3;
3903           else
3904             expr1.X_add_number = 0;
3905           macro_build ((char *) NULL, &icnt, &expr1, "lwl", "t,o(b)", treg,
3906                        (int) BFD_RELOC_LO16, AT);
3907           if (byte_order == LITTLE_ENDIAN)
3908             expr1.X_add_number = 0;
3909           else
3910             expr1.X_add_number = 3;
3911           macro_build ((char *) NULL, &icnt, &expr1, "lwr", "t,o(b)", treg,
3912                        (int) BFD_RELOC_LO16, AT);
3913         }
3914       else
3915         {
3916           if (byte_order == BIG_ENDIAN)
3917             expr1.X_add_number = 0;
3918           macro_build ((char *) NULL, &icnt, &expr1,
3919                        mask == M_ULH_A ? "lb" : "lbu", "t,o(b)", treg,
3920                        (int) BFD_RELOC_LO16, AT);
3921           if (byte_order == BIG_ENDIAN)
3922             expr1.X_add_number = 1;
3923           else
3924             expr1.X_add_number = 0;
3925           macro_build ((char *) NULL, &icnt, &expr1, "lbu", "t,o(b)", AT,
3926                        (int) BFD_RELOC_LO16, AT);
3927           macro_build ((char *) NULL, &icnt, NULL, "sll", "d,w,<", treg,
3928                        treg, 8);
3929           macro_build ((char *) NULL, &icnt, NULL, "or", "d,v,t", treg,
3930                        treg, AT);
3931         }
3932       break;
3933
3934     case M_USH:
3935       if (offset_expr.X_add_number >= 0x7fff)
3936         as_bad ("operand overflow");
3937       if (byte_order == BIG_ENDIAN)
3938         offset_expr.X_add_number += 1;
3939       macro_build ((char *) NULL, &icnt, &offset_expr, "sb", "t,o(b)", treg,
3940                    (int) BFD_RELOC_LO16, breg);
3941       macro_build ((char *) NULL, &icnt, NULL, "srl", "d,w,<", AT, treg, 8);
3942       if (byte_order == BIG_ENDIAN)
3943         offset_expr.X_add_number -= 1;
3944       else
3945         offset_expr.X_add_number += 1;
3946       macro_build ((char *) NULL, &icnt, &offset_expr, "sb", "t,o(b)", AT,
3947                    (int) BFD_RELOC_LO16, breg);
3948       break;
3949
3950     case M_USW:
3951       if (offset_expr.X_add_number >= 0x7ffd)
3952         as_bad ("operand overflow");
3953       if (byte_order == LITTLE_ENDIAN)
3954         offset_expr.X_add_number += 3;
3955       macro_build ((char *) NULL, &icnt, &offset_expr, "swl", "t,o(b)", treg,
3956                    (int) BFD_RELOC_LO16, breg);
3957       if (byte_order == LITTLE_ENDIAN)
3958         offset_expr.X_add_number -= 3;
3959       else
3960         offset_expr.X_add_number += 3;
3961       macro_build ((char *) NULL, &icnt, &offset_expr, "swr", "t,o(b)", treg,
3962                    (int) BFD_RELOC_LO16, breg);
3963       return;
3964
3965     case M_USH_A:
3966     case M_USW_A:
3967       load_address (&icnt, AT, &offset_expr);
3968       if (mask == M_USW_A)
3969         {
3970           if (byte_order == LITTLE_ENDIAN)
3971             expr1.X_add_number = 3;
3972           else
3973             expr1.X_add_number = 0;
3974           macro_build ((char *) NULL, &icnt, &expr1, "swl", "t,o(b)", treg,
3975                        (int) BFD_RELOC_LO16, AT);
3976           if (byte_order == LITTLE_ENDIAN)
3977             expr1.X_add_number = 0;
3978           else
3979             expr1.X_add_number = 3;
3980           macro_build ((char *) NULL, &icnt, &expr1, "swr", "t,o(b)", treg,
3981                        (int) BFD_RELOC_LO16, AT);
3982         }
3983       else
3984         {
3985           if (byte_order == LITTLE_ENDIAN)
3986             expr1.X_add_number = 0;
3987           macro_build ((char *) NULL, &icnt, &expr1, "sb", "t,o(b)", treg,
3988                        (int) BFD_RELOC_LO16, AT);
3989           macro_build ((char *) NULL, &icnt, NULL, "srl", "d,w,<", treg,
3990                        treg, 8);
3991           if (byte_order == LITTLE_ENDIAN)
3992             expr1.X_add_number = 1;
3993           else
3994             expr1.X_add_number = 0;
3995           macro_build ((char *) NULL, &icnt, &expr1, "sb", "t,o(b)", treg,
3996                        (int) BFD_RELOC_LO16, AT);
3997           if (byte_order == LITTLE_ENDIAN)
3998             expr1.X_add_number = 0;
3999           else
4000             expr1.X_add_number = 1;
4001           macro_build ((char *) NULL, &icnt, &expr1, "lbu", "t,o(b)", AT,
4002                        (int) BFD_RELOC_LO16, AT);
4003           macro_build ((char *) NULL, &icnt, NULL, "sll", "d,w,<", treg,
4004                        treg, 8);
4005           macro_build ((char *) NULL, &icnt, NULL, "or", "d,v,t", treg,
4006                        treg, AT);
4007         }
4008       break;
4009
4010     default:
4011       as_bad ("Macro %s not implemented yet", ip->insn_mo->name);
4012       break;
4013     }
4014   if (mips_noat)
4015     as_warn ("Macro used $at after \".set noat\"");
4016 }
4017
4018
4019 /*
4020 This routine assembles an instruction into its binary format.  As a side
4021 effect it sets one of the global variables imm_reloc or offset_reloc to the
4022 type of relocation to do if one of the operands is an address expression.
4023 */
4024 static void
4025 mips_ip (str, ip)
4026      char *str;
4027      struct mips_cl_insn *ip;
4028 {
4029   char *s;
4030   const char *args;
4031   char c;
4032   struct mips_opcode *insn;
4033   char *argsStart;
4034   unsigned int regno;
4035   unsigned int lastregno = 0;
4036   char *s_reset;
4037
4038   insn_error = NULL;
4039
4040   for (s = str; islower (*s) || (*s >= '0' && *s <= '3') || *s == '.'; ++s)
4041     continue;
4042   switch (*s)
4043     {
4044     case '\0':
4045       break;
4046
4047     case ' ':
4048       *s++ = '\0';
4049       break;
4050
4051     default:
4052       as_warn ("Unknown opcode: `%s'", str);
4053       exit (1);
4054     }
4055   if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
4056     {
4057       as_warn ("`%s' not in hash table.", str);
4058       insn_error = "ERROR: Unrecognized opcode";
4059       return;
4060     }
4061   argsStart = s;
4062   for (;;)
4063     {
4064       int insn_isa;
4065
4066       assert (strcmp (insn->name, str) == 0);
4067
4068       if (insn->pinfo == INSN_MACRO)
4069         insn_isa = insn->match;
4070       else if (insn->pinfo & INSN_ISA2)
4071         insn_isa = 2;
4072       else if (insn->pinfo & INSN_ISA3)
4073         insn_isa = 3;
4074       else
4075         insn_isa = 1;
4076
4077       if (insn_isa > mips_isa)
4078         {
4079           if (insn + 1 < &mips_opcodes[NUMOPCODES]
4080               && strcmp (insn->name, insn[1].name) == 0)
4081             {
4082               ++insn;
4083               continue;
4084             }
4085           as_warn ("Instruction not supported on this processor");
4086         }
4087
4088       ip->insn_mo = insn;
4089       ip->insn_opcode = insn->match;
4090       for (args = insn->args;; ++args)
4091         {
4092           if (*s == ' ')
4093             ++s;
4094           switch (*args)
4095             {
4096             case '\0':          /* end of args */
4097               if (*s == '\0')
4098                 return;
4099               break;
4100
4101             case ',':
4102               if (*s++ == *args)
4103                 continue;
4104               s--;
4105               switch (*++args)
4106                 {
4107                 case 'r':
4108                 case 'v':
4109                   ip->insn_opcode |= lastregno << 21;
4110                   continue;
4111
4112                 case 'w':
4113                 case 'W':
4114                   ip->insn_opcode |= lastregno << 16;
4115                   continue;
4116
4117                 case 'V':
4118                   ip->insn_opcode |= lastregno << 11;
4119                   continue;
4120                 }
4121               break;
4122
4123             case '(':
4124               /* handle optional base register.
4125                  Either the base register is omitted or
4126                  we must have a left paren. */
4127               /* this is dependent on the next operand specifier
4128                  is a 'b' for base register */
4129               assert (args[1] == 'b');
4130               if (*s == '\0')
4131                 return;
4132
4133             case ')':           /* these must match exactly */
4134               if (*s++ == *args)
4135                 continue;
4136               break;
4137
4138             case '<':           /* must be at least one digit */
4139               /*
4140                * According to the manual, if the shift amount is greater
4141                * than 31 or less than 0 the the shift amount should be
4142                * mod 32. In reality the mips assembler issues an error.
4143                * We issue a warning and mask out all but the low 5 bits.
4144                */
4145               my_getExpression (&imm_expr, s);
4146               check_absolute_expr (ip, &imm_expr);
4147               if ((unsigned long) imm_expr.X_add_number > 31)
4148                 {
4149                   as_warn ("Improper shift amount (%ld)",
4150                            (long) imm_expr.X_add_number);
4151                   imm_expr.X_add_number = imm_expr.X_add_number & 0x1f;
4152                 }
4153               ip->insn_opcode |= imm_expr.X_add_number << 6;
4154               imm_expr.X_op = O_absent;
4155               s = expr_end;
4156               continue;
4157
4158             case '>':           /* shift amount minus 32 */
4159               my_getExpression (&imm_expr, s);
4160               check_absolute_expr (ip, &imm_expr);
4161               if ((unsigned long) imm_expr.X_add_number < 32
4162                   || (unsigned long) imm_expr.X_add_number > 63)
4163                 break;
4164               ip->insn_opcode |= (imm_expr.X_add_number - 32) << 6;
4165               imm_expr.X_op = O_absent;
4166               s = expr_end;
4167               continue;
4168
4169             case 'k':           /* cache code */
4170               my_getExpression (&imm_expr, s);
4171               check_absolute_expr (ip, &imm_expr);
4172               if ((unsigned long) imm_expr.X_add_number > 31)
4173                 {
4174                   as_warn ("Invalid cahce opcode (%lu)",
4175                            (unsigned long) imm_expr.X_add_number);
4176                   imm_expr.X_add_number &= 0x1f;
4177                 }
4178               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CACHE;
4179               imm_expr.X_op = O_absent;
4180               s = expr_end;
4181               continue;
4182
4183             case 'c':           /* break code */
4184               my_getExpression (&imm_expr, s);
4185               check_absolute_expr (ip, &imm_expr);
4186               if ((unsigned) imm_expr.X_add_number > 1023)
4187                 as_warn ("Illegal break code (%ld)",
4188                          (long) imm_expr.X_add_number);
4189               ip->insn_opcode |= imm_expr.X_add_number << 16;
4190               imm_expr.X_op = O_absent;
4191               s = expr_end;
4192               continue;
4193
4194             case 'B':           /* syscall code */
4195               my_getExpression (&imm_expr, s);
4196               check_absolute_expr (ip, &imm_expr);
4197               if ((unsigned) imm_expr.X_add_number > 0xfffff)
4198                 as_warn ("Illegal syscall code (%ld)",
4199                          (long) imm_expr.X_add_number);
4200               ip->insn_opcode |= imm_expr.X_add_number << 6;
4201               imm_expr.X_op = O_absent;
4202               s = expr_end;
4203               continue;
4204
4205             case 'C':           /* Coprocessor code */
4206               my_getExpression (&imm_expr, s);
4207               check_absolute_expr (ip, &imm_expr);
4208               if ((unsigned long) imm_expr.X_add_number >= (1<<25))
4209                 {
4210                   as_warn ("Coproccesor code > 25 bits (%ld)",
4211                            (long) imm_expr.X_add_number);
4212                   imm_expr.X_add_number &= ((1<<25) - 1);
4213                 }
4214               ip->insn_opcode |= imm_expr.X_add_number;
4215               imm_expr.X_op = O_absent;
4216               s = expr_end;
4217               continue;
4218
4219             case 'b':           /* base register */
4220             case 'd':           /* destination register */
4221             case 's':           /* source register */
4222             case 't':           /* target register */
4223             case 'r':           /* both target and source */
4224             case 'v':           /* both dest and source */
4225             case 'w':           /* both dest and target */
4226             case 'E':           /* coprocessor target register */
4227             case 'G':           /* coprocessor destination register */
4228             case 'x':           /* ignore register name */
4229             case 'z':           /* must be zero register */
4230               s_reset = s;
4231               if (s[0] == '$')
4232                 {
4233                   if (isdigit (s[1]))
4234                     {
4235                       ++s;
4236                       regno = 0;
4237                       do
4238                         {
4239                           regno *= 10;
4240                           regno += *s - '0';
4241                           ++s;
4242                         }
4243                       while (isdigit (*s));
4244                       if (regno > 31)
4245                         as_bad ("Invalid register number (%d)", regno);
4246                     }
4247                   else if (*args == 'E' || *args == 'G')
4248                     goto notreg;
4249                   else
4250                     {
4251                       if (s[1] == 'f' && s[2] == 'p')
4252                         {
4253                           s += 3;
4254                           regno = FP;
4255                         }
4256                       else if (s[1] == 's' && s[2] == 'p')
4257                         {
4258                           s += 3;
4259                           regno = SP;
4260                         }
4261                       else if (s[1] == 'g' && s[2] == 'p')
4262                         {
4263                           s += 3;
4264                           regno = GP;
4265                         }
4266                       else if (s[1] == 'a' && s[2] == 't')
4267                         {
4268                           s += 3;
4269                           regno = AT;
4270                         }
4271                       else
4272                         goto notreg;
4273                     }
4274                   if (regno == AT && ! mips_noat)
4275                     as_warn ("Used $at without \".set noat\"");
4276                   c = *args;
4277                   if (*s == ' ')
4278                     s++;
4279                   if (args[1] != *s)
4280                     {
4281                       if (c == 'r' || c == 'v' || c == 'w')
4282                         {
4283                           regno = lastregno;
4284                           s = s_reset;
4285                           args++;
4286                         }
4287                     }
4288                   /* 'z' only matches $0.  */
4289                   if (c == 'z' && regno != 0)
4290                     break;
4291                   switch (c)
4292                     {
4293                     case 'r':
4294                     case 's':
4295                     case 'v':
4296                     case 'b':
4297                       ip->insn_opcode |= regno << 21;
4298                       break;
4299                     case 'd':
4300                     case 'G':
4301                       ip->insn_opcode |= regno << 11;
4302                       break;
4303                     case 'w':
4304                     case 't':
4305                     case 'E':
4306                       ip->insn_opcode |= regno << 16;
4307                       break;
4308                     case 'x':
4309                       /* This case exists because on the r3000 trunc
4310                          expands into a macro which requires a gp
4311                          register.  On the r6000 or r4000 it is
4312                          assembled into a single instruction which
4313                          ignores the register.  Thus the insn version
4314                          is MIPS_ISA2 and uses 'x', and the macro
4315                          version is MIPS_ISA1 and uses 't'.  */
4316                       break;
4317                     case 'z':
4318                       /* This case is for the div instruction, which
4319                          acts differently if the destination argument
4320                          is $0.  This only matches $0, and is checked
4321                          outside the switch.  */
4322                       break;
4323                     }
4324                   lastregno = regno;
4325                   continue;
4326                 }
4327             notreg:
4328               switch (*args++)
4329                 {
4330                 case 'r':
4331                 case 'v':
4332                   ip->insn_opcode |= lastregno << 21;
4333                   continue;
4334                 case 'w':
4335                   ip->insn_opcode |= lastregno << 16;
4336                   continue;
4337                 }
4338               break;
4339
4340             case 'D':           /* floating point destination register */
4341             case 'S':           /* floating point source register */
4342             case 'T':           /* floating point target register */
4343             case 'V':
4344             case 'W':
4345               s_reset = s;
4346               if (s[0] == '$' && s[1] == 'f' && isdigit (s[2]))
4347                 {
4348                   s += 2;
4349                   regno = 0;
4350                   do
4351                     {
4352                       regno *= 10;
4353                       regno += *s - '0';
4354                       ++s;
4355                     }
4356                   while (isdigit (*s));
4357
4358                   if (regno > 31)
4359                     as_bad ("Invalid float register number (%d)", regno);
4360
4361                   if ((regno & 1) != 0
4362                       && mips_isa < 3
4363                       && ! (strcmp (str, "mtc1") == 0 ||
4364                             strcmp (str, "mfc1") == 0 ||
4365                             strcmp (str, "lwc1") == 0 ||
4366                             strcmp (str, "swc1") == 0))
4367                     as_warn ("Float register should be even, was %d",
4368                              regno);
4369
4370                   c = *args;
4371                   if (*s == ' ')
4372                     s++;
4373                   if (args[1] != *s)
4374                     {
4375                       if (c == 'V' || c == 'W')
4376                         {
4377                           regno = lastregno;
4378                           s = s_reset;
4379                           args++;
4380                         }
4381                     }
4382                   switch (c)
4383                     {
4384                     case 'D':
4385                       ip->insn_opcode |= regno << 6;
4386                       break;
4387                     case 'V':
4388                     case 'S':
4389                       ip->insn_opcode |= regno << 11;
4390                       break;
4391                     case 'W':
4392                     case 'T':
4393                       ip->insn_opcode |= regno << 16;
4394                     }
4395                   lastregno = regno;
4396                   continue;
4397                 }
4398               switch (*args++)
4399                 {
4400                 case 'V':
4401                   ip->insn_opcode |= lastregno << 11;
4402                   continue;
4403                 case 'W':
4404                   ip->insn_opcode |= lastregno << 16;
4405                   continue;
4406                 }
4407               break;
4408
4409             case 'I':
4410               my_getExpression (&imm_expr, s);
4411               check_absolute_expr (ip, &imm_expr);
4412               s = expr_end;
4413               continue;
4414
4415             case 'A':
4416               my_getExpression (&offset_expr, s);
4417               imm_reloc = BFD_RELOC_32;
4418               s = expr_end;
4419               continue;
4420
4421             case 'F':
4422             case 'L':
4423             case 'f':
4424             case 'l':
4425               {
4426                 int f64;
4427                 char *save_in;
4428                 char *err;
4429                 unsigned char temp[8];
4430                 int len;
4431                 unsigned int length;
4432                 segT seg;
4433                 subsegT subseg;
4434                 char *p;
4435
4436                 /* These only appear as the last operand in an
4437                    instruction, and every instruction that accepts
4438                    them in any variant accepts them in all variants.
4439                    This means we don't have to worry about backing out
4440                    any changes if the instruction does not match.
4441
4442                    The difference between them is the size of the
4443                    floating point constant and where it goes.  For 'F'
4444                    and 'L' the constant is 64 bits; for 'f' and 'l' it
4445                    is 32 bits.  Where the constant is placed is based
4446                    on how the MIPS assembler does things:
4447                     F -- .rdata
4448                     L -- .lit8
4449                     f -- immediate value
4450                     l -- .lit4
4451
4452                     When generating SVR4 PIC code, we do not use the
4453                     .lit8 or .lit4 sections at all, in order to
4454                     reserve the entire global offset table.  When
4455                     generating embedded PIC code, we use the .lit8
4456                     section but not the .lit4 section (we can do .lit4
4457                     inline easily; we need to put .lit8 somewhere in
4458                     the data segment, and using .lit8 permits the
4459                     linker to eventually combine identical .lit8
4460                     entries).  */
4461
4462                 f64 = *args == 'F' || *args == 'L';
4463
4464                 save_in = input_line_pointer;
4465                 input_line_pointer = s;
4466                 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
4467                 length = len;
4468                 s = input_line_pointer;
4469                 input_line_pointer = save_in;
4470                 if (err != NULL && *err != '\0')
4471                   {
4472                     as_bad ("Bad floating point constant: %s", err);
4473                     memset (temp, '\0', sizeof temp);
4474                     length = f64 ? 8 : 4;
4475                   }
4476
4477                 assert (length == (f64 ? 8 : 4));
4478
4479                 if (*args == 'f'
4480                     || (mips_pic != NO_PIC && *args == 'l'))
4481                   {
4482                     imm_expr.X_op = O_constant;
4483                     if (byte_order == LITTLE_ENDIAN)
4484                       imm_expr.X_add_number =
4485                         (((((((int) temp[3] << 8)
4486                              | temp[2]) << 8)
4487                            | temp[1]) << 8)
4488                          | temp[0]);
4489                     else
4490                       imm_expr.X_add_number =
4491                         (((((((int) temp[0] << 8)
4492                              | temp[1]) << 8)
4493                            | temp[2]) << 8)
4494                          | temp[3]);
4495                   }
4496                 else
4497                   {
4498                     const char *newname;
4499                     segT new_seg;
4500
4501                     /* Switch to the right section.  */
4502                     seg = now_seg;
4503                     subseg = now_subseg;
4504                     switch (*args)
4505                       {
4506                       default: /* unused default case avoids warnings.  */
4507                       case 'L':
4508                         newname = (mips_pic != SVR4_PIC
4509                                    ? ".lit8"
4510                                    : RDATA_SECTION_NAME);
4511                         break;
4512                       case 'F':
4513                         newname = RDATA_SECTION_NAME;
4514                         break;
4515                       case 'l':
4516                         assert (mips_pic == NO_PIC);
4517                         newname = ".lit4";
4518                         break;
4519                       }
4520                     new_seg = subseg_new (newname, (subsegT) 0);
4521                     frag_align (*args == 'l' ? 2 : 3, 0);
4522 #ifdef OBJ_ELF
4523                     record_alignment (new_seg, 4);
4524 #else
4525                     record_alignment (new_seg, *args == 'l' ? 2 : 3);
4526 #endif
4527                     if (seg == now_seg)
4528                       as_bad ("Can't use floating point insn in this section");
4529
4530                     /* Set the argument to the current address in the
4531                        section.  */
4532                     offset_expr.X_op = O_symbol;
4533                     offset_expr.X_add_symbol =
4534                       symbol_new ("L0\001", now_seg,
4535                                   (valueT) frag_now_fix (), frag_now);
4536                     offset_expr.X_add_number = 0;
4537
4538                     /* Put the floating point number into the section.  */
4539                     p = frag_more ((int) length);
4540                     memcpy (p, temp, length);
4541
4542                     /* Switch back to the original section.  */
4543                     subseg_set (seg, subseg);
4544                   }
4545               }
4546               continue;
4547
4548             case 'i':           /* 16 bit unsigned immediate */
4549             case 'j':           /* 16 bit signed immediate */
4550               imm_reloc = BFD_RELOC_LO16;
4551               c = my_getSmallExpression (&imm_expr, s);
4552               if (c)
4553                 {
4554                   if (c != 'l')
4555                     {
4556                       if (imm_expr.X_op == O_constant)
4557                         imm_expr.X_add_number =
4558                           (imm_expr.X_add_number >> 16) & 0xffff;
4559                       else if (c == 'h')
4560                         imm_reloc = BFD_RELOC_HI16_S;
4561                       else
4562                         imm_reloc = BFD_RELOC_HI16;
4563                     }
4564                 }
4565               else
4566                 check_absolute_expr (ip, &imm_expr);
4567               if (*args == 'i')
4568                 {
4569                   if (imm_expr.X_add_number < 0
4570                       || imm_expr.X_add_number >= 0x10000)
4571                     {
4572                       if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
4573                           !strcmp (insn->name, insn[1].name))
4574                         break;
4575                       as_bad ("16 bit expression not in range 0..65535");
4576                     }
4577                 }
4578               else
4579                 {
4580                   int more;
4581                   offsetT max;
4582
4583                   /* The upper bound should be 0x8000, but
4584                      unfortunately the MIPS assembler accepts numbers
4585                      from 0x8000 to 0xffff and sign extends them, and
4586                      we want to be compatible.  We only permit this
4587                      extended range for an instruction which does not
4588                      provide any further alternates, since those
4589                      alternates may handle other cases.  People should
4590                      use the numbers they mean, rather than relying on
4591                      a mysterious sign extension.  */
4592                   more = (insn + 1 < &mips_opcodes[NUMOPCODES] &&
4593                           strcmp (insn->name, insn[1].name) == 0);
4594                   if (more)
4595                     max = 0x8000;
4596                   else
4597                     max = 0x10000;
4598                   if (imm_expr.X_add_number < -0x8000 ||
4599                       imm_expr.X_add_number >= max)
4600                     {
4601                       if (more)
4602                         break;
4603                       as_bad ("16 bit expression not in range -32768..32767");
4604                     }
4605                 }
4606               s = expr_end;
4607               continue;
4608
4609             case 'o':           /* 16 bit offset */
4610               c = my_getSmallExpression (&offset_expr, s);
4611
4612               /* If this value won't fit into a 16 bit offset, then go
4613                  find a macro that will generate the 32 bit offset
4614                  code pattern.  As a special hack, we accept the
4615                  difference of two local symbols as a constant.  This
4616                  is required to suppose embedded PIC switches, which
4617                  use an instruction which looks like
4618                      lw $4,$L12-$LS12($4)
4619                  The problem with handling this in a more general
4620                  fashion is that the macro function doesn't expect to
4621                  see anything which can be handled in a single
4622                  constant instruction.  */
4623               if (c == 0
4624                   && (offset_expr.X_op != O_constant
4625                       || offset_expr.X_add_number >= 0x8000
4626                       || offset_expr.X_add_number < -0x8000)
4627                   && (mips_pic != EMBEDDED_PIC
4628                       || offset_expr.X_op != O_subtract
4629                       || ! S_IS_LOCAL (offset_expr.X_add_symbol)
4630                       || ! S_IS_LOCAL (offset_expr.X_op_symbol)))
4631                 break;
4632
4633               offset_reloc = BFD_RELOC_LO16;
4634               if (c == 'h' || c == 'H')
4635                 {
4636                   assert (offset_expr.X_op == O_constant);
4637                   offset_expr.X_add_number =
4638                     (offset_expr.X_add_number >> 16) & 0xffff;
4639                 }
4640               s = expr_end;
4641               continue;
4642
4643             case 'p':           /* pc relative offset */
4644               offset_reloc = BFD_RELOC_16_PCREL_S2;
4645               my_getExpression (&offset_expr, s);
4646               s = expr_end;
4647               continue;
4648
4649             case 'u':           /* upper 16 bits */
4650               c = my_getSmallExpression (&imm_expr, s);
4651               if (imm_expr.X_op == O_constant
4652                   && (imm_expr.X_add_number < 0
4653                       || imm_expr.X_add_number >= 0x10000))
4654                 as_bad ("lui expression not in range 0..65535");
4655               imm_reloc = BFD_RELOC_LO16;
4656               if (c)
4657                 {
4658                   if (c != 'l')
4659                     {
4660                       if (imm_expr.X_op == O_constant)
4661                         imm_expr.X_add_number =
4662                           (imm_expr.X_add_number >> 16) & 0xffff;
4663                       else if (c == 'h')
4664                         imm_reloc = BFD_RELOC_HI16_S;
4665                       else
4666                         imm_reloc = BFD_RELOC_HI16;
4667                     }
4668                 }
4669               s = expr_end;
4670               continue;
4671
4672             case 'a':           /* 26 bit address */
4673               my_getExpression (&offset_expr, s);
4674               s = expr_end;
4675               offset_reloc = BFD_RELOC_MIPS_JMP;
4676               continue;
4677
4678             default:
4679               fprintf (stderr, "bad char = '%c'\n", *args);
4680               internalError ();
4681             }
4682           break;
4683         }
4684       /* Args don't match.  */
4685       if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
4686           !strcmp (insn->name, insn[1].name))
4687         {
4688           ++insn;
4689           s = argsStart;
4690           continue;
4691         }
4692       insn_error = "ERROR: Illegal operands";
4693       return;
4694     }
4695 }
4696
4697 #define LP '('
4698 #define RP ')'
4699
4700 static int
4701 my_getSmallExpression (ep, str)
4702      expressionS *ep;
4703      char *str;
4704 {
4705   char *sp;
4706   int c = 0;
4707
4708   if (*str == ' ')
4709     str++;
4710   if (*str == LP
4711       || (*str == '%' &&
4712           ((str[1] == 'h' && str[2] == 'i')
4713            || (str[1] == 'H' && str[2] == 'I')
4714            || (str[1] == 'l' && str[2] == 'o'))
4715           && str[3] == LP))
4716     {
4717       if (*str == LP)
4718         c = 0;
4719       else
4720         {
4721           c = str[1];
4722           str += 3;
4723         }
4724
4725       /*
4726        * A small expression may be followed by a base register.
4727        * Scan to the end of this operand, and then back over a possible
4728        * base register.  Then scan the small expression up to that
4729        * point.  (Based on code in sparc.c...)
4730        */
4731       for (sp = str; *sp && *sp != ','; sp++)
4732         ;
4733       if (sp - 4 >= str && sp[-1] == RP)
4734         {
4735           if (isdigit (sp[-2]))
4736             {
4737               for (sp -= 3; sp >= str && isdigit (*sp); sp--)
4738                 ;
4739               if (*sp == '$' && sp > str && sp[-1] == LP)
4740                 {
4741                   sp--;
4742                   goto do_it;
4743                 }
4744             }
4745           else if (sp - 5 >= str
4746                    && sp[-5] == LP
4747                    && sp[-4] == '$'
4748                    && ((sp[-3] == 'f' && sp[-2] == 'p')
4749                        || (sp[-3] == 's' && sp[-2] == 'p')
4750                        || (sp[-3] == 'g' && sp[-2] == 'p')
4751                        || (sp[-3] == 'a' && sp[-2] == 't')))
4752             {
4753               sp -= 5;
4754             do_it:
4755               if (sp == str)
4756                 {
4757                   /* no expression means zero offset */
4758                   if (c)
4759                     {
4760                       /* %xx(reg) is an error */
4761                       ep->X_op = O_absent;
4762                       expr_end = str - 3;
4763                     }
4764                   else
4765                     {
4766                       ep->X_op = O_constant;
4767                       expr_end = sp;
4768                     }
4769                   ep->X_add_symbol = NULL;
4770                   ep->X_op_symbol = NULL;
4771                   ep->X_add_number = 0;
4772                 }
4773               else
4774                 {
4775                   *sp = '\0';
4776                   my_getExpression (ep, str);
4777                   *sp = LP;
4778                 }
4779               return c;
4780             }
4781         }
4782     }
4783   my_getExpression (ep, str);
4784   return c;                     /* => %hi or %lo encountered */
4785 }
4786
4787 static void
4788 my_getExpression (ep, str)
4789      expressionS *ep;
4790      char *str;
4791 {
4792   char *save_in;
4793
4794   save_in = input_line_pointer;
4795   input_line_pointer = str;
4796   expression (ep);
4797   expr_end = input_line_pointer;
4798   input_line_pointer = save_in;
4799 }
4800
4801 /* Turn a string in input_line_pointer into a floating point constant
4802    of type type, and store the appropriate bytes in *litP.  The number
4803    of LITTLENUMS emitted is stored in *sizeP .  An error message is
4804    returned, or NULL on OK.  */
4805
4806 char *
4807 md_atof (type, litP, sizeP)
4808      int type;
4809      char *litP;
4810      int *sizeP;
4811 {
4812   int prec;
4813   LITTLENUM_TYPE words[4];
4814   char *t;
4815   int i;
4816
4817   switch (type)
4818     {
4819     case 'f':
4820       prec = 2;
4821       break;
4822
4823     case 'd':
4824       prec = 4;
4825       break;
4826
4827     default:
4828       *sizeP = 0;
4829       return "bad call to md_atof";
4830     }
4831
4832   t = atof_ieee (input_line_pointer, type, words);
4833   if (t)
4834     input_line_pointer = t;
4835
4836   *sizeP = prec * 2;
4837
4838   if (byte_order == LITTLE_ENDIAN)
4839     {
4840       for (i = prec - 1; i >= 0; i--)
4841         {
4842           md_number_to_chars (litP, (valueT) words[i], 2);
4843           litP += 2;
4844         }
4845     }
4846   else
4847     {
4848       for (i = 0; i < prec; i++)
4849         {
4850           md_number_to_chars (litP, (valueT) words[i], 2);
4851           litP += 2;
4852         }
4853     }
4854      
4855   return NULL;
4856 }
4857
4858 void
4859 md_number_to_chars (buf, val, n)
4860      char *buf;
4861      valueT val;
4862      int n;
4863 {
4864   switch (byte_order)
4865     {
4866     case LITTLE_ENDIAN:
4867       number_to_chars_littleendian (buf, val, n);
4868       break;
4869
4870     case BIG_ENDIAN:
4871       number_to_chars_bigendian (buf, val, n);
4872       break;
4873
4874     default:
4875       internalError ();
4876     }
4877 }
4878 \f
4879 #ifdef GPOPT
4880 CONST char *md_shortopts = "E:O::g::G:";
4881 #else
4882 CONST char *md_shortopts = "E:O::g::";
4883 #endif
4884 struct option md_longopts[] = {
4885 #define OPTION_MIPS1 (OPTION_MD_BASE + 1)
4886   {"mips0", no_argument, NULL, OPTION_MIPS1},
4887   {"mips1", no_argument, NULL, OPTION_MIPS1},
4888 #define OPTION_MIPS2 (OPTION_MD_BASE + 2)
4889   {"mips2", no_argument, NULL, OPTION_MIPS2},
4890 #define OPTION_MIPS3 (OPTION_MD_BASE + 3)
4891   {"mips3", no_argument, NULL, OPTION_MIPS3},
4892 #define OPTION_MCPU (OPTION_MD_BASE + 4)
4893   {"mcpu", required_argument, NULL, OPTION_MCPU},
4894 #define OPTION_MEMBEDDED_PIC (OPTION_MD_BASE + 5)
4895   {"membedded-pic", no_argument, NULL, OPTION_MEMBEDDED_PIC},
4896 #define OPTION_TRAP (OPTION_MD_BASE + 8)
4897   {"trap", no_argument, NULL, OPTION_TRAP},
4898   {"no-break", no_argument, NULL, OPTION_TRAP},
4899 #define OPTION_BREAK (OPTION_MD_BASE + 9)
4900   {"break", no_argument, NULL, OPTION_BREAK},
4901   {"no-trap", no_argument, NULL, OPTION_BREAK},
4902
4903 #ifdef OBJ_ELF
4904 #define OPTION_CALL_SHARED (OPTION_MD_BASE + 6)
4905   {"KPIC", no_argument, NULL, OPTION_CALL_SHARED},
4906   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
4907 #define OPTION_NON_SHARED (OPTION_MD_BASE + 7)
4908   {"non_shared", no_argument, NULL, OPTION_NON_SHARED},
4909 #endif
4910
4911   {NULL, no_argument, NULL, 0}
4912 };
4913 size_t md_longopts_size = sizeof(md_longopts);
4914
4915 int
4916 md_parse_option (c, arg)
4917      int c;
4918      char *arg;
4919 {
4920   switch (c)
4921     {
4922     case OPTION_TRAP:
4923       mips_trap = 1;
4924       break;
4925
4926     case OPTION_BREAK:
4927       mips_trap = 0;
4928       break;
4929
4930     case 'E':
4931       if (arg[1] == 'B')
4932         byte_order = BIG_ENDIAN;
4933       else if (arg[1] == 'L')
4934         byte_order = LITTLE_ENDIAN;
4935       else
4936         {
4937           as_bad("invalid endianness -E%c", arg[1]);
4938           return 0;
4939         }
4940
4941 #ifdef OBJ_AOUT
4942       if (arg[1] == 'B')
4943         mips_target_format = "a.out-mips-big";
4944       else
4945         mips_target_format = "a.out-mips-little";
4946 #endif
4947 #ifdef OBJ_ECOFF
4948       if (arg[1] == 'B')
4949         mips_target_format = "ecoff-bigmips";
4950       else
4951         mips_target_format = "ecoff-littlemips";
4952 #endif
4953 #ifdef OBJ_ELF
4954       if (arg[1] == 'B')
4955         mips_target_format = "elf32-bigmips";
4956       else
4957         mips_target_format = "elf32-littlemips";
4958 #endif
4959
4960       /* FIXME: This breaks -L -EL.  */
4961       flag_keep_locals = 0;
4962       break;
4963
4964     case 'O':
4965       if (arg && arg[1] == '0')
4966         mips_optimize = 1;
4967       else
4968         mips_optimize = 2;
4969       break;
4970
4971     case 'g':
4972       if (arg == NULL || arg[1] == '2')
4973         mips_optimize = 0;
4974       break;
4975
4976     case OPTION_MIPS1:
4977       mips_isa = 1;
4978       break;
4979
4980     case OPTION_MIPS2:
4981       mips_isa = 2;
4982       break;
4983
4984     case OPTION_MIPS3:
4985       mips_isa = 3;
4986       break;
4987
4988     case OPTION_MCPU:
4989       {
4990         char *p;
4991
4992         /* Identify the processor type */
4993         p = arg;
4994         if (strcmp (p, "default") == 0
4995             || strcmp (p, "DEFAULT") == 0)
4996           mips_isa = -1;
4997         else
4998           {
4999             if (*p == 'r' || *p == 'R')
5000               p++;
5001
5002             mips_isa = -1;
5003             switch (*p)
5004               {
5005               case '2':
5006                 if (strcmp (p, "2000") == 0
5007                     || strcmp (p, "2k") == 0
5008                     || strcmp (p, "2K") == 0)
5009                   mips_isa = 1;
5010                 break;
5011
5012               case '3':
5013                 if (strcmp (p, "3000") == 0
5014                     || strcmp (p, "3k") == 0
5015                     || strcmp (p, "3K") == 0)
5016                   mips_isa = 1;
5017                 break;
5018
5019               case '4':
5020                 if (strcmp (p, "4000") == 0
5021                     || strcmp (p, "4k") == 0
5022                     || strcmp (p, "4K") == 0)
5023                   mips_isa = 3;
5024                 break;
5025
5026               case '6':
5027                 if (strcmp (p, "6000") == 0
5028                     || strcmp (p, "6k") == 0
5029                     || strcmp (p, "6K") == 0)
5030                   mips_isa = 2;
5031                 break;
5032               }
5033
5034             if (mips_isa == -1)
5035               {
5036                 as_bad ("invalid architecture -mcpu=%s", arg);
5037                 return 0;
5038               }
5039           }
5040       }
5041       break;
5042
5043     case OPTION_MEMBEDDED_PIC:
5044       mips_pic = EMBEDDED_PIC;
5045 #ifdef GPOPT
5046       if (g_switch_seen)
5047         {
5048           as_bad ("-G may not be used with embedded PIC code");
5049           return 0;
5050         }
5051       g_switch_value = 0x7fffffff;
5052 #endif
5053       break;
5054
5055 #ifdef OBJ_ELF
5056   /* When generating ELF code, we permit -KPIC and -call_shared to
5057      select SVR4_PIC, and -non_shared to select no PIC.  This is
5058      intended to be compatible with Irix 5.  */
5059     case OPTION_CALL_SHARED:
5060       mips_pic = SVR4_PIC;
5061       if (g_switch_seen && g_switch_value != 0)
5062         {
5063           as_bad ("-G may not be used with SVR4 PIC code");
5064           return 0;
5065         }
5066       g_switch_value = 0;
5067       break;
5068
5069     case OPTION_NON_SHARED:
5070       mips_pic = NO_PIC;
5071       break;
5072 #endif /* OBJ_ELF */
5073
5074 #ifdef GPOPT
5075     case 'G':
5076       if (mips_pic == SVR4_PIC || mips_pic == EMBEDDED_PIC)
5077         {
5078           as_bad ("-G may not be used with SVR4 or embedded PIC code");
5079           return 0;
5080         }
5081       else
5082         g_switch_value = atoi (arg);
5083       g_switch_seen = 1;
5084       break;
5085 #endif
5086
5087     default:
5088       return 0;
5089     }
5090
5091   return 1;
5092 }
5093
5094 void
5095 md_show_usage (stream)
5096      FILE *stream;
5097 {
5098   fprintf(stream, "\
5099 MIPS options:\n\
5100 -membedded-pic          generate embedded position independent code\n\
5101 -EB                     generate big endian output\n\
5102 -EL                     generate little endian output\n\
5103 -g, -g2                 do not remove uneeded NOPs or swap branches\n\
5104 -G NUM                  allow referencing objects up to NUM bytes\n\
5105                         implicitly with the gp register [default 8]\n");
5106   fprintf(stream, "\
5107 -mips1, -mcpu=r{2,3}000 generate code for r2000 and r3000\n\
5108 -mips2, -mcpu=r6000     generate code for r6000\n\
5109 -mips3, -mcpu=r4000     generate code for r4000\n\
5110 -O0                     remove unneeded NOPs, do not swap branches\n\
5111 -O                      remove unneeded NOPs and swap branches\n\
5112 --trap, --no-break      trap exception on div by 0 and mult overflow\n\
5113 --break, --no-trap      break exception on div by 0 and mult overflow\n");
5114 #ifdef OBJ_ELF
5115   fprintf(stream, "\
5116 -KPIC, -call_shared     generate SVR4 position independent code\n\
5117 -non_shared             do not generate position independent code\n");
5118 #endif
5119 }
5120 \f
5121 long
5122 md_pcrel_from (fixP)
5123      fixS *fixP;
5124 {
5125 #ifndef OBJ_AOUT
5126   if (fixP->fx_addsy != (symbolS *) NULL
5127       && ! S_IS_DEFINED (fixP->fx_addsy))
5128     {
5129       /* This makes a branch to an undefined symbol be a branch to the
5130          current location.  */
5131       return 4;
5132     }
5133 #endif
5134
5135   /* return the address of the delay slot */
5136   return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
5137 }
5138
5139 /* This is called by emit_expr via TC_CONS_FIX_NEW when creating a
5140    reloc for a cons.  We could use the definition there, except that
5141    we want to handle 64 bit relocs specially.  */
5142
5143 void
5144 cons_fix_new_mips (frag, where, nbytes, exp)
5145      fragS *frag;
5146      int where;
5147      unsigned int nbytes;
5148      expressionS *exp;
5149 {
5150   /* If we are assembling in 32 bit mode, turn an 8 byte reloc into a
5151      4 byte reloc.  
5152      FIXME: There is no way to select anything but 32 bit mode right
5153      now.  */
5154   if (nbytes == 8)
5155     {
5156       if (byte_order == BIG_ENDIAN)
5157         where += 4;
5158       nbytes = 4;
5159     }
5160
5161   if (nbytes != 2 && nbytes != 4)
5162     as_bad ("Unsupported reloc size %d", nbytes);
5163
5164   fix_new_exp (frag_now, where, (int) nbytes, exp, 0,
5165                nbytes == 2 ? BFD_RELOC_16 : BFD_RELOC_32);
5166 }
5167
5168 /* When generating embedded PIC code we need to use a special
5169    relocation to represent the difference of two symbols in the .text
5170    section (switch tables use a difference of this sort).  See
5171    include/coff/mips.h for details.  This macro checks whether this
5172    fixup requires the special reloc.  */
5173 #define SWITCH_TABLE(fixp) \
5174   ((fixp)->fx_r_type == BFD_RELOC_32 \
5175    && (fixp)->fx_addsy != NULL \
5176    && (fixp)->fx_subsy != NULL \
5177    && S_GET_SEGMENT ((fixp)->fx_addsy) == text_section \
5178    && S_GET_SEGMENT ((fixp)->fx_subsy) == text_section)
5179
5180 /* When generating embedded PIC code we must keep all PC relative
5181    relocations, in case the linker has to relax a call.  We also need
5182    to keep relocations for switch table entries.  */
5183
5184 /*ARGSUSED*/
5185 int
5186 mips_force_relocation (fixp)
5187      fixS *fixp;
5188 {
5189   return (mips_pic == EMBEDDED_PIC
5190           && (fixp->fx_pcrel
5191               || SWITCH_TABLE (fixp)
5192               || fixp->fx_r_type == BFD_RELOC_PCREL_HI16_S
5193               || fixp->fx_r_type == BFD_RELOC_PCREL_LO16));
5194 }
5195
5196 /* Apply a fixup to the object file.  */
5197
5198 int
5199 md_apply_fix (fixP, valueP)
5200      fixS *fixP;
5201      valueT *valueP;
5202 {
5203   unsigned char *buf;
5204   long insn, value;
5205
5206   assert (fixP->fx_size == 4);
5207
5208   value = *valueP;
5209   fixP->fx_addnumber = value;   /* Remember value for tc_gen_reloc */
5210
5211   if (fixP->fx_addsy == NULL && ! fixP->fx_pcrel)
5212     fixP->fx_done = 1;
5213
5214   switch (fixP->fx_r_type)
5215     {
5216     case BFD_RELOC_MIPS_JMP:
5217     case BFD_RELOC_HI16:
5218     case BFD_RELOC_HI16_S:
5219     case BFD_RELOC_MIPS_GPREL:
5220     case BFD_RELOC_MIPS_LITERAL:
5221     case BFD_RELOC_MIPS_CALL16:
5222     case BFD_RELOC_MIPS_GOT16:
5223     case BFD_RELOC_MIPS_GPREL32:
5224       if (fixP->fx_pcrel)
5225         as_bad ("Invalid PC relative reloc");
5226       /* Nothing needed to do. The value comes from the reloc entry */
5227       break;
5228
5229     case BFD_RELOC_PCREL_HI16_S:
5230       /* The addend for this is tricky if it is internal, so we just
5231          do everything here rather than in bfd_perform_relocation.  */
5232       if ((fixP->fx_addsy->bsym->flags & BSF_SECTION_SYM) == 0)
5233         {
5234           /* For an external symbol adjust by the address to make it
5235              pcrel_offset.  We use the address of the RELLO reloc
5236              which follows this one.  */
5237           value += (fixP->fx_next->fx_frag->fr_address
5238                     + fixP->fx_next->fx_where);
5239         }
5240       if (value & 0x8000)
5241         value += 0x10000;
5242       value >>= 16;
5243       buf = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where;
5244       if (byte_order == BIG_ENDIAN)
5245         buf += 2;
5246       md_number_to_chars (buf, value, 2);
5247       break;
5248
5249     case BFD_RELOC_PCREL_LO16:
5250       /* The addend for this is tricky if it is internal, so we just
5251          do everything here rather than in bfd_perform_relocation.  */
5252       if ((fixP->fx_addsy->bsym->flags & BSF_SECTION_SYM) == 0)
5253         value += fixP->fx_frag->fr_address + fixP->fx_where;
5254       buf = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where;
5255       if (byte_order == BIG_ENDIAN)
5256         buf += 2;
5257       md_number_to_chars (buf, value, 2);
5258       break;
5259
5260     case BFD_RELOC_32:
5261       /* If we are deleting this reloc entry, we must fill in the
5262          value now.  This can happen if we have a .word which is not
5263          resolved when it appears but is later defined.  We also need
5264          to fill in the value if this is an embedded PIC switch table
5265          entry.  */
5266       if (fixP->fx_done
5267           || (mips_pic == EMBEDDED_PIC && SWITCH_TABLE (fixP)))
5268         md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5269                             value, 4);
5270       break;
5271
5272     case BFD_RELOC_LO16:
5273       /* When handling an embedded PIC switch statement, we can wind
5274          up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
5275       if (fixP->fx_done)
5276         {
5277           if (value < -0x8000 || value > 0x7fff)
5278             as_bad_where (fixP->fx_file, fixP->fx_line,
5279                           "relocation overflow");
5280           buf = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where;
5281           if (byte_order == BIG_ENDIAN)
5282             buf += 2;
5283           md_number_to_chars (buf, value, 2);
5284         }
5285       break;
5286
5287     case BFD_RELOC_16_PCREL_S2:
5288       /*
5289        * We need to save the bits in the instruction since fixup_segment()
5290        * might be deleting the relocation entry (i.e., a branch within
5291        * the current segment).
5292        */
5293       if (value & 0x3)
5294         as_warn ("Branch to odd address (%lx)", value);
5295       value >>= 2;
5296       if ((value & ~0xFFFF) && (value & ~0xFFFF) != (-1 & ~0xFFFF))
5297         as_bad ("Relocation overflow");
5298
5299       /* update old instruction data */
5300       buf = (unsigned char *) (fixP->fx_where + fixP->fx_frag->fr_literal);
5301       switch (byte_order)
5302         {
5303         case LITTLE_ENDIAN:
5304           insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
5305           break;
5306
5307         case BIG_ENDIAN:
5308           insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
5309           break;
5310
5311         default:
5312           internalError ();
5313           return 0;
5314         }
5315       insn |= value & 0xFFFF;
5316       md_number_to_chars ((char *) buf, (valueT) insn, 4);
5317       break;
5318
5319     default:
5320       internalError ();
5321     }
5322
5323   return 1;
5324 }
5325
5326 #if 0
5327 void
5328 printInsn (oc)
5329      unsigned long oc;
5330 {
5331   const struct mips_opcode *p;
5332   int treg, sreg, dreg, shamt;
5333   short imm;
5334   const char *args;
5335   int i;
5336
5337   for (i = 0; i < NUMOPCODES; ++i)
5338     {
5339       p = &mips_opcodes[i];
5340       if (((oc & p->mask) == p->match) && (p->pinfo != INSN_MACRO))
5341         {
5342           printf ("%08lx %s\t", oc, p->name);
5343           treg = (oc >> 16) & 0x1f;
5344           sreg = (oc >> 21) & 0x1f;
5345           dreg = (oc >> 11) & 0x1f;
5346           shamt = (oc >> 6) & 0x1f;
5347           imm = oc;
5348           for (args = p->args;; ++args)
5349             {
5350               switch (*args)
5351                 {
5352                 case '\0':
5353                   printf ("\n");
5354                   break;
5355
5356                 case ',':
5357                 case '(':
5358                 case ')':
5359                   printf ("%c", *args);
5360                   continue;
5361
5362                 case 'r':
5363                   assert (treg == sreg);
5364                   printf ("$%d,$%d", treg, sreg);
5365                   continue;
5366
5367                 case 'd':
5368                 case 'G':
5369                   printf ("$%d", dreg);
5370                   continue;
5371
5372                 case 't':
5373                 case 'E':
5374                   printf ("$%d", treg);
5375                   continue;
5376
5377                 case 'k':
5378                   printf ("0x%x", treg);
5379                   continue;
5380
5381                 case 'b':
5382                 case 's':
5383                   printf ("$%d", sreg);
5384                   continue;
5385
5386                 case 'a':
5387                   printf ("0x%08lx", oc & 0x1ffffff);
5388                   continue;
5389
5390                 case 'i':
5391                 case 'j':
5392                 case 'o':
5393                 case 'u':
5394                   printf ("%d", imm);
5395                   continue;
5396
5397                 case '<':
5398                 case '>':
5399                   printf ("$%d", shamt);
5400                   continue;
5401
5402                 default:
5403                   internalError ();
5404                 }
5405               break;
5406             }
5407           return;
5408         }
5409     }
5410   printf ("%08lx  UNDEFINED\n", oc);
5411 }
5412 #endif
5413
5414 static symbolS *
5415 get_symbol ()
5416 {
5417   int c;
5418   char *name;
5419   symbolS *p;
5420
5421   name = input_line_pointer;
5422   c = get_symbol_end ();
5423   p = (symbolS *) symbol_find_or_make (name);
5424   *input_line_pointer = c;
5425   return p;
5426 }
5427
5428 /* Align the current frag to a given power of two.  The MIPS assembler
5429    also automatically adjusts any preceding label.  */
5430
5431 static void
5432 mips_align (to, fill, label)
5433      int to;
5434      int fill;
5435      symbolS *label;
5436 {
5437   mips_emit_delays ();
5438   frag_align (to, fill);
5439   record_alignment (now_seg, to);
5440   if (label != NULL)
5441     {
5442       assert (S_GET_SEGMENT (label) == now_seg);
5443       label->sy_frag = frag_now;
5444       S_SET_VALUE (label, (valueT) frag_now_fix ());
5445     }
5446 }
5447
5448 /* Align to a given power of two.  .align 0 turns off the automatic
5449    alignment used by the data creating pseudo-ops.  */
5450
5451 static void
5452 s_align (x)
5453      int x;
5454 {
5455   register int temp;
5456   register long temp_fill;
5457   long max_alignment = 15;
5458
5459   /*
5460
5461     o  Note that the assembler pulls down any immediately preceeding label
5462        to the aligned address.
5463     o  It's not documented but auto alignment is reinstated by
5464        a .align pseudo instruction.
5465     o  Note also that after auto alignment is turned off the mips assembler
5466        issues an error on attempt to assemble an improperly aligned data item.
5467        We don't.
5468
5469     */
5470
5471   temp = get_absolute_expression ();
5472   if (temp > max_alignment)
5473     as_bad ("Alignment too large: %d. assumed.", temp = max_alignment);
5474   else if (temp < 0)
5475     {
5476       as_warn ("Alignment negative: 0 assumed.");
5477       temp = 0;
5478     }
5479   if (*input_line_pointer == ',')
5480     {
5481       input_line_pointer++;
5482       temp_fill = get_absolute_expression ();
5483     }
5484   else
5485     temp_fill = 0;
5486   if (temp)
5487     {
5488       auto_align = 1;
5489       mips_align (temp, (int) temp_fill, insn_label);
5490     }
5491   else
5492     {
5493       auto_align = 0;
5494     }
5495
5496   demand_empty_rest_of_line ();
5497 }
5498
5499 /* Handle .ascii and .asciiz.  This just calls stringer and forgets
5500    that there was a previous instruction.  */
5501
5502 static void
5503 s_stringer (append_zero)
5504      int append_zero;
5505 {
5506   mips_emit_delays ();
5507   insn_label = NULL;
5508   stringer (append_zero);
5509 }
5510
5511 static void
5512 s_change_sec (sec)
5513      int sec;
5514 {
5515 #ifdef GPOPT
5516   segT seg;
5517 #endif
5518
5519   /* When generating embedded PIC code, we only use the .text, .lit8,
5520      .sdata and .sbss sections.  We change the .data and .rdata
5521      pseudo-ops to use .sdata.  */
5522   if (mips_pic == EMBEDDED_PIC
5523       && (sec == 'd' || sec == 'r'))
5524     sec = 's';
5525
5526   mips_emit_delays ();
5527   switch (sec)
5528     {
5529     case 't':
5530       s_text (0);
5531       break;
5532     case 'd':
5533       s_data (0);
5534       break;
5535     case 'b':
5536       subseg_set (bss_section, (subsegT) get_absolute_expression ());
5537       demand_empty_rest_of_line ();
5538       break;
5539
5540     case 'r':
5541       seg = subseg_new (RDATA_SECTION_NAME,
5542                         (subsegT) get_absolute_expression ());
5543 #ifdef OBJ_ELF
5544       bfd_set_section_flags (stdoutput, seg,
5545                              (SEC_ALLOC
5546                               | SEC_LOAD
5547                               | SEC_READONLY
5548                               | SEC_RELOC
5549                               | SEC_DATA));
5550       bfd_set_section_alignment (stdoutput, seg, 4);
5551 #endif
5552       demand_empty_rest_of_line ();
5553       break;
5554
5555     case 's':
5556 #ifdef GPOPT
5557       seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
5558 #ifdef OBJ_ELF
5559       bfd_set_section_flags (stdoutput, seg,
5560                              SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
5561       bfd_set_section_alignment (stdoutput, seg, 4);
5562 #endif
5563       demand_empty_rest_of_line ();
5564       break;
5565 #else /* ! defined (GPOPT) */
5566       as_bad ("Global pointers not supported; recompile -G 0");
5567       demand_empty_rest_of_line ();
5568       return;
5569 #endif /* ! defined (GPOPT) */
5570     }
5571
5572   auto_align = 1;
5573 }
5574
5575 static void
5576 s_cons (log_size)
5577      int log_size;
5578 {
5579   symbolS *label;
5580
5581   label = insn_label;
5582   mips_emit_delays ();
5583   if (log_size > 0 && auto_align)
5584     mips_align (log_size, 0, label);
5585   insn_label = NULL;
5586   cons (1 << log_size);
5587 }
5588
5589 static void
5590 s_err (x)
5591      int x;
5592 {
5593   as_fatal ("Encountered `.err', aborting assembly");
5594 }
5595
5596 static void
5597 s_extern (x)
5598      int x;
5599 {
5600   valueT size;
5601   symbolS *symbolP;
5602
5603   symbolP = get_symbol ();
5604   if (*input_line_pointer == ',')
5605     input_line_pointer++;
5606   size = get_absolute_expression ();
5607   S_SET_EXTERNAL (symbolP);
5608
5609 #ifdef ECOFF_DEBUGGING
5610   symbolP->ecoff_extern_size = size;
5611 #endif
5612 }
5613
5614 static void
5615 s_float_cons (type)
5616      int type;
5617 {
5618   symbolS *label;
5619
5620   label = insn_label;
5621
5622   mips_emit_delays ();
5623
5624   if (auto_align)
5625     if (type == 'd')
5626       mips_align (3, 0, label);
5627     else
5628       mips_align (2, 0, label);
5629
5630   insn_label = NULL;
5631
5632   float_cons (type);
5633 }
5634
5635 static void
5636 s_option (x)
5637      int x;
5638 {
5639   char *opt;
5640   char c;
5641
5642   opt = input_line_pointer;
5643   c = get_symbol_end ();
5644
5645   if (*opt == 'O')
5646     {
5647       /* FIXME: What does this mean?  */
5648     }
5649   else if (strncmp (opt, "pic", 3) == 0)
5650     {
5651       int i;
5652
5653       i = atoi (opt + 3);
5654       if (i == 0)
5655         mips_pic = NO_PIC;
5656       else if (i == 2)
5657         mips_pic = SVR4_PIC;
5658       else
5659         as_bad (".option pic%d not supported", i);
5660
5661 #ifdef GPOPT
5662       if (mips_pic == SVR4_PIC)
5663         {
5664           if (g_switch_seen && g_switch_value != 0)
5665             as_warn ("-G may not be used with SVR4 PIC code");
5666           g_switch_value = 0;
5667           bfd_set_gp_size (stdoutput, 0);
5668         }
5669 #endif
5670     }
5671   else
5672     as_warn ("Unrecognized option \"%s\"", opt);
5673
5674   *input_line_pointer = c;
5675   demand_empty_rest_of_line ();
5676 }
5677
5678 static void
5679 s_mipsset (x)
5680      int x;
5681 {
5682   char *name = input_line_pointer, ch;
5683
5684   while (!is_end_of_line[(unsigned char) *input_line_pointer])
5685     input_line_pointer++;
5686   ch = *input_line_pointer;
5687   *input_line_pointer = '\0';
5688
5689   if (strcmp (name, "reorder") == 0)
5690     {
5691       if (mips_noreorder)
5692         {
5693           prev_insn_unreordered = 1;
5694           prev_prev_insn_unreordered = 1;
5695         }
5696       mips_noreorder = 0;
5697     }
5698   else if (strcmp (name, "noreorder") == 0)
5699     {
5700       mips_emit_delays ();
5701       mips_noreorder = 1;
5702       mips_any_noreorder = 1;
5703     }
5704   else if (strcmp (name, "at") == 0)
5705     {
5706       mips_noat = 0;
5707     }
5708   else if (strcmp (name, "noat") == 0)
5709     {
5710       mips_noat = 1;
5711     }
5712   else if (strcmp (name, "macro") == 0)
5713     {
5714       mips_warn_about_macros = 0;
5715     }
5716   else if (strcmp (name, "nomacro") == 0)
5717     {
5718       if (mips_noreorder == 0)
5719         as_bad ("`noreorder' must be set before `nomacro'");
5720       mips_warn_about_macros = 1;
5721     }
5722   else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
5723     {
5724       mips_nomove = 0;
5725     }
5726   else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
5727     {
5728       mips_nomove = 1;
5729     }
5730   else if (strcmp (name, "bopt") == 0)
5731     {
5732       mips_nobopt = 0;
5733     }
5734   else if (strcmp (name, "nobopt") == 0)
5735     {
5736       mips_nobopt = 1;
5737     }
5738   else if (strncmp (name, "mips", 4) == 0)
5739     {
5740       int isa;
5741
5742       /* Permit the user to change the ISA on the fly.  Needless to
5743          say, misuse can cause serious problems.  */
5744       isa = atoi (name + 4);
5745       if (isa == 0)
5746         mips_isa = file_mips_isa;
5747       else if (isa < 1 || isa > 3)
5748         as_bad ("unknown ISA level");
5749       else
5750         mips_isa = isa;
5751     }
5752   else
5753     {
5754       as_warn ("Tried to set unrecognized symbol: %s\n", name);
5755     }
5756   *input_line_pointer = ch;
5757   demand_empty_rest_of_line ();
5758 }
5759
5760 /* The same as the usual .space directive, except that we have to
5761    forget about any previous instruction.  */
5762
5763 static void
5764 s_mips_space (param)
5765      int param;
5766 {
5767   mips_emit_delays ();
5768   insn_label = NULL;
5769   s_space (param);
5770 }
5771
5772 /* Handle the .abicalls pseudo-op.  I believe this is equivalent to
5773    .option pic2.  It means to generate SVR4 PIC calls.  */
5774
5775 static void
5776 s_abicalls (ignore)
5777      int ignore;
5778 {
5779   mips_pic = SVR4_PIC;
5780 #ifdef GPOPT
5781   if (g_switch_seen && g_switch_value != 0)
5782     as_warn ("-G may not be used with SVR4 PIC code");
5783   g_switch_value = 0;
5784 #endif
5785   bfd_set_gp_size (stdoutput, 0);
5786   demand_empty_rest_of_line ();
5787 }
5788
5789 /* Handle the .cpload pseudo-op.  This is used when generating SVR4
5790    PIC code.  It sets the $gp register for the function based on the
5791    function address, which is in the register named in the argument.
5792    This uses a relocation against _gp_disp, which is handled specially
5793    by the linker.  The result is:
5794         lui     $gp,%hi(_gp_disp)
5795         addiu   $gp,$gp,%lo(_gp_disp)
5796         addu    $gp,$gp,.cpload argument
5797    The .cpload argument is normally $25 == $t9.  */
5798
5799 static void
5800 s_cpload (ignore)
5801      int ignore;
5802 {
5803   expressionS ex;
5804   int icnt = 0;
5805
5806   /* If we are not generating SVR4 PIC code, .cpload is ignored.  */
5807   if (mips_pic != SVR4_PIC)
5808     {
5809       s_ignore (0);
5810       return;
5811     }
5812
5813   /* .cpload should be a in .set noreorder section.  */
5814   if (mips_noreorder == 0)
5815     as_warn (".cpload not in noreorder section");
5816
5817   ex.X_op = O_symbol;
5818   ex.X_add_symbol = symbol_find_or_make ("_gp_disp");
5819   ex.X_op_symbol = NULL;
5820   ex.X_add_number = 0;
5821
5822   macro_build_lui ((char *) NULL, &icnt, &ex, GP);
5823   macro_build ((char *) NULL, &icnt, &ex, "addiu", "t,r,j", GP, GP,
5824                (int) BFD_RELOC_LO16);
5825
5826   macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "addu", "d,v,t",
5827                GP, GP, tc_get_register (0));
5828
5829   demand_empty_rest_of_line ();
5830 }
5831
5832 /* Handle the .cprestore pseudo-op.  This stores $gp into a given
5833    offset from $sp.  The offset is remembered, and after making a PIC
5834    call $gp is restored from that location.  */
5835
5836 static void
5837 s_cprestore (ignore)
5838      int ignore;
5839 {
5840   expressionS ex;
5841   int icnt = 0;
5842
5843   /* If we are not generating SVR4 PIC code, .cprestore is ignored.  */
5844   if (mips_pic != SVR4_PIC)
5845     {
5846       s_ignore (0);
5847       return;
5848     }
5849
5850   mips_cprestore_offset = get_absolute_expression ();
5851
5852   ex.X_op = O_constant;
5853   ex.X_add_symbol = NULL;
5854   ex.X_op_symbol = NULL;
5855   ex.X_add_number = mips_cprestore_offset;
5856
5857   macro_build ((char *) NULL, &icnt, &ex,
5858                mips_isa < 3 ? "sw" : "sd",
5859                "t,o(b)", GP, (int) BFD_RELOC_LO16, SP);
5860
5861   demand_empty_rest_of_line ();
5862 }
5863
5864 /* Handle the .gpword pseudo-op.  This is used when generating PIC
5865    code.  It generates a 32 bit GP relative reloc.  */
5866
5867 static void
5868 s_gpword (ignore)
5869      int ignore;
5870 {
5871   symbolS *label;
5872   expressionS ex;
5873   char *p;
5874
5875   /* When not generating PIC code, this is treated as .word.  */
5876   if (mips_pic != SVR4_PIC)
5877     {
5878       s_cons (2);
5879       return;
5880     }
5881
5882   label = insn_label;
5883   mips_emit_delays ();
5884   if (auto_align)
5885     mips_align (2, 0, label);
5886   insn_label = NULL;
5887
5888   expression (&ex);
5889
5890   if (ex.X_op != O_symbol || ex.X_add_number != 0)
5891     {
5892       as_bad ("Unsupported use of .gpword");
5893       ignore_rest_of_line ();
5894     }
5895
5896   p = frag_more (4);
5897   md_number_to_chars (p, (valueT) 0, 4);
5898   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, 0,
5899                BFD_RELOC_MIPS_GPREL32);
5900
5901   demand_empty_rest_of_line ();
5902 }
5903
5904 /* Handle the .cpadd pseudo-op.  This is used when dealing with switch
5905    tables in SVR4 PIC code.  */
5906
5907 static void
5908 s_cpadd (ignore)
5909      int ignore;
5910 {
5911   int icnt = 0;
5912   int reg;
5913
5914   /* This is ignored when not generating SVR4 PIC code.  */
5915   if (mips_pic != SVR4_PIC)
5916     {
5917       s_ignore (0);
5918       return;
5919     }
5920
5921   /* Add $gp to the register named as an argument.  */
5922   reg = tc_get_register (0);
5923   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5924                mips_isa < 3 ? "addu" : "daddu",
5925                "d,v,t", reg, reg, GP);
5926
5927   demand_empty_rest_of_line ();  
5928 }
5929
5930 /* Parse a register string into a number.  Called from the ECOFF code
5931    to parse .frame.  The argument is non-zero if this is the frame
5932    register, so that we can record it in mips_frame_reg.  */
5933
5934 int
5935 tc_get_register (frame)
5936      int frame;
5937 {
5938   int reg;
5939
5940   SKIP_WHITESPACE ();
5941   if (*input_line_pointer++ != '$')
5942     {
5943       as_warn ("expected `$'");
5944       reg = 0;
5945     }
5946   else if (isdigit ((unsigned char) *input_line_pointer))
5947     {
5948       reg = get_absolute_expression ();
5949       if (reg < 0 || reg >= 32)
5950         {
5951           as_warn ("Bad register number");
5952           reg = 0;
5953         }
5954     }
5955   else
5956     {
5957       if (strncmp (input_line_pointer, "fp", 2) == 0)
5958         reg = FP;
5959       else if (strncmp (input_line_pointer, "sp", 2) == 0)
5960         reg = SP;
5961       else if (strncmp (input_line_pointer, "gp", 2) == 0)
5962         reg = GP;
5963       else if (strncmp (input_line_pointer, "at", 2) == 0)
5964         reg = AT;
5965       else
5966         {
5967           as_warn ("Unrecognized register name");
5968           reg = 0;
5969         }
5970       input_line_pointer += 2;
5971     }
5972   if (frame)
5973     mips_frame_reg = reg != 0 ? reg : SP;
5974   return reg;
5975 }
5976
5977 valueT
5978 md_section_align (seg, addr)
5979      asection *seg;
5980      valueT addr;
5981 {
5982   int align = bfd_get_section_alignment (stdoutput, seg);
5983
5984   return ((addr + (1 << align) - 1) & (-1 << align));
5985 }
5986
5987 /* Estimate the size of a frag before relaxing.  We are not really
5988    relaxing here, and the final size is encoded in the subtype
5989    information.  */
5990
5991 /*ARGSUSED*/
5992 int
5993 md_estimate_size_before_relax (fragp, segtype)
5994      fragS *fragp;
5995      asection *segtype;
5996 {
5997   int change;
5998
5999   if (mips_pic == NO_PIC)
6000     {
6001 #ifdef GPOPT
6002       const char *symname;
6003
6004       /* Find out whether this symbol can be referenced off the GP
6005          register.  It can be if it is smaller than the -G size or if
6006          it is in the .sdata or .sbss section.  Certain symbols can
6007          not be referenced off the GP, although it appears as though
6008          they can.  */
6009       symname = S_GET_NAME (fragp->fr_symbol);
6010       if (symname != (const char *) NULL
6011           && (strcmp (symname, "eprol") == 0
6012               || strcmp (symname, "etext") == 0
6013               || strcmp (symname, "_gp") == 0
6014               || strcmp (symname, "edata") == 0
6015               || strcmp (symname, "_fbss") == 0
6016               || strcmp (symname, "_fdata") == 0
6017               || strcmp (symname, "_ftext") == 0
6018               || strcmp (symname, "end") == 0
6019               || strcmp (symname, "_gp_disp") == 0))
6020         change = 1;
6021       else if (! S_IS_DEFINED (fragp->fr_symbol)
6022                && ((fragp->fr_symbol->ecoff_extern_size != 0
6023                     && fragp->fr_symbol->ecoff_extern_size <= g_switch_value)
6024                    || (S_GET_VALUE (fragp->fr_symbol) != 0
6025                        && S_GET_VALUE (fragp->fr_symbol) <= g_switch_value)))
6026         change = 0;
6027       else
6028         {
6029           const char *segname;
6030
6031           segname = segment_name (S_GET_SEGMENT (fragp->fr_symbol));
6032           assert (strcmp (segname, ".lit8") != 0
6033                   && strcmp (segname, ".lit4") != 0);
6034           change = (strcmp (segname, ".sdata") != 0
6035                     && strcmp (segname, ".sbss") != 0);
6036         }
6037 #else /* ! defined (GPOPT) */
6038       /* We are not optimizing for the GP register.  */
6039       change = 1;
6040 #endif /* ! defined (GPOPT) */  
6041     }
6042   else if (mips_pic == SVR4_PIC)
6043     {
6044       asection *symsec = fragp->fr_symbol->bsym->section;
6045
6046       /* This must duplicate the test in adjust_reloc_syms.  */
6047       change = (symsec != &bfd_und_section
6048                 && symsec != &bfd_abs_section
6049                 && ! bfd_is_com_section (symsec));
6050     }
6051   else
6052     abort ();
6053
6054   if (change)
6055     {
6056       /* Record the offset to the first reloc in the fr_opcode field.
6057          This lets md_convert_frag and tc_gen_reloc know that the code
6058          must be expanded.  */
6059       fragp->fr_opcode = (fragp->fr_literal
6060                           + fragp->fr_fix
6061                           - RELAX_OLD (fragp->fr_subtype)
6062                           + RELAX_RELOC1 (fragp->fr_subtype));
6063       /* FIXME: This really needs as_warn_where.  */
6064       if (RELAX_WARN (fragp->fr_subtype))
6065         as_warn ("AT used after \".set noat\" or macro used after \".set nomacro\"");
6066     }
6067
6068   if (! change)
6069     return 0;
6070   else
6071     return RELAX_NEW (fragp->fr_subtype) - RELAX_OLD (fragp->fr_subtype);
6072 }
6073
6074 /* Translate internal representation of relocation info to BFD target
6075    format.  */
6076
6077 arelent **
6078 tc_gen_reloc (section, fixp)
6079      asection *section;
6080      fixS *fixp;
6081 {
6082   static arelent *retval[4];
6083   arelent *reloc;
6084
6085   reloc = retval[0] = (arelent *) xmalloc (sizeof (arelent));
6086   retval[1] = NULL;
6087
6088   reloc->sym_ptr_ptr = &fixp->fx_addsy->bsym;
6089   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
6090
6091   if (mips_pic == EMBEDDED_PIC
6092       && SWITCH_TABLE (fixp))
6093     {
6094       /* For a switch table entry we use a special reloc.  The addend
6095          is actually the difference between the reloc address and the
6096          subtrahend.  */
6097       reloc->addend = reloc->address - S_GET_VALUE (fixp->fx_subsy);
6098 #ifndef OBJ_ECOFF
6099       as_fatal ("Double check fx_r_type in tc-mips.c:tc_gen_reloc");
6100 #endif
6101       fixp->fx_r_type = BFD_RELOC_GPREL32;
6102     }
6103   else if (fixp->fx_r_type == BFD_RELOC_PCREL_LO16)
6104     {
6105       /* We use a special addend for an internal RELLO reloc.  */
6106       if (fixp->fx_addsy->bsym->flags & BSF_SECTION_SYM)
6107         reloc->addend = reloc->address - S_GET_VALUE (fixp->fx_subsy);
6108       else
6109         reloc->addend = fixp->fx_addnumber + reloc->address;
6110     }
6111   else if (fixp->fx_r_type == BFD_RELOC_PCREL_HI16_S)
6112     {
6113       assert (fixp->fx_next != NULL
6114               && fixp->fx_next->fx_r_type == BFD_RELOC_PCREL_LO16);
6115       /* We use a special addend for an internal RELHI reloc.  The
6116          reloc is relative to the RELLO; adjust the addend
6117          accordingly.  */
6118       if (fixp->fx_addsy->bsym->flags & BSF_SECTION_SYM)
6119         reloc->addend = (fixp->fx_next->fx_frag->fr_address
6120                          + fixp->fx_next->fx_where
6121                          - S_GET_VALUE (fixp->fx_subsy));
6122       else
6123         reloc->addend = (fixp->fx_addnumber
6124                          + fixp->fx_next->fx_frag->fr_address
6125                          + fixp->fx_next->fx_where);
6126     }
6127   else if (fixp->fx_pcrel == 0)
6128     reloc->addend = fixp->fx_addnumber;
6129   else
6130     {
6131 #ifndef OBJ_AOUT
6132       /* A gruesome hack which is a result of the gruesome gas reloc
6133          handling.  */
6134       reloc->addend = reloc->address;
6135 #else
6136       reloc->addend = -reloc->address;
6137 #endif
6138     }
6139
6140   /* If this is a variant frag, we may need to adjust the existing
6141      reloc and generate a new one.  */
6142   if (fixp->fx_frag->fr_opcode != NULL
6143       && (fixp->fx_r_type == BFD_RELOC_MIPS_GPREL
6144           || fixp->fx_r_type == BFD_RELOC_MIPS_GOT16
6145           || fixp->fx_r_type == BFD_RELOC_MIPS_CALL16))
6146     {
6147       arelent *reloc2;
6148
6149       /* If this is not the last reloc in this frag, then we have two
6150          GPREL relocs, both of which are being replaced.  Let the
6151          second one handle all of them.  */
6152       if (fixp->fx_next != NULL
6153           && fixp->fx_frag == fixp->fx_next->fx_frag)
6154         {
6155           assert (fixp->fx_r_type == BFD_RELOC_MIPS_GPREL
6156                   && fixp->fx_next->fx_r_type == BFD_RELOC_MIPS_GPREL);
6157           retval[0] = NULL;
6158           return retval;
6159         }
6160
6161       fixp->fx_where = fixp->fx_frag->fr_opcode - fixp->fx_frag->fr_literal;
6162       reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
6163       reloc2 = retval[1] = (arelent *) xmalloc (sizeof (arelent));
6164       retval[2] = NULL;
6165       reloc2->sym_ptr_ptr = &fixp->fx_addsy->bsym;
6166       reloc2->address = (reloc->address
6167                          + (RELAX_RELOC2 (fixp->fx_frag->fr_subtype)
6168                             - RELAX_RELOC1 (fixp->fx_frag->fr_subtype)));
6169       reloc2->addend = fixp->fx_addnumber;
6170       reloc2->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_LO16);
6171       assert (reloc2->howto != NULL);
6172
6173       if (RELAX_RELOC3 (fixp->fx_frag->fr_subtype))
6174         {
6175           arelent *reloc3;
6176
6177           reloc3 = retval[2] = (arelent *) xmalloc (sizeof (arelent));
6178           retval[3] = NULL;
6179           *reloc3 = *reloc2;
6180           reloc3->address += 4;
6181         }
6182
6183       if (mips_pic == NO_PIC)
6184         {
6185           assert (fixp->fx_r_type == BFD_RELOC_MIPS_GPREL);
6186           fixp->fx_r_type = BFD_RELOC_HI16_S;
6187         }
6188       else if (mips_pic == SVR4_PIC)
6189         {
6190           if (fixp->fx_r_type != BFD_RELOC_MIPS_GOT16)
6191             {
6192               assert (fixp->fx_r_type == BFD_RELOC_MIPS_CALL16);
6193               fixp->fx_r_type = BFD_RELOC_MIPS_GOT16;
6194             }
6195         }
6196       else
6197         abort ();
6198     }
6199
6200   /* To support a PC relative reloc when generating embedded PIC code
6201      for ECOFF, we use a Cygnus extension.  We check for that here to
6202      make sure that we don't let such a reloc escape normally.  */
6203 #ifdef OBJ_ECOFF
6204   if (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2
6205       && mips_pic != EMBEDDED_PIC)
6206     reloc->howto = NULL;
6207   else
6208 #endif
6209     reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
6210
6211   if (reloc->howto == NULL)
6212     {
6213       as_bad_where (fixp->fx_file, fixp->fx_line,
6214                     "Can not represent relocation in this object file format");
6215       retval[0] = NULL;
6216     }
6217
6218   return retval;
6219 }
6220
6221 /* Convert a machine dependent frag.  */
6222
6223 void
6224 md_convert_frag (abfd, asec, fragp)
6225      bfd *abfd;
6226      segT asec;
6227      fragS *fragp;
6228 {
6229   int old, new;
6230   char *fixptr;
6231
6232   if (fragp->fr_opcode == NULL)
6233     return;
6234
6235   old = RELAX_OLD (fragp->fr_subtype);
6236   new = RELAX_NEW (fragp->fr_subtype);
6237   fixptr = fragp->fr_literal + fragp->fr_fix;
6238
6239   if (new > 0)
6240     memcpy (fixptr - old, fixptr, new);
6241
6242   fragp->fr_fix += new - old;
6243 }
6244
6245 /* This function is called whenever a label is defined.  It is used
6246    when handling branch delays; if a branch has a label, we assume we
6247    can not move it.  */
6248
6249 void
6250 mips_define_label (sym)
6251      symbolS *sym;
6252 {
6253   insn_label = sym;
6254 }
6255 \f
6256 #ifdef OBJ_ELF
6257
6258 /* Some special processing for a MIPS ELF file.  */
6259
6260 void
6261 mips_elf_final_processing ()
6262 {
6263   Elf32_RegInfo s;
6264
6265   /* Write out the .reginfo section.  */
6266   s.ri_gprmask = mips_gprmask;
6267   s.ri_cprmask[0] = mips_cprmask[0];
6268   s.ri_cprmask[1] = mips_cprmask[1];
6269   s.ri_cprmask[2] = mips_cprmask[2];
6270   s.ri_cprmask[3] = mips_cprmask[3];
6271   /* The gp_value field is set by the MIPS ELF backend.  */
6272
6273   bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
6274                                    ((Elf32_External_RegInfo *)
6275                                     mips_regmask_frag));
6276
6277   /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
6278      sort of BFD interface for this.  */
6279   if (mips_any_noreorder)
6280     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
6281   if (mips_pic != NO_PIC)
6282     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
6283 }
6284
6285 #endif /* OBJ_ELF */
6286 \f
6287 #ifndef ECOFF_DEBUGGING
6288
6289 /* These functions should really be defined by the object file format,
6290    since they are related to debugging information.  However, this
6291    code has to work for the a.out format, which does not define them,
6292    so we provide simple versions here.  These don't actually generate
6293    any debugging information, but they do simple checking and someday
6294    somebody may make them useful.  */
6295
6296 typedef struct loc
6297 {
6298   struct loc *loc_next;
6299   unsigned long loc_fileno;
6300   unsigned long loc_lineno;
6301   unsigned long loc_offset;
6302   unsigned short loc_delta;
6303   unsigned short loc_count;
6304 #if 0
6305   fragS *loc_frag;
6306 #endif
6307 }
6308 locS;
6309
6310 typedef struct proc
6311   {
6312     struct proc *proc_next;
6313     struct symbol *proc_isym;
6314     struct symbol *proc_end;
6315     unsigned long proc_reg_mask;
6316     unsigned long proc_reg_offset;
6317     unsigned long proc_fpreg_mask;
6318     unsigned long proc_fpreg_offset;
6319     unsigned long proc_frameoffset;
6320     unsigned long proc_framereg;
6321     unsigned long proc_pcreg;
6322     locS *proc_iline;
6323     struct file *proc_file;
6324     int proc_index;
6325   }
6326 procS;
6327
6328 typedef struct file
6329   {
6330     struct file *file_next;
6331     unsigned long file_fileno;
6332     struct symbol *file_symbol;
6333     struct symbol *file_end;
6334     struct proc *file_proc;
6335     int file_numprocs;
6336   }
6337 fileS;
6338
6339 static struct obstack proc_frags;
6340 static procS *proc_lastP;
6341 static procS *proc_rootP;
6342 static int numprocs;
6343
6344 static void
6345 md_obj_begin ()
6346 {
6347   obstack_begin (&proc_frags, 0x2000);
6348 }
6349
6350 static void
6351 md_obj_end ()
6352 {
6353   /* check for premature end, nesting errors, etc */
6354   if (proc_lastP && proc_lastP->proc_end == NULL)
6355     as_warn ("missing `.end' at end of assembly");
6356 }
6357
6358 extern char hex_value[];
6359
6360 static long
6361 get_number ()
6362 {
6363   int negative = 0;
6364   long val = 0;
6365
6366   if (*input_line_pointer == '-')
6367     {
6368       ++input_line_pointer;
6369       negative = 1;
6370     }
6371   if (!isdigit (*input_line_pointer))
6372     as_bad ("Expected simple number.");
6373   if (input_line_pointer[0] == '0')
6374     {
6375       if (input_line_pointer[1] == 'x')
6376         {
6377           input_line_pointer += 2;
6378           while (isxdigit (*input_line_pointer))
6379             {
6380               val <<= 4;
6381               val |= hex_value[(int) *input_line_pointer++];
6382             }
6383           return negative ? -val : val;
6384         }
6385       else
6386         {
6387           ++input_line_pointer;
6388           while (isdigit (*input_line_pointer))
6389             {
6390               val <<= 3;
6391               val |= *input_line_pointer++ - '0';
6392             }
6393           return negative ? -val : val;
6394         }
6395     }
6396   if (!isdigit (*input_line_pointer))
6397     {
6398       printf (" *input_line_pointer == '%c' 0x%02x\n",
6399               *input_line_pointer, *input_line_pointer);
6400       as_warn ("Invalid number");
6401       return -1;
6402     }
6403   while (isdigit (*input_line_pointer))
6404     {
6405       val *= 10;
6406       val += *input_line_pointer++ - '0';
6407     }
6408   return negative ? -val : val;
6409 }
6410
6411 /* The .file directive; just like the usual .file directive, but there
6412    is an initial number which is the ECOFF file index.  */
6413
6414 static void
6415 s_file (x)
6416      int x;
6417 {
6418   int line;
6419
6420   line = get_number ();
6421   s_app_file (0);
6422 }
6423
6424
6425 /* The .end directive.  */
6426
6427 static void
6428 s_mipsend (x)
6429      int x;
6430 {
6431   symbolS *p;
6432
6433   if (!is_end_of_line[(unsigned char) *input_line_pointer])
6434     {
6435       p = get_symbol ();
6436       demand_empty_rest_of_line ();
6437     }
6438   else
6439     p = NULL;
6440   if (now_seg != text_section)
6441     as_warn (".end not in text section");
6442   if (!proc_lastP)
6443     {
6444       as_warn (".end and no .ent seen yet.");
6445       return;
6446     }
6447
6448   if (p != NULL)
6449     {
6450       assert (S_GET_NAME (p));
6451       if (strcmp (S_GET_NAME (p), S_GET_NAME (proc_lastP->proc_isym)))
6452         as_warn (".end symbol does not match .ent symbol.");
6453     }
6454
6455   proc_lastP->proc_end = (symbolS *) 1;
6456 }
6457
6458 /* The .aent and .ent directives.  */
6459
6460 static void
6461 s_ent (aent)
6462      int aent;
6463 {
6464   int number = 0;
6465   procS *procP;
6466   symbolS *symbolP;
6467
6468   symbolP = get_symbol ();
6469   if (*input_line_pointer == ',')
6470     input_line_pointer++;
6471   SKIP_WHITESPACE ();
6472   if (isdigit (*input_line_pointer) || *input_line_pointer == '-')
6473     number = get_number ();
6474   if (now_seg != text_section)
6475     as_warn (".ent or .aent not in text section.");
6476
6477   if (!aent && proc_lastP && proc_lastP->proc_end == NULL)
6478     as_warn ("missing `.end'");
6479
6480   if (!aent)
6481     {
6482       procP = (procS *) obstack_alloc (&proc_frags, sizeof (*procP));
6483       procP->proc_isym = symbolP;
6484       procP->proc_reg_mask = 0;
6485       procP->proc_reg_offset = 0;
6486       procP->proc_fpreg_mask = 0;
6487       procP->proc_fpreg_offset = 0;
6488       procP->proc_frameoffset = 0;
6489       procP->proc_framereg = 0;
6490       procP->proc_pcreg = 0;
6491       procP->proc_end = NULL;
6492       procP->proc_next = NULL;
6493       if (proc_lastP)
6494         proc_lastP->proc_next = procP;
6495       else
6496         proc_rootP = procP;
6497       proc_lastP = procP;
6498       numprocs++;
6499     }
6500   demand_empty_rest_of_line ();
6501 }
6502
6503 /* The .frame directive.  */
6504
6505 #if 0
6506 static void
6507 s_frame (x)
6508      int x;
6509 {
6510   char str[100];
6511   symbolS *symP;
6512   int frame_reg;
6513   int frame_off;
6514   int pcreg;
6515
6516   frame_reg = tc_get_register (1);
6517   if (*input_line_pointer == ',')
6518     input_line_pointer++;
6519   frame_off = get_absolute_expression ();
6520   if (*input_line_pointer == ',')
6521     input_line_pointer++;
6522   pcreg = tc_get_register (0);
6523
6524   /* bob third eye */
6525   assert (proc_rootP);
6526   proc_rootP->proc_framereg = frame_reg;
6527   proc_rootP->proc_frameoffset = frame_off;
6528   proc_rootP->proc_pcreg = pcreg;
6529   /* bob macho .frame */
6530
6531   /* We don't have to write out a frame stab for unoptimized code. */
6532   if (!(frame_reg == FP && frame_off == 0))
6533     {
6534       if (!proc_lastP)
6535         as_warn ("No .ent for .frame to use.");
6536       (void) sprintf (str, "R%d;%d", frame_reg, frame_off);
6537       symP = symbol_new (str, N_VFP, 0, frag_now);
6538       S_SET_TYPE (symP, N_RMASK);
6539       S_SET_OTHER (symP, 0);
6540       S_SET_DESC (symP, 0);
6541       symP->sy_forward = proc_lastP->proc_isym;
6542       /* bob perhaps I should have used pseudo set */
6543     }
6544   demand_empty_rest_of_line ();
6545 }
6546 #endif
6547
6548 /* The .fmask and .mask directives.  */
6549
6550 #if 0
6551 static void
6552 s_mask (reg_type)
6553      char reg_type;
6554 {
6555   char str[100], *strP;
6556   symbolS *symP;
6557   int i;
6558   unsigned int mask;
6559   int off;
6560
6561   mask = get_number ();
6562   if (*input_line_pointer == ',')
6563     input_line_pointer++;
6564   off = get_absolute_expression ();
6565
6566   /* bob only for coff */
6567   assert (proc_rootP);
6568   if (reg_type == 'F')
6569     {
6570       proc_rootP->proc_fpreg_mask = mask;
6571       proc_rootP->proc_fpreg_offset = off;
6572     }
6573   else
6574     {
6575       proc_rootP->proc_reg_mask = mask;
6576       proc_rootP->proc_reg_offset = off;
6577     }
6578
6579   /* bob macho .mask + .fmask */
6580
6581   /* We don't have to write out a mask stab if no saved regs. */
6582   if (!(mask == 0))
6583     {
6584       if (!proc_lastP)
6585         as_warn ("No .ent for .mask to use.");
6586       strP = str;
6587       for (i = 0; i < 32; i++)
6588         {
6589           if (mask % 2)
6590             {
6591               sprintf (strP, "%c%d,", reg_type, i);
6592               strP += strlen (strP);
6593             }
6594           mask /= 2;
6595         }
6596       sprintf (strP, ";%d,", off);
6597       symP = symbol_new (str, N_RMASK, 0, frag_now);
6598       S_SET_TYPE (symP, N_RMASK);
6599       S_SET_OTHER (symP, 0);
6600       S_SET_DESC (symP, 0);
6601       symP->sy_forward = proc_lastP->proc_isym;
6602       /* bob perhaps I should have used pseudo set */
6603     }
6604 }
6605 #endif
6606
6607 /* The .loc directive.  */
6608
6609 #if 0
6610 static void
6611 s_loc (x)
6612      int x;
6613 {
6614   symbolS *symbolP;
6615   int lineno;
6616   int addroff;
6617
6618   assert (now_seg == text_section);
6619
6620   lineno = get_number ();
6621   addroff = obstack_next_free (&frags) - frag_now->fr_literal;
6622
6623   symbolP = symbol_new ("", N_SLINE, addroff, frag_now);
6624   S_SET_TYPE (symbolP, N_SLINE);
6625   S_SET_OTHER (symbolP, 0);
6626   S_SET_DESC (symbolP, lineno);
6627   symbolP->sy_segment = now_seg;
6628 }
6629 #endif
6630
6631 #endif /* ! defined (ECOFF_DEBUGGING) */
This page took 0.428641 seconds and 2 git commands to generate.