* config/tc-mips.c (macro_build): Handle '>' case (shift amount
[binutils-gdb.git] / gas / config / tc-mips.c
1 /* tc-mips.c -- assemble code for a MIPS chip.
2 Copyright (C) 1993 Free Software Foundation, Inc.
3 Contributed by the OSF and Ralph Campbell.
4 Written by Keith Knowles and Ralph Campbell, working independently.
5 Modified for ECOFF and R4000 support by Ian Lance Taylor of Cygnus
6 Support.
7
8 This file is part of GAS.
9
10 GAS is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2, or (at your option)
13 any later version.
14
15 GAS is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with GAS; see the file COPYING. If not, write to
22 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
23
24 #include "as.h"
25 #include "config.h"
26
27 #include <ctype.h>
28
29 #ifndef __STDC__
30 #ifndef NO_STDARG
31 #define NO_STDARG
32 #endif
33 #endif
34
35 #ifndef NO_STDARG
36 #include <stdarg.h>
37 #else
38 #ifndef NO_VARARGS
39 #include <varargs.h>
40 #endif /* NO_VARARGS */
41 #endif /* NO_STDARG */
42
43 #include "opcode/mips.h"
44
45 #ifdef OBJ_ELF
46 #include "elf/mips.h"
47
48 static char *mips_regmask_frag;
49 #endif
50
51 #define AT 1
52 #define GP 28
53 #define RA 31
54
55 /* Decide whether to do GP reference optimizations based on the object
56 file format. */
57 #undef GPOPT
58 #ifdef OBJ_ECOFF
59 #define GPOPT
60 #endif
61 #ifdef OBJ_ELF
62 #define GPOPT
63 #endif
64
65 /* These variables are filled in with the masks of registers used.
66 The object format code reads them and puts them in the appropriate
67 place. */
68 unsigned long mips_gprmask;
69 unsigned long mips_cprmask[4];
70
71 /* MIPS ISA (Instruction Set Architecture) level. */
72 static int mips_isa = -1;
73
74 static int mips_warn_about_macros;
75 static int mips_noreorder;
76 static int mips_nomove;
77 static int mips_noat;
78 static int mips_nobopt;
79
80 #ifdef GPOPT
81 /* The size of the small data section. */
82 static int g_switch_value = 8;
83 #endif
84
85 #define N_RMASK 0xc4
86 #define N_VFP 0xd4
87
88 /* handle of the OPCODE hash table */
89 static struct hash_control *op_hash = NULL;
90
91 /* This array holds the chars that always start a comment. If the
92 pre-processor is disabled, these aren't very useful */
93 const char comment_chars[] = "#";
94
95 /* This array holds the chars that only start a comment at the beginning of
96 a line. If the line seems to have the form '# 123 filename'
97 .line and .file directives will appear in the pre-processed output */
98 /* Note that input_file.c hand checks for '#' at the beginning of the
99 first line of the input file. This is because the compiler outputs
100 #NO_APP at the beginning of its output. */
101 /* Also note that C style comments are always supported. */
102 const char line_comment_chars[] = "#";
103
104 /* This array holds machine specific line separator characters. */
105 const char line_separator_chars[] = "";
106
107 /* Chars that can be used to separate mant from exp in floating point nums */
108 const char EXP_CHARS[] = "eE";
109
110 /* Chars that mean this number is a floating point constant */
111 /* As in 0f12.456 */
112 /* or 0d1.2345e12 */
113 const char FLT_CHARS[] = "rRsSfFdDxXpP";
114
115 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
116 changed in read.c . Ideally it shouldn't have to know about it at all,
117 but nothing is ideal around here.
118 */
119
120 static char *insn_error;
121
122 static int byte_order = BYTE_ORDER;
123
124 static int auto_align = 1;
125
126 /* Symbol labelling the current insn. */
127 static symbolS *insn_label;
128
129 /* To output NOP instructions correctly, we need to keep information
130 about the previous two instructions. */
131
132 /* Whether we are optimizing. The default value of 2 means to remove
133 unneeded NOPs and swap branch instructions when possible. A value
134 of 1 means to not swap branches. A value of 0 means to always
135 insert NOPs. */
136 static int mips_optimize = 2;
137
138 /* The previous instruction. */
139 static struct mips_cl_insn prev_insn;
140
141 /* The instruction before prev_insn. */
142 static struct mips_cl_insn prev_prev_insn;
143
144 /* If we don't want information for prev_insn or prev_prev_insn, we
145 point the insn_mo field at this dummy integer. */
146 static const struct mips_opcode dummy_opcode = { 0 };
147
148 /* Non-zero if prev_insn is valid. */
149 static int prev_insn_valid;
150
151 /* The frag for the previous instruction. */
152 static struct frag *prev_insn_frag;
153
154 /* The offset into prev_insn_frag for the previous instruction. */
155 static long prev_insn_where;
156
157 /* The reloc for the previous instruction, if any. */
158 static fixS *prev_insn_fixp;
159
160 /* Non-zero if the previous instruction was in a delay slot. */
161 static int prev_insn_is_delay_slot;
162
163 /* Non-zero if the previous instruction was in a .set noreorder. */
164 static int prev_insn_unreordered;
165
166 /* Non-zero if the previous previous instruction was in a .set
167 noreorder. */
168 static int prev_prev_insn_unreordered;
169 \f
170 /* Prototypes for static functions. */
171
172 #ifdef __STDC__
173 #define internalError() \
174 as_fatal ("internal Error, line %d, %s", __LINE__, __FILE__)
175 #else
176 #define internalError() as_fatal ("MIPS internal Error");
177 #endif
178
179 static int insn_uses_reg PARAMS ((struct mips_cl_insn *ip,
180 unsigned int reg, int fpr));
181 static void append_insn PARAMS ((struct mips_cl_insn * ip,
182 expressionS * p,
183 bfd_reloc_code_real_type r));
184 static void mips_no_prev_insn PARAMS ((void));
185 static void mips_emit_delays PARAMS ((void));
186 static int gp_reference PARAMS ((expressionS * ep));
187 static void macro_build PARAMS ((int *counter, expressionS * ep,
188 const char *name, const char *fmt,
189 ...));
190 static void macro_build_lui PARAMS ((int *counter, expressionS * ep,
191 int regnum));
192 static void set_at PARAMS ((int *counter, int reg, int unsignedp));
193 static void check_absolute_expr PARAMS ((struct mips_cl_insn * ip,
194 expressionS *));
195 static void load_register PARAMS ((int *counter,
196 int reg, expressionS * ep));
197 static void macro PARAMS ((struct mips_cl_insn * ip));
198 static void mips_ip PARAMS ((char *str, struct mips_cl_insn * ip));
199 static int my_getSmallExpression PARAMS ((expressionS * ep, char *str));
200 static void my_getExpression PARAMS ((expressionS * ep, char *str));
201 static symbolS *get_symbol PARAMS ((void));
202 static void mips_align PARAMS ((int to, int fill));
203 static void s_align PARAMS ((int));
204 static void s_stringer PARAMS ((int));
205 static void s_change_sec PARAMS ((int));
206 static void s_cons PARAMS ((int));
207 static void s_err PARAMS ((int));
208 static void s_extern PARAMS ((int));
209 static void s_float_cons PARAMS ((int));
210 static void s_option PARAMS ((int));
211 static void s_mipsset PARAMS ((int));
212 static void s_mips_space PARAMS ((int));
213 #ifndef OBJ_ECOFF
214 static void md_obj_begin PARAMS ((void));
215 static void md_obj_end PARAMS ((void));
216 static long get_number PARAMS ((void));
217 static void s_ent PARAMS ((int));
218 static void s_mipsend PARAMS ((int));
219 static void s_file PARAMS ((int));
220 #if 0
221 static void s_frame PARAMS ((int));
222 static void s_loc PARAMS ((int));
223 static void s_mask PARAMS ((char));
224 #endif
225 #endif
226 \f
227 /* Pseudo-op table.
228
229 The following pseudo-ops from the Kane and Heinrich MIPS book
230 should be defined here, but are currently unsupported: .alias,
231 .galive, .gjaldef, .gjrlive, .livereg, .noalias.
232
233 The following pseudo-ops from the Kane and Heinrich MIPS book are
234 specific to the type of debugging information being generated, and
235 should be defined by the object format: .aent, .begin, .bend,
236 .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
237 .vreg.
238
239 The following pseudo-ops from the Kane and Heinrich MIPS book are
240 not MIPS CPU specific, but are also not specific to the object file
241 format. This file is probably the best place to define them, but
242 they are not currently supported: .asm0, .endr, .lab, .repeat,
243 .struct, .weakext. */
244
245 const pseudo_typeS md_pseudo_table[] =
246 {
247 /* MIPS specific pseudo-ops. */
248 {"option", s_option, 0},
249 {"set", s_mipsset, 0},
250 {"rdata", s_change_sec, 'r'},
251 {"sdata", s_change_sec, 's'},
252 {"livereg", s_ignore, 0},
253
254 /* Relatively generic pseudo-ops that happen to be used on MIPS
255 chips. */
256 {"asciiz", s_stringer, 1},
257 {"bss", s_change_sec, 'b'},
258 {"err", s_err, 0},
259 {"half", s_cons, 1},
260 {"dword", s_cons, 3},
261
262 /* These pseudo-ops are defined in read.c, but must be overridden
263 here for one reason or another. */
264 {"align", s_align, 0},
265 {"ascii", s_stringer, 0},
266 {"asciz", s_stringer, 1},
267 {"byte", s_cons, 0},
268 {"data", s_change_sec, 'd'},
269 {"double", s_float_cons, 'd'},
270 {"extern", s_extern, 0},
271 {"float", s_float_cons, 'f'},
272 {"space", s_mips_space, 0},
273 {"text", s_change_sec, 't'},
274 {"word", s_cons, 2},
275
276 #ifndef OBJ_ECOFF
277 /* These pseudo-ops should be defined by the object file format.
278 However, ECOFF is the only format which currently defines them,
279 so we have versions here for a.out. */
280 {"aent", s_ent, 1},
281 {"end", s_mipsend, 0},
282 {"ent", s_ent, 0},
283 {"file", s_file, 0},
284 {"fmask", s_ignore, 'F'},
285 {"frame", s_ignore, 0},
286 {"loc", s_ignore, 0},
287 {"mask", s_ignore, 'R'},
288 {"verstamp", s_ignore, 0},
289 #endif
290
291 /* Sentinel. */
292 {NULL}
293 };
294 \f
295 const relax_typeS md_relax_table[] =
296 {
297 { 0 }
298 };
299
300
301 static char *expr_end;
302
303 static expressionS imm_expr;
304 static expressionS offset_expr;
305 static bfd_reloc_code_real_type imm_reloc;
306 static bfd_reloc_code_real_type offset_reloc;
307
308 /* FIXME: This should be handled in a different way. */
309 extern int target_big_endian;
310
311 /*
312 * This function is called once, at assembler startup time. It should
313 * set up all the tables, etc. that the MD part of the assembler will need.
314 */
315 void
316 md_begin ()
317 {
318 boolean ok;
319 register const char *retval = NULL;
320 register unsigned int i = 0;
321
322 if (mips_isa == -1)
323 {
324 if (strcmp (TARGET_CPU, "mips") == 0)
325 mips_isa = 1;
326 else if (strcmp (TARGET_CPU, "r6000") == 0
327 || strcmp (TARGET_CPU, "mips2") == 0)
328 mips_isa = 2;
329 else if (strcmp (TARGET_CPU, "mips64") == 0
330 || strcmp (TARGET_CPU, "r4000") == 0
331 || strcmp (TARGET_CPU, "mips3") == 0)
332 mips_isa = 3;
333 else
334 mips_isa = 1;
335 }
336
337 switch (mips_isa)
338 {
339 case 1:
340 ok = bfd_set_arch_mach (stdoutput, bfd_arch_mips, 3000);
341 break;
342 case 2:
343 ok = bfd_set_arch_mach (stdoutput, bfd_arch_mips, 6000);
344 break;
345 case 3:
346 ok = bfd_set_arch_mach (stdoutput, bfd_arch_mips, 4000);
347 break;
348 }
349 if (! ok)
350 as_warn ("Could not set architecture and machine");
351
352 if ((op_hash = hash_new ()) == NULL)
353 {
354 as_fatal ("Virtual memory exhausted");
355 }
356 for (i = 0; i < NUMOPCODES;)
357 {
358 const char *name = mips_opcodes[i].name;
359
360 retval = hash_insert (op_hash, name, (PTR) &mips_opcodes[i]);
361 if (retval != NULL)
362 {
363 fprintf (stderr, "internal error: can't hash `%s': %s\n",
364 mips_opcodes[i].name, retval);
365 as_fatal ("Broken assembler. No assembly attempted.");
366 }
367 do
368 {
369 if (mips_opcodes[i].pinfo != INSN_MACRO
370 && ((mips_opcodes[i].match & mips_opcodes[i].mask)
371 != mips_opcodes[i].match))
372 {
373 fprintf (stderr, "internal error: bad opcode: `%s' \"%s\"\n",
374 mips_opcodes[i].name, mips_opcodes[i].args);
375 as_fatal ("Broken assembler. No assembly attempted.");
376 }
377 ++i;
378 }
379 while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
380 }
381
382 mips_no_prev_insn ();
383
384 mips_gprmask = 0;
385 mips_cprmask[0] = 0;
386 mips_cprmask[1] = 0;
387 mips_cprmask[2] = 0;
388 mips_cprmask[3] = 0;
389
390 /* set the default alignment for the text section (2**2) */
391 record_alignment (text_section, 2);
392
393 /* FIXME: This should be handled in a different way. */
394 target_big_endian = byte_order == BIG_ENDIAN;
395
396 #ifdef GPOPT
397 bfd_set_gp_size (stdoutput, g_switch_value);
398 #endif
399
400 #ifdef OBJ_ELF
401 /* Create a .reginfo section for register masks. */
402 {
403 segT seg;
404 subsegT subseg;
405 segT regsec;
406
407 seg = now_seg;
408 subseg = now_subseg;
409 regsec = subseg_new (".reginfo", (subsegT) 0);
410
411 /* I don't know why this section should be loaded, but the ABI
412 says that SHF_ALLOC should be set. */
413 bfd_set_section_flags (stdoutput, regsec,
414 SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA);
415
416 mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
417
418 subseg_set (seg, subseg);
419 }
420 #endif /* OBJ_ELF */
421
422 #ifndef OBJ_ECOFF
423 md_obj_begin ();
424 #endif
425 }
426
427 void
428 md_end ()
429 {
430 #ifndef OBJ_ECOFF
431 md_obj_end ();
432 #endif
433 }
434
435 void
436 md_assemble (str)
437 char *str;
438 {
439 struct mips_cl_insn insn;
440
441 imm_expr.X_op = O_absent;
442 offset_expr.X_op = O_absent;
443
444 mips_ip (str, &insn);
445 if (insn_error)
446 {
447 as_bad ("%s `%s'", insn_error, str);
448 return;
449 }
450 if (insn.insn_mo->pinfo == INSN_MACRO)
451 {
452 macro (&insn);
453 }
454 else
455 {
456 if (imm_expr.X_op != O_absent)
457 append_insn (&insn, &imm_expr, imm_reloc);
458 else if (offset_expr.X_op != O_absent)
459 append_insn (&insn, &offset_expr, offset_reloc);
460 else
461 append_insn (&insn, NULL, BFD_RELOC_UNUSED);
462 }
463 }
464
465 /* See whether instruction IP reads register REG. If FPR is non-zero,
466 REG is a floating point register. */
467
468 static int
469 insn_uses_reg (ip, reg, fpr)
470 struct mips_cl_insn *ip;
471 unsigned int reg;
472 int fpr;
473 {
474 /* Don't report on general register 0, since it never changes. */
475 if (! fpr && reg == 0)
476 return 0;
477
478 if (fpr)
479 {
480 /* If we are called with either $f0 or $f1, we must check $f0.
481 This is not optimal, because it will introduce an unnecessary
482 NOP between "lwc1 $f0" and "swc1 $f1". To fix this we would
483 need to distinguish reading both $f0 and $f1 or just one of
484 them. Note that we don't have to check the other way,
485 because there is no instruction that sets both $f0 and $f1
486 and requires a delay. */
487 if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
488 && (((ip->insn_opcode >> OP_SH_FS) & OP_MASK_FS)
489 == (reg &~ (unsigned) 1)))
490 return 1;
491 if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
492 && (((ip->insn_opcode >> OP_SH_FT) & OP_MASK_FT)
493 == (reg &~ (unsigned) 1)))
494 return 1;
495 }
496 else
497 {
498 if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
499 && ((ip->insn_opcode >> OP_SH_RS) & OP_MASK_RS) == reg)
500 return 1;
501 if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
502 && ((ip->insn_opcode >> OP_SH_RT) & OP_MASK_RT) == reg)
503 return 1;
504 }
505
506 return 0;
507 }
508
509 #define ALIGN_ERR "Attempt to assemble instruction onto non word boundary."
510 #define ALIGN_ERR2 "GAS doesn't do implicit alignment; use .align directive."
511
512 /*
513 * append insn
514 * Output an instruction.
515 */
516 static void
517 append_insn (ip, address_expr, reloc_type)
518 struct mips_cl_insn *ip;
519 expressionS *address_expr;
520 bfd_reloc_code_real_type reloc_type;
521 {
522 register unsigned long prev_pinfo, pinfo;
523 char *f;
524 fixS *fixp;
525 int nops = 0;
526
527 prev_pinfo = prev_insn.insn_mo->pinfo;
528 pinfo = ip->insn_mo->pinfo;
529
530 if (! mips_noreorder)
531 {
532 /* If the previous insn required any delay slots, see if we need
533 to insert a NOP or two. There are eight kinds of possible
534 hazards, of which an instruction can have at most one type.
535 (1) a load from memory delay
536 (2) a load from a coprocessor delay
537 (3) an unconditional branch delay
538 (4) a conditional branch delay
539 (5) a move to coprocessor register delay
540 (6) a load coprocessor register from memory delay
541 (7) a coprocessor condition code delay
542 (8) a HI/LO special register delay
543
544 There are a lot of optimizations we could do that we don't.
545 In particular, we do not, in general, reorder instructions.
546 If you use gcc with optimization, it will reorder
547 instructions and generally do much more optimization then we
548 do here; repeating all that work in the assembler would only
549 benefit hand written assembly code, and does not seem worth
550 it. */
551
552 /* This is how a NOP is emitted. */
553 #define emit_nop() md_number_to_chars (frag_more (4), 0, 4)
554
555 /* The previous insn might require a delay slot, depending upon
556 the contents of the current insn. */
557 if ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
558 || (mips_isa < 2
559 && (prev_pinfo & INSN_LOAD_MEMORY_DELAY)))
560 {
561 /* A load from a coprocessor or from memory. All load
562 delays delay the use of general register rt for one
563 instruction on the r3000. The r6000 and r4000 use
564 interlocks. */
565 know (prev_pinfo & INSN_WRITE_GPR_T);
566 if (mips_optimize == 0
567 || insn_uses_reg (ip,
568 ((prev_insn.insn_opcode >> OP_SH_RT)
569 & OP_MASK_RT),
570 0))
571 ++nops;
572 }
573 else if ((prev_pinfo & INSN_COPROC_MOVE_DELAY)
574 || (mips_isa < 2
575 && (prev_pinfo & INSN_COPROC_MEMORY_DELAY)))
576 {
577 /* A generic coprocessor delay. The previous instruction
578 modified a coprocessor general or control register. If
579 it modified a control register, we need to avoid any
580 coprocessor instruction (this is probably not always
581 required, but it sometimes is). If it modified a general
582 register, we avoid using that register.
583
584 On the r6000 and r4000 loading a coprocessor register
585 from memory is interlocked, and does not require a delay.
586
587 This case is not handled very well. There is no special
588 knowledge of CP0 handling, and the coprocessors other
589 than the floating point unit are not distinguished at
590 all. */
591 if (prev_pinfo & INSN_WRITE_FPR_T)
592 {
593 if (mips_optimize == 0
594 || insn_uses_reg (ip,
595 ((prev_insn.insn_opcode >> OP_SH_FT)
596 & OP_MASK_FT),
597 1))
598 ++nops;
599 }
600 else if (prev_pinfo & INSN_WRITE_FPR_S)
601 {
602 if (mips_optimize == 0
603 || insn_uses_reg (ip,
604 ((prev_insn.insn_opcode >> OP_SH_FS)
605 & OP_MASK_FS),
606 1))
607 ++nops;
608 }
609 else
610 {
611 /* We don't know exactly what the previous instruction
612 does. If the current instruction uses a coprocessor
613 register, we must insert a NOP. If previous
614 instruction may set the condition codes, and the
615 current instruction uses them, we must insert two
616 NOPS. */
617 if (mips_optimize == 0
618 || ((prev_pinfo & INSN_WRITE_COND_CODE)
619 && (pinfo & INSN_READ_COND_CODE)))
620 nops += 2;
621 else if (pinfo & INSN_COP)
622 ++nops;
623 }
624 }
625 else if (prev_pinfo & INSN_WRITE_COND_CODE)
626 {
627 /* The previous instruction sets the coprocessor condition
628 codes, but does not require a general coprocessor delay
629 (this means it is a floating point comparison
630 instruction). If this instruction uses the condition
631 codes, we need to insert a single NOP. */
632 if (mips_optimize == 0
633 || (pinfo & INSN_READ_COND_CODE))
634 ++nops;
635 }
636 else if (prev_pinfo & INSN_READ_LO)
637 {
638 /* The previous instruction reads the LO register; if the
639 current instruction writes to the LO register, we must
640 insert two NOPS. */
641 if (mips_optimize == 0
642 || (pinfo & INSN_WRITE_LO))
643 nops += 2;
644 }
645 else if (prev_insn.insn_mo->pinfo & INSN_READ_HI)
646 {
647 /* The previous instruction reads the HI register; if the
648 current instruction writes to the HI register, we must
649 insert a NOP. */
650 if (mips_optimize == 0
651 || (pinfo & INSN_WRITE_HI))
652 nops += 2;
653 }
654
655 /* There are two cases which require two intervening
656 instructions: 1) setting the condition codes using a move to
657 coprocessor instruction which requires a general coprocessor
658 delay and then reading the condition codes 2) reading the HI
659 or LO register and then writing to it. If we are not already
660 emitting a NOP instruction, we must check for these cases
661 compared to the instruction previous to the previous
662 instruction. */
663 if (nops == 0
664 && (((prev_prev_insn.insn_mo->pinfo & INSN_COPROC_MOVE_DELAY)
665 && (prev_prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE)
666 && (pinfo & INSN_READ_COND_CODE))
667 || ((prev_prev_insn.insn_mo->pinfo & INSN_READ_LO)
668 && (pinfo & INSN_WRITE_LO))
669 || ((prev_prev_insn.insn_mo->pinfo & INSN_READ_HI)
670 && (pinfo & INSN_WRITE_HI))))
671 ++nops;
672
673 /* Now emit the right number of NOP instructions. */
674 if (nops > 0)
675 {
676 emit_nop ();
677 if (nops > 1)
678 emit_nop ();
679 if (insn_label != NULL)
680 {
681 assert (S_GET_SEGMENT (insn_label) == now_seg);
682 insn_label->sy_frag = frag_now;
683 S_SET_VALUE (insn_label, (valueT) frag_now_fix ());
684 }
685 }
686 }
687
688 f = frag_more (4);
689 #if 0
690 /* This is testing the address of the frag, not the alignment of
691 the instruction in the current section. */
692 if ((int) f & 3)
693 {
694 as_bad (ALIGN_ERR);
695 as_bad (ALIGN_ERR2);
696 }
697 #endif
698 fixp = NULL;
699 if (address_expr != NULL)
700 {
701 if (address_expr->X_op == O_constant)
702 {
703 switch (reloc_type)
704 {
705 case BFD_RELOC_32:
706 ip->insn_opcode |= address_expr->X_add_number;
707 break;
708
709 case BFD_RELOC_LO16:
710 ip->insn_opcode |= address_expr->X_add_number & 0xffff;
711 break;
712
713 case BFD_RELOC_MIPS_JMP:
714 case BFD_RELOC_16_PCREL_S2:
715 goto need_reloc;
716
717 default:
718 internalError ();
719 }
720 }
721 else
722 {
723 assert (reloc_type != BFD_RELOC_UNUSED);
724 need_reloc:
725 fixp = fix_new_exp (frag_now, f - frag_now->fr_literal, 4,
726 address_expr,
727 reloc_type == BFD_RELOC_16_PCREL_S2,
728 reloc_type);
729 }
730 }
731
732 md_number_to_chars (f, ip->insn_opcode, 4);
733
734 /* Update the register mask information. */
735 if (pinfo & INSN_WRITE_GPR_D)
736 mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD);
737 if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
738 mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RT) & OP_MASK_RT);
739 if (pinfo & INSN_READ_GPR_S)
740 mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RS) & OP_MASK_RS);
741 if (pinfo & INSN_WRITE_GPR_31)
742 mips_gprmask |= 1 << 31;
743 if (pinfo & INSN_WRITE_FPR_D)
744 mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FD) & OP_MASK_FD);
745 if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
746 mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FS) & OP_MASK_FS);
747 if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
748 mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FT) & OP_MASK_FT);
749 if (pinfo & INSN_COP)
750 {
751 /* We don't keep enough information to sort these cases out. */
752 }
753 /* Never set the bit for $0, which is always zero. */
754 mips_gprmask &=~ 1 << 0;
755
756 if (! mips_noreorder)
757 {
758 /* Filling the branch delay slot is more complex. We try to
759 switch the branch with the previous instruction, which we can
760 do if the previous instruction does not set up a condition
761 that the branch tests and if the branch is not itself the
762 target of any branch. */
763 if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
764 || (pinfo & INSN_COND_BRANCH_DELAY))
765 {
766 if (mips_optimize < 2
767 /* If we have seen .set nobopt, don't optimize. */
768 || mips_nobopt != 0
769 /* If we have seen .set volatile or .set nomove, don't
770 optimize. */
771 || mips_nomove != 0
772 /* If we had to emit any NOP instructions, then we
773 already know we can not swap. */
774 || nops != 0
775 /* If we don't even know the previous insn, we can not
776 swap. */
777 || ! prev_insn_valid
778 /* If the previous insn is already in a branch delay
779 slot, then we can not swap. */
780 || prev_insn_is_delay_slot
781 /* If the previous previous insn was in a .set
782 noreorder, we can't swap. Actually, the MIPS
783 assembler will swap in this situation. However, gcc
784 configured -with-gnu-as will generate code like
785 .set noreorder
786 lw $4,XXX
787 .set reorder
788 INSN
789 bne $4,$0,foo
790 in which we can not swap the bne and INSN. If gcc is
791 not configured -with-gnu-as, it does not output the
792 .set pseudo-ops. We don't have to check
793 prev_insn_unreordered, because prev_insn_valid will
794 be 0 in that case. We don't want to use
795 prev_prev_insn_valid, because we do want to be able
796 to swap at the start of a function. */
797 || prev_prev_insn_unreordered
798 /* If the branch is itself the target of a branch, we
799 can not swap. We cheat on this; all we check for is
800 whether there is a label on this instruction. If
801 there are any branches to anything other than a
802 label, users must use .set noreorder. */
803 || insn_label != NULL
804 /* If the branch reads the condition codes, we don't
805 even try to swap, because in the sequence
806 ctc1 $X,$31
807 INSN
808 INSN
809 bc1t LABEL
810 we can not swap, and I don't feel like handling that
811 case. */
812 || (pinfo & INSN_READ_COND_CODE)
813 /* We can not swap with an instruction that requires a
814 delay slot, becase the target of the branch might
815 interfere with that instruction. */
816 || (prev_pinfo
817 & (INSN_LOAD_COPROC_DELAY
818 | INSN_COPROC_MOVE_DELAY
819 | INSN_WRITE_COND_CODE
820 | INSN_READ_LO
821 | INSN_READ_HI))
822 || (mips_isa < 2
823 && (prev_pinfo
824 & (INSN_LOAD_MEMORY_DELAY
825 | INSN_COPROC_MEMORY_DELAY)))
826 /* We can not swap with a branch instruction. */
827 || (prev_pinfo
828 & (INSN_UNCOND_BRANCH_DELAY
829 | INSN_COND_BRANCH_DELAY
830 | INSN_COND_BRANCH_LIKELY))
831 /* We do not swap with a trap instruction, since it
832 complicates trap handlers to have the trap
833 instruction be in a delay slot. */
834 || (prev_pinfo & INSN_TRAP)
835 /* If the branch reads a register that the previous
836 instruction sets, we can not swap. */
837 || ((prev_pinfo & INSN_WRITE_GPR_T)
838 && insn_uses_reg (ip,
839 ((prev_insn.insn_opcode >> OP_SH_RT)
840 & OP_MASK_RT),
841 0))
842 || ((prev_pinfo & INSN_WRITE_GPR_D)
843 && insn_uses_reg (ip,
844 ((prev_insn.insn_opcode >> OP_SH_RD)
845 & OP_MASK_RD),
846 0))
847 /* If the branch writes a register that the previous
848 instruction sets, we can not swap (we know that
849 branches write only to RD or to $31). */
850 || ((prev_pinfo & INSN_WRITE_GPR_T)
851 && (((pinfo & INSN_WRITE_GPR_D)
852 && (((prev_insn.insn_opcode >> OP_SH_RT) & OP_MASK_RT)
853 == ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD)))
854 || ((pinfo & INSN_WRITE_GPR_31)
855 && (((prev_insn.insn_opcode >> OP_SH_RT)
856 & OP_MASK_RT)
857 == 31))))
858 || ((prev_pinfo & INSN_WRITE_GPR_D)
859 && (((pinfo & INSN_WRITE_GPR_D)
860 && (((prev_insn.insn_opcode >> OP_SH_RD) & OP_MASK_RD)
861 == ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD)))
862 || ((pinfo & INSN_WRITE_GPR_31)
863 && (((prev_insn.insn_opcode >> OP_SH_RD)
864 & OP_MASK_RD)
865 == 31))))
866 /* If the branch writes a register that the previous
867 instruction reads, we can not swap (we know that
868 branches only write to RD or to $31). */
869 || ((pinfo & INSN_WRITE_GPR_D)
870 && insn_uses_reg (&prev_insn,
871 ((ip->insn_opcode >> OP_SH_RD)
872 & OP_MASK_RD),
873 0))
874 || ((pinfo & INSN_WRITE_GPR_31)
875 && insn_uses_reg (&prev_insn, 31, 0))
876 /* If the previous previous instruction has a load
877 delay, and sets a register that the branch reads, we
878 can not swap. */
879 || (((prev_prev_insn.insn_mo->pinfo & INSN_LOAD_COPROC_DELAY)
880 || (mips_isa < 2
881 && (prev_prev_insn.insn_mo->pinfo
882 & INSN_LOAD_MEMORY_DELAY)))
883 && insn_uses_reg (ip,
884 ((prev_prev_insn.insn_opcode >> OP_SH_RT)
885 & OP_MASK_RT),
886 0)))
887 {
888 /* We could do even better for unconditional branches to
889 portions of this object file; we could pick up the
890 instruction at the destination, put it in the delay
891 slot, and bump the destination address. */
892 emit_nop ();
893 /* Update the previous insn information. */
894 prev_prev_insn = *ip;
895 prev_insn.insn_mo = &dummy_opcode;
896 }
897 else
898 {
899 char *prev_f;
900 char temp[4];
901
902 /* It looks like we can actually do the swap. */
903 prev_f = prev_insn_frag->fr_literal + prev_insn_where;
904 memcpy (temp, prev_f, 4);
905 memcpy (prev_f, f, 4);
906 memcpy (f, temp, 4);
907 if (prev_insn_fixp)
908 {
909 prev_insn_fixp->fx_frag = frag_now;
910 prev_insn_fixp->fx_where = f - frag_now->fr_literal;
911 }
912 if (fixp)
913 {
914 fixp->fx_frag = prev_insn_frag;
915 fixp->fx_where = prev_insn_where;
916 }
917 /* Update the previous insn information; leave prev_insn
918 unchanged. */
919 prev_prev_insn = *ip;
920 }
921 prev_insn_is_delay_slot = 1;
922
923 /* If that was an unconditional branch, forget the previous
924 insn information. */
925 if (pinfo & INSN_UNCOND_BRANCH_DELAY)
926 {
927 prev_prev_insn.insn_mo = &dummy_opcode;
928 prev_insn.insn_mo = &dummy_opcode;
929 }
930 }
931 else if (pinfo & INSN_COND_BRANCH_LIKELY)
932 {
933 /* We don't yet optimize a branch likely. What we should do
934 is look at the target, copy the instruction found there
935 into the delay slot, and increment the branch to jump to
936 the next instruction. */
937 emit_nop ();
938 /* Update the previous insn information. */
939 prev_prev_insn = *ip;
940 prev_insn.insn_mo = &dummy_opcode;
941 }
942 else
943 {
944 /* Update the previous insn information. */
945 if (nops > 0)
946 prev_prev_insn.insn_mo = &dummy_opcode;
947 else
948 prev_prev_insn = prev_insn;
949 prev_insn = *ip;
950
951 /* Any time we see a branch, we always fill the delay slot
952 immediately; since this insn is not a branch, we know it
953 is not in a delay slot. */
954 prev_insn_is_delay_slot = 0;
955 }
956
957 prev_prev_insn_unreordered = prev_insn_unreordered;
958 prev_insn_unreordered = 0;
959 prev_insn_frag = frag_now;
960 prev_insn_where = f - frag_now->fr_literal;
961 prev_insn_fixp = fixp;
962 prev_insn_valid = 1;
963 }
964
965 /* We just output an insn, so the next one doesn't have a label. */
966 insn_label = NULL;
967 }
968
969 /* This function forgets that there was any previous instruction or
970 label. */
971
972 static void
973 mips_no_prev_insn ()
974 {
975 prev_insn.insn_mo = &dummy_opcode;
976 prev_prev_insn.insn_mo = &dummy_opcode;
977 prev_insn_valid = 0;
978 prev_insn_is_delay_slot = 0;
979 prev_insn_unreordered = 0;
980 prev_prev_insn_unreordered = 0;
981 insn_label = NULL;
982 }
983
984 /* This function must be called whenever we turn on noreorder or emit
985 something other than instructions. It inserts any NOPS which might
986 be needed by the previous instruction, and clears the information
987 kept for the previous instructions. */
988
989 static void
990 mips_emit_delays ()
991 {
992 if (! mips_noreorder)
993 {
994 int nop;
995
996 nop = 0;
997 if ((prev_insn.insn_mo->pinfo
998 & (INSN_LOAD_COPROC_DELAY
999 | INSN_COPROC_MOVE_DELAY
1000 | INSN_WRITE_COND_CODE
1001 | INSN_READ_LO
1002 | INSN_READ_HI))
1003 || (mips_isa < 2
1004 && (prev_insn.insn_mo->pinfo
1005 & (INSN_LOAD_MEMORY_DELAY
1006 | INSN_COPROC_MEMORY_DELAY))))
1007 {
1008 nop = 1;
1009 if ((prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE)
1010 || (prev_insn.insn_mo->pinfo & INSN_READ_HI)
1011 || (prev_insn.insn_mo->pinfo & INSN_READ_LO))
1012 emit_nop ();
1013 }
1014 else if ((prev_prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE)
1015 || (prev_prev_insn.insn_mo->pinfo & INSN_READ_HI)
1016 || (prev_prev_insn.insn_mo->pinfo & INSN_READ_LO))
1017 nop = 1;
1018 if (nop)
1019 {
1020 emit_nop ();
1021 if (insn_label != NULL)
1022 {
1023 assert (S_GET_SEGMENT (insn_label) == now_seg);
1024 insn_label->sy_frag = frag_now;
1025 S_SET_VALUE (insn_label, (valueT) frag_now_fix ());
1026 }
1027 }
1028 mips_no_prev_insn ();
1029 }
1030 }
1031
1032 /* Return 1 if an expression can be accessed via the GP register. */
1033
1034 static int
1035 gp_reference (ep)
1036 expressionS *ep;
1037 {
1038 #ifdef GPOPT
1039 symbolS *sym;
1040 const char *symname;
1041 const char *segname;
1042
1043 sym = ep->X_add_symbol;
1044 if (sym == (symbolS *) NULL
1045 || ep->X_op_symbol != (symbolS *) NULL)
1046 return 0;
1047
1048 /* Certain symbols can not be referenced off the GP, although it
1049 appears as though they can. */
1050 symname = S_GET_NAME (sym);
1051 if (symname != (const char *) NULL
1052 && (strcmp (symname, "eprol") == 0
1053 || strcmp (symname, "etext") == 0
1054 || strcmp (symname, "_gp") == 0
1055 || strcmp (symname, "edata") == 0
1056 || strcmp (symname, "_fbss") == 0
1057 || strcmp (symname, "_fdata") == 0
1058 || strcmp (symname, "_ftext") == 0
1059 || strcmp (symname, "end") == 0))
1060 return 0;
1061 if (! S_IS_DEFINED (sym)
1062 && S_GET_VALUE (sym) != 0
1063 && S_GET_VALUE (sym) <= g_switch_value)
1064 return 1;
1065 segname = segment_name (S_GET_SEGMENT (ep->X_add_symbol));
1066 return (strcmp (segname, ".sdata") == 0
1067 || strcmp (segname, ".sbss") == 0
1068 || strcmp (segname, ".lit8") == 0
1069 || strcmp (segname, ".lit4") == 0);
1070 #else /* ! defined (GPOPT) */
1071 /* We are not optimizing for the GP register. */
1072 return 0;
1073 #endif /* ! defined (GPOPT) */
1074 }
1075
1076 /* Build an instruction created by a macro expansion. This is passed
1077 a pointer to the count of instructions created so far, an
1078 expression, the name of the instruction to build, an operand format
1079 string, and corresponding arguments. */
1080
1081 #ifndef NO_STDARG
1082 static void
1083 macro_build (int *counter,
1084 expressionS * ep,
1085 const char *name,
1086 const char *fmt,
1087 ...)
1088 #else /* ! defined (NO_STDARG) */
1089 static void
1090 macro_build (counter, ep, name, fmt, va_alist)
1091 int *counter;
1092 expressionS *ep;
1093 const char *name;
1094 const char *fmt;
1095 va_dcl
1096 #endif /* ! defined (NO_STDARG) */
1097 {
1098 struct mips_cl_insn insn;
1099 bfd_reloc_code_real_type r;
1100 va_list args;
1101
1102 #ifndef NO_STDARG
1103 va_start (args, fmt);
1104 #else
1105 va_start (args);
1106 #endif
1107
1108 /*
1109 * If the macro is about to expand into a second instruction,
1110 * print a warning if needed. We need to pass ip as a parameter
1111 * to generate a better warning message here...
1112 */
1113 if (mips_warn_about_macros && *counter == 1)
1114 as_warn ("Macro instruction expanded into multiple instructions");
1115
1116 *counter += 1; /* bump instruction counter */
1117
1118 r = BFD_RELOC_UNUSED;
1119 insn.insn_mo = (struct mips_opcode *) hash_find (op_hash, name);
1120 assert (insn.insn_mo);
1121 assert (strcmp (name, insn.insn_mo->name) == 0);
1122
1123 while (strcmp (fmt, insn.insn_mo->args) != 0)
1124 {
1125 ++insn.insn_mo;
1126 assert (insn.insn_mo->name);
1127 assert (strcmp (name, insn.insn_mo->name) == 0);
1128 }
1129 assert (insn.insn_mo->pinfo != INSN_MACRO);
1130 insn.insn_opcode = insn.insn_mo->match;
1131 for (;;)
1132 {
1133 switch (*fmt++)
1134 {
1135 case '\0':
1136 break;
1137
1138 case ',':
1139 case '(':
1140 case ')':
1141 continue;
1142
1143 case 't':
1144 case 'w':
1145 case 'E':
1146 insn.insn_opcode |= va_arg (args, int) << 16;
1147 continue;
1148
1149 case 'c':
1150 case 'T':
1151 case 'W':
1152 insn.insn_opcode |= va_arg (args, int) << 16;
1153 continue;
1154
1155 case 'd':
1156 case 'G':
1157 insn.insn_opcode |= va_arg (args, int) << 11;
1158 continue;
1159
1160 case 'V':
1161 case 'S':
1162 insn.insn_opcode |= va_arg (args, int) << 11;
1163 continue;
1164
1165 case 'z':
1166 continue;
1167
1168 case '<':
1169 case '>':
1170 insn.insn_opcode |= va_arg (args, int) << 6;
1171 continue;
1172
1173 case 'D':
1174 insn.insn_opcode |= va_arg (args, int) << 6;
1175 continue;
1176
1177 case 'B':
1178 insn.insn_opcode |= va_arg (args, int) << 6;
1179 continue;
1180
1181 case 'b':
1182 case 's':
1183 case 'r':
1184 case 'v':
1185 insn.insn_opcode |= va_arg (args, int) << 21;
1186 continue;
1187
1188 case 'i':
1189 case 'j':
1190 case 'o':
1191 r = BFD_RELOC_LO16;
1192 continue;
1193
1194 case 'u':
1195 assert (ep != NULL && ep->X_op == O_constant);
1196 insn.insn_opcode |= (ep->X_add_number >> 16) & 0xffff;
1197 ep = NULL;
1198 continue;
1199
1200 case 'p':
1201 assert (ep != NULL);
1202 /*
1203 * This allows macro() to pass an immediate expression for
1204 * creating short branches without creating a symbol.
1205 * Note that the expression still might come from the assembly
1206 * input, in which case the value is not checked for range nor
1207 * is a relocation entry generated (yuck).
1208 */
1209 if (ep->X_op == O_constant)
1210 {
1211 insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
1212 ep = NULL;
1213 }
1214 else
1215 r = BFD_RELOC_16_PCREL_S2;
1216 continue;
1217
1218 default:
1219 internalError ();
1220 }
1221 break;
1222 }
1223 va_end (args);
1224 assert (r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
1225
1226 /* Use GP relative addressing if possible. */
1227 if (r == BFD_RELOC_LO16
1228 && gp_reference (ep))
1229 r = BFD_RELOC_MIPS_GPREL;
1230
1231 append_insn (&insn, ep, r);
1232 }
1233
1234 /*
1235 * Generate a "lui" instruction.
1236 */
1237 static void
1238 macro_build_lui (counter, ep, regnum)
1239 int *counter;
1240 expressionS *ep;
1241 int regnum;
1242 {
1243 expressionS high_expr;
1244 struct mips_cl_insn insn;
1245 bfd_reloc_code_real_type r;
1246 CONST char *name = "lui";
1247 CONST char *fmt = "t,u";
1248
1249 high_expr = *ep;
1250
1251 if (high_expr.X_op == O_constant)
1252 {
1253 /* we can compute the instruction now without a relocation entry */
1254 if (high_expr.X_add_number & 0x8000)
1255 high_expr.X_add_number += 0x10000;
1256 high_expr.X_add_number =
1257 ((unsigned long) high_expr.X_add_number >> 16) & 0xffff;
1258 r = BFD_RELOC_UNUSED;
1259 }
1260 else
1261 r = BFD_RELOC_HI16_S;
1262
1263 /*
1264 * If the macro is about to expand into a second instruction,
1265 * print a warning if needed. We need to pass ip as a parameter
1266 * to generate a better warning message here...
1267 */
1268 if (mips_warn_about_macros && *counter == 1)
1269 as_warn ("Macro instruction expanded into multiple instructions");
1270
1271 *counter += 1; /* bump instruction counter */
1272
1273 insn.insn_mo = (struct mips_opcode *) hash_find (op_hash, name);
1274 assert (insn.insn_mo);
1275 assert (strcmp (name, insn.insn_mo->name) == 0);
1276 assert (strcmp (fmt, insn.insn_mo->args) == 0);
1277
1278 insn.insn_opcode = insn.insn_mo->match | (regnum << 16);
1279 if (r == BFD_RELOC_UNUSED)
1280 {
1281 insn.insn_opcode |= high_expr.X_add_number;
1282 append_insn (&insn, NULL, r);
1283 }
1284 else
1285 append_insn (&insn, &high_expr, r);
1286 }
1287
1288 /* set_at()
1289 * Generates code to set the $at register to true (one)
1290 * if reg is less than the immediate expression.
1291 */
1292 static void
1293 set_at (counter, reg, unsignedp)
1294 int *counter;
1295 int reg;
1296 int unsignedp;
1297 {
1298 if (imm_expr.X_add_number >= -0x8000 && imm_expr.X_add_number < 0x8000)
1299 macro_build (counter, &imm_expr,
1300 unsignedp ? "sltiu" : "slti",
1301 "t,r,j", AT, reg);
1302 else
1303 {
1304 load_register (counter, AT, &imm_expr);
1305 macro_build (counter, NULL,
1306 unsignedp ? "sltu" : "slt",
1307 "d,v,t", AT, reg, AT);
1308 }
1309 }
1310
1311 /* Warn if an expression is not a constant. */
1312
1313 static void
1314 check_absolute_expr (ip, ex)
1315 struct mips_cl_insn *ip;
1316 expressionS *ex;
1317 {
1318 if (ex->X_op != O_constant)
1319 as_warn ("Instruction %s requires absolute expression", ip->insn_mo->name);
1320 }
1321
1322 /* load_register()
1323 * This routine generates the least number of instructions neccessary to load
1324 * an absolute expression value into a register.
1325 */
1326 static void
1327 load_register (counter, reg, ep)
1328 int *counter;
1329 int reg;
1330 expressionS *ep;
1331 {
1332 assert (ep->X_op == O_constant);
1333 if (ep->X_add_number >= -0x8000 && ep->X_add_number < 0x8000)
1334 macro_build (counter, ep,
1335 mips_isa < 3 ? "addiu" : "daddiu",
1336 "t,r,j", reg, 0);
1337 else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
1338 macro_build (counter, ep, "ori", "t,r,i", reg, 0);
1339 else if ((ep->X_add_number &~ (offsetT) 0x7fffffff) == 0
1340 || ((ep->X_add_number &~ (offsetT) 0x7fffffff)
1341 == ~ (offsetT) 0x7fffffff))
1342 {
1343 macro_build (counter, ep, "lui", "t,u", reg);
1344 if ((ep->X_add_number & 0xffff) != 0)
1345 macro_build (counter, ep, "ori", "t,r,i", reg, reg);
1346 }
1347 else if (mips_isa < 3)
1348 {
1349 as_bad ("Number larger than 32 bits");
1350 macro_build (counter, ep, "addiu", "t,r,j", reg, 0);
1351 }
1352 else
1353 {
1354 int shift;
1355 expressionS hi32, lo32;
1356
1357 hi32 = *ep;
1358 shift = 32;
1359 hi32.X_add_number >>= shift;
1360 hi32.X_add_number &= 0xffffffff;
1361 if ((hi32.X_add_number & 0x80000000) != 0)
1362 hi32.X_add_number |= ~ (offsetT) 0xffffffff;
1363 load_register (counter, reg, &hi32);
1364 lo32 = *ep;
1365 lo32.X_add_number &= 0xffffffff;
1366 if ((lo32.X_add_number & 0xffff0000) == 0)
1367 macro_build (counter, NULL, "dsll32", "d,w,<", reg, reg, 0);
1368 else
1369 {
1370 expressionS mid16;
1371
1372 macro_build (counter, NULL, "dsll", "d,w,<", reg, reg, 16);
1373 mid16 = lo32;
1374 mid16.X_add_number >>= 16;
1375 macro_build (counter, &mid16, "ori", "t,r,i", reg, reg);
1376 macro_build (counter, NULL, "dsll", "d,w,<", reg, reg, 16);
1377 }
1378 if ((lo32.X_add_number & 0xffff) != 0)
1379 macro_build (counter, &lo32, "ori", "t,r,i", reg, reg);
1380 }
1381 }
1382
1383 /*
1384 * Build macros
1385 * This routine implements the seemingly endless macro or synthesized
1386 * instructions and addressing modes in the mips assembly language. Many
1387 * of these macros are simple and are similar to each other. These could
1388 * probably be handled by some kind of table or grammer aproach instead of
1389 * this verbose method. Others are not simple macros but are more like
1390 * optimizing code generation.
1391 * One interesting optimization is when several store macros appear
1392 * consecutivly that would load AT with the upper half of the same address.
1393 * The ensuing load upper instructions are ommited. This implies some kind
1394 * of global optimization. We currently only optimize within a single macro.
1395 * For many of the load and store macros if the address is specified as a
1396 * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
1397 * first load register 'at' with zero and use it as the base register. The
1398 * mips assembler simply uses register $zero. Just one tiny optimization
1399 * we're missing.
1400 */
1401 static void
1402 macro (ip)
1403 struct mips_cl_insn *ip;
1404 {
1405 register int treg, sreg, dreg, breg;
1406 int tempreg;
1407 int mask;
1408 int icnt = 0;
1409 int used_at;
1410 expressionS expr1;
1411 const char *s;
1412 const char *s2;
1413 const char *fmt;
1414 int likely = 0;
1415 int dbl = 0;
1416 int coproc = 0;
1417 offsetT maxnum;
1418
1419 treg = (ip->insn_opcode >> 16) & 0x1f;
1420 dreg = (ip->insn_opcode >> 11) & 0x1f;
1421 sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
1422 mask = ip->insn_mo->mask;
1423
1424 expr1.X_op = O_constant;
1425 expr1.X_op_symbol = NULL;
1426 expr1.X_add_symbol = NULL;
1427 expr1.X_add_number = 1;
1428
1429 switch (mask)
1430 {
1431 case M_DABS:
1432 dbl = 1;
1433 case M_ABS:
1434 /* bgez $a0,.+12
1435 move v0,$a0
1436 sub v0,$zero,$a0
1437 */
1438
1439 mips_emit_delays ();
1440 ++mips_noreorder;
1441
1442 expr1.X_add_number = 8;
1443 macro_build (&icnt, &expr1, "bgez", "s,p", sreg);
1444 if (dreg == sreg)
1445 macro_build (&icnt, NULL, "nop", "", 0);
1446 else
1447 macro_build (&icnt, NULL, "move", "d,s", dreg, sreg, 0);
1448 macro_build (&icnt, NULL,
1449 dbl ? "dsub" : "sub",
1450 "d,v,t", dreg, 0, sreg);
1451
1452 --mips_noreorder;
1453 return;
1454
1455 case M_ADD_I:
1456 s = "addi";
1457 s2 = "add";
1458 goto do_addi;
1459 case M_ADDU_I:
1460 s = "addiu";
1461 s2 = "addu";
1462 goto do_addi;
1463 case M_DADD_I:
1464 dbl = 1;
1465 s = "daddi";
1466 s2 = "dadd";
1467 goto do_addi;
1468 case M_DADDU_I:
1469 dbl = 1;
1470 s = "daddiu";
1471 s2 = "daddu";
1472 do_addi:
1473 if (imm_expr.X_add_number >= -0x8000 && imm_expr.X_add_number < 0x8000)
1474 {
1475 macro_build (&icnt, &imm_expr, s, "t,r,j", treg, sreg);
1476 return;
1477 }
1478 load_register (&icnt, AT, &imm_expr);
1479 macro_build (&icnt, NULL, s2, "d,v,t", treg, sreg, AT);
1480 break;
1481
1482 case M_AND_I:
1483 s = "andi";
1484 s2 = "and";
1485 goto do_bit;
1486 case M_OR_I:
1487 s = "ori";
1488 s2 = "or";
1489 goto do_bit;
1490 case M_NOR_I:
1491 s = "";
1492 s2 = "nor";
1493 goto do_bit;
1494 case M_XOR_I:
1495 s = "xori";
1496 s2 = "xor";
1497 do_bit:
1498 if (imm_expr.X_add_number >= 0 && imm_expr.X_add_number < 0x10000)
1499 {
1500 if (mask != M_NOR_I)
1501 macro_build (&icnt, &imm_expr, s, "t,r,i", treg, sreg);
1502 else
1503 {
1504 macro_build (&icnt, &imm_expr, "ori", "t,r,i", treg, sreg);
1505 macro_build (&icnt, &imm_expr, "nor", "d,v,t", treg, treg, 0);
1506 }
1507 return;
1508 }
1509
1510 load_register (&icnt, AT, &imm_expr);
1511 macro_build (&icnt, NULL, s2, "d,v,t", treg, sreg, AT);
1512 break;
1513
1514 case M_BEQ_I:
1515 s = "beq";
1516 goto beq_i;
1517 case M_BEQL_I:
1518 s = "beql";
1519 likely = 1;
1520 goto beq_i;
1521 case M_BNE_I:
1522 s = "bne";
1523 goto beq_i;
1524 case M_BNEL_I:
1525 s = "bnel";
1526 likely = 1;
1527 beq_i:
1528 if (imm_expr.X_add_number == 0)
1529 {
1530 macro_build (&icnt, &offset_expr, s, "s,t,p", sreg, 0);
1531 return;
1532 }
1533 load_register (&icnt, AT, &imm_expr);
1534 macro_build (&icnt, &offset_expr, s, "s,t,p", sreg, AT);
1535 break;
1536
1537 case M_BGEL:
1538 likely = 1;
1539 case M_BGE:
1540 if (treg == 0)
1541 {
1542 macro_build (&icnt, &offset_expr,
1543 likely ? "bgezl" : "bgez",
1544 "s,p", sreg);
1545 return;
1546 }
1547 if (sreg == 0)
1548 {
1549 macro_build (&icnt, &offset_expr,
1550 likely ? "blezl" : "blez",
1551 "s,p", treg);
1552 return;
1553 }
1554 macro_build (&icnt, NULL, "slt", "d,v,t", AT, sreg, treg);
1555 macro_build (&icnt, &offset_expr,
1556 likely ? "beql" : "beq",
1557 "s,t,p", AT, 0);
1558 break;
1559
1560 case M_BGTL_I:
1561 likely = 1;
1562 case M_BGT_I:
1563 /* check for > max integer */
1564 maxnum = 0x7fffffff;
1565 if (mips_isa >= 3)
1566 {
1567 maxnum <<= 16;
1568 maxnum |= 0xffff;
1569 maxnum <<= 16;
1570 maxnum |= 0xffff;
1571 }
1572 if (imm_expr.X_add_number >= maxnum)
1573 {
1574 do_false:
1575 /* result is always false */
1576 if (! likely)
1577 {
1578 as_warn ("Branch %s is always false (nop)", ip->insn_mo->name);
1579 macro_build (&icnt, NULL, "nop", "", 0);
1580 }
1581 else
1582 {
1583 as_warn ("Branch likely %s is always false", ip->insn_mo->name);
1584 macro_build (&icnt, &offset_expr, "bnel", "s,t,p", 0, 0);
1585 }
1586 return;
1587 }
1588 imm_expr.X_add_number++;
1589 /* FALLTHROUGH */
1590 case M_BGE_I:
1591 case M_BGEL_I:
1592 if (mask == M_BGEL_I)
1593 likely = 1;
1594 if (imm_expr.X_add_number == 0)
1595 {
1596 macro_build (&icnt, &offset_expr,
1597 likely ? "bgezl" : "bgez",
1598 "s,p", sreg);
1599 return;
1600 }
1601 if (imm_expr.X_add_number == 1)
1602 {
1603 macro_build (&icnt, &offset_expr,
1604 likely ? "bgtzl" : "bgtz",
1605 "s,p", sreg);
1606 return;
1607 }
1608 maxnum = 0x7fffffff;
1609 if (mips_isa >= 3)
1610 {
1611 maxnum <<= 16;
1612 maxnum |= 0xffff;
1613 maxnum <<= 16;
1614 maxnum |= 0xffff;
1615 }
1616 maxnum = - maxnum - 1;
1617 if (imm_expr.X_add_number <= maxnum)
1618 {
1619 do_true:
1620 /* result is always true */
1621 as_warn ("Branch %s is always true", ip->insn_mo->name);
1622 macro_build (&icnt, &offset_expr, "b", "p");
1623 return;
1624 }
1625 set_at (&icnt, sreg, 0);
1626 macro_build (&icnt, &offset_expr,
1627 likely ? "beql" : "beq",
1628 "s,t,p", AT, 0);
1629 break;
1630
1631 case M_BGEUL:
1632 likely = 1;
1633 case M_BGEU:
1634 if (treg == 0)
1635 goto do_true;
1636 if (sreg == 0)
1637 {
1638 macro_build (&icnt, &offset_expr,
1639 likely ? "beql" : "beq",
1640 "s,t,p", 0, treg);
1641 return;
1642 }
1643 macro_build (&icnt, NULL, "sltu", "d,v,t", AT, sreg, treg);
1644 macro_build (&icnt, &offset_expr,
1645 likely ? "beql" : "beq",
1646 "s,t,p", AT, 0);
1647 break;
1648
1649 case M_BGTUL_I:
1650 likely = 1;
1651 case M_BGTU_I:
1652 if (sreg == 0 || imm_expr.X_add_number == -1)
1653 goto do_false;
1654 imm_expr.X_add_number++;
1655 /* FALLTHROUGH */
1656 case M_BGEU_I:
1657 case M_BGEUL_I:
1658 if (mask == M_BGEUL_I)
1659 likely = 1;
1660 if (imm_expr.X_add_number == 0)
1661 goto do_true;
1662 if (imm_expr.X_add_number == 1)
1663 {
1664 macro_build (&icnt, &offset_expr,
1665 likely ? "bnel" : "bne",
1666 "s,t,p", sreg, 0);
1667 return;
1668 }
1669 set_at (&icnt, sreg, 1);
1670 macro_build (&icnt, &offset_expr,
1671 likely ? "beql" : "beq",
1672 "s,t,p", AT, 0);
1673 break;
1674
1675 case M_BGTL:
1676 likely = 1;
1677 case M_BGT:
1678 if (treg == 0)
1679 {
1680 macro_build (&icnt, &offset_expr,
1681 likely ? "bgtzl" : "bgtz",
1682 "s,p", sreg);
1683 return;
1684 }
1685 if (sreg == 0)
1686 {
1687 macro_build (&icnt, &offset_expr,
1688 likely ? "bltzl" : "bltz",
1689 "s,p", treg);
1690 return;
1691 }
1692 macro_build (&icnt, NULL, "slt", "d,v,t", AT, treg, sreg);
1693 macro_build (&icnt, &offset_expr,
1694 likely ? "bnel" : "bne",
1695 "s,t,p", AT, 0);
1696 break;
1697
1698 case M_BGTUL:
1699 likely = 1;
1700 case M_BGTU:
1701 if (treg == 0)
1702 {
1703 macro_build (&icnt, &offset_expr,
1704 likely ? "bnel" : "bne",
1705 "s,t,p", sreg, 0);
1706 return;
1707 }
1708 if (sreg == 0)
1709 goto do_false;
1710 macro_build (&icnt, NULL, "sltu", "d,v,t", AT, treg, sreg);
1711 macro_build (&icnt, &offset_expr,
1712 likely ? "bnel" : "bne",
1713 "s,t,p", AT, 0);
1714 break;
1715
1716 case M_BLEL:
1717 likely = 1;
1718 case M_BLE:
1719 if (treg == 0)
1720 {
1721 macro_build (&icnt, &offset_expr,
1722 likely ? "blezl" : "blez",
1723 "s,p", sreg);
1724 return;
1725 }
1726 if (sreg == 0)
1727 {
1728 macro_build (&icnt, &offset_expr,
1729 likely ? "bgezl" : "bgez",
1730 "s,p", treg);
1731 return;
1732 }
1733 macro_build (&icnt, NULL, "slt", "d,v,t", AT, treg, sreg);
1734 macro_build (&icnt, &offset_expr,
1735 likely ? "beql" : "beq",
1736 "s,t,p", AT, 0);
1737 break;
1738
1739 case M_BLEL_I:
1740 likely = 1;
1741 case M_BLE_I:
1742 maxnum = 0x7fffffff;
1743 if (mips_isa >= 3)
1744 {
1745 maxnum <<= 16;
1746 maxnum |= 0xffff;
1747 maxnum <<= 16;
1748 maxnum |= 0xffff;
1749 }
1750 if (imm_expr.X_add_number >= maxnum)
1751 goto do_true;
1752 imm_expr.X_add_number++;
1753 /* FALLTHROUGH */
1754 case M_BLT_I:
1755 case M_BLTL_I:
1756 if (mask == M_BLTL_I)
1757 likely = 1;
1758 if (imm_expr.X_add_number == 0)
1759 {
1760 macro_build (&icnt, &offset_expr,
1761 likely ? "bltzl" : "bltz",
1762 "s,p", sreg);
1763 return;
1764 }
1765 if (imm_expr.X_add_number == 1)
1766 {
1767 macro_build (&icnt, &offset_expr,
1768 likely ? "blezl" : "blez",
1769 "s,p", sreg);
1770 return;
1771 }
1772 set_at (&icnt, sreg, 0);
1773 macro_build (&icnt, &offset_expr,
1774 likely ? "bnel" : "bne",
1775 "s,t,p", AT, 0);
1776 break;
1777
1778 case M_BLEUL:
1779 likely = 1;
1780 case M_BLEU:
1781 if (treg == 0)
1782 {
1783 macro_build (&icnt, &offset_expr,
1784 likely ? "beql" : "beq",
1785 "s,t,p", sreg, 0);
1786 return;
1787 }
1788 if (sreg == 0)
1789 goto do_true;
1790 macro_build (&icnt, NULL, "sltu", "d,v,t", AT, treg, sreg);
1791 macro_build (&icnt, &offset_expr,
1792 likely ? "beql" : "beq",
1793 "s,t,p", AT, 0);
1794 break;
1795
1796 case M_BLEUL_I:
1797 likely = 1;
1798 case M_BLEU_I:
1799 if (sreg == 0 || imm_expr.X_add_number == -1)
1800 goto do_true;
1801 imm_expr.X_add_number++;
1802 /* FALLTHROUGH */
1803 case M_BLTU_I:
1804 case M_BLTUL_I:
1805 if (mask == M_BLTUL_I)
1806 likely = 1;
1807 if (imm_expr.X_add_number == 0)
1808 goto do_false;
1809 if (imm_expr.X_add_number == 1)
1810 {
1811 macro_build (&icnt, &offset_expr,
1812 likely ? "beql" : "beq",
1813 "s,t,p", sreg, 0);
1814 return;
1815 }
1816 set_at (&icnt, sreg, 1);
1817 macro_build (&icnt, &offset_expr,
1818 likely ? "bnel" : "bne",
1819 "s,t,p", AT, 0);
1820 break;
1821
1822 case M_BLTL:
1823 likely = 1;
1824 case M_BLT:
1825 if (treg == 0)
1826 {
1827 macro_build (&icnt, &offset_expr,
1828 likely ? "bltzl" : "bltz",
1829 "s,p", sreg);
1830 return;
1831 }
1832 if (sreg == 0)
1833 {
1834 macro_build (&icnt, &offset_expr,
1835 likely ? "bgtzl" : "bgtz",
1836 "s,p", treg);
1837 return;
1838 }
1839 macro_build (&icnt, NULL, "slt", "d,v,t", AT, sreg, treg);
1840 macro_build (&icnt, &offset_expr,
1841 likely ? "bnel" : "bne",
1842 "s,t,p", AT, 0);
1843 break;
1844
1845 case M_BLTUL:
1846 likely = 1;
1847 case M_BLTU:
1848 if (treg == 0)
1849 goto do_false;
1850 if (sreg == 0)
1851 {
1852 macro_build (&icnt, &offset_expr,
1853 likely ? "bnel" : "bne",
1854 "s,t,p", 0, treg);
1855 return;
1856 }
1857 macro_build (&icnt, NULL, "sltu", "d,v,t", AT, sreg, treg);
1858 macro_build (&icnt, &offset_expr,
1859 likely ? "bnel" : "bne",
1860 "s,t,p", AT, 0);
1861 break;
1862
1863 case M_DDIV_3:
1864 dbl = 1;
1865 case M_DIV_3:
1866 s = "mflo";
1867 goto do_div3;
1868 case M_DREM_3:
1869 dbl = 1;
1870 case M_REM_3:
1871 s = "mfhi";
1872 do_div3:
1873 if (treg == 0)
1874 {
1875 as_warn ("Divide by zero.");
1876 macro_build (&icnt, NULL, "break", "c", 7);
1877 return;
1878 }
1879
1880 mips_emit_delays ();
1881 ++mips_noreorder;
1882 macro_build (&icnt, NULL,
1883 dbl ? "ddiv" : "div",
1884 "z,s,t", sreg, treg);
1885 expr1.X_add_number = 8;
1886 macro_build (&icnt, &expr1, "bne", "s,t,p", treg, 0);
1887 macro_build (&icnt, NULL, "nop", "", 0);
1888 macro_build (&icnt, NULL, "break", "c", 7);
1889 expr1.X_add_number = -1;
1890 macro_build (&icnt, &expr1,
1891 dbl ? "daddiu" : "addiu",
1892 "t,r,j", AT, 0);
1893 expr1.X_add_number = dbl ? 20 : 16;
1894 macro_build (&icnt, &expr1, "bne", "s,t,p", treg, AT);
1895 if (dbl)
1896 {
1897 expr1.X_add_number = 1;
1898 macro_build (&icnt, &expr1, "daddiu", "t,r,j", AT, 0);
1899 macro_build (&icnt, NULL, "dsll32", "d,w,<", AT, AT, 31);
1900 }
1901 else
1902 {
1903 expr1.X_add_number = 0x80000000;
1904 macro_build (&icnt, &expr1, "lui", "t,u", AT);
1905 }
1906 expr1.X_add_number = 8;
1907 macro_build (&icnt, &expr1, "bne", "s,t,p", sreg, AT);
1908 macro_build (&icnt, NULL, "nop", "", 0);
1909 macro_build (&icnt, NULL, "break", "c", 6);
1910 --mips_noreorder;
1911 macro_build (&icnt, NULL, s, "d", dreg);
1912 break;
1913
1914 case M_DIV_3I:
1915 s = "div";
1916 s2 = "mflo";
1917 goto do_divi;
1918 case M_DIVU_3I:
1919 s = "divu";
1920 s2 = "mflo";
1921 goto do_divi;
1922 case M_REM_3I:
1923 s = "div";
1924 s2 = "mfhi";
1925 goto do_divi;
1926 case M_REMU_3I:
1927 s = "divu";
1928 s2 = "mfhi";
1929 goto do_divi;
1930 case M_DDIV_3I:
1931 dbl = 1;
1932 s = "ddiv";
1933 s2 = "mflo";
1934 goto do_divi;
1935 case M_DDIVU_3I:
1936 dbl = 1;
1937 s = "ddivu";
1938 s2 = "mflo";
1939 goto do_divi;
1940 case M_DREM_3I:
1941 dbl = 1;
1942 s = "ddiv";
1943 s2 = "mfhi";
1944 goto do_divi;
1945 case M_DREMU_3I:
1946 dbl = 1;
1947 s = "ddivu";
1948 s2 = "mfhi";
1949 do_divi:
1950 if (imm_expr.X_add_number == 0)
1951 {
1952 as_warn ("Divide by zero.");
1953 macro_build (&icnt, NULL, "break", "c", 7);
1954 return;
1955 }
1956 if (imm_expr.X_add_number == 1)
1957 {
1958 if (strcmp (s2, "mflo") == 0)
1959 macro_build (&icnt, NULL, "move", "d,s", dreg, sreg);
1960 else
1961 macro_build (&icnt, NULL, "move", "d,s", dreg, 0);
1962 return;
1963 }
1964 if (imm_expr.X_add_number == -1
1965 && s[strlen (s) - 1] != 'u')
1966 {
1967 if (strcmp (s2, "mflo") == 0)
1968 {
1969 if (dbl)
1970 macro_build (&icnt, NULL, "dneg", "d,w", dreg, sreg);
1971 else
1972 macro_build (&icnt, NULL, "neg", "d,w", dreg, sreg);
1973 }
1974 else
1975 macro_build (&icnt, NULL, "move", "d,s", dreg, 0);
1976 return;
1977 }
1978
1979 load_register (&icnt, AT, &imm_expr);
1980 macro_build (&icnt, NULL, s, "z,s,t", sreg, AT);
1981 macro_build (&icnt, NULL, s2, "d", dreg);
1982 break;
1983
1984 case M_DIVU_3:
1985 s = "divu";
1986 s2 = "mflo";
1987 goto do_divu3;
1988 case M_REMU_3:
1989 s = "divu";
1990 s2 = "mfhi";
1991 goto do_divu3;
1992 case M_DDIVU_3:
1993 s = "ddivu";
1994 s2 = "mflo";
1995 goto do_divu3;
1996 case M_DREMU_3:
1997 s = "ddivu";
1998 s2 = "mfhi";
1999 do_divu3:
2000 mips_emit_delays ();
2001 ++mips_noreorder;
2002 macro_build (&icnt, NULL, s, "z,s,t", sreg, treg);
2003 expr1.X_add_number = 8;
2004 macro_build (&icnt, &expr1, "bne", "s,t,p", treg, 0);
2005 macro_build (&icnt, NULL, "nop", "", 0);
2006 macro_build (&icnt, NULL, "break", "c", 7);
2007 --mips_noreorder;
2008 macro_build (&icnt, NULL, s2, "d", dreg);
2009 return;
2010
2011 case M_LA:
2012 if (offset_expr.X_op == O_constant)
2013 {
2014 load_register (&icnt, treg, &offset_expr);
2015 return;
2016 }
2017 if (gp_reference (&offset_expr))
2018 macro_build (&icnt, &offset_expr,
2019 mips_isa < 3 ? "addiu" : "daddiu",
2020 "t,r,j", treg, GP);
2021 else
2022 {
2023 /* FIXME: This won't work for a 64 bit address. */
2024 macro_build_lui (&icnt, &offset_expr, treg);
2025 macro_build (&icnt, &offset_expr,
2026 mips_isa < 3 ? "addiu" : "daddiu",
2027 "t,r,j", treg, treg);
2028 }
2029 return;
2030
2031 case M_LA_AB:
2032 tempreg = (breg == treg) ? AT : treg;
2033 if (offset_expr.X_op == O_constant)
2034 load_register (&icnt, tempreg, &offset_expr);
2035 else if (gp_reference (&offset_expr))
2036 macro_build (&icnt, &offset_expr,
2037 mips_isa < 3 ? "addiu" : "daddiu",
2038 "t,r,j", tempreg, GP);
2039 else
2040 {
2041 /* FIXME: This won't work for a 64 bit address. */
2042 macro_build_lui (&icnt, &offset_expr, tempreg);
2043 macro_build (&icnt, &offset_expr,
2044 mips_isa < 3 ? "addiu" : "daddiu",
2045 "t,r,j", tempreg, tempreg);
2046 }
2047 if (breg != 0)
2048 macro_build (&icnt, NULL, "addu", "d,v,t", treg, tempreg, breg);
2049 if (breg == treg)
2050 break;
2051 return;
2052
2053 case M_LB_AB:
2054 s = "lb";
2055 goto ld;
2056 case M_LBU_AB:
2057 s = "lbu";
2058 goto ld;
2059 case M_LH_AB:
2060 s = "lh";
2061 goto ld;
2062 case M_LHU_AB:
2063 s = "lhu";
2064 goto ld;
2065 case M_LW_AB:
2066 s = "lw";
2067 goto ld;
2068 case M_LWC0_AB:
2069 s = "lwc0";
2070 coproc = 1;
2071 goto ld;
2072 case M_LWC1_AB:
2073 case M_LI_SS:
2074 s = "lwc1";
2075 coproc = 1;
2076 goto ld;
2077 case M_LWC2_AB:
2078 s = "lwc2";
2079 coproc = 1;
2080 goto ld;
2081 case M_LWC3_AB:
2082 s = "lwc3";
2083 coproc = 1;
2084 goto ld;
2085 case M_LWL_AB:
2086 s = "lwl";
2087 goto ld;
2088 case M_LWR_AB:
2089 s = "lwr";
2090 goto ld;
2091 case M_LDC1_AB:
2092 s = "ldc1";
2093 coproc = 1;
2094 goto ld;
2095 case M_LDC2_AB:
2096 s = "ldc2";
2097 coproc = 1;
2098 goto ld;
2099 case M_LDC3_AB:
2100 s = "ldc3";
2101 coproc = 1;
2102 goto ld;
2103 case M_LDL_AB:
2104 s = "ldl";
2105 goto ld;
2106 case M_LDR_AB:
2107 s = "ldr";
2108 goto ld;
2109 case M_LL_AB:
2110 s = "ll";
2111 goto ld;
2112 case M_LLD_AB:
2113 s = "lld";
2114 goto ld;
2115 case M_LWU_AB:
2116 s = "lwu";
2117 ld:
2118 if (breg == treg || coproc)
2119 {
2120 tempreg = AT;
2121 used_at = 1;
2122 }
2123 else
2124 {
2125 tempreg = treg;
2126 used_at = 0;
2127 }
2128 goto ld_st;
2129 case M_SB_AB:
2130 s = "sb";
2131 goto st;
2132 case M_SH_AB:
2133 s = "sh";
2134 goto st;
2135 case M_SW_AB:
2136 s = "sw";
2137 goto st;
2138 case M_SWC0_AB:
2139 s = "swc0";
2140 coproc = 1;
2141 goto st;
2142 case M_SWC1_AB:
2143 s = "swc1";
2144 coproc = 1;
2145 goto st;
2146 case M_SWC2_AB:
2147 s = "swc2";
2148 coproc = 1;
2149 goto st;
2150 case M_SWC3_AB:
2151 s = "swc3";
2152 coproc = 1;
2153 goto st;
2154 case M_SWL_AB:
2155 s = "swl";
2156 goto st;
2157 case M_SWR_AB:
2158 s = "swr";
2159 goto st;
2160 case M_SC_AB:
2161 s = "sc";
2162 goto st;
2163 case M_SCD_AB:
2164 s = "scd";
2165 goto st;
2166 case M_SDC1_AB:
2167 s = "sdc1";
2168 coproc = 1;
2169 goto st;
2170 case M_SDC2_AB:
2171 s = "sdc2";
2172 coproc = 1;
2173 goto st;
2174 case M_SDC3_AB:
2175 s = "sdc3";
2176 coproc = 1;
2177 goto st;
2178 case M_SDL_AB:
2179 s = "sdl";
2180 goto st;
2181 case M_SDR_AB:
2182 s = "sdr";
2183 st:
2184 tempreg = AT;
2185 used_at = 1;
2186 ld_st:
2187 if (mask == M_LWC1_AB
2188 || mask == M_SWC1_AB
2189 || mask == M_LI_SS
2190 || mask == M_LDC1_AB
2191 || mask == M_SDC1_AB)
2192 fmt = "T,o(b)";
2193 else if (coproc)
2194 fmt = "E,o(b)";
2195 else
2196 fmt = "t,o(b)";
2197 if (gp_reference (&offset_expr))
2198 {
2199 if (breg == 0)
2200 {
2201 macro_build (&icnt, &offset_expr, s, fmt, treg, GP);
2202 return;
2203 }
2204 macro_build (&icnt, (expressionS *) NULL,
2205 mips_isa < 3 ? "addu" : "daddu",
2206 "d,v,t", tempreg, breg, GP);
2207 }
2208 else
2209 {
2210 /* FIXME: This won't work for a 64 bit address. */
2211 macro_build_lui (&icnt, &offset_expr, tempreg);
2212 if (breg != 0)
2213 macro_build (&icnt, NULL,
2214 mips_isa < 3 ? "addu" : "daddu",
2215 "d,v,t", tempreg, tempreg, breg);
2216 }
2217 macro_build (&icnt, &offset_expr, s, fmt, treg, tempreg);
2218 if (used_at)
2219 break;
2220 return;
2221
2222 case M_LI:
2223 case M_LI_S:
2224 load_register (&icnt, treg, &imm_expr);
2225 return;
2226
2227 case M_LI_D:
2228 /* lui $at,%hi(foo)
2229 lw $v0,%lo(foo)($at)
2230 lw $v1,%lo(foo+4)($at)
2231 .rdata
2232 foo:
2233 .double 3.133435
2234 */
2235 /* FIXME: This won't work for a 64 bit address. */
2236 macro_build_lui (&icnt, &offset_expr, AT);
2237 if (mips_isa >= 3)
2238 macro_build (&icnt, &offset_expr, "ld", "t,o(b)", treg, AT);
2239 else
2240 {
2241 macro_build (&icnt, &offset_expr, "lw", "t,o(b)", treg, AT);
2242 offset_expr.X_add_number += 4;
2243 macro_build (&icnt, &offset_expr, "lw", "t,o(b)", treg + 1, AT);
2244 }
2245 break;
2246
2247 case M_LI_DD:
2248 /* Load a floating point number from the .lit8 section. */
2249 if (mips_isa >= 2)
2250 {
2251 macro_build (&icnt, &offset_expr, "ldc1", "T,o(b)", treg, GP);
2252 return;
2253 }
2254 breg = GP;
2255 /* Fall through. */
2256 case M_L_DOB:
2257 /* Even on a big endian machine $fn comes before $fn+1. We have
2258 to adjust when loading from memory. */
2259 assert (mips_isa < 2);
2260 macro_build (&icnt, &offset_expr, "lwc1", "T,o(b)",
2261 byte_order == LITTLE_ENDIAN ? treg : treg + 1,
2262 breg);
2263 offset_expr.X_add_number += 4;
2264 macro_build (&icnt, &offset_expr, "lwc1", "T,o(b)",
2265 byte_order == LITTLE_ENDIAN ? treg + 1 : treg,
2266 breg);
2267 return;
2268
2269 case M_L_DAB:
2270 /*
2271 * The MIPS assembler seems to check for X_add_number not
2272 * being double aligned and generating:
2273 * lui at,%hi(foo+1)
2274 * addu at,at,v1
2275 * addiu at,at,%lo(foo+1)
2276 * lwc1 f2,0(at)
2277 * lwc1 f3,4(at)
2278 * But, the resulting address is the same after relocation so why
2279 * generate the extra instruction?
2280 */
2281 if (gp_reference (&offset_expr))
2282 {
2283 if (breg == 0)
2284 tempreg = GP;
2285 else
2286 {
2287 macro_build (&icnt, &offset_expr,
2288 mips_isa < 3 ? "addu" : "daddu",
2289 "d,v,t", AT, breg, GP);
2290 tempreg = AT;
2291 }
2292 }
2293 else
2294 {
2295 /* FIXME: This won't work for a 64 bit address. */
2296 macro_build_lui (&icnt, &offset_expr, AT);
2297 if (breg != 0)
2298 macro_build (&icnt, NULL,
2299 mips_isa < 3 ? "addu" : "daddu",
2300 "d,v,t", AT, AT, breg);
2301 tempreg = AT;
2302 }
2303 if (mips_isa >= 2)
2304 macro_build (&icnt, &offset_expr, "ldc1", "T,o(b)", treg, tempreg);
2305 else
2306 {
2307 /* Even on a big endian machine $fn comes before $fn+1. We
2308 have to adjust when loading from memory. */
2309 macro_build (&icnt, &offset_expr, "lwc1", "T,o(b)",
2310 byte_order == LITTLE_ENDIAN ? treg : treg + 1,
2311 tempreg);
2312 offset_expr.X_add_number += 4;
2313 macro_build (&icnt, &offset_expr, "lwc1", "T,o(b)",
2314 byte_order == LITTLE_ENDIAN ? treg + 1 : treg,
2315 tempreg);
2316 }
2317 if (tempreg == AT)
2318 break;
2319 return;
2320
2321 case M_LD_OB:
2322 s = "lw";
2323 goto sd_ob;
2324 case M_SD_OB:
2325 s = "sw";
2326 sd_ob:
2327 assert (mips_isa < 3);
2328 macro_build (&icnt, &offset_expr, s, "t,o(b)", treg, breg);
2329 offset_expr.X_add_number += 4;
2330 macro_build (&icnt, &offset_expr, s, "t,o(b)", treg + 1, breg);
2331 return;
2332
2333 case M_LD_AB:
2334 s = "lw";
2335 s2 = "ld";
2336 if (breg == treg)
2337 {
2338 tempreg = AT;
2339 used_at = 1;
2340 }
2341 else
2342 {
2343 tempreg = treg;
2344 used_at = 0;
2345 }
2346 goto sd_ab;
2347 case M_SD_AB:
2348 s = "sw";
2349 s2 = "sd";
2350 tempreg = AT;
2351 used_at = 1;
2352 sd_ab:
2353 if (gp_reference (&offset_expr))
2354 {
2355 if (breg == 0)
2356 {
2357 tempreg = GP;
2358 used_at = 0;
2359 }
2360 else
2361 macro_build (&icnt, (expressionS *) NULL,
2362 mips_isa < 3 ? "addu" : "daddu",
2363 "d,v,t", tempreg, breg, GP);
2364 }
2365 else
2366 {
2367 /* FIXME: This won't work for a 64 bit address. */
2368 macro_build_lui (&icnt, &offset_expr, tempreg);
2369 if (breg != 0)
2370 macro_build (&icnt, NULL,
2371 mips_isa < 3 ? "addu" : "daddu",
2372 "d,v,t", tempreg, tempreg, breg);
2373 }
2374 if (mips_isa >= 3)
2375 macro_build (&icnt, &offset_expr, s2, "t,o(b)", treg, tempreg);
2376 else
2377 {
2378 macro_build (&icnt, &offset_expr, s, "t,o(b)", treg, tempreg);
2379 offset_expr.X_add_number += 4;
2380 macro_build (&icnt, &offset_expr, s, "t,o(b)", treg + 1, tempreg);
2381 }
2382 if (used_at)
2383 break;
2384 return;
2385
2386 case M_DMUL:
2387 dbl = 1;
2388 case M_MUL:
2389 macro_build (&icnt, NULL,
2390 dbl ? "dmultu" : "multu",
2391 "s,t", sreg, treg);
2392 macro_build (&icnt, NULL, "mflo", "d", dreg);
2393 return;
2394
2395 case M_DMUL_I:
2396 dbl = 1;
2397 case M_MUL_I:
2398 /* The MIPS assembler some times generates shifts and adds. I'm
2399 not trying to be that fancy. GCC should do this for us
2400 anyway. */
2401 load_register (&icnt, AT, &imm_expr);
2402 macro_build (&icnt, NULL,
2403 dbl ? "dmult" : "mult",
2404 "s,t", sreg, AT);
2405 macro_build (&icnt, NULL, "mflo", "d", dreg);
2406 break;
2407
2408 case M_DMULO:
2409 dbl = 1;
2410 case M_MULO:
2411 mips_emit_delays ();
2412 ++mips_noreorder;
2413 macro_build (&icnt, NULL,
2414 dbl ? "dmult" : "mult",
2415 "s,t", sreg, treg);
2416 macro_build (&icnt, NULL, "mflo", "d", dreg);
2417 macro_build (&icnt, NULL,
2418 dbl ? "dsra32" : "sra",
2419 "d,w,<", dreg, dreg, 31);
2420 macro_build (&icnt, NULL, "mfhi", "d", AT);
2421 expr1.X_add_number = 8;
2422 macro_build (&icnt, &expr1, "beq", "s,t,p", dreg, AT);
2423 macro_build (&icnt, NULL, "nop", "", 0);
2424 macro_build (&icnt, NULL, "break", "c", 6);
2425 --mips_noreorder;
2426 macro_build (&icnt, NULL, "mflo", "d", dreg);
2427 break;
2428
2429 case M_DMULOU:
2430 dbl = 1;
2431 case M_MULOU:
2432 mips_emit_delays ();
2433 ++mips_noreorder;
2434 macro_build (&icnt, NULL,
2435 dbl ? "dmultu" : "multu",
2436 "s,t", sreg, treg);
2437 macro_build (&icnt, NULL, "mfhi", "d", AT);
2438 macro_build (&icnt, NULL, "mflo", "d", dreg);
2439 expr1.X_add_number = 8;
2440 macro_build (&icnt, &expr1, "beq", "s,t,p", AT, 0);
2441 macro_build (&icnt, NULL, "nop", "", 0);
2442 macro_build (&icnt, NULL, "break", "c", 6);
2443 --mips_noreorder;
2444 break;
2445
2446 case M_ROL:
2447 macro_build (&icnt, NULL, "subu", "d,v,t", AT, 0, treg);
2448 macro_build (&icnt, NULL, "srlv", "d,t,s", AT, sreg, AT);
2449 macro_build (&icnt, NULL, "sllv", "d,t,s", dreg, sreg, treg);
2450 macro_build (&icnt, NULL, "or", "d,v,t", dreg, dreg, AT);
2451 break;
2452
2453 case M_ROL_I:
2454 macro_build (&icnt, NULL, "sll", "d,w,<", AT, sreg,
2455 imm_expr.X_add_number & 0x1f);
2456 macro_build (&icnt, NULL, "srl", "d,w,<", dreg, sreg,
2457 (0 - imm_expr.X_add_number) & 0x1f);
2458 macro_build (&icnt, NULL, "or", "d,v,t", dreg, dreg, AT);
2459 break;
2460
2461 case M_ROR:
2462 macro_build (&icnt, NULL, "subu", "d,v,t", AT, 0, treg);
2463 macro_build (&icnt, NULL, "sllv", "d,t,s", AT, sreg, AT);
2464 macro_build (&icnt, NULL, "srlv", "d,t,s", dreg, sreg, treg);
2465 macro_build (&icnt, NULL, "or", "d,v,t", dreg, dreg, AT);
2466 break;
2467
2468 case M_ROR_I:
2469 macro_build (&icnt, NULL, "srl", "d,w,<", AT, sreg,
2470 imm_expr.X_add_number & 0x1f);
2471 macro_build (&icnt, NULL, "sll", "d,w,<", dreg, sreg,
2472 (0 - imm_expr.X_add_number) & 0x1f);
2473 macro_build (&icnt, NULL, "or", "d,v,t", dreg, dreg, AT);
2474 break;
2475
2476 case M_S_DOB:
2477 assert (mips_isa < 2);
2478 /* Even on a big endian machine $fn comes before $fn+1. We have
2479 to adjust when storing to memory. */
2480 macro_build (&icnt, &offset_expr, "swc1", "T,o(b)",
2481 byte_order == LITTLE_ENDIAN ? treg : treg + 1,
2482 breg);
2483 offset_expr.X_add_number += 4;
2484 macro_build (&icnt, &offset_expr, "swc1", "T,o(b)",
2485 byte_order == LITTLE_ENDIAN ? treg + 1 : treg,
2486 breg);
2487 return;
2488
2489 case M_S_DAB:
2490 if (gp_reference (&offset_expr))
2491 {
2492 if (breg == 0)
2493 tempreg = GP;
2494 else
2495 {
2496 macro_build (&icnt, (expressionS *) NULL,
2497 mips_isa < 3 ? "addu" : "daddu",
2498 "d,v,t", AT, breg, GP);
2499 tempreg = AT;
2500 }
2501 }
2502 else
2503 {
2504 /* FIXME: This won't work for a 64 bit address. */
2505 macro_build_lui (&icnt, &offset_expr, AT);
2506 if (breg != 0)
2507 macro_build (&icnt, NULL,
2508 mips_isa < 3 ? "addu" : "daddu",
2509 "d,v,t", AT, AT, breg);
2510 tempreg = AT;
2511 }
2512 if (mips_isa >= 2)
2513 macro_build (&icnt, &offset_expr, "sdc1", "T,o(b)", treg, tempreg);
2514 else
2515 {
2516 /* Even on a big endian machine $fn comes before $fn+1. We
2517 have to adjust when storing to memory. */
2518 macro_build (&icnt, &offset_expr, "swc1", "T,o(b)",
2519 byte_order == LITTLE_ENDIAN ? treg : treg + 1,
2520 tempreg);
2521 offset_expr.X_add_number += 4;
2522 macro_build (&icnt, &offset_expr, "swc1", "T,o(b)",
2523 byte_order == LITTLE_ENDIAN ? treg + 1 : treg,
2524 tempreg);
2525 }
2526 if (tempreg == AT)
2527 break;
2528 return;
2529
2530 case M_SEQ:
2531 if (sreg == 0)
2532 macro_build (&icnt, &expr1, "sltiu", "t,r,j", dreg, treg);
2533 else if (treg == 0)
2534 macro_build (&icnt, &expr1, "sltiu", "t,r,j", dreg, sreg);
2535 else
2536 {
2537 macro_build (&icnt, NULL, "xor", "d,v,t", dreg, sreg, treg);
2538 macro_build (&icnt, &expr1, "sltiu", "t,r,j", dreg, dreg);
2539 }
2540 return;
2541
2542 case M_SEQ_I:
2543 if (imm_expr.X_add_number == 0)
2544 {
2545 macro_build (&icnt, &expr1, "sltiu", "t,r,j", dreg, sreg);
2546 return;
2547 }
2548 if (sreg == 0)
2549 {
2550 as_warn ("Instruction %s: result is always false",
2551 ip->insn_mo->name);
2552 macro_build (&icnt, NULL, "move", "d,s", dreg, 0);
2553 return;
2554 }
2555 if (imm_expr.X_add_number >= 0 && imm_expr.X_add_number < 0x10000)
2556 {
2557 macro_build (&icnt, &imm_expr, "xori", "t,r,i", dreg, sreg);
2558 used_at = 0;
2559 }
2560 else if (imm_expr.X_add_number > -0x8000 && imm_expr.X_add_number < 0)
2561 {
2562 imm_expr.X_add_number = -imm_expr.X_add_number;
2563 macro_build (&icnt, &imm_expr,
2564 mips_isa < 3 ? "addiu" : "daddiu",
2565 "t,r,j", dreg, sreg);
2566 used_at = 0;
2567 }
2568 else
2569 {
2570 load_register (&icnt, AT, &imm_expr);
2571 macro_build (&icnt, NULL, "xor", "d,v,t", dreg, sreg, AT);
2572 used_at = 1;
2573 }
2574 macro_build (&icnt, &expr1, "sltiu", "t,r,j", dreg, dreg);
2575 if (used_at)
2576 break;
2577 return;
2578
2579 case M_SGE: /* sreg >= treg <==> not (sreg < treg) */
2580 s = "slt";
2581 goto sge;
2582 case M_SGEU:
2583 s = "sltu";
2584 sge:
2585 macro_build (&icnt, NULL, s, "d,v,t", dreg, sreg, treg);
2586 macro_build (&icnt, &expr1, "xori", "t,r,i", dreg, dreg);
2587 return;
2588
2589 case M_SGE_I: /* sreg >= I <==> not (sreg < I) */
2590 case M_SGEU_I:
2591 if (imm_expr.X_add_number >= -0x8000 && imm_expr.X_add_number < 0x8000)
2592 {
2593 macro_build (&icnt, &expr1,
2594 mask == M_SGE_I ? "slti" : "sltiu",
2595 "t,r,j", dreg, sreg);
2596 used_at = 0;
2597 }
2598 else
2599 {
2600 load_register (&icnt, AT, &imm_expr);
2601 macro_build (&icnt, NULL,
2602 mask == M_SGE_I ? "slt" : "sltu",
2603 "d,v,t", dreg, sreg, AT);
2604 used_at = 1;
2605 }
2606 macro_build (&icnt, &expr1, "xori", "t,r,i", dreg, dreg);
2607 if (used_at)
2608 break;
2609 return;
2610
2611 case M_SGT: /* sreg > treg <==> treg < sreg */
2612 s = "slt";
2613 goto sgt;
2614 case M_SGTU:
2615 s = "sltu";
2616 sgt:
2617 macro_build (&icnt, NULL, s, "d,v,t", dreg, treg, sreg);
2618 return;
2619
2620 case M_SGT_I: /* sreg > I <==> I < sreg */
2621 s = "slt";
2622 goto sgti;
2623 case M_SGTU_I:
2624 s = "sltu";
2625 sgti:
2626 load_register (&icnt, AT, &imm_expr);
2627 macro_build (&icnt, NULL, s, "d,v,t", dreg, AT, sreg);
2628 break;
2629
2630 case M_SLE: /* sreg <= treg <==> treg >= sreg <==> not (treg < sreg) */
2631 s = "slt";
2632 goto sle;
2633 case M_SLEU:
2634 s = "sltu";
2635 sle:
2636 macro_build (&icnt, NULL, s, "d,v,t", dreg, treg, sreg);
2637 macro_build (&icnt, &expr1, "xori", "t,r,i", dreg, dreg);
2638 return;
2639
2640 case M_SLE_I: /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
2641 s = "slt";
2642 goto slei;
2643 case M_SLEU_I:
2644 s = "sltu";
2645 slei:
2646 load_register (&icnt, AT, &imm_expr);
2647 macro_build (&icnt, NULL, s, "d,v,t", dreg, AT, sreg);
2648 macro_build (&icnt, &expr1, "xori", "t,r,i", dreg, dreg);
2649 break;
2650
2651 case M_SLT_I:
2652 if (imm_expr.X_add_number >= -0x8000 && imm_expr.X_add_number < 0x8000)
2653 {
2654 macro_build (&icnt, &imm_expr, "slti", "t,r,j", dreg, sreg);
2655 return;
2656 }
2657 load_register (&icnt, AT, &imm_expr);
2658 macro_build (&icnt, NULL, "slt", "d,v,t", dreg, sreg, AT);
2659 break;
2660
2661 case M_SLTU_I:
2662 if (imm_expr.X_add_number >= -0x8000 && imm_expr.X_add_number < 0x8000)
2663 {
2664 macro_build (&icnt, &imm_expr, "sltiu", "t,r,j", dreg, sreg);
2665 return;
2666 }
2667 load_register (&icnt, AT, &imm_expr);
2668 macro_build (&icnt, NULL, "sltu", "d,v,t", dreg, sreg, AT);
2669 break;
2670
2671 case M_SNE:
2672 if (sreg == 0)
2673 macro_build (&icnt, NULL, "sltu", "d,v,t", dreg, 0, treg);
2674 else if (treg == 0)
2675 macro_build (&icnt, NULL, "sltu", "d,v,t", dreg, 0, sreg);
2676 else
2677 {
2678 macro_build (&icnt, NULL, "xor", "d,v,t", dreg, sreg, treg);
2679 macro_build (&icnt, NULL, "sltu", "d,v,t", dreg, 0, dreg);
2680 }
2681 return;
2682
2683 case M_SNE_I:
2684 if (imm_expr.X_add_number == 0)
2685 {
2686 macro_build (&icnt, NULL, "sltu", "d,v,t", dreg, 0, sreg);
2687 return;
2688 }
2689 if (sreg == 0)
2690 {
2691 as_warn ("Instruction %s: result is always true",
2692 ip->insn_mo->name);
2693 macro_build (&icnt, &expr1,
2694 mips_isa < 3 ? "addiu" : "daddiu",
2695 "t,r,j", dreg, 0);
2696 return;
2697 }
2698 if (imm_expr.X_add_number >= 0 && imm_expr.X_add_number < 0x10000)
2699 {
2700 macro_build (&icnt, &imm_expr, "xori", "t,r,i", dreg, sreg);
2701 used_at = 0;
2702 }
2703 else if (imm_expr.X_add_number > -0x8000 && imm_expr.X_add_number < 0)
2704 {
2705 imm_expr.X_add_number = -imm_expr.X_add_number;
2706 macro_build (&icnt, &imm_expr,
2707 mips_isa < 3 ? "addiu" : "daddiu",
2708 "t,r,j", dreg, sreg);
2709 used_at = 0;
2710 }
2711 else
2712 {
2713 load_register (&icnt, AT, &imm_expr);
2714 macro_build (&icnt, NULL, "xor", "d,v,t", dreg, sreg, AT);
2715 used_at = 1;
2716 }
2717 macro_build (&icnt, NULL, "sltu", "d,v,t", dreg, 0, dreg);
2718 if (used_at)
2719 break;
2720 return;
2721
2722 case M_DSUB_I:
2723 dbl = 1;
2724 case M_SUB_I:
2725 if (imm_expr.X_add_number > -0x8000 && imm_expr.X_add_number <= 0x8000)
2726 {
2727 imm_expr.X_add_number = -imm_expr.X_add_number;
2728 macro_build (&icnt, &imm_expr,
2729 dbl ? "daddi" : "addi",
2730 "t,r,j", dreg, sreg);
2731 return;
2732 }
2733 load_register (&icnt, AT, &imm_expr);
2734 macro_build (&icnt, NULL,
2735 dbl ? "dsub" : "sub",
2736 "d,v,t", dreg, sreg, AT);
2737 break;
2738
2739 case M_DSUBU_I:
2740 dbl = 1;
2741 case M_SUBU_I:
2742 if (imm_expr.X_add_number > -0x8000 && imm_expr.X_add_number <= 0x8000)
2743 {
2744 imm_expr.X_add_number = -imm_expr.X_add_number;
2745 macro_build (&icnt, &imm_expr,
2746 dbl ? "daddiu" : "addiu",
2747 "t,r,j", dreg, sreg);
2748 return;
2749 }
2750 load_register (&icnt, AT, &imm_expr);
2751 macro_build (&icnt, NULL,
2752 dbl ? "dsubu" : "subu",
2753 "d,v,t", dreg, sreg, AT);
2754 break;
2755
2756 case M_TEQ_I:
2757 s = "teq";
2758 goto trap;
2759 case M_TGE_I:
2760 s = "tge";
2761 goto trap;
2762 case M_TGEU_I:
2763 s = "tgeu";
2764 goto trap;
2765 case M_TLT_I:
2766 s = "tlt";
2767 goto trap;
2768 case M_TLTU_I:
2769 s = "tltu";
2770 goto trap;
2771 case M_TNE_I:
2772 s = "tne";
2773 trap:
2774 load_register (&icnt, AT, &imm_expr);
2775 macro_build (&icnt, NULL, s, "s,t", sreg, AT);
2776 break;
2777
2778 case M_TRUNCWD:
2779 case M_TRUNCWS:
2780 assert (mips_isa < 2);
2781 sreg = (ip->insn_opcode >> 11) & 0x1f; /* floating reg */
2782 dreg = (ip->insn_opcode >> 06) & 0x1f; /* floating reg */
2783
2784 /*
2785 * Is the double cfc1 instruction a bug in the mips assembler;
2786 * or is there a reason for it?
2787 */
2788 mips_emit_delays ();
2789 ++mips_noreorder;
2790 macro_build (&icnt, NULL, "cfc1", "t,G", treg, 31);
2791 macro_build (&icnt, NULL, "cfc1", "t,G", treg, 31);
2792 macro_build (&icnt, NULL, "nop", "");
2793 expr1.X_add_number = 3;
2794 macro_build (&icnt, &expr1, "ori", "t,r,i", AT, treg);
2795 expr1.X_add_number = 2;
2796 macro_build (&icnt, &expr1, "xori", "t,r,i", AT, AT);
2797 macro_build (&icnt, NULL, "ctc1", "t,G", AT, 31);
2798 macro_build (&icnt, NULL, "nop", "");
2799 macro_build (&icnt, NULL,
2800 mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S", dreg, sreg);
2801 macro_build (&icnt, NULL, "ctc1", "t,G", treg, 31);
2802 macro_build (&icnt, NULL, "nop", "");
2803 --mips_noreorder;
2804 break;
2805
2806 case M_ULH:
2807 s = "lb";
2808 goto ulh;
2809 case M_ULHU:
2810 s = "lbu";
2811 ulh:
2812 /* avoid load delay */
2813 offset_expr.X_add_number += 1;
2814 macro_build (&icnt, &offset_expr, s, "t,o(b)", treg, breg);
2815 offset_expr.X_add_number -= 1;
2816 macro_build (&icnt, &offset_expr, "lbu", "t,o(b)", AT, breg);
2817 macro_build (&icnt, NULL, "sll", "d,w,<", treg, treg, 8);
2818 macro_build (&icnt, NULL, "or", "d,v,t", treg, treg, AT);
2819 break;
2820
2821 case M_ULW:
2822 /* does this work on a big endian machine? */
2823 offset_expr.X_add_number += 3;
2824 macro_build (&icnt, &offset_expr, "lwl", "t,o(b)", treg, breg);
2825 offset_expr.X_add_number -= 3;
2826 macro_build (&icnt, &offset_expr, "lwr", "t,o(b)", treg, breg);
2827 return;
2828
2829 case M_ULH_A:
2830 case M_ULHU_A:
2831 case M_ULW_A:
2832 if (offset_expr.X_op == O_constant)
2833 load_register (&icnt, AT, &offset_expr);
2834 else if (gp_reference (&offset_expr))
2835 macro_build (&icnt, &offset_expr,
2836 mips_isa < 3 ? "addiu" : "daddiu",
2837 "t,r,j", AT, GP);
2838 else
2839 {
2840 /* FIXME: This won't work for a 64 bit address. */
2841 macro_build_lui (&icnt, &offset_expr, AT);
2842 macro_build (&icnt, &offset_expr,
2843 mips_isa < 3 ? "addiu" : "daddiu",
2844 "t,r,j", AT, AT);
2845 }
2846 if (mask == M_ULW_A)
2847 {
2848 expr1.X_add_number = 3;
2849 macro_build (&icnt, &expr1, "lwl", "t,o(b)", treg, AT);
2850 imm_expr.X_add_number = 0;
2851 macro_build (&icnt, &expr1, "lwr", "t,o(b)", treg, AT);
2852 }
2853 else
2854 {
2855 macro_build (&icnt, &expr1,
2856 mask == M_ULH_A ? "lb" : "lbu", "t,o(b)", treg, AT);
2857 imm_expr.X_add_number = 0;
2858 macro_build (&icnt, &expr1, "lbu", "t,o(b)", AT, AT);
2859 macro_build (&icnt, NULL, "sll", "d,w,<", treg, treg, 8);
2860 macro_build (&icnt, NULL, "or", "d,v,t", treg, treg, AT);
2861 }
2862 break;
2863
2864 case M_USH:
2865 macro_build (&icnt, &offset_expr, "sb", "t,o(b)", treg, breg);
2866 macro_build (&icnt, NULL, "srl", "d,w,<", AT, treg, 8);
2867 offset_expr.X_add_number += 1;
2868 macro_build (&icnt, &offset_expr, "sb", "t,o(b)", AT, breg);
2869 break;
2870
2871 case M_USW:
2872 offset_expr.X_add_number += 3;
2873 macro_build (&icnt, &offset_expr, "swl", "t,o(b)", treg, breg);
2874 offset_expr.X_add_number -= 3;
2875 macro_build (&icnt, &offset_expr, "swr", "t,o(b)", treg, breg);
2876 return;
2877
2878 case M_USH_A:
2879 case M_USW_A:
2880 if (offset_expr.X_op == O_constant)
2881 load_register (&icnt, AT, &offset_expr);
2882 else if (gp_reference (&offset_expr))
2883 macro_build (&icnt, &offset_expr,
2884 mips_isa < 3 ? "addiu" : "daddiu",
2885 "t,r,j", AT, GP);
2886 else
2887 {
2888 /* FIXME: This won't work for a 64 bit address. */
2889 macro_build_lui (&icnt, &offset_expr, AT);
2890 macro_build (&icnt, &offset_expr,
2891 mips_isa < 3 ? "addiu" : "daddiu",
2892 "t,r,j", AT, AT);
2893 }
2894 if (mask == M_USW_A)
2895 {
2896 expr1.X_add_number = 3;
2897 macro_build (&icnt, &expr1, "swl", "t,o(b)", treg, AT);
2898 expr1.X_add_number = 0;
2899 macro_build (&icnt, &expr1, "swr", "t,o(b)", treg, AT);
2900 }
2901 else
2902 {
2903 expr1.X_add_number = 0;
2904 macro_build (&icnt, &expr1, "sb", "t,o(b)", treg, AT);
2905 macro_build (&icnt, NULL, "srl", "d,w,<", treg, treg, 8);
2906 expr1.X_add_number = 1;
2907 macro_build (&icnt, &expr1, "sb", "t,o(b)", treg, AT);
2908 expr1.X_add_number = 0;
2909 macro_build (&icnt, &expr1, "lbu", "t,o(b)", AT, AT);
2910 macro_build (&icnt, NULL, "sll", "d,w,<", treg, treg, 8);
2911 macro_build (&icnt, NULL, "or", "d,v,t", treg, treg, AT);
2912 }
2913 break;
2914
2915 default:
2916 as_bad ("Macro %s not implemented yet", ip->insn_mo->name);
2917 break;
2918 }
2919 if (mips_noat)
2920 as_warn ("Macro used $at after \".set noat\"");
2921 }
2922
2923
2924 /*
2925 This routine assembles an instruction into its binary format. As a side
2926 effect it sets one of the global variables imm_reloc or offset_reloc to the
2927 type of relocation to do if one of the operands is an address expression.
2928 */
2929 static void
2930 mips_ip (str, ip)
2931 char *str;
2932 struct mips_cl_insn *ip;
2933 {
2934 char *s;
2935 const char *args;
2936 char c;
2937 struct mips_opcode *insn;
2938 char *argsStart;
2939 unsigned int regno;
2940 unsigned int lastregno = 0;
2941 char *s_reset;
2942
2943 insn_error = NULL;
2944
2945 for (s = str; islower (*s) || (*s >= '0' && *s <= '3') || *s == '.'; ++s)
2946 continue;
2947 switch (*s)
2948 {
2949 case '\0':
2950 break;
2951
2952 case ' ':
2953 *s++ = '\0';
2954 break;
2955
2956 default:
2957 as_warn ("Unknown opcode: `%s'", str);
2958 exit (1);
2959 }
2960 if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
2961 {
2962 as_warn ("`%s' not in hash table.", str);
2963 insn_error = "ERROR: Unrecognized opcode";
2964 return;
2965 }
2966 argsStart = s;
2967 for (;;)
2968 {
2969 int insn_isa;
2970
2971 assert (strcmp (insn->name, str) == 0);
2972
2973 if (insn->pinfo == INSN_MACRO)
2974 insn_isa = insn->match;
2975 else if (insn->pinfo & INSN_ISA2)
2976 insn_isa = 2;
2977 else if (insn->pinfo & INSN_ISA3)
2978 insn_isa = 3;
2979 else
2980 insn_isa = 1;
2981
2982 if (insn_isa > mips_isa)
2983 {
2984 if (insn + 1 < &mips_opcodes[NUMOPCODES]
2985 && strcmp (insn->name, insn[1].name) == 0)
2986 {
2987 ++insn;
2988 continue;
2989 }
2990 insn_error = "ERROR: instruction not supported on this processor";
2991 return;
2992 }
2993
2994 ip->insn_mo = insn;
2995 ip->insn_opcode = insn->match;
2996 for (args = insn->args;; ++args)
2997 {
2998 if (*s == ' ')
2999 ++s;
3000 switch (*args)
3001 {
3002 case '\0': /* end of args */
3003 if (*s == '\0')
3004 return;
3005 break;
3006
3007 case ',':
3008 if (*s++ == *args)
3009 continue;
3010 s--;
3011 switch (*++args)
3012 {
3013 case 'r':
3014 case 'v':
3015 ip->insn_opcode |= lastregno << 21;
3016 continue;
3017
3018 case 'w':
3019 case 'W':
3020 ip->insn_opcode |= lastregno << 16;
3021 continue;
3022
3023 case 'V':
3024 ip->insn_opcode |= lastregno << 11;
3025 continue;
3026 }
3027 break;
3028
3029 case '(':
3030 /* handle optional base register.
3031 Either the base register is omitted or
3032 we must have a left paren. */
3033 /* this is dependent on the next operand specifier
3034 is a 'b' for base register */
3035 assert (args[1] == 'b');
3036 if (*s == '\0')
3037 return;
3038
3039 case ')': /* these must match exactly */
3040 if (*s++ == *args)
3041 continue;
3042 break;
3043
3044 case '<': /* must be at least one digit */
3045 /*
3046 * According to the manual, if the shift amount is greater
3047 * than 31 or less than 0 the the shift amount should be
3048 * mod 32. In reality the mips assembler issues an error.
3049 * We issue a warning and do the mod.
3050 */
3051 my_getExpression (&imm_expr, s);
3052 check_absolute_expr (ip, &imm_expr);
3053 if ((unsigned long) imm_expr.X_add_number > 31)
3054 {
3055 as_warn ("Improper shift amount (%ld)",
3056 (long) imm_expr.X_add_number);
3057 imm_expr.X_add_number = imm_expr.X_add_number % 32;
3058 }
3059 ip->insn_opcode |= imm_expr.X_add_number << 6;
3060 imm_expr.X_op = O_absent;
3061 s = expr_end;
3062 continue;
3063
3064 case '>': /* shift amount minus 32 */
3065 my_getExpression (&imm_expr, s);
3066 check_absolute_expr (ip, &imm_expr);
3067 if ((unsigned long) imm_expr.X_add_number < 32
3068 || (unsigned long) imm_expr.X_add_number > 63)
3069 break;
3070 ip->insn_opcode |= (imm_expr.X_add_number - 32) << 6;
3071 imm_expr.X_op = O_absent;
3072 s = expr_end;
3073 continue;
3074
3075 case 'c': /* break code */
3076 my_getExpression (&imm_expr, s);
3077 check_absolute_expr (ip, &imm_expr);
3078 if ((unsigned) imm_expr.X_add_number > 1023)
3079 as_warn ("Illegal break code (%ld)",
3080 (long) imm_expr.X_add_number);
3081 ip->insn_opcode |= imm_expr.X_add_number << 16;
3082 imm_expr.X_op = O_absent;
3083 s = expr_end;
3084 continue;
3085
3086 case 'B': /* syscall code */
3087 my_getExpression (&imm_expr, s);
3088 check_absolute_expr (ip, &imm_expr);
3089 if ((unsigned) imm_expr.X_add_number > 0xfffff)
3090 as_warn ("Illegal syscall code (%ld)",
3091 (long) imm_expr.X_add_number);
3092 ip->insn_opcode |= imm_expr.X_add_number << 6;
3093 imm_expr.X_op = O_absent;
3094 s = expr_end;
3095 continue;
3096
3097 case 'C': /* Coprocessor code */
3098 my_getExpression (&imm_expr, s);
3099 check_absolute_expr (ip, &imm_expr);
3100 if ((unsigned long) imm_expr.X_add_number >= (1<<25))
3101 {
3102 as_warn ("Coproccesor code > 25 bits (%ld)",
3103 (long) imm_expr.X_add_number);
3104 imm_expr.X_add_number &= ((1<<25) - 1);
3105 }
3106 ip->insn_opcode |= imm_expr.X_add_number;
3107 imm_expr.X_op = O_absent;
3108 s = expr_end;
3109 continue;
3110
3111 case 'b': /* base register */
3112 case 'd': /* destination register */
3113 case 's': /* source register */
3114 case 't': /* target register */
3115 case 'r': /* both target and source */
3116 case 'v': /* both dest and source */
3117 case 'w': /* both dest and target */
3118 case 'E': /* coprocessor target register */
3119 case 'G': /* coprocessor destination register */
3120 case 'x': /* ignore register name */
3121 case 'z': /* must be zero register */
3122 s_reset = s;
3123 if (s[0] == '$')
3124 {
3125 if (isdigit (s[1]))
3126 {
3127 ++s;
3128 regno = 0;
3129 do
3130 {
3131 regno *= 10;
3132 regno += *s - '0';
3133 ++s;
3134 }
3135 while (isdigit (*s));
3136 if (regno > 31)
3137 as_bad ("Invalid register number (%d)", regno);
3138 }
3139 else if (*args != 'E' && *args != 'G')
3140 {
3141 if (s[1] == 'f' && s[2] == 'p')
3142 {
3143 s += 3;
3144 regno = 30;
3145 }
3146 else if (s[1] == 's' && s[2] == 'p')
3147 {
3148 s += 3;
3149 regno = 29;
3150 }
3151 else if (s[1] == 'g' && s[2] == 'p')
3152 {
3153 s += 3;
3154 regno = 28;
3155 }
3156 else if (s[1] == 'a' && s[2] == 't')
3157 {
3158 s += 3;
3159 regno = 1;
3160 }
3161 else
3162 goto notreg;
3163 if (regno == AT && ! mips_noat)
3164 as_warn ("Used $at without \".set noat\"");
3165 }
3166 c = *args;
3167 if (*s == ' ')
3168 s++;
3169 if (args[1] != *s)
3170 {
3171 if (c == 'r' || c == 'v' || c == 'w')
3172 {
3173 regno = lastregno;
3174 s = s_reset;
3175 args++;
3176 }
3177 }
3178 /* 'z' only matches $0. */
3179 if (c == 'z' && regno != 0)
3180 break;
3181 switch (c)
3182 {
3183 case 'r':
3184 case 's':
3185 case 'v':
3186 case 'b':
3187 ip->insn_opcode |= regno << 21;
3188 break;
3189 case 'd':
3190 case 'G':
3191 ip->insn_opcode |= regno << 11;
3192 break;
3193 case 'w':
3194 case 't':
3195 case 'E':
3196 ip->insn_opcode |= regno << 16;
3197 break;
3198 case 'x':
3199 /* This case exists because on the r3000 trunc
3200 expands into a macro which requires a gp
3201 register. On the r6000 or r4000 it is
3202 assembled into a single instruction which
3203 ignores the register. Thus the insn version
3204 is MIPS_ISA2 and uses 'x', and the macro
3205 version is MIPS_ISA1 and uses 't'. */
3206 break;
3207 case 'z':
3208 /* This case is for the div instruction, which
3209 acts differently if the destination argument
3210 is $0. This only matches $0, and is checked
3211 outside the switch. */
3212 break;
3213 }
3214 lastregno = regno;
3215 continue;
3216 }
3217 notreg:
3218 switch (*args++)
3219 {
3220 case 'r':
3221 case 'v':
3222 ip->insn_opcode |= lastregno << 21;
3223 continue;
3224 case 'w':
3225 ip->insn_opcode |= lastregno << 16;
3226 continue;
3227 }
3228 break;
3229
3230 case 'D': /* floating point destination register */
3231 case 'S': /* floating point source register */
3232 case 'T': /* floating point target register */
3233 case 'V':
3234 case 'W':
3235 s_reset = s;
3236 if (s[0] == '$' && s[1] == 'f' && isdigit (s[2]))
3237 {
3238 s += 2;
3239 regno = 0;
3240 do
3241 {
3242 regno *= 10;
3243 regno += *s - '0';
3244 ++s;
3245 }
3246 while (isdigit (*s));
3247
3248 if (regno > 31)
3249 as_bad ("Invalid float register number (%d)", regno);
3250
3251 if ((regno & 1) &&
3252 !(strcmp (str, "mtc1") == 0 ||
3253 strcmp (str, "mfc1") == 0 ||
3254 strcmp (str, "lwc1") == 0 ||
3255 strcmp (str, "swc1") == 0))
3256 as_warn ("Float register should be even, was %d",
3257 regno);
3258
3259 c = *args;
3260 if (*s == ' ')
3261 s++;
3262 if (args[1] != *s)
3263 {
3264 if (c == 'V' || c == 'W')
3265 {
3266 regno = lastregno;
3267 s = s_reset;
3268 args++;
3269 }
3270 }
3271 switch (c)
3272 {
3273 case 'D':
3274 ip->insn_opcode |= regno << 6;
3275 break;
3276 case 'V':
3277 case 'S':
3278 ip->insn_opcode |= regno << 11;
3279 break;
3280 case 'W':
3281 case 'T':
3282 ip->insn_opcode |= regno << 16;
3283 }
3284 lastregno = regno;
3285 continue;
3286 }
3287 switch (*args++)
3288 {
3289 case 'V':
3290 ip->insn_opcode |= lastregno << 11;
3291 continue;
3292 case 'W':
3293 ip->insn_opcode |= lastregno << 16;
3294 continue;
3295 }
3296 break;
3297
3298 case 'I':
3299 my_getExpression (&imm_expr, s);
3300 check_absolute_expr (ip, &imm_expr);
3301 s = expr_end;
3302 continue;
3303
3304 case 'A':
3305 my_getExpression (&offset_expr, s);
3306 imm_reloc = BFD_RELOC_32;
3307 s = expr_end;
3308 continue;
3309
3310 case 'F':
3311 case 'L':
3312 case 'f':
3313 case 'l':
3314 {
3315 int f64;
3316 char *save_in;
3317 char *err;
3318 unsigned char temp[8];
3319 int len;
3320 unsigned int length;
3321 segT seg;
3322 subsegT subseg;
3323 char *p;
3324
3325 /* These only appear as the last operand in an
3326 instruction, and every instruction that accepts
3327 them in any variant accepts them in all variants.
3328 This means we don't have to worry about backing out
3329 any changes if the instruction does not match.
3330
3331 The difference between them is the size of the
3332 floating point constant and where it goes. For 'F'
3333 and 'L' the constant is 64 bits; for 'f' and 'l' it
3334 is 32 bits. Where the constant is placed is based
3335 on how the MIPS assembler does things:
3336 F -- .rdata
3337 L -- .lit8
3338 f -- immediate value
3339 l -- .lit4
3340 */
3341
3342 f64 = *args == 'F' || *args == 'L';
3343
3344 save_in = input_line_pointer;
3345 input_line_pointer = s;
3346 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
3347 length = len;
3348 s = input_line_pointer;
3349 input_line_pointer = save_in;
3350 if (err != NULL && *err != '\0')
3351 {
3352 as_bad ("Bad floating point constant: %s", err);
3353 memset (temp, '\0', sizeof temp);
3354 length = f64 ? 8 : 4;
3355 }
3356
3357 assert (length == (f64 ? 8 : 4));
3358
3359 if (*args == 'f')
3360 {
3361 imm_expr.X_op = O_constant;
3362 if (byte_order == LITTLE_ENDIAN)
3363 imm_expr.X_add_number =
3364 (((((((int) temp[3] << 8)
3365 | temp[2]) << 8)
3366 | temp[1]) << 8)
3367 | temp[0]);
3368 else
3369 imm_expr.X_add_number =
3370 (((((((int) temp[0] << 8)
3371 | temp[1]) << 8)
3372 | temp[2]) << 8)
3373 | temp[3]);
3374 }
3375 else
3376 {
3377 /* Switch to the right section. */
3378 seg = now_seg;
3379 subseg = now_subseg;
3380 switch (*args)
3381 {
3382 case 'F':
3383 subseg_new (".rdata", (subsegT) 0);
3384 break;
3385 case 'L':
3386 subseg_new (".lit8", (subsegT) 0);
3387 break;
3388 case 'l':
3389 subseg_new (".lit4", (subsegT) 0);
3390 break;
3391 }
3392 if (seg == now_seg)
3393 as_bad ("Can't use floating point insn in this section");
3394
3395 /* Set the argument to the current address in the
3396 section. */
3397 offset_expr.X_op = O_symbol;
3398 offset_expr.X_add_symbol =
3399 symbol_new ("L0\001", now_seg,
3400 (valueT) frag_now_fix (), frag_now);
3401 offset_expr.X_add_number = 0;
3402
3403 /* Put the floating point number into the section. */
3404 p = frag_more ((int) length);
3405 memcpy (p, temp, length);
3406
3407 /* Switch back to the original section. */
3408 subseg_set (seg, subseg);
3409 }
3410 }
3411 continue;
3412
3413 case 'i': /* 16 bit unsigned immediate */
3414 case 'j': /* 16 bit signed immediate */
3415 imm_reloc = BFD_RELOC_LO16;
3416 c = my_getSmallExpression (&imm_expr, s);
3417 if (c)
3418 {
3419 if (c != 'l')
3420 {
3421 if (imm_expr.X_op == O_constant)
3422 imm_expr.X_add_number =
3423 (imm_expr.X_add_number >> 16) & 0xffff;
3424 else if (c == 'h')
3425 imm_reloc = BFD_RELOC_HI16_S;
3426 else
3427 imm_reloc = BFD_RELOC_HI16;
3428 }
3429 }
3430 else
3431 check_absolute_expr (ip, &imm_expr);
3432 if (*args == 'i')
3433 {
3434 if (imm_expr.X_add_number < 0
3435 || imm_expr.X_add_number >= 0x10000)
3436 {
3437 if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
3438 !strcmp (insn->name, insn[1].name))
3439 break;
3440 as_bad ("16 bit expression not in range 0..65535");
3441 }
3442 }
3443 else
3444 {
3445 if (imm_expr.X_add_number < -0x8000 ||
3446 imm_expr.X_add_number >= 0x8000)
3447 {
3448 if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
3449 !strcmp (insn->name, insn[1].name))
3450 break;
3451 as_bad ("16 bit expression not in range -32768..32767");
3452 }
3453 }
3454 s = expr_end;
3455 continue;
3456
3457 case 'o': /* 16 bit offset */
3458 c = my_getSmallExpression (&offset_expr, s);
3459 /*
3460 * If this value won't fit into a 16 bit offset, then
3461 * go find a macro that will generate the 32 bit offset
3462 * code pattern.
3463 */
3464 if (offset_expr.X_op != O_constant
3465 || offset_expr.X_add_number >= 0x8000
3466 || offset_expr.X_add_number < -0x8000)
3467 break;
3468
3469 offset_reloc = BFD_RELOC_LO16;
3470 if (c == 'h' || c == 'H')
3471 {
3472 assert (offset_expr.X_op == O_constant);
3473 offset_expr.X_add_number =
3474 (offset_expr.X_add_number >> 16) & 0xffff;
3475 }
3476 s = expr_end;
3477 continue;
3478
3479 case 'p': /* pc relative offset */
3480 offset_reloc = BFD_RELOC_16_PCREL_S2;
3481 my_getExpression (&offset_expr, s);
3482 s = expr_end;
3483 continue;
3484
3485 case 'u': /* upper 16 bits */
3486 c = my_getSmallExpression (&imm_expr, s);
3487 if (imm_expr.X_op != O_constant
3488 || imm_expr.X_add_number < 0
3489 || imm_expr.X_add_number >= 0x10000)
3490 as_bad ("lui expression not in range 0..65535");
3491 imm_reloc = BFD_RELOC_LO16;
3492 if (c)
3493 {
3494 if (c != 'l')
3495 {
3496 if (imm_expr.X_op == O_constant)
3497 imm_expr.X_add_number =
3498 (imm_expr.X_add_number >> 16) & 0xffff;
3499 else if (c == 'h')
3500 imm_reloc = BFD_RELOC_HI16_S;
3501 else
3502 imm_reloc = BFD_RELOC_HI16;
3503 }
3504 }
3505 s = expr_end;
3506 continue;
3507
3508 case 'a': /* 26 bit address */
3509 my_getExpression (&offset_expr, s);
3510 s = expr_end;
3511 offset_reloc = BFD_RELOC_MIPS_JMP;
3512 continue;
3513
3514 default:
3515 fprintf (stderr, "bad char = '%c'\n", *args);
3516 internalError ();
3517 }
3518 break;
3519 }
3520 /* Args don't match. */
3521 if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
3522 !strcmp (insn->name, insn[1].name))
3523 {
3524 ++insn;
3525 s = argsStart;
3526 continue;
3527 }
3528 insn_error = "ERROR: Illegal operands";
3529 return;
3530 }
3531 }
3532
3533 #define LP '('
3534 #define RP ')'
3535
3536 static int
3537 my_getSmallExpression (ep, str)
3538 expressionS *ep;
3539 char *str;
3540 {
3541 char *sp;
3542 int c = 0;
3543
3544 if (*str == ' ')
3545 str++;
3546 if (*str == LP
3547 || (*str == '%' &&
3548 ((str[1] == 'h' && str[2] == 'i')
3549 || (str[1] == 'H' && str[2] == 'I')
3550 || (str[1] == 'l' && str[2] == 'o'))
3551 && str[3] == LP))
3552 {
3553 if (*str == LP)
3554 c = 0;
3555 else
3556 {
3557 c = str[1];
3558 str += 3;
3559 }
3560
3561 /*
3562 * A small expression may be followed by a base register.
3563 * Scan to the end of this operand, and then back over a possible
3564 * base register. Then scan the small expression up to that
3565 * point. (Based on code in sparc.c...)
3566 */
3567 for (sp = str; *sp && *sp != ','; sp++)
3568 ;
3569 if (sp - 4 >= str && sp[-1] == RP)
3570 {
3571 if (isdigit (sp[-2]))
3572 {
3573 for (sp -= 3; sp >= str && isdigit (*sp); sp--)
3574 ;
3575 if (*sp == '$' && sp > str && sp[-1] == LP)
3576 {
3577 sp--;
3578 goto do_it;
3579 }
3580 }
3581 else if (sp - 5 >= str
3582 && sp[-5] == LP
3583 && sp[-4] == '$'
3584 && ((sp[-3] == 'f' && sp[-2] == 'p')
3585 || (sp[-3] == 's' && sp[-2] == 'p')
3586 || (sp[-3] == 'g' && sp[-2] == 'p')
3587 || (sp[-3] == 'a' && sp[-2] == 't')))
3588 {
3589 sp -= 5;
3590 do_it:
3591 if (sp == str)
3592 {
3593 /* no expression means zero offset */
3594 if (c)
3595 {
3596 /* %xx(reg) is an error */
3597 ep->X_op = O_absent;
3598 expr_end = str - 3;
3599 }
3600 else
3601 {
3602 ep->X_op = O_constant;
3603 expr_end = sp;
3604 }
3605 ep->X_add_symbol = NULL;
3606 ep->X_op_symbol = NULL;
3607 ep->X_add_number = 0;
3608 }
3609 else
3610 {
3611 *sp = '\0';
3612 my_getExpression (ep, str);
3613 *sp = LP;
3614 }
3615 return c;
3616 }
3617 }
3618 }
3619 my_getExpression (ep, str);
3620 return c; /* => %hi or %lo encountered */
3621 }
3622
3623 static void
3624 my_getExpression (ep, str)
3625 expressionS *ep;
3626 char *str;
3627 {
3628 char *save_in;
3629
3630 save_in = input_line_pointer;
3631 input_line_pointer = str;
3632 expression (ep);
3633 expr_end = input_line_pointer;
3634 input_line_pointer = save_in;
3635 }
3636
3637 /* Turn a string in input_line_pointer into a floating point constant
3638 of type type, and store the appropriate bytes in *litP. The number
3639 of LITTLENUMS emitted is stored in *sizeP . An error message is
3640 returned, or NULL on OK. */
3641
3642 char *
3643 md_atof (type, litP, sizeP)
3644 int type;
3645 char *litP;
3646 int *sizeP;
3647 {
3648 int prec;
3649 LITTLENUM_TYPE words[4];
3650 char *t;
3651 int i;
3652
3653 switch (type)
3654 {
3655 case 'f':
3656 prec = 2;
3657 break;
3658
3659 case 'd':
3660 prec = 4;
3661 break;
3662
3663 default:
3664 *sizeP = 0;
3665 return "bad call to md_atof";
3666 }
3667
3668 t = atof_ieee (input_line_pointer, type, words);
3669 if (t)
3670 input_line_pointer = t;
3671
3672 *sizeP = prec * 2;
3673
3674 if (byte_order == LITTLE_ENDIAN)
3675 {
3676 for (i = prec - 1; i >= 0; i--)
3677 {
3678 md_number_to_chars (litP, (valueT) words[i], 2);
3679 litP += 2;
3680 }
3681 }
3682 else
3683 {
3684 for (i = 0; i < prec; i++)
3685 {
3686 md_number_to_chars (litP, (valueT) words[i], 2);
3687 litP += 2;
3688 }
3689 }
3690
3691 return NULL;
3692 }
3693
3694 void
3695 md_number_to_chars (buf, val, n)
3696 char *buf;
3697 valueT val;
3698 int n;
3699 {
3700 switch (byte_order)
3701 {
3702 case LITTLE_ENDIAN:
3703 switch (n)
3704 {
3705 case 8:
3706 *buf++ = val;
3707 val >>= 8;
3708 *buf++ = val;
3709 val >>= 8;
3710 *buf++ = val;
3711 val >>= 8;
3712 *buf++ = val;
3713 val >>= 8;
3714 /* FALLTHROUGH */
3715 case 4:
3716 *buf++ = val;
3717 val >>= 8;
3718 *buf++ = val;
3719 val >>= 8;
3720 /* FALLTHROUGH */
3721 case 2:
3722 *buf++ = val;
3723 val >>= 8;
3724 /* FALLTHROUGH */
3725 case 1:
3726 *buf = val;
3727 return;
3728
3729 default:
3730 internalError ();
3731 }
3732
3733 case BIG_ENDIAN:
3734 switch (n)
3735 {
3736 case 8:
3737 {
3738 valueT hi;
3739
3740 hi = val;
3741 hi >>= 16;
3742 hi >>= 16;
3743 md_number_to_chars (buf, hi, 4);
3744 buf += 4;
3745 }
3746 /* FALLTHROUGH */
3747 case 4:
3748 *buf++ = val >> 24;
3749 *buf++ = val >> 16;
3750 /* FALLTHROUGH */
3751 case 2:
3752 *buf++ = val >> 8;
3753 /* FALLTHROUGH */
3754 case 1:
3755 *buf = val;
3756 return;
3757
3758 default:
3759 internalError ();
3760 }
3761
3762 default:
3763 internalError ();
3764 }
3765 }
3766
3767 int
3768 md_parse_option (argP, cntP, vecP)
3769 char **argP;
3770 int *cntP;
3771 char ***vecP;
3772 {
3773 /* Accept -nocpp but ignore it. */
3774 if (strcmp (*argP, "nocpp") == 0)
3775 {
3776 *argP += 5;
3777 return 1;
3778 }
3779
3780 if (strcmp (*argP, "EL") == 0
3781 || strcmp (*argP, "EB") == 0)
3782 {
3783 /* FIXME: This breaks -L -EL. */
3784 flagseen['L'] = 0;
3785 *argP = "";
3786 return 1;
3787 }
3788
3789 if (**argP == 'O')
3790 {
3791 if ((*argP)[1] == '0')
3792 mips_optimize = 1;
3793 else
3794 mips_optimize = 2;
3795 return 1;
3796 }
3797
3798 if (**argP == 'g')
3799 {
3800 if ((*argP)[1] == '\0' || (*argP)[1] == '2')
3801 mips_optimize = 0;
3802 return 1;
3803 }
3804
3805 if (strncmp (*argP, "mips", 4) == 0)
3806 {
3807 mips_isa = atol (*argP + 4);
3808 if (mips_isa == 0)
3809 mips_isa = 1;
3810 else if (mips_isa < 1 || mips_isa > 3)
3811 {
3812 as_bad ("-mips%d not supported", mips_isa);
3813 mips_isa = 1;
3814 }
3815 *argP = "";
3816 return 1;
3817 }
3818
3819 if (strncmp (*argP, "mcpu=", 5) == 0)
3820 {
3821 char *p;
3822
3823 /* Identify the processor type */
3824 p = *argP + 5;
3825 if (strcmp (p, "default") == 0
3826 || strcmp (p, "DEFAULT") == 0)
3827 mips_isa = -1;
3828 else
3829 {
3830 if (*p == 'r' || *p == 'R')
3831 p++;
3832
3833 mips_isa = -1;
3834 switch (*p)
3835 {
3836 case '2':
3837 if (strcmp (p, "2000") == 0
3838 || strcmp (p, "2k") == 0
3839 || strcmp (p, "2K") == 0)
3840 mips_isa = 1;
3841 break;
3842
3843 case '3':
3844 if (strcmp (p, "3000") == 0
3845 || strcmp (p, "3k") == 0
3846 || strcmp (p, "3K") == 0)
3847 mips_isa = 1;
3848 break;
3849
3850 case '4':
3851 if (strcmp (p, "4000") == 0
3852 || strcmp (p, "4k") == 0
3853 || strcmp (p, "4K") == 0)
3854 mips_isa = 3;
3855 break;
3856
3857 case '6':
3858 if (strcmp (p, "6000") == 0
3859 || strcmp (p, "6k") == 0
3860 || strcmp (p, "6K") == 0)
3861 mips_isa = 2;
3862 break;
3863 }
3864
3865 if (mips_isa == -1)
3866 {
3867 as_bad ("bad value (%s) for -mcpu= switch", *argP + 5);
3868 mips_isa = 1;
3869 }
3870 }
3871
3872 *argP = "";
3873 return 1;
3874 }
3875
3876
3877 #ifdef GPOPT
3878 if (**argP == 'G')
3879 {
3880 if ((*argP)[1] != '\0')
3881 g_switch_value = atoi (*argP + 1);
3882 else if (*cntP)
3883 {
3884 **vecP = (char *) NULL;
3885 (*cntP)--;
3886 (*vecP)++;
3887 g_switch_value = atoi (**vecP);
3888 }
3889 else
3890 as_warn ("Number expected after -G");
3891 *argP = "";
3892 return 1;
3893 }
3894 #endif
3895
3896 return 1; /* pretend you parsed the character */
3897 }
3898
3899 long
3900 md_pcrel_from (fixP)
3901 fixS *fixP;
3902 {
3903 /* return the address of the delay slot */
3904 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
3905 }
3906
3907 /* This is called by emit_expr via TC_CONS_FIX_NEW when creating a
3908 reloc for a cons. We could use the definition there, except that
3909 we want to handle 64 bit relocs specially. */
3910
3911 void
3912 cons_fix_new_mips (frag, where, nbytes, exp)
3913 fragS *frag;
3914 int where;
3915 unsigned int nbytes;
3916 expressionS *exp;
3917 {
3918 /* If we are assembling in 32 bit mode, turn an 8 byte reloc into a
3919 4 byte reloc.
3920 FIXME: There is no way to select anything but 32 bit mode right
3921 now. */
3922 if (nbytes == 8)
3923 {
3924 if (byte_order == BIG_ENDIAN)
3925 where += 4;
3926 nbytes = 4;
3927 }
3928
3929 if (nbytes != 2 && nbytes != 4)
3930 as_bad ("Unsupported reloc size %d", nbytes);
3931
3932 fix_new_exp (frag_now, where, (int) nbytes, exp, 0,
3933 nbytes == 2 ? BFD_RELOC_16 : BFD_RELOC_32);
3934 }
3935
3936 int
3937 md_apply_fix (fixP, valueP)
3938 fixS *fixP;
3939 valueT *valueP;
3940 {
3941 unsigned char *buf;
3942 long insn, value;
3943
3944 assert (fixP->fx_size == 4);
3945
3946 value = *valueP;
3947 fixP->fx_addnumber = value; /* Remember value for tc_gen_reloc */
3948
3949 switch (fixP->fx_r_type)
3950 {
3951 case BFD_RELOC_32:
3952 case BFD_RELOC_MIPS_JMP:
3953 case BFD_RELOC_HI16:
3954 case BFD_RELOC_HI16_S:
3955 case BFD_RELOC_LO16:
3956 case BFD_RELOC_MIPS_GPREL:
3957 /* Nothing needed to do. The value comes from the reloc entry */
3958 return 1;
3959
3960 case BFD_RELOC_16_PCREL_S2:
3961 /*
3962 * We need to save the bits in the instruction since fixup_segment()
3963 * might be deleting the relocation entry (i.e., a branch within
3964 * the current segment).
3965 */
3966 if (value & 0x3)
3967 as_warn ("Branch to odd address (%lx)", value);
3968 value >>= 2;
3969 if ((value & ~0xFFFF) && (value & ~0xFFFF) != (-1 & ~0xFFFF))
3970 as_bad ("Relocation overflow");
3971
3972 /* update old instruction data */
3973 buf = (unsigned char *) (fixP->fx_where + fixP->fx_frag->fr_literal);
3974 switch (byte_order)
3975 {
3976 case LITTLE_ENDIAN:
3977 insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
3978 break;
3979
3980 case BIG_ENDIAN:
3981 insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
3982 break;
3983
3984 default:
3985 internalError ();
3986 return 0;
3987 }
3988 insn |= value & 0xFFFF;
3989 md_number_to_chars ((char *) buf, (valueT) insn, 4);
3990 break;
3991
3992 default:
3993 internalError ();
3994 }
3995 return 1;
3996 }
3997
3998 #if 0
3999 void
4000 printInsn (oc)
4001 unsigned long oc;
4002 {
4003 const struct mips_opcode *p;
4004 int treg, sreg, dreg, shamt;
4005 short imm;
4006 const char *args;
4007 int i;
4008
4009 for (i = 0; i < NUMOPCODES; ++i)
4010 {
4011 p = &mips_opcodes[i];
4012 if (((oc & p->mask) == p->match) && (p->pinfo != INSN_MACRO))
4013 {
4014 printf ("%08lx %s\t", oc, p->name);
4015 treg = (oc >> 16) & 0x1f;
4016 sreg = (oc >> 21) & 0x1f;
4017 dreg = (oc >> 11) & 0x1f;
4018 shamt = (oc >> 6) & 0x1f;
4019 imm = oc;
4020 for (args = p->args;; ++args)
4021 {
4022 switch (*args)
4023 {
4024 case '\0':
4025 printf ("\n");
4026 break;
4027
4028 case ',':
4029 case '(':
4030 case ')':
4031 printf ("%c", *args);
4032 continue;
4033
4034 case 'r':
4035 assert (treg == sreg);
4036 printf ("$%d,$%d", treg, sreg);
4037 continue;
4038
4039 case 'd':
4040 case 'G':
4041 printf ("$%d", dreg);
4042 continue;
4043
4044 case 't':
4045 case 'E':
4046 printf ("$%d", treg);
4047 continue;
4048
4049 case 'b':
4050 case 's':
4051 printf ("$%d", sreg);
4052 continue;
4053
4054 case 'a':
4055 printf ("0x%08lx", oc & 0x1ffffff);
4056 continue;
4057
4058 case 'i':
4059 case 'j':
4060 case 'o':
4061 case 'u':
4062 printf ("%d", imm);
4063 continue;
4064
4065 case '<':
4066 case '>':
4067 printf ("$%d", shamt);
4068 continue;
4069
4070 default:
4071 internalError ();
4072 }
4073 break;
4074 }
4075 return;
4076 }
4077 }
4078 printf ("%08lx UNDEFINED\n", oc);
4079 }
4080 #endif
4081
4082 static symbolS *
4083 get_symbol ()
4084 {
4085 int c;
4086 char *name;
4087 symbolS *p;
4088
4089 name = input_line_pointer;
4090 c = get_symbol_end ();
4091 p = (symbolS *) symbol_find_or_make (name);
4092 *input_line_pointer = c;
4093 return p;
4094 }
4095
4096 /* Align the current frag to a given power of two. The MIPS assembler
4097 also automatically adjusts any preceding label. */
4098
4099 static void
4100 mips_align (to, fill)
4101 int to;
4102 int fill;
4103 {
4104 mips_emit_delays ();
4105 frag_align (to, fill);
4106 record_alignment (now_seg, to);
4107 if (insn_label != NULL)
4108 {
4109 assert (S_GET_SEGMENT (insn_label) == now_seg);
4110 insn_label->sy_frag = frag_now;
4111 S_SET_VALUE (insn_label, (valueT) frag_now_fix ());
4112 insn_label = NULL;
4113 }
4114 }
4115
4116 /* Align to a given power of two. .align 0 turns off the automatic
4117 alignment used by the data creating pseudo-ops. */
4118
4119 static void
4120 s_align (x)
4121 int x;
4122 {
4123 register int temp;
4124 register long temp_fill;
4125 long max_alignment = 15;
4126
4127 /*
4128
4129 o Note that the assembler pulls down any immediately preceeding label
4130 to the aligned address.
4131 o It's not documented but auto alignment is reinstated by
4132 a .align pseudo instruction.
4133 o Note also that after auto alignment is turned off the mips assembler
4134 issues an error on attempt to assemble an improperly aligned data item.
4135 We don't.
4136
4137 */
4138
4139 temp = get_absolute_expression ();
4140 if (temp > max_alignment)
4141 as_bad ("Alignment too large: %d. assumed.", temp = max_alignment);
4142 else if (temp < 0)
4143 {
4144 as_warn ("Alignment negative: 0 assumed.");
4145 temp = 0;
4146 }
4147 if (*input_line_pointer == ',')
4148 {
4149 input_line_pointer++;
4150 temp_fill = get_absolute_expression ();
4151 }
4152 else
4153 temp_fill = 0;
4154 if (temp)
4155 {
4156 auto_align = 1;
4157 mips_align (temp, (int) temp_fill);
4158 }
4159 else
4160 {
4161 auto_align = 0;
4162 }
4163
4164 demand_empty_rest_of_line ();
4165 }
4166
4167 /* Handle .ascii and .asciiz. This just calls stringer and forgets
4168 that there was a previous instruction. */
4169
4170 static void
4171 s_stringer (append_zero)
4172 int append_zero;
4173 {
4174 mips_emit_delays ();
4175 insn_label = NULL;
4176 stringer (append_zero);
4177 }
4178
4179 static void
4180 s_change_sec (sec)
4181 int sec;
4182 {
4183 #ifdef GPOPT
4184 segT seg;
4185 #endif
4186
4187 mips_emit_delays ();
4188 switch (sec)
4189 {
4190 case 't':
4191 s_text (0);
4192 break;
4193 case 'd':
4194 s_data (0);
4195 break;
4196 case 'b':
4197 subseg_set (bss_section, (subsegT) get_absolute_expression ());
4198 demand_empty_rest_of_line ();
4199 break;
4200
4201 case 'r':
4202 #ifdef OBJ_ECOFF
4203 subseg_new (".rdata", (subsegT) get_absolute_expression ());
4204 demand_empty_rest_of_line ();
4205 break;
4206 #else /* ! defined (OBJ_ECOFF) */
4207 #ifdef OBJ_ELF
4208 seg = subseg_new (".rodata", (subsegT) get_absolute_expression ());
4209 bfd_set_section_flags (stdoutput, seg,
4210 (SEC_ALLOC
4211 | SEC_LOAD
4212 | SEC_READONLY
4213 | SEC_RELOC
4214 | SEC_DATA));
4215 demand_empty_rest_of_line ();
4216 break;
4217 #else /* ! defined (OBJ_ELF) */
4218 s_data (0);
4219 break;
4220 #endif /* ! defined (OBJ_ELF) */
4221 #endif /* ! defined (OBJ_ECOFF) */
4222
4223 case 's':
4224 #ifdef GPOPT
4225 seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
4226 #ifdef OBJ_ELF
4227 bfd_set_section_flags (stdoutput, seg,
4228 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
4229 #endif
4230 demand_empty_rest_of_line ();
4231 break;
4232 #else /* ! defined (GPOPT) */
4233 as_bad ("Global pointers not supported; recompile -G 0");
4234 demand_empty_rest_of_line ();
4235 return;
4236 #endif /* ! defined (GPOPT) */
4237 }
4238
4239 auto_align = 1;
4240 }
4241
4242 static void
4243 s_cons (log_size)
4244 int log_size;
4245 {
4246 mips_emit_delays ();
4247 if (log_size > 0 && auto_align)
4248 mips_align (log_size, 0);
4249 insn_label = NULL;
4250 cons (1 << log_size);
4251 }
4252
4253 static void
4254 s_err (x)
4255 int x;
4256 {
4257 as_fatal ("Encountered `.err', aborting assembly");
4258 }
4259
4260 static void
4261 s_extern (x)
4262 int x;
4263 {
4264 valueT size;
4265 symbolS *symbolP;
4266
4267 symbolP = get_symbol ();
4268 if (*input_line_pointer == ',')
4269 input_line_pointer++;
4270 size = get_absolute_expression ();
4271 S_SET_VALUE (symbolP, size);
4272 S_SET_EXTERNAL (symbolP);
4273
4274 #ifdef OBJ_ECOFF
4275 /* ECOFF needs to distinguish a .comm symbol from a .extern symbol,
4276 so we use an additional ECOFF specific field. */
4277 symbolP->ecoff_undefined = 1;
4278 #endif
4279 }
4280
4281 static void
4282 s_float_cons (type)
4283 int type;
4284 {
4285 mips_emit_delays ();
4286
4287 if (auto_align)
4288 if (type == 'd')
4289 mips_align (3, 0);
4290 else
4291 mips_align (2, 0);
4292
4293 insn_label = NULL;
4294
4295 float_cons (type);
4296 }
4297
4298 static void
4299 s_option (x)
4300 int x;
4301 {
4302 char *opt;
4303 char c;
4304
4305 opt = input_line_pointer;
4306 c = get_symbol_end ();
4307
4308 /* FIXME: What do these options mean? */
4309 if (*opt == 'O')
4310 ;
4311 else if (strncmp (opt, "pic", 3) == 0)
4312 ;
4313 else
4314 as_warn ("Unrecognized option \"%s\"", opt);
4315
4316 *input_line_pointer = c;
4317 demand_empty_rest_of_line ();
4318 }
4319
4320 static void
4321 s_mipsset (x)
4322 int x;
4323 {
4324 char *name = input_line_pointer, ch;
4325
4326 while (!is_end_of_line[(unsigned char) *input_line_pointer])
4327 input_line_pointer++;
4328 ch = *input_line_pointer;
4329 *input_line_pointer = '\0';
4330
4331 if (strcmp (name, "reorder") == 0)
4332 {
4333 if (mips_noreorder)
4334 {
4335 prev_insn_unreordered = 1;
4336 prev_prev_insn_unreordered = 1;
4337 }
4338 mips_noreorder = 0;
4339 }
4340 else if (strcmp (name, "noreorder") == 0)
4341 {
4342 mips_emit_delays ();
4343 mips_noreorder = 1;
4344 }
4345 else if (strcmp (name, "at") == 0)
4346 {
4347 mips_noat = 0;
4348 }
4349 else if (strcmp (name, "noat") == 0)
4350 {
4351 mips_noat = 1;
4352 }
4353 else if (strcmp (name, "macro") == 0)
4354 {
4355 mips_warn_about_macros = 0;
4356 }
4357 else if (strcmp (name, "nomacro") == 0)
4358 {
4359 if (mips_noreorder == 0)
4360 as_bad ("`noreorder' must be set before `nomacro'");
4361 mips_warn_about_macros = 1;
4362 }
4363 else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
4364 {
4365 mips_nomove = 0;
4366 }
4367 else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
4368 {
4369 mips_nomove = 1;
4370 }
4371 else if (strcmp (name, "bopt") == 0)
4372 {
4373 mips_nobopt = 0;
4374 }
4375 else if (strcmp (name, "nobopt") == 0)
4376 {
4377 mips_nobopt = 1;
4378 }
4379 else
4380 {
4381 as_warn ("Tried to set unrecognized symbol: %s\n", name);
4382 }
4383 *input_line_pointer = ch;
4384 demand_empty_rest_of_line ();
4385 }
4386
4387 /* The same as the usual .space directive, except that we have to
4388 forget about any previous instruction. */
4389
4390 static void
4391 s_mips_space (param)
4392 int param;
4393 {
4394 mips_emit_delays ();
4395 insn_label = NULL;
4396 s_space (param);
4397 }
4398
4399 int
4400 tc_get_register ()
4401 {
4402 int reg;
4403
4404 SKIP_WHITESPACE ();
4405 if (*input_line_pointer++ != '$')
4406 {
4407 as_warn ("expected `$'");
4408 return 0;
4409 }
4410 if (isdigit ((unsigned char) *input_line_pointer))
4411 {
4412 reg = get_absolute_expression ();
4413 if (reg < 0 || reg >= 32)
4414 {
4415 as_warn ("Bad register number");
4416 reg = 0;
4417 }
4418 }
4419 else
4420 {
4421 if (strncmp (input_line_pointer, "fp", 2) == 0)
4422 reg = 30;
4423 else if (strncmp (input_line_pointer, "sp", 2) == 0)
4424 reg = 29;
4425 else if (strncmp (input_line_pointer, "gp", 2) == 0)
4426 reg = 28;
4427 else if (strncmp (input_line_pointer, "at", 2) == 0)
4428 reg = 1;
4429 else
4430 {
4431 as_warn ("Unrecognized register name");
4432 return 0;
4433 }
4434 input_line_pointer += 2;
4435 }
4436 return reg;
4437 }
4438
4439 /*
4440 * Translate internal representation of relocation info to BFD target format.
4441 */
4442 arelent *
4443 tc_gen_reloc (section, fixp)
4444 asection *section;
4445 fixS *fixp;
4446 {
4447 arelent *reloc;
4448
4449 reloc = (arelent *) xmalloc (sizeof (arelent));
4450 assert (reloc != 0);
4451
4452 reloc->sym_ptr_ptr = &fixp->fx_addsy->bsym;
4453 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
4454 if (fixp->fx_pcrel == 0)
4455 reloc->addend = fixp->fx_addnumber;
4456 else
4457 #ifdef OBJ_ELF
4458 reloc->addend = 0;
4459 #else
4460 reloc->addend = -reloc->address;
4461 #endif
4462 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
4463 if (reloc->howto == NULL)
4464 {
4465 as_bad_where (fixp->fx_file, fixp->fx_line,
4466 "Can not represent relocation in this object file format");
4467 return NULL;
4468 }
4469
4470 return reloc;
4471 }
4472
4473 /* should never be called */
4474 valueT
4475 md_section_align (seg, addr)
4476 asection *seg;
4477 valueT addr;
4478 {
4479 int align = bfd_get_section_alignment (stdoutput, seg);
4480
4481 return ((addr + (1 << align) - 1) & (-1 << align));
4482 }
4483
4484 int
4485 md_estimate_size_before_relax (fragP, segtype)
4486 fragS *fragP;
4487 asection *segtype;
4488 {
4489 as_fatal ("md_estimate_size_before_relax");
4490 return (1);
4491 } /* md_estimate_size_before_relax() */
4492
4493 /* This function is called whenever a label is defined. It is used
4494 when handling branch delays; if a branch has a label, we assume we
4495 can not move it. */
4496
4497 void
4498 mips_define_label (sym)
4499 symbolS *sym;
4500 {
4501 insn_label = sym;
4502 }
4503 \f
4504 #ifdef OBJ_ELF
4505
4506 /* Write out the .reginfo section for a MIPS ELF file. */
4507
4508 void
4509 mips_elf_final_processing ()
4510 {
4511 Elf32_RegInfo s;
4512
4513 s.ri_gprmask = mips_gprmask;
4514 s.ri_cprmask[0] = mips_cprmask[0];
4515 s.ri_cprmask[1] = mips_cprmask[1];
4516 s.ri_cprmask[2] = mips_cprmask[2];
4517 s.ri_cprmask[3] = mips_cprmask[3];
4518 /* The gp_value field is set by the MIPS ELF backend. */
4519
4520 bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
4521 ((Elf32_External_RegInfo *)
4522 mips_regmask_frag));
4523 }
4524
4525 #endif /* OBJ_ELF */
4526 \f
4527 #ifndef OBJ_ECOFF
4528
4529 /* These functions should really be defined by the object file format,
4530 since they are related to debugging information. However, this
4531 code has to work for the a.out format, which does not define them,
4532 so we provide simple versions here. These don't actually generate
4533 any debugging information, but they do simple checking and someday
4534 somebody may make them useful. */
4535
4536 typedef struct loc
4537 {
4538 struct loc *loc_next;
4539 unsigned long loc_fileno;
4540 unsigned long loc_lineno;
4541 unsigned long loc_offset;
4542 unsigned short loc_delta;
4543 unsigned short loc_count;
4544 #if 0
4545 fragS *loc_frag;
4546 #endif
4547 }
4548 locS;
4549
4550 typedef struct proc
4551 {
4552 struct proc *proc_next;
4553 struct symbol *proc_isym;
4554 struct symbol *proc_end;
4555 unsigned long proc_reg_mask;
4556 unsigned long proc_reg_offset;
4557 unsigned long proc_fpreg_mask;
4558 unsigned long proc_fpreg_offset;
4559 unsigned long proc_frameoffset;
4560 unsigned long proc_framereg;
4561 unsigned long proc_pcreg;
4562 locS *proc_iline;
4563 struct file *proc_file;
4564 int proc_index;
4565 }
4566 procS;
4567
4568 typedef struct file
4569 {
4570 struct file *file_next;
4571 unsigned long file_fileno;
4572 struct symbol *file_symbol;
4573 struct symbol *file_end;
4574 struct proc *file_proc;
4575 int file_numprocs;
4576 }
4577 fileS;
4578
4579 static struct obstack proc_frags;
4580 static procS *proc_lastP;
4581 static procS *proc_rootP;
4582 static int numprocs;
4583
4584 static void
4585 md_obj_begin ()
4586 {
4587 obstack_begin (&proc_frags, 0x2000);
4588 }
4589
4590 static void
4591 md_obj_end ()
4592 {
4593 /* check for premature end, nesting errors, etc */
4594 if (proc_lastP && proc_lastP->proc_end == NULL)
4595 as_warn ("missing `.end' at end of assembly");
4596 }
4597
4598 extern char hex_value[];
4599
4600 static long
4601 get_number ()
4602 {
4603 int negative = 0;
4604 long val = 0;
4605
4606 if (*input_line_pointer == '-')
4607 {
4608 ++input_line_pointer;
4609 negative = 1;
4610 }
4611 if (!isdigit (*input_line_pointer))
4612 as_bad ("Expected simple number.");
4613 if (input_line_pointer[0] == '0')
4614 {
4615 if (input_line_pointer[1] == 'x')
4616 {
4617 input_line_pointer += 2;
4618 while (isxdigit (*input_line_pointer))
4619 {
4620 val <<= 4;
4621 val |= hex_value[(int) *input_line_pointer++];
4622 }
4623 return negative ? -val : val;
4624 }
4625 else
4626 {
4627 ++input_line_pointer;
4628 while (isdigit (*input_line_pointer))
4629 {
4630 val <<= 3;
4631 val |= *input_line_pointer++ - '0';
4632 }
4633 return negative ? -val : val;
4634 }
4635 }
4636 if (!isdigit (*input_line_pointer))
4637 {
4638 printf (" *input_line_pointer == '%c' 0x%02x\n",
4639 *input_line_pointer, *input_line_pointer);
4640 as_warn ("Invalid number");
4641 return -1;
4642 }
4643 while (isdigit (*input_line_pointer))
4644 {
4645 val *= 10;
4646 val += *input_line_pointer++ - '0';
4647 }
4648 return negative ? -val : val;
4649 }
4650
4651 /* The .file directive; just like the usual .file directive, but there
4652 is an initial number which is the ECOFF file index. */
4653
4654 static void
4655 s_file (x)
4656 int x;
4657 {
4658 int line;
4659
4660 line = get_number ();
4661 s_app_file (0);
4662 }
4663
4664
4665 /* The .end directive. */
4666
4667 static void
4668 s_mipsend (x)
4669 int x;
4670 {
4671 symbolS *p;
4672
4673 if (!is_end_of_line[(unsigned char) *input_line_pointer])
4674 {
4675 p = get_symbol ();
4676 demand_empty_rest_of_line ();
4677 }
4678 else
4679 p = NULL;
4680 if (now_seg != text_section)
4681 as_warn (".end not in text section");
4682 if (!proc_lastP)
4683 {
4684 as_warn (".end and no .ent seen yet.");
4685 return;
4686 }
4687
4688 if (p != NULL)
4689 {
4690 assert (S_GET_NAME (p));
4691 if (strcmp (S_GET_NAME (p), S_GET_NAME (proc_lastP->proc_isym)))
4692 as_warn (".end symbol does not match .ent symbol.");
4693 }
4694
4695 proc_lastP->proc_end = (symbolS *) 1;
4696 }
4697
4698 /* The .aent and .ent directives. */
4699
4700 static void
4701 s_ent (aent)
4702 int aent;
4703 {
4704 int number = 0;
4705 procS *procP;
4706 symbolS *symbolP;
4707
4708 symbolP = get_symbol ();
4709 if (*input_line_pointer == ',')
4710 input_line_pointer++;
4711 SKIP_WHITESPACE ();
4712 if (isdigit (*input_line_pointer) || *input_line_pointer == '-')
4713 number = get_number ();
4714 if (now_seg != text_section)
4715 as_warn (".ent or .aent not in text section.");
4716
4717 if (!aent && proc_lastP && proc_lastP->proc_end == NULL)
4718 as_warn ("missing `.end'");
4719
4720 if (!aent)
4721 {
4722 procP = (procS *) obstack_alloc (&proc_frags, sizeof (*procP));
4723 procP->proc_isym = symbolP;
4724 procP->proc_reg_mask = 0;
4725 procP->proc_reg_offset = 0;
4726 procP->proc_fpreg_mask = 0;
4727 procP->proc_fpreg_offset = 0;
4728 procP->proc_frameoffset = 0;
4729 procP->proc_framereg = 0;
4730 procP->proc_pcreg = 0;
4731 procP->proc_end = NULL;
4732 procP->proc_next = NULL;
4733 if (proc_lastP)
4734 proc_lastP->proc_next = procP;
4735 else
4736 proc_rootP = procP;
4737 proc_lastP = procP;
4738 numprocs++;
4739 }
4740 demand_empty_rest_of_line ();
4741 }
4742
4743 /* The .frame directive. */
4744
4745 #if 0
4746 static void
4747 s_frame (x)
4748 int x;
4749 {
4750 char str[100];
4751 symbolS *symP;
4752 int frame_reg;
4753 int frame_off;
4754 int pcreg;
4755
4756 frame_reg = tc_get_register ();
4757 if (*input_line_pointer == ',')
4758 input_line_pointer++;
4759 frame_off = get_absolute_expression ();
4760 if (*input_line_pointer == ',')
4761 input_line_pointer++;
4762 pcreg = tc_get_register ();
4763
4764 /* bob third eye */
4765 assert (proc_rootP);
4766 proc_rootP->proc_framereg = frame_reg;
4767 proc_rootP->proc_frameoffset = frame_off;
4768 proc_rootP->proc_pcreg = pcreg;
4769 /* bob macho .frame */
4770
4771 /* We don't have to write out a frame stab for unoptimized code. */
4772 if (!(frame_reg == 30 && frame_off == 0))
4773 {
4774 if (!proc_lastP)
4775 as_warn ("No .ent for .frame to use.");
4776 (void) sprintf (str, "R%d;%d", frame_reg, frame_off);
4777 symP = symbol_new (str, N_VFP, 0, frag_now);
4778 S_SET_TYPE (symP, N_RMASK);
4779 S_SET_OTHER (symP, 0);
4780 S_SET_DESC (symP, 0);
4781 symP->sy_forward = proc_lastP->proc_isym;
4782 /* bob perhaps I should have used pseudo set */
4783 }
4784 demand_empty_rest_of_line ();
4785 }
4786 #endif
4787
4788 /* The .fmask and .mask directives. */
4789
4790 #if 0
4791 static void
4792 s_mask (reg_type)
4793 char reg_type;
4794 {
4795 char str[100], *strP;
4796 symbolS *symP;
4797 int i;
4798 unsigned int mask;
4799 int off;
4800
4801 mask = get_number ();
4802 if (*input_line_pointer == ',')
4803 input_line_pointer++;
4804 off = get_absolute_expression ();
4805
4806 /* bob only for coff */
4807 assert (proc_rootP);
4808 if (reg_type == 'F')
4809 {
4810 proc_rootP->proc_fpreg_mask = mask;
4811 proc_rootP->proc_fpreg_offset = off;
4812 }
4813 else
4814 {
4815 proc_rootP->proc_reg_mask = mask;
4816 proc_rootP->proc_reg_offset = off;
4817 }
4818
4819 /* bob macho .mask + .fmask */
4820
4821 /* We don't have to write out a mask stab if no saved regs. */
4822 if (!(mask == 0))
4823 {
4824 if (!proc_lastP)
4825 as_warn ("No .ent for .mask to use.");
4826 strP = str;
4827 for (i = 0; i < 32; i++)
4828 {
4829 if (mask % 2)
4830 {
4831 sprintf (strP, "%c%d,", reg_type, i);
4832 strP += strlen (strP);
4833 }
4834 mask /= 2;
4835 }
4836 sprintf (strP, ";%d,", off);
4837 symP = symbol_new (str, N_RMASK, 0, frag_now);
4838 S_SET_TYPE (symP, N_RMASK);
4839 S_SET_OTHER (symP, 0);
4840 S_SET_DESC (symP, 0);
4841 symP->sy_forward = proc_lastP->proc_isym;
4842 /* bob perhaps I should have used pseudo set */
4843 }
4844 }
4845 #endif
4846
4847 /* The .loc directive. */
4848
4849 #if 0
4850 static void
4851 s_loc (x)
4852 int x;
4853 {
4854 symbolS *symbolP;
4855 int lineno;
4856 int addroff;
4857
4858 assert (now_seg == text_section);
4859
4860 lineno = get_number ();
4861 addroff = obstack_next_free (&frags) - frag_now->fr_literal;
4862
4863 symbolP = symbol_new ("", N_SLINE, addroff, frag_now);
4864 S_SET_TYPE (symbolP, N_SLINE);
4865 S_SET_OTHER (symbolP, 0);
4866 S_SET_DESC (symbolP, lineno);
4867 symbolP->sy_segment = now_seg;
4868 }
4869 #endif
4870
4871 #endif /* ! defined (OBJ_ECOFF) */