write.c: Complain about .space or .org moving backwards.
[deliverable/binutils-gdb.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 md_relax_table[] =
251 {
252 {
253 1, 1, 0, 0
254 }, /* error sentinel 0,0 */
255 {
256 1, 1, 0, 0
257 }, /* unused 0,1 */
258 {
259 1, 1, 0, 0
260 }, /* unused 0,2 */
261 {
262 1, 1, 0, 0
263 }, /* unused 0,3 */
264 /* Unconditional branch cases "jrb"
265 The relax part is the actual displacement */
266 {
267 BF, BB, 1, C (1, 1)
268 }, /* brb B`foo 1,0 */
269 {
270 WF, WB, 2, C (1, 2)
271 }, /* brw W`foo 1,1 */
272 {
273 0, 0, 5, 0
274 }, /* Jmp L`foo 1,2 */
275 {
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. */
281 {
282 BF, BB, 1, C (2, 1)
283 }, /* b<cond> B`foo 2,0 */
284 {
285 WF + 2, WB + 2, 4, C (2, 2)
286 }, /* brev over, brw W`foo, over: 2,1 */
287 {
288 0, 0, 7, 0
289 }, /* brev over, jmp L`foo, over: 2,2 */
290 {
291 1, 1, 0, 0
292 }, /* unused 2,3 */
293 /* Another type of reversable branch. But this only has a word
294 displacement. */
295 {
296 1, 1, 0, 0
297 }, /* unused 3,0 */
298 {
299 WF, WB, 2, C (3, 2)
300 }, /* jbX W`foo 3,1 */
301 {
302 0, 0, 8, 0
303 }, /* jrevX over, jmp L`foo, over: 3,2 */
304 {
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. */
312 {
313 1, 1, 0, 0
314 }, /* unused 4,0 */
315 {
316 WF, WB, 2, C (4, 2)
317 }, /* aobl_ W`foo 4,1 */
318 {
319 0, 0, 10, 0
320 }, /*aobl_ W`hop,br over,hop: jmp L^foo,over 4,2*/
321 {
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. */
327 {
328 BF + 1, BB + 1, 2, C (5, 1)
329 }, /* B^"foo" 5,0 */
330 {
331 WF + 1, WB + 1, 3, C (5, 2)
332 }, /* W^"foo" 5,1 */
333 {
334 0, 0, 5, 0
335 }, /* L^"foo" 5,2 */
336 {
337 1, 1, 0, 0
338 }, /* unused 5,3 */
339 };
340
341 #undef C
342 #undef BF
343 #undef BB
344 #undef WF
345 #undef WB
346 /* End relax stuff */
347 \f
348 /* Handle of the OPCODE hash table. NULL means any use before
349 md_begin() will crash. */
350 static struct hash_control *op_hash;
351
352 /* Init function. Build the hash table. */
353 void
354 md_begin ()
355 {
356 struct tot *tP;
357 char *errorval = 0;
358 int synthetic_too = 1; /* If 0, just use real opcodes. */
359
360 op_hash = hash_new ();
361
362 for (tP = totstrs; *tP->name && !errorval; tP++)
363 errorval = hash_insert (op_hash, tP->name, &tP->detail);
364
365 if (synthetic_too)
366 for (tP = synthetic_totstrs; *tP->name && !errorval; tP++)
367 errorval = hash_insert (op_hash, tP->name, &tP->detail);
368
369 if (errorval)
370 as_fatal (errorval);
371 }
372 \f
373 CONST char *md_shortopts = "ad:STt:V";
374 struct option md_longopts[] = {
375 {NULL, no_argument, NULL, 0}
376 };
377 size_t md_longopts_size = sizeof(md_longopts);
378
379 int
380 md_parse_option (c, arg)
381 int c;
382 char *arg;
383 {
384 switch (c)
385 {
386 case 'a':
387 as_warn ("The -a option doesn't exist. (Despite what the man page says!");
388 break;
389
390 case 'd':
391 as_warn ("Displacement length %s ignored!", arg);
392 break;
393
394 case 'S':
395 as_warn ("SYMBOL TABLE not implemented");
396 break;
397
398 case 'T':
399 as_warn ("TOKEN TRACE not implemented");
400 break;
401
402 case 't':
403 as_warn ("I don't need or use temp. file \"%s\".", arg);
404 break;
405
406 case 'V':
407 as_warn ("I don't use an interpass file! -V ignored");
408 break;
409
410 default:
411 return 0;
412 }
413
414 return 1;
415 }
416
417 void
418 md_show_usage (stream)
419 FILE *stream;
420 {
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");
430 }
431 \f
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. */
440 {
441 number_to_chars_bigendian (con, value, nbytes);
442 }
443
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. */
450 {
451 md_number_to_chars (con, value, nbytes);
452 }
453
454 #endif /* comment */
455
456 void
457 tc_apply_fix (fixP, val)
458 fixS *fixP;
459 long val;
460 {
461 /* should never be called */
462 know (0);
463 }
464
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. */
470 {
471 md_number_to_chars (con, value, nbytes);
472 }
473
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. */
479 {
480 md_number_to_chars (con, value, nbytes);
481 }
482
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'. */
490
491 #if comment
492 void
493 md_ri_to_chars (ri_p, ri)
494 struct relocation_info *ri_p, ri;
495 {
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. */
499
500 /* This is easy */
501 md_number_to_chars (the_bytes, ri.r_address, sizeof (ri.r_address));
502
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;
509
510 bcopy (the_bytes, (char *) ri_p, sizeof (struct relocation_info));
511 }
512
513 #endif /* comment */
514
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'. */
522
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;
528 {
529 long r_symbolnum;
530
531 know (fixP->fx_addsy != NULL);
532
533 md_number_to_chars (where,
534 fixP->fx_frag->fr_address + fixP->fx_where - segment_address_in_file,
535 4);
536
537 r_symbolnum = (S_IS_DEFINED (fixP->fx_addsy)
538 ? S_GET_TYPE (fixP->fx_addsy)
539 : fixP->fx_addsy->sy_number);
540
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
546 ? 0
547 : (fixP->fx_type == FX_16 || fixP->fx_type == FX_PCREL16
548 ? 1
549 : (fixP->fx_type == FX_32 || fixP->fx_type == FX_PCREL32
550 ? 2
551 : 42)))) << 5) & 0x60)
552 | ((!S_IS_DEFINED (fixP->fx_addsy) << 4) & 0x10));
553 }
554
555 /* Relocate byte stuff */
556 \f
557 /* This is for broken word. */
558 const int md_short_jump_size = 3;
559
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;
566 {
567 valueT offset;
568
569 offset = to_addr - (from_addr + 1);
570 *ptr++ = TAHOE_BRW;
571 md_number_to_chars (ptr, offset, 2);
572 }
573
574 const int md_long_jump_size = 6;
575 const int md_reloc_size = 8; /* Size of relocation record */
576
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;
583 {
584 valueT offset;
585
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);
590 }
591 \f
592 /*
593 * md_estimate_size_before_relax()
594 *
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.
605 */
606 int
607 md_estimate_size_before_relax (fragP, segment_type)
608 register fragS *fragP;
609 segT segment_type; /* N_DATA or N_TEXT. */
610 {
611 register char *p;
612 register int old_fr_fix;
613 /* int pc_rel; FIXME: remove this */
614
615 old_fr_fix = fragP->fr_fix;
616 switch (fragP->fr_subtype)
617 {
618 case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_UNDF):
619 if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
620 {
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);
624 }
625 else
626 {
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);
636 }
637 break;
638
639 case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_UNDF):
640 if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
641 {
642 fragP->fr_subtype = ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_BYTE);
643 }
644 else
645 {
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);
655 }
656 break;
657
658 case ENCODE_RELAX (STATE_BIG_REV_BRANCH, STATE_UNDF):
659 if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
660 {
661 fragP->fr_subtype =
662 ENCODE_RELAX (STATE_BIG_REV_BRANCH, STATE_WORD);
663 }
664 else
665 {
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);
676 }
677 break;
678
679 case ENCODE_RELAX (STATE_BIG_NON_REV_BRANCH, STATE_UNDF):
680 if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
681 {
682 fragP->fr_subtype = ENCODE_RELAX (STATE_BIG_NON_REV_BRANCH, STATE_WORD);
683 }
684 else
685 {
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);
697 }
698 break;
699
700 case ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_UNDF):
701 if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
702 {
703 fragP->fr_subtype = ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_BYTE);
704 }
705 else
706 {
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);
714 }
715 break;
716
717 default:
718 break;
719 }
720 return (fragP->fr_var + fragP->fr_fix - old_fr_fix);
721 } /* md_estimate_size_before_relax() */
722 \f
723 /*
724 * md_convert_frag();
725 *
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.
730 *
731 * Out: Any fixSs and constants are set up.
732 * Caller will turn frag into a ".space 0".
733 */
734 void
735 md_convert_frag (headers, fragP)
736 object_headers *headers;
737 register fragS *fragP;
738 {
739 register char *addressP; /* -> _var to change. */
740 register char *opcodeP; /* -> opcode char(s) to change. */
741 register short int length_code; /* 2=long 1=word 0=byte */
742 register short int extension = 0; /* Size of relaxed address.
743 Added to fr_fix: incl. ALL var chars. */
744 register symbolS *symbolP;
745 register long int where;
746 register long int address_of_var;
747 /* Where, in file space, is _var of *fragP? */
748 register long int target_address;
749 /* Where, in file space, does addr point? */
750
751 know (fragP->fr_type == rs_machine_dependent);
752 length_code = RELAX_LENGTH (fragP->fr_subtype);
753 know (length_code >= 0 && length_code < 3);
754 where = fragP->fr_fix;
755 addressP = fragP->fr_literal + where;
756 opcodeP = fragP->fr_opcode;
757 symbolP = fragP->fr_symbol;
758 know (symbolP);
759 target_address = S_GET_VALUE (symbolP) + fragP->fr_offset;
760 address_of_var = fragP->fr_address + where;
761 switch (fragP->fr_subtype)
762 {
763 case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_BYTE):
764 /* *addressP holds the registers number, plus 0x10, if it's deferred
765 mode. To set up the right mode, just OR the size of this displacement */
766 /* Byte displacement. */
767 *addressP++ |= TAHOE_PC_OR_BYTE;
768 *addressP = target_address - (address_of_var + 2);
769 extension = 2;
770 break;
771
772 case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_WORD):
773 /* Word displacement. */
774 *addressP++ |= TAHOE_PC_OR_WORD;
775 md_number_to_chars (addressP, target_address - (address_of_var + 3), 2);
776 extension = 3;
777 break;
778
779 case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_LONG):
780 /* Long word displacement. */
781 *addressP++ |= TAHOE_PC_OR_LONG;
782 md_number_to_chars (addressP, target_address - (address_of_var + 5), 4);
783 extension = 5;
784 break;
785
786 case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_BYTE):
787 *addressP = target_address - (address_of_var + 1);
788 extension = 1;
789 break;
790
791 case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_WORD):
792 *opcodeP ^= 0x10; /* Reverse sense of test. */
793 *addressP++ = 3; /* Jump over word branch */
794 *addressP++ = TAHOE_BRW;
795 md_number_to_chars (addressP, target_address - (address_of_var + 4), 2);
796 extension = 4;
797 break;
798
799 case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_LONG):
800 *opcodeP ^= 0x10; /* Reverse sense of test. */
801 *addressP++ = 6;
802 *addressP++ = TAHOE_JMP;
803 *addressP++ = TAHOE_PC_REL_LONG;
804 md_number_to_chars (addressP, target_address, 4);
805 extension = 7;
806 break;
807
808 case ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_BYTE):
809 *addressP = target_address - (address_of_var + 1);
810 extension = 1;
811 break;
812
813 case ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_WORD):
814 *opcodeP = TAHOE_BRW;
815 md_number_to_chars (addressP, target_address - (address_of_var + 2), 2);
816 extension = 2;
817 break;
818
819 case ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_LONG):
820 *opcodeP = TAHOE_JMP;
821 *addressP++ = TAHOE_PC_REL_LONG;
822 md_number_to_chars (addressP, target_address - (address_of_var + 5), 4);
823 extension = 5;
824 break;
825
826 case ENCODE_RELAX (STATE_BIG_REV_BRANCH, STATE_WORD):
827 md_number_to_chars (addressP, target_address - (address_of_var + 2), 2);
828 extension = 2;
829 break;
830
831 case ENCODE_RELAX (STATE_BIG_REV_BRANCH, STATE_LONG):
832 *opcodeP ^= 0x10;
833 *addressP++ = 0;
834 *addressP++ = 6;
835 *addressP++ = TAHOE_JMP;
836 *addressP++ = TAHOE_PC_REL_LONG;
837 md_number_to_chars (addressP, target_address, 4);
838 extension = 8;
839 break;
840
841 case ENCODE_RELAX (STATE_BIG_NON_REV_BRANCH, STATE_WORD):
842 md_number_to_chars (addressP, target_address - (address_of_var + 2), 2);
843 extension = 2;
844 break;
845
846 case ENCODE_RELAX (STATE_BIG_NON_REV_BRANCH, STATE_LONG):
847 *addressP++ = 0;
848 *addressP++ = 2;
849 *addressP++ = TAHOE_BRB;
850 *addressP++ = 6;
851 *addressP++ = TAHOE_JMP;
852 *addressP++ = TAHOE_PC_REL_LONG;
853 md_number_to_chars (addressP, target_address, 4);
854 extension = 10;
855 break;
856
857 default:
858 BAD_CASE (fragP->fr_subtype);
859 break;
860 }
861 fragP->fr_fix += extension;
862 } /* md_convert_frag */
863 \f
864
865 /* This is the stuff for md_assemble. */
866 #define FP_REG 13
867 #define SP_REG 14
868 #define PC_REG 15
869 #define BIGGESTREG PC_REG
870
871 /*
872 * Parse the string pointed to by START
873 * If it represents a valid register, point START to the character after
874 * the last valid register char, and return the register number (0-15).
875 * If invalid, leave START alone, return -1.
876 * The format has to be exact. I don't do things like eat leading zeros
877 * or the like.
878 * Note: This doesn't check for the next character in the string making
879 * this invalid. Ex: R123 would return 12, it's the callers job to check
880 * what start is point to apon return.
881 *
882 * Valid registers are R1-R15, %1-%15, FP (13), SP (14), PC (15)
883 * Case doesn't matter.
884 */
885 int
886 tahoe_reg_parse (start)
887 char **start; /* A pointer to the string to parse. */
888 {
889 register char *regpoint = *start;
890 register int regnum = -1;
891
892 switch (*regpoint++)
893 {
894 case '%': /* Registers can start with a %,
895 R or r, and then a number. */
896 case 'R':
897 case 'r':
898 if (isdigit (*regpoint))
899 {
900 /* Got the first digit. */
901 regnum = *regpoint++ - '0';
902 if ((regnum == 1) && isdigit (*regpoint))
903 {
904 /* Its a two digit number. */
905 regnum = 10 + (*regpoint++ - '0');
906 if (regnum > BIGGESTREG)
907 { /* Number too big? */
908 regnum = -1;
909 }
910 }
911 }
912 break;
913 case 'F': /* Is it the FP */
914 case 'f':
915 switch (*regpoint++)
916 {
917 case 'p':
918 case 'P':
919 regnum = FP_REG;
920 }
921 break;
922 case 's': /* How about the SP */
923 case 'S':
924 switch (*regpoint++)
925 {
926 case 'p':
927 case 'P':
928 regnum = SP_REG;
929 }
930 break;
931 case 'p': /* OR the PC even */
932 case 'P':
933 switch (*regpoint++)
934 {
935 case 'c':
936 case 'C':
937 regnum = PC_REG;
938 }
939 break;
940 }
941
942 if (regnum != -1)
943 { /* No error, so move string pointer */
944 *start = regpoint;
945 }
946 return regnum; /* Return results */
947 } /* tahoe_reg_parse */
948 \f
949 /*
950 * This chops up an operand and figures out its modes and stuff.
951 * It's a little touchy about extra characters.
952 * Optex to start with one extra character so it can be overwritten for
953 * the backward part of the parsing.
954 * You can't put a bunch of extra characters in side to
955 * make the command look cute. ie: * foo ( r1 ) [ r0 ]
956 * If you like doing a lot of typing, try COBOL!
957 * Actually, this parser is a little weak all around. It's designed to be
958 * used with compliers, so I emphisise correct decoding of valid code quickly
959 * rather that catching every possable error.
960 * Note: This uses the expression function, so save input_line_pointer before
961 * calling.
962 *
963 * Sperry defines the semantics of address modes (and values)
964 * by a two-letter code, explained here.
965 *
966 * letter 1: access type
967 *
968 * a address calculation - no data access, registers forbidden
969 * b branch displacement
970 * m read - let go of bus - write back "modify"
971 * r read
972 * w write
973 * v bit field address: like 'a' but registers are OK
974 *
975 * letter 2: data type (i.e. width, alignment)
976 *
977 * b byte
978 * w word
979 * l longword
980 * q quadword (Even regs < 14 allowed) (if 12, you get a warning)
981 * - unconditional synthetic jbr operand
982 * ? simple synthetic reversable branch operand
983 * ! complex synthetic reversable branch operand
984 * : complex synthetic non-reversable branch operand
985 *
986 * The '-?!:' letter 2's are not for external consumption. They are used
987 * by GAS for psuedo ops relaxing code.
988 *
989 * After parsing topP has:
990 *
991 * top_ndx: -1, or the index register. eg 7=[R7]
992 * top_reg: -1, or register number. eg 7 = R7 or (R7)
993 * top_mode: The addressing mode byte. This byte, defines which of
994 * the 11 modes opcode is.
995 * top_access: Access type wanted for this opperand 'b'branch ' '
996 * no-instruction 'amrvw'
997 * top_width: Operand width expected, one of "bwlq?-:!"
998 * exp_of_operand: The expression as parsed by expression()
999 * top_dispsize: Number of bytes in the displacement if we can figure it
1000 * out and it's relavent.
1001 *
1002 * Need syntax checks built.
1003 */
1004
1005 void
1006 tip_op (optex, topP)
1007 char *optex; /* The users text input, with one leading character */
1008 struct top *topP; /* The tahoe instruction with some fields already set:
1009 in: access, width
1010 out: ndx, reg, mode, error, dispsize */
1011
1012 {
1013 int mode = 0; /* This operand's mode. */
1014 char segfault = *optex; /* To keep the back parsing from freaking. */
1015 char *point = optex + 1; /* Parsing from front to back. */
1016 char *end; /* Parsing from back to front. */
1017 int reg = -1; /* major register, -1 means absent */
1018 int imreg = -1; /* Major register in immediate mode */
1019 int ndx = -1; /* index register number, -1 means absent */
1020 char dec_inc = ' '; /* Is the SP auto-incremented '+' or
1021 auto-decremented '-' or neither ' '. */
1022 int immediate = 0; /* 1 if '$' immediate mode */
1023 int call_width = 0; /* If the caller casts the displacement */
1024 int abs_width = 0; /* The width of the absolute displacment */
1025 int com_width = 0; /* Displacement width required by branch */
1026 int deferred = 0; /* 1 if '*' deferral is used */
1027 byte disp_size = 0; /* How big is this operand. 0 == don't know */
1028 char *op_bad = ""; /* Bad operand error */
1029
1030 char *tp, *temp, c; /* Temporary holders */
1031
1032 char access = topP->top_access; /* Save on a deref. */
1033 char width = topP->top_width;
1034
1035 int really_none = 0; /* Empty expressions evaluate to 0
1036 but I need to know if it's there or not */
1037 expressionS *expP; /* -> expression values for this operand */
1038
1039 /* Does this command restrict the displacement size. */
1040 if (access == 'b')
1041 com_width = (width == 'b' ? 1 :
1042 (width == 'w' ? 2 :
1043 (width == 'l' ? 4 : 0)));
1044
1045 *optex = '\0'; /* This is kind of a back stop for all
1046 the searches to fail on if needed.*/
1047 if (*point == '*')
1048 { /* A dereference? */
1049 deferred = 1;
1050 point++;
1051 }
1052
1053 /* Force words into a certain mode */
1054 /* Bitch, Bitch, Bitch! */
1055 /*
1056 * Using the ^ operator is ambigous. If I have an absolute label
1057 * called 'w' set to, say 2, and I have the expression 'w^1', do I get
1058 * 1, forced to be in word displacement mode, or do I get the value of
1059 * 'w' or'ed with 1 (3 in this case).
1060 * The default is 'w' as an offset, so that's what I use.
1061 * Stick with `, it does the same, and isn't ambig.
1062 */
1063
1064 if (*point != '\0' && ((point[1] == '^') || (point[1] == '`')))
1065 switch (*point)
1066 {
1067 case 'b':
1068 case 'B':
1069 case 'w':
1070 case 'W':
1071 case 'l':
1072 case 'L':
1073 if (com_width)
1074 as_warn ("Casting a branch displacement is bad form, and is ignored.");
1075 else
1076 {
1077 c = (isupper (*point) ? tolower (*point) : *point);
1078 call_width = ((c == 'b') ? 1 :
1079 ((c == 'w') ? 2 : 4));
1080 }
1081 point += 2;
1082 break;
1083 }
1084
1085 /* Setting immediate mode */
1086 if (*point == '$')
1087 {
1088 immediate = 1;
1089 point++;
1090 }
1091
1092 /*
1093 * I've pulled off all the easy stuff off the front, move to the end and
1094 * yank.
1095 */
1096
1097 for (end = point; *end != '\0'; end++) /* Move to the end. */
1098 ;
1099
1100 if (end != point) /* Null string? */
1101 end--;
1102
1103 if (end > point && *end == ' ' && end[-1] != '\'')
1104 end--; /* Hop white space */
1105
1106 /* Is this an index reg. */
1107 if ((*end == ']') && (end[-1] != '\''))
1108 {
1109 temp = end;
1110
1111 /* Find opening brace. */
1112 for (--end; (*end != '[' && end != point); end--)
1113 ;
1114
1115 /* If I found the opening brace, get the index register number. */
1116 if (*end == '[')
1117 {
1118 tp = end + 1; /* tp should point to the start of a reg. */
1119 ndx = tahoe_reg_parse (&tp);
1120 if (tp != temp)
1121 { /* Reg. parse error. */
1122 ndx = -1;
1123 }
1124 else
1125 {
1126 end--; /* Found it, move past brace. */
1127 }
1128 if (ndx == -1)
1129 {
1130 op_bad = "Couldn't parse the [index] in this operand.";
1131 end = point; /* Force all the rest of the tests to fail. */
1132 }
1133 }
1134 else
1135 {
1136 op_bad = "Couldn't find the opening '[' for the index of this operand.";
1137 end = point; /* Force all the rest of the tests to fail. */
1138 }
1139 }
1140
1141 /* Post increment? */
1142 if (*end == '+')
1143 {
1144 dec_inc = '+';
1145 /* was: *end--; */
1146 end--;
1147 }
1148
1149 /* register in parens? */
1150 if ((*end == ')') && (end[-1] != '\''))
1151 {
1152 temp = end;
1153
1154 /* Find opening paren. */
1155 for (--end; (*end != '(' && end != point); end--)
1156 ;
1157
1158 /* If I found the opening paren, get the register number. */
1159 if (*end == '(')
1160 {
1161 tp = end + 1;
1162 reg = tahoe_reg_parse (&tp);
1163 if (tp != temp)
1164 {
1165 /* Not a register, but could be part of the expression. */
1166 reg = -1;
1167 end = temp; /* Rest the pointer back */
1168 }
1169 else
1170 {
1171 end--; /* Found the reg. move before opening paren. */
1172 }
1173 }
1174 else
1175 {
1176 op_bad = "Couldn't find the opening '(' for the deref of this operand.";
1177 end = point; /* Force all the rest of the tests to fail. */
1178 }
1179 }
1180
1181 /* Pre decrement? */
1182 if (*end == '-')
1183 {
1184 if (dec_inc != ' ')
1185 {
1186 op_bad = "Operand can't be both pre-inc and post-dec.";
1187 end = point;
1188 }
1189 else
1190 {
1191 dec_inc = '-';
1192 /* was: *end--; */
1193 end--;
1194 }
1195 }
1196
1197 /*
1198 * Everything between point and end is the 'expression', unless it's
1199 * a register name.
1200 */
1201
1202 c = end[1];
1203 end[1] = '\0';
1204
1205 tp = point;
1206 imreg = tahoe_reg_parse (&point); /* Get the immediate register
1207 if it is there.*/
1208 if (*point != '\0')
1209 {
1210 /* If there is junk after point, then the it's not immediate reg. */
1211 point = tp;
1212 imreg = -1;
1213 }
1214
1215 if (imreg != -1 && reg != -1)
1216 op_bad = "I parsed 2 registers in this operand.";
1217
1218 /*
1219 * Evaluate whats left of the expression to see if it's valid.
1220 * Note again: This assumes that the calling expression has saved
1221 * input_line_pointer. (Nag, nag, nag!)
1222 */
1223
1224 if (*op_bad == '\0')
1225 {
1226 /* statement has no syntax goofs yet: lets sniff the expression */
1227 input_line_pointer = point;
1228 expP = &(topP->exp_of_operand);
1229 topP->seg_of_operand = expression (expP);
1230 switch (expP->X_op)
1231 {
1232 case O_absent:
1233 /* No expression. For BSD4.2 compatibility, missing expression is
1234 absolute 0 */
1235 expP->X_op = O_constant;
1236 expP->X_add_number = 0;
1237 really_none = 1;
1238 case O_constant:
1239 /* for SEG_ABSOLUTE, we shouldnt need to set X_op_symbol,
1240 X_add_symbol to any particular value. */
1241 /* But, we will program defensively. Since this situation occurs
1242 rarely so it costs us little to do so. */
1243 expP->X_add_symbol = NULL;
1244 expP->X_op_symbol = NULL;
1245 /* How many bytes are needed to express this abs value? */
1246 abs_width =
1247 ((((expP->X_add_number & 0xFFFFFF80) == 0) ||
1248 ((expP->X_add_number & 0xFFFFFF80) == 0xFFFFFF80)) ? 1 :
1249 (((expP->X_add_number & 0xFFFF8000) == 0) ||
1250 ((expP->X_add_number & 0xFFFF8000) == 0xFFFF8000)) ? 2 : 4);
1251
1252 case O_symbol:
1253 break;
1254
1255 default:
1256 /*
1257 * Major bug. We can't handle the case of a operator
1258 * expression in a synthetic opcode variable-length
1259 * instruction. We don't have a frag type that is smart
1260 * enough to relax a operator, and so we just force all
1261 * operators to behave like SEG_PASS1s. Clearly, if there is
1262 * a demand we can invent a new or modified frag type and
1263 * then coding up a frag for this case will be easy.
1264 */
1265 need_pass_2 = 1;
1266 op_bad = "Can't relocate expression error.";
1267 break;
1268
1269 case O_big:
1270 /* This is an error. Tahoe doesn't allow any expressions
1271 bigger that a 32 bit long word. Any bigger has to be referenced
1272 by address. */
1273 op_bad = "Expression is too large for a 32 bits.";
1274 break;
1275 }
1276 if (*input_line_pointer != '\0')
1277 {
1278 op_bad = "Junk at end of expression.";
1279 }
1280 }
1281
1282 end[1] = c;
1283
1284 /* I'm done, so restore optex */
1285 *optex = segfault;
1286
1287
1288 /*
1289 * At this point in the game, we (in theory) have all the components of
1290 * the operand at least parsed. Now it's time to check for syntax/semantic
1291 * errors, and build the mode.
1292 * This is what I have:
1293 * deferred = 1 if '*'
1294 * call_width = 0,1,2,4
1295 * abs_width = 0,1,2,4
1296 * com_width = 0,1,2,4
1297 * immediate = 1 if '$'
1298 * ndx = -1 or reg num
1299 * dec_inc = '-' or '+' or ' '
1300 * reg = -1 or reg num
1301 * imreg = -1 or reg num
1302 * topP->exp_of_operand
1303 * really_none
1304 */
1305 /* Is there a displacement size? */
1306 disp_size = (call_width ? call_width :
1307 (com_width ? com_width :
1308 abs_width ? abs_width : 0));
1309
1310 if (*op_bad == '\0')
1311 {
1312 if (imreg != -1)
1313 {
1314 /* Rn */
1315 mode = TAHOE_DIRECT_REG;
1316 if (deferred || immediate || (dec_inc != ' ') ||
1317 (reg != -1) || !really_none)
1318 op_bad = "Syntax error in direct register mode.";
1319 else if (ndx != -1)
1320 op_bad = "You can't index a register in direct register mode.";
1321 else if (imreg == SP_REG && access == 'r')
1322 op_bad =
1323 "SP can't be the source operand with direct register addressing.";
1324 else if (access == 'a')
1325 op_bad = "Can't take the address of a register.";
1326 else if (access == 'b')
1327 op_bad = "Direct Register can't be used in a branch.";
1328 else if (width == 'q' && ((imreg % 2) || (imreg > 13)))
1329 op_bad = "For quad access, the register must be even and < 14.";
1330 else if (call_width)
1331 op_bad = "You can't cast a direct register.";
1332
1333 if (*op_bad == '\0')
1334 {
1335 /* No errors, check for warnings */
1336 if (width == 'q' && imreg == 12)
1337 as_warn ("Using reg 14 for quadwords can tromp the FP register.");
1338
1339 reg = imreg;
1340 }
1341
1342 /* We know: imm = -1 */
1343 }
1344 else if (dec_inc == '-')
1345 {
1346 /* -(SP) */
1347 mode = TAHOE_AUTO_DEC;
1348 if (deferred || immediate || !really_none)
1349 op_bad = "Syntax error in auto-dec mode.";
1350 else if (ndx != -1)
1351 op_bad = "You can't have an index auto dec mode.";
1352 else if (access == 'r')
1353 op_bad = "Auto dec mode cant be used for reading.";
1354 else if (reg != SP_REG)
1355 op_bad = "Auto dec only works of the SP register.";
1356 else if (access == 'b')
1357 op_bad = "Auto dec can't be used in a branch.";
1358 else if (width == 'q')
1359 op_bad = "Auto dec won't work with quadwords.";
1360
1361 /* We know: imm = -1, dec_inc != '-' */
1362 }
1363 else if (dec_inc == '+')
1364 {
1365 if (immediate || !really_none)
1366 op_bad = "Syntax error in one of the auto-inc modes.";
1367 else if (deferred)
1368 {
1369 /* *(SP)+ */
1370 mode = TAHOE_AUTO_INC_DEFERRED;
1371 if (reg != SP_REG)
1372 op_bad = "Auto inc deferred only works of the SP register.";
1373 else if (ndx != -1)
1374 op_bad = "You can't have an index auto inc deferred mode.";
1375 else if (access == 'b')
1376 op_bad = "Auto inc can't be used in a branch.";
1377 }
1378 else
1379 {
1380 /* (SP)+ */
1381 mode = TAHOE_AUTO_INC;
1382 if (access == 'm' || access == 'w')
1383 op_bad = "You can't write to an auto inc register.";
1384 else if (reg != SP_REG)
1385 op_bad = "Auto inc only works of the SP register.";
1386 else if (access == 'b')
1387 op_bad = "Auto inc can't be used in a branch.";
1388 else if (width == 'q')
1389 op_bad = "Auto inc won't work with quadwords.";
1390 else if (ndx != -1)
1391 op_bad = "You can't have an index in auto inc mode.";
1392 }
1393
1394 /* We know: imm = -1, dec_inc == ' ' */
1395 }
1396 else if (reg != -1)
1397 {
1398 if ((ndx != -1) && (reg == SP_REG))
1399 op_bad = "You can't index the sp register.";
1400 if (deferred)
1401 {
1402 /* *<disp>(Rn) */
1403 mode = TAHOE_REG_DISP_DEFERRED;
1404 if (immediate)
1405 op_bad = "Syntax error in register displaced mode.";
1406 }
1407 else if (really_none)
1408 {
1409 /* (Rn) */
1410 mode = TAHOE_REG_DEFERRED;
1411 /* if reg = SP then cant be indexed */
1412 }
1413 else
1414 {
1415 /* <disp>(Rn) */
1416 mode = TAHOE_REG_DISP;
1417 }
1418
1419 /* We know: imm = -1, dec_inc == ' ', Reg = -1 */
1420 }
1421 else
1422 {
1423 if (really_none)
1424 op_bad = "An offest is needed for this operand.";
1425 if (deferred && immediate)
1426 {
1427 /* *$<ADDR> */
1428 mode = TAHOE_ABSOLUTE_ADDR;
1429 disp_size = 4;
1430 }
1431 else if (immediate)
1432 {
1433 /* $<disp> */
1434 mode = TAHOE_IMMEDIATE;
1435 if (ndx != -1)
1436 op_bad = "You can't index a register in immediate mode.";
1437 if (access == 'a')
1438 op_bad = "Immediate access can't be used as an address.";
1439 /* ponder the wisdom of a cast because it doesn't do any good. */
1440 }
1441 else if (deferred)
1442 {
1443 /* *<disp> */
1444 mode = TAHOE_DISP_REL_DEFERRED;
1445 }
1446 else
1447 {
1448 /* <disp> */
1449 mode = TAHOE_DISPLACED_RELATIVE;
1450 }
1451 }
1452 }
1453
1454 /*
1455 * At this point, all the errors we can do have be checked for.
1456 * We can build the 'top'. */
1457
1458 topP->top_ndx = ndx;
1459 topP->top_reg = reg;
1460 topP->top_mode = mode;
1461 topP->top_error = op_bad;
1462 topP->top_dispsize = disp_size;
1463 } /* tip_op */
1464 \f
1465 /*
1466 * t i p ( )
1467 *
1468 * This converts a string into a tahoe instruction.
1469 * The string must be a bare single instruction in tahoe (with BSD4 frobs)
1470 * format.
1471 * It provides at most one fatal error message (which stops the scan)
1472 * some warning messages as it finds them.
1473 * The tahoe instruction is returned in exploded form.
1474 *
1475 * The exploded instruction is returned to a struct tit of your choice.
1476 * #include "tahoe-inst.h" to know what a struct tit is.
1477 *
1478 */
1479
1480 static void
1481 tip (titP, instring)
1482 struct tit *titP; /* We build an exploded instruction here. */
1483 char *instring; /* Text of a vax instruction: we modify. */
1484 {
1485 register struct tot_wot *twP = NULL; /* How to bit-encode this opcode. */
1486 register char *p; /* 1/skip whitespace.2/scan vot_how */
1487 register char *q; /* */
1488 register unsigned char count; /* counts number of operands seen */
1489 register struct top *operandp;/* scan operands in struct tit */
1490 register char *alloperr = ""; /* error over all operands */
1491 register char c; /* Remember char, (we clobber it
1492 with '\0' temporarily). */
1493 char *save_input_line_pointer;
1494
1495 if (*instring == ' ')
1496 ++instring; /* Skip leading whitespace. */
1497 for (p = instring; *p && *p != ' '; p++)
1498 ; /* MUST end in end-of-string or
1499 exactly 1 space. */
1500 /* Scanned up to end of operation-code. */
1501 /* Operation-code is ended with whitespace. */
1502 if (p == instring)
1503 {
1504 titP->tit_error = "No operator";
1505 count = 0;
1506 titP->tit_opcode = 0;
1507 }
1508 else
1509 {
1510 c = *p;
1511 *p = '\0';
1512 /*
1513 * Here with instring pointing to what better be an op-name, and p
1514 * pointing to character just past that.
1515 * We trust instring points to an op-name, with no whitespace.
1516 */
1517 twP = (struct tot_wot *) hash_find (op_hash, instring);
1518 *p = c; /* Restore char after op-code. */
1519 if (twP == 0)
1520 {
1521 titP->tit_error = "Unknown operator";
1522 count = 0;
1523 titP->tit_opcode = 0;
1524 }
1525 else
1526 {
1527 /*
1528 * We found a match! So lets pick up as many operands as the
1529 * instruction wants, and even gripe if there are too many.
1530 * We expect comma to seperate each operand.
1531 * We let instring track the text, while p tracks a part of the
1532 * struct tot.
1533 */
1534
1535 count = 0; /* no operands seen yet */
1536 instring = p + (*p != '\0'); /* point past the operation code */
1537 /* tip_op() screws with the input_line_pointer, so save it before
1538 I jump in */
1539 save_input_line_pointer = input_line_pointer;
1540 for (p = twP->args, operandp = titP->tit_operand;
1541 !*alloperr && *p;
1542 operandp++, p += 2)
1543 {
1544 /*
1545 * Here to parse one operand. Leave instring pointing just
1546 * past any one ',' that marks the end of this operand.
1547 */
1548 if (!p[1])
1549 as_fatal ("Compiler bug: ODD number of bytes in arg structure %s.",
1550 twP->args);
1551 else if (*instring)
1552 {
1553 for (q = instring; (*q != ',' && *q != '\0'); q++)
1554 {
1555 if (*q == '\'' && q[1] != '\0') /* Jump quoted characters */
1556 q++;
1557 }
1558 c = *q;
1559 /*
1560 * Q points to ',' or '\0' that ends argument. C is that
1561 * character.
1562 */
1563 *q = '\0';
1564 operandp->top_access = p[0];
1565 operandp->top_width = p[1];
1566 tip_op (instring - 1, operandp);
1567 *q = c; /* Restore input text. */
1568 if (*(operandp->top_error))
1569 {
1570 alloperr = operandp->top_error;
1571 }
1572 instring = q + (c ? 1 : 0); /* next operand (if any) */
1573 count++; /* won another argument, may have an operr */
1574 }
1575 else
1576 alloperr = "Not enough operands";
1577 }
1578 /* Restore the pointer. */
1579 input_line_pointer = save_input_line_pointer;
1580
1581 if (!*alloperr)
1582 {
1583 if (*instring == ' ')
1584 instring++; /* Skip whitespace. */
1585 if (*instring)
1586 alloperr = "Too many operands";
1587 }
1588 titP->tit_error = alloperr;
1589 }
1590 }
1591
1592 titP->tit_opcode = twP->code; /* The op-code. */
1593 titP->tit_operands = count;
1594 } /* tip */
1595 \f
1596 /* md_assemble() emit frags for 1 instruction */
1597 void
1598 md_assemble (instruction_string)
1599 char *instruction_string; /* A string: assemble 1 instruction. */
1600 {
1601 char *p;
1602 register struct top *operandP;/* An operand. Scans all operands. */
1603 /* char c_save; fixme: remove this line *//* What used to live after an expression. */
1604 /* struct frag *fragP; fixme: remove this line *//* Fragment of code we just made. */
1605 /* register struct top *end_operandP; fixme: remove this line *//* -> slot just after last operand
1606 Limit of the for (each operand). */
1607 register expressionS *expP; /* -> expression values for this operand */
1608
1609 /* These refer to an instruction operand expression. */
1610 segT to_seg; /* Target segment of the address. */
1611
1612 register valueT this_add_number;
1613 register struct symbol *this_add_symbol; /* +ve (minuend) symbol. */
1614
1615 /* tahoe_opcodeT opcode_as_number; fixme: remove this line *//* The opcode as a number. */
1616 char *opcodeP; /* Where it is in a frag. */
1617 /* char *opmodeP; fixme: remove this line *//* Where opcode type is, in a frag. */
1618
1619 int dispsize; /* From top_dispsize: tahoe_operand_width
1620 (in bytes) */
1621 int is_undefined; /* 1 if operand expression's
1622 segment not known yet. */
1623 int pc_rel; /* Is this operand pc relative? */
1624
1625 /* Decode the operand. */
1626 tip (&t, instruction_string);
1627
1628 /*
1629 * Check to see if this operand decode properly.
1630 * Notice that we haven't made any frags yet.
1631 * If it goofed, then this instruction will wedge in any pass,
1632 * and we can safely flush it, without causing interpass symbol phase
1633 * errors. That is, without changing label values in different passes.
1634 */
1635 if (*t.tit_error)
1636 {
1637 as_warn ("Ignoring statement due to \"%s\"", t.tit_error);
1638 }
1639 else
1640 {
1641 /* We saw no errors in any operands - try to make frag(s) */
1642 /* Emit op-code. */
1643 /* Remember where it is, in case we want to modify the op-code later. */
1644 opcodeP = frag_more (1);
1645 *opcodeP = t.tit_opcode;
1646 /* Now do each operand. */
1647 for (operandP = t.tit_operand;
1648 operandP < t.tit_operand + t.tit_operands;
1649 operandP++)
1650 { /* for each operand */
1651 expP = &(operandP->exp_of_operand);
1652 if (operandP->top_ndx >= 0)
1653 {
1654 /* Indexed addressing byte
1655 Legality of indexed mode already checked: it is OK */
1656 FRAG_APPEND_1_CHAR (0x40 + operandP->top_ndx);
1657 } /* if(top_ndx>=0) */
1658
1659 /* Here to make main operand frag(s). */
1660 this_add_number = expP->X_add_number;
1661 this_add_symbol = expP->X_add_symbol;
1662 to_seg = operandP->seg_of_operand;
1663 know (to_seg == SEG_UNKNOWN || \
1664 to_seg == SEG_ABSOLUTE || \
1665 to_seg == SEG_DATA || \
1666 to_seg == SEG_TEXT || \
1667 to_seg == SEG_BSS);
1668 is_undefined = (to_seg == SEG_UNKNOWN);
1669 /* Do we know how big this opperand is? */
1670 dispsize = operandP->top_dispsize;
1671 pc_rel = 0;
1672 /* Deal with the branch possabilities. (Note, this doesn't include
1673 jumps.)*/
1674 if (operandP->top_access == 'b')
1675 {
1676 /* Branches must be expressions. A psuedo branch can also jump to
1677 an absolute address. */
1678 if (to_seg == now_seg || is_undefined)
1679 {
1680 /* If is_undefined, then it might BECOME now_seg by relax time. */
1681 if (dispsize)
1682 {
1683 /* I know how big the branch is supposed to be (it's a normal
1684 branch), so I set up the frag, and let GAS do the rest. */
1685 p = frag_more (dispsize);
1686 fix_new (frag_now, p - frag_now->fr_literal,
1687 this_add_symbol, this_add_number,
1688 size_to_fx (dispsize, 1),
1689 NULL);
1690 }
1691 else
1692 {
1693 /* (to_seg==now_seg || to_seg == SEG_UNKNOWN) && dispsize==0 */
1694 /* If we don't know how big it is, then its a synthetic branch,
1695 so we set up a simple relax state. */
1696 switch (operandP->top_width)
1697 {
1698 case TAHOE_WIDTH_CONDITIONAL_JUMP:
1699 /* Simple (conditional) jump. I may have to reverse the
1700 condition of opcodeP, and then jump to my destination.
1701 I set 1 byte aside for the branch off set, and could need 6
1702 more bytes for the pc_rel jump */
1703 frag_var (rs_machine_dependent, 7, 1,
1704 ENCODE_RELAX (STATE_CONDITIONAL_BRANCH,
1705 is_undefined ? STATE_UNDF : STATE_BYTE),
1706 this_add_symbol, this_add_number, opcodeP);
1707 break;
1708 case TAHOE_WIDTH_ALWAYS_JUMP:
1709 /* Simple (unconditional) jump. I may have to convert this to
1710 a word branch, or an absolute jump. */
1711 frag_var (rs_machine_dependent, 5, 1,
1712 ENCODE_RELAX (STATE_ALWAYS_BRANCH,
1713 is_undefined ? STATE_UNDF : STATE_BYTE),
1714 this_add_symbol, this_add_number, opcodeP);
1715 break;
1716 /* The smallest size for the next 2 cases is word. */
1717 case TAHOE_WIDTH_BIG_REV_JUMP:
1718 frag_var (rs_machine_dependent, 8, 2,
1719 ENCODE_RELAX (STATE_BIG_REV_BRANCH,
1720 is_undefined ? STATE_UNDF : STATE_WORD),
1721 this_add_symbol, this_add_number,
1722 opcodeP);
1723 break;
1724 case TAHOE_WIDTH_BIG_NON_REV_JUMP:
1725 frag_var (rs_machine_dependent, 10, 2,
1726 ENCODE_RELAX (STATE_BIG_NON_REV_BRANCH,
1727 is_undefined ? STATE_UNDF : STATE_WORD),
1728 this_add_symbol, this_add_number,
1729 opcodeP);
1730 break;
1731 default:
1732 as_fatal ("Compliler bug: Got a case (%d) I wasn't expecting.",
1733 operandP->top_width);
1734 }
1735 }
1736 }
1737 else
1738 {
1739 /* to_seg != now_seg && to_seg != seg_unknown (still in branch)
1740 In other words, I'm jumping out of my segment so extend the
1741 branches to jumps, and let GAS fix them. */
1742
1743 /* These are "branches" what will always be branches around a jump
1744 to the correct addresss in real life.
1745 If to_seg is SEG_ABSOLUTE, just encode the branch in,
1746 else let GAS fix the address. */
1747
1748 switch (operandP->top_width)
1749 {
1750 /* The theory:
1751 For SEG_ABSOLUTE, then mode is ABSOLUTE_ADDR, jump
1752 to that addresss (not pc_rel).
1753 For other segs, address is a long word PC rel jump. */
1754 case TAHOE_WIDTH_CONDITIONAL_JUMP:
1755 /* b<cond> */
1756 /* To reverse the condition in a TAHOE branch,
1757 complement bit 4 */
1758 *opcodeP ^= 0x10;
1759 p = frag_more (7);
1760 *p++ = 6;
1761 *p++ = TAHOE_JMP;
1762 *p++ = (operandP->top_mode ==
1763 TAHOE_ABSOLUTE_ADDR ? TAHOE_ABSOLUTE_ADDR :
1764 TAHOE_PC_REL_LONG);
1765 fix_new (frag_now, p - frag_now->fr_literal,
1766 this_add_symbol, this_add_number,
1767 (to_seg != SEG_ABSOLUTE) ? FX_PCREL32 : FX_32, NULL);
1768 /*
1769 * Now (eg) BLEQ 1f
1770 * JMP foo
1771 * 1:
1772 */
1773 break;
1774 case TAHOE_WIDTH_ALWAYS_JUMP:
1775 /* br, just turn it into a jump */
1776 *opcodeP = TAHOE_JMP;
1777 p = frag_more (5);
1778 *p++ = (operandP->top_mode ==
1779 TAHOE_ABSOLUTE_ADDR ? TAHOE_ABSOLUTE_ADDR :
1780 TAHOE_PC_REL_LONG);
1781 fix_new (frag_now, p - frag_now->fr_literal,
1782 this_add_symbol, this_add_number,
1783 (to_seg != SEG_ABSOLUTE) ? FX_PCREL32 : FX_32, NULL);
1784 /* Now (eg) JMP foo */
1785 break;
1786 case TAHOE_WIDTH_BIG_REV_JUMP:
1787 p = frag_more (8);
1788 *opcodeP ^= 0x10;
1789 *p++ = 0;
1790 *p++ = 6;
1791 *p++ = TAHOE_JMP;
1792 *p++ = (operandP->top_mode ==
1793 TAHOE_ABSOLUTE_ADDR ? TAHOE_ABSOLUTE_ADDR :
1794 TAHOE_PC_REL_LONG);
1795 fix_new (frag_now, p - frag_now->fr_literal,
1796 this_add_symbol, this_add_number,
1797 (to_seg != SEG_ABSOLUTE) ? FX_PCREL32 : FX_32, NULL);
1798 /*
1799 * Now (eg) ACBx 1f
1800 * JMP foo
1801 * 1:
1802 */
1803 break;
1804 case TAHOE_WIDTH_BIG_NON_REV_JUMP:
1805 p = frag_more (10);
1806 *p++ = 0;
1807 *p++ = 2;
1808 *p++ = TAHOE_BRB;
1809 *p++ = 6;
1810 *p++ = TAHOE_JMP;
1811 *p++ = (operandP->top_mode ==
1812 TAHOE_ABSOLUTE_ADDR ? TAHOE_ABSOLUTE_ADDR :
1813 TAHOE_PC_REL_LONG);
1814 fix_new (frag_now, p - frag_now->fr_literal,
1815 this_add_symbol, this_add_number,
1816 (to_seg != SEG_ABSOLUTE) ? FX_PCREL32 : FX_32, NULL);
1817 /*
1818 * Now (eg) xOBxxx 1f
1819 * BRB 2f
1820 * 1: JMP @#foo
1821 * 2:
1822 */
1823 break;
1824 case 'b':
1825 case 'w':
1826 as_warn ("Real branch displacements must be expressions.");
1827 break;
1828 default:
1829 as_fatal ("Complier error: I got an unknown synthetic branch :%c",
1830 operandP->top_width);
1831 break;
1832 }
1833 }
1834 }
1835 else
1836 {
1837 /* It ain't a branch operand. */
1838 switch (operandP->top_mode)
1839 {
1840 /* Auto-foo access, only works for one reg (SP)
1841 so the only thing needed is the mode. */
1842 case TAHOE_AUTO_DEC:
1843 case TAHOE_AUTO_INC:
1844 case TAHOE_AUTO_INC_DEFERRED:
1845 FRAG_APPEND_1_CHAR (operandP->top_mode);
1846 break;
1847
1848 /* Numbered Register only access. Only thing needed is the
1849 mode + Register number */
1850 case TAHOE_DIRECT_REG:
1851 case TAHOE_REG_DEFERRED:
1852 FRAG_APPEND_1_CHAR (operandP->top_mode + operandP->top_reg);
1853 break;
1854
1855 /* An absolute address. It's size is always 5 bytes.
1856 (mode_type + 4 byte address). */
1857 case TAHOE_ABSOLUTE_ADDR:
1858 know ((this_add_symbol == NULL));
1859 p = frag_more (5);
1860 *p = TAHOE_ABSOLUTE_ADDR;
1861 md_number_to_chars (p + 1, this_add_number, 4);
1862 break;
1863
1864 /* Immediate data. If the size isn't known, then it's an address
1865 + and offset, which is 4 bytes big. */
1866 case TAHOE_IMMEDIATE:
1867 if (this_add_symbol != NULL)
1868 {
1869 p = frag_more (5);
1870 *p++ = TAHOE_IMMEDIATE_LONGWORD;
1871 fix_new (frag_now, p - frag_now->fr_literal,
1872 this_add_symbol, this_add_number,
1873 FX_32, NULL);
1874 }
1875 else
1876 {
1877 /* It's a integer, and I know it's size. */
1878 if ((unsigned) this_add_number < 0x40)
1879 {
1880 /* Will it fit in a literal? */
1881 FRAG_APPEND_1_CHAR ((byte) this_add_number);
1882 }
1883 else
1884 {
1885 p = frag_more (dispsize + 1);
1886 switch (dispsize)
1887 {
1888 case 1:
1889 *p++ = TAHOE_IMMEDIATE_BYTE;
1890 *p = (byte) this_add_number;
1891 break;
1892 case 2:
1893 *p++ = TAHOE_IMMEDIATE_WORD;
1894 md_number_to_chars (p, this_add_number, 2);
1895 break;
1896 case 4:
1897 *p++ = TAHOE_IMMEDIATE_LONGWORD;
1898 md_number_to_chars (p, this_add_number, 4);
1899 break;
1900 }
1901 }
1902 }
1903 break;
1904
1905 /* Distance from the PC. If the size isn't known, we have to relax
1906 into it. The difference between this and disp(sp) is that
1907 this offset is pc_rel, and disp(sp) isn't.
1908 Note the drop through code. */
1909
1910 case TAHOE_DISPLACED_RELATIVE:
1911 case TAHOE_DISP_REL_DEFERRED:
1912 operandP->top_reg = PC_REG;
1913 pc_rel = 1;
1914
1915 /* Register, plus a displacement mode. Save the register number,
1916 and weather its deffered or not, and relax the size if it isn't
1917 known. */
1918 case TAHOE_REG_DISP:
1919 case TAHOE_REG_DISP_DEFERRED:
1920 if (operandP->top_mode == TAHOE_DISP_REL_DEFERRED ||
1921 operandP->top_mode == TAHOE_REG_DISP_DEFERRED)
1922 operandP->top_reg += 0x10; /* deffered mode is always 0x10 higher
1923 than it's non-deffered sibling. */
1924
1925 /* Is this a value out of this segment?
1926 The first part of this conditional is a cludge to make gas
1927 produce the same output as 'as' when there is a lable, in
1928 the current segment, displaceing a register. It's strange,
1929 and no one in their right mind would do it, but it's easy
1930 to cludge. */
1931 if ((dispsize == 0 && !pc_rel) ||
1932 (to_seg != now_seg && !is_undefined && to_seg != SEG_ABSOLUTE))
1933 dispsize = 4;
1934
1935 if (dispsize == 0)
1936 {
1937 /*
1938 * We have a SEG_UNKNOWN symbol, or the size isn't cast.
1939 * It might turn out to be in the same segment as
1940 * the instruction, permitting relaxation.
1941 */
1942 p = frag_var (rs_machine_dependent, 5, 2,
1943 ENCODE_RELAX (STATE_PC_RELATIVE,
1944 is_undefined ? STATE_UNDF : STATE_BYTE),
1945 this_add_symbol, this_add_number, 0);
1946 *p = operandP->top_reg;
1947 }
1948 else
1949 {
1950 /* Either this is an abs, or a cast. */
1951 p = frag_more (dispsize + 1);
1952 switch (dispsize)
1953 {
1954 case 1:
1955 *p = TAHOE_PC_OR_BYTE + operandP->top_reg;
1956 break;
1957 case 2:
1958 *p = TAHOE_PC_OR_WORD + operandP->top_reg;
1959 break;
1960 case 4:
1961 *p = TAHOE_PC_OR_LONG + operandP->top_reg;
1962 break;
1963 };
1964 fix_new (frag_now, p + 1 - frag_now->fr_literal,
1965 this_add_symbol, this_add_number,
1966 size_to_fx (dispsize, pc_rel), NULL);
1967 }
1968 break;
1969 default:
1970 as_fatal ("Barf, bad mode %x\n", operandP->top_mode);
1971 }
1972 }
1973 } /* for(operandP) */
1974 } /* if(!need_pass_2 && !goofed) */
1975 } /* tahoe_assemble() */
1976
1977
1978 /* We have no need to default values of symbols. */
1979
1980 /* ARGSUSED */
1981 symbolS *
1982 md_undefined_symbol (name)
1983 char *name;
1984 {
1985 return 0;
1986 } /* md_undefined_symbol() */
1987
1988 /* Round up a section size to the appropriate boundary. */
1989 valueT
1990 md_section_align (segment, size)
1991 segT segment;
1992 valueT size;
1993 {
1994 return ((size + 7) & ~7); /* Round all sects to multiple of 8 */
1995 } /* md_section_align() */
1996
1997 /* Exactly what point is a PC-relative offset relative TO?
1998 On the sparc, they're relative to the address of the offset, plus
1999 its size. This gets us to the following instruction.
2000 (??? Is this right? FIXME-SOON) */
2001 long
2002 md_pcrel_from (fixP)
2003 fixS *fixP;
2004 {
2005 return (((fixP->fx_type == FX_8
2006 || fixP->fx_type == FX_PCREL8)
2007 ? 1
2008 : ((fixP->fx_type == FX_16
2009 || fixP->fx_type == FX_PCREL16)
2010 ? 2
2011 : ((fixP->fx_type == FX_32
2012 || fixP->fx_type == FX_PCREL32)
2013 ? 4
2014 : 0))) + fixP->fx_where + fixP->fx_frag->fr_address);
2015 } /* md_pcrel_from() */
2016
2017 int
2018 tc_is_pcrel (fixP)
2019 fixS *fixP;
2020 {
2021 /* should never be called */
2022 know (0);
2023 return (0);
2024 } /* tc_is_pcrel() */
2025
2026 /* end of tc-tahoe.c */
This page took 0.094843 seconds and 5 git commands to generate.