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