Assign correct reloc value to size 1 fixes.
[binutils.git] / gas / config / tc-tahoe.c
blob26a75242c12329673589d21218226a59388af739
1 /* tc-tahoe.c
2 Not part of GAS yet. */
4 #include "as.h"
5 #include "obstack.h"
7 /* this bit glommed from tahoe-inst.h */
9 typedef unsigned char byte;
10 typedef byte tahoe_opcodeT;
13 * This is part of tahoe-ins-parse.c & friends.
14 * We want to parse a tahoe instruction text into a tree defined here.
17 #define TIT_MAX_OPERANDS (4) /* maximum number of operands in one
18 single tahoe instruction */
20 struct top /* tahoe instruction operand */
22 int top_ndx; /* -1, or index register. eg 7=[R7] */
23 int top_reg; /* -1, or register number. eg 7 = R7 or (R7) */
24 byte top_mode; /* Addressing mode byte. This byte, defines
25 which of the 11 modes opcode is. */
27 char top_access; /* Access type wanted for this opperand
28 'b'branch ' 'no-instruction 'amrvw' */
29 char top_width; /* Operand width expected, one of "bwlq?-:!" */
31 char *top_error; /* Say if operand is inappropriate */
33 segT seg_of_operand; /* segment as returned by expression()*/
35 expressionS exp_of_operand; /* The expression as parsed by expression()*/
37 byte top_dispsize; /* Number of bytes in the displacement if we
38 can figure it out */
41 /* The addressing modes for an operand. These numbers are the acutal values
42 for certain modes, so be carefull if you screw with them. */
43 #define TAHOE_DIRECT_REG (0x50)
44 #define TAHOE_REG_DEFERRED (0x60)
46 #define TAHOE_REG_DISP (0xE0)
47 #define TAHOE_REG_DISP_DEFERRED (0xF0)
49 #define TAHOE_IMMEDIATE (0x8F)
50 #define TAHOE_IMMEDIATE_BYTE (0x88)
51 #define TAHOE_IMMEDIATE_WORD (0x89)
52 #define TAHOE_IMMEDIATE_LONGWORD (0x8F)
53 #define TAHOE_ABSOLUTE_ADDR (0x9F)
55 #define TAHOE_DISPLACED_RELATIVE (0xEF)
56 #define TAHOE_DISP_REL_DEFERRED (0xFF)
58 #define TAHOE_AUTO_DEC (0x7E)
59 #define TAHOE_AUTO_INC (0x8E)
60 #define TAHOE_AUTO_INC_DEFERRED (0x9E)
61 /* INDEXED_REG is decided by the existance or lack of a [reg] */
63 /* These are encoded into top_width when top_access=='b'
64 and it's a psuedo op.*/
65 #define TAHOE_WIDTH_ALWAYS_JUMP '-'
66 #define TAHOE_WIDTH_CONDITIONAL_JUMP '?'
67 #define TAHOE_WIDTH_BIG_REV_JUMP '!'
68 #define TAHOE_WIDTH_BIG_NON_REV_JUMP ':'
70 /* The hex code for certain tahoe commands and modes.
71 This is just for readability. */
72 #define TAHOE_JMP (0x71)
73 #define TAHOE_PC_REL_LONG (0xEF)
74 #define TAHOE_BRB (0x11)
75 #define TAHOE_BRW (0x13)
76 /* These, when 'ored' with, or added to, a register number,
77 set up the number for the displacement mode. */
78 #define TAHOE_PC_OR_BYTE (0xA0)
79 #define TAHOE_PC_OR_WORD (0xC0)
80 #define TAHOE_PC_OR_LONG (0xE0)
82 struct tit /* get it out of the sewer, it stands for
83 tahoe instruction tree (Geeze!) */
85 tahoe_opcodeT tit_opcode; /* The opcode. */
86 byte tit_operands; /* How many operands are here. */
87 struct top tit_operand[TIT_MAX_OPERANDS]; /* Operands */
88 char *tit_error; /* "" or fatal error text */
91 /* end: tahoe-inst.h */
93 /* tahoe.c - tahoe-specific -
94 Not part of gas yet.
97 #include "opcode/tahoe.h"
99 /* This is the number to put at the beginning of the a.out file */
100 long omagic = OMAGIC;
102 /* These chars start a comment anywhere in a source file (except inside
103 another comment or a quoted string. */
104 const char comment_chars[] = "#;";
106 /* These chars only start a comment at the beginning of a line. */
107 const char line_comment_chars[] = "#";
109 /* Chars that can be used to separate mant from exp in floating point nums */
110 const char EXP_CHARS[] = "eE";
112 /* Chars that mean this number is a floating point constant
113 as in 0f123.456
114 or 0d1.234E-12 (see exp chars above)
115 Note: The Tahoe port doesn't support floating point constants. This is
116 consistant with 'as' If it's needed, I can always add it later. */
117 const char FLT_CHARS[] = "df";
119 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
120 changed in read.c . Ideally it shouldn't have to know about it at all,
121 but nothing is ideal around here.
122 (The tahoe has plenty of room, so the change currently isn't needed.)
125 static struct tit t; /* A tahoe instruction after decoding. */
127 void float_cons ();
128 /* A table of pseudo ops (sans .), the function called, and an integer op
129 that the function is called with. */
131 const pseudo_typeS md_pseudo_table[] =
133 {"dfloat", float_cons, 'd'},
134 {"ffloat", float_cons, 'f'},
139 * For Tahoe, relative addresses of "just the right length" are pretty easy.
140 * The branch displacement is always the last operand, even in
141 * synthetic instructions.
142 * For Tahoe, we encode the relax_substateTs (in e.g. fr_substate) as:
144 * 4 3 2 1 0 bit number
145 * ---/ /--+-------+-------+-------+-------+-------+
146 * | what state ? | how long ? |
147 * ---/ /--+-------+-------+-------+-------+-------+
149 * The "how long" bits are 00=byte, 01=word, 10=long.
150 * This is a Un*x convention.
151 * Not all lengths are legit for a given value of (what state).
152 * The four states are listed below.
153 * The "how long" refers merely to the displacement length.
154 * The address usually has some constant bytes in it as well.
157 States for Tahoe address relaxing.
158 1. TAHOE_WIDTH_ALWAYS_JUMP (-)
159 Format: "b-"
160 Tahoe opcodes are: (Hex)
161 jr 11
162 jbr 11
163 Simple branch.
164 Always, 1 byte opcode, then displacement/absolute.
165 If word or longword, change opcode to brw or jmp.
168 2. TAHOE_WIDTH_CONDITIONAL_JUMP (?)
169 J<cond> where <cond> is a simple flag test.
170 Format: "b?"
171 Tahoe opcodes are: (Hex)
172 jneq/jnequ 21
173 jeql/jeqlu 31
174 jgtr 41
175 jleq 51
176 jgeq 81
177 jlss 91
178 jgtru a1
179 jlequ b1
180 jvc c1
181 jvs d1
182 jlssu/jcs e1
183 jgequ/jcc f1
184 Always, you complement 4th bit to reverse the condition.
185 Always, 1-byte opcode, then 1-byte displacement.
187 3. TAHOE_WIDTH_BIG_REV_JUMP (!)
188 Jbc/Jbs where cond tests a memory bit.
189 Format: "rlvlb!"
190 Tahoe opcodes are: (Hex)
191 jbs 0e
192 jbc 1e
193 Always, you complement 4th bit to reverse the condition.
194 Always, 1-byte opcde, longword, longword-address, 1-word-displacement
196 4. TAHOE_WIDTH_BIG_NON_REV_JUMP (:)
197 JaoblXX/Jbssi
198 Format: "rlmlb:"
199 Tahoe opcodes are: (Hex)
200 aojlss 2f
201 jaoblss 2f
202 aojleq 3f
203 jaobleq 3f
204 jbssi 5f
205 Always, we cannot reverse the sense of the branch; we have a word
206 displacement.
208 We need to modify the opcode is for class 1, 2 and 3 instructions.
209 After relax() we may complement the 4th bit of 2 or 3 to reverse sense of
210 branch.
212 We sometimes store context in the operand literal. This way we can figure out
213 after relax() what the original addressing mode was. (Was is pc_rel, or
214 pc_rel_disp? That sort of thing.) */
216 /* These displacements are relative to the START address of the
217 displacement which is at the start of the displacement, not the end of
218 the instruction. The hardware pc_rel is at the end of the instructions.
219 That's why all the displacements have the length of the displacement added
220 to them. (WF + length(word))
222 The first letter is Byte, Word.
223 2nd letter is Forward, Backward. */
224 #define BF (1+ 127)
225 #define BB (1+-128)
226 #define WF (2+ 32767)
227 #define WB (2+-32768)
228 /* Dont need LF, LB because they always reach. [They are coded as 0.] */
230 #define C(a,b) ENCODE_RELAX(a,b)
231 /* This macro has no side-effects. */
232 #define ENCODE_RELAX(what,length) (((what) << 2) + (length))
233 #define RELAX_STATE(what) ((what) >> 2)
234 #define RELAX_LENGTH(length) ((length) && 3)
236 #define STATE_ALWAYS_BRANCH (1)
237 #define STATE_CONDITIONAL_BRANCH (2)
238 #define STATE_BIG_REV_BRANCH (3)
239 #define STATE_BIG_NON_REV_BRANCH (4)
240 #define STATE_PC_RELATIVE (5)
242 #define STATE_BYTE (0)
243 #define STATE_WORD (1)
244 #define STATE_LONG (2)
245 #define STATE_UNDF (3) /* Symbol undefined in pass1 */
247 /* This is the table used by gas to figure out relaxing modes. The fields are
248 forward_branch reach, backward_branch reach, number of bytes it would take,
249 where the next biggest branch is. */
250 const relax_typeS md_relax_table[] =
253 1, 1, 0, 0
254 }, /* error sentinel 0,0 */
256 1, 1, 0, 0
257 }, /* unused 0,1 */
259 1, 1, 0, 0
260 }, /* unused 0,2 */
262 1, 1, 0, 0
263 }, /* unused 0,3 */
264 /* Unconditional branch cases "jrb"
265 The relax part is the actual displacement */
267 BF, BB, 1, C (1, 1)
268 }, /* brb B`foo 1,0 */
270 WF, WB, 2, C (1, 2)
271 }, /* brw W`foo 1,1 */
273 0, 0, 5, 0
274 }, /* Jmp L`foo 1,2 */
276 1, 1, 0, 0
277 }, /* unused 1,3 */
278 /* Reversible Conditional Branch. If the branch won't reach, reverse
279 it, and jump over a brw or a jmp that will reach. The relax part is the
280 actual address. */
282 BF, BB, 1, C (2, 1)
283 }, /* b<cond> B`foo 2,0 */
285 WF + 2, WB + 2, 4, C (2, 2)
286 }, /* brev over, brw W`foo, over: 2,1 */
288 0, 0, 7, 0
289 }, /* brev over, jmp L`foo, over: 2,2 */
291 1, 1, 0, 0
292 }, /* unused 2,3 */
293 /* Another type of reversable branch. But this only has a word
294 displacement. */
296 1, 1, 0, 0
297 }, /* unused 3,0 */
299 WF, WB, 2, C (3, 2)
300 }, /* jbX W`foo 3,1 */
302 0, 0, 8, 0
303 }, /* jrevX over, jmp L`foo, over: 3,2 */
305 1, 1, 0, 0
306 }, /* unused 3,3 */
307 /* These are the non reversable branches, all of which have a word
308 displacement. If I can't reach, branch over a byte branch, to a
309 jump that will reach. The jumped branch jumps over the reaching
310 branch, to continue with the flow of the program. It's like playing
311 leap frog. */
313 1, 1, 0, 0
314 }, /* unused 4,0 */
316 WF, WB, 2, C (4, 2)
317 }, /* aobl_ W`foo 4,1 */
319 0, 0, 10, 0
320 }, /*aobl_ W`hop,br over,hop: jmp L^foo,over 4,2*/
322 1, 1, 0, 0
323 }, /* unused 4,3 */
324 /* Normal displacement mode, no jumping or anything like that.
325 The relax points to one byte before the address, thats why all
326 the numbers are up by one. */
328 BF + 1, BB + 1, 2, C (5, 1)
329 }, /* B^"foo" 5,0 */
331 WF + 1, WB + 1, 3, C (5, 2)
332 }, /* W^"foo" 5,1 */
334 0, 0, 5, 0
335 }, /* L^"foo" 5,2 */
337 1, 1, 0, 0
338 }, /* unused 5,3 */
341 #undef C
342 #undef BF
343 #undef BB
344 #undef WF
345 #undef WB
346 /* End relax stuff */
348 /* Handle of the OPCODE hash table. NULL means any use before
349 md_begin() will crash. */
350 static struct hash_control *op_hash;
352 /* Init function. Build the hash table. */
353 void
354 md_begin ()
356 struct tot *tP;
357 char *errorval = 0;
358 int synthetic_too = 1; /* If 0, just use real opcodes. */
360 op_hash = hash_new ();
362 for (tP = totstrs; *tP->name && !errorval; tP++)
363 errorval = hash_insert (op_hash, tP->name, &tP->detail);
365 if (synthetic_too)
366 for (tP = synthetic_totstrs; *tP->name && !errorval; tP++)
367 errorval = hash_insert (op_hash, tP->name, &tP->detail);
369 if (errorval)
370 as_fatal (errorval);
373 CONST char *md_shortopts = "ad:STt:V";
374 struct option md_longopts[] = {
375 {NULL, no_argument, NULL, 0}
377 size_t md_longopts_size = sizeof(md_longopts);
380 md_parse_option (c, arg)
381 int c;
382 char *arg;
384 switch (c)
386 case 'a':
387 as_warn (_("The -a option doesn't exist. (Despite what the man page says!"));
388 break;
390 case 'd':
391 as_warn (_("Displacement length %s ignored!"), arg);
392 break;
394 case 'S':
395 as_warn (_("SYMBOL TABLE not implemented"));
396 break;
398 case 'T':
399 as_warn (_("TOKEN TRACE not implemented"));
400 break;
402 case 't':
403 as_warn (_("I don't need or use temp. file \"%s\"."), arg);
404 break;
406 case 'V':
407 as_warn (_("I don't use an interpass file! -V ignored"));
408 break;
410 default:
411 return 0;
414 return 1;
417 void
418 md_show_usage (stream)
419 FILE *stream;
421 fprintf(stream, _("\
422 Tahoe options:\n\
423 -a ignored\n\
424 -d LENGTH ignored\n\
425 -J ignored\n\
426 -S ignored\n\
427 -t FILE ignored\n\
428 -T ignored\n\
429 -V ignored\n"));
432 /* The functions in this section take numbers in the machine format, and
433 munges them into Tahoe byte order.
434 They exist primarily for cross assembly purpose. */
435 void /* Knows about order of bytes in address. */
436 md_number_to_chars (con, value, nbytes)
437 char con[]; /* Return 'nbytes' of chars here. */
438 valueT value; /* The value of the bits. */
439 int nbytes; /* Number of bytes in the output. */
441 number_to_chars_bigendian (con, value, nbytes);
444 #ifdef comment
445 void /* Knows about order of bytes in address. */
446 md_number_to_imm (con, value, nbytes)
447 char con[]; /* Return 'nbytes' of chars here. */
448 long int value; /* The value of the bits. */
449 int nbytes; /* Number of bytes in the output. */
451 md_number_to_chars (con, value, nbytes);
454 #endif /* comment */
456 void
457 tc_apply_fix (fixP, val)
458 fixS *fixP;
459 long val;
461 /* should never be called */
462 know (0);
465 void /* Knows about order of bytes in address. */
466 md_number_to_disp (con, value, nbytes)
467 char con[]; /* Return 'nbytes' of chars here. */
468 long int value; /* The value of the bits. */
469 int nbytes; /* Number of bytes in the output. */
471 md_number_to_chars (con, value, nbytes);
474 void /* Knows about order of bytes in address. */
475 md_number_to_field (con, value, nbytes)
476 char con[]; /* Return 'nbytes' of chars here. */
477 long int value; /* The value of the bits. */
478 int nbytes; /* Number of bytes in the output. */
480 md_number_to_chars (con, value, nbytes);
483 /* Put the bits in an order that a tahoe will understand, despite the ordering
484 of the native machine.
485 On Tahoe: first 4 bytes are normal unsigned big endian long,
486 next three bytes are symbolnum, in kind of 3 byte big endian (least sig. byte last).
487 The last byte is broken up with bit 7 as pcrel,
488 bits 6 & 5 as length,
489 bit 4 as extern and the last nibble as 'undefined'. */
491 #if comment
492 void
493 md_ri_to_chars (ri_p, ri)
494 struct relocation_info *ri_p, ri;
496 byte the_bytes[sizeof (struct relocation_info)];
497 /* The reason I can't just encode these directly into ri_p is that
498 ri_p may point to ri. */
500 /* This is easy */
501 md_number_to_chars (the_bytes, ri.r_address, sizeof (ri.r_address));
503 /* now the fun stuff */
504 the_bytes[4] = (ri.r_symbolnum >> 16) & 0x0ff;
505 the_bytes[5] = (ri.r_symbolnum >> 8) & 0x0ff;
506 the_bytes[6] = ri.r_symbolnum & 0x0ff;
507 the_bytes[7] = (((ri.r_extern << 4) & 0x10) | ((ri.r_length << 5) & 0x60) |
508 ((ri.r_pcrel << 7) & 0x80)) & 0xf0;
510 bcopy (the_bytes, (char *) ri_p, sizeof (struct relocation_info));
513 #endif /* comment */
515 /* Put the bits in an order that a tahoe will understand, despite the ordering
516 of the native machine.
517 On Tahoe: first 4 bytes are normal unsigned big endian long,
518 next three bytes are symbolnum, in kind of 3 byte big endian (least sig. byte last).
519 The last byte is broken up with bit 7 as pcrel,
520 bits 6 & 5 as length,
521 bit 4 as extern and the last nibble as 'undefined'. */
523 void
524 tc_aout_fix_to_chars (where, fixP, segment_address_in_file)
525 char *where;
526 fixS *fixP;
527 relax_addressT segment_address_in_file;
529 long r_symbolnum;
531 know (fixP->fx_addsy != NULL);
533 md_number_to_chars (where,
534 fixP->fx_frag->fr_address + fixP->fx_where - segment_address_in_file,
537 r_symbolnum = (S_IS_DEFINED (fixP->fx_addsy)
538 ? S_GET_TYPE (fixP->fx_addsy)
539 : fixP->fx_addsy->sy_number);
541 where[4] = (r_symbolnum >> 16) & 0x0ff;
542 where[5] = (r_symbolnum >> 8) & 0x0ff;
543 where[6] = r_symbolnum & 0x0ff;
544 where[7] = (((is_pcrel (fixP) << 7) & 0x80)
545 | ((((fixP->fx_type == FX_8 || fixP->fx_type == FX_PCREL8
547 : (fixP->fx_type == FX_16 || fixP->fx_type == FX_PCREL16
549 : (fixP->fx_type == FX_32 || fixP->fx_type == FX_PCREL32
551 : 42)))) << 5) & 0x60)
552 | ((!S_IS_DEFINED (fixP->fx_addsy) << 4) & 0x10));
555 /* Relocate byte stuff */
557 /* This is for broken word. */
558 const int md_short_jump_size = 3;
560 void
561 md_create_short_jump (ptr, from_addr, to_addr, frag, to_symbol)
562 char *ptr;
563 addressT from_addr, to_addr;
564 fragS *frag;
565 symbolS *to_symbol;
567 valueT offset;
569 offset = to_addr - (from_addr + 1);
570 *ptr++ = TAHOE_BRW;
571 md_number_to_chars (ptr, offset, 2);
574 const int md_long_jump_size = 6;
575 const int md_reloc_size = 8; /* Size of relocation record */
577 void
578 md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol)
579 char *ptr;
580 addressT from_addr, to_addr;
581 fragS *frag;
582 symbolS *to_symbol;
584 valueT offset;
586 offset = to_addr - (from_addr + 4);
587 *ptr++ = TAHOE_JMP;
588 *ptr++ = TAHOE_PC_REL_LONG;
589 md_number_to_chars (ptr, offset, 4);
593 * md_estimate_size_before_relax()
595 * Called just before relax().
596 * Any symbol that is now undefined will not become defined, so we assumed
597 * that it will be resolved by the linker.
598 * Return the correct fr_subtype in the frag, for relax()
599 * Return the initial "guess for fr_var" to caller. (How big I think this
600 * will be.)
601 * The guess for fr_var is ACTUALLY the growth beyond fr_fix.
602 * Whatever we do to grow fr_fix or fr_var contributes to our returned value.
603 * Although it may not be explicit in the frag, pretend fr_var starts with a
604 * 0 value.
607 md_estimate_size_before_relax (fragP, segment_type)
608 register fragS *fragP;
609 segT segment_type; /* N_DATA or N_TEXT. */
611 register char *p;
612 register int old_fr_fix;
613 /* int pc_rel; FIXME: remove this */
615 old_fr_fix = fragP->fr_fix;
616 switch (fragP->fr_subtype)
618 case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_UNDF):
619 if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
621 /* The symbol was in the same segment as the opcode, and it's
622 a real pc_rel case so it's a relaxable case. */
623 fragP->fr_subtype = ENCODE_RELAX (STATE_PC_RELATIVE, STATE_BYTE);
625 else
627 /* This case is still undefined, so asume it's a long word for the
628 linker to fix. */
629 p = fragP->fr_literal + old_fr_fix;
630 *p |= TAHOE_PC_OR_LONG;
631 /* We now know how big it will be, one long word. */
632 fragP->fr_fix += 1 + 4;
633 fix_new (fragP, old_fr_fix + 1, fragP->fr_symbol,
634 fragP->fr_offset, FX_PCREL32, NULL);
635 frag_wane (fragP);
637 break;
639 case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_UNDF):
640 if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
642 fragP->fr_subtype = ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_BYTE);
644 else
646 p = fragP->fr_literal + old_fr_fix;
647 *fragP->fr_opcode ^= 0x10; /* Reverse sense of branch. */
648 *p++ = 6;
649 *p++ = TAHOE_JMP;
650 *p++ = TAHOE_PC_REL_LONG;
651 fragP->fr_fix += 1 + 1 + 1 + 4;
652 fix_new (fragP, old_fr_fix + 3, fragP->fr_symbol,
653 fragP->fr_offset, FX_PCREL32, NULL);
654 frag_wane (fragP);
656 break;
658 case ENCODE_RELAX (STATE_BIG_REV_BRANCH, STATE_UNDF):
659 if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
661 fragP->fr_subtype =
662 ENCODE_RELAX (STATE_BIG_REV_BRANCH, STATE_WORD);
664 else
666 p = fragP->fr_literal + old_fr_fix;
667 *fragP->fr_opcode ^= 0x10; /* Reverse sense of branch. */
668 *p++ = 0;
669 *p++ = 6;
670 *p++ = TAHOE_JMP;
671 *p++ = TAHOE_PC_REL_LONG;
672 fragP->fr_fix += 2 + 2 + 4;
673 fix_new (fragP, old_fr_fix + 4, fragP->fr_symbol,
674 fragP->fr_offset, FX_PCREL32, NULL);
675 frag_wane (fragP);
677 break;
679 case ENCODE_RELAX (STATE_BIG_NON_REV_BRANCH, STATE_UNDF):
680 if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
682 fragP->fr_subtype = ENCODE_RELAX (STATE_BIG_NON_REV_BRANCH, STATE_WORD);
684 else
686 p = fragP->fr_literal + old_fr_fix;
687 *p++ = 2;
688 *p++ = 0;
689 *p++ = TAHOE_BRB;
690 *p++ = 6;
691 *p++ = TAHOE_JMP;
692 *p++ = TAHOE_PC_REL_LONG;
693 fragP->fr_fix += 2 + 2 + 2 + 4;
694 fix_new (fragP, old_fr_fix + 6, fragP->fr_symbol,
695 fragP->fr_offset, FX_PCREL32, NULL);
696 frag_wane (fragP);
698 break;
700 case ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_UNDF):
701 if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
703 fragP->fr_subtype = ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_BYTE);
705 else
707 p = fragP->fr_literal + old_fr_fix;
708 *fragP->fr_opcode = TAHOE_JMP;
709 *p++ = TAHOE_PC_REL_LONG;
710 fragP->fr_fix += 1 + 4;
711 fix_new (fragP, old_fr_fix + 1, fragP->fr_symbol,
712 fragP->fr_offset, FX_PCREL32, NULL);
713 frag_wane (fragP);
715 break;
717 default:
718 break;
720 return (fragP->fr_var + fragP->fr_fix - old_fr_fix);
721 } /* md_estimate_size_before_relax() */
724 * md_convert_frag();
726 * Called after relax() is finished.
727 * In: Address of frag.
728 * fr_type == rs_machine_dependent.
729 * fr_subtype is what the address relaxed to.
731 * Out: Any fixSs and constants are set up.
732 * Caller will turn frag into a ".space 0".
734 void
735 md_convert_frag (headers, seg, fragP)
736 object_headers *headers;
737 segT seg;
738 register fragS *fragP;
740 register char *addressP; /* -> _var to change. */
741 register char *opcodeP; /* -> opcode char(s) to change. */
742 register short int length_code; /* 2=long 1=word 0=byte */
743 register short int extension = 0; /* Size of relaxed address.
744 Added to fr_fix: incl. ALL var chars. */
745 register symbolS *symbolP;
746 register long int where;
747 register long int address_of_var;
748 /* Where, in file space, is _var of *fragP? */
749 register long int target_address;
750 /* Where, in file space, does addr point? */
752 know (fragP->fr_type == rs_machine_dependent);
753 length_code = RELAX_LENGTH (fragP->fr_subtype);
754 know (length_code >= 0 && length_code < 3);
755 where = fragP->fr_fix;
756 addressP = fragP->fr_literal + where;
757 opcodeP = fragP->fr_opcode;
758 symbolP = fragP->fr_symbol;
759 know (symbolP);
760 target_address = S_GET_VALUE (symbolP) + fragP->fr_offset;
761 address_of_var = fragP->fr_address + where;
762 switch (fragP->fr_subtype)
764 case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_BYTE):
765 /* *addressP holds the registers number, plus 0x10, if it's deferred
766 mode. To set up the right mode, just OR the size of this displacement */
767 /* Byte displacement. */
768 *addressP++ |= TAHOE_PC_OR_BYTE;
769 *addressP = target_address - (address_of_var + 2);
770 extension = 2;
771 break;
773 case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_WORD):
774 /* Word displacement. */
775 *addressP++ |= TAHOE_PC_OR_WORD;
776 md_number_to_chars (addressP, target_address - (address_of_var + 3), 2);
777 extension = 3;
778 break;
780 case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_LONG):
781 /* Long word displacement. */
782 *addressP++ |= TAHOE_PC_OR_LONG;
783 md_number_to_chars (addressP, target_address - (address_of_var + 5), 4);
784 extension = 5;
785 break;
787 case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_BYTE):
788 *addressP = target_address - (address_of_var + 1);
789 extension = 1;
790 break;
792 case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_WORD):
793 *opcodeP ^= 0x10; /* Reverse sense of test. */
794 *addressP++ = 3; /* Jump over word branch */
795 *addressP++ = TAHOE_BRW;
796 md_number_to_chars (addressP, target_address - (address_of_var + 4), 2);
797 extension = 4;
798 break;
800 case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_LONG):
801 *opcodeP ^= 0x10; /* Reverse sense of test. */
802 *addressP++ = 6;
803 *addressP++ = TAHOE_JMP;
804 *addressP++ = TAHOE_PC_REL_LONG;
805 md_number_to_chars (addressP, target_address, 4);
806 extension = 7;
807 break;
809 case ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_BYTE):
810 *addressP = target_address - (address_of_var + 1);
811 extension = 1;
812 break;
814 case ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_WORD):
815 *opcodeP = TAHOE_BRW;
816 md_number_to_chars (addressP, target_address - (address_of_var + 2), 2);
817 extension = 2;
818 break;
820 case ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_LONG):
821 *opcodeP = TAHOE_JMP;
822 *addressP++ = TAHOE_PC_REL_LONG;
823 md_number_to_chars (addressP, target_address - (address_of_var + 5), 4);
824 extension = 5;
825 break;
827 case ENCODE_RELAX (STATE_BIG_REV_BRANCH, STATE_WORD):
828 md_number_to_chars (addressP, target_address - (address_of_var + 2), 2);
829 extension = 2;
830 break;
832 case ENCODE_RELAX (STATE_BIG_REV_BRANCH, STATE_LONG):
833 *opcodeP ^= 0x10;
834 *addressP++ = 0;
835 *addressP++ = 6;
836 *addressP++ = TAHOE_JMP;
837 *addressP++ = TAHOE_PC_REL_LONG;
838 md_number_to_chars (addressP, target_address, 4);
839 extension = 8;
840 break;
842 case ENCODE_RELAX (STATE_BIG_NON_REV_BRANCH, STATE_WORD):
843 md_number_to_chars (addressP, target_address - (address_of_var + 2), 2);
844 extension = 2;
845 break;
847 case ENCODE_RELAX (STATE_BIG_NON_REV_BRANCH, STATE_LONG):
848 *addressP++ = 0;
849 *addressP++ = 2;
850 *addressP++ = TAHOE_BRB;
851 *addressP++ = 6;
852 *addressP++ = TAHOE_JMP;
853 *addressP++ = TAHOE_PC_REL_LONG;
854 md_number_to_chars (addressP, target_address, 4);
855 extension = 10;
856 break;
858 default:
859 BAD_CASE (fragP->fr_subtype);
860 break;
862 fragP->fr_fix += extension;
863 } /* md_convert_frag */
866 /* This is the stuff for md_assemble. */
867 #define FP_REG 13
868 #define SP_REG 14
869 #define PC_REG 15
870 #define BIGGESTREG PC_REG
873 * Parse the string pointed to by START
874 * If it represents a valid register, point START to the character after
875 * the last valid register char, and return the register number (0-15).
876 * If invalid, leave START alone, return -1.
877 * The format has to be exact. I don't do things like eat leading zeros
878 * or the like.
879 * Note: This doesn't check for the next character in the string making
880 * this invalid. Ex: R123 would return 12, it's the callers job to check
881 * what start is point to apon return.
883 * Valid registers are R1-R15, %1-%15, FP (13), SP (14), PC (15)
884 * Case doesn't matter.
887 tahoe_reg_parse (start)
888 char **start; /* A pointer to the string to parse. */
890 register char *regpoint = *start;
891 register int regnum = -1;
893 switch (*regpoint++)
895 case '%': /* Registers can start with a %,
896 R or r, and then a number. */
897 case 'R':
898 case 'r':
899 if (isdigit (*regpoint))
901 /* Got the first digit. */
902 regnum = *regpoint++ - '0';
903 if ((regnum == 1) && isdigit (*regpoint))
905 /* Its a two digit number. */
906 regnum = 10 + (*regpoint++ - '0');
907 if (regnum > BIGGESTREG)
908 { /* Number too big? */
909 regnum = -1;
913 break;
914 case 'F': /* Is it the FP */
915 case 'f':
916 switch (*regpoint++)
918 case 'p':
919 case 'P':
920 regnum = FP_REG;
922 break;
923 case 's': /* How about the SP */
924 case 'S':
925 switch (*regpoint++)
927 case 'p':
928 case 'P':
929 regnum = SP_REG;
931 break;
932 case 'p': /* OR the PC even */
933 case 'P':
934 switch (*regpoint++)
936 case 'c':
937 case 'C':
938 regnum = PC_REG;
940 break;
943 if (regnum != -1)
944 { /* No error, so move string pointer */
945 *start = regpoint;
947 return regnum; /* Return results */
948 } /* tahoe_reg_parse */
951 * This chops up an operand and figures out its modes and stuff.
952 * It's a little touchy about extra characters.
953 * Optex to start with one extra character so it can be overwritten for
954 * the backward part of the parsing.
955 * You can't put a bunch of extra characters in side to
956 * make the command look cute. ie: * foo ( r1 ) [ r0 ]
957 * If you like doing a lot of typing, try COBOL!
958 * Actually, this parser is a little weak all around. It's designed to be
959 * used with compliers, so I emphisise correct decoding of valid code quickly
960 * rather that catching every possable error.
961 * Note: This uses the expression function, so save input_line_pointer before
962 * calling.
964 * Sperry defines the semantics of address modes (and values)
965 * by a two-letter code, explained here.
967 * letter 1: access type
969 * a address calculation - no data access, registers forbidden
970 * b branch displacement
971 * m read - let go of bus - write back "modify"
972 * r read
973 * w write
974 * v bit field address: like 'a' but registers are OK
976 * letter 2: data type (i.e. width, alignment)
978 * b byte
979 * w word
980 * l longword
981 * q quadword (Even regs < 14 allowed) (if 12, you get a warning)
982 * - unconditional synthetic jbr operand
983 * ? simple synthetic reversable branch operand
984 * ! complex synthetic reversable branch operand
985 * : complex synthetic non-reversable branch operand
987 * The '-?!:' letter 2's are not for external consumption. They are used
988 * by GAS for psuedo ops relaxing code.
990 * After parsing topP has:
992 * top_ndx: -1, or the index register. eg 7=[R7]
993 * top_reg: -1, or register number. eg 7 = R7 or (R7)
994 * top_mode: The addressing mode byte. This byte, defines which of
995 * the 11 modes opcode is.
996 * top_access: Access type wanted for this opperand 'b'branch ' '
997 * no-instruction 'amrvw'
998 * top_width: Operand width expected, one of "bwlq?-:!"
999 * exp_of_operand: The expression as parsed by expression()
1000 * top_dispsize: Number of bytes in the displacement if we can figure it
1001 * out and it's relavent.
1003 * Need syntax checks built.
1006 void
1007 tip_op (optex, topP)
1008 char *optex; /* The users text input, with one leading character */
1009 struct top *topP; /* The tahoe instruction with some fields already set:
1010 in: access, width
1011 out: ndx, reg, mode, error, dispsize */
1014 int mode = 0; /* This operand's mode. */
1015 char segfault = *optex; /* To keep the back parsing from freaking. */
1016 char *point = optex + 1; /* Parsing from front to back. */
1017 char *end; /* Parsing from back to front. */
1018 int reg = -1; /* major register, -1 means absent */
1019 int imreg = -1; /* Major register in immediate mode */
1020 int ndx = -1; /* index register number, -1 means absent */
1021 char dec_inc = ' '; /* Is the SP auto-incremented '+' or
1022 auto-decremented '-' or neither ' '. */
1023 int immediate = 0; /* 1 if '$' immediate mode */
1024 int call_width = 0; /* If the caller casts the displacement */
1025 int abs_width = 0; /* The width of the absolute displacment */
1026 int com_width = 0; /* Displacement width required by branch */
1027 int deferred = 0; /* 1 if '*' deferral is used */
1028 byte disp_size = 0; /* How big is this operand. 0 == don't know */
1029 char *op_bad = ""; /* Bad operand error */
1031 char *tp, *temp, c; /* Temporary holders */
1033 char access = topP->top_access; /* Save on a deref. */
1034 char width = topP->top_width;
1036 int really_none = 0; /* Empty expressions evaluate to 0
1037 but I need to know if it's there or not */
1038 expressionS *expP; /* -> expression values for this operand */
1040 /* Does this command restrict the displacement size. */
1041 if (access == 'b')
1042 com_width = (width == 'b' ? 1 :
1043 (width == 'w' ? 2 :
1044 (width == 'l' ? 4 : 0)));
1046 *optex = '\0'; /* This is kind of a back stop for all
1047 the searches to fail on if needed.*/
1048 if (*point == '*')
1049 { /* A dereference? */
1050 deferred = 1;
1051 point++;
1054 /* Force words into a certain mode */
1055 /* Bitch, Bitch, Bitch! */
1057 * Using the ^ operator is ambigous. If I have an absolute label
1058 * called 'w' set to, say 2, and I have the expression 'w^1', do I get
1059 * 1, forced to be in word displacement mode, or do I get the value of
1060 * 'w' or'ed with 1 (3 in this case).
1061 * The default is 'w' as an offset, so that's what I use.
1062 * Stick with `, it does the same, and isn't ambig.
1065 if (*point != '\0' && ((point[1] == '^') || (point[1] == '`')))
1066 switch (*point)
1068 case 'b':
1069 case 'B':
1070 case 'w':
1071 case 'W':
1072 case 'l':
1073 case 'L':
1074 if (com_width)
1075 as_warn (_("Casting a branch displacement is bad form, and is ignored."));
1076 else
1078 c = (isupper (*point) ? tolower (*point) : *point);
1079 call_width = ((c == 'b') ? 1 :
1080 ((c == 'w') ? 2 : 4));
1082 point += 2;
1083 break;
1086 /* Setting immediate mode */
1087 if (*point == '$')
1089 immediate = 1;
1090 point++;
1094 * I've pulled off all the easy stuff off the front, move to the end and
1095 * yank.
1098 for (end = point; *end != '\0'; end++) /* Move to the end. */
1101 if (end != point) /* Null string? */
1102 end--;
1104 if (end > point && *end == ' ' && end[-1] != '\'')
1105 end--; /* Hop white space */
1107 /* Is this an index reg. */
1108 if ((*end == ']') && (end[-1] != '\''))
1110 temp = end;
1112 /* Find opening brace. */
1113 for (--end; (*end != '[' && end != point); end--)
1116 /* If I found the opening brace, get the index register number. */
1117 if (*end == '[')
1119 tp = end + 1; /* tp should point to the start of a reg. */
1120 ndx = tahoe_reg_parse (&tp);
1121 if (tp != temp)
1122 { /* Reg. parse error. */
1123 ndx = -1;
1125 else
1127 end--; /* Found it, move past brace. */
1129 if (ndx == -1)
1131 op_bad = _("Couldn't parse the [index] in this operand.");
1132 end = point; /* Force all the rest of the tests to fail. */
1135 else
1137 op_bad = _("Couldn't find the opening '[' for the index of this operand.");
1138 end = point; /* Force all the rest of the tests to fail. */
1142 /* Post increment? */
1143 if (*end == '+')
1145 dec_inc = '+';
1146 /* was: *end--; */
1147 end--;
1150 /* register in parens? */
1151 if ((*end == ')') && (end[-1] != '\''))
1153 temp = end;
1155 /* Find opening paren. */
1156 for (--end; (*end != '(' && end != point); end--)
1159 /* If I found the opening paren, get the register number. */
1160 if (*end == '(')
1162 tp = end + 1;
1163 reg = tahoe_reg_parse (&tp);
1164 if (tp != temp)
1166 /* Not a register, but could be part of the expression. */
1167 reg = -1;
1168 end = temp; /* Rest the pointer back */
1170 else
1172 end--; /* Found the reg. move before opening paren. */
1175 else
1177 op_bad = _("Couldn't find the opening '(' for the deref of this operand.");
1178 end = point; /* Force all the rest of the tests to fail. */
1182 /* Pre decrement? */
1183 if (*end == '-')
1185 if (dec_inc != ' ')
1187 op_bad = _("Operand can't be both pre-inc and post-dec.");
1188 end = point;
1190 else
1192 dec_inc = '-';
1193 /* was: *end--; */
1194 end--;
1199 * Everything between point and end is the 'expression', unless it's
1200 * a register name.
1203 c = end[1];
1204 end[1] = '\0';
1206 tp = point;
1207 imreg = tahoe_reg_parse (&point); /* Get the immediate register
1208 if it is there.*/
1209 if (*point != '\0')
1211 /* If there is junk after point, then the it's not immediate reg. */
1212 point = tp;
1213 imreg = -1;
1216 if (imreg != -1 && reg != -1)
1217 op_bad = _("I parsed 2 registers in this operand.");
1220 * Evaluate whats left of the expression to see if it's valid.
1221 * Note again: This assumes that the calling expression has saved
1222 * input_line_pointer. (Nag, nag, nag!)
1225 if (*op_bad == '\0')
1227 /* statement has no syntax goofs yet: lets sniff the expression */
1228 input_line_pointer = point;
1229 expP = &(topP->exp_of_operand);
1230 topP->seg_of_operand = expression (expP);
1231 switch (expP->X_op)
1233 case O_absent:
1234 /* No expression. For BSD4.2 compatibility, missing expression is
1235 absolute 0 */
1236 expP->X_op = O_constant;
1237 expP->X_add_number = 0;
1238 really_none = 1;
1239 case O_constant:
1240 /* for SEG_ABSOLUTE, we shouldnt need to set X_op_symbol,
1241 X_add_symbol to any particular value. */
1242 /* But, we will program defensively. Since this situation occurs
1243 rarely so it costs us little to do so. */
1244 expP->X_add_symbol = NULL;
1245 expP->X_op_symbol = NULL;
1246 /* How many bytes are needed to express this abs value? */
1247 abs_width =
1248 ((((expP->X_add_number & 0xFFFFFF80) == 0) ||
1249 ((expP->X_add_number & 0xFFFFFF80) == 0xFFFFFF80)) ? 1 :
1250 (((expP->X_add_number & 0xFFFF8000) == 0) ||
1251 ((expP->X_add_number & 0xFFFF8000) == 0xFFFF8000)) ? 2 : 4);
1253 case O_symbol:
1254 break;
1256 default:
1258 * Major bug. We can't handle the case of a operator
1259 * expression in a synthetic opcode variable-length
1260 * instruction. We don't have a frag type that is smart
1261 * enough to relax a operator, and so we just force all
1262 * operators to behave like SEG_PASS1s. Clearly, if there is
1263 * a demand we can invent a new or modified frag type and
1264 * then coding up a frag for this case will be easy.
1266 need_pass_2 = 1;
1267 op_bad = _("Can't relocate expression error.");
1268 break;
1270 case O_big:
1271 /* This is an error. Tahoe doesn't allow any expressions
1272 bigger that a 32 bit long word. Any bigger has to be referenced
1273 by address. */
1274 op_bad = _("Expression is too large for a 32 bits.");
1275 break;
1277 if (*input_line_pointer != '\0')
1279 op_bad = _("Junk at end of expression.");
1283 end[1] = c;
1285 /* I'm done, so restore optex */
1286 *optex = segfault;
1290 * At this point in the game, we (in theory) have all the components of
1291 * the operand at least parsed. Now it's time to check for syntax/semantic
1292 * errors, and build the mode.
1293 * This is what I have:
1294 * deferred = 1 if '*'
1295 * call_width = 0,1,2,4
1296 * abs_width = 0,1,2,4
1297 * com_width = 0,1,2,4
1298 * immediate = 1 if '$'
1299 * ndx = -1 or reg num
1300 * dec_inc = '-' or '+' or ' '
1301 * reg = -1 or reg num
1302 * imreg = -1 or reg num
1303 * topP->exp_of_operand
1304 * really_none
1306 /* Is there a displacement size? */
1307 disp_size = (call_width ? call_width :
1308 (com_width ? com_width :
1309 abs_width ? abs_width : 0));
1311 if (*op_bad == '\0')
1313 if (imreg != -1)
1315 /* Rn */
1316 mode = TAHOE_DIRECT_REG;
1317 if (deferred || immediate || (dec_inc != ' ') ||
1318 (reg != -1) || !really_none)
1319 op_bad = _("Syntax error in direct register mode.");
1320 else if (ndx != -1)
1321 op_bad = _("You can't index a register in direct register mode.");
1322 else if (imreg == SP_REG && access == 'r')
1323 op_bad =
1324 _("SP can't be the source operand with direct register addressing.");
1325 else if (access == 'a')
1326 op_bad = _("Can't take the address of a register.");
1327 else if (access == 'b')
1328 op_bad = _("Direct Register can't be used in a branch.");
1329 else if (width == 'q' && ((imreg % 2) || (imreg > 13)))
1330 op_bad = _("For quad access, the register must be even and < 14.");
1331 else if (call_width)
1332 op_bad = _("You can't cast a direct register.");
1334 if (*op_bad == '\0')
1336 /* No errors, check for warnings */
1337 if (width == 'q' && imreg == 12)
1338 as_warn (_("Using reg 14 for quadwords can tromp the FP register."));
1340 reg = imreg;
1343 /* We know: imm = -1 */
1345 else if (dec_inc == '-')
1347 /* -(SP) */
1348 mode = TAHOE_AUTO_DEC;
1349 if (deferred || immediate || !really_none)
1350 op_bad = _("Syntax error in auto-dec mode.");
1351 else if (ndx != -1)
1352 op_bad = _("You can't have an index auto dec mode.");
1353 else if (access == 'r')
1354 op_bad = _("Auto dec mode cant be used for reading.");
1355 else if (reg != SP_REG)
1356 op_bad = _("Auto dec only works of the SP register.");
1357 else if (access == 'b')
1358 op_bad = _("Auto dec can't be used in a branch.");
1359 else if (width == 'q')
1360 op_bad = _("Auto dec won't work with quadwords.");
1362 /* We know: imm = -1, dec_inc != '-' */
1364 else if (dec_inc == '+')
1366 if (immediate || !really_none)
1367 op_bad = _("Syntax error in one of the auto-inc modes.");
1368 else if (deferred)
1370 /* *(SP)+ */
1371 mode = TAHOE_AUTO_INC_DEFERRED;
1372 if (reg != SP_REG)
1373 op_bad = _("Auto inc deferred only works of the SP register.");
1374 else if (ndx != -1)
1375 op_bad = _("You can't have an index auto inc deferred mode.");
1376 else if (access == 'b')
1377 op_bad = _("Auto inc can't be used in a branch.");
1379 else
1381 /* (SP)+ */
1382 mode = TAHOE_AUTO_INC;
1383 if (access == 'm' || access == 'w')
1384 op_bad = _("You can't write to an auto inc register.");
1385 else if (reg != SP_REG)
1386 op_bad = _("Auto inc only works of the SP register.");
1387 else if (access == 'b')
1388 op_bad = _("Auto inc can't be used in a branch.");
1389 else if (width == 'q')
1390 op_bad = _("Auto inc won't work with quadwords.");
1391 else if (ndx != -1)
1392 op_bad = _("You can't have an index in auto inc mode.");
1395 /* We know: imm = -1, dec_inc == ' ' */
1397 else if (reg != -1)
1399 if ((ndx != -1) && (reg == SP_REG))
1400 op_bad = _("You can't index the sp register.");
1401 if (deferred)
1403 /* *<disp>(Rn) */
1404 mode = TAHOE_REG_DISP_DEFERRED;
1405 if (immediate)
1406 op_bad = _("Syntax error in register displaced mode.");
1408 else if (really_none)
1410 /* (Rn) */
1411 mode = TAHOE_REG_DEFERRED;
1412 /* if reg = SP then cant be indexed */
1414 else
1416 /* <disp>(Rn) */
1417 mode = TAHOE_REG_DISP;
1420 /* We know: imm = -1, dec_inc == ' ', Reg = -1 */
1422 else
1424 if (really_none)
1425 op_bad = _("An offest is needed for this operand.");
1426 if (deferred && immediate)
1428 /* *$<ADDR> */
1429 mode = TAHOE_ABSOLUTE_ADDR;
1430 disp_size = 4;
1432 else if (immediate)
1434 /* $<disp> */
1435 mode = TAHOE_IMMEDIATE;
1436 if (ndx != -1)
1437 op_bad = _("You can't index a register in immediate mode.");
1438 if (access == 'a')
1439 op_bad = _("Immediate access can't be used as an address.");
1440 /* ponder the wisdom of a cast because it doesn't do any good. */
1442 else if (deferred)
1444 /* *<disp> */
1445 mode = TAHOE_DISP_REL_DEFERRED;
1447 else
1449 /* <disp> */
1450 mode = TAHOE_DISPLACED_RELATIVE;
1456 * At this point, all the errors we can do have be checked for.
1457 * We can build the 'top'. */
1459 topP->top_ndx = ndx;
1460 topP->top_reg = reg;
1461 topP->top_mode = mode;
1462 topP->top_error = op_bad;
1463 topP->top_dispsize = disp_size;
1464 } /* tip_op */
1467 * t i p ( )
1469 * This converts a string into a tahoe instruction.
1470 * The string must be a bare single instruction in tahoe (with BSD4 frobs)
1471 * format.
1472 * It provides at most one fatal error message (which stops the scan)
1473 * some warning messages as it finds them.
1474 * The tahoe instruction is returned in exploded form.
1476 * The exploded instruction is returned to a struct tit of your choice.
1477 * #include "tahoe-inst.h" to know what a struct tit is.
1481 static void
1482 tip (titP, instring)
1483 struct tit *titP; /* We build an exploded instruction here. */
1484 char *instring; /* Text of a vax instruction: we modify. */
1486 register struct tot_wot *twP = NULL; /* How to bit-encode this opcode. */
1487 register char *p; /* 1/skip whitespace.2/scan vot_how */
1488 register char *q; /* */
1489 register unsigned char count; /* counts number of operands seen */
1490 register struct top *operandp;/* scan operands in struct tit */
1491 register char *alloperr = ""; /* error over all operands */
1492 register char c; /* Remember char, (we clobber it
1493 with '\0' temporarily). */
1494 char *save_input_line_pointer;
1496 if (*instring == ' ')
1497 ++instring; /* Skip leading whitespace. */
1498 for (p = instring; *p && *p != ' '; p++)
1499 ; /* MUST end in end-of-string or
1500 exactly 1 space. */
1501 /* Scanned up to end of operation-code. */
1502 /* Operation-code is ended with whitespace. */
1503 if (p == instring)
1505 titP->tit_error = _("No operator");
1506 count = 0;
1507 titP->tit_opcode = 0;
1509 else
1511 c = *p;
1512 *p = '\0';
1514 * Here with instring pointing to what better be an op-name, and p
1515 * pointing to character just past that.
1516 * We trust instring points to an op-name, with no whitespace.
1518 twP = (struct tot_wot *) hash_find (op_hash, instring);
1519 *p = c; /* Restore char after op-code. */
1520 if (twP == 0)
1522 titP->tit_error = _("Unknown operator");
1523 count = 0;
1524 titP->tit_opcode = 0;
1526 else
1529 * We found a match! So lets pick up as many operands as the
1530 * instruction wants, and even gripe if there are too many.
1531 * We expect comma to seperate each operand.
1532 * We let instring track the text, while p tracks a part of the
1533 * struct tot.
1536 count = 0; /* no operands seen yet */
1537 instring = p + (*p != '\0'); /* point past the operation code */
1538 /* tip_op() screws with the input_line_pointer, so save it before
1539 I jump in */
1540 save_input_line_pointer = input_line_pointer;
1541 for (p = twP->args, operandp = titP->tit_operand;
1542 !*alloperr && *p;
1543 operandp++, p += 2)
1546 * Here to parse one operand. Leave instring pointing just
1547 * past any one ',' that marks the end of this operand.
1549 if (!p[1])
1550 as_fatal (_("Compiler bug: ODD number of bytes in arg structure %s."),
1551 twP->args);
1552 else if (*instring)
1554 for (q = instring; (*q != ',' && *q != '\0'); q++)
1556 if (*q == '\'' && q[1] != '\0') /* Jump quoted characters */
1557 q++;
1559 c = *q;
1561 * Q points to ',' or '\0' that ends argument. C is that
1562 * character.
1564 *q = '\0';
1565 operandp->top_access = p[0];
1566 operandp->top_width = p[1];
1567 tip_op (instring - 1, operandp);
1568 *q = c; /* Restore input text. */
1569 if (*(operandp->top_error))
1571 alloperr = operandp->top_error;
1573 instring = q + (c ? 1 : 0); /* next operand (if any) */
1574 count++; /* won another argument, may have an operr */
1576 else
1577 alloperr = _("Not enough operands");
1579 /* Restore the pointer. */
1580 input_line_pointer = save_input_line_pointer;
1582 if (!*alloperr)
1584 if (*instring == ' ')
1585 instring++; /* Skip whitespace. */
1586 if (*instring)
1587 alloperr = _("Too many operands");
1589 titP->tit_error = alloperr;
1593 titP->tit_opcode = twP->code; /* The op-code. */
1594 titP->tit_operands = count;
1595 } /* tip */
1597 /* md_assemble() emit frags for 1 instruction */
1598 void
1599 md_assemble (instruction_string)
1600 char *instruction_string; /* A string: assemble 1 instruction. */
1602 char *p;
1603 register struct top *operandP;/* An operand. Scans all operands. */
1604 /* char c_save; fixme: remove this line *//* What used to live after an expression. */
1605 /* struct frag *fragP; fixme: remove this line *//* Fragment of code we just made. */
1606 /* register struct top *end_operandP; fixme: remove this line *//* -> slot just after last operand
1607 Limit of the for (each operand). */
1608 register expressionS *expP; /* -> expression values for this operand */
1610 /* These refer to an instruction operand expression. */
1611 segT to_seg; /* Target segment of the address. */
1613 register valueT this_add_number;
1614 register symbolS *this_add_symbol; /* +ve (minuend) symbol. */
1616 /* tahoe_opcodeT opcode_as_number; fixme: remove this line *//* The opcode as a number. */
1617 char *opcodeP; /* Where it is in a frag. */
1618 /* char *opmodeP; fixme: remove this line *//* Where opcode type is, in a frag. */
1620 int dispsize; /* From top_dispsize: tahoe_operand_width
1621 (in bytes) */
1622 int is_undefined; /* 1 if operand expression's
1623 segment not known yet. */
1624 int pc_rel; /* Is this operand pc relative? */
1626 /* Decode the operand. */
1627 tip (&t, instruction_string);
1630 * Check to see if this operand decode properly.
1631 * Notice that we haven't made any frags yet.
1632 * If it goofed, then this instruction will wedge in any pass,
1633 * and we can safely flush it, without causing interpass symbol phase
1634 * errors. That is, without changing label values in different passes.
1636 if (*t.tit_error)
1638 as_warn (_("Ignoring statement due to \"%s\""), t.tit_error);
1640 else
1642 /* We saw no errors in any operands - try to make frag(s) */
1643 /* Emit op-code. */
1644 /* Remember where it is, in case we want to modify the op-code later. */
1645 opcodeP = frag_more (1);
1646 *opcodeP = t.tit_opcode;
1647 /* Now do each operand. */
1648 for (operandP = t.tit_operand;
1649 operandP < t.tit_operand + t.tit_operands;
1650 operandP++)
1651 { /* for each operand */
1652 expP = &(operandP->exp_of_operand);
1653 if (operandP->top_ndx >= 0)
1655 /* Indexed addressing byte
1656 Legality of indexed mode already checked: it is OK */
1657 FRAG_APPEND_1_CHAR (0x40 + operandP->top_ndx);
1658 } /* if(top_ndx>=0) */
1660 /* Here to make main operand frag(s). */
1661 this_add_number = expP->X_add_number;
1662 this_add_symbol = expP->X_add_symbol;
1663 to_seg = operandP->seg_of_operand;
1664 know (to_seg == SEG_UNKNOWN || \
1665 to_seg == SEG_ABSOLUTE || \
1666 to_seg == SEG_DATA || \
1667 to_seg == SEG_TEXT || \
1668 to_seg == SEG_BSS);
1669 is_undefined = (to_seg == SEG_UNKNOWN);
1670 /* Do we know how big this opperand is? */
1671 dispsize = operandP->top_dispsize;
1672 pc_rel = 0;
1673 /* Deal with the branch possabilities. (Note, this doesn't include
1674 jumps.)*/
1675 if (operandP->top_access == 'b')
1677 /* Branches must be expressions. A psuedo branch can also jump to
1678 an absolute address. */
1679 if (to_seg == now_seg || is_undefined)
1681 /* If is_undefined, then it might BECOME now_seg by relax time. */
1682 if (dispsize)
1684 /* I know how big the branch is supposed to be (it's a normal
1685 branch), so I set up the frag, and let GAS do the rest. */
1686 p = frag_more (dispsize);
1687 fix_new (frag_now, p - frag_now->fr_literal,
1688 this_add_symbol, this_add_number,
1689 size_to_fx (dispsize, 1),
1690 NULL);
1692 else
1694 /* (to_seg==now_seg || to_seg == SEG_UNKNOWN) && dispsize==0 */
1695 /* If we don't know how big it is, then its a synthetic branch,
1696 so we set up a simple relax state. */
1697 switch (operandP->top_width)
1699 case TAHOE_WIDTH_CONDITIONAL_JUMP:
1700 /* Simple (conditional) jump. I may have to reverse the
1701 condition of opcodeP, and then jump to my destination.
1702 I set 1 byte aside for the branch off set, and could need 6
1703 more bytes for the pc_rel jump */
1704 frag_var (rs_machine_dependent, 7, 1,
1705 ENCODE_RELAX (STATE_CONDITIONAL_BRANCH,
1706 is_undefined ? STATE_UNDF : STATE_BYTE),
1707 this_add_symbol, this_add_number, opcodeP);
1708 break;
1709 case TAHOE_WIDTH_ALWAYS_JUMP:
1710 /* Simple (unconditional) jump. I may have to convert this to
1711 a word branch, or an absolute jump. */
1712 frag_var (rs_machine_dependent, 5, 1,
1713 ENCODE_RELAX (STATE_ALWAYS_BRANCH,
1714 is_undefined ? STATE_UNDF : STATE_BYTE),
1715 this_add_symbol, this_add_number, opcodeP);
1716 break;
1717 /* The smallest size for the next 2 cases is word. */
1718 case TAHOE_WIDTH_BIG_REV_JUMP:
1719 frag_var (rs_machine_dependent, 8, 2,
1720 ENCODE_RELAX (STATE_BIG_REV_BRANCH,
1721 is_undefined ? STATE_UNDF : STATE_WORD),
1722 this_add_symbol, this_add_number,
1723 opcodeP);
1724 break;
1725 case TAHOE_WIDTH_BIG_NON_REV_JUMP:
1726 frag_var (rs_machine_dependent, 10, 2,
1727 ENCODE_RELAX (STATE_BIG_NON_REV_BRANCH,
1728 is_undefined ? STATE_UNDF : STATE_WORD),
1729 this_add_symbol, this_add_number,
1730 opcodeP);
1731 break;
1732 default:
1733 as_fatal (_("Compliler bug: Got a case (%d) I wasn't expecting."),
1734 operandP->top_width);
1738 else
1740 /* to_seg != now_seg && to_seg != seg_unknown (still in branch)
1741 In other words, I'm jumping out of my segment so extend the
1742 branches to jumps, and let GAS fix them. */
1744 /* These are "branches" what will always be branches around a jump
1745 to the correct addresss in real life.
1746 If to_seg is SEG_ABSOLUTE, just encode the branch in,
1747 else let GAS fix the address. */
1749 switch (operandP->top_width)
1751 /* The theory:
1752 For SEG_ABSOLUTE, then mode is ABSOLUTE_ADDR, jump
1753 to that addresss (not pc_rel).
1754 For other segs, address is a long word PC rel jump. */
1755 case TAHOE_WIDTH_CONDITIONAL_JUMP:
1756 /* b<cond> */
1757 /* To reverse the condition in a TAHOE branch,
1758 complement bit 4 */
1759 *opcodeP ^= 0x10;
1760 p = frag_more (7);
1761 *p++ = 6;
1762 *p++ = TAHOE_JMP;
1763 *p++ = (operandP->top_mode ==
1764 TAHOE_ABSOLUTE_ADDR ? TAHOE_ABSOLUTE_ADDR :
1765 TAHOE_PC_REL_LONG);
1766 fix_new (frag_now, p - frag_now->fr_literal,
1767 this_add_symbol, this_add_number,
1768 (to_seg != SEG_ABSOLUTE) ? FX_PCREL32 : FX_32, NULL);
1770 * Now (eg) BLEQ 1f
1771 * JMP foo
1772 * 1:
1774 break;
1775 case TAHOE_WIDTH_ALWAYS_JUMP:
1776 /* br, just turn it into a jump */
1777 *opcodeP = TAHOE_JMP;
1778 p = frag_more (5);
1779 *p++ = (operandP->top_mode ==
1780 TAHOE_ABSOLUTE_ADDR ? TAHOE_ABSOLUTE_ADDR :
1781 TAHOE_PC_REL_LONG);
1782 fix_new (frag_now, p - frag_now->fr_literal,
1783 this_add_symbol, this_add_number,
1784 (to_seg != SEG_ABSOLUTE) ? FX_PCREL32 : FX_32, NULL);
1785 /* Now (eg) JMP foo */
1786 break;
1787 case TAHOE_WIDTH_BIG_REV_JUMP:
1788 p = frag_more (8);
1789 *opcodeP ^= 0x10;
1790 *p++ = 0;
1791 *p++ = 6;
1792 *p++ = TAHOE_JMP;
1793 *p++ = (operandP->top_mode ==
1794 TAHOE_ABSOLUTE_ADDR ? TAHOE_ABSOLUTE_ADDR :
1795 TAHOE_PC_REL_LONG);
1796 fix_new (frag_now, p - frag_now->fr_literal,
1797 this_add_symbol, this_add_number,
1798 (to_seg != SEG_ABSOLUTE) ? FX_PCREL32 : FX_32, NULL);
1800 * Now (eg) ACBx 1f
1801 * JMP foo
1802 * 1:
1804 break;
1805 case TAHOE_WIDTH_BIG_NON_REV_JUMP:
1806 p = frag_more (10);
1807 *p++ = 0;
1808 *p++ = 2;
1809 *p++ = TAHOE_BRB;
1810 *p++ = 6;
1811 *p++ = TAHOE_JMP;
1812 *p++ = (operandP->top_mode ==
1813 TAHOE_ABSOLUTE_ADDR ? TAHOE_ABSOLUTE_ADDR :
1814 TAHOE_PC_REL_LONG);
1815 fix_new (frag_now, p - frag_now->fr_literal,
1816 this_add_symbol, this_add_number,
1817 (to_seg != SEG_ABSOLUTE) ? FX_PCREL32 : FX_32, NULL);
1819 * Now (eg) xOBxxx 1f
1820 * BRB 2f
1821 * 1: JMP @#foo
1822 * 2:
1824 break;
1825 case 'b':
1826 case 'w':
1827 as_warn (_("Real branch displacements must be expressions."));
1828 break;
1829 default:
1830 as_fatal (_("Complier error: I got an unknown synthetic branch :%c"),
1831 operandP->top_width);
1832 break;
1836 else
1838 /* It ain't a branch operand. */
1839 switch (operandP->top_mode)
1841 /* Auto-foo access, only works for one reg (SP)
1842 so the only thing needed is the mode. */
1843 case TAHOE_AUTO_DEC:
1844 case TAHOE_AUTO_INC:
1845 case TAHOE_AUTO_INC_DEFERRED:
1846 FRAG_APPEND_1_CHAR (operandP->top_mode);
1847 break;
1849 /* Numbered Register only access. Only thing needed is the
1850 mode + Register number */
1851 case TAHOE_DIRECT_REG:
1852 case TAHOE_REG_DEFERRED:
1853 FRAG_APPEND_1_CHAR (operandP->top_mode + operandP->top_reg);
1854 break;
1856 /* An absolute address. It's size is always 5 bytes.
1857 (mode_type + 4 byte address). */
1858 case TAHOE_ABSOLUTE_ADDR:
1859 know ((this_add_symbol == NULL));
1860 p = frag_more (5);
1861 *p = TAHOE_ABSOLUTE_ADDR;
1862 md_number_to_chars (p + 1, this_add_number, 4);
1863 break;
1865 /* Immediate data. If the size isn't known, then it's an address
1866 + and offset, which is 4 bytes big. */
1867 case TAHOE_IMMEDIATE:
1868 if (this_add_symbol != NULL)
1870 p = frag_more (5);
1871 *p++ = TAHOE_IMMEDIATE_LONGWORD;
1872 fix_new (frag_now, p - frag_now->fr_literal,
1873 this_add_symbol, this_add_number,
1874 FX_32, NULL);
1876 else
1878 /* It's a integer, and I know it's size. */
1879 if ((unsigned) this_add_number < 0x40)
1881 /* Will it fit in a literal? */
1882 FRAG_APPEND_1_CHAR ((byte) this_add_number);
1884 else
1886 p = frag_more (dispsize + 1);
1887 switch (dispsize)
1889 case 1:
1890 *p++ = TAHOE_IMMEDIATE_BYTE;
1891 *p = (byte) this_add_number;
1892 break;
1893 case 2:
1894 *p++ = TAHOE_IMMEDIATE_WORD;
1895 md_number_to_chars (p, this_add_number, 2);
1896 break;
1897 case 4:
1898 *p++ = TAHOE_IMMEDIATE_LONGWORD;
1899 md_number_to_chars (p, this_add_number, 4);
1900 break;
1904 break;
1906 /* Distance from the PC. If the size isn't known, we have to relax
1907 into it. The difference between this and disp(sp) is that
1908 this offset is pc_rel, and disp(sp) isn't.
1909 Note the drop through code. */
1911 case TAHOE_DISPLACED_RELATIVE:
1912 case TAHOE_DISP_REL_DEFERRED:
1913 operandP->top_reg = PC_REG;
1914 pc_rel = 1;
1916 /* Register, plus a displacement mode. Save the register number,
1917 and weather its deffered or not, and relax the size if it isn't
1918 known. */
1919 case TAHOE_REG_DISP:
1920 case TAHOE_REG_DISP_DEFERRED:
1921 if (operandP->top_mode == TAHOE_DISP_REL_DEFERRED ||
1922 operandP->top_mode == TAHOE_REG_DISP_DEFERRED)
1923 operandP->top_reg += 0x10; /* deffered mode is always 0x10 higher
1924 than it's non-deffered sibling. */
1926 /* Is this a value out of this segment?
1927 The first part of this conditional is a cludge to make gas
1928 produce the same output as 'as' when there is a lable, in
1929 the current segment, displaceing a register. It's strange,
1930 and no one in their right mind would do it, but it's easy
1931 to cludge. */
1932 if ((dispsize == 0 && !pc_rel) ||
1933 (to_seg != now_seg && !is_undefined && to_seg != SEG_ABSOLUTE))
1934 dispsize = 4;
1936 if (dispsize == 0)
1939 * We have a SEG_UNKNOWN symbol, or the size isn't cast.
1940 * It might turn out to be in the same segment as
1941 * the instruction, permitting relaxation.
1943 p = frag_var (rs_machine_dependent, 5, 2,
1944 ENCODE_RELAX (STATE_PC_RELATIVE,
1945 is_undefined ? STATE_UNDF : STATE_BYTE),
1946 this_add_symbol, this_add_number, 0);
1947 *p = operandP->top_reg;
1949 else
1951 /* Either this is an abs, or a cast. */
1952 p = frag_more (dispsize + 1);
1953 switch (dispsize)
1955 case 1:
1956 *p = TAHOE_PC_OR_BYTE + operandP->top_reg;
1957 break;
1958 case 2:
1959 *p = TAHOE_PC_OR_WORD + operandP->top_reg;
1960 break;
1961 case 4:
1962 *p = TAHOE_PC_OR_LONG + operandP->top_reg;
1963 break;
1965 fix_new (frag_now, p + 1 - frag_now->fr_literal,
1966 this_add_symbol, this_add_number,
1967 size_to_fx (dispsize, pc_rel), NULL);
1969 break;
1970 default:
1971 as_fatal (_("Barf, bad mode %x\n"), operandP->top_mode);
1974 } /* for(operandP) */
1975 } /* if(!need_pass_2 && !goofed) */
1976 } /* tahoe_assemble() */
1979 /* We have no need to default values of symbols. */
1981 /* ARGSUSED */
1982 symbolS *
1983 md_undefined_symbol (name)
1984 char *name;
1986 return 0;
1987 } /* md_undefined_symbol() */
1989 /* Round up a section size to the appropriate boundary. */
1990 valueT
1991 md_section_align (segment, size)
1992 segT segment;
1993 valueT size;
1995 return ((size + 7) & ~7); /* Round all sects to multiple of 8 */
1996 } /* md_section_align() */
1998 /* Exactly what point is a PC-relative offset relative TO?
1999 On the sparc, they're relative to the address of the offset, plus
2000 its size. This gets us to the following instruction.
2001 (??? Is this right? FIXME-SOON) */
2002 long
2003 md_pcrel_from (fixP)
2004 fixS *fixP;
2006 return (((fixP->fx_type == FX_8
2007 || fixP->fx_type == FX_PCREL8)
2009 : ((fixP->fx_type == FX_16
2010 || fixP->fx_type == FX_PCREL16)
2012 : ((fixP->fx_type == FX_32
2013 || fixP->fx_type == FX_PCREL32)
2015 : 0))) + fixP->fx_where + fixP->fx_frag->fr_address);
2016 } /* md_pcrel_from() */
2018 int
2019 tc_is_pcrel (fixP)
2020 fixS *fixP;
2022 /* should never be called */
2023 know (0);
2024 return (0);
2025 } /* tc_is_pcrel() */
2027 /* end of tc-tahoe.c */