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
8 This file is part of GAS.
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)
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.
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. */
40 #endif /* NO_VARARGS */
41 #endif /* NO_STDARG */
43 #include "opcode/mips.h"
48 static char *mips_regmask_frag;
52 #define PIC_CALL_REG 25
58 /* Decide whether to do GP reference optimizations based on the object
68 /* The default target format to use. */
70 #ifdef TARGET_BYTES_BIG_ENDIAN
71 #define DEFAULT_TARGET_FORMAT "a.out-mips-big"
73 #define DEFAULT_TARGET_FORMAT "a.out-mips-little"
77 #ifdef TARGET_BYTES_BIG_ENDIAN
78 #define DEFAULT_TARGET_FORMAT "ecoff-bigmips"
80 #define DEFAULT_TARGET_FORMAT "ecoff-littlemips"
82 #endif /* OBJ_ECOFF */
84 #ifdef TARGET_BYTES_BIG_ENDIAN
85 #define DEFAULT_TARGET_FORMAT "elf32-bigmips"
87 #define DEFAULT_TARGET_FORMAT "elf32-littlemips"
91 const char *mips_target_format = DEFAULT_TARGET_FORMAT;
93 /* The name of the readonly data section. */
95 #define RDATA_SECTION_NAME ".data"
98 #define RDATA_SECTION_NAME ".rdata"
101 #define RDATA_SECTION_NAME ".rodata"
104 /* These variables are filled in with the masks of registers used.
105 The object format code reads them and puts them in the appropriate
107 unsigned long mips_gprmask;
108 unsigned long mips_cprmask[4];
110 /* MIPS ISA (Instruction Set Architecture) level (may be changed
111 temporarily using .set mipsN). */
112 static int mips_isa = -1;
114 /* MIPS ISA we are using for this output file. */
115 static int file_mips_isa;
117 /* MIPS PIC level. */
121 /* Do not generate PIC code. */
124 /* Generate PIC code as in Irix 4. This is not implemented, and I'm
125 not sure what it is supposed to do. */
128 /* Generate PIC code as in the SVR4 MIPS ABI. */
131 /* Generate PIC code without using a global offset table: the data
132 segment has a maximum size of 64K, all data references are off
133 the $gp register, and all text references are PC relative. This
134 is used on some embedded systems. */
138 static enum mips_pic_level mips_pic;
140 /* 1 if trap instructions should used for overflow rather than break
142 static int mips_trap;
144 static int mips_warn_about_macros;
145 static int mips_noreorder;
146 static int mips_any_noreorder;
147 static int mips_nomove;
148 static int mips_noat;
149 static int mips_nobopt;
152 /* The size of the small data section. */
153 static int g_switch_value = 8;
154 /* Whether the -G option was used. */
155 static int g_switch_seen = 0;
161 /* handle of the OPCODE hash table */
162 static struct hash_control *op_hash = NULL;
164 /* This array holds the chars that always start a comment. If the
165 pre-processor is disabled, these aren't very useful */
166 const char comment_chars[] = "#";
168 /* This array holds the chars that only start a comment at the beginning of
169 a line. If the line seems to have the form '# 123 filename'
170 .line and .file directives will appear in the pre-processed output */
171 /* Note that input_file.c hand checks for '#' at the beginning of the
172 first line of the input file. This is because the compiler outputs
173 #NO_APP at the beginning of its output. */
174 /* Also note that C style comments are always supported. */
175 const char line_comment_chars[] = "#";
177 /* This array holds machine specific line separator characters. */
178 const char line_separator_chars[] = "";
180 /* Chars that can be used to separate mant from exp in floating point nums */
181 const char EXP_CHARS[] = "eE";
183 /* Chars that mean this number is a floating point constant */
186 const char FLT_CHARS[] = "rRsSfFdDxXpP";
188 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
189 changed in read.c . Ideally it shouldn't have to know about it at all,
190 but nothing is ideal around here.
193 static char *insn_error;
195 static int byte_order = BYTE_ORDER;
197 static int auto_align = 1;
199 /* Symbol labelling the current insn. */
200 static symbolS *insn_label;
202 /* When outputting SVR4 PIC code, the assembler needs to know the
203 offset in the stack frame from which to restore the $gp register.
204 This is set by the .cprestore pseudo-op, and saved in this
206 static offsetT mips_cprestore_offset = -1;
208 /* This is the register which holds the stack frame, as set by the
209 .frame pseudo-op. This is needed to implement .cprestore. */
210 static int mips_frame_reg = SP;
212 /* To output NOP instructions correctly, we need to keep information
213 about the previous two instructions. */
215 /* Whether we are optimizing. The default value of 2 means to remove
216 unneeded NOPs and swap branch instructions when possible. A value
217 of 1 means to not swap branches. A value of 0 means to always
219 static int mips_optimize = 2;
221 /* The previous instruction. */
222 static struct mips_cl_insn prev_insn;
224 /* The instruction before prev_insn. */
225 static struct mips_cl_insn prev_prev_insn;
227 /* If we don't want information for prev_insn or prev_prev_insn, we
228 point the insn_mo field at this dummy integer. */
229 static const struct mips_opcode dummy_opcode = { 0 };
231 /* Non-zero if prev_insn is valid. */
232 static int prev_insn_valid;
234 /* The frag for the previous instruction. */
235 static struct frag *prev_insn_frag;
237 /* The offset into prev_insn_frag for the previous instruction. */
238 static long prev_insn_where;
240 /* The reloc for the previous instruction, if any. */
241 static fixS *prev_insn_fixp;
243 /* Non-zero if the previous instruction was in a delay slot. */
244 static int prev_insn_is_delay_slot;
246 /* Non-zero if the previous instruction was in a .set noreorder. */
247 static int prev_insn_unreordered;
249 /* Non-zero if the previous previous instruction was in a .set
251 static int prev_prev_insn_unreordered;
253 /* Since the MIPS does not have multiple forms of PC relative
254 instructions, we do not have to do relaxing as is done on other
255 platforms. However, we do have to handle GP relative addressing
256 correctly, which turns out to be a similar problem.
258 Every macro that refers to a symbol can occur in (at least) two
259 forms, one with GP relative addressing and one without. For
260 example, loading a global variable into a register generally uses
261 a macro instruction like this:
263 If i can be addressed off the GP register (this is true if it is in
264 the .sbss or .sdata section, or if it is known to be smaller than
265 the -G argument) this will generate the following instruction:
267 This instruction will use a GPREL reloc. If i can not be addressed
268 off the GP register, the following instruction sequence will be used:
271 In this case the first instruction will have a HI16 reloc, and the
272 second reloc will have a LO16 reloc. Both relocs will be against
275 The issue here is that we may not know whether i is GP addressable
276 until after we see the instruction that uses it. Therefore, we
277 want to be able to choose the final instruction sequence only at
278 the end of the assembly. This is similar to the way other
279 platforms choose the size of a PC relative instruction only at the
282 When generating position independent code we do not use GP
283 addressing in quite the same way, but the issue still arises as
284 external symbols and local symbols must be handled differently.
286 We handle these issues by actually generating both possible
287 instruction sequences. The longer one is put in a frag_var with
288 type rs_machine_dependent. We encode what to do with the frag in
289 the subtype field. We encode (1) the number of existing bytes to
290 replace, (2) the number of new bytes to use, (3) the offset from
291 the start of the existing bytes to the first reloc we must generate
292 (that is, the offset is applied from the start of the existing
293 bytes after they are replaced by the new bytes, if any), (4) the
294 offset from the start of the existing bytes to the second reloc,
295 (5) whether a third reloc is needed (the third reloc is always four
296 bytes after the second reloc), and (6) whether to warn if this
297 variant is used (this is sometimes needed if .set nomacro or .set
298 noat is in effect). All these numbers are reasonably small.
300 Generating two instruction sequences must be handled carefully to
301 ensure that delay slots are handled correctly. Fortunately, there
302 are a limited number of cases. When the second instruction
303 sequence is generated, append_insn is directed to maintain the
304 existing delay slot information, so it continues to apply to any
305 code after the second instruction sequence. This means that the
306 second instruction sequence must not impose any requirements not
307 required by the first instruction sequence.
309 These variant frags are then handled in functions called by the
310 machine independent code. md_estimate_size_before_relax returns
311 the final size of the frag. md_convert_frag sets up the final form
312 of the frag. tc_gen_reloc adjust the first reloc and adds a second
314 #define RELAX_ENCODE(old, new, reloc1, reloc2, reloc3, warn) \
318 | (((reloc1) + 64) << 9) \
319 | (((reloc2) + 64) << 2) \
320 | ((reloc3) ? (1 << 1) : 0) \
322 #define RELAX_OLD(i) (((i) >> 24) & 0xff)
323 #define RELAX_NEW(i) (((i) >> 16) & 0xff)
324 #define RELAX_RELOC1(i) ((((i) >> 9) & 0x7f) - 64)
325 #define RELAX_RELOC2(i) ((((i) >> 2) & 0x7f) - 64)
326 #define RELAX_RELOC3(i) (((i) >> 1) & 1)
327 #define RELAX_WARN(i) ((i) & 1)
329 /* Prototypes for static functions. */
332 #define internalError() \
333 as_fatal ("internal Error, line %d, %s", __LINE__, __FILE__)
335 #define internalError() as_fatal ("MIPS internal Error");
338 static int insn_uses_reg PARAMS ((struct mips_cl_insn *ip,
339 unsigned int reg, int fpr));
340 static void append_insn PARAMS ((char *place,
341 struct mips_cl_insn * ip,
343 bfd_reloc_code_real_type r));
344 static void mips_no_prev_insn PARAMS ((void));
345 static void mips_emit_delays PARAMS ((void));
346 static void macro_build PARAMS ((char *place, int *counter, expressionS * ep,
347 const char *name, const char *fmt,
349 static void macro_build_lui PARAMS ((char *place, int *counter,
350 expressionS * ep, int regnum));
351 static void set_at PARAMS ((int *counter, int reg, int unsignedp));
352 static void check_absolute_expr PARAMS ((struct mips_cl_insn * ip,
354 static void load_register PARAMS ((int *counter, int reg, expressionS * ep));
355 static void load_address PARAMS ((int *counter, int reg, expressionS *ep));
356 static void macro PARAMS ((struct mips_cl_insn * ip));
357 #ifdef LOSING_COMPILER
358 static void macro2 PARAMS ((struct mips_cl_insn * ip));
360 static void mips_ip PARAMS ((char *str, struct mips_cl_insn * ip));
361 static int my_getSmallExpression PARAMS ((expressionS * ep, char *str));
362 static void my_getExpression PARAMS ((expressionS * ep, char *str));
363 static symbolS *get_symbol PARAMS ((void));
364 static void mips_align PARAMS ((int to, int fill, symbolS *label));
365 static void s_align PARAMS ((int));
366 static void s_stringer PARAMS ((int));
367 static void s_change_sec PARAMS ((int));
368 static void s_cons PARAMS ((int));
369 static void s_err PARAMS ((int));
370 static void s_extern PARAMS ((int));
371 static void s_float_cons PARAMS ((int));
372 static void s_option PARAMS ((int));
373 static void s_mipsset PARAMS ((int));
374 static void s_mips_space PARAMS ((int));
375 static void s_abicalls PARAMS ((int));
376 static void s_cpload PARAMS ((int));
377 static void s_cprestore PARAMS ((int));
378 static void s_gpword PARAMS ((int));
379 static void s_cpadd PARAMS ((int));
380 #ifndef ECOFF_DEBUGGING
381 static void md_obj_begin PARAMS ((void));
382 static void md_obj_end PARAMS ((void));
383 static long get_number PARAMS ((void));
384 static void s_ent PARAMS ((int));
385 static void s_mipsend PARAMS ((int));
386 static void s_file PARAMS ((int));
388 static void s_frame PARAMS ((int));
389 static void s_loc PARAMS ((int));
390 static void s_mask PARAMS ((char));
396 The following pseudo-ops from the Kane and Heinrich MIPS book
397 should be defined here, but are currently unsupported: .alias,
398 .galive, .gjaldef, .gjrlive, .livereg, .noalias.
400 The following pseudo-ops from the Kane and Heinrich MIPS book are
401 specific to the type of debugging information being generated, and
402 should be defined by the object format: .aent, .begin, .bend,
403 .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
406 The following pseudo-ops from the Kane and Heinrich MIPS book are
407 not MIPS CPU specific, but are also not specific to the object file
408 format. This file is probably the best place to define them, but
409 they are not currently supported: .asm0, .endr, .lab, .repeat,
410 .struct, .weakext. */
412 const pseudo_typeS md_pseudo_table[] =
414 /* MIPS specific pseudo-ops. */
415 {"option", s_option, 0},
416 {"set", s_mipsset, 0},
417 {"rdata", s_change_sec, 'r'},
418 {"sdata", s_change_sec, 's'},
419 {"livereg", s_ignore, 0},
420 { "abicalls", s_abicalls, 0},
421 { "cpload", s_cpload, 0},
422 { "cprestore", s_cprestore, 0},
423 { "gpword", s_gpword, 0},
424 { "cpadd", s_cpadd, 0},
426 /* Relatively generic pseudo-ops that happen to be used on MIPS
428 {"asciiz", s_stringer, 1},
429 {"bss", s_change_sec, 'b'},
432 {"dword", s_cons, 3},
434 /* These pseudo-ops are defined in read.c, but must be overridden
435 here for one reason or another. */
436 {"align", s_align, 0},
437 {"ascii", s_stringer, 0},
438 {"asciz", s_stringer, 1},
440 {"data", s_change_sec, 'd'},
441 {"double", s_float_cons, 'd'},
442 {"extern", s_extern, 0},
443 {"float", s_float_cons, 'f'},
444 {"hword", s_cons, 1},
449 {"short", s_cons, 1},
450 {"single", s_float_cons, 'f'},
451 {"space", s_mips_space, 0},
452 {"text", s_change_sec, 't'},
455 #ifndef ECOFF_DEBUGGING
456 /* These pseudo-ops should be defined by the object file format.
457 However, a.out doesn't support them, so we have versions here. */
459 {"bgnb", s_ignore, 0},
460 {"end", s_mipsend, 0},
461 {"endb", s_ignore, 0},
464 {"fmask", s_ignore, 'F'},
465 {"frame", s_ignore, 0},
466 {"loc", s_ignore, 0},
467 {"mask", s_ignore, 'R'},
468 {"verstamp", s_ignore, 0},
475 const relax_typeS md_relax_table[] =
480 static char *expr_end;
482 static expressionS imm_expr;
483 static expressionS offset_expr;
484 static bfd_reloc_code_real_type imm_reloc;
485 static bfd_reloc_code_real_type offset_reloc;
487 /* FIXME: This should be handled in a different way. */
488 extern int target_big_endian;
491 * This function is called once, at assembler startup time. It should
492 * set up all the tables, etc. that the MD part of the assembler will need.
498 register const char *retval = NULL;
499 register unsigned int i = 0;
503 if (strcmp (TARGET_CPU, "mips") == 0)
505 else if (strcmp (TARGET_CPU, "r6000") == 0
506 || strcmp (TARGET_CPU, "mips2") == 0)
508 else if (strcmp (TARGET_CPU, "mips64") == 0
509 || strcmp (TARGET_CPU, "r4000") == 0
510 || strcmp (TARGET_CPU, "mips3") == 0)
516 if (mips_isa < 2 && mips_trap)
517 as_bad ("trap exception not supported at ISA 1");
522 ok = bfd_set_arch_mach (stdoutput, bfd_arch_mips, 3000);
525 ok = bfd_set_arch_mach (stdoutput, bfd_arch_mips, 6000);
528 ok = bfd_set_arch_mach (stdoutput, bfd_arch_mips, 4000);
532 as_warn ("Could not set architecture and machine");
534 file_mips_isa = mips_isa;
536 op_hash = hash_new ();
538 for (i = 0; i < NUMOPCODES;)
540 const char *name = mips_opcodes[i].name;
542 retval = hash_insert (op_hash, name, (PTR) &mips_opcodes[i]);
545 fprintf (stderr, "internal error: can't hash `%s': %s\n",
546 mips_opcodes[i].name, retval);
547 as_fatal ("Broken assembler. No assembly attempted.");
551 if (mips_opcodes[i].pinfo != INSN_MACRO
552 && ((mips_opcodes[i].match & mips_opcodes[i].mask)
553 != mips_opcodes[i].match))
555 fprintf (stderr, "internal error: bad opcode: `%s' \"%s\"\n",
556 mips_opcodes[i].name, mips_opcodes[i].args);
557 as_fatal ("Broken assembler. No assembly attempted.");
561 while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
564 mips_no_prev_insn ();
572 /* set the default alignment for the text section (2**2) */
573 record_alignment (text_section, 2);
575 /* FIXME: This should be handled in a different way. */
576 target_big_endian = byte_order == BIG_ENDIAN;
579 bfd_set_gp_size (stdoutput, g_switch_value);
583 /* Sections must be aligned to 16 byte boundaries. */
584 (void) bfd_set_section_alignment (stdoutput, text_section, 4);
585 (void) bfd_set_section_alignment (stdoutput, data_section, 4);
586 (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
588 /* Create a .reginfo section for register masks and a .mdebug
589 section for debugging information. */
597 sec = subseg_new (".reginfo", (subsegT) 0);
599 /* The ABI says this section should be loaded so that the running
600 program can access it. */
601 (void) bfd_set_section_flags (stdoutput, sec,
602 (SEC_ALLOC | SEC_LOAD
603 | SEC_READONLY | SEC_DATA));
604 (void) bfd_set_section_alignment (stdoutput, sec, 2);
606 mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
608 #ifdef ECOFF_DEBUGGING
609 sec = subseg_new (".mdebug", (subsegT) 0);
610 (void) bfd_set_section_flags (stdoutput, sec,
611 SEC_HAS_CONTENTS | SEC_READONLY);
612 (void) bfd_set_section_alignment (stdoutput, sec, 2);
615 subseg_set (seg, subseg);
619 #ifndef ECOFF_DEBUGGING
627 #ifndef ECOFF_DEBUGGING
636 struct mips_cl_insn insn;
638 imm_expr.X_op = O_absent;
639 offset_expr.X_op = O_absent;
641 mips_ip (str, &insn);
644 as_bad ("%s `%s'", insn_error, str);
647 if (insn.insn_mo->pinfo == INSN_MACRO)
653 if (imm_expr.X_op != O_absent)
654 append_insn ((char *) NULL, &insn, &imm_expr, imm_reloc);
655 else if (offset_expr.X_op != O_absent)
656 append_insn ((char *) NULL, &insn, &offset_expr, offset_reloc);
658 append_insn ((char *) NULL, &insn, NULL, BFD_RELOC_UNUSED);
662 /* See whether instruction IP reads register REG. If FPR is non-zero,
663 REG is a floating point register. */
666 insn_uses_reg (ip, reg, fpr)
667 struct mips_cl_insn *ip;
671 /* Don't report on general register 0, since it never changes. */
672 if (! fpr && reg == 0)
677 /* If we are called with either $f0 or $f1, we must check $f0.
678 This is not optimal, because it will introduce an unnecessary
679 NOP between "lwc1 $f0" and "swc1 $f1". To fix this we would
680 need to distinguish reading both $f0 and $f1 or just one of
681 them. Note that we don't have to check the other way,
682 because there is no instruction that sets both $f0 and $f1
683 and requires a delay. */
684 if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
685 && (((ip->insn_opcode >> OP_SH_FS) & OP_MASK_FS)
686 == (reg &~ (unsigned) 1)))
688 if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
689 && (((ip->insn_opcode >> OP_SH_FT) & OP_MASK_FT)
690 == (reg &~ (unsigned) 1)))
695 if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
696 && ((ip->insn_opcode >> OP_SH_RS) & OP_MASK_RS) == reg)
698 if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
699 && ((ip->insn_opcode >> OP_SH_RT) & OP_MASK_RT) == reg)
706 /* Output an instruction. PLACE is where to put the instruction; if
707 it is NULL, this uses frag_more to get room. IP is the instruction
708 information. ADDRESS_EXPR is an operand of the instruction to be
709 used with RELOC_TYPE. */
712 append_insn (place, ip, address_expr, reloc_type)
714 struct mips_cl_insn *ip;
715 expressionS *address_expr;
716 bfd_reloc_code_real_type reloc_type;
718 register unsigned long prev_pinfo, pinfo;
723 prev_pinfo = prev_insn.insn_mo->pinfo;
724 pinfo = ip->insn_mo->pinfo;
726 if (place == NULL && ! mips_noreorder)
728 /* If the previous insn required any delay slots, see if we need
729 to insert a NOP or two. There are eight kinds of possible
730 hazards, of which an instruction can have at most one type.
731 (1) a load from memory delay
732 (2) a load from a coprocessor delay
733 (3) an unconditional branch delay
734 (4) a conditional branch delay
735 (5) a move to coprocessor register delay
736 (6) a load coprocessor register from memory delay
737 (7) a coprocessor condition code delay
738 (8) a HI/LO special register delay
740 There are a lot of optimizations we could do that we don't.
741 In particular, we do not, in general, reorder instructions.
742 If you use gcc with optimization, it will reorder
743 instructions and generally do much more optimization then we
744 do here; repeating all that work in the assembler would only
745 benefit hand written assembly code, and does not seem worth
748 /* This is how a NOP is emitted. */
749 #define emit_nop() md_number_to_chars (frag_more (4), 0, 4)
751 /* The previous insn might require a delay slot, depending upon
752 the contents of the current insn. */
753 if ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
755 && (prev_pinfo & INSN_LOAD_MEMORY_DELAY)))
757 /* A load from a coprocessor or from memory. All load
758 delays delay the use of general register rt for one
759 instruction on the r3000. The r6000 and r4000 use
761 know (prev_pinfo & INSN_WRITE_GPR_T);
762 if (mips_optimize == 0
763 || insn_uses_reg (ip,
764 ((prev_insn.insn_opcode >> OP_SH_RT)
769 else if ((prev_pinfo & INSN_COPROC_MOVE_DELAY)
771 && (prev_pinfo & INSN_COPROC_MEMORY_DELAY)))
773 /* A generic coprocessor delay. The previous instruction
774 modified a coprocessor general or control register. If
775 it modified a control register, we need to avoid any
776 coprocessor instruction (this is probably not always
777 required, but it sometimes is). If it modified a general
778 register, we avoid using that register.
780 On the r6000 and r4000 loading a coprocessor register
781 from memory is interlocked, and does not require a delay.
783 This case is not handled very well. There is no special
784 knowledge of CP0 handling, and the coprocessors other
785 than the floating point unit are not distinguished at
787 if (prev_pinfo & INSN_WRITE_FPR_T)
789 if (mips_optimize == 0
790 || insn_uses_reg (ip,
791 ((prev_insn.insn_opcode >> OP_SH_FT)
796 else if (prev_pinfo & INSN_WRITE_FPR_S)
798 if (mips_optimize == 0
799 || insn_uses_reg (ip,
800 ((prev_insn.insn_opcode >> OP_SH_FS)
807 /* We don't know exactly what the previous instruction
808 does. If the current instruction uses a coprocessor
809 register, we must insert a NOP. If previous
810 instruction may set the condition codes, and the
811 current instruction uses them, we must insert two
813 if (mips_optimize == 0
814 || ((prev_pinfo & INSN_WRITE_COND_CODE)
815 && (pinfo & INSN_READ_COND_CODE)))
817 else if (pinfo & INSN_COP)
821 else if (prev_pinfo & INSN_WRITE_COND_CODE)
823 /* The previous instruction sets the coprocessor condition
824 codes, but does not require a general coprocessor delay
825 (this means it is a floating point comparison
826 instruction). If this instruction uses the condition
827 codes, we need to insert a single NOP. */
828 if (mips_optimize == 0
829 || (pinfo & INSN_READ_COND_CODE))
832 else if (prev_pinfo & INSN_READ_LO)
834 /* The previous instruction reads the LO register; if the
835 current instruction writes to the LO register, we must
837 if (mips_optimize == 0
838 || (pinfo & INSN_WRITE_LO))
841 else if (prev_insn.insn_mo->pinfo & INSN_READ_HI)
843 /* The previous instruction reads the HI register; if the
844 current instruction writes to the HI register, we must
846 if (mips_optimize == 0
847 || (pinfo & INSN_WRITE_HI))
851 /* There are two cases which require two intervening
852 instructions: 1) setting the condition codes using a move to
853 coprocessor instruction which requires a general coprocessor
854 delay and then reading the condition codes 2) reading the HI
855 or LO register and then writing to it. If we are not already
856 emitting a NOP instruction, we must check for these cases
857 compared to the instruction previous to the previous
860 && (((prev_prev_insn.insn_mo->pinfo & INSN_COPROC_MOVE_DELAY)
861 && (prev_prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE)
862 && (pinfo & INSN_READ_COND_CODE))
863 || ((prev_prev_insn.insn_mo->pinfo & INSN_READ_LO)
864 && (pinfo & INSN_WRITE_LO))
865 || ((prev_prev_insn.insn_mo->pinfo & INSN_READ_HI)
866 && (pinfo & INSN_WRITE_HI))))
869 /* If we are being given a nop instruction, don't bother with
870 one of the nops we would otherwise output. This will only
871 happen when a nop instruction is used with mips_optimize set
873 if (nops > 0 && ip->insn_opcode == 0)
876 /* Now emit the right number of NOP instructions. */
883 listing_prev_line ();
884 if (insn_label != NULL)
886 assert (S_GET_SEGMENT (insn_label) == now_seg);
887 insn_label->sy_frag = frag_now;
888 S_SET_VALUE (insn_label, (valueT) frag_now_fix ());
898 if (address_expr != NULL)
900 if (address_expr->X_op == O_constant)
905 ip->insn_opcode |= address_expr->X_add_number;
909 ip->insn_opcode |= address_expr->X_add_number & 0xffff;
912 case BFD_RELOC_MIPS_JMP:
913 case BFD_RELOC_16_PCREL_S2:
922 assert (reloc_type != BFD_RELOC_UNUSED);
924 /* Don't generate a reloc if we are writing into a variant
927 fixp = fix_new_exp (frag_now, f - frag_now->fr_literal, 4,
929 reloc_type == BFD_RELOC_16_PCREL_S2,
934 md_number_to_chars (f, ip->insn_opcode, 4);
936 /* Update the register mask information. */
937 if (pinfo & INSN_WRITE_GPR_D)
938 mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD);
939 if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
940 mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RT) & OP_MASK_RT);
941 if (pinfo & INSN_READ_GPR_S)
942 mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RS) & OP_MASK_RS);
943 if (pinfo & INSN_WRITE_GPR_31)
944 mips_gprmask |= 1 << 31;
945 if (pinfo & INSN_WRITE_FPR_D)
946 mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FD) & OP_MASK_FD);
947 if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
948 mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FS) & OP_MASK_FS);
949 if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
950 mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FT) & OP_MASK_FT);
951 if (pinfo & INSN_COP)
953 /* We don't keep enough information to sort these cases out. */
955 /* Never set the bit for $0, which is always zero. */
956 mips_gprmask &=~ 1 << 0;
958 if (place == NULL && ! mips_noreorder)
960 /* Filling the branch delay slot is more complex. We try to
961 switch the branch with the previous instruction, which we can
962 do if the previous instruction does not set up a condition
963 that the branch tests and if the branch is not itself the
964 target of any branch. */
965 if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
966 || (pinfo & INSN_COND_BRANCH_DELAY))
968 if (mips_optimize < 2
969 /* If we have seen .set volatile or .set nomove, don't
972 /* If we had to emit any NOP instructions, then we
973 already know we can not swap. */
975 /* If we don't even know the previous insn, we can not
978 /* If the previous insn is already in a branch delay
979 slot, then we can not swap. */
980 || prev_insn_is_delay_slot
981 /* If the previous previous insn was in a .set
982 noreorder, we can't swap. Actually, the MIPS
983 assembler will swap in this situation. However, gcc
984 configured -with-gnu-as will generate code like
990 in which we can not swap the bne and INSN. If gcc is
991 not configured -with-gnu-as, it does not output the
992 .set pseudo-ops. We don't have to check
993 prev_insn_unreordered, because prev_insn_valid will
994 be 0 in that case. We don't want to use
995 prev_prev_insn_valid, because we do want to be able
996 to swap at the start of a function. */
997 || prev_prev_insn_unreordered
998 /* If the branch is itself the target of a branch, we
999 can not swap. We cheat on this; all we check for is
1000 whether there is a label on this instruction. If
1001 there are any branches to anything other than a
1002 label, users must use .set noreorder. */
1003 || insn_label != NULL
1004 /* If the previous instruction is in a variant frag, we
1005 can not do the swap. */
1006 || prev_insn_frag->fr_type == rs_machine_dependent
1007 /* If the branch reads the condition codes, we don't
1008 even try to swap, because in the sequence
1013 we can not swap, and I don't feel like handling that
1015 || (pinfo & INSN_READ_COND_CODE)
1016 /* We can not swap with an instruction that requires a
1017 delay slot, becase the target of the branch might
1018 interfere with that instruction. */
1020 & (INSN_LOAD_COPROC_DELAY
1021 | INSN_COPROC_MOVE_DELAY
1022 | INSN_WRITE_COND_CODE
1027 & (INSN_LOAD_MEMORY_DELAY
1028 | INSN_COPROC_MEMORY_DELAY)))
1029 /* We can not swap with a branch instruction. */
1031 & (INSN_UNCOND_BRANCH_DELAY
1032 | INSN_COND_BRANCH_DELAY
1033 | INSN_COND_BRANCH_LIKELY))
1034 /* We do not swap with a trap instruction, since it
1035 complicates trap handlers to have the trap
1036 instruction be in a delay slot. */
1037 || (prev_pinfo & INSN_TRAP)
1038 /* If the branch reads a register that the previous
1039 instruction sets, we can not swap. */
1040 || ((prev_pinfo & INSN_WRITE_GPR_T)
1041 && insn_uses_reg (ip,
1042 ((prev_insn.insn_opcode >> OP_SH_RT)
1045 || ((prev_pinfo & INSN_WRITE_GPR_D)
1046 && insn_uses_reg (ip,
1047 ((prev_insn.insn_opcode >> OP_SH_RD)
1050 /* If the branch writes a register that the previous
1051 instruction sets, we can not swap (we know that
1052 branches write only to RD or to $31). */
1053 || ((prev_pinfo & INSN_WRITE_GPR_T)
1054 && (((pinfo & INSN_WRITE_GPR_D)
1055 && (((prev_insn.insn_opcode >> OP_SH_RT) & OP_MASK_RT)
1056 == ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD)))
1057 || ((pinfo & INSN_WRITE_GPR_31)
1058 && (((prev_insn.insn_opcode >> OP_SH_RT)
1061 || ((prev_pinfo & INSN_WRITE_GPR_D)
1062 && (((pinfo & INSN_WRITE_GPR_D)
1063 && (((prev_insn.insn_opcode >> OP_SH_RD) & OP_MASK_RD)
1064 == ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD)))
1065 || ((pinfo & INSN_WRITE_GPR_31)
1066 && (((prev_insn.insn_opcode >> OP_SH_RD)
1069 /* If the branch writes a register that the previous
1070 instruction reads, we can not swap (we know that
1071 branches only write to RD or to $31). */
1072 || ((pinfo & INSN_WRITE_GPR_D)
1073 && insn_uses_reg (&prev_insn,
1074 ((ip->insn_opcode >> OP_SH_RD)
1077 || ((pinfo & INSN_WRITE_GPR_31)
1078 && insn_uses_reg (&prev_insn, 31, 0))
1079 /* If we are generating embedded PIC code, the branch
1080 might be expanded into a sequence which uses $at, so
1081 we can't swap with an instruction which reads it. */
1082 || (mips_pic == EMBEDDED_PIC
1083 && insn_uses_reg (&prev_insn, AT, 0))
1084 /* If the previous previous instruction has a load
1085 delay, and sets a register that the branch reads, we
1087 || (((prev_prev_insn.insn_mo->pinfo & INSN_LOAD_COPROC_DELAY)
1089 && (prev_prev_insn.insn_mo->pinfo
1090 & INSN_LOAD_MEMORY_DELAY)))
1091 && insn_uses_reg (ip,
1092 ((prev_prev_insn.insn_opcode >> OP_SH_RT)
1096 /* We could do even better for unconditional branches to
1097 portions of this object file; we could pick up the
1098 instruction at the destination, put it in the delay
1099 slot, and bump the destination address. */
1101 /* Update the previous insn information. */
1102 prev_prev_insn = *ip;
1103 prev_insn.insn_mo = &dummy_opcode;
1110 /* It looks like we can actually do the swap. */
1111 prev_f = prev_insn_frag->fr_literal + prev_insn_where;
1112 memcpy (temp, prev_f, 4);
1113 memcpy (prev_f, f, 4);
1114 memcpy (f, temp, 4);
1117 prev_insn_fixp->fx_frag = frag_now;
1118 prev_insn_fixp->fx_where = f - frag_now->fr_literal;
1122 fixp->fx_frag = prev_insn_frag;
1123 fixp->fx_where = prev_insn_where;
1125 /* Update the previous insn information; leave prev_insn
1127 prev_prev_insn = *ip;
1129 prev_insn_is_delay_slot = 1;
1131 /* If that was an unconditional branch, forget the previous
1132 insn information. */
1133 if (pinfo & INSN_UNCOND_BRANCH_DELAY)
1135 prev_prev_insn.insn_mo = &dummy_opcode;
1136 prev_insn.insn_mo = &dummy_opcode;
1139 else if (pinfo & INSN_COND_BRANCH_LIKELY)
1141 /* We don't yet optimize a branch likely. What we should do
1142 is look at the target, copy the instruction found there
1143 into the delay slot, and increment the branch to jump to
1144 the next instruction. */
1146 /* Update the previous insn information. */
1147 prev_prev_insn = *ip;
1148 prev_insn.insn_mo = &dummy_opcode;
1152 /* Update the previous insn information. */
1154 prev_prev_insn.insn_mo = &dummy_opcode;
1156 prev_prev_insn = prev_insn;
1159 /* Any time we see a branch, we always fill the delay slot
1160 immediately; since this insn is not a branch, we know it
1161 is not in a delay slot. */
1162 prev_insn_is_delay_slot = 0;
1165 prev_prev_insn_unreordered = prev_insn_unreordered;
1166 prev_insn_unreordered = 0;
1167 prev_insn_frag = frag_now;
1168 prev_insn_where = f - frag_now->fr_literal;
1169 prev_insn_fixp = fixp;
1170 prev_insn_valid = 1;
1173 /* We just output an insn, so the next one doesn't have a label. */
1177 /* This function forgets that there was any previous instruction or
1181 mips_no_prev_insn ()
1183 prev_insn.insn_mo = &dummy_opcode;
1184 prev_prev_insn.insn_mo = &dummy_opcode;
1185 prev_insn_valid = 0;
1186 prev_insn_is_delay_slot = 0;
1187 prev_insn_unreordered = 0;
1188 prev_prev_insn_unreordered = 0;
1192 /* This function must be called whenever we turn on noreorder or emit
1193 something other than instructions. It inserts any NOPS which might
1194 be needed by the previous instruction, and clears the information
1195 kept for the previous instructions. */
1200 if (! mips_noreorder)
1205 if ((prev_insn.insn_mo->pinfo
1206 & (INSN_LOAD_COPROC_DELAY
1207 | INSN_COPROC_MOVE_DELAY
1208 | INSN_WRITE_COND_CODE
1212 && (prev_insn.insn_mo->pinfo
1213 & (INSN_LOAD_MEMORY_DELAY
1214 | INSN_COPROC_MEMORY_DELAY))))
1217 if ((prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE)
1218 || (prev_insn.insn_mo->pinfo & INSN_READ_HI)
1219 || (prev_insn.insn_mo->pinfo & INSN_READ_LO))
1222 else if ((prev_prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE)
1223 || (prev_prev_insn.insn_mo->pinfo & INSN_READ_HI)
1224 || (prev_prev_insn.insn_mo->pinfo & INSN_READ_LO))
1229 if (insn_label != NULL)
1231 assert (S_GET_SEGMENT (insn_label) == now_seg);
1232 insn_label->sy_frag = frag_now;
1233 S_SET_VALUE (insn_label, (valueT) frag_now_fix ());
1238 mips_no_prev_insn ();
1241 /* Build an instruction created by a macro expansion. This is passed
1242 a pointer to the count of instructions created so far, an
1243 expression, the name of the instruction to build, an operand format
1244 string, and corresponding arguments. */
1248 macro_build (char *place,
1254 #else /* ! defined (NO_STDARG) */
1256 macro_build (place, counter, ep, name, fmt, va_alist)
1263 #endif /* ! defined (NO_STDARG) */
1265 struct mips_cl_insn insn;
1266 bfd_reloc_code_real_type r;
1270 va_start (args, fmt);
1276 * If the macro is about to expand into a second instruction,
1277 * print a warning if needed. We need to pass ip as a parameter
1278 * to generate a better warning message here...
1280 if (mips_warn_about_macros && place == NULL && *counter == 1)
1281 as_warn ("Macro instruction expanded into multiple instructions");
1284 *counter += 1; /* bump instruction counter */
1286 r = BFD_RELOC_UNUSED;
1287 insn.insn_mo = (struct mips_opcode *) hash_find (op_hash, name);
1288 assert (insn.insn_mo);
1289 assert (strcmp (name, insn.insn_mo->name) == 0);
1291 while (strcmp (fmt, insn.insn_mo->args) != 0
1292 || insn.insn_mo->pinfo == INSN_MACRO)
1295 assert (insn.insn_mo->name);
1296 assert (strcmp (name, insn.insn_mo->name) == 0);
1298 insn.insn_opcode = insn.insn_mo->match;
1314 insn.insn_opcode |= va_arg (args, int) << 16;
1320 insn.insn_opcode |= va_arg (args, int) << 16;
1325 insn.insn_opcode |= va_arg (args, int) << 11;
1330 insn.insn_opcode |= va_arg (args, int) << 11;
1337 insn.insn_opcode |= va_arg (args, int) << 6;
1341 insn.insn_opcode |= va_arg (args, int) << 6;
1345 insn.insn_opcode |= va_arg (args, int) << 6;
1352 insn.insn_opcode |= va_arg (args, int) << 21;
1358 r = (bfd_reloc_code_real_type) va_arg (args, int);
1359 assert (r == BFD_RELOC_MIPS_GPREL
1360 || r == BFD_RELOC_MIPS_LITERAL
1361 || r == BFD_RELOC_LO16
1362 || r == BFD_RELOC_MIPS_GOT16
1363 || r == BFD_RELOC_MIPS_CALL16
1364 || (ep->X_op == O_subtract
1365 && now_seg == text_section
1366 && S_GET_SEGMENT (ep->X_op_symbol) == text_section
1367 && r == BFD_RELOC_PCREL_LO16));
1371 r = (bfd_reloc_code_real_type) va_arg (args, int);
1373 && (ep->X_op == O_constant
1374 || (ep->X_op == O_symbol
1375 && (r == BFD_RELOC_HI16_S
1376 || r == BFD_RELOC_HI16))
1377 || (ep->X_op == O_subtract
1378 && now_seg == text_section
1379 && S_GET_SEGMENT (ep->X_op_symbol) == text_section
1380 && r == BFD_RELOC_PCREL_HI16_S)));
1381 if (ep->X_op == O_constant)
1383 insn.insn_opcode |= (ep->X_add_number >> 16) & 0xffff;
1385 r = BFD_RELOC_UNUSED;
1390 assert (ep != NULL);
1392 * This allows macro() to pass an immediate expression for
1393 * creating short branches without creating a symbol.
1394 * Note that the expression still might come from the assembly
1395 * input, in which case the value is not checked for range nor
1396 * is a relocation entry generated (yuck).
1398 if (ep->X_op == O_constant)
1400 insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
1404 r = BFD_RELOC_16_PCREL_S2;
1408 assert (ep != NULL);
1409 r = BFD_RELOC_MIPS_JMP;
1418 assert (r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
1420 append_insn (place, &insn, ep, r);
1424 * Generate a "lui" instruction.
1427 macro_build_lui (place, counter, ep, regnum)
1433 expressionS high_expr;
1434 struct mips_cl_insn insn;
1435 bfd_reloc_code_real_type r;
1436 CONST char *name = "lui";
1437 CONST char *fmt = "t,u";
1443 high_expr.X_op = O_constant;
1444 high_expr.X_add_number = 0;
1447 if (high_expr.X_op == O_constant)
1449 /* we can compute the instruction now without a relocation entry */
1450 if (high_expr.X_add_number & 0x8000)
1451 high_expr.X_add_number += 0x10000;
1452 high_expr.X_add_number =
1453 ((unsigned long) high_expr.X_add_number >> 16) & 0xffff;
1454 r = BFD_RELOC_UNUSED;
1458 assert (ep->X_op == O_symbol);
1459 /* _gp_disp is a special case, used from s_cpload. */
1460 assert (mips_pic == NO_PIC
1461 || strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0);
1462 r = BFD_RELOC_HI16_S;
1466 * If the macro is about to expand into a second instruction,
1467 * print a warning if needed. We need to pass ip as a parameter
1468 * to generate a better warning message here...
1470 if (mips_warn_about_macros && place == NULL && *counter == 1)
1471 as_warn ("Macro instruction expanded into multiple instructions");
1474 *counter += 1; /* bump instruction counter */
1476 insn.insn_mo = (struct mips_opcode *) hash_find (op_hash, name);
1477 assert (insn.insn_mo);
1478 assert (strcmp (name, insn.insn_mo->name) == 0);
1479 assert (strcmp (fmt, insn.insn_mo->args) == 0);
1481 insn.insn_opcode = insn.insn_mo->match | (regnum << OP_SH_RT);
1482 if (r == BFD_RELOC_UNUSED)
1484 insn.insn_opcode |= high_expr.X_add_number;
1485 append_insn (place, &insn, NULL, r);
1488 append_insn (place, &insn, &high_expr, r);
1492 * Generates code to set the $at register to true (one)
1493 * if reg is less than the immediate expression.
1496 set_at (counter, reg, unsignedp)
1501 if (imm_expr.X_add_number >= -0x8000 && imm_expr.X_add_number < 0x8000)
1502 macro_build ((char *) NULL, counter, &imm_expr,
1503 unsignedp ? "sltiu" : "slti",
1504 "t,r,j", AT, reg, (int) BFD_RELOC_LO16);
1507 load_register (counter, AT, &imm_expr);
1508 macro_build ((char *) NULL, counter, NULL,
1509 unsignedp ? "sltu" : "slt",
1510 "d,v,t", AT, reg, AT);
1514 /* Warn if an expression is not a constant. */
1517 check_absolute_expr (ip, ex)
1518 struct mips_cl_insn *ip;
1521 if (ex->X_op != O_constant)
1522 as_warn ("Instruction %s requires absolute expression", ip->insn_mo->name);
1526 * This routine generates the least number of instructions neccessary to load
1527 * an absolute expression value into a register.
1530 load_register (counter, reg, ep)
1535 assert (ep->X_op == O_constant);
1536 if (ep->X_add_number >= -0x8000 && ep->X_add_number < 0x8000)
1537 macro_build ((char *) NULL, counter, ep,
1538 mips_isa < 3 ? "addiu" : "daddiu",
1539 "t,r,j", reg, 0, (int) BFD_RELOC_LO16);
1540 else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
1541 macro_build ((char *) NULL, counter, ep, "ori", "t,r,i", reg, 0,
1542 (int) BFD_RELOC_LO16);
1543 else if ((ep->X_add_number &~ (offsetT) 0x7fffffff) == 0
1544 || ((ep->X_add_number &~ (offsetT) 0x7fffffff)
1545 == ~ (offsetT) 0x7fffffff))
1547 macro_build ((char *) NULL, counter, ep, "lui", "t,u", reg,
1548 (int) BFD_RELOC_HI16);
1549 if ((ep->X_add_number & 0xffff) != 0)
1550 macro_build ((char *) NULL, counter, ep, "ori", "t,r,i", reg, reg,
1551 (int) BFD_RELOC_LO16);
1553 else if (mips_isa < 3)
1555 as_bad ("Number larger than 32 bits");
1556 macro_build ((char *) NULL, counter, ep, "addiu", "t,r,j", reg, 0,
1557 (int) BFD_RELOC_LO16);
1562 expressionS hi32, lo32;
1566 hi32.X_add_number >>= shift;
1567 hi32.X_add_number &= 0xffffffff;
1568 if ((hi32.X_add_number & 0x80000000) != 0)
1569 hi32.X_add_number |= ~ (offsetT) 0xffffffff;
1570 load_register (counter, reg, &hi32);
1572 lo32.X_add_number &= 0xffffffff;
1573 if ((lo32.X_add_number & 0xffff0000) == 0)
1574 macro_build ((char *) NULL, counter, NULL, "dsll32", "d,w,<", reg,
1580 macro_build ((char *) NULL, counter, NULL, "dsll", "d,w,<", reg,
1583 mid16.X_add_number >>= 16;
1584 macro_build ((char *) NULL, counter, &mid16, "ori", "t,r,i", reg,
1585 reg, (int) BFD_RELOC_LO16);
1586 macro_build ((char *) NULL, counter, NULL, "dsll", "d,w,<", reg,
1589 if ((lo32.X_add_number & 0xffff) != 0)
1590 macro_build ((char *) NULL, counter, &lo32, "ori", "t,r,i", reg, reg,
1591 (int) BFD_RELOC_LO16);
1595 /* Load an address into a register. */
1598 load_address (counter, reg, ep)
1605 if (ep->X_op != O_constant
1606 && ep->X_op != O_symbol)
1608 as_bad ("expression too complex");
1609 ep->X_op = O_constant;
1612 if (ep->X_op == O_constant)
1614 load_register (counter, reg, ep);
1618 if (mips_pic == NO_PIC)
1620 /* If this is a reference to a GP relative symbol, we want
1621 addiu $reg,$gp,<sym> (BFD_RELOC_MIPS_GPREL)
1623 lui $reg,<sym> (BFD_RELOC_HI16_S)
1624 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
1625 If we have an addend, we always use the latter form. */
1626 if (ep->X_add_number != 0)
1631 macro_build ((char *) NULL, counter, ep,
1632 mips_isa < 3 ? "addiu" : "daddiu",
1633 "t,r,j", reg, GP, (int) BFD_RELOC_MIPS_GPREL);
1634 p = frag_var (rs_machine_dependent, 8, 0,
1635 RELAX_ENCODE (4, 8, -4, 0, 0, mips_warn_about_macros),
1636 ep->X_add_symbol, (long) 0, (char *) NULL);
1638 macro_build_lui (p, counter, ep, reg);
1641 macro_build (p, counter, ep,
1642 mips_isa < 3 ? "addiu" : "daddiu",
1643 "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
1645 else if (mips_pic == SVR4_PIC)
1649 /* If this is a reference to an external symbol, we want
1650 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
1652 lw $reg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
1654 addiu $reg,$reg,<sym> (BFD_RELOC_LO16)
1655 If there is a constant, it must be added in after. */
1656 ex.X_add_number = ep->X_add_number;
1657 ep->X_add_number = 0;
1659 macro_build ((char *) NULL, counter, ep,
1660 mips_isa < 3 ? "lw" : "ld",
1661 "t,o(b)", reg, (int) BFD_RELOC_MIPS_GOT16, GP);
1662 macro_build ((char *) NULL, counter, (expressionS *) NULL, "nop", "");
1663 p = frag_var (rs_machine_dependent, 4, 0,
1664 RELAX_ENCODE (0, 4, -8, 0, 0, mips_warn_about_macros),
1665 ep->X_add_symbol, (long) 0, (char *) NULL);
1666 macro_build (p, counter, ep,
1667 mips_isa < 3 ? "addiu" : "daddiu",
1668 "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
1669 if (ex.X_add_number != 0)
1671 if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
1672 as_bad ("PIC code offset overflow (max 16 signed bits)");
1673 ex.X_op = O_constant;
1674 macro_build (p, counter, &ex,
1675 mips_isa < 3 ? "addiu" : "daddiu",
1676 "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
1679 else if (mips_pic == EMBEDDED_PIC)
1682 addiu $reg,$gp,<sym> (BFD_RELOC_MIPS_GPREL)
1684 macro_build ((char *) NULL, counter, ep,
1685 mips_isa < 3 ? "addiu" : "daddiu",
1686 "t,r,j", reg, GP, (int) BFD_RELOC_MIPS_GPREL);
1694 * This routine implements the seemingly endless macro or synthesized
1695 * instructions and addressing modes in the mips assembly language. Many
1696 * of these macros are simple and are similar to each other. These could
1697 * probably be handled by some kind of table or grammer aproach instead of
1698 * this verbose method. Others are not simple macros but are more like
1699 * optimizing code generation.
1700 * One interesting optimization is when several store macros appear
1701 * consecutivly that would load AT with the upper half of the same address.
1702 * The ensuing load upper instructions are ommited. This implies some kind
1703 * of global optimization. We currently only optimize within a single macro.
1704 * For many of the load and store macros if the address is specified as a
1705 * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
1706 * first load register 'at' with zero and use it as the base register. The
1707 * mips assembler simply uses register $zero. Just one tiny optimization
1712 struct mips_cl_insn *ip;
1714 register int treg, sreg, dreg, breg;
1727 bfd_reloc_code_real_type r;
1730 treg = (ip->insn_opcode >> 16) & 0x1f;
1731 dreg = (ip->insn_opcode >> 11) & 0x1f;
1732 sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
1733 mask = ip->insn_mo->mask;
1735 expr1.X_op = O_constant;
1736 expr1.X_op_symbol = NULL;
1737 expr1.X_add_symbol = NULL;
1738 expr1.X_add_number = 1;
1750 mips_emit_delays ();
1752 mips_any_noreorder = 1;
1754 expr1.X_add_number = 8;
1755 macro_build ((char *) NULL, &icnt, &expr1, "bgez", "s,p", sreg);
1757 macro_build ((char *) NULL, &icnt, NULL, "nop", "", 0);
1759 macro_build ((char *) NULL, &icnt, NULL, "move", "d,s", dreg, sreg, 0);
1760 macro_build ((char *) NULL, &icnt, NULL,
1761 dbl ? "dsub" : "sub",
1762 "d,v,t", dreg, 0, sreg);
1785 if (imm_expr.X_add_number >= -0x8000 && imm_expr.X_add_number < 0x8000)
1787 macro_build ((char *) NULL, &icnt, &imm_expr, s, "t,r,j", treg, sreg,
1788 (int) BFD_RELOC_LO16);
1791 load_register (&icnt, AT, &imm_expr);
1792 macro_build ((char *) NULL, &icnt, NULL, s2, "d,v,t", treg, sreg, AT);
1811 if (imm_expr.X_add_number >= 0 && imm_expr.X_add_number < 0x10000)
1813 if (mask != M_NOR_I)
1814 macro_build ((char *) NULL, &icnt, &imm_expr, s, "t,r,i", treg,
1815 sreg, (int) BFD_RELOC_LO16);
1818 macro_build ((char *) NULL, &icnt, &imm_expr, "ori", "t,r,i",
1819 treg, sreg, (int) BFD_RELOC_LO16);
1820 macro_build ((char *) NULL, &icnt, NULL, "nor", "d,v,t",
1826 load_register (&icnt, AT, &imm_expr);
1827 macro_build ((char *) NULL, &icnt, NULL, s2, "d,v,t", treg, sreg, AT);
1844 if (imm_expr.X_add_number == 0)
1846 macro_build ((char *) NULL, &icnt, &offset_expr, s, "s,t,p", sreg,
1850 load_register (&icnt, AT, &imm_expr);
1851 macro_build ((char *) NULL, &icnt, &offset_expr, s, "s,t,p", sreg, AT);
1859 macro_build ((char *) NULL, &icnt, &offset_expr,
1860 likely ? "bgezl" : "bgez",
1866 macro_build ((char *) NULL, &icnt, &offset_expr,
1867 likely ? "blezl" : "blez",
1871 macro_build ((char *) NULL, &icnt, NULL, "slt", "d,v,t", AT, sreg, treg);
1872 macro_build ((char *) NULL, &icnt, &offset_expr,
1873 likely ? "beql" : "beq",
1880 /* check for > max integer */
1881 maxnum = 0x7fffffff;
1889 if (imm_expr.X_add_number >= maxnum)
1892 /* result is always false */
1895 as_warn ("Branch %s is always false (nop)", ip->insn_mo->name);
1896 macro_build ((char *) NULL, &icnt, NULL, "nop", "", 0);
1900 as_warn ("Branch likely %s is always false", ip->insn_mo->name);
1901 macro_build ((char *) NULL, &icnt, &offset_expr, "bnel",
1906 imm_expr.X_add_number++;
1910 if (mask == M_BGEL_I)
1912 if (imm_expr.X_add_number == 0)
1914 macro_build ((char *) NULL, &icnt, &offset_expr,
1915 likely ? "bgezl" : "bgez",
1919 if (imm_expr.X_add_number == 1)
1921 macro_build ((char *) NULL, &icnt, &offset_expr,
1922 likely ? "bgtzl" : "bgtz",
1926 maxnum = 0x7fffffff;
1934 maxnum = - maxnum - 1;
1935 if (imm_expr.X_add_number <= maxnum)
1938 /* result is always true */
1939 as_warn ("Branch %s is always true", ip->insn_mo->name);
1940 macro_build ((char *) NULL, &icnt, &offset_expr, "b", "p");
1943 set_at (&icnt, sreg, 0);
1944 macro_build ((char *) NULL, &icnt, &offset_expr,
1945 likely ? "beql" : "beq",
1956 macro_build ((char *) NULL, &icnt, &offset_expr,
1957 likely ? "beql" : "beq",
1961 macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", AT, sreg,
1963 macro_build ((char *) NULL, &icnt, &offset_expr,
1964 likely ? "beql" : "beq",
1971 if (sreg == 0 || imm_expr.X_add_number == -1)
1973 imm_expr.X_add_number++;
1977 if (mask == M_BGEUL_I)
1979 if (imm_expr.X_add_number == 0)
1981 if (imm_expr.X_add_number == 1)
1983 macro_build ((char *) NULL, &icnt, &offset_expr,
1984 likely ? "bnel" : "bne",
1988 set_at (&icnt, sreg, 1);
1989 macro_build ((char *) NULL, &icnt, &offset_expr,
1990 likely ? "beql" : "beq",
1999 macro_build ((char *) NULL, &icnt, &offset_expr,
2000 likely ? "bgtzl" : "bgtz",
2006 macro_build ((char *) NULL, &icnt, &offset_expr,
2007 likely ? "bltzl" : "bltz",
2011 macro_build ((char *) NULL, &icnt, NULL, "slt", "d,v,t", AT, treg, sreg);
2012 macro_build ((char *) NULL, &icnt, &offset_expr,
2013 likely ? "bnel" : "bne",
2022 macro_build ((char *) NULL, &icnt, &offset_expr,
2023 likely ? "bnel" : "bne",
2029 macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", AT, treg,
2031 macro_build ((char *) NULL, &icnt, &offset_expr,
2032 likely ? "bnel" : "bne",
2041 macro_build ((char *) NULL, &icnt, &offset_expr,
2042 likely ? "blezl" : "blez",
2048 macro_build ((char *) NULL, &icnt, &offset_expr,
2049 likely ? "bgezl" : "bgez",
2053 macro_build ((char *) NULL, &icnt, NULL, "slt", "d,v,t", AT, treg, sreg);
2054 macro_build ((char *) NULL, &icnt, &offset_expr,
2055 likely ? "beql" : "beq",
2062 maxnum = 0x7fffffff;
2070 if (imm_expr.X_add_number >= maxnum)
2072 imm_expr.X_add_number++;
2076 if (mask == M_BLTL_I)
2078 if (imm_expr.X_add_number == 0)
2080 macro_build ((char *) NULL, &icnt, &offset_expr,
2081 likely ? "bltzl" : "bltz",
2085 if (imm_expr.X_add_number == 1)
2087 macro_build ((char *) NULL, &icnt, &offset_expr,
2088 likely ? "blezl" : "blez",
2092 set_at (&icnt, sreg, 0);
2093 macro_build ((char *) NULL, &icnt, &offset_expr,
2094 likely ? "bnel" : "bne",
2103 macro_build ((char *) NULL, &icnt, &offset_expr,
2104 likely ? "beql" : "beq",
2110 macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", AT, treg,
2112 macro_build ((char *) NULL, &icnt, &offset_expr,
2113 likely ? "beql" : "beq",
2120 if (sreg == 0 || imm_expr.X_add_number == -1)
2122 imm_expr.X_add_number++;
2126 if (mask == M_BLTUL_I)
2128 if (imm_expr.X_add_number == 0)
2130 if (imm_expr.X_add_number == 1)
2132 macro_build ((char *) NULL, &icnt, &offset_expr,
2133 likely ? "beql" : "beq",
2137 set_at (&icnt, sreg, 1);
2138 macro_build ((char *) NULL, &icnt, &offset_expr,
2139 likely ? "bnel" : "bne",
2148 macro_build ((char *) NULL, &icnt, &offset_expr,
2149 likely ? "bltzl" : "bltz",
2155 macro_build ((char *) NULL, &icnt, &offset_expr,
2156 likely ? "bgtzl" : "bgtz",
2160 macro_build ((char *) NULL, &icnt, NULL, "slt", "d,v,t", AT, sreg, treg);
2161 macro_build ((char *) NULL, &icnt, &offset_expr,
2162 likely ? "bnel" : "bne",
2173 macro_build ((char *) NULL, &icnt, &offset_expr,
2174 likely ? "bnel" : "bne",
2178 macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", AT, sreg,
2180 macro_build ((char *) NULL, &icnt, &offset_expr,
2181 likely ? "bnel" : "bne",
2197 as_warn ("Divide by zero.");
2199 macro_build ((char *) NULL, &icnt, NULL, "teq", "s,t", 0, 0);
2201 macro_build ((char *) NULL, &icnt, NULL, "break", "c", 7);
2205 mips_emit_delays ();
2207 mips_any_noreorder = 1;
2208 macro_build ((char *) NULL, &icnt, NULL,
2209 dbl ? "ddiv" : "div",
2210 "z,s,t", sreg, treg);
2212 macro_build ((char *) NULL, &icnt, NULL, "teq", "s,t", treg, 0);
2215 expr1.X_add_number = 8;
2216 macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", treg, 0);
2217 macro_build ((char *) NULL, &icnt, NULL, "nop", "", 0);
2218 macro_build ((char *) NULL, &icnt, NULL, "break", "c", 7);
2220 expr1.X_add_number = -1;
2221 macro_build ((char *) NULL, &icnt, &expr1,
2222 dbl ? "daddiu" : "addiu",
2223 "t,r,j", AT, 0, (int) BFD_RELOC_LO16);
2224 expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
2225 macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", treg, AT);
2228 expr1.X_add_number = 1;
2229 macro_build ((char *) NULL, &icnt, &expr1, "daddiu", "t,r,j", AT, 0,
2230 (int) BFD_RELOC_LO16);
2231 macro_build ((char *) NULL, &icnt, NULL, "dsll32", "d,w,<", AT, AT,
2236 expr1.X_add_number = 0x80000000;
2237 macro_build ((char *) NULL, &icnt, &expr1, "lui", "t,u", AT,
2238 (int) BFD_RELOC_HI16);
2241 macro_build ((char *) NULL, &icnt, NULL, "teq", "s,t", sreg, AT);
2244 expr1.X_add_number = 8;
2245 macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", sreg, AT);
2246 macro_build ((char *) NULL, &icnt, NULL, "nop", "", 0);
2247 macro_build ((char *) NULL, &icnt, NULL, "break", "c", 6);
2250 macro_build ((char *) NULL, &icnt, NULL, s, "d", dreg);
2289 if (imm_expr.X_add_number == 0)
2291 as_warn ("Divide by zero.");
2293 macro_build ((char *) NULL, &icnt, NULL, "teq", "s,t", 0, 0);
2295 macro_build ((char *) NULL, &icnt, NULL, "break", "c", 7);
2298 if (imm_expr.X_add_number == 1)
2300 if (strcmp (s2, "mflo") == 0)
2301 macro_build ((char *) NULL, &icnt, NULL, "move", "d,s", dreg,
2304 macro_build ((char *) NULL, &icnt, NULL, "move", "d,s", dreg, 0);
2307 if (imm_expr.X_add_number == -1
2308 && s[strlen (s) - 1] != 'u')
2310 if (strcmp (s2, "mflo") == 0)
2313 macro_build ((char *) NULL, &icnt, NULL, "dneg", "d,w", dreg,
2316 macro_build ((char *) NULL, &icnt, NULL, "neg", "d,w", dreg,
2320 macro_build ((char *) NULL, &icnt, NULL, "move", "d,s", dreg, 0);
2324 load_register (&icnt, AT, &imm_expr);
2325 macro_build ((char *) NULL, &icnt, NULL, s, "z,s,t", sreg, AT);
2326 macro_build ((char *) NULL, &icnt, NULL, s2, "d", dreg);
2345 mips_emit_delays ();
2347 mips_any_noreorder = 1;
2348 macro_build ((char *) NULL, &icnt, NULL, s, "z,s,t", sreg, treg);
2350 macro_build ((char *) NULL, &icnt, NULL, "teq", "s,t", treg, 0);
2353 expr1.X_add_number = 8;
2354 macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", treg, 0);
2355 macro_build ((char *) NULL, &icnt, NULL, "nop", "", 0);
2356 macro_build ((char *) NULL, &icnt, NULL, "break", "c", 7);
2359 macro_build ((char *) NULL, &icnt, NULL, s2, "d", dreg);
2363 /* Load the address of a symbol into a register. If breg is not
2364 zero, we then add a base register to it. */
2366 /* When generating embedded PIC code, we permit expressions of
2369 where bar is an address in the .text section. These are used
2370 when getting the addresses of functions. We don't permit
2371 X_add_number to be non-zero, because if the symbol is
2372 external the relaxing code needs to know that any addend is
2373 purely the offset to X_op_symbol. */
2374 if (mips_pic == EMBEDDED_PIC
2375 && offset_expr.X_op == O_subtract
2376 && now_seg == text_section
2377 && S_GET_SEGMENT (offset_expr.X_op_symbol) == text_section
2379 && offset_expr.X_add_number == 0)
2381 macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
2382 treg, (int) BFD_RELOC_PCREL_HI16_S);
2383 macro_build ((char *) NULL, &icnt, &offset_expr,
2384 mips_isa < 3 ? "addiu" : "daddiu",
2385 "t,r,j", treg, treg, (int) BFD_RELOC_PCREL_LO16);
2389 if (offset_expr.X_op != O_symbol
2390 && offset_expr.X_op != O_constant)
2392 as_bad ("expression too complex");
2393 offset_expr.X_op = O_constant;
2407 if (offset_expr.X_op == O_constant)
2408 load_register (&icnt, tempreg, &offset_expr);
2409 else if (mips_pic == NO_PIC)
2411 /* If this is a reference to an GP relative symbol, we want
2412 addiu $tempreg,$gp,<sym> (BFD_RELOC_MIPS_GPREL)
2414 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
2415 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
2416 If we have a constant, we need two instructions anyhow,
2417 so we may as well always use the latter form. */
2418 if (offset_expr.X_add_number != 0)
2423 macro_build ((char *) NULL, &icnt, &offset_expr,
2424 mips_isa < 3 ? "addiu" : "daddiu",
2425 "t,r,j", tempreg, GP, (int) BFD_RELOC_MIPS_GPREL);
2426 p = frag_var (rs_machine_dependent, 8, 0,
2427 RELAX_ENCODE (4, 8, 0, 4, 0,
2428 mips_warn_about_macros),
2429 offset_expr.X_add_symbol, (long) 0,
2432 macro_build_lui (p, &icnt, &offset_expr, tempreg);
2435 macro_build (p, &icnt, &offset_expr,
2436 mips_isa < 3 ? "addiu" : "daddiu",
2437 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
2439 else if (mips_pic == SVR4_PIC)
2441 /* If this is a reference to an external symbol, and there
2442 is no constant, we want
2443 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
2444 For a local symbol, we want
2445 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
2447 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
2449 If we have a small constant, and this is a reference to
2450 an external symbol, we want
2451 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
2453 addiu $tempreg,$tempreg,<constant>
2454 For a local symbol, we want the same instruction
2455 sequence, but we output a BFD_RELOC_LO16 reloc on the
2458 If we have a large constant, and this is a reference to
2459 an external symbol, we want
2460 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
2461 lui $at,<hiconstant>
2462 addiu $at,$at,<loconstant>
2463 addu $tempreg,$tempreg,$at
2464 For a local symbol, we want the same instruction
2465 sequence, but we output a BFD_RELOC_LO16 reloc on the
2466 addiu instruction. */
2467 expr1.X_add_number = offset_expr.X_add_number;
2468 offset_expr.X_add_number = 0;
2470 macro_build ((char *) NULL, &icnt, &offset_expr,
2471 mips_isa < 3 ? "lw" : "ld",
2472 "t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT16, GP);
2473 if (expr1.X_add_number == 0)
2481 /* We're going to put in an addu instruction using
2482 tempreg, so we may as well insert the nop right
2484 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
2488 p = frag_var (rs_machine_dependent, 8 - off, 0,
2489 RELAX_ENCODE (0, 8 - off, -4 - off, 4 - off, 0,
2491 ? mips_warn_about_macros
2493 offset_expr.X_add_symbol, (long) 0,
2497 macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
2500 macro_build (p, &icnt, &expr1,
2501 mips_isa < 3 ? "addiu" : "daddiu",
2502 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
2503 /* FIXME: If breg == 0, and the next instruction uses
2504 $tempreg, then if this variant case is used an extra
2505 nop will be generated. */
2507 else if (expr1.X_add_number >= -0x8000
2508 && expr1.X_add_number < 0x8000)
2510 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
2512 macro_build ((char *) NULL, &icnt, &expr1,
2513 mips_isa < 3 ? "addiu" : "daddiu",
2514 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
2515 (void) frag_var (rs_machine_dependent, 0, 0,
2516 RELAX_ENCODE (0, 0, -12, -4, 0, 0),
2517 offset_expr.X_add_symbol, (long) 0,
2524 /* If we are going to add in a base register, and the
2525 target register and the base register are the same,
2526 then we are using AT as a temporary register. Since
2527 we want to load the constant into AT, we add our
2528 current AT (from the global offset table) and the
2529 register into the register now, and pretend we were
2530 not using a base register. */
2535 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
2537 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
2538 mips_isa < 3 ? "addu" : "daddu",
2539 "d,v,t", treg, AT, breg);
2545 macro_build_lui ((char *) NULL, &icnt, &expr1, AT);
2546 macro_build ((char *) NULL, &icnt, &expr1,
2547 mips_isa < 3 ? "addiu" : "daddiu",
2548 "t,r,j", AT, AT, (int) BFD_RELOC_LO16);
2549 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
2550 mips_isa < 3 ? "addu" : "daddu",
2551 "d,v,t", tempreg, tempreg, AT);
2552 (void) frag_var (rs_machine_dependent, 0, 0,
2553 RELAX_ENCODE (0, 0, -16 + off1, -8, 0, 0),
2554 offset_expr.X_add_symbol, (long) 0,
2559 else if (mips_pic == EMBEDDED_PIC)
2562 addiu $tempreg,$gp,<sym> (BFD_RELOC_MIPS_GPREL)
2564 macro_build ((char *) NULL, &icnt, &offset_expr,
2565 mips_isa < 3 ? "addiu" : "daddiu",
2566 "t,r,j", tempreg, GP, (int) BFD_RELOC_MIPS_GPREL);
2572 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
2573 mips_isa < 3 ? "addu" : "daddu",
2574 "d,v,t", treg, tempreg, breg);
2582 /* The j instruction may not be used in PIC code, since it
2583 requires an absolute address. We convert it to a b
2585 if (mips_pic == NO_PIC)
2586 macro_build ((char *) NULL, &icnt, &offset_expr, "j", "a");
2588 macro_build ((char *) NULL, &icnt, &offset_expr, "b", "p");
2591 /* The jal instructions must be handled as macros because when
2592 generating PIC code they expand to multi-instruction
2593 sequences. Normally they are simple instructions. */
2598 if (mips_pic == NO_PIC
2599 || mips_pic == EMBEDDED_PIC)
2600 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "jalr",
2602 else if (mips_pic == SVR4_PIC)
2604 if (sreg != PIC_CALL_REG)
2605 as_warn ("MIPS PIC call to register other than $25");
2607 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "jalr",
2609 if (mips_cprestore_offset < 0)
2610 as_warn ("No .cprestore pseudo-op used in PIC code");
2613 expr1.X_add_number = mips_cprestore_offset;
2614 macro_build ((char *) NULL, &icnt, &expr1,
2615 mips_isa < 3 ? "lw" : "ld",
2616 "t,o(b)", GP, (int) BFD_RELOC_LO16, mips_frame_reg);
2625 if (mips_pic == NO_PIC)
2626 macro_build ((char *) NULL, &icnt, &offset_expr, "jal", "a");
2627 else if (mips_pic == SVR4_PIC)
2629 /* If this is a reference to an external symbol, we want
2630 lw $25,<sym>($gp) (BFD_RELOC_MIPS_CALL16)
2634 lw $gp,cprestore($sp)
2635 The cprestore value is set using the .cprestore
2636 pseudo-op. If the symbol is not external, we want
2637 lw $25,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
2639 addiu $25,$25,<sym> (BFD_RELOC_LO16)
2642 lw $gp,cprestore($sp)
2645 macro_build ((char *) NULL, &icnt, &offset_expr,
2646 mips_isa < 3 ? "lw" : "ld",
2647 "t,o(b)", PIC_CALL_REG,
2648 (int) BFD_RELOC_MIPS_CALL16, GP);
2649 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
2650 p = frag_var (rs_machine_dependent, 4, 0,
2651 RELAX_ENCODE (0, 4, -8, 0, 0, 0),
2652 offset_expr.X_add_symbol, (long) 0, (char *) NULL);
2653 macro_build (p, &icnt, &offset_expr,
2654 mips_isa < 3 ? "addiu" : "daddiu",
2655 "t,r,j", PIC_CALL_REG, PIC_CALL_REG,
2656 (int) BFD_RELOC_LO16);
2657 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
2658 "jalr", "s", PIC_CALL_REG);
2659 if (mips_cprestore_offset < 0)
2660 as_warn ("No .cprestore pseudo-op used in PIC code");
2664 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
2666 expr1.X_add_number = mips_cprestore_offset;
2667 macro_build ((char *) NULL, &icnt, &expr1,
2668 mips_isa < 3 ? "lw" : "ld",
2669 "t,o(b)", GP, (int) BFD_RELOC_LO16,
2673 else if (mips_pic == EMBEDDED_PIC)
2675 macro_build ((char *) NULL, &icnt, &offset_expr, "bal", "p");
2676 /* The linker may expand the call to a longer sequence which
2677 uses $at, so we must break rather than return. */
2749 if (breg == treg || coproc)
2818 if (mask == M_LWC1_AB
2819 || mask == M_SWC1_AB
2820 || mask == M_LDC1_AB
2821 || mask == M_SDC1_AB
2830 if (offset_expr.X_op != O_constant
2831 && offset_expr.X_op != O_symbol)
2833 as_bad ("expression too complex");
2834 offset_expr.X_op = O_constant;
2837 /* A constant expression in PIC code can be handled just as it
2838 is in non PIC code. */
2839 if (mips_pic == NO_PIC
2840 || offset_expr.X_op == O_constant)
2842 /* If this is a reference to a GP relative symbol, and there
2843 is no base register, we want
2844 <op> $treg,<sym>($gp) (BFD_RELOC_MIPS_GPREL)
2845 Otherwise, if there is no base register, we want
2846 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
2847 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
2848 If we have a constant, we need two instructions anyhow,
2849 so we always use the latter form.
2851 If we have a base register, and this is a reference to a
2852 GP relative symbol, we want
2853 addu $tempreg,$breg,$gp
2854 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GPREL)
2856 lui $tempreg,<sym> (BFD_RELOC_HI16_S)
2857 addu $tempreg,$tempreg,$breg
2858 <op> $treg,<sym>($tempreg) (BFD_RELOC_LO16)
2859 With a constant we always use the latter case. */
2862 if (offset_expr.X_add_number != 0)
2867 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
2868 treg, (int) BFD_RELOC_MIPS_GPREL, GP);
2869 p = frag_var (rs_machine_dependent, 8, 0,
2870 RELAX_ENCODE (4, 8, 0, 4, 0,
2871 (mips_warn_about_macros
2872 || (used_at && mips_noat))),
2873 offset_expr.X_add_symbol, (long) 0,
2877 macro_build_lui (p, &icnt, &offset_expr, tempreg);
2880 macro_build (p, &icnt, &offset_expr, s, fmt, treg,
2881 (int) BFD_RELOC_LO16, tempreg);
2885 if (offset_expr.X_add_number != 0)
2890 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
2891 mips_isa < 3 ? "addu" : "daddu",
2892 "d,v,t", tempreg, breg, GP);
2893 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
2894 treg, (int) BFD_RELOC_MIPS_GPREL, tempreg);
2895 p = frag_var (rs_machine_dependent, 12, 0,
2896 RELAX_ENCODE (8, 12, 0, 8, 0, 0),
2897 offset_expr.X_add_symbol, (long) 0,
2900 macro_build_lui (p, &icnt, &offset_expr, tempreg);
2903 macro_build (p, &icnt, (expressionS *) NULL,
2904 mips_isa < 3 ? "addu" : "daddu",
2905 "d,v,t", tempreg, tempreg, breg);
2908 macro_build (p, &icnt, &offset_expr, s, fmt, treg,
2909 (int) BFD_RELOC_LO16, tempreg);
2912 else if (mips_pic == SVR4_PIC)
2914 /* If this is a reference to an external symbol, we want
2915 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
2917 <op> $treg,0($tempreg)
2919 lw $tempreg,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
2921 addiu $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
2922 <op> $treg,0($tempreg)
2923 If there is a base register, we add it to $tempreg before
2924 the <op>. If there is a constant, we stick it in the
2925 <op> instruction. We don't handle constants larger than
2926 16 bits, because we have no way to load the upper 16 bits
2927 (actually, we could handle them for the subset of cases
2928 in which we are not using $at). */
2929 assert (offset_expr.X_op == O_symbol);
2930 expr1.X_add_number = offset_expr.X_add_number;
2931 offset_expr.X_add_number = 0;
2932 if (expr1.X_add_number < -0x8000
2933 || expr1.X_add_number >= 0x8000)
2934 as_bad ("PIC code offset overflow (max 16 signed bits)");
2936 macro_build ((char *) NULL, &icnt, &offset_expr,
2937 mips_isa < 3 ? "lw" : "ld",
2938 "t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT16, GP);
2939 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
2940 p = frag_var (rs_machine_dependent, 4, 0,
2941 RELAX_ENCODE (0, 4, -8, 0, 0, 0),
2942 offset_expr.X_add_symbol, (long) 0,
2944 macro_build (p, &icnt, &offset_expr,
2945 mips_isa < 3 ? "addiu" : "daddiu",
2946 "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
2948 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
2949 mips_isa < 3 ? "addu" : "daddu",
2950 "d,v,t", tempreg, tempreg, breg);
2951 macro_build ((char *) NULL, &icnt, &expr1, s, fmt, treg,
2952 (int) BFD_RELOC_LO16, tempreg);
2954 else if (mips_pic == EMBEDDED_PIC)
2956 /* If there is no base register, we want
2957 <op> $treg,<sym>($gp) (BFD_RELOC_MIPS_GPREL)
2958 If there is a base register, we want
2959 addu $tempreg,$breg,$gp
2960 <op> $treg,<sym>($tempreg) (BFD_RELOC_MIPS_GPREL)
2962 assert (offset_expr.X_op == O_symbol);
2965 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
2966 treg, (int) BFD_RELOC_MIPS_GPREL, GP);
2971 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
2972 mips_isa < 3 ? "addu" : "daddu",
2973 "d,v,t", tempreg, breg, GP);
2974 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
2975 treg, (int) BFD_RELOC_MIPS_GPREL, tempreg);
2988 load_register (&icnt, treg, &imm_expr);
2992 if (mips_pic == NO_PIC)
2994 assert (offset_expr.X_op == O_symbol
2995 && strcmp (segment_name (S_GET_SEGMENT
2996 (offset_expr.X_add_symbol)),
2998 && offset_expr.X_add_number == 0);
2999 macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
3000 treg, (int) BFD_RELOC_MIPS_LITERAL, GP);
3003 else if (mips_pic == SVR4_PIC
3004 || mips_pic == EMBEDDED_PIC)
3006 assert (imm_expr.X_op == O_constant);
3007 load_register (&icnt, AT, &imm_expr);
3008 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
3009 "mtc1", "t,G", AT, treg);
3019 /* We know that sym is in the .rdata section. First we get the
3020 upper 16 bits of the address. */
3021 if (mips_pic == NO_PIC)
3023 /* FIXME: This won't work for a 64 bit address. */
3024 macro_build_lui ((char *) NULL, &icnt, &offset_expr, AT);
3026 else if (mips_pic == SVR4_PIC)
3028 macro_build ((char *) NULL, &icnt, &offset_expr,
3029 mips_isa < 3 ? "lw" : "ld",
3030 "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16, GP);
3032 else if (mips_pic == EMBEDDED_PIC)
3034 /* For embedded PIC we pick up the entire address off $gp in
3035 a single instruction. */
3036 macro_build ((char *) NULL, &icnt, &offset_expr,
3037 mips_isa < 3 ? "addiu" : "daddiu",
3038 "t,r,j", AT, GP, (int) BFD_RELOC_MIPS_GPREL);
3039 offset_expr.X_op = O_constant;
3040 offset_expr.X_add_number = 0;
3045 /* Now we load the register(s). */
3047 macro_build ((char *) NULL, &icnt, &offset_expr, "ld", "t,o(b)",
3048 treg, (int) BFD_RELOC_LO16, AT);
3051 macro_build ((char *) NULL, &icnt, &offset_expr, "lw", "t,o(b)",
3052 treg, (int) BFD_RELOC_LO16, AT);
3055 /* FIXME: How in the world do we deal with the possible
3057 offset_expr.X_add_number += 4;
3058 macro_build ((char *) NULL, &icnt, &offset_expr, "lw", "t,o(b)",
3059 treg + 1, (int) BFD_RELOC_LO16, AT);
3063 /* To avoid confusion in tc_gen_reloc, we must ensure that this
3064 does not become a variant frag. */
3065 frag_wane (frag_now);
3071 if (mips_pic == NO_PIC
3072 || mips_pic == EMBEDDED_PIC)
3074 /* Load a floating point number from the .lit8 section. */
3075 assert (offset_expr.X_op == O_symbol
3076 && strcmp (segment_name (S_GET_SEGMENT
3077 (offset_expr.X_add_symbol)),
3079 && offset_expr.X_add_number == 0);
3082 macro_build ((char *) NULL, &icnt, &offset_expr, "ldc1",
3083 "T,o(b)", treg, (int) BFD_RELOC_MIPS_LITERAL, GP);
3087 r = BFD_RELOC_MIPS_LITERAL;
3090 else if (mips_pic == SVR4_PIC)
3092 /* Load the double from the .rdata section. */
3093 macro_build ((char *) NULL, &icnt, &offset_expr,
3094 mips_isa < 3 ? "lw" : "ld",
3095 "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16, GP);
3098 macro_build ((char *) NULL, &icnt, &offset_expr, "ldc1",
3099 "T,o(b)", treg, (int) BFD_RELOC_LO16, GP);
3110 /* Even on a big endian machine $fn comes before $fn+1. We have
3111 to adjust when loading from memory. */
3114 assert (mips_isa < 2);
3115 macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
3116 byte_order == LITTLE_ENDIAN ? treg : treg + 1,
3118 /* FIXME: A possible overflow which I don't know how to deal
3120 offset_expr.X_add_number += 4;
3121 macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
3122 byte_order == LITTLE_ENDIAN ? treg + 1 : treg,
3125 /* To avoid confusion in tc_gen_reloc, we must ensure that this
3126 does not become a variant frag. */
3127 frag_wane (frag_now);
3136 * The MIPS assembler seems to check for X_add_number not
3137 * being double aligned and generating:
3140 * addiu at,at,%lo(foo+1)
3143 * But, the resulting address is the same after relocation so why
3144 * generate the extra instruction?
3191 if (offset_expr.X_op != O_symbol
3192 && offset_expr.X_op != O_constant)
3194 as_bad ("expression too complex");
3195 offset_expr.X_op = O_constant;
3198 /* Even on a big endian machine $fn comes before $fn+1. We have
3199 to adjust when loading from memory. We set coproc if we must
3200 load $fn+1 first. */
3201 if (byte_order == LITTLE_ENDIAN)
3204 if (mips_pic == NO_PIC
3205 || offset_expr.X_op == O_constant)
3207 /* If this is a reference to a GP relative symbol, we want
3208 <op> $treg,<sym>($gp) (BFD_RELOC_MIPS_GPREL)
3209 <op> $treg+1,<sym>+4($gp) (BFD_RELOC_MIPS_GPREL)
3210 If we have a base register, we use this
3212 <op> $treg,<sym>($at) (BFD_RELOC_MIPS_GPREL)
3213 <op> $treg+1,<sym>+4($at) (BFD_RELOC_MIPS_GPREL)
3214 If this is not a GP relative symbol, we want
3215 lui $at,<sym> (BFD_RELOC_HI16_S)
3216 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
3217 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
3218 If there is a base register, we add it to $at after the
3219 lui instruction. If there is a constant, we always use
3221 if (offset_expr.X_add_number != 0)
3240 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
3241 mips_isa < 3 ? "addu" : "daddu",
3242 "d,v,t", AT, breg, GP);
3248 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
3249 coproc ? treg + 1 : treg,
3250 (int) BFD_RELOC_MIPS_GPREL, tempreg);
3251 offset_expr.X_add_number += 4;
3252 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
3253 coproc ? treg : treg + 1,
3254 (int) BFD_RELOC_MIPS_GPREL, tempreg);
3255 p = frag_var (rs_machine_dependent, 12 + off, 0,
3256 RELAX_ENCODE (8 + off, 12 + off, 0, 4 + off, 1,
3257 used_at && mips_noat),
3258 offset_expr.X_add_symbol, (long) 0,
3261 /* We just generated two relocs. When tc_gen_reloc
3262 handles this case, it will skip the first reloc and
3263 handle the second. The second reloc already has an
3264 extra addend of 4, which we added above. We must
3265 subtract it out, and then subtract another 4 to make
3266 the first reloc come out right. The second reloc
3267 will come out right because we are going to add 4 to
3268 offset_expr when we build its instruction below. */
3269 offset_expr.X_add_number -= 8;
3270 offset_expr.X_op = O_constant;
3272 macro_build_lui (p, &icnt, &offset_expr, AT);
3277 macro_build (p, &icnt, (expressionS *) NULL,
3278 mips_isa < 3 ? "addu" : "daddu",
3279 "d,v,t", AT, breg, AT);
3283 macro_build (p, &icnt, &offset_expr, s, fmt,
3284 coproc ? treg + 1 : treg,
3285 (int) BFD_RELOC_LO16, AT);
3288 /* FIXME: How do we handle overflow here? */
3289 offset_expr.X_add_number += 4;
3290 macro_build (p, &icnt, &offset_expr, s, fmt,
3291 coproc ? treg : treg + 1,
3292 (int) BFD_RELOC_LO16, AT);
3294 else if (mips_pic == SVR4_PIC)
3298 /* If this is a reference to an external symbol, we want
3299 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
3304 lw $at,<sym>($gp) (BFD_RELOC_MIPS_GOT16)
3306 <op> $treg,<sym>($at) (BFD_RELOC_LO16)
3307 <op> $treg+1,<sym>+4($at) (BFD_RELOC_LO16)
3308 If there is a base register we add it to $at before the
3309 lwc1 instructions. If there is a constant we include it
3310 in the lwc1 instructions. */
3312 expr1.X_add_number = offset_expr.X_add_number;
3313 offset_expr.X_add_number = 0;
3314 if (expr1.X_add_number < -0x8000
3315 || expr1.X_add_number >= 0x8000 - 4)
3316 as_bad ("PIC code offset overflow (max 16 signed bits)");
3321 frag_grow (24 + off);
3322 macro_build ((char *) NULL, &icnt, &offset_expr,
3323 mips_isa < 3 ? "lw" : "ld",
3324 "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16, GP);
3325 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
3327 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
3328 mips_isa < 3 ? "addu" : "daddu",
3329 "d,v,t", AT, breg, AT);
3330 macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
3331 coproc ? treg + 1 : treg,
3332 (int) BFD_RELOC_LO16, AT);
3333 expr1.X_add_number += 4;
3334 macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
3335 coproc ? treg : treg + 1,
3336 (int) BFD_RELOC_LO16, AT);
3337 (void) frag_var (rs_machine_dependent, 0, 0,
3338 RELAX_ENCODE (0, 0, -16 - off, -8, 1, 0),
3339 offset_expr.X_add_symbol, (long) 0,
3342 else if (mips_pic == EMBEDDED_PIC)
3344 /* If there is no base register, we use
3345 <op> $treg,<sym>($gp) (BFD_RELOC_MIPS_GPREL)
3346 <op> $treg+1,<sym>+4($gp) (BFD_RELOC_MIPS_GPREL)
3347 If we have a base register, we use
3349 <op> $treg,<sym>($at) (BFD_RELOC_MIPS_GPREL)
3350 <op> $treg+1,<sym>+4($at) (BFD_RELOC_MIPS_GPREL)
3359 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
3360 mips_isa < 3 ? "addu" : "daddu",
3361 "d,v,t", AT, breg, GP);
3366 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
3367 coproc ? treg + 1 : treg,
3368 (int) BFD_RELOC_MIPS_GPREL, tempreg);
3369 offset_expr.X_add_number += 4;
3370 macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
3371 coproc ? treg : treg + 1,
3372 (int) BFD_RELOC_MIPS_GPREL, tempreg);
3388 assert (mips_isa < 3);
3389 macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg,
3390 (int) BFD_RELOC_LO16, breg);
3391 offset_expr.X_add_number += 4;
3392 macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg + 1,
3393 (int) BFD_RELOC_LO16, breg);
3395 #ifdef LOSING_COMPILER
3401 as_warn ("Macro used $at after \".set noat\"");
3406 struct mips_cl_insn *ip;
3408 register int treg, sreg, dreg, breg;
3421 bfd_reloc_code_real_type r;
3424 treg = (ip->insn_opcode >> 16) & 0x1f;
3425 dreg = (ip->insn_opcode >> 11) & 0x1f;
3426 sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
3427 mask = ip->insn_mo->mask;
3429 expr1.X_op = O_constant;
3430 expr1.X_op_symbol = NULL;
3431 expr1.X_add_symbol = NULL;
3432 expr1.X_add_number = 1;
3436 #endif /* LOSING_COMPILER */
3441 macro_build ((char *) NULL, &icnt, NULL,
3442 dbl ? "dmultu" : "multu",
3444 macro_build ((char *) NULL, &icnt, NULL, "mflo", "d", dreg);
3450 /* The MIPS assembler some times generates shifts and adds. I'm
3451 not trying to be that fancy. GCC should do this for us
3453 load_register (&icnt, AT, &imm_expr);
3454 macro_build ((char *) NULL, &icnt, NULL,
3455 dbl ? "dmult" : "mult",
3457 macro_build ((char *) NULL, &icnt, NULL, "mflo", "d", dreg);
3463 mips_emit_delays ();
3465 mips_any_noreorder = 1;
3466 macro_build ((char *) NULL, &icnt, NULL,
3467 dbl ? "dmult" : "mult",
3469 macro_build ((char *) NULL, &icnt, NULL, "mflo", "d", dreg);
3470 macro_build ((char *) NULL, &icnt, NULL,
3471 dbl ? "dsra32" : "sra",
3472 "d,w,<", dreg, dreg, 31);
3473 macro_build ((char *) NULL, &icnt, NULL, "mfhi", "d", AT);
3475 macro_build ((char *) NULL, &icnt, NULL, "tne", "s,t", dreg, AT);
3478 expr1.X_add_number = 8;
3479 macro_build ((char *) NULL, &icnt, &expr1, "beq", "s,t,p", dreg, AT);
3480 macro_build ((char *) NULL, &icnt, NULL, "nop", "", 0);
3481 macro_build ((char *) NULL, &icnt, NULL, "break", "c", 6);
3484 macro_build ((char *) NULL, &icnt, NULL, "mflo", "d", dreg);
3490 mips_emit_delays ();
3492 mips_any_noreorder = 1;
3493 macro_build ((char *) NULL, &icnt, NULL,
3494 dbl ? "dmultu" : "multu",
3496 macro_build ((char *) NULL, &icnt, NULL, "mfhi", "d", AT);
3497 macro_build ((char *) NULL, &icnt, NULL, "mflo", "d", dreg);
3499 macro_build ((char *) NULL, &icnt, NULL, "tne", "s,t", AT, 0);
3502 expr1.X_add_number = 8;
3503 macro_build ((char *) NULL, &icnt, &expr1, "beq", "s,t,p", AT, 0);
3504 macro_build ((char *) NULL, &icnt, NULL, "nop", "", 0);
3505 macro_build ((char *) NULL, &icnt, NULL, "break", "c", 6);
3511 macro_build ((char *) NULL, &icnt, NULL, "subu", "d,v,t", AT, 0, treg);
3512 macro_build ((char *) NULL, &icnt, NULL, "srlv", "d,t,s", AT, sreg, AT);
3513 macro_build ((char *) NULL, &icnt, NULL, "sllv", "d,t,s", dreg, sreg,
3515 macro_build ((char *) NULL, &icnt, NULL, "or", "d,v,t", dreg, dreg, AT);
3519 macro_build ((char *) NULL, &icnt, NULL, "sll", "d,w,<", AT, sreg,
3520 imm_expr.X_add_number & 0x1f);
3521 macro_build ((char *) NULL, &icnt, NULL, "srl", "d,w,<", dreg, sreg,
3522 (0 - imm_expr.X_add_number) & 0x1f);
3523 macro_build ((char *) NULL, &icnt, NULL, "or", "d,v,t", dreg, dreg, AT);
3527 macro_build ((char *) NULL, &icnt, NULL, "subu", "d,v,t", AT, 0, treg);
3528 macro_build ((char *) NULL, &icnt, NULL, "sllv", "d,t,s", AT, sreg, AT);
3529 macro_build ((char *) NULL, &icnt, NULL, "srlv", "d,t,s", dreg, sreg,
3531 macro_build ((char *) NULL, &icnt, NULL, "or", "d,v,t", dreg, dreg, AT);
3535 macro_build ((char *) NULL, &icnt, NULL, "srl", "d,w,<", AT, sreg,
3536 imm_expr.X_add_number & 0x1f);
3537 macro_build ((char *) NULL, &icnt, NULL, "sll", "d,w,<", dreg, sreg,
3538 (0 - imm_expr.X_add_number) & 0x1f);
3539 macro_build ((char *) NULL, &icnt, NULL, "or", "d,v,t", dreg, dreg, AT);
3543 assert (mips_isa < 2);
3544 /* Even on a big endian machine $fn comes before $fn+1. We have
3545 to adjust when storing to memory. */
3546 macro_build ((char *) NULL, &icnt, &offset_expr, "swc1", "T,o(b)",
3547 byte_order == LITTLE_ENDIAN ? treg : treg + 1,
3548 (int) BFD_RELOC_LO16, breg);
3549 offset_expr.X_add_number += 4;
3550 macro_build ((char *) NULL, &icnt, &offset_expr, "swc1", "T,o(b)",
3551 byte_order == LITTLE_ENDIAN ? treg + 1 : treg,
3552 (int) BFD_RELOC_LO16, breg);
3557 macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
3558 treg, (int) BFD_RELOC_LO16);
3560 macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
3561 sreg, (int) BFD_RELOC_LO16);
3564 macro_build ((char *) NULL, &icnt, NULL, "xor", "d,v,t", dreg,
3566 macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
3567 dreg, (int) BFD_RELOC_LO16);
3572 if (imm_expr.X_add_number == 0)
3574 macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
3575 sreg, (int) BFD_RELOC_LO16);
3580 as_warn ("Instruction %s: result is always false",
3582 macro_build ((char *) NULL, &icnt, NULL, "move", "d,s", dreg, 0);
3585 if (imm_expr.X_add_number >= 0 && imm_expr.X_add_number < 0x10000)
3587 macro_build ((char *) NULL, &icnt, &imm_expr, "xori", "t,r,i", dreg,
3588 sreg, (int) BFD_RELOC_LO16);
3591 else if (imm_expr.X_add_number > -0x8000 && imm_expr.X_add_number < 0)
3593 imm_expr.X_add_number = -imm_expr.X_add_number;
3594 macro_build ((char *) NULL, &icnt, &imm_expr,
3595 mips_isa < 3 ? "addiu" : "daddiu",
3596 "t,r,j", dreg, sreg,
3597 (int) BFD_RELOC_LO16);
3602 load_register (&icnt, AT, &imm_expr);
3603 macro_build ((char *) NULL, &icnt, NULL, "xor", "d,v,t", dreg,
3607 macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg, dreg,
3608 (int) BFD_RELOC_LO16);
3613 case M_SGE: /* sreg >= treg <==> not (sreg < treg) */
3619 macro_build ((char *) NULL, &icnt, NULL, s, "d,v,t", dreg, sreg, treg);
3620 macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
3621 (int) BFD_RELOC_LO16);
3624 case M_SGE_I: /* sreg >= I <==> not (sreg < I) */
3626 if (imm_expr.X_add_number >= -0x8000 && imm_expr.X_add_number < 0x8000)
3628 macro_build ((char *) NULL, &icnt, &expr1,
3629 mask == M_SGE_I ? "slti" : "sltiu",
3630 "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
3635 load_register (&icnt, AT, &imm_expr);
3636 macro_build ((char *) NULL, &icnt, NULL,
3637 mask == M_SGE_I ? "slt" : "sltu",
3638 "d,v,t", dreg, sreg, AT);
3641 macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
3642 (int) BFD_RELOC_LO16);
3647 case M_SGT: /* sreg > treg <==> treg < sreg */
3653 macro_build ((char *) NULL, &icnt, NULL, s, "d,v,t", dreg, treg, sreg);
3656 case M_SGT_I: /* sreg > I <==> I < sreg */
3662 load_register (&icnt, AT, &imm_expr);
3663 macro_build ((char *) NULL, &icnt, NULL, s, "d,v,t", dreg, AT, sreg);
3666 case M_SLE: /* sreg <= treg <==> treg >= sreg <==> not (treg < sreg) */
3672 macro_build ((char *) NULL, &icnt, NULL, s, "d,v,t", dreg, treg, sreg);
3673 macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
3674 (int) BFD_RELOC_LO16);
3677 case M_SLE_I: /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
3683 load_register (&icnt, AT, &imm_expr);
3684 macro_build ((char *) NULL, &icnt, NULL, s, "d,v,t", dreg, AT, sreg);
3685 macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
3686 (int) BFD_RELOC_LO16);
3690 if (imm_expr.X_add_number >= -0x8000 && imm_expr.X_add_number < 0x8000)
3692 macro_build ((char *) NULL, &icnt, &imm_expr, "slti", "t,r,j",
3693 dreg, sreg, (int) BFD_RELOC_LO16);
3696 load_register (&icnt, AT, &imm_expr);
3697 macro_build ((char *) NULL, &icnt, NULL, "slt", "d,v,t", dreg, sreg, AT);
3701 if (imm_expr.X_add_number >= -0x8000 && imm_expr.X_add_number < 0x8000)
3703 macro_build ((char *) NULL, &icnt, &imm_expr, "sltiu", "t,r,j",
3704 dreg, sreg, (int) BFD_RELOC_LO16);
3707 load_register (&icnt, AT, &imm_expr);
3708 macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", dreg, sreg,
3714 macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", dreg, 0,
3717 macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", dreg, 0,
3721 macro_build ((char *) NULL, &icnt, NULL, "xor", "d,v,t", dreg,
3723 macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", dreg, 0,
3729 if (imm_expr.X_add_number == 0)
3731 macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", dreg, 0,
3737 as_warn ("Instruction %s: result is always true",
3739 macro_build ((char *) NULL, &icnt, &expr1,
3740 mips_isa < 3 ? "addiu" : "daddiu",
3741 "t,r,j", dreg, 0, (int) BFD_RELOC_LO16);
3744 if (imm_expr.X_add_number >= 0 && imm_expr.X_add_number < 0x10000)
3746 macro_build ((char *) NULL, &icnt, &imm_expr, "xori", "t,r,i",
3747 dreg, sreg, (int) BFD_RELOC_LO16);
3750 else if (imm_expr.X_add_number > -0x8000 && imm_expr.X_add_number < 0)
3752 imm_expr.X_add_number = -imm_expr.X_add_number;
3753 macro_build ((char *) NULL, &icnt, &imm_expr,
3754 mips_isa < 3 ? "addiu" : "daddiu",
3755 "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
3760 load_register (&icnt, AT, &imm_expr);
3761 macro_build ((char *) NULL, &icnt, NULL, "xor", "d,v,t", dreg,
3765 macro_build ((char *) NULL, &icnt, NULL, "sltu", "d,v,t", dreg, 0, dreg);
3773 if (imm_expr.X_add_number > -0x8000 && imm_expr.X_add_number <= 0x8000)
3775 imm_expr.X_add_number = -imm_expr.X_add_number;
3776 macro_build ((char *) NULL, &icnt, &imm_expr,
3777 dbl ? "daddi" : "addi",
3778 "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
3781 load_register (&icnt, AT, &imm_expr);
3782 macro_build ((char *) NULL, &icnt, NULL,
3783 dbl ? "dsub" : "sub",
3784 "d,v,t", dreg, sreg, AT);
3790 if (imm_expr.X_add_number > -0x8000 && imm_expr.X_add_number <= 0x8000)
3792 imm_expr.X_add_number = -imm_expr.X_add_number;
3793 macro_build ((char *) NULL, &icnt, &imm_expr,
3794 dbl ? "daddiu" : "addiu",
3795 "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
3798 load_register (&icnt, AT, &imm_expr);
3799 macro_build ((char *) NULL, &icnt, NULL,
3800 dbl ? "dsubu" : "subu",
3801 "d,v,t", dreg, sreg, AT);
3822 load_register (&icnt, AT, &imm_expr);
3823 macro_build ((char *) NULL, &icnt, NULL, s, "s,t", sreg, AT);
3828 assert (mips_isa < 2);
3829 sreg = (ip->insn_opcode >> 11) & 0x1f; /* floating reg */
3830 dreg = (ip->insn_opcode >> 06) & 0x1f; /* floating reg */
3833 * Is the double cfc1 instruction a bug in the mips assembler;
3834 * or is there a reason for it?
3836 mips_emit_delays ();
3838 mips_any_noreorder = 1;
3839 macro_build ((char *) NULL, &icnt, NULL, "cfc1", "t,G", treg, 31);
3840 macro_build ((char *) NULL, &icnt, NULL, "cfc1", "t,G", treg, 31);
3841 macro_build ((char *) NULL, &icnt, NULL, "nop", "");
3842 expr1.X_add_number = 3;
3843 macro_build ((char *) NULL, &icnt, &expr1, "ori", "t,r,i", AT, treg,
3844 (int) BFD_RELOC_LO16);
3845 expr1.X_add_number = 2;
3846 macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", AT, AT,
3847 (int) BFD_RELOC_LO16);
3848 macro_build ((char *) NULL, &icnt, NULL, "ctc1", "t,G", AT, 31);
3849 macro_build ((char *) NULL, &icnt, NULL, "nop", "");
3850 macro_build ((char *) NULL, &icnt, NULL,
3851 mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S", dreg, sreg);
3852 macro_build ((char *) NULL, &icnt, NULL, "ctc1", "t,G", treg, 31);
3853 macro_build ((char *) NULL, &icnt, NULL, "nop", "");
3863 if (offset_expr.X_add_number >= 0x7fff)
3864 as_bad ("operand overflow");
3865 /* avoid load delay */
3866 if (byte_order == LITTLE_ENDIAN)
3867 offset_expr.X_add_number += 1;
3868 macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg,
3869 (int) BFD_RELOC_LO16, breg);
3870 if (byte_order == LITTLE_ENDIAN)
3871 offset_expr.X_add_number -= 1;
3873 offset_expr.X_add_number += 1;
3874 macro_build ((char *) NULL, &icnt, &offset_expr, "lbu", "t,o(b)", AT,
3875 (int) BFD_RELOC_LO16, breg);
3876 macro_build ((char *) NULL, &icnt, NULL, "sll", "d,w,<", treg, treg, 8);
3877 macro_build ((char *) NULL, &icnt, NULL, "or", "d,v,t", treg, treg, AT);
3881 if (offset_expr.X_add_number >= 0x7ffd)
3882 as_bad ("operand overflow");
3883 if (byte_order == LITTLE_ENDIAN)
3884 offset_expr.X_add_number += 3;
3885 macro_build ((char *) NULL, &icnt, &offset_expr, "lwl", "t,o(b)", treg,
3886 (int) BFD_RELOC_LO16, breg);
3887 if (byte_order == LITTLE_ENDIAN)
3888 offset_expr.X_add_number -= 3;
3890 offset_expr.X_add_number += 3;
3891 macro_build ((char *) NULL, &icnt, &offset_expr, "lwr", "t,o(b)", treg,
3892 (int) BFD_RELOC_LO16, breg);
3898 load_address (&icnt, AT, &offset_expr);
3899 if (mask == M_ULW_A)
3901 if (byte_order == LITTLE_ENDIAN)
3902 expr1.X_add_number = 3;
3904 expr1.X_add_number = 0;
3905 macro_build ((char *) NULL, &icnt, &expr1, "lwl", "t,o(b)", treg,
3906 (int) BFD_RELOC_LO16, AT);
3907 if (byte_order == LITTLE_ENDIAN)
3908 expr1.X_add_number = 0;
3910 expr1.X_add_number = 3;
3911 macro_build ((char *) NULL, &icnt, &expr1, "lwr", "t,o(b)", treg,
3912 (int) BFD_RELOC_LO16, AT);
3916 if (byte_order == BIG_ENDIAN)
3917 expr1.X_add_number = 0;
3918 macro_build ((char *) NULL, &icnt, &expr1,
3919 mask == M_ULH_A ? "lb" : "lbu", "t,o(b)", treg,
3920 (int) BFD_RELOC_LO16, AT);
3921 if (byte_order == BIG_ENDIAN)
3922 expr1.X_add_number = 1;
3924 expr1.X_add_number = 0;
3925 macro_build ((char *) NULL, &icnt, &expr1, "lbu", "t,o(b)", AT,
3926 (int) BFD_RELOC_LO16, AT);
3927 macro_build ((char *) NULL, &icnt, NULL, "sll", "d,w,<", treg,
3929 macro_build ((char *) NULL, &icnt, NULL, "or", "d,v,t", treg,
3935 if (offset_expr.X_add_number >= 0x7fff)
3936 as_bad ("operand overflow");
3937 if (byte_order == BIG_ENDIAN)
3938 offset_expr.X_add_number += 1;
3939 macro_build ((char *) NULL, &icnt, &offset_expr, "sb", "t,o(b)", treg,
3940 (int) BFD_RELOC_LO16, breg);
3941 macro_build ((char *) NULL, &icnt, NULL, "srl", "d,w,<", AT, treg, 8);
3942 if (byte_order == BIG_ENDIAN)
3943 offset_expr.X_add_number -= 1;
3945 offset_expr.X_add_number += 1;
3946 macro_build ((char *) NULL, &icnt, &offset_expr, "sb", "t,o(b)", AT,
3947 (int) BFD_RELOC_LO16, breg);
3951 if (offset_expr.X_add_number >= 0x7ffd)
3952 as_bad ("operand overflow");
3953 if (byte_order == LITTLE_ENDIAN)
3954 offset_expr.X_add_number += 3;
3955 macro_build ((char *) NULL, &icnt, &offset_expr, "swl", "t,o(b)", treg,
3956 (int) BFD_RELOC_LO16, breg);
3957 if (byte_order == LITTLE_ENDIAN)
3958 offset_expr.X_add_number -= 3;
3960 offset_expr.X_add_number += 3;
3961 macro_build ((char *) NULL, &icnt, &offset_expr, "swr", "t,o(b)", treg,
3962 (int) BFD_RELOC_LO16, breg);
3967 load_address (&icnt, AT, &offset_expr);
3968 if (mask == M_USW_A)
3970 if (byte_order == LITTLE_ENDIAN)
3971 expr1.X_add_number = 3;
3973 expr1.X_add_number = 0;
3974 macro_build ((char *) NULL, &icnt, &expr1, "swl", "t,o(b)", treg,
3975 (int) BFD_RELOC_LO16, AT);
3976 if (byte_order == LITTLE_ENDIAN)
3977 expr1.X_add_number = 0;
3979 expr1.X_add_number = 3;
3980 macro_build ((char *) NULL, &icnt, &expr1, "swr", "t,o(b)", treg,
3981 (int) BFD_RELOC_LO16, AT);
3985 if (byte_order == LITTLE_ENDIAN)
3986 expr1.X_add_number = 0;
3987 macro_build ((char *) NULL, &icnt, &expr1, "sb", "t,o(b)", treg,
3988 (int) BFD_RELOC_LO16, AT);
3989 macro_build ((char *) NULL, &icnt, NULL, "srl", "d,w,<", treg,
3991 if (byte_order == LITTLE_ENDIAN)
3992 expr1.X_add_number = 1;
3994 expr1.X_add_number = 0;
3995 macro_build ((char *) NULL, &icnt, &expr1, "sb", "t,o(b)", treg,
3996 (int) BFD_RELOC_LO16, AT);
3997 if (byte_order == LITTLE_ENDIAN)
3998 expr1.X_add_number = 0;
4000 expr1.X_add_number = 1;
4001 macro_build ((char *) NULL, &icnt, &expr1, "lbu", "t,o(b)", AT,
4002 (int) BFD_RELOC_LO16, AT);
4003 macro_build ((char *) NULL, &icnt, NULL, "sll", "d,w,<", treg,
4005 macro_build ((char *) NULL, &icnt, NULL, "or", "d,v,t", treg,
4011 as_bad ("Macro %s not implemented yet", ip->insn_mo->name);
4015 as_warn ("Macro used $at after \".set noat\"");
4020 This routine assembles an instruction into its binary format. As a side
4021 effect it sets one of the global variables imm_reloc or offset_reloc to the
4022 type of relocation to do if one of the operands is an address expression.
4027 struct mips_cl_insn *ip;
4032 struct mips_opcode *insn;
4035 unsigned int lastregno = 0;
4040 for (s = str; islower (*s) || (*s >= '0' && *s <= '3') || *s == '.'; ++s)
4052 as_warn ("Unknown opcode: `%s'", str);
4055 if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
4057 as_warn ("`%s' not in hash table.", str);
4058 insn_error = "ERROR: Unrecognized opcode";
4066 assert (strcmp (insn->name, str) == 0);
4068 if (insn->pinfo == INSN_MACRO)
4069 insn_isa = insn->match;
4070 else if (insn->pinfo & INSN_ISA2)
4072 else if (insn->pinfo & INSN_ISA3)
4077 if (insn_isa > mips_isa)
4079 if (insn + 1 < &mips_opcodes[NUMOPCODES]
4080 && strcmp (insn->name, insn[1].name) == 0)
4085 as_warn ("Instruction not supported on this processor");
4089 ip->insn_opcode = insn->match;
4090 for (args = insn->args;; ++args)
4096 case '\0': /* end of args */
4109 ip->insn_opcode |= lastregno << 21;
4114 ip->insn_opcode |= lastregno << 16;
4118 ip->insn_opcode |= lastregno << 11;
4124 /* handle optional base register.
4125 Either the base register is omitted or
4126 we must have a left paren. */
4127 /* this is dependent on the next operand specifier
4128 is a 'b' for base register */
4129 assert (args[1] == 'b');
4133 case ')': /* these must match exactly */
4138 case '<': /* must be at least one digit */
4140 * According to the manual, if the shift amount is greater
4141 * than 31 or less than 0 the the shift amount should be
4142 * mod 32. In reality the mips assembler issues an error.
4143 * We issue a warning and mask out all but the low 5 bits.
4145 my_getExpression (&imm_expr, s);
4146 check_absolute_expr (ip, &imm_expr);
4147 if ((unsigned long) imm_expr.X_add_number > 31)
4149 as_warn ("Improper shift amount (%ld)",
4150 (long) imm_expr.X_add_number);
4151 imm_expr.X_add_number = imm_expr.X_add_number & 0x1f;
4153 ip->insn_opcode |= imm_expr.X_add_number << 6;
4154 imm_expr.X_op = O_absent;
4158 case '>': /* shift amount minus 32 */
4159 my_getExpression (&imm_expr, s);
4160 check_absolute_expr (ip, &imm_expr);
4161 if ((unsigned long) imm_expr.X_add_number < 32
4162 || (unsigned long) imm_expr.X_add_number > 63)
4164 ip->insn_opcode |= (imm_expr.X_add_number - 32) << 6;
4165 imm_expr.X_op = O_absent;
4169 case 'k': /* cache code */
4170 my_getExpression (&imm_expr, s);
4171 check_absolute_expr (ip, &imm_expr);
4172 if ((unsigned long) imm_expr.X_add_number > 31)
4174 as_warn ("Invalid cahce opcode (%lu)",
4175 (unsigned long) imm_expr.X_add_number);
4176 imm_expr.X_add_number &= 0x1f;
4178 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CACHE;
4179 imm_expr.X_op = O_absent;
4183 case 'c': /* break code */
4184 my_getExpression (&imm_expr, s);
4185 check_absolute_expr (ip, &imm_expr);
4186 if ((unsigned) imm_expr.X_add_number > 1023)
4187 as_warn ("Illegal break code (%ld)",
4188 (long) imm_expr.X_add_number);
4189 ip->insn_opcode |= imm_expr.X_add_number << 16;
4190 imm_expr.X_op = O_absent;
4194 case 'B': /* syscall code */
4195 my_getExpression (&imm_expr, s);
4196 check_absolute_expr (ip, &imm_expr);
4197 if ((unsigned) imm_expr.X_add_number > 0xfffff)
4198 as_warn ("Illegal syscall code (%ld)",
4199 (long) imm_expr.X_add_number);
4200 ip->insn_opcode |= imm_expr.X_add_number << 6;
4201 imm_expr.X_op = O_absent;
4205 case 'C': /* Coprocessor code */
4206 my_getExpression (&imm_expr, s);
4207 check_absolute_expr (ip, &imm_expr);
4208 if ((unsigned long) imm_expr.X_add_number >= (1<<25))
4210 as_warn ("Coproccesor code > 25 bits (%ld)",
4211 (long) imm_expr.X_add_number);
4212 imm_expr.X_add_number &= ((1<<25) - 1);
4214 ip->insn_opcode |= imm_expr.X_add_number;
4215 imm_expr.X_op = O_absent;
4219 case 'b': /* base register */
4220 case 'd': /* destination register */
4221 case 's': /* source register */
4222 case 't': /* target register */
4223 case 'r': /* both target and source */
4224 case 'v': /* both dest and source */
4225 case 'w': /* both dest and target */
4226 case 'E': /* coprocessor target register */
4227 case 'G': /* coprocessor destination register */
4228 case 'x': /* ignore register name */
4229 case 'z': /* must be zero register */
4243 while (isdigit (*s));
4245 as_bad ("Invalid register number (%d)", regno);
4247 else if (*args == 'E' || *args == 'G')
4251 if (s[1] == 'f' && s[2] == 'p')
4256 else if (s[1] == 's' && s[2] == 'p')
4261 else if (s[1] == 'g' && s[2] == 'p')
4266 else if (s[1] == 'a' && s[2] == 't')
4274 if (regno == AT && ! mips_noat)
4275 as_warn ("Used $at without \".set noat\"");
4281 if (c == 'r' || c == 'v' || c == 'w')
4288 /* 'z' only matches $0. */
4289 if (c == 'z' && regno != 0)
4297 ip->insn_opcode |= regno << 21;
4301 ip->insn_opcode |= regno << 11;
4306 ip->insn_opcode |= regno << 16;
4309 /* This case exists because on the r3000 trunc
4310 expands into a macro which requires a gp
4311 register. On the r6000 or r4000 it is
4312 assembled into a single instruction which
4313 ignores the register. Thus the insn version
4314 is MIPS_ISA2 and uses 'x', and the macro
4315 version is MIPS_ISA1 and uses 't'. */
4318 /* This case is for the div instruction, which
4319 acts differently if the destination argument
4320 is $0. This only matches $0, and is checked
4321 outside the switch. */
4332 ip->insn_opcode |= lastregno << 21;
4335 ip->insn_opcode |= lastregno << 16;
4340 case 'D': /* floating point destination register */
4341 case 'S': /* floating point source register */
4342 case 'T': /* floating point target register */
4346 if (s[0] == '$' && s[1] == 'f' && isdigit (s[2]))
4356 while (isdigit (*s));
4359 as_bad ("Invalid float register number (%d)", regno);
4361 if ((regno & 1) != 0
4363 && ! (strcmp (str, "mtc1") == 0 ||
4364 strcmp (str, "mfc1") == 0 ||
4365 strcmp (str, "lwc1") == 0 ||
4366 strcmp (str, "swc1") == 0))
4367 as_warn ("Float register should be even, was %d",
4375 if (c == 'V' || c == 'W')
4385 ip->insn_opcode |= regno << 6;
4389 ip->insn_opcode |= regno << 11;
4393 ip->insn_opcode |= regno << 16;
4401 ip->insn_opcode |= lastregno << 11;
4404 ip->insn_opcode |= lastregno << 16;
4410 my_getExpression (&imm_expr, s);
4411 check_absolute_expr (ip, &imm_expr);
4416 my_getExpression (&offset_expr, s);
4417 imm_reloc = BFD_RELOC_32;
4429 unsigned char temp[8];
4431 unsigned int length;
4436 /* These only appear as the last operand in an
4437 instruction, and every instruction that accepts
4438 them in any variant accepts them in all variants.
4439 This means we don't have to worry about backing out
4440 any changes if the instruction does not match.
4442 The difference between them is the size of the
4443 floating point constant and where it goes. For 'F'
4444 and 'L' the constant is 64 bits; for 'f' and 'l' it
4445 is 32 bits. Where the constant is placed is based
4446 on how the MIPS assembler does things:
4449 f -- immediate value
4452 When generating SVR4 PIC code, we do not use the
4453 .lit8 or .lit4 sections at all, in order to
4454 reserve the entire global offset table. When
4455 generating embedded PIC code, we use the .lit8
4456 section but not the .lit4 section (we can do .lit4
4457 inline easily; we need to put .lit8 somewhere in
4458 the data segment, and using .lit8 permits the
4459 linker to eventually combine identical .lit8
4462 f64 = *args == 'F' || *args == 'L';
4464 save_in = input_line_pointer;
4465 input_line_pointer = s;
4466 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
4468 s = input_line_pointer;
4469 input_line_pointer = save_in;
4470 if (err != NULL && *err != '\0')
4472 as_bad ("Bad floating point constant: %s", err);
4473 memset (temp, '\0', sizeof temp);
4474 length = f64 ? 8 : 4;
4477 assert (length == (f64 ? 8 : 4));
4480 || (mips_pic != NO_PIC && *args == 'l'))
4482 imm_expr.X_op = O_constant;
4483 if (byte_order == LITTLE_ENDIAN)
4484 imm_expr.X_add_number =
4485 (((((((int) temp[3] << 8)
4490 imm_expr.X_add_number =
4491 (((((((int) temp[0] << 8)
4498 const char *newname;
4501 /* Switch to the right section. */
4503 subseg = now_subseg;
4506 default: /* unused default case avoids warnings. */
4508 newname = (mips_pic != SVR4_PIC
4510 : RDATA_SECTION_NAME);
4513 newname = RDATA_SECTION_NAME;
4516 assert (mips_pic == NO_PIC);
4520 new_seg = subseg_new (newname, (subsegT) 0);
4521 frag_align (*args == 'l' ? 2 : 3, 0);
4523 record_alignment (new_seg, 4);
4525 record_alignment (new_seg, *args == 'l' ? 2 : 3);
4528 as_bad ("Can't use floating point insn in this section");
4530 /* Set the argument to the current address in the
4532 offset_expr.X_op = O_symbol;
4533 offset_expr.X_add_symbol =
4534 symbol_new ("L0\001", now_seg,
4535 (valueT) frag_now_fix (), frag_now);
4536 offset_expr.X_add_number = 0;
4538 /* Put the floating point number into the section. */
4539 p = frag_more ((int) length);
4540 memcpy (p, temp, length);
4542 /* Switch back to the original section. */
4543 subseg_set (seg, subseg);
4548 case 'i': /* 16 bit unsigned immediate */
4549 case 'j': /* 16 bit signed immediate */
4550 imm_reloc = BFD_RELOC_LO16;
4551 c = my_getSmallExpression (&imm_expr, s);
4556 if (imm_expr.X_op == O_constant)
4557 imm_expr.X_add_number =
4558 (imm_expr.X_add_number >> 16) & 0xffff;
4560 imm_reloc = BFD_RELOC_HI16_S;
4562 imm_reloc = BFD_RELOC_HI16;
4566 check_absolute_expr (ip, &imm_expr);
4569 if (imm_expr.X_add_number < 0
4570 || imm_expr.X_add_number >= 0x10000)
4572 if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
4573 !strcmp (insn->name, insn[1].name))
4575 as_bad ("16 bit expression not in range 0..65535");
4583 /* The upper bound should be 0x8000, but
4584 unfortunately the MIPS assembler accepts numbers
4585 from 0x8000 to 0xffff and sign extends them, and
4586 we want to be compatible. We only permit this
4587 extended range for an instruction which does not
4588 provide any further alternates, since those
4589 alternates may handle other cases. People should
4590 use the numbers they mean, rather than relying on
4591 a mysterious sign extension. */
4592 more = (insn + 1 < &mips_opcodes[NUMOPCODES] &&
4593 strcmp (insn->name, insn[1].name) == 0);
4598 if (imm_expr.X_add_number < -0x8000 ||
4599 imm_expr.X_add_number >= max)
4603 as_bad ("16 bit expression not in range -32768..32767");
4609 case 'o': /* 16 bit offset */
4610 c = my_getSmallExpression (&offset_expr, s);
4612 /* If this value won't fit into a 16 bit offset, then go
4613 find a macro that will generate the 32 bit offset
4614 code pattern. As a special hack, we accept the
4615 difference of two local symbols as a constant. This
4616 is required to suppose embedded PIC switches, which
4617 use an instruction which looks like
4618 lw $4,$L12-$LS12($4)
4619 The problem with handling this in a more general
4620 fashion is that the macro function doesn't expect to
4621 see anything which can be handled in a single
4622 constant instruction. */
4624 && (offset_expr.X_op != O_constant
4625 || offset_expr.X_add_number >= 0x8000
4626 || offset_expr.X_add_number < -0x8000)
4627 && (mips_pic != EMBEDDED_PIC
4628 || offset_expr.X_op != O_subtract
4629 || ! S_IS_LOCAL (offset_expr.X_add_symbol)
4630 || ! S_IS_LOCAL (offset_expr.X_op_symbol)))
4633 offset_reloc = BFD_RELOC_LO16;
4634 if (c == 'h' || c == 'H')
4636 assert (offset_expr.X_op == O_constant);
4637 offset_expr.X_add_number =
4638 (offset_expr.X_add_number >> 16) & 0xffff;
4643 case 'p': /* pc relative offset */
4644 offset_reloc = BFD_RELOC_16_PCREL_S2;
4645 my_getExpression (&offset_expr, s);
4649 case 'u': /* upper 16 bits */
4650 c = my_getSmallExpression (&imm_expr, s);
4651 if (imm_expr.X_op == O_constant
4652 && (imm_expr.X_add_number < 0
4653 || imm_expr.X_add_number >= 0x10000))
4654 as_bad ("lui expression not in range 0..65535");
4655 imm_reloc = BFD_RELOC_LO16;
4660 if (imm_expr.X_op == O_constant)
4661 imm_expr.X_add_number =
4662 (imm_expr.X_add_number >> 16) & 0xffff;
4664 imm_reloc = BFD_RELOC_HI16_S;
4666 imm_reloc = BFD_RELOC_HI16;
4672 case 'a': /* 26 bit address */
4673 my_getExpression (&offset_expr, s);
4675 offset_reloc = BFD_RELOC_MIPS_JMP;
4679 fprintf (stderr, "bad char = '%c'\n", *args);
4684 /* Args don't match. */
4685 if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
4686 !strcmp (insn->name, insn[1].name))
4692 insn_error = "ERROR: Illegal operands";
4701 my_getSmallExpression (ep, str)
4712 ((str[1] == 'h' && str[2] == 'i')
4713 || (str[1] == 'H' && str[2] == 'I')
4714 || (str[1] == 'l' && str[2] == 'o'))
4726 * A small expression may be followed by a base register.
4727 * Scan to the end of this operand, and then back over a possible
4728 * base register. Then scan the small expression up to that
4729 * point. (Based on code in sparc.c...)
4731 for (sp = str; *sp && *sp != ','; sp++)
4733 if (sp - 4 >= str && sp[-1] == RP)
4735 if (isdigit (sp[-2]))
4737 for (sp -= 3; sp >= str && isdigit (*sp); sp--)
4739 if (*sp == '$' && sp > str && sp[-1] == LP)
4745 else if (sp - 5 >= str
4748 && ((sp[-3] == 'f' && sp[-2] == 'p')
4749 || (sp[-3] == 's' && sp[-2] == 'p')
4750 || (sp[-3] == 'g' && sp[-2] == 'p')
4751 || (sp[-3] == 'a' && sp[-2] == 't')))
4757 /* no expression means zero offset */
4760 /* %xx(reg) is an error */
4761 ep->X_op = O_absent;
4766 ep->X_op = O_constant;
4769 ep->X_add_symbol = NULL;
4770 ep->X_op_symbol = NULL;
4771 ep->X_add_number = 0;
4776 my_getExpression (ep, str);
4783 my_getExpression (ep, str);
4784 return c; /* => %hi or %lo encountered */
4788 my_getExpression (ep, str)
4794 save_in = input_line_pointer;
4795 input_line_pointer = str;
4797 expr_end = input_line_pointer;
4798 input_line_pointer = save_in;
4801 /* Turn a string in input_line_pointer into a floating point constant
4802 of type type, and store the appropriate bytes in *litP. The number
4803 of LITTLENUMS emitted is stored in *sizeP . An error message is
4804 returned, or NULL on OK. */
4807 md_atof (type, litP, sizeP)
4813 LITTLENUM_TYPE words[4];
4829 return "bad call to md_atof";
4832 t = atof_ieee (input_line_pointer, type, words);
4834 input_line_pointer = t;
4838 if (byte_order == LITTLE_ENDIAN)
4840 for (i = prec - 1; i >= 0; i--)
4842 md_number_to_chars (litP, (valueT) words[i], 2);
4848 for (i = 0; i < prec; i++)
4850 md_number_to_chars (litP, (valueT) words[i], 2);
4859 md_number_to_chars (buf, val, n)
4867 number_to_chars_littleendian (buf, val, n);
4871 number_to_chars_bigendian (buf, val, n);
4880 CONST char *md_shortopts = "E:O::g::G:";
4882 CONST char *md_shortopts = "E:O::g::";
4884 struct option md_longopts[] = {
4885 #define OPTION_MIPS1 (OPTION_MD_BASE + 1)
4886 {"mips0", no_argument, NULL, OPTION_MIPS1},
4887 {"mips1", no_argument, NULL, OPTION_MIPS1},
4888 #define OPTION_MIPS2 (OPTION_MD_BASE + 2)
4889 {"mips2", no_argument, NULL, OPTION_MIPS2},
4890 #define OPTION_MIPS3 (OPTION_MD_BASE + 3)
4891 {"mips3", no_argument, NULL, OPTION_MIPS3},
4892 #define OPTION_MCPU (OPTION_MD_BASE + 4)
4893 {"mcpu", required_argument, NULL, OPTION_MCPU},
4894 #define OPTION_MEMBEDDED_PIC (OPTION_MD_BASE + 5)
4895 {"membedded-pic", no_argument, NULL, OPTION_MEMBEDDED_PIC},
4896 #define OPTION_TRAP (OPTION_MD_BASE + 8)
4897 {"trap", no_argument, NULL, OPTION_TRAP},
4898 {"no-break", no_argument, NULL, OPTION_TRAP},
4899 #define OPTION_BREAK (OPTION_MD_BASE + 9)
4900 {"break", no_argument, NULL, OPTION_BREAK},
4901 {"no-trap", no_argument, NULL, OPTION_BREAK},
4904 #define OPTION_CALL_SHARED (OPTION_MD_BASE + 6)
4905 {"KPIC", no_argument, NULL, OPTION_CALL_SHARED},
4906 {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
4907 #define OPTION_NON_SHARED (OPTION_MD_BASE + 7)
4908 {"non_shared", no_argument, NULL, OPTION_NON_SHARED},
4911 {NULL, no_argument, NULL, 0}
4913 size_t md_longopts_size = sizeof(md_longopts);
4916 md_parse_option (c, arg)
4932 byte_order = BIG_ENDIAN;
4933 else if (arg[1] == 'L')
4934 byte_order = LITTLE_ENDIAN;
4937 as_bad("invalid endianness -E%c", arg[1]);
4943 mips_target_format = "a.out-mips-big";
4945 mips_target_format = "a.out-mips-little";
4949 mips_target_format = "ecoff-bigmips";
4951 mips_target_format = "ecoff-littlemips";
4955 mips_target_format = "elf32-bigmips";
4957 mips_target_format = "elf32-littlemips";
4960 /* FIXME: This breaks -L -EL. */
4961 flag_keep_locals = 0;
4965 if (arg && arg[1] == '0')
4972 if (arg == NULL || arg[1] == '2')
4992 /* Identify the processor type */
4994 if (strcmp (p, "default") == 0
4995 || strcmp (p, "DEFAULT") == 0)
4999 if (*p == 'r' || *p == 'R')
5006 if (strcmp (p, "2000") == 0
5007 || strcmp (p, "2k") == 0
5008 || strcmp (p, "2K") == 0)
5013 if (strcmp (p, "3000") == 0
5014 || strcmp (p, "3k") == 0
5015 || strcmp (p, "3K") == 0)
5020 if (strcmp (p, "4000") == 0
5021 || strcmp (p, "4k") == 0
5022 || strcmp (p, "4K") == 0)
5027 if (strcmp (p, "6000") == 0
5028 || strcmp (p, "6k") == 0
5029 || strcmp (p, "6K") == 0)
5036 as_bad ("invalid architecture -mcpu=%s", arg);
5043 case OPTION_MEMBEDDED_PIC:
5044 mips_pic = EMBEDDED_PIC;
5048 as_bad ("-G may not be used with embedded PIC code");
5051 g_switch_value = 0x7fffffff;
5056 /* When generating ELF code, we permit -KPIC and -call_shared to
5057 select SVR4_PIC, and -non_shared to select no PIC. This is
5058 intended to be compatible with Irix 5. */
5059 case OPTION_CALL_SHARED:
5060 mips_pic = SVR4_PIC;
5061 if (g_switch_seen && g_switch_value != 0)
5063 as_bad ("-G may not be used with SVR4 PIC code");
5069 case OPTION_NON_SHARED:
5072 #endif /* OBJ_ELF */
5076 if (mips_pic == SVR4_PIC || mips_pic == EMBEDDED_PIC)
5078 as_bad ("-G may not be used with SVR4 or embedded PIC code");
5082 g_switch_value = atoi (arg);
5095 md_show_usage (stream)
5100 -membedded-pic generate embedded position independent code\n\
5101 -EB generate big endian output\n\
5102 -EL generate little endian output\n\
5103 -g, -g2 do not remove uneeded NOPs or swap branches\n\
5104 -G NUM allow referencing objects up to NUM bytes\n\
5105 implicitly with the gp register [default 8]\n");
5107 -mips1, -mcpu=r{2,3}000 generate code for r2000 and r3000\n\
5108 -mips2, -mcpu=r6000 generate code for r6000\n\
5109 -mips3, -mcpu=r4000 generate code for r4000\n\
5110 -O0 remove unneeded NOPs, do not swap branches\n\
5111 -O remove unneeded NOPs and swap branches\n\
5112 --trap, --no-break trap exception on div by 0 and mult overflow\n\
5113 --break, --no-trap break exception on div by 0 and mult overflow\n");
5116 -KPIC, -call_shared generate SVR4 position independent code\n\
5117 -non_shared do not generate position independent code\n");
5122 md_pcrel_from (fixP)
5126 if (fixP->fx_addsy != (symbolS *) NULL
5127 && ! S_IS_DEFINED (fixP->fx_addsy))
5129 /* This makes a branch to an undefined symbol be a branch to the
5130 current location. */
5135 /* return the address of the delay slot */
5136 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
5139 /* This is called by emit_expr via TC_CONS_FIX_NEW when creating a
5140 reloc for a cons. We could use the definition there, except that
5141 we want to handle 64 bit relocs specially. */
5144 cons_fix_new_mips (frag, where, nbytes, exp)
5147 unsigned int nbytes;
5150 /* If we are assembling in 32 bit mode, turn an 8 byte reloc into a
5152 FIXME: There is no way to select anything but 32 bit mode right
5156 if (byte_order == BIG_ENDIAN)
5161 if (nbytes != 2 && nbytes != 4)
5162 as_bad ("Unsupported reloc size %d", nbytes);
5164 fix_new_exp (frag_now, where, (int) nbytes, exp, 0,
5165 nbytes == 2 ? BFD_RELOC_16 : BFD_RELOC_32);
5168 /* When generating embedded PIC code we need to use a special
5169 relocation to represent the difference of two symbols in the .text
5170 section (switch tables use a difference of this sort). See
5171 include/coff/mips.h for details. This macro checks whether this
5172 fixup requires the special reloc. */
5173 #define SWITCH_TABLE(fixp) \
5174 ((fixp)->fx_r_type == BFD_RELOC_32 \
5175 && (fixp)->fx_addsy != NULL \
5176 && (fixp)->fx_subsy != NULL \
5177 && S_GET_SEGMENT ((fixp)->fx_addsy) == text_section \
5178 && S_GET_SEGMENT ((fixp)->fx_subsy) == text_section)
5180 /* When generating embedded PIC code we must keep all PC relative
5181 relocations, in case the linker has to relax a call. We also need
5182 to keep relocations for switch table entries. */
5186 mips_force_relocation (fixp)
5189 return (mips_pic == EMBEDDED_PIC
5191 || SWITCH_TABLE (fixp)
5192 || fixp->fx_r_type == BFD_RELOC_PCREL_HI16_S
5193 || fixp->fx_r_type == BFD_RELOC_PCREL_LO16));
5196 /* Apply a fixup to the object file. */
5199 md_apply_fix (fixP, valueP)
5206 assert (fixP->fx_size == 4);
5209 fixP->fx_addnumber = value; /* Remember value for tc_gen_reloc */
5211 if (fixP->fx_addsy == NULL && ! fixP->fx_pcrel)
5214 switch (fixP->fx_r_type)
5216 case BFD_RELOC_MIPS_JMP:
5217 case BFD_RELOC_HI16:
5218 case BFD_RELOC_HI16_S:
5219 case BFD_RELOC_MIPS_GPREL:
5220 case BFD_RELOC_MIPS_LITERAL:
5221 case BFD_RELOC_MIPS_CALL16:
5222 case BFD_RELOC_MIPS_GOT16:
5223 case BFD_RELOC_MIPS_GPREL32:
5225 as_bad ("Invalid PC relative reloc");
5226 /* Nothing needed to do. The value comes from the reloc entry */
5229 case BFD_RELOC_PCREL_HI16_S:
5230 /* The addend for this is tricky if it is internal, so we just
5231 do everything here rather than in bfd_perform_relocation. */
5232 if ((fixP->fx_addsy->bsym->flags & BSF_SECTION_SYM) == 0)
5234 /* For an external symbol adjust by the address to make it
5235 pcrel_offset. We use the address of the RELLO reloc
5236 which follows this one. */
5237 value += (fixP->fx_next->fx_frag->fr_address
5238 + fixP->fx_next->fx_where);
5243 buf = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where;
5244 if (byte_order == BIG_ENDIAN)
5246 md_number_to_chars (buf, value, 2);
5249 case BFD_RELOC_PCREL_LO16:
5250 /* The addend for this is tricky if it is internal, so we just
5251 do everything here rather than in bfd_perform_relocation. */
5252 if ((fixP->fx_addsy->bsym->flags & BSF_SECTION_SYM) == 0)
5253 value += fixP->fx_frag->fr_address + fixP->fx_where;
5254 buf = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where;
5255 if (byte_order == BIG_ENDIAN)
5257 md_number_to_chars (buf, value, 2);
5261 /* If we are deleting this reloc entry, we must fill in the
5262 value now. This can happen if we have a .word which is not
5263 resolved when it appears but is later defined. We also need
5264 to fill in the value if this is an embedded PIC switch table
5267 || (mips_pic == EMBEDDED_PIC && SWITCH_TABLE (fixP)))
5268 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5272 case BFD_RELOC_LO16:
5273 /* When handling an embedded PIC switch statement, we can wind
5274 up deleting a LO16 reloc. See the 'o' case in mips_ip. */
5277 if (value < -0x8000 || value > 0x7fff)
5278 as_bad_where (fixP->fx_file, fixP->fx_line,
5279 "relocation overflow");
5280 buf = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where;
5281 if (byte_order == BIG_ENDIAN)
5283 md_number_to_chars (buf, value, 2);
5287 case BFD_RELOC_16_PCREL_S2:
5289 * We need to save the bits in the instruction since fixup_segment()
5290 * might be deleting the relocation entry (i.e., a branch within
5291 * the current segment).
5294 as_warn ("Branch to odd address (%lx)", value);
5296 if ((value & ~0xFFFF) && (value & ~0xFFFF) != (-1 & ~0xFFFF))
5297 as_bad ("Relocation overflow");
5299 /* update old instruction data */
5300 buf = (unsigned char *) (fixP->fx_where + fixP->fx_frag->fr_literal);
5304 insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
5308 insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
5315 insn |= value & 0xFFFF;
5316 md_number_to_chars ((char *) buf, (valueT) insn, 4);
5331 const struct mips_opcode *p;
5332 int treg, sreg, dreg, shamt;
5337 for (i = 0; i < NUMOPCODES; ++i)
5339 p = &mips_opcodes[i];
5340 if (((oc & p->mask) == p->match) && (p->pinfo != INSN_MACRO))
5342 printf ("%08lx %s\t", oc, p->name);
5343 treg = (oc >> 16) & 0x1f;
5344 sreg = (oc >> 21) & 0x1f;
5345 dreg = (oc >> 11) & 0x1f;
5346 shamt = (oc >> 6) & 0x1f;
5348 for (args = p->args;; ++args)
5359 printf ("%c", *args);
5363 assert (treg == sreg);
5364 printf ("$%d,$%d", treg, sreg);
5369 printf ("$%d", dreg);
5374 printf ("$%d", treg);
5378 printf ("0x%x", treg);
5383 printf ("$%d", sreg);
5387 printf ("0x%08lx", oc & 0x1ffffff);
5399 printf ("$%d", shamt);
5410 printf ("%08lx UNDEFINED\n", oc);
5421 name = input_line_pointer;
5422 c = get_symbol_end ();
5423 p = (symbolS *) symbol_find_or_make (name);
5424 *input_line_pointer = c;
5428 /* Align the current frag to a given power of two. The MIPS assembler
5429 also automatically adjusts any preceding label. */
5432 mips_align (to, fill, label)
5437 mips_emit_delays ();
5438 frag_align (to, fill);
5439 record_alignment (now_seg, to);
5442 assert (S_GET_SEGMENT (label) == now_seg);
5443 label->sy_frag = frag_now;
5444 S_SET_VALUE (label, (valueT) frag_now_fix ());
5448 /* Align to a given power of two. .align 0 turns off the automatic
5449 alignment used by the data creating pseudo-ops. */
5456 register long temp_fill;
5457 long max_alignment = 15;
5461 o Note that the assembler pulls down any immediately preceeding label
5462 to the aligned address.
5463 o It's not documented but auto alignment is reinstated by
5464 a .align pseudo instruction.
5465 o Note also that after auto alignment is turned off the mips assembler
5466 issues an error on attempt to assemble an improperly aligned data item.
5471 temp = get_absolute_expression ();
5472 if (temp > max_alignment)
5473 as_bad ("Alignment too large: %d. assumed.", temp = max_alignment);
5476 as_warn ("Alignment negative: 0 assumed.");
5479 if (*input_line_pointer == ',')
5481 input_line_pointer++;
5482 temp_fill = get_absolute_expression ();
5489 mips_align (temp, (int) temp_fill, insn_label);
5496 demand_empty_rest_of_line ();
5499 /* Handle .ascii and .asciiz. This just calls stringer and forgets
5500 that there was a previous instruction. */
5503 s_stringer (append_zero)
5506 mips_emit_delays ();
5508 stringer (append_zero);
5519 /* When generating embedded PIC code, we only use the .text, .lit8,
5520 .sdata and .sbss sections. We change the .data and .rdata
5521 pseudo-ops to use .sdata. */
5522 if (mips_pic == EMBEDDED_PIC
5523 && (sec == 'd' || sec == 'r'))
5526 mips_emit_delays ();
5536 subseg_set (bss_section, (subsegT) get_absolute_expression ());
5537 demand_empty_rest_of_line ();
5541 seg = subseg_new (RDATA_SECTION_NAME,
5542 (subsegT) get_absolute_expression ());
5544 bfd_set_section_flags (stdoutput, seg,
5550 bfd_set_section_alignment (stdoutput, seg, 4);
5552 demand_empty_rest_of_line ();
5557 seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
5559 bfd_set_section_flags (stdoutput, seg,
5560 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
5561 bfd_set_section_alignment (stdoutput, seg, 4);
5563 demand_empty_rest_of_line ();
5565 #else /* ! defined (GPOPT) */
5566 as_bad ("Global pointers not supported; recompile -G 0");
5567 demand_empty_rest_of_line ();
5569 #endif /* ! defined (GPOPT) */
5582 mips_emit_delays ();
5583 if (log_size > 0 && auto_align)
5584 mips_align (log_size, 0, label);
5586 cons (1 << log_size);
5593 as_fatal ("Encountered `.err', aborting assembly");
5603 symbolP = get_symbol ();
5604 if (*input_line_pointer == ',')
5605 input_line_pointer++;
5606 size = get_absolute_expression ();
5607 S_SET_EXTERNAL (symbolP);
5609 #ifdef ECOFF_DEBUGGING
5610 symbolP->ecoff_extern_size = size;
5622 mips_emit_delays ();
5626 mips_align (3, 0, label);
5628 mips_align (2, 0, label);
5642 opt = input_line_pointer;
5643 c = get_symbol_end ();
5647 /* FIXME: What does this mean? */
5649 else if (strncmp (opt, "pic", 3) == 0)
5657 mips_pic = SVR4_PIC;
5659 as_bad (".option pic%d not supported", i);
5662 if (mips_pic == SVR4_PIC)
5664 if (g_switch_seen && g_switch_value != 0)
5665 as_warn ("-G may not be used with SVR4 PIC code");
5667 bfd_set_gp_size (stdoutput, 0);
5672 as_warn ("Unrecognized option \"%s\"", opt);
5674 *input_line_pointer = c;
5675 demand_empty_rest_of_line ();
5682 char *name = input_line_pointer, ch;
5684 while (!is_end_of_line[(unsigned char) *input_line_pointer])
5685 input_line_pointer++;
5686 ch = *input_line_pointer;
5687 *input_line_pointer = '\0';
5689 if (strcmp (name, "reorder") == 0)
5693 prev_insn_unreordered = 1;
5694 prev_prev_insn_unreordered = 1;
5698 else if (strcmp (name, "noreorder") == 0)
5700 mips_emit_delays ();
5702 mips_any_noreorder = 1;
5704 else if (strcmp (name, "at") == 0)
5708 else if (strcmp (name, "noat") == 0)
5712 else if (strcmp (name, "macro") == 0)
5714 mips_warn_about_macros = 0;
5716 else if (strcmp (name, "nomacro") == 0)
5718 if (mips_noreorder == 0)
5719 as_bad ("`noreorder' must be set before `nomacro'");
5720 mips_warn_about_macros = 1;
5722 else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
5726 else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
5730 else if (strcmp (name, "bopt") == 0)
5734 else if (strcmp (name, "nobopt") == 0)
5738 else if (strncmp (name, "mips", 4) == 0)
5742 /* Permit the user to change the ISA on the fly. Needless to
5743 say, misuse can cause serious problems. */
5744 isa = atoi (name + 4);
5746 mips_isa = file_mips_isa;
5747 else if (isa < 1 || isa > 3)
5748 as_bad ("unknown ISA level");
5754 as_warn ("Tried to set unrecognized symbol: %s\n", name);
5756 *input_line_pointer = ch;
5757 demand_empty_rest_of_line ();
5760 /* The same as the usual .space directive, except that we have to
5761 forget about any previous instruction. */
5764 s_mips_space (param)
5767 mips_emit_delays ();
5772 /* Handle the .abicalls pseudo-op. I believe this is equivalent to
5773 .option pic2. It means to generate SVR4 PIC calls. */
5779 mips_pic = SVR4_PIC;
5781 if (g_switch_seen && g_switch_value != 0)
5782 as_warn ("-G may not be used with SVR4 PIC code");
5785 bfd_set_gp_size (stdoutput, 0);
5786 demand_empty_rest_of_line ();
5789 /* Handle the .cpload pseudo-op. This is used when generating SVR4
5790 PIC code. It sets the $gp register for the function based on the
5791 function address, which is in the register named in the argument.
5792 This uses a relocation against _gp_disp, which is handled specially
5793 by the linker. The result is:
5794 lui $gp,%hi(_gp_disp)
5795 addiu $gp,$gp,%lo(_gp_disp)
5796 addu $gp,$gp,.cpload argument
5797 The .cpload argument is normally $25 == $t9. */
5806 /* If we are not generating SVR4 PIC code, .cpload is ignored. */
5807 if (mips_pic != SVR4_PIC)
5813 /* .cpload should be a in .set noreorder section. */
5814 if (mips_noreorder == 0)
5815 as_warn (".cpload not in noreorder section");
5818 ex.X_add_symbol = symbol_find_or_make ("_gp_disp");
5819 ex.X_op_symbol = NULL;
5820 ex.X_add_number = 0;
5822 macro_build_lui ((char *) NULL, &icnt, &ex, GP);
5823 macro_build ((char *) NULL, &icnt, &ex, "addiu", "t,r,j", GP, GP,
5824 (int) BFD_RELOC_LO16);
5826 macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "addu", "d,v,t",
5827 GP, GP, tc_get_register (0));
5829 demand_empty_rest_of_line ();
5832 /* Handle the .cprestore pseudo-op. This stores $gp into a given
5833 offset from $sp. The offset is remembered, and after making a PIC
5834 call $gp is restored from that location. */
5837 s_cprestore (ignore)
5843 /* If we are not generating SVR4 PIC code, .cprestore is ignored. */
5844 if (mips_pic != SVR4_PIC)
5850 mips_cprestore_offset = get_absolute_expression ();
5852 ex.X_op = O_constant;
5853 ex.X_add_symbol = NULL;
5854 ex.X_op_symbol = NULL;
5855 ex.X_add_number = mips_cprestore_offset;
5857 macro_build ((char *) NULL, &icnt, &ex,
5858 mips_isa < 3 ? "sw" : "sd",
5859 "t,o(b)", GP, (int) BFD_RELOC_LO16, SP);
5861 demand_empty_rest_of_line ();
5864 /* Handle the .gpword pseudo-op. This is used when generating PIC
5865 code. It generates a 32 bit GP relative reloc. */
5875 /* When not generating PIC code, this is treated as .word. */
5876 if (mips_pic != SVR4_PIC)
5883 mips_emit_delays ();
5885 mips_align (2, 0, label);
5890 if (ex.X_op != O_symbol || ex.X_add_number != 0)
5892 as_bad ("Unsupported use of .gpword");
5893 ignore_rest_of_line ();
5897 md_number_to_chars (p, (valueT) 0, 4);
5898 fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, 0,
5899 BFD_RELOC_MIPS_GPREL32);
5901 demand_empty_rest_of_line ();
5904 /* Handle the .cpadd pseudo-op. This is used when dealing with switch
5905 tables in SVR4 PIC code. */
5914 /* This is ignored when not generating SVR4 PIC code. */
5915 if (mips_pic != SVR4_PIC)
5921 /* Add $gp to the register named as an argument. */
5922 reg = tc_get_register (0);
5923 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5924 mips_isa < 3 ? "addu" : "daddu",
5925 "d,v,t", reg, reg, GP);
5927 demand_empty_rest_of_line ();
5930 /* Parse a register string into a number. Called from the ECOFF code
5931 to parse .frame. The argument is non-zero if this is the frame
5932 register, so that we can record it in mips_frame_reg. */
5935 tc_get_register (frame)
5941 if (*input_line_pointer++ != '$')
5943 as_warn ("expected `$'");
5946 else if (isdigit ((unsigned char) *input_line_pointer))
5948 reg = get_absolute_expression ();
5949 if (reg < 0 || reg >= 32)
5951 as_warn ("Bad register number");
5957 if (strncmp (input_line_pointer, "fp", 2) == 0)
5959 else if (strncmp (input_line_pointer, "sp", 2) == 0)
5961 else if (strncmp (input_line_pointer, "gp", 2) == 0)
5963 else if (strncmp (input_line_pointer, "at", 2) == 0)
5967 as_warn ("Unrecognized register name");
5970 input_line_pointer += 2;
5973 mips_frame_reg = reg != 0 ? reg : SP;
5978 md_section_align (seg, addr)
5982 int align = bfd_get_section_alignment (stdoutput, seg);
5984 return ((addr + (1 << align) - 1) & (-1 << align));
5987 /* Estimate the size of a frag before relaxing. We are not really
5988 relaxing here, and the final size is encoded in the subtype
5993 md_estimate_size_before_relax (fragp, segtype)
5999 if (mips_pic == NO_PIC)
6002 const char *symname;
6004 /* Find out whether this symbol can be referenced off the GP
6005 register. It can be if it is smaller than the -G size or if
6006 it is in the .sdata or .sbss section. Certain symbols can
6007 not be referenced off the GP, although it appears as though
6009 symname = S_GET_NAME (fragp->fr_symbol);
6010 if (symname != (const char *) NULL
6011 && (strcmp (symname, "eprol") == 0
6012 || strcmp (symname, "etext") == 0
6013 || strcmp (symname, "_gp") == 0
6014 || strcmp (symname, "edata") == 0
6015 || strcmp (symname, "_fbss") == 0
6016 || strcmp (symname, "_fdata") == 0
6017 || strcmp (symname, "_ftext") == 0
6018 || strcmp (symname, "end") == 0
6019 || strcmp (symname, "_gp_disp") == 0))
6021 else if (! S_IS_DEFINED (fragp->fr_symbol)
6022 && ((fragp->fr_symbol->ecoff_extern_size != 0
6023 && fragp->fr_symbol->ecoff_extern_size <= g_switch_value)
6024 || (S_GET_VALUE (fragp->fr_symbol) != 0
6025 && S_GET_VALUE (fragp->fr_symbol) <= g_switch_value)))
6029 const char *segname;
6031 segname = segment_name (S_GET_SEGMENT (fragp->fr_symbol));
6032 assert (strcmp (segname, ".lit8") != 0
6033 && strcmp (segname, ".lit4") != 0);
6034 change = (strcmp (segname, ".sdata") != 0
6035 && strcmp (segname, ".sbss") != 0);
6037 #else /* ! defined (GPOPT) */
6038 /* We are not optimizing for the GP register. */
6040 #endif /* ! defined (GPOPT) */
6042 else if (mips_pic == SVR4_PIC)
6044 asection *symsec = fragp->fr_symbol->bsym->section;
6046 /* This must duplicate the test in adjust_reloc_syms. */
6047 change = (symsec != &bfd_und_section
6048 && symsec != &bfd_abs_section
6049 && ! bfd_is_com_section (symsec));
6056 /* Record the offset to the first reloc in the fr_opcode field.
6057 This lets md_convert_frag and tc_gen_reloc know that the code
6058 must be expanded. */
6059 fragp->fr_opcode = (fragp->fr_literal
6061 - RELAX_OLD (fragp->fr_subtype)
6062 + RELAX_RELOC1 (fragp->fr_subtype));
6063 /* FIXME: This really needs as_warn_where. */
6064 if (RELAX_WARN (fragp->fr_subtype))
6065 as_warn ("AT used after \".set noat\" or macro used after \".set nomacro\"");
6071 return RELAX_NEW (fragp->fr_subtype) - RELAX_OLD (fragp->fr_subtype);
6074 /* Translate internal representation of relocation info to BFD target
6078 tc_gen_reloc (section, fixp)
6082 static arelent *retval[4];
6085 reloc = retval[0] = (arelent *) xmalloc (sizeof (arelent));
6088 reloc->sym_ptr_ptr = &fixp->fx_addsy->bsym;
6089 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
6091 if (mips_pic == EMBEDDED_PIC
6092 && SWITCH_TABLE (fixp))
6094 /* For a switch table entry we use a special reloc. The addend
6095 is actually the difference between the reloc address and the
6097 reloc->addend = reloc->address - S_GET_VALUE (fixp->fx_subsy);
6099 as_fatal ("Double check fx_r_type in tc-mips.c:tc_gen_reloc");
6101 fixp->fx_r_type = BFD_RELOC_GPREL32;
6103 else if (fixp->fx_r_type == BFD_RELOC_PCREL_LO16)
6105 /* We use a special addend for an internal RELLO reloc. */
6106 if (fixp->fx_addsy->bsym->flags & BSF_SECTION_SYM)
6107 reloc->addend = reloc->address - S_GET_VALUE (fixp->fx_subsy);
6109 reloc->addend = fixp->fx_addnumber + reloc->address;
6111 else if (fixp->fx_r_type == BFD_RELOC_PCREL_HI16_S)
6113 assert (fixp->fx_next != NULL
6114 && fixp->fx_next->fx_r_type == BFD_RELOC_PCREL_LO16);
6115 /* We use a special addend for an internal RELHI reloc. The
6116 reloc is relative to the RELLO; adjust the addend
6118 if (fixp->fx_addsy->bsym->flags & BSF_SECTION_SYM)
6119 reloc->addend = (fixp->fx_next->fx_frag->fr_address
6120 + fixp->fx_next->fx_where
6121 - S_GET_VALUE (fixp->fx_subsy));
6123 reloc->addend = (fixp->fx_addnumber
6124 + fixp->fx_next->fx_frag->fr_address
6125 + fixp->fx_next->fx_where);
6127 else if (fixp->fx_pcrel == 0)
6128 reloc->addend = fixp->fx_addnumber;
6132 /* A gruesome hack which is a result of the gruesome gas reloc
6134 reloc->addend = reloc->address;
6136 reloc->addend = -reloc->address;
6140 /* If this is a variant frag, we may need to adjust the existing
6141 reloc and generate a new one. */
6142 if (fixp->fx_frag->fr_opcode != NULL
6143 && (fixp->fx_r_type == BFD_RELOC_MIPS_GPREL
6144 || fixp->fx_r_type == BFD_RELOC_MIPS_GOT16
6145 || fixp->fx_r_type == BFD_RELOC_MIPS_CALL16))
6149 /* If this is not the last reloc in this frag, then we have two
6150 GPREL relocs, both of which are being replaced. Let the
6151 second one handle all of them. */
6152 if (fixp->fx_next != NULL
6153 && fixp->fx_frag == fixp->fx_next->fx_frag)
6155 assert (fixp->fx_r_type == BFD_RELOC_MIPS_GPREL
6156 && fixp->fx_next->fx_r_type == BFD_RELOC_MIPS_GPREL);
6161 fixp->fx_where = fixp->fx_frag->fr_opcode - fixp->fx_frag->fr_literal;
6162 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
6163 reloc2 = retval[1] = (arelent *) xmalloc (sizeof (arelent));
6165 reloc2->sym_ptr_ptr = &fixp->fx_addsy->bsym;
6166 reloc2->address = (reloc->address
6167 + (RELAX_RELOC2 (fixp->fx_frag->fr_subtype)
6168 - RELAX_RELOC1 (fixp->fx_frag->fr_subtype)));
6169 reloc2->addend = fixp->fx_addnumber;
6170 reloc2->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_LO16);
6171 assert (reloc2->howto != NULL);
6173 if (RELAX_RELOC3 (fixp->fx_frag->fr_subtype))
6177 reloc3 = retval[2] = (arelent *) xmalloc (sizeof (arelent));
6180 reloc3->address += 4;
6183 if (mips_pic == NO_PIC)
6185 assert (fixp->fx_r_type == BFD_RELOC_MIPS_GPREL);
6186 fixp->fx_r_type = BFD_RELOC_HI16_S;
6188 else if (mips_pic == SVR4_PIC)
6190 if (fixp->fx_r_type != BFD_RELOC_MIPS_GOT16)
6192 assert (fixp->fx_r_type == BFD_RELOC_MIPS_CALL16);
6193 fixp->fx_r_type = BFD_RELOC_MIPS_GOT16;
6200 /* To support a PC relative reloc when generating embedded PIC code
6201 for ECOFF, we use a Cygnus extension. We check for that here to
6202 make sure that we don't let such a reloc escape normally. */
6204 if (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2
6205 && mips_pic != EMBEDDED_PIC)
6206 reloc->howto = NULL;
6209 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
6211 if (reloc->howto == NULL)
6213 as_bad_where (fixp->fx_file, fixp->fx_line,
6214 "Can not represent relocation in this object file format");
6221 /* Convert a machine dependent frag. */
6224 md_convert_frag (abfd, asec, fragp)
6232 if (fragp->fr_opcode == NULL)
6235 old = RELAX_OLD (fragp->fr_subtype);
6236 new = RELAX_NEW (fragp->fr_subtype);
6237 fixptr = fragp->fr_literal + fragp->fr_fix;
6240 memcpy (fixptr - old, fixptr, new);
6242 fragp->fr_fix += new - old;
6245 /* This function is called whenever a label is defined. It is used
6246 when handling branch delays; if a branch has a label, we assume we
6250 mips_define_label (sym)
6258 /* Some special processing for a MIPS ELF file. */
6261 mips_elf_final_processing ()
6265 /* Write out the .reginfo section. */
6266 s.ri_gprmask = mips_gprmask;
6267 s.ri_cprmask[0] = mips_cprmask[0];
6268 s.ri_cprmask[1] = mips_cprmask[1];
6269 s.ri_cprmask[2] = mips_cprmask[2];
6270 s.ri_cprmask[3] = mips_cprmask[3];
6271 /* The gp_value field is set by the MIPS ELF backend. */
6273 bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
6274 ((Elf32_External_RegInfo *)
6275 mips_regmask_frag));
6277 /* Set the MIPS ELF flag bits. FIXME: There should probably be some
6278 sort of BFD interface for this. */
6279 if (mips_any_noreorder)
6280 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
6281 if (mips_pic != NO_PIC)
6282 elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
6285 #endif /* OBJ_ELF */
6287 #ifndef ECOFF_DEBUGGING
6289 /* These functions should really be defined by the object file format,
6290 since they are related to debugging information. However, this
6291 code has to work for the a.out format, which does not define them,
6292 so we provide simple versions here. These don't actually generate
6293 any debugging information, but they do simple checking and someday
6294 somebody may make them useful. */
6298 struct loc *loc_next;
6299 unsigned long loc_fileno;
6300 unsigned long loc_lineno;
6301 unsigned long loc_offset;
6302 unsigned short loc_delta;
6303 unsigned short loc_count;
6312 struct proc *proc_next;
6313 struct symbol *proc_isym;
6314 struct symbol *proc_end;
6315 unsigned long proc_reg_mask;
6316 unsigned long proc_reg_offset;
6317 unsigned long proc_fpreg_mask;
6318 unsigned long proc_fpreg_offset;
6319 unsigned long proc_frameoffset;
6320 unsigned long proc_framereg;
6321 unsigned long proc_pcreg;
6323 struct file *proc_file;
6330 struct file *file_next;
6331 unsigned long file_fileno;
6332 struct symbol *file_symbol;
6333 struct symbol *file_end;
6334 struct proc *file_proc;
6339 static struct obstack proc_frags;
6340 static procS *proc_lastP;
6341 static procS *proc_rootP;
6342 static int numprocs;
6347 obstack_begin (&proc_frags, 0x2000);
6353 /* check for premature end, nesting errors, etc */
6354 if (proc_lastP && proc_lastP->proc_end == NULL)
6355 as_warn ("missing `.end' at end of assembly");
6358 extern char hex_value[];
6366 if (*input_line_pointer == '-')
6368 ++input_line_pointer;
6371 if (!isdigit (*input_line_pointer))
6372 as_bad ("Expected simple number.");
6373 if (input_line_pointer[0] == '0')
6375 if (input_line_pointer[1] == 'x')
6377 input_line_pointer += 2;
6378 while (isxdigit (*input_line_pointer))
6381 val |= hex_value[(int) *input_line_pointer++];
6383 return negative ? -val : val;
6387 ++input_line_pointer;
6388 while (isdigit (*input_line_pointer))
6391 val |= *input_line_pointer++ - '0';
6393 return negative ? -val : val;
6396 if (!isdigit (*input_line_pointer))
6398 printf (" *input_line_pointer == '%c' 0x%02x\n",
6399 *input_line_pointer, *input_line_pointer);
6400 as_warn ("Invalid number");
6403 while (isdigit (*input_line_pointer))
6406 val += *input_line_pointer++ - '0';
6408 return negative ? -val : val;
6411 /* The .file directive; just like the usual .file directive, but there
6412 is an initial number which is the ECOFF file index. */
6420 line = get_number ();
6425 /* The .end directive. */
6433 if (!is_end_of_line[(unsigned char) *input_line_pointer])
6436 demand_empty_rest_of_line ();
6440 if (now_seg != text_section)
6441 as_warn (".end not in text section");
6444 as_warn (".end and no .ent seen yet.");
6450 assert (S_GET_NAME (p));
6451 if (strcmp (S_GET_NAME (p), S_GET_NAME (proc_lastP->proc_isym)))
6452 as_warn (".end symbol does not match .ent symbol.");
6455 proc_lastP->proc_end = (symbolS *) 1;
6458 /* The .aent and .ent directives. */
6468 symbolP = get_symbol ();
6469 if (*input_line_pointer == ',')
6470 input_line_pointer++;
6472 if (isdigit (*input_line_pointer) || *input_line_pointer == '-')
6473 number = get_number ();
6474 if (now_seg != text_section)
6475 as_warn (".ent or .aent not in text section.");
6477 if (!aent && proc_lastP && proc_lastP->proc_end == NULL)
6478 as_warn ("missing `.end'");
6482 procP = (procS *) obstack_alloc (&proc_frags, sizeof (*procP));
6483 procP->proc_isym = symbolP;
6484 procP->proc_reg_mask = 0;
6485 procP->proc_reg_offset = 0;
6486 procP->proc_fpreg_mask = 0;
6487 procP->proc_fpreg_offset = 0;
6488 procP->proc_frameoffset = 0;
6489 procP->proc_framereg = 0;
6490 procP->proc_pcreg = 0;
6491 procP->proc_end = NULL;
6492 procP->proc_next = NULL;
6494 proc_lastP->proc_next = procP;
6500 demand_empty_rest_of_line ();
6503 /* The .frame directive. */
6516 frame_reg = tc_get_register (1);
6517 if (*input_line_pointer == ',')
6518 input_line_pointer++;
6519 frame_off = get_absolute_expression ();
6520 if (*input_line_pointer == ',')
6521 input_line_pointer++;
6522 pcreg = tc_get_register (0);
6525 assert (proc_rootP);
6526 proc_rootP->proc_framereg = frame_reg;
6527 proc_rootP->proc_frameoffset = frame_off;
6528 proc_rootP->proc_pcreg = pcreg;
6529 /* bob macho .frame */
6531 /* We don't have to write out a frame stab for unoptimized code. */
6532 if (!(frame_reg == FP && frame_off == 0))
6535 as_warn ("No .ent for .frame to use.");
6536 (void) sprintf (str, "R%d;%d", frame_reg, frame_off);
6537 symP = symbol_new (str, N_VFP, 0, frag_now);
6538 S_SET_TYPE (symP, N_RMASK);
6539 S_SET_OTHER (symP, 0);
6540 S_SET_DESC (symP, 0);
6541 symP->sy_forward = proc_lastP->proc_isym;
6542 /* bob perhaps I should have used pseudo set */
6544 demand_empty_rest_of_line ();
6548 /* The .fmask and .mask directives. */
6555 char str[100], *strP;
6561 mask = get_number ();
6562 if (*input_line_pointer == ',')
6563 input_line_pointer++;
6564 off = get_absolute_expression ();
6566 /* bob only for coff */
6567 assert (proc_rootP);
6568 if (reg_type == 'F')
6570 proc_rootP->proc_fpreg_mask = mask;
6571 proc_rootP->proc_fpreg_offset = off;
6575 proc_rootP->proc_reg_mask = mask;
6576 proc_rootP->proc_reg_offset = off;
6579 /* bob macho .mask + .fmask */
6581 /* We don't have to write out a mask stab if no saved regs. */
6585 as_warn ("No .ent for .mask to use.");
6587 for (i = 0; i < 32; i++)
6591 sprintf (strP, "%c%d,", reg_type, i);
6592 strP += strlen (strP);
6596 sprintf (strP, ";%d,", off);
6597 symP = symbol_new (str, N_RMASK, 0, frag_now);
6598 S_SET_TYPE (symP, N_RMASK);
6599 S_SET_OTHER (symP, 0);
6600 S_SET_DESC (symP, 0);
6601 symP->sy_forward = proc_lastP->proc_isym;
6602 /* bob perhaps I should have used pseudo set */
6607 /* The .loc directive. */
6618 assert (now_seg == text_section);
6620 lineno = get_number ();
6621 addroff = obstack_next_free (&frags) - frag_now->fr_literal;
6623 symbolP = symbol_new ("", N_SLINE, addroff, frag_now);
6624 S_SET_TYPE (symbolP, N_SLINE);
6625 S_SET_OTHER (symbolP, 0);
6626 S_SET_DESC (symbolP, lineno);
6627 symbolP->sy_segment = now_seg;
6631 #endif /* ! defined (ECOFF_DEBUGGING) */