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