* merge.c (_bfd_merged_section_offset): Remove "addend" param.
[platform/upstream/binutils.git] / gas / config / tc-a29k.c
1 /* tc-a29k.c -- Assemble for the AMD 29000.
2    Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1998, 2000, 2001, 2002
3    Free Software Foundation, Inc.
4
5    This file is part of GAS, the GNU Assembler.
6
7    GAS is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2, or (at your option)
10    any later version.
11
12    GAS is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with GAS; see the file COPYING.  If not, write to the Free
19    Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20    02111-1307, USA.  */
21
22 /* John Gilmore has reorganized this module somewhat, to make it easier
23    to convert it to new machines' assemblers as desired.  There was too
24    much bloody rewriting required before.  There still probably is.  */
25
26 #include "as.h"
27 #include "safe-ctype.h"
28
29 #include "opcode/a29k.h"
30
31 /* Make it easier to clone this machine desc into another one.  */
32 #define machine_opcode  a29k_opcode
33 #define machine_opcodes a29k_opcodes
34 #define machine_ip      a29k_ip
35 #define machine_it      a29k_it
36
37 #define IMMEDIATE_BIT   0x01000000      /* Turns RB into Immediate */
38 #define ABSOLUTE_BIT    0x01000000      /* Turns PC-relative to Absolute */
39 #define CE_BIT          0x00800000      /* Coprocessor enable in LOAD */
40 #define UI_BIT          0x00000080      /* Unsigned integer in CONVERT */
41
42 /* handle of the OPCODE hash table */
43 static struct hash_control *op_hash = NULL;
44
45 struct machine_it
46   {
47     char *error;
48     unsigned long opcode;
49     struct nlist *nlistp;
50     expressionS exp;
51     int pcrel;
52     int reloc_offset;           /* Offset of reloc within insn */
53
54     int reloc;
55   }
56 the_insn;
57
58 static void machine_ip PARAMS ((char *str));
59 /* static void print_insn PARAMS ((struct machine_it *insn)); */
60 #ifndef OBJ_COFF
61 static void s_data1 PARAMS ((void));
62 static void s_use PARAMS ((int));
63 #endif
64 static void insert_sreg PARAMS ((char *, int));
65 static void define_some_regs PARAMS ((void));
66 static char *parse_operand PARAMS ((char *, expressionS *, int));
67
68 const pseudo_typeS
69 md_pseudo_table[] =
70 {
71   {"align", s_align_bytes, 4},
72   {"block", s_space, 0},
73   {"cputype", s_ignore, 0},     /* CPU as 29000 or 29050 */
74   {"reg", s_lsym, 0},           /* Register equate, same as equ */
75   {"space", s_ignore, 0},       /* Listing control */
76   {"sect", s_ignore, 0},        /* Creation of coff sections */
77 #ifndef OBJ_COFF
78   /* We can do this right with coff.  */
79   {"use", s_use, 0},
80 #endif
81   {"word", cons, 4},
82   {NULL, 0, 0},
83 };
84
85 #if defined(BFD_HEADERS)
86 #ifdef RELSZ
87 const int md_reloc_size = RELSZ;        /* Coff headers */
88 #else
89 const int md_reloc_size = 12;           /* something else headers */
90 #endif
91 #else
92 const int md_reloc_size = 12;           /* Not bfdized*/
93 #endif
94
95 /* This array holds the chars that always start a comment.  If the
96    pre-processor is disabled, these aren't very useful */
97 const char comment_chars[] = ";";
98
99 /* This array holds the chars that only start a comment at the beginning of
100    a line.  If the line seems to have the form '# 123 filename'
101    .line and .file directives will appear in the pre-processed output */
102 /* Note that input_file.c hand checks for '#' at the beginning of the
103    first line of the input file.  This is because the compiler outputs
104    #NO_APP at the beginning of its output.  */
105 /* Also note that comments like this one will always work */
106 const char line_comment_chars[] = "#";
107
108 /* We needed an unused char for line separation to work around the
109    lack of macros, using sed and such.  */
110 const char line_separator_chars[] = "@";
111
112 /* Chars that can be used to separate mant from exp in floating point nums */
113 const char EXP_CHARS[] = "eE";
114
115 /* Chars that mean this number is a floating point constant */
116 /* As in 0f12.456 */
117 /* or    0d1.2345e12 */
118 const char FLT_CHARS[] = "rRsSfFdDxXpP";
119
120 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
121    changed in read.c.  Ideally it shouldn't have to know about it at
122    all, but nothing is ideal around here.  */
123
124 /*
125  *  anull bit - causes the branch delay slot instructions to not be executed
126  */
127 #define ANNUL       (1 << 29)
128
129 #ifndef OBJ_COFF
130
131 static void
132 s_use (ignore)
133      int ignore;
134 {
135   if (strncmp (input_line_pointer, ".text", 5) == 0)
136     {
137       input_line_pointer += 5;
138       s_text (0);
139       return;
140     }
141   if (strncmp (input_line_pointer, ".data", 5) == 0)
142     {
143       input_line_pointer += 5;
144       s_data (0);
145       return;
146     }
147   if (strncmp (input_line_pointer, ".data1", 6) == 0)
148     {
149       input_line_pointer += 6;
150       s_data1 ();
151       return;
152     }
153   /* Literals can't go in the text segment because you can't read from
154      instruction memory on some 29k's.  So, into initialized data.  */
155   if (strncmp (input_line_pointer, ".lit", 4) == 0)
156     {
157       input_line_pointer += 4;
158       subseg_set (SEG_DATA, 200);
159       demand_empty_rest_of_line ();
160       return;
161     }
162
163   as_bad (_("Unknown segment type"));
164   demand_empty_rest_of_line ();
165 }
166
167 static void
168 s_data1 ()
169 {
170   subseg_set (SEG_DATA, 1);
171   demand_empty_rest_of_line ();
172 }
173
174 #endif /* OBJ_COFF */
175
176 /* Install symbol definition that maps REGNAME to REGNO.
177    FIXME-SOON:  These are not recognized in mixed case.  */
178
179 static void
180 insert_sreg (regname, regnum)
181      char *regname;
182      int regnum;
183 {
184   /* FIXME-SOON, put something in these syms so they won't be output
185      to the symbol table of the resulting object file.  */
186
187   /* Must be large enough to hold the names of the special registers.  */
188   char buf[80];
189   int i;
190
191   symbol_table_insert (symbol_new (regname, SEG_REGISTER, (valueT) regnum,
192                                    &zero_address_frag));
193   for (i = 0; regname[i]; i++)
194     buf[i] = TOUPPER (regname[i]);
195   buf[i] = '\0';
196
197   symbol_table_insert (symbol_new (buf, SEG_REGISTER, (valueT) regnum,
198                                    &zero_address_frag));
199 }
200
201 /* Install symbol definitions for assorted special registers.
202    See ASM29K Ref page 2-9.  */
203
204 static void
205 define_some_regs ()
206 {
207 #define SREG    256
208
209   /* Protected special-purpose register names */
210   insert_sreg ("vab", SREG + 0);
211   insert_sreg ("ops", SREG + 1);
212   insert_sreg ("cps", SREG + 2);
213   insert_sreg ("cfg", SREG + 3);
214   insert_sreg ("cha", SREG + 4);
215   insert_sreg ("chd", SREG + 5);
216   insert_sreg ("chc", SREG + 6);
217   insert_sreg ("rbp", SREG + 7);
218   insert_sreg ("tmc", SREG + 8);
219   insert_sreg ("tmr", SREG + 9);
220   insert_sreg ("pc0", SREG + 10);
221   insert_sreg ("pc1", SREG + 11);
222   insert_sreg ("pc2", SREG + 12);
223   insert_sreg ("mmu", SREG + 13);
224   insert_sreg ("lru", SREG + 14);
225
226   /* Additional protected special-purpose registers for the 29050 */
227   insert_sreg ("rsn",  SREG + 15);
228   insert_sreg ("rma0", SREG + 16);
229   insert_sreg ("rmc0", SREG + 17);
230   insert_sreg ("rma1", SREG + 18);
231   insert_sreg ("rmc1", SREG + 19);
232   insert_sreg ("spc0", SREG + 20);
233   insert_sreg ("spc1", SREG + 21);
234   insert_sreg ("spc2", SREG + 22);
235   insert_sreg ("iba0", SREG + 23);
236   insert_sreg ("ibc0", SREG + 24);
237   insert_sreg ("iba1", SREG + 25);
238   insert_sreg ("ibc1", SREG + 26);
239
240   /* Additional registers for the 29040.  */
241   insert_sreg ("dba", SREG + 27);
242   insert_sreg ("dbc", SREG + 28);
243   insert_sreg ("cir", SREG + 29);
244   insert_sreg ("cdr", SREG + 30);
245
246   /* Unprotected special-purpose register names */
247   insert_sreg ("ipc", SREG + 128);
248   insert_sreg ("ipa", SREG + 129);
249   insert_sreg ("ipb", SREG + 130);
250   insert_sreg ("q", SREG + 131);
251   insert_sreg ("alu", SREG + 132);
252   insert_sreg ("bp", SREG + 133);
253   insert_sreg ("fc", SREG + 134);
254   insert_sreg ("cr", SREG + 135);
255   insert_sreg ("fpe", SREG + 160);
256   insert_sreg ("inte", SREG + 161);
257   insert_sreg ("fps", SREG + 162);
258   /*  "",    SREG+163);   Reserved */
259   insert_sreg ("exop", SREG + 164);
260 }
261
262 /* This function is called once, at assembler startup time.  It should
263    set up all the tables, etc., that the MD part of the assembler will
264    need.  */
265 void
266 md_begin ()
267 {
268   register const char *retval = NULL;
269   int lose = 0;
270   register int skipnext = 0;
271   register unsigned int i;
272   register char *strend, *strend2;
273
274   /* Hash up all the opcodes for fast use later.  */
275
276   op_hash = hash_new ();
277
278   for (i = 0; i < num_opcodes; i++)
279     {
280       const char *name = machine_opcodes[i].name;
281
282       if (skipnext)
283         {
284           skipnext = 0;
285           continue;
286         }
287
288       /* Hack to avoid multiple opcode entries.  We pre-locate all the
289          variations (b/i field and P/A field) and handle them.  */
290
291       if (!strcmp (name, machine_opcodes[i + 1].name))
292         {
293           if ((machine_opcodes[i].opcode & 0x01000000) != 0
294               || (machine_opcodes[i + 1].opcode & 0x01000000) == 0
295               || ((machine_opcodes[i].opcode | 0x01000000)
296                   != machine_opcodes[i + 1].opcode))
297             goto bad_table;
298           strend = machine_opcodes[i].args + strlen (machine_opcodes[i].args) - 1;
299           strend2 = machine_opcodes[i + 1].args + strlen (machine_opcodes[i + 1].args) - 1;
300           switch (*strend)
301             {
302             case 'b':
303               if (*strend2 != 'i')
304                 goto bad_table;
305               break;
306             case 'P':
307               if (*strend2 != 'A')
308                 goto bad_table;
309               break;
310             default:
311             bad_table:
312               fprintf (stderr, "internal error: can't handle opcode %s\n",
313                        name);
314               lose = 1;
315             }
316
317           /* OK, this is an i/b or A/P pair.  We skip the
318              higher-valued one, and let the code for operand checking
319              handle OR-ing in the bit.  */
320           skipnext = 1;
321         }
322
323       retval = hash_insert (op_hash, name, (PTR) &machine_opcodes[i]);
324       if (retval != NULL)
325         {
326           fprintf (stderr, "internal error: can't hash `%s': %s\n",
327                    machine_opcodes[i].name, retval);
328           lose = 1;
329         }
330     }
331
332   if (lose)
333     as_fatal (_("Broken assembler.  No assembly attempted."));
334
335   define_some_regs ();
336 }
337
338 /* Assemble a single instruction.  Its label has already been handled
339    by the generic front end.  We just parse opcode and operands, and
340    produce the bytes of data and relocation.  */
341
342 void
343 md_assemble (str)
344      char *str;
345 {
346   char *toP;
347
348   know (str);
349   machine_ip (str);
350   toP = frag_more (4);
351   /* put out the opcode */
352   md_number_to_chars (toP, the_insn.opcode, 4);
353
354   /* put out the symbol-dependent stuff */
355   if (the_insn.reloc != NO_RELOC)
356     {
357       fix_new_exp (frag_now,
358                    (toP - frag_now->fr_literal + the_insn.reloc_offset),
359                    4,           /* size */
360                    &the_insn.exp,
361                    the_insn.pcrel,
362                    the_insn.reloc);
363     }
364 }
365
366 static char *
367 parse_operand (s, operandp, opt)
368      char *s;
369      expressionS *operandp;
370      int opt;
371 {
372   char *save = input_line_pointer;
373   char *new;
374
375   input_line_pointer = s;
376   expression (operandp);
377   if (operandp->X_op == O_absent && ! opt)
378     as_bad (_("missing operand"));
379   new = input_line_pointer;
380   input_line_pointer = save;
381   return new;
382 }
383
384 /* Instruction parsing.  Takes a string containing the opcode.
385    Operands are at input_line_pointer.  Output is in the_insn.
386    Warnings or errors are generated.  */
387
388 static void
389 machine_ip (str)
390      char *str;
391 {
392   char *s;
393   const char *args;
394   struct machine_opcode *insn;
395   char *argsStart;
396   unsigned long opcode;
397   expressionS the_operand;
398   expressionS *operand = &the_operand;
399   unsigned int reg;
400
401   /* Must handle `div0' opcode.  */
402   s = str;
403   if (ISALPHA (*s))
404     for (; ISALNUM (*s); ++s)
405       *s = TOLOWER (*s);
406
407   switch (*s)
408     {
409     case '\0':
410       break;
411
412     case ' ':                   /* FIXME-SOMEDAY more whitespace */
413       *s++ = '\0';
414       break;
415
416     default:
417       as_bad (_("Unknown opcode: `%s'"), str);
418       return;
419     }
420   if ((insn = (struct machine_opcode *) hash_find (op_hash, str)) == NULL)
421     {
422       as_bad (_("Unknown opcode `%s'."), str);
423       return;
424     }
425   argsStart = s;
426   opcode = insn->opcode;
427   memset (&the_insn, '\0', sizeof (the_insn));
428   the_insn.reloc = NO_RELOC;
429
430   /* Build the opcode, checking as we go to make sure that the
431      operands match.
432
433      If an operand matches, we modify the_insn or opcode appropriately,
434      and do a "continue".  If an operand fails to match, we "break".  */
435
436   if (insn->args[0] != '\0')
437     {
438       /* Prime the pump.  */
439       s = parse_operand (s, operand, insn->args[0] == 'I');
440     }
441
442   for (args = insn->args;; ++args)
443     {
444       switch (*args)
445         {
446
447         case '\0':              /* end of args */
448           if (*s == '\0')
449             {
450               /* We are truly done.  */
451               the_insn.opcode = opcode;
452               return;
453             }
454           as_bad (_("Too many operands: %s"), s);
455           break;
456
457         case ',':               /* Must match a comma */
458           if (*s++ == ',')
459             {
460               /* Parse next operand.  */
461               s = parse_operand (s, operand, args[1] == 'I');
462               continue;
463             }
464           break;
465
466         case 'v':               /* Trap numbers (immediate field) */
467           if (operand->X_op == O_constant)
468             {
469               if (operand->X_add_number < 256)
470                 {
471                   opcode |= (operand->X_add_number << 16);
472                   continue;
473                 }
474               else
475                 {
476                   as_bad (_("Immediate value of %ld is too large"),
477                           (long) operand->X_add_number);
478                   continue;
479                 }
480             }
481           the_insn.reloc = RELOC_8;
482           the_insn.reloc_offset = 1;    /* BIG-ENDIAN Byte 1 of insn */
483           the_insn.exp = *operand;
484           continue;
485
486         case 'b':               /* A general register or 8-bit immediate */
487         case 'i':
488           /* We treat the two cases identically since we mashed
489              them together in the opcode table.  */
490           if (operand->X_op == O_register)
491             goto general_reg;
492
493           /* Make sure the 'i' case really exists.  */
494           if ((insn->opcode | IMMEDIATE_BIT) != (insn + 1)->opcode)
495             break;
496
497           opcode |= IMMEDIATE_BIT;
498           if (operand->X_op == O_constant)
499             {
500               if (operand->X_add_number < 256)
501                 {
502                   opcode |= operand->X_add_number;
503                   continue;
504                 }
505               else
506                 {
507                   as_bad (_("Immediate value of %ld is too large"),
508                           (long) operand->X_add_number);
509                   continue;
510                 }
511             }
512           the_insn.reloc = RELOC_8;
513           the_insn.reloc_offset = 3;    /* BIG-ENDIAN Byte 3 of insn */
514           the_insn.exp = *operand;
515           continue;
516
517         case 'a':               /* next operand must be a register */
518         case 'c':
519         general_reg:
520           /* lrNNN or grNNN or %%expr or a user-def register name */
521           if (operand->X_op != O_register)
522             break;              /* Only registers */
523           know (operand->X_add_symbol == 0);
524           know (operand->X_op_symbol == 0);
525           reg = operand->X_add_number;
526           if (reg >= SREG)
527             break;              /* No special registers */
528
529           /* Got the register, now figure out where it goes in the
530              opcode.  */
531           switch (*args)
532             {
533             case 'a':
534               opcode |= reg << 8;
535               continue;
536
537             case 'b':
538             case 'i':
539               opcode |= reg;
540               continue;
541
542             case 'c':
543               opcode |= reg << 16;
544               continue;
545             }
546           as_fatal (_("failed sanity check."));
547           break;
548
549         case 'x':               /* 16 bit constant, zero-extended */
550         case 'X':               /* 16 bit constant, one-extended */
551           if (operand->X_op == O_constant)
552             {
553               opcode |= (operand->X_add_number & 0xFF) << 0 |
554                 ((operand->X_add_number & 0xFF00) << 8);
555               continue;
556             }
557           the_insn.reloc = RELOC_CONST;
558           the_insn.exp = *operand;
559           continue;
560
561         case 'h':
562           if (operand->X_op == O_constant)
563             {
564               opcode |= (operand->X_add_number & 0x00FF0000) >> 16 |
565                 (((unsigned long) operand->X_add_number
566                   /* avoid sign ext */  & 0xFF000000) >> 8);
567               continue;
568             }
569           the_insn.reloc = RELOC_CONSTH;
570           the_insn.exp = *operand;
571           continue;
572
573         case 'P':               /* PC-relative jump address */
574         case 'A':               /* Absolute jump address */
575           /* These two are treated together since we folded the
576              opcode table entries together.  */
577           if (operand->X_op == O_constant)
578             {
579               /* Make sure the 'A' case really exists.  */
580               if ((insn->opcode | ABSOLUTE_BIT) != (insn + 1)->opcode)
581                 break;
582               {
583                 bfd_vma v, mask;
584                 mask = 0x1ffff;
585                 v = operand->X_add_number & ~ mask;
586                 if (v)
587                   as_bad ("call/jmp target out of range");
588               }
589               opcode |= ABSOLUTE_BIT |
590                 (operand->X_add_number & 0x0003FC00) << 6 |
591                 ((operand->X_add_number & 0x000003FC) >> 2);
592               continue;
593             }
594           the_insn.reloc = RELOC_JUMPTARG;
595           the_insn.exp = *operand;
596           the_insn.pcrel = 1;   /* Assume PC-relative jump */
597           /* FIXME-SOON, Do we figure out whether abs later, after
598              know sym val? */
599           continue;
600
601         case 'e':               /* Coprocessor enable bit for LOAD/STORE insn */
602           if (operand->X_op == O_constant)
603             {
604               if (operand->X_add_number == 0)
605                 continue;
606               if (operand->X_add_number == 1)
607                 {
608                   opcode |= CE_BIT;
609                   continue;
610                 }
611             }
612           break;
613
614         case 'n':               /* Control bits for LOAD/STORE instructions */
615           if (operand->X_op == O_constant &&
616               operand->X_add_number < 128)
617             {
618               opcode |= (operand->X_add_number << 16);
619               continue;
620             }
621           break;
622
623         case 's':               /* Special register number */
624           if (operand->X_op != O_register)
625             break;              /* Only registers */
626           if (operand->X_add_number < SREG)
627             break;              /* Not a special register */
628           opcode |= (operand->X_add_number & 0xFF) << 8;
629           continue;
630
631         case 'u':               /* UI bit of CONVERT */
632           if (operand->X_op == O_constant)
633             {
634               if (operand->X_add_number == 0)
635                 continue;
636               if (operand->X_add_number == 1)
637                 {
638                   opcode |= UI_BIT;
639                   continue;
640                 }
641             }
642           break;
643
644         case 'r':               /* RND bits of CONVERT */
645           if (operand->X_op == O_constant &&
646               operand->X_add_number < 8)
647             {
648               opcode |= operand->X_add_number << 4;
649               continue;
650             }
651           break;
652
653         case 'I':               /* ID bits of INV and IRETINV.  */
654           /* This operand is optional.  */
655           if (operand->X_op == O_absent)
656             continue;
657           else if (operand->X_op == O_constant
658                    && operand->X_add_number < 4)
659             {
660               opcode |= operand->X_add_number << 16;
661               continue;
662             }
663           break;
664
665         case 'd':               /* FD bits of CONVERT */
666           if (operand->X_op == O_constant &&
667               operand->X_add_number < 4)
668             {
669               opcode |= operand->X_add_number << 2;
670               continue;
671             }
672           break;
673
674         case 'f':               /* FS bits of CONVERT */
675           if (operand->X_op == O_constant &&
676               operand->X_add_number < 4)
677             {
678               opcode |= operand->X_add_number << 0;
679               continue;
680             }
681           break;
682
683         case 'C':
684           if (operand->X_op == O_constant &&
685               operand->X_add_number < 4)
686             {
687               opcode |= operand->X_add_number << 16;
688               continue;
689             }
690           break;
691
692         case 'F':
693           if (operand->X_op == O_constant &&
694               operand->X_add_number < 16)
695             {
696               opcode |= operand->X_add_number << 18;
697               continue;
698             }
699           break;
700
701         default:
702           BAD_CASE (*args);
703         }
704       /* Types or values of args don't match.  */
705       as_bad ("Invalid operands");
706       return;
707     }
708 }
709
710 /* This is identical to the md_atof in m68k.c.  I think this is right,
711    but I'm not sure.
712
713    Turn a string in input_line_pointer into a floating point constant
714    of type TYPE, and store the appropriate bytes in *LITP.  The number
715    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
716    returned, or NULL on OK.  */
717
718 /* Equal to MAX_PRECISION in atof-ieee.c */
719 #define MAX_LITTLENUMS 6
720
721 char *
722 md_atof (type, litP, sizeP)
723      char type;
724      char *litP;
725      int *sizeP;
726 {
727   int prec;
728   LITTLENUM_TYPE words[MAX_LITTLENUMS];
729   LITTLENUM_TYPE *wordP;
730   char *t;
731
732   switch (type)
733     {
734
735     case 'f':
736     case 'F':
737     case 's':
738     case 'S':
739       prec = 2;
740       break;
741
742     case 'd':
743     case 'D':
744     case 'r':
745     case 'R':
746       prec = 4;
747       break;
748
749     case 'x':
750     case 'X':
751       prec = 6;
752       break;
753
754     case 'p':
755     case 'P':
756       prec = 6;
757       break;
758
759     default:
760       *sizeP = 0;
761       return "Bad call to MD_ATOF()";
762     }
763   t = atof_ieee (input_line_pointer, type, words);
764   if (t)
765     input_line_pointer = t;
766   *sizeP = prec * sizeof (LITTLENUM_TYPE);
767   for (wordP = words; prec--;)
768     {
769       md_number_to_chars (litP, (valueT) (*wordP++), sizeof (LITTLENUM_TYPE));
770       litP += sizeof (LITTLENUM_TYPE);
771     }
772   return 0;
773 }
774
775 /*
776  * Write out big-endian.
777  */
778 void
779 md_number_to_chars (buf, val, n)
780      char *buf;
781      valueT val;
782      int n;
783 {
784   number_to_chars_bigendian (buf, val, n);
785 }
786
787 void
788 md_apply_fix3 (fixP, valP, seg)
789      fixS *fixP;
790      valueT * valP;
791      segT seg ATTRIBUTE_UNUSED;
792 {
793   long val = *valP;
794   char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
795
796   fixP->fx_addnumber = val;     /* Remember value for emit_reloc.  */
797
798   know (fixP->fx_size == 4);
799   know (fixP->fx_r_type < NO_RELOC);
800
801   /* This is a hack.  There should be a better way to handle this.  */
802   if (fixP->fx_r_type == RELOC_WDISP30 && fixP->fx_addsy)
803     val += fixP->fx_where + fixP->fx_frag->fr_address;
804
805   switch (fixP->fx_r_type)
806     {
807     case RELOC_32:
808       buf[0] = val >> 24;
809       buf[1] = val >> 16;
810       buf[2] = val >> 8;
811       buf[3] = val;
812       break;
813
814     case RELOC_8:
815       buf[0] = val;
816       break;
817
818     case RELOC_WDISP30:
819       val = (val >> 2) + 1;
820       buf[0] |= (val >> 24) & 0x3f;
821       buf[1] = (val >> 16);
822       buf[2] = val >> 8;
823       buf[3] = val;
824       break;
825
826     case RELOC_HI22:
827       buf[1] |= (val >> 26) & 0x3f;
828       buf[2] = val >> 18;
829       buf[3] = val >> 10;
830       break;
831
832     case RELOC_LO10:
833       buf[2] |= (val >> 8) & 0x03;
834       buf[3] = val;
835       break;
836
837     case RELOC_BASE13:
838       buf[2] |= (val >> 8) & 0x1f;
839       buf[3] = val;
840       break;
841
842     case RELOC_WDISP22:
843       val = (val >> 2) + 1;
844       /* FALLTHROUGH */
845     case RELOC_BASE22:
846       buf[1] |= (val >> 16) & 0x3f;
847       buf[2] = val >> 8;
848       buf[3] = val;
849       break;
850
851     case RELOC_JUMPTARG:        /* 00XX00XX pattern in a word */
852       if (!fixP->fx_done)
853         {
854           /* The linker tries to support both AMD and old GNU style
855              R_IREL relocs.  That means that if the addend is exactly
856              the negative of the address within the section, the
857              linker will not handle it correctly.  */
858           if (fixP->fx_pcrel
859               && val != 0
860               && val == - (fixP->fx_frag->fr_address + fixP->fx_where))
861             as_bad_where
862               (fixP->fx_file, fixP->fx_line,
863                "the linker will not handle this relocation correctly");
864         }
865       else if (fixP->fx_pcrel)
866         {
867           long v = val >> 17;
868
869           if (v != 0 && v != -1)
870             as_bad_where (fixP->fx_file, fixP->fx_line,
871                           "call/jmp target out of range");
872         }
873       else
874         /* This case was supposed to be handled in machine_ip.  */
875         abort ();
876       buf[1] = val >> 10;       /* Holds bits 0003FFFC of address */
877       buf[3] = val >> 2;
878       break;
879
880     case RELOC_CONST:           /* 00XX00XX pattern in a word */
881       buf[1] = val >> 8;        /* Holds bits 0000XXXX */
882       buf[3] = val;
883       break;
884
885     case RELOC_CONSTH:          /* 00XX00XX pattern in a word */
886       buf[1] = val >> 24;       /* Holds bits XXXX0000 */
887       buf[3] = val >> 16;
888       break;
889
890     case NO_RELOC:
891     default:
892       as_bad (_("bad relocation type: 0x%02x"), fixP->fx_r_type);
893       break;
894     }
895
896   if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
897     fixP->fx_done = 1;
898 }
899
900 #ifdef OBJ_COFF
901 short
902 tc_coff_fix2rtype (fixP)
903      fixS *fixP;
904 {
905
906   switch (fixP->fx_r_type)
907     {
908     case RELOC_32:
909       return (R_WORD);
910     case RELOC_8:
911       return (R_BYTE);
912     case RELOC_CONST:
913       return (R_ILOHALF);
914     case RELOC_CONSTH:
915       return (R_IHIHALF);
916     case RELOC_JUMPTARG:
917       return (R_IREL);
918     default:
919       printf (_("need %o3\n"), fixP->fx_r_type);
920       abort ();
921     }                           /* switch on type */
922
923   return (0);
924 }
925
926 #endif /* OBJ_COFF */
927
928 /* should never be called for 29k */
929 void
930 md_convert_frag (headers, seg, fragP)
931      object_headers *headers ATTRIBUTE_UNUSED;
932      segT seg ATTRIBUTE_UNUSED;
933      register fragS *fragP ATTRIBUTE_UNUSED;
934 {
935   as_fatal (_("a29k_convert_frag\n"));
936 }
937
938 /* should never be called for a29k */
939 int
940 md_estimate_size_before_relax (fragP, segtype)
941      register fragS *fragP ATTRIBUTE_UNUSED;
942      segT segtype ATTRIBUTE_UNUSED;
943 {
944   as_fatal (_("a29k_estimate_size_before_relax\n"));
945   return 0;
946 }
947
948 #if 0
949 /* for debugging only */
950 static void
951 print_insn (insn)
952      struct machine_it *insn;
953 {
954   char *Reloc[] =
955   {
956     "RELOC_8",
957     "RELOC_16",
958     "RELOC_32",
959     "RELOC_DISP8",
960     "RELOC_DISP16",
961     "RELOC_DISP32",
962     "RELOC_WDISP30",
963     "RELOC_WDISP22",
964     "RELOC_HI22",
965     "RELOC_22",
966     "RELOC_13",
967     "RELOC_LO10",
968     "RELOC_SFA_BASE",
969     "RELOC_SFA_OFF13",
970     "RELOC_BASE10",
971     "RELOC_BASE13",
972     "RELOC_BASE22",
973     "RELOC_PC10",
974     "RELOC_PC22",
975     "RELOC_JMP_TBL",
976     "RELOC_SEGOFF16",
977     "RELOC_GLOB_DAT",
978     "RELOC_JMP_SLOT",
979     "RELOC_RELATIVE",
980     "NO_RELOC"
981   };
982
983   if (insn->error)
984     {
985       fprintf (stderr, "ERROR: %s\n");
986     }
987   fprintf (stderr, "opcode=0x%08x\n", insn->opcode);
988   fprintf (stderr, "reloc = %s\n", Reloc[insn->reloc]);
989   fprintf (stderr, "exp =  {\n");
990   fprintf (stderr, "\t\tX_add_symbol = %s\n",
991            insn->exp.X_add_symbol ?
992            (S_GET_NAME (insn->exp.X_add_symbol) ?
993             S_GET_NAME (insn->exp.X_add_symbol) : "???") : "0");
994   fprintf (stderr, "\t\tX_op_symbol = %s\n",
995            insn->exp.X_op_symbol ?
996            (S_GET_NAME (insn->exp.X_op_symbol) ?
997             S_GET_NAME (insn->exp.X_op_symbol) : "???") : "0");
998   fprintf (stderr, "\t\tX_add_number = %d\n",
999            insn->exp.X_add_number);
1000   fprintf (stderr, "}\n");
1001 }
1002
1003 #endif
1004
1005 /* Translate internal representation of relocation info to target format.
1006
1007    On sparc/29k: first 4 bytes are normal unsigned long address, next three
1008    bytes are index, most sig. byte first.  Byte 7 is broken up with
1009    bit 7 as external, bits 6 & 5 unused, and the lower
1010    five bits as relocation type.  Next 4 bytes are long addend.  */
1011 /* Thanx and a tip of the hat to Michael Bloom, mb@ttidca.tti.com */
1012
1013 #ifdef OBJ_AOUT
1014
1015 void
1016 tc_aout_fix_to_chars (where, fixP, segment_address_in_file)
1017      char *where;
1018      fixS *fixP;
1019      relax_addressT segment_address_in_file;
1020 {
1021   long r_symbolnum;
1022
1023   know (fixP->fx_r_type < NO_RELOC);
1024   know (fixP->fx_addsy != NULL);
1025
1026   md_number_to_chars (where,
1027        fixP->fx_frag->fr_address + fixP->fx_where - segment_address_in_file,
1028                       4);
1029
1030   r_symbolnum = (S_IS_DEFINED (fixP->fx_addsy)
1031                  ? S_GET_TYPE (fixP->fx_addsy)
1032                  : fixP->fx_addsy->sy_number);
1033
1034   where[4] = (r_symbolnum >> 16) & 0x0ff;
1035   where[5] = (r_symbolnum >> 8) & 0x0ff;
1036   where[6] = r_symbolnum & 0x0ff;
1037   where[7] = (((!S_IS_DEFINED (fixP->fx_addsy)) << 7) & 0x80) | (0 & 0x60) | (fixP->fx_r_type & 0x1F);
1038   /* Also easy */
1039   md_number_to_chars (&where[8], fixP->fx_addnumber, 4);
1040 }
1041
1042 #endif /* OBJ_AOUT */
1043 \f
1044 const char *md_shortopts = "";
1045 struct option md_longopts[] = {
1046   {NULL, no_argument, NULL, 0}
1047 };
1048 size_t md_longopts_size = sizeof (md_longopts);
1049
1050 int
1051 md_parse_option (c, arg)
1052      int c ATTRIBUTE_UNUSED;
1053      char *arg ATTRIBUTE_UNUSED;
1054 {
1055   return 0;
1056 }
1057
1058 void
1059 md_show_usage (stream)
1060      FILE *stream ATTRIBUTE_UNUSED;
1061 {
1062 }
1063 \f
1064 /* This is called when a line is unrecognized.  This is used to handle
1065    definitions of a29k style local labels.  */
1066
1067 int
1068 a29k_unrecognized_line (c)
1069      int c;
1070 {
1071   int lab;
1072   char *s;
1073
1074   if (c != '$'
1075       || ! ISDIGIT (input_line_pointer[0]))
1076     return 0;
1077
1078   s = input_line_pointer;
1079
1080   lab = 0;
1081   while (ISDIGIT (*s))
1082     {
1083       lab = lab * 10 + *s - '0';
1084       ++s;
1085     }
1086
1087   if (*s != ':')
1088     {
1089       /* Not a label definition.  */
1090       return 0;
1091     }
1092
1093   if (dollar_label_defined (lab))
1094     {
1095       as_bad (_("label \"$%d\" redefined"), lab);
1096       return 0;
1097     }
1098
1099   define_dollar_label (lab);
1100   colon (dollar_label_name (lab, 0));
1101   input_line_pointer = s + 1;
1102
1103   return 1;
1104 }
1105
1106 /* Default the values of symbols known that should be "predefined".  We
1107    don't bother to predefine them unless you actually use one, since there
1108    are a lot of them.  */
1109
1110 symbolS *
1111 md_undefined_symbol (name)
1112      char *name;
1113 {
1114   long regnum;
1115   char testbuf[5 + /*SLOP*/ 5];
1116
1117   if (name[0] == 'g' || name[0] == 'G'
1118       || name[0] == 'l' || name[0] == 'L'
1119       || name[0] == 's' || name[0] == 'S')
1120     {
1121       /* Perhaps a global or local register name */
1122       if (name[1] == 'r' || name[1] == 'R')
1123         {
1124           long maxreg;
1125
1126           /* Parse the number, make sure it has no extra zeroes or
1127              trailing chars.  */
1128           regnum = atol (&name[2]);
1129
1130           if (name[0] == 's' || name[0] == 'S')
1131             maxreg = 255;
1132           else
1133             maxreg = 127;
1134           if (regnum > maxreg)
1135             return NULL;
1136
1137           sprintf (testbuf, "%ld", regnum);
1138           if (strcmp (testbuf, &name[2]) != 0)
1139             return NULL;        /* gr007 or lr7foo or whatever */
1140
1141           /* We have a wiener!  Define and return a new symbol for it.  */
1142           if (name[0] == 'l' || name[0] == 'L')
1143             regnum += 128;
1144           else if (name[0] == 's' || name[0] == 'S')
1145             regnum += SREG;
1146           return (symbol_new (name, SEG_REGISTER, (valueT) regnum,
1147                               &zero_address_frag));
1148         }
1149     }
1150
1151   return NULL;
1152 }
1153
1154 /* Parse an operand that is machine-specific.  */
1155
1156 void
1157 md_operand (expressionP)
1158      expressionS *expressionP;
1159 {
1160
1161   if (input_line_pointer[0] == '%' && input_line_pointer[1] == '%')
1162     {
1163       /* We have a numeric register expression.  No biggy.  */
1164       input_line_pointer += 2;  /* Skip %% */
1165       (void) expression (expressionP);
1166       if (expressionP->X_op != O_constant
1167           || expressionP->X_add_number > 255)
1168         as_bad (_("Invalid expression after %%%%\n"));
1169       expressionP->X_op = O_register;
1170     }
1171   else if (input_line_pointer[0] == '&')
1172     {
1173       /* We are taking the 'address' of a register...this one is not
1174          in the manual, but it *is* in traps/fpsymbol.h!  What they
1175          seem to want is the register number, as an absolute number.  */
1176       input_line_pointer++;     /* Skip & */
1177       (void) expression (expressionP);
1178       if (expressionP->X_op != O_register)
1179         as_bad (_("Invalid register in & expression"));
1180       else
1181         expressionP->X_op = O_constant;
1182     }
1183   else if (input_line_pointer[0] == '$'
1184            && ISDIGIT (input_line_pointer[1]))
1185     {
1186       long lab;
1187       char *name;
1188       symbolS *sym;
1189
1190       /* This is a local label.  */
1191       ++input_line_pointer;
1192       lab = (long) get_absolute_expression ();
1193       if (dollar_label_defined (lab))
1194         {
1195           name = dollar_label_name (lab, 0);
1196           sym = symbol_find (name);
1197         }
1198       else
1199         {
1200           name = dollar_label_name (lab, 1);
1201           sym = symbol_find_or_make (name);
1202         }
1203
1204       expressionP->X_op = O_symbol;
1205       expressionP->X_add_symbol = sym;
1206       expressionP->X_add_number = 0;
1207     }
1208   else if (input_line_pointer[0] == '$')
1209     {
1210       char *s;
1211       char type;
1212       int fieldnum, fieldlimit;
1213       LITTLENUM_TYPE floatbuf[8];
1214
1215       /* $float(), $doubleN(), or $extendN() convert floating values
1216          to integers.  */
1217
1218       s = input_line_pointer;
1219
1220       ++s;
1221
1222       fieldnum = 0;
1223       if (strncmp (s, "double", sizeof "double" - 1) == 0)
1224         {
1225           s += sizeof "double" - 1;
1226           type = 'd';
1227           fieldlimit = 2;
1228         }
1229       else if (strncmp (s, "float", sizeof "float" - 1) == 0)
1230         {
1231           s += sizeof "float" - 1;
1232           type = 'f';
1233           fieldlimit = 1;
1234         }
1235       else if (strncmp (s, "extend", sizeof "extend" - 1) == 0)
1236         {
1237           s += sizeof "extend" - 1;
1238           type = 'x';
1239           fieldlimit = 4;
1240         }
1241       else
1242         {
1243           return;
1244         }
1245
1246       if (ISDIGIT (*s))
1247         {
1248           fieldnum = *s - '0';
1249           ++s;
1250         }
1251       if (fieldnum >= fieldlimit)
1252         return;
1253
1254       SKIP_WHITESPACE ();
1255       if (*s != '(')
1256         return;
1257       ++s;
1258       SKIP_WHITESPACE ();
1259
1260       s = atof_ieee (s, type, floatbuf);
1261       if (s == NULL)
1262         return;
1263       s = s;
1264
1265       SKIP_WHITESPACE ();
1266       if (*s != ')')
1267         return;
1268       ++s;
1269       SKIP_WHITESPACE ();
1270
1271       input_line_pointer = s;
1272       expressionP->X_op = O_constant;
1273       expressionP->X_unsigned = 1;
1274       expressionP->X_add_number = ((floatbuf[fieldnum * 2]
1275                                     << LITTLENUM_NUMBER_OF_BITS)
1276                                    + floatbuf[fieldnum * 2 + 1]);
1277     }
1278 }
1279
1280 /* Round up a section size to the appropriate boundary.  */
1281 valueT
1282 md_section_align (segment, size)
1283      segT segment ATTRIBUTE_UNUSED;
1284      valueT size;
1285 {
1286   return size;                  /* Byte alignment is fine */
1287 }
1288
1289 /* Exactly what point is a PC-relative offset relative TO?
1290    On the 29000, they're relative to the address of the instruction,
1291    which we have set up as the address of the fixup too.  */
1292 long
1293 md_pcrel_from (fixP)
1294      fixS *fixP;
1295 {
1296   return fixP->fx_where + fixP->fx_frag->fr_address;
1297 }