]> Git Repo - binutils.git/blob - gas/config/tc-tahoe.c
* libelf.h (relocate_section): New argument "output_names" added
[binutils.git] / gas / config / tc-tahoe.c
1 /* tc-tahoe.c
2    Not part of GAS yet. */
3
4 #include "as.h"
5 #include "obstack.h"
6
7 /* this bit glommed from tahoe-inst.h */
8
9 typedef unsigned char byte;
10 typedef byte tahoe_opcodeT;
11
12 /*
13  * This is part of tahoe-ins-parse.c & friends.
14  * We want to parse a tahoe instruction text into a tree defined here.
15  */
16
17 #define TIT_MAX_OPERANDS (4)    /* maximum number of operands in one
18                                    single tahoe instruction */
19
20 struct top                      /* tahoe instruction operand */
21 {
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. */
26
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?-:!" */
30
31   char *top_error;              /* Say if operand is inappropriate         */
32
33   segT seg_of_operand;          /* segment as returned by expression()*/
34
35   expressionS exp_of_operand;   /* The expression as parsed by expression()*/
36
37   byte top_dispsize;            /* Number of bytes in the displacement if we
38                                    can figure it out */
39 };
40
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)
45
46 #define TAHOE_REG_DISP (0xE0)
47 #define TAHOE_REG_DISP_DEFERRED (0xF0)
48
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)
54
55 #define TAHOE_DISPLACED_RELATIVE (0xEF)
56 #define TAHOE_DISP_REL_DEFERRED (0xFF)
57
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] */
62
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 ':'
69
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)
81
82 struct tit                      /* get it out of the sewer, it stands for
83                                    tahoe instruction tree (Geeze!) */
84 {
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 */
89 };
90
91 /* end: tahoe-inst.h */
92
93 /* tahoe.c - tahoe-specific -
94    Not part of gas yet.
95    */
96
97 #include "opcode/tahoe.h"
98
99 /* This is the number to put at the beginning of the a.out file */
100 long omagic = OMAGIC;
101
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[] = "#;";
105
106 /* These chars only start a comment at the beginning of a line. */
107 const char line_comment_chars[] = "#";
108
109 /* Chars that can be used to separate mant from exp in floating point nums */
110 const char EXP_CHARS[] = "eE";
111
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";
118
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.)
123    */
124
125 static struct tit t;            /* A tahoe instruction after decoding. */
126
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. */
130
131 const pseudo_typeS md_pseudo_table[] =
132 {
133   {"dfloat", float_cons, 'd'},
134   {"ffloat", float_cons, 'f'},
135   {0}
136 };
137 \f
138 /*
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:
143  *
144  *                  4       3       2       1       0        bit number
145  *      ---/ /--+-------+-------+-------+-------+-------+
146  *              |     what state ?      |  how long ?   |
147  *      ---/ /--+-------+-------+-------+-------+-------+
148  *
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.
155  *
156
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.
166
167         
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.
186
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
195
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.
207
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.
211
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.) */
215 \f
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))
221
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.] */
229
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)
235
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)
241
242 #define STATE_BYTE                      (0)
243 #define STATE_WORD                      (1)
244 #define STATE_LONG                      (2)
245 #define STATE_UNDF                      (3)     /* Symbol undefined in pass1 */
246
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
251   md_relax_table[] =
252 {
253   {
254     1, 1, 0, 0
255   },                            /* error sentinel   0,0 */
256   {
257     1, 1, 0, 0
258   },                            /* unused           0,1 */
259   {
260     1, 1, 0, 0
261   },                            /* unused           0,2 */
262   {
263     1, 1, 0, 0
264   },                            /* unused           0,3 */
265 /* Unconditional branch cases "jrb"
266      The relax part is the actual displacement */
267   {
268     BF, BB, 1, C (1, 1)
269   },                            /* brb B`foo        1,0 */
270   {
271     WF, WB, 2, C (1, 2)
272   },                            /* brw W`foo        1,1 */
273   {
274     0, 0, 5, 0
275   },                            /* Jmp L`foo        1,2 */
276   {
277     1, 1, 0, 0
278   },                            /* unused           1,3 */
279 /* Reversible Conditional Branch. If the branch won't reach, reverse
280      it, and jump over a brw or a jmp that will reach. The relax part is the
281      actual address. */
282   {
283     BF, BB, 1, C (2, 1)
284   },                            /* b<cond> B`foo    2,0 */
285   {
286     WF + 2, WB + 2, 4, C (2, 2)
287   },                            /* brev over, brw W`foo, over: 2,1 */
288   {
289     0, 0, 7, 0
290   },                            /* brev over, jmp L`foo, over: 2,2 */
291   {
292     1, 1, 0, 0
293   },                            /* unused           2,3 */
294 /* Another type of reversable branch. But this only has a word
295      displacement. */
296   {
297     1, 1, 0, 0
298   },                            /* unused           3,0 */
299   {
300     WF, WB, 2, C (3, 2)
301   },                            /* jbX W`foo        3,1 */
302   {
303     0, 0, 8, 0
304   },                            /* jrevX over, jmp L`foo, over:  3,2 */
305   {
306     1, 1, 0, 0
307   },                            /* unused           3,3 */
308 /* These are the non reversable branches, all of which have a word
309      displacement. If I can't reach, branch over a byte branch, to a
310      jump that will reach. The jumped branch jumps over the reaching
311      branch, to continue with the flow of the program. It's like playing
312      leap frog. */
313   {
314     1, 1, 0, 0
315   },                            /* unused           4,0 */
316   {
317     WF, WB, 2, C (4, 2)
318   },                            /* aobl_ W`foo      4,1 */
319   {
320     0, 0, 10, 0
321   },                            /*aobl_ W`hop,br over,hop: jmp L^foo,over 4,2*/
322   {
323     1, 1, 0, 0
324   },                            /* unused           4,3 */
325 /* Normal displacement mode, no jumping or anything like that.
326      The relax points to one byte before the address, thats why all
327      the numbers are up by one. */
328   {
329     BF + 1, BB + 1, 2, C (5, 1)
330   },                            /* B^"foo"          5,0 */
331   {
332     WF + 1, WB + 1, 3, C (5, 2)
333   },                            /* W^"foo"          5,1 */
334   {
335     0, 0, 5, 0
336   },                            /* L^"foo"          5,2 */
337   {
338     1, 1, 0, 0
339   },                            /* unused           5,3 */
340 };
341
342 #undef C
343 #undef BF
344 #undef BB
345 #undef WF
346 #undef WB
347 /* End relax stuff */
348 \f
349 /* Handle of the OPCODE hash table.  NULL means any use before
350    md_begin() will crash.  */
351 static struct hash_control *op_hash;
352
353 /* Init function. Build the hash table. */
354 void
355 md_begin ()
356 {
357   struct tot *tP;
358   char *errorval = 0;
359   int synthetic_too = 1;        /* If 0, just use real opcodes. */
360
361   op_hash = hash_new ();
362
363   for (tP = totstrs; *tP->name && !errorval; tP++)
364     errorval = hash_insert (op_hash, tP->name, &tP->detail);
365
366   if (synthetic_too)
367     for (tP = synthetic_totstrs; *tP->name && !errorval; tP++)
368       errorval = hash_insert (op_hash, tP->name, &tP->detail);
369
370   if (errorval)
371     as_fatal (errorval);
372 }
373 \f
374 CONST char *md_shortopts = "ad:STt:V";
375 struct option md_longopts[] = {
376   {NULL, no_argument, NULL, 0}
377 };
378 size_t md_longopts_size = sizeof(md_longopts);
379
380 int
381 md_parse_option (c, arg)
382      int c;
383      char *arg;
384 {
385   switch (c)
386     {
387     case 'a':
388       as_warn ("The -a option doesn't exist. (Despite what the man page says!");
389       break;
390
391     case 'd':
392       as_warn ("Displacement length %s ignored!", arg);
393       break;
394
395     case 'S':
396       as_warn ("SYMBOL TABLE not implemented");
397       break;
398
399     case 'T':
400       as_warn ("TOKEN TRACE not implemented");
401       break;
402
403     case 't':
404       as_warn ("I don't need or use temp. file \"%s\".", arg);
405       break;
406
407     case 'V':
408       as_warn ("I don't use an interpass file! -V ignored");
409       break;
410
411     default:
412       return 0;
413     }
414
415   return 1;
416 }
417
418 void
419 md_show_usage (stream)
420      FILE *stream;
421 {
422   fprintf(stream, "\
423 Tahoe options:\n\
424 -a                      ignored\n\
425 -d LENGTH               ignored\n\
426 -J                      ignored\n\
427 -S                      ignored\n\
428 -t FILE                 ignored\n\
429 -T                      ignored\n\
430 -V                      ignored\n");
431 }
432 \f
433 /* The functions in this section take numbers in the machine format, and
434    munges them into Tahoe byte order.
435    They exist primarily for cross assembly purpose. */
436 void                            /* Knows about order of bytes in address. */
437 md_number_to_chars (con, value, nbytes)
438      char con[];                /* Return 'nbytes' of chars here. */
439      valueT value;              /* The value of the bits. */
440      int nbytes;                /* Number of bytes in the output. */
441 {
442   number_to_chars_bigendian (con, value, nbytes);
443 }
444
445 #ifdef comment
446 void                            /* Knows about order of bytes in address. */
447 md_number_to_imm (con, value, nbytes)
448      char con[];                /* Return 'nbytes' of chars here. */
449      long int value;            /* The value of the bits. */
450      int nbytes;                /* Number of bytes in the output. */
451 {
452   md_number_to_chars (con, value, nbytes);
453 }
454
455 #endif /* comment */
456
457 void
458 tc_apply_fix (fixP, val)
459      fixS *fixP;
460      long val;
461 {
462   /* should never be called */
463   know (0);
464 }
465
466 void                            /* Knows about order of bytes in address. */
467 md_number_to_disp (con, value, nbytes)
468      char con[];                /* Return 'nbytes' of chars here. */
469      long int value;            /* The value of the bits. */
470      int nbytes;                /* Number of bytes in the output. */
471 {
472   md_number_to_chars (con, value, nbytes);
473 }
474
475 void                            /* Knows about order of bytes in address. */
476 md_number_to_field (con, value, nbytes)
477      char con[];                /* Return 'nbytes' of chars here. */
478      long int value;            /* The value of the bits. */
479      int nbytes;                /* Number of bytes in the output. */
480 {
481   md_number_to_chars (con, value, nbytes);
482 }
483
484 /* Put the bits in an order that a tahoe will understand, despite the ordering
485    of the native machine.
486    On Tahoe: first 4 bytes are normal unsigned big endian long,
487    next three bytes are symbolnum, in kind of 3 byte big endian (least sig. byte last).
488    The last byte is broken up with bit 7 as pcrel,
489         bits 6 & 5 as length,
490         bit 4 as extern and the last nibble as 'undefined'. */
491
492 #if comment
493 void
494 md_ri_to_chars (ri_p, ri)
495      struct relocation_info *ri_p, ri;
496 {
497   byte the_bytes[sizeof (struct relocation_info)];
498   /* The reason I can't just encode these directly into ri_p is that
499      ri_p may point to ri. */
500
501   /* This is easy */
502   md_number_to_chars (the_bytes, ri.r_address, sizeof (ri.r_address));
503
504   /* now the fun stuff */
505   the_bytes[4] = (ri.r_symbolnum >> 16) & 0x0ff;
506   the_bytes[5] = (ri.r_symbolnum >> 8) & 0x0ff;
507   the_bytes[6] = ri.r_symbolnum & 0x0ff;
508   the_bytes[7] = (((ri.r_extern << 4) & 0x10) | ((ri.r_length << 5) & 0x60) |
509                   ((ri.r_pcrel << 7) & 0x80)) & 0xf0;
510
511   bcopy (the_bytes, (char *) ri_p, sizeof (struct relocation_info));
512 }
513
514 #endif /* comment */
515
516 /* Put the bits in an order that a tahoe will understand, despite the ordering
517    of the native machine.
518    On Tahoe: first 4 bytes are normal unsigned big endian long,
519    next three bytes are symbolnum, in kind of 3 byte big endian (least sig. byte last).
520    The last byte is broken up with bit 7 as pcrel,
521         bits 6 & 5 as length,
522         bit 4 as extern and the last nibble as 'undefined'. */
523
524 void 
525 tc_aout_fix_to_chars (where, fixP, segment_address_in_file)
526      char *where;
527      fixS *fixP;
528      relax_addressT segment_address_in_file;
529 {
530   long r_symbolnum;
531
532   know (fixP->fx_addsy != NULL);
533
534   md_number_to_chars (where,
535        fixP->fx_frag->fr_address + fixP->fx_where - segment_address_in_file,
536                       4);
537
538   r_symbolnum = (S_IS_DEFINED (fixP->fx_addsy)
539                  ? S_GET_TYPE (fixP->fx_addsy)
540                  : fixP->fx_addsy->sy_number);
541
542   where[4] = (r_symbolnum >> 16) & 0x0ff;
543   where[5] = (r_symbolnum >> 8) & 0x0ff;
544   where[6] = r_symbolnum & 0x0ff;
545   where[7] = (((is_pcrel (fixP) << 7) & 0x80)
546               | ((((fixP->fx_type == FX_8 || fixP->fx_type == FX_PCREL8
547                     ? 0
548                     : (fixP->fx_type == FX_16 || fixP->fx_type == FX_PCREL16
549                        ? 1
550                     : (fixP->fx_type == FX_32 || fixP->fx_type == FX_PCREL32
551                        ? 2
552                        : 42)))) << 5) & 0x60)
553               | ((!S_IS_DEFINED (fixP->fx_addsy) << 4) & 0x10));
554 }
555
556 /* Relocate byte stuff */
557 \f
558 /* This is for broken word. */
559 const int md_short_jump_size = 3;
560
561 void
562 md_create_short_jump (ptr, from_addr, to_addr, frag, to_symbol)
563      char *ptr;
564      addressT from_addr, to_addr;
565      fragS *frag;
566      symbolS *to_symbol;
567 {
568   valueT offset;
569
570   offset = to_addr - (from_addr + 1);
571   *ptr++ = TAHOE_BRW;
572   md_number_to_chars (ptr, offset, 2);
573 }
574
575 const int md_long_jump_size = 6;
576 const int md_reloc_size = 8;    /* Size of relocation record */
577
578 void
579 md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol)
580      char *ptr;
581      addressT from_addr, to_addr;
582      fragS *frag;
583      symbolS *to_symbol;
584 {
585   valueT offset;
586
587   offset = to_addr - (from_addr + 4);
588   *ptr++ = TAHOE_JMP;
589   *ptr++ = TAHOE_PC_REL_LONG;
590   md_number_to_chars (ptr, offset, 4);
591 }
592 \f
593 /*
594  *                      md_estimate_size_before_relax()
595  *
596  * Called just before relax().
597  * Any symbol that is now undefined will not become defined, so we assumed
598  * that it will be resolved by the linker.
599  * Return the correct fr_subtype in the frag, for relax()
600  * Return the initial "guess for fr_var" to caller. (How big I think this
601  * will be.)
602  * The guess for fr_var is ACTUALLY the growth beyond fr_fix.
603  * Whatever we do to grow fr_fix or fr_var contributes to our returned value.
604  * Although it may not be explicit in the frag, pretend fr_var starts with a
605  * 0 value.
606  */
607 int
608 md_estimate_size_before_relax (fragP, segment_type)
609      register fragS *fragP;
610      segT segment_type;         /* N_DATA or N_TEXT. */
611 {
612   register char *p;
613   register int old_fr_fix;
614   /*  int pc_rel; FIXME: remove this */
615
616   old_fr_fix = fragP->fr_fix;
617   switch (fragP->fr_subtype)
618     {
619     case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_UNDF):
620       if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
621         {
622           /* The symbol was in the same segment as the opcode, and it's
623          a real pc_rel case so it's a relaxable case. */
624           fragP->fr_subtype = ENCODE_RELAX (STATE_PC_RELATIVE, STATE_BYTE);
625         }
626       else
627         {
628           /* This case is still undefined, so asume it's a long word for the
629          linker to fix. */
630           p = fragP->fr_literal + old_fr_fix;
631           *p |= TAHOE_PC_OR_LONG;
632           /* We now know how big it will be, one long word. */
633           fragP->fr_fix += 1 + 4;
634           fix_new (fragP, old_fr_fix + 1, fragP->fr_symbol,
635                    fragP->fr_offset, FX_PCREL32, NULL);
636           frag_wane (fragP);
637         }
638       break;
639
640     case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_UNDF):
641       if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
642         {
643           fragP->fr_subtype = ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_BYTE);
644         }
645       else
646         {
647           p = fragP->fr_literal + old_fr_fix;
648           *fragP->fr_opcode ^= 0x10;    /* Reverse sense of branch. */
649           *p++ = 6;
650           *p++ = TAHOE_JMP;
651           *p++ = TAHOE_PC_REL_LONG;
652           fragP->fr_fix += 1 + 1 + 1 + 4;
653           fix_new (fragP, old_fr_fix + 3, fragP->fr_symbol,
654                    fragP->fr_offset, FX_PCREL32, NULL);
655           frag_wane (fragP);
656         }
657       break;
658
659     case ENCODE_RELAX (STATE_BIG_REV_BRANCH, STATE_UNDF):
660       if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
661         {
662           fragP->fr_subtype =
663             ENCODE_RELAX (STATE_BIG_REV_BRANCH, STATE_WORD);
664         }
665       else
666         {
667           p = fragP->fr_literal + old_fr_fix;
668           *fragP->fr_opcode ^= 0x10;    /* Reverse sense of branch. */
669           *p++ = 0;
670           *p++ = 6;
671           *p++ = TAHOE_JMP;
672           *p++ = TAHOE_PC_REL_LONG;
673           fragP->fr_fix += 2 + 2 + 4;
674           fix_new (fragP, old_fr_fix + 4, fragP->fr_symbol,
675                    fragP->fr_offset, FX_PCREL32, NULL);
676           frag_wane (fragP);
677         }
678       break;
679
680     case ENCODE_RELAX (STATE_BIG_NON_REV_BRANCH, STATE_UNDF):
681       if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
682         {
683           fragP->fr_subtype = ENCODE_RELAX (STATE_BIG_NON_REV_BRANCH, STATE_WORD);
684         }
685       else
686         {
687           p = fragP->fr_literal + old_fr_fix;
688           *p++ = 2;
689           *p++ = 0;
690           *p++ = TAHOE_BRB;
691           *p++ = 6;
692           *p++ = TAHOE_JMP;
693           *p++ = TAHOE_PC_REL_LONG;
694           fragP->fr_fix += 2 + 2 + 2 + 4;
695           fix_new (fragP, old_fr_fix + 6, fragP->fr_symbol,
696                    fragP->fr_offset, FX_PCREL32, NULL);
697           frag_wane (fragP);
698         }
699       break;
700
701     case ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_UNDF):
702       if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
703         {
704           fragP->fr_subtype = ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_BYTE);
705         }
706       else
707         {
708           p = fragP->fr_literal + old_fr_fix;
709           *fragP->fr_opcode = TAHOE_JMP;
710           *p++ = TAHOE_PC_REL_LONG;
711           fragP->fr_fix += 1 + 4;
712           fix_new (fragP, old_fr_fix + 1, fragP->fr_symbol,
713                    fragP->fr_offset, FX_PCREL32, NULL);
714           frag_wane (fragP);
715         }
716       break;
717
718     default:
719       break;
720     }
721   return (fragP->fr_var + fragP->fr_fix - old_fr_fix);
722 }                               /* md_estimate_size_before_relax() */
723 \f
724 /*
725  *                      md_convert_frag();
726  *
727  * Called after relax() is finished.
728  * In:  Address of frag.
729  *      fr_type == rs_machine_dependent.
730  *      fr_subtype is what the address relaxed to.
731  *
732  * Out: Any fixSs and constants are set up.
733  *      Caller will turn frag into a ".space 0".
734  */
735 void
736 md_convert_frag (headers, fragP)
737      object_headers *headers;
738      register fragS *fragP;
739 {
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? */
751
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)
763     {
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;
772
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;
779
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;
786
787     case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_BYTE):
788       *addressP = target_address - (address_of_var + 1);
789       extension = 1;
790       break;
791
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;
799
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;
808
809     case ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_BYTE):
810       *addressP = target_address - (address_of_var + 1);
811       extension = 1;
812       break;
813
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;
819
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;
826
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;
831
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;
841
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;
846
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;
857
858     default:
859       BAD_CASE (fragP->fr_subtype);
860       break;
861     }
862   fragP->fr_fix += extension;
863 }                               /* md_convert_frag */
864 \f
865
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
871
872 /*
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.
882  *
883  * Valid registers are R1-R15, %1-%15, FP (13), SP (14), PC (15)
884  * Case doesn't matter.
885  */
886 int
887 tahoe_reg_parse (start)
888      char **start;              /* A pointer to the string to parse. */
889 {
890   register char *regpoint = *start;
891   register int regnum = -1;
892
893   switch (*regpoint++)
894     {
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))
900         {
901           /* Got the first digit. */
902           regnum = *regpoint++ - '0';
903           if ((regnum == 1) && isdigit (*regpoint))
904             {
905               /* Its a two digit number. */
906               regnum = 10 + (*regpoint++ - '0');
907               if (regnum > BIGGESTREG)
908                 {               /* Number too big? */
909                   regnum = -1;
910                 }
911             }
912         }
913       break;
914     case 'F':                   /* Is it the FP */
915     case 'f':
916       switch (*regpoint++)
917         {
918         case 'p':
919         case 'P':
920           regnum = FP_REG;
921         }
922       break;
923     case 's':                   /* How about the SP */
924     case 'S':
925       switch (*regpoint++)
926         {
927         case 'p':
928         case 'P':
929           regnum = SP_REG;
930         }
931       break;
932     case 'p':                   /* OR the PC even */
933     case 'P':
934       switch (*regpoint++)
935         {
936         case 'c':
937         case 'C':
938           regnum = PC_REG;
939         }
940       break;
941     }
942
943   if (regnum != -1)
944     {                           /* No error, so move string pointer */
945       *start = regpoint;
946     }
947   return regnum;                /* Return results */
948 }                               /* tahoe_reg_parse */
949 \f
950 /*
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.
963  *
964  * Sperry defines the semantics of address modes (and values)
965  * by a two-letter code, explained here.
966  *
967  *   letter 1:   access type
968  *
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
975  *
976  *   letter 2:   data type (i.e. width, alignment)
977  *
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
986  *
987  * The '-?!:' letter 2's are not for external consumption. They are used
988  * by GAS for psuedo ops relaxing code.
989  *
990  * After parsing topP has:
991  *
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.
1002  *
1003  * Need syntax checks built.
1004  */
1005
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 */
1012
1013 {
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 */
1030
1031   char *tp, *temp, c;           /* Temporary holders */
1032
1033   char access = topP->top_access;       /* Save on a deref. */
1034   char width = topP->top_width;
1035
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 */
1039
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)));
1045
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++;
1052     }
1053
1054   /* Force words into a certain mode */
1055   /* Bitch, Bitch, Bitch! */
1056   /*
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.
1063    */
1064
1065   if (*point != '\0' && ((point[1] == '^') || (point[1] == '`')))
1066     switch (*point)
1067       {
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
1077           {
1078             c = (isupper (*point) ? tolower (*point) : *point);
1079             call_width = ((c == 'b') ? 1 :
1080                           ((c == 'w') ? 2 : 4));
1081           }
1082         point += 2;
1083         break;
1084       }
1085
1086   /* Setting immediate mode */
1087   if (*point == '$')
1088     {
1089       immediate = 1;
1090       point++;
1091     }
1092
1093   /*
1094    * I've pulled off all the easy stuff off the front, move to the end and
1095    * yank.
1096    */
1097
1098   for (end = point; *end != '\0'; end++)        /* Move to the end. */
1099     ;
1100
1101   if (end != point)             /* Null string? */
1102     end--;
1103
1104   if (end > point && *end == ' ' && end[-1] != '\'')
1105     end--;                      /* Hop white space */
1106
1107   /* Is this an index reg. */
1108   if ((*end == ']') && (end[-1] != '\''))
1109     {
1110       temp = end;
1111
1112       /* Find opening brace. */
1113       for (--end; (*end != '[' && end != point); end--)
1114         ;
1115
1116       /* If I found the opening brace, get the index register number. */
1117       if (*end == '[')
1118         {
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;
1124             }
1125           else
1126             {
1127               end--;            /* Found it, move past brace. */
1128             }
1129           if (ndx == -1)
1130             {
1131               op_bad = "Couldn't parse the [index] in this operand.";
1132               end = point;      /* Force all the rest of the tests to fail. */
1133             }
1134         }
1135       else
1136         {
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. */
1139         }
1140     }
1141
1142   /* Post increment? */
1143   if (*end == '+')
1144     {
1145       dec_inc = '+';
1146       /* was:    *end--; */
1147       end--;
1148     }
1149
1150   /* register in parens? */
1151   if ((*end == ')') && (end[-1] != '\''))
1152     {
1153       temp = end;
1154
1155       /* Find opening paren. */
1156       for (--end; (*end != '(' && end != point); end--)
1157         ;
1158
1159       /* If I found the opening paren, get the register number. */
1160       if (*end == '(')
1161         {
1162           tp = end + 1;
1163           reg = tahoe_reg_parse (&tp);
1164           if (tp != temp)
1165             {
1166               /* Not a register, but could be part of the expression. */
1167               reg = -1;
1168               end = temp;       /* Rest the pointer back */
1169             }
1170           else
1171             {
1172               end--;            /* Found the reg. move before opening paren. */
1173             }
1174         }
1175       else
1176         {
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. */
1179         }
1180     }
1181
1182   /* Pre decrement? */
1183   if (*end == '-')
1184     {
1185       if (dec_inc != ' ')
1186         {
1187           op_bad = "Operand can't be both pre-inc and post-dec.";
1188           end = point;
1189         }
1190       else
1191         {
1192           dec_inc = '-';
1193           /* was:      *end--; */
1194           end--;
1195         }
1196     }
1197
1198   /*
1199    * Everything between point and end is the 'expression', unless it's
1200    * a register name.
1201    */
1202
1203   c = end[1];
1204   end[1] = '\0';
1205
1206   tp = point;
1207   imreg = tahoe_reg_parse (&point);     /* Get the immediate register
1208                                       if it is there.*/
1209   if (*point != '\0')
1210     {
1211       /* If there is junk after point, then the it's not immediate reg. */
1212       point = tp;
1213       imreg = -1;
1214     }
1215
1216   if (imreg != -1 && reg != -1)
1217     op_bad = "I parsed 2 registers in this operand.";
1218
1219   /*
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!)
1223    */
1224
1225   if (*op_bad == '\0')
1226     {
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)
1232         {
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);
1252
1253         case O_symbol:
1254           break;
1255
1256         default:
1257           /*
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.
1265            */
1266           need_pass_2 = 1;
1267           op_bad = "Can't relocate expression error.";
1268           break;
1269
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;
1276         }
1277       if (*input_line_pointer != '\0')
1278         {
1279           op_bad = "Junk at end of expression.";
1280         }
1281     }
1282
1283   end[1] = c;
1284
1285   /* I'm done, so restore optex */
1286   *optex = segfault;
1287
1288
1289   /*
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
1305    */
1306   /* Is there a displacement size? */
1307   disp_size = (call_width ? call_width :
1308                (com_width ? com_width :
1309                 abs_width ? abs_width : 0));
1310
1311   if (*op_bad == '\0')
1312     {
1313       if (imreg != -1)
1314         {
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.";
1333
1334           if (*op_bad == '\0')
1335             {
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.");
1339
1340               reg = imreg;
1341             }
1342
1343           /* We know: imm = -1 */
1344         }
1345       else if (dec_inc == '-')
1346         {
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.";
1361
1362           /* We know: imm = -1, dec_inc != '-' */
1363         }
1364       else if (dec_inc == '+')
1365         {
1366           if (immediate || !really_none)
1367             op_bad = "Syntax error in one of the auto-inc modes.";
1368           else if (deferred)
1369             {
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.";
1378             }
1379           else
1380             {
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.";
1393             }
1394
1395           /* We know: imm = -1, dec_inc == ' ' */
1396         }
1397       else if (reg != -1)
1398         {
1399           if ((ndx != -1) && (reg == SP_REG))
1400             op_bad = "You can't index the sp register.";
1401           if (deferred)
1402             {
1403               /* *<disp>(Rn) */
1404               mode = TAHOE_REG_DISP_DEFERRED;
1405               if (immediate)
1406                 op_bad = "Syntax error in register displaced mode.";
1407             }
1408           else if (really_none)
1409             {
1410               /* (Rn) */
1411               mode = TAHOE_REG_DEFERRED;
1412               /* if reg = SP then cant be indexed */
1413             }
1414           else
1415             {
1416               /* <disp>(Rn) */
1417               mode = TAHOE_REG_DISP;
1418             }
1419
1420           /* We know: imm = -1, dec_inc == ' ', Reg = -1 */
1421         }
1422       else
1423         {
1424           if (really_none)
1425             op_bad = "An offest is needed for this operand.";
1426           if (deferred && immediate)
1427             {
1428               /* *$<ADDR> */
1429               mode = TAHOE_ABSOLUTE_ADDR;
1430               disp_size = 4;
1431             }
1432           else if (immediate)
1433             {
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. */
1441             }
1442           else if (deferred)
1443             {
1444               /* *<disp> */
1445               mode = TAHOE_DISP_REL_DEFERRED;
1446             }
1447           else
1448             {
1449               /* <disp> */
1450               mode = TAHOE_DISPLACED_RELATIVE;
1451             }
1452         }
1453     }
1454
1455   /*
1456    * At this point, all the errors we can do have be checked for.
1457    * We can build the 'top'. */
1458
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 */
1465 \f
1466 /*
1467  *                  t i p ( )
1468  *
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.
1475  *
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.
1478  *
1479  */
1480
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. */
1485 {
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;
1495
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)
1504     {
1505       titP->tit_error = "No operator";
1506       count = 0;
1507       titP->tit_opcode = 0;
1508     }
1509   else
1510     {
1511       c = *p;
1512       *p = '\0';
1513       /*
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.
1517      */
1518       twP = (struct tot_wot *) hash_find (op_hash, instring);
1519       *p = c;                   /* Restore char after op-code. */
1520       if (twP == 0)
1521         {
1522           titP->tit_error = "Unknown operator";
1523           count = 0;
1524           titP->tit_opcode = 0;
1525         }
1526       else
1527         {
1528           /*
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.
1534        */
1535
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)
1544             {
1545               /*
1546          * Here to parse one operand. Leave instring pointing just
1547          * past any one ',' that marks the end of this operand.
1548          */
1549               if (!p[1])
1550                 as_fatal ("Compiler bug: ODD number of bytes in arg structure %s.",
1551                           twP->args);
1552               else if (*instring)
1553                 {
1554                   for (q = instring; (*q != ',' && *q != '\0'); q++)
1555                     {
1556                       if (*q == '\'' && q[1] != '\0')   /* Jump quoted characters */
1557                         q++;
1558                     }
1559                   c = *q;
1560                   /*
1561            * Q points to ',' or '\0' that ends argument. C is that
1562            * character.
1563            */
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))
1570                     {
1571                       alloperr = operandp->top_error;
1572                     }
1573                   instring = q + (c ? 1 : 0);   /* next operand (if any) */
1574                   count++;      /*  won another argument, may have an operr */
1575                 }
1576               else
1577                 alloperr = "Not enough operands";
1578             }
1579           /* Restore the pointer. */
1580           input_line_pointer = save_input_line_pointer;
1581
1582           if (!*alloperr)
1583             {
1584               if (*instring == ' ')
1585                 instring++;     /* Skip whitespace. */
1586               if (*instring)
1587                 alloperr = "Too many operands";
1588             }
1589           titP->tit_error = alloperr;
1590         }
1591     }
1592
1593   titP->tit_opcode = twP->code; /* The op-code. */
1594   titP->tit_operands = count;
1595 }                               /* tip */
1596 \f
1597 /* md_assemble() emit frags for 1 instruction */
1598 void
1599 md_assemble (instruction_string)
1600      char *instruction_string;  /* A string: assemble 1 instruction. */
1601 {
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 */
1609
1610   /* These refer to an instruction operand expression. */
1611   segT to_seg;                  /* Target segment of the address.        */
1612
1613   register valueT this_add_number;
1614   register struct symbol *this_add_symbol;      /* +ve (minuend) symbol. */
1615
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. */
1619
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? */
1625
1626   /* Decode the operand. */
1627   tip (&t, instruction_string);
1628
1629   /*
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.
1635    */
1636   if (*t.tit_error)
1637     {
1638       as_warn ("Ignoring statement due to \"%s\"", t.tit_error);
1639     }
1640   else
1641     {
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)
1654             {
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) */
1659
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')
1676             {
1677               /* Branches must be expressions. A psuedo branch can also jump to
1678            an absolute address. */
1679               if (to_seg == now_seg || is_undefined)
1680                 {
1681                   /* If is_undefined, then it might BECOME now_seg by relax time. */
1682                   if (dispsize)
1683                     {
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);
1691                     }
1692                   else
1693                     {
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)
1698                         {
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);
1735                         }
1736                     }
1737                 }
1738               else
1739                 {
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. */
1743
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. */
1748
1749                   switch (operandP->top_width)
1750                     {
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);
1769                       /*
1770              * Now (eg) BLEQ    1f
1771              *          JMP     foo
1772              *  1:
1773              */
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);
1799                       /*
1800              * Now (eg) ACBx    1f
1801              *          JMP     foo
1802              *  1:
1803              */
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);
1818                       /*
1819              * Now (eg) xOBxxx  1f
1820              *          BRB     2f
1821              *  1:      JMP     @#foo
1822              *  2:
1823              */
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;
1833                     }
1834                 }
1835             }
1836           else
1837             {
1838               /* It ain't a branch operand. */
1839               switch (operandP->top_mode)
1840                 {
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;
1848
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;
1855
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;
1864
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)
1869                     {
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);
1875                     }
1876                   else
1877                     {
1878                       /* It's a integer, and I know it's size. */
1879                       if ((unsigned) this_add_number < 0x40)
1880                         {
1881                           /* Will it fit in a literal? */
1882                           FRAG_APPEND_1_CHAR ((byte) this_add_number);
1883                         }
1884                       else
1885                         {
1886                           p = frag_more (dispsize + 1);
1887                           switch (dispsize)
1888                             {
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;
1901                             }
1902                         }
1903                     }
1904                   break;
1905
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. */
1910
1911                 case TAHOE_DISPLACED_RELATIVE:
1912                 case TAHOE_DISP_REL_DEFERRED:
1913                   operandP->top_reg = PC_REG;
1914                   pc_rel = 1;
1915
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. */
1925
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;
1935
1936                   if (dispsize == 0)
1937                     {
1938                       /*
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.
1942              */
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;
1948                     }
1949                   else
1950                     {
1951                       /* Either this is an abs, or a cast. */
1952                       p = frag_more (dispsize + 1);
1953                       switch (dispsize)
1954                         {
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;
1964                         };
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);
1968                     }
1969                   break;
1970                 default:
1971                   as_fatal ("Barf, bad mode %x\n", operandP->top_mode);
1972                 }
1973             }
1974         }                       /* for(operandP) */
1975     }                           /* if(!need_pass_2 && !goofed) */
1976 }                               /* tahoe_assemble() */
1977
1978
1979 /* We have no need to default values of symbols. */
1980
1981 /* ARGSUSED */
1982 symbolS *
1983 md_undefined_symbol (name)
1984      char *name;
1985 {
1986   return 0;
1987 }                               /* md_undefined_symbol() */
1988
1989 /* Parse an operand that is machine-specific.
1990    We just return without modifying the expression if we have nothing
1991    to do. */
1992
1993 /* ARGSUSED */
1994 void 
1995 md_operand (expressionP)
1996      expressionS *expressionP;
1997 {
1998 }                               /* md_operand() */
1999
2000 /* Round up a section size to the appropriate boundary. */
2001 valueT
2002 md_section_align (segment, size)
2003      segT segment;
2004      valueT size;
2005 {
2006   return ((size + 7) & ~7);     /* Round all sects to multiple of 8 */
2007 }                               /* md_section_align() */
2008
2009 /* Exactly what point is a PC-relative offset relative TO?
2010    On the sparc, they're relative to the address of the offset, plus
2011    its size.  This gets us to the following instruction.
2012    (??? Is this right?  FIXME-SOON) */
2013 long 
2014 md_pcrel_from (fixP)
2015      fixS *fixP;
2016 {
2017   return (((fixP->fx_type == FX_8
2018             || fixP->fx_type == FX_PCREL8)
2019            ? 1
2020            : ((fixP->fx_type == FX_16
2021                || fixP->fx_type == FX_PCREL16)
2022               ? 2
2023               : ((fixP->fx_type == FX_32
2024                   || fixP->fx_type == FX_PCREL32)
2025                  ? 4
2026                  : 0))) + fixP->fx_where + fixP->fx_frag->fr_address);
2027 }                               /* md_pcrel_from() */
2028
2029 int 
2030 tc_is_pcrel (fixP)
2031      fixS *fixP;
2032 {
2033   /* should never be called */
2034   know (0);
2035   return (0);
2036 }                               /* tc_is_pcrel() */
2037
2038 /* end of tc-tahoe.c */
This page took 0.147441 seconds and 4 git commands to generate.