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