tc-vax.c revision 1.19.2.1 1 /* tc-vax.c - vax-specific -
2 Copyright (C) 1987-2024 Free Software Foundation, Inc.
3
4 This file is part of GAS, the GNU Assembler.
5
6 GAS is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
10
11 GAS is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to the Free
18 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
19 02110-1301, USA. */
20
21 #include "as.h"
22
23 #include "vax-inst.h"
24 #include "obstack.h" /* For FRAG_APPEND_1_CHAR macro in "frags.h" */
25 #include "dw2gencfi.h"
26 #include "subsegs.h"
27 #include "safe-ctype.h"
28
29 #ifdef OBJ_ELF
30 #include "elf/vax.h"
31 #endif
32
33 /* These chars start a comment anywhere in a source file (except inside
34 another comment */
35 const char comment_chars[] = "#";
36
37 /* These chars only start a comment at the beginning of a line. */
38 /* Note that for the VAX the are the same as comment_chars above. */
39 const char line_comment_chars[] = "#";
40
41 const char line_separator_chars[] = ";";
42
43 /* Chars that can be used to separate mant from exp in floating point nums. */
44 const char EXP_CHARS[] = "eE";
45
46 /* Chars that mean this number is a floating point constant
47 as in 0f123.456
48 or 0H1.234E-12 (see exp chars above). */
49 const char FLT_CHARS[] = "dDfFgGhH";
50
51 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
52 changed in read.c . Ideally it shouldn't have to know about it at all,
53 but nothing is ideal around here. */
54
55 /* Hold details of an operand expression. */
56 static expressionS exp_of_operand[VIT_MAX_OPERANDS];
57 static segT seg_of_operand[VIT_MAX_OPERANDS];
58
59 /* A vax instruction after decoding. */
60 static struct vit v;
61
62 /* Hold details of big operands. */
63 LITTLENUM_TYPE big_operand_bits[VIT_MAX_OPERANDS][SIZE_OF_LARGE_NUMBER];
64 FLONUM_TYPE float_operand[VIT_MAX_OPERANDS];
65 /* Above is made to point into big_operand_bits by md_begin(). */
66
67 #ifdef OBJ_ELF
68 #define GLOBAL_OFFSET_TABLE_NAME "_GLOBAL_OFFSET_TABLE_"
69 #define PROCEDURE_LINKAGE_TABLE_NAME "_PROCEDURE_LINKAGE_TABLE_"
70 symbolS *GOT_symbol; /* Pre-defined "_GLOBAL_OFFSET_TABLE_". */
71 symbolS *PLT_symbol; /* Pre-defined "_PROCEDURE_LINKAGE_TABLE_". */
72 #endif
73
74 int flag_hash_long_names; /* -+ */
75 int flag_one; /* -1 */
76 int flag_show_after_trunc; /* -H */
77 int flag_no_hash_mixed_case; /* -h NUM */
78 #ifdef OBJ_ELF
79 int flag_want_pic; /* -k */
80 #endif
81
82 /* For VAX, relative addresses of "just the right length" are easy.
84 The branch displacement is always the last operand, even in
85 synthetic instructions.
86 For VAX, we encode the relax_substateTs (in e.g. fr_substate) as:
87
88 4 3 2 1 0 bit number
89 ---/ /--+-------+-------+-------+-------+-------+
90 | what state ? | how long ? |
91 ---/ /--+-------+-------+-------+-------+-------+
92
93 The "how long" bits are 00=byte, 01=word, 10=long.
94 This is a Un*x convention.
95 Not all lengths are legit for a given value of (what state).
96 The "how long" refers merely to the displacement length.
97 The address usually has some constant bytes in it as well.
98
99 groups for VAX address relaxing.
100
101 1. "foo" pc-relative.
102 length of byte, word, long
103
104 2a. J<cond> where <cond> is a simple flag test.
105 length of byte, word, long.
106 VAX opcodes are: (Hex)
107 bneq/bnequ 12
108 beql/beqlu 13
109 bgtr 14
110 bleq 15
111 bgeq 18
112 blss 19
113 bgtru 1a
114 blequ 1b
115 bvc 1c
116 bvs 1d
117 bgequ/bcc 1e
118 blssu/bcs 1f
119 Always, you complement 0th bit to reverse condition.
120 Always, 1-byte opcode, then 1-byte displacement.
121
122 2b. J<cond> where cond tests a memory bit.
123 length of byte, word, long.
124 Vax opcodes are: (Hex)
125 bbs e0
126 bbc e1
127 bbss e2
128 bbcs e3
129 bbsc e4
130 bbcc e5
131 Always, you complement 0th bit to reverse condition.
132 Always, 1-byte opcode, longword-address, byte-address, 1-byte-displacement
133
134 2c. J<cond> where cond tests low-order memory bit
135 length of byte,word,long.
136 Vax opcodes are: (Hex)
137 blbs e8
138 blbc e9
139 Always, you complement 0th bit to reverse condition.
140 Always, 1-byte opcode, longword-address, 1-byte displacement.
141
142 3. Jbs/Jbr.
143 length of byte,word,long.
144 Vax opcodes are: (Hex)
145 bsbb 10
146 brb 11
147 These are like (2) but there is no condition to reverse.
148 Always, 1 byte opcode, then displacement/absolute.
149
150 4a. JacbX
151 length of word, long.
152 Vax opcodes are: (Hex)
153 acbw 3d
154 acbf 4f
155 acbd 6f
156 abcb 9d
157 acbl f1
158 acbg 4ffd
159 acbh 6ffd
160 Always, we cannot reverse the sense of the branch; we have a word
161 displacement.
162 The double-byte op-codes don't hurt: we never want to modify the
163 opcode, so we don't care how many bytes are between the opcode and
164 the operand.
165
166 4b. JXobXXX
167 length of long, long, byte.
168 Vax opcodes are: (Hex)
169 aoblss f2
170 aobleq f3
171 sobgeq f4
172 sobgtr f5
173 Always, we cannot reverse the sense of the branch; we have a byte
174 displacement.
175
176 The only time we need to modify the opcode is for class 2 instructions.
177 After relax() we may complement the lowest order bit of such instruction
178 to reverse sense of branch.
179
180 For class 2 instructions, we store context of "where is the opcode literal".
181 We can change an opcode's lowest order bit without breaking anything else.
182
183 We sometimes store context in the operand literal. This way we can figure out
184 after relax() what the original addressing mode was. */
185
186 /* These displacements are relative to the start address of the
188 displacement. The first letter is Byte, Word. 2nd letter is
189 Forward, Backward. */
190 #define BF (1+ 127)
191 #define BB (1+-128)
192 #define WF (2+ 32767)
193 #define WB (2+-32768)
194 /* Don't need LF, LB because they always reach. [They are coded as 0.] */
195
196 #define C(a,b) ENCODE_RELAX(a,b)
197 /* This macro has no side-effects. */
198 #define ENCODE_RELAX(what,length) (((what) << 2) + (length))
199 #define RELAX_STATE(s) ((s) >> 2)
200 #define RELAX_LENGTH(s) ((s) & 3)
201
202 const relax_typeS md_relax_table[] =
203 {
204 {1, 1, 0, 0}, /* error sentinel 0,0 */
205 {1, 1, 0, 0}, /* unused 0,1 */
206 {1, 1, 0, 0}, /* unused 0,2 */
207 {1, 1, 0, 0}, /* unused 0,3 */
208
209 {BF + 1, BB + 1, 2, C (1, 1)},/* B^"foo" 1,0 */
210 {WF + 1, WB + 1, 3, C (1, 2)},/* W^"foo" 1,1 */
211 {0, 0, 5, 0}, /* L^"foo" 1,2 */
212 {1, 1, 0, 0}, /* unused 1,3 */
213
214 {BF, BB, 1, C (2, 1)}, /* b<cond> B^"foo" 2,0 */
215 {WF + 2, WB + 2, 4, C (2, 2)},/* br.+? brw X 2,1 */
216 {0, 0, 7, 0}, /* br.+? jmp X 2,2 */
217 {1, 1, 0, 0}, /* unused 2,3 */
218
219 {BF, BB, 1, C (3, 1)}, /* brb B^foo 3,0 */
220 {WF, WB, 2, C (3, 2)}, /* brw W^foo 3,1 */
221 {0, 0, 5, 0}, /* Jmp L^foo 3,2 */
222 {1, 1, 0, 0}, /* unused 3,3 */
223
224 {1, 1, 0, 0}, /* unused 4,0 */
225 {WF, WB, 2, C (4, 2)}, /* acb_ ^Wfoo 4,1 */
226 {0, 0, 10, 0}, /* acb_,br,jmp L^foo4,2 */
227 {1, 1, 0, 0}, /* unused 4,3 */
228
229 {BF, BB, 1, C (5, 1)}, /* Xob___,,foo 5,0 */
230 {WF + 4, WB + 4, 6, C (5, 2)},/* Xob.+2,brb.+3,brw5,1 */
231 {0, 0, 9, 0}, /* Xob.+2,brb.+6,jmp5,2 */
232 {1, 1, 0, 0}, /* unused 5,3 */
233 };
234
235 #undef C
236 #undef BF
237 #undef BB
238 #undef WF
239 #undef WB
240
241 void float_cons (int);
242 int flonum_gen2vax (int, FLONUM_TYPE *, LITTLENUM_TYPE *);
243
244 const pseudo_typeS md_pseudo_table[] =
245 {
246 {"dfloat", float_cons, 'd'},
247 {"ffloat", float_cons, 'f'},
248 {"gfloat", float_cons, 'g'},
249 {"hfloat", float_cons, 'h'},
250 {"d_floating", float_cons, 'd'},
251 {"f_floating", float_cons, 'f'},
252 {"g_floating", float_cons, 'g'},
253 {"h_floating", float_cons, 'h'},
254 {NULL, NULL, 0},
255 };
256
257 #define STATE_PC_RELATIVE (1)
258 #define STATE_CONDITIONAL_BRANCH (2)
259 #define STATE_ALWAYS_BRANCH (3) /* includes BSB... */
260 #define STATE_COMPLEX_BRANCH (4)
261 #define STATE_COMPLEX_HOP (5)
262
263 #define STATE_BYTE (0)
264 #define STATE_WORD (1)
265 #define STATE_LONG (2)
266 #define STATE_UNDF (3) /* Symbol undefined in pass1. */
267
268 #define min(a, b) ((a) < (b) ? (a) : (b))
269
270 void
272 md_number_to_chars (char con[], valueT value, int nbytes)
273 {
274 number_to_chars_littleendian (con, value, nbytes);
275 }
276
277 /* Fix up some data or instructions after we find out the value of a symbol
278 that they reference. */
279
280 void /* Knows about order of bytes in address. */
281 md_apply_fix (fixS *fixP, valueT *valueP, segT seg ATTRIBUTE_UNUSED)
282 {
283 valueT value = * valueP;
284
285 if (fixP->fx_subsy != (symbolS *) NULL)
286 as_bad_subtract (fixP);
287
288 if (fixP->fx_pcrel)
289 {
290 switch (fixP->fx_r_type)
291 {
292 case BFD_RELOC_32:
293 /* change the relocation type to 32 bit PC-relative */
294 fixP->fx_r_type = BFD_RELOC_32_PCREL;
295 if (fixP->fx_addsy != NULL)
296 {
297 /* Hack around bfd_install_relocation brain damage. */
298 value += fixP->fx_frag->fr_address + fixP->fx_where;
299 }
300 if (fixP->fx_addsy == abs_section_sym)
301 fixP->fx_done = 1;
302 break;
303 default:
304 break;
305 }
306 }
307
308 /*
309 * Common code for pc-relative and non-pc-relative cases
310 */
311 if (fixP->fx_addsy == NULL)
312 fixP->fx_done = 1;
313
314 if (fixP->fx_done)
315 number_to_chars_littleendian (fixP->fx_where + fixP->fx_frag->fr_literal,
316 value, fixP->fx_size);
317 else
318 /* Initialise the part of an instruction frag covered by the
319 relocation. (Many occurrences of frag_more followed by fix_new
320 lack any init of the frag.) Since VAX uses RELA relocs the
321 value we write into this field doesn't really matter. */
322 memset (fixP->fx_where + fixP->fx_frag->fr_literal, 0, fixP->fx_size);
323 }
324
325 /* Convert a number from VAX byte order (little endian)
326 into host byte order.
327 con is the buffer to convert,
328 nbytes is the length of the given buffer. */
329 static long
330 md_chars_to_number (unsigned char con[], int nbytes)
331 {
332 long retval;
333
334 for (retval = 0, con += nbytes - 1; nbytes--; con--)
335 {
336 retval <<= BITS_PER_CHAR;
337 retval |= *con;
338 }
339 return retval;
340 }
341
342 /* Copy a bignum from in to out.
343 If the output is shorter than the input, copy lower-order
344 littlenums. Return 0 or the number of significant littlenums
345 dropped. Assumes littlenum arrays are densely packed: no unused
346 chars between the littlenums. Uses memcpy() to move littlenums, and
347 wants to know length (in chars) of the input bignum. */
348
349 static int
350 bignum_copy (LITTLENUM_TYPE *in,
351 int in_length, /* in sizeof(littlenum)s */
352 LITTLENUM_TYPE *out,
353 int out_length /* in sizeof(littlenum)s */)
354 {
355 int significant_littlenums_dropped;
356
357 if (out_length < in_length)
358 {
359 LITTLENUM_TYPE *p; /* -> most significant (non-zero) input
360 littlenum. */
361
362 memcpy ((void *) out, (void *) in,
363 (unsigned int) out_length << LITTLENUM_SHIFT);
364 for (p = in + in_length - 1; p >= in; --p)
365 {
366 if (*p)
367 break;
368 }
369 significant_littlenums_dropped = p - in - in_length + 1;
370
371 if (significant_littlenums_dropped < 0)
372 significant_littlenums_dropped = 0;
373 }
374 else
375 {
376 memcpy ((char *) out, (char *) in,
377 (unsigned int) in_length << LITTLENUM_SHIFT);
378
379 if (out_length > in_length)
380 memset ((char *) (out + in_length), '\0',
381 (unsigned int) (out_length - in_length) << LITTLENUM_SHIFT);
382
383 significant_littlenums_dropped = 0;
384 }
385
386 return significant_littlenums_dropped;
387 }
388
389 /* md_estimate_size_before_relax(), called just before relax().
391 Any symbol that is now undefined will not become defined.
392 Return the correct fr_subtype in the frag and the growth beyond
393 fr_fix. */
394 int
395 md_estimate_size_before_relax (fragS *fragP, segT segment)
396 {
397 if (RELAX_LENGTH (fragP->fr_subtype) == STATE_UNDF)
398 {
399 if (S_GET_SEGMENT (fragP->fr_symbol) != segment
400 #ifdef OBJ_ELF
401 || S_IS_WEAK (fragP->fr_symbol)
402 || S_IS_EXTERNAL (fragP->fr_symbol)
403 #endif
404 )
405 {
406 /* Non-relaxable cases. */
407 int reloc_type = NO_RELOC;
408 char *p;
409 int old_fr_fix;
410
411 old_fr_fix = fragP->fr_fix;
412 p = &fragP->fr_literal[0] + old_fr_fix;
413 #ifdef OBJ_ELF
414 /* If this is to an undefined symbol, then if it's an indirect
415 reference indicate that is can mutated into a GLOB_DAT or
416 JUMP_SLOT by the loader. We restrict ourselves to no offset
417 due to a limitation in the NetBSD linker. */
418
419 if (GOT_symbol == NULL)
420 GOT_symbol = symbol_find (GLOBAL_OFFSET_TABLE_NAME);
421 if (PLT_symbol == NULL)
422 PLT_symbol = symbol_find (PROCEDURE_LINKAGE_TABLE_NAME);
423 if ((GOT_symbol == NULL || fragP->fr_symbol != GOT_symbol)
424 && (PLT_symbol == NULL || fragP->fr_symbol != PLT_symbol)
425 && fragP->fr_symbol != NULL
426 && flag_want_pic
427 #ifdef OBJ_ELF
428 && ELF_ST_VISIBILITY (S_GET_OTHER (fragP->fr_symbol)) != STV_HIDDEN
429 #endif
430 && (!S_IS_DEFINED (fragP->fr_symbol)
431 || S_IS_WEAK (fragP->fr_symbol)
432 || S_IS_EXTERNAL (fragP->fr_symbol)))
433 {
434 /* Indirect references cannot go through the GOT or PLT,
435 let's hope they'll become local in the final link. */
436 if ((ELF_ST_VISIBILITY (S_GET_OTHER (fragP->fr_symbol))
437 != STV_DEFAULT)
438 || (p[0] & 0x10))
439 reloc_type = BFD_RELOC_32_PCREL;
440 else if (((unsigned char *) fragP->fr_opcode)[0] == VAX_CALLS
441 || ((unsigned char *) fragP->fr_opcode)[0] == VAX_CALLG
442 || ((unsigned char *) fragP->fr_opcode)[0] == VAX_JSB
443 || ((unsigned char *) fragP->fr_opcode)[0] == VAX_JMP
444 #if 0 /* port-vax/59326 */
445 || S_IS_FUNCTION (fragP->fr_symbol)
446 #endif
447 )
448 reloc_type = BFD_RELOC_32_PLT_PCREL;
449 else
450 reloc_type = BFD_RELOC_32_GOT_PCREL;
451 }
452 #endif
453 switch (RELAX_STATE (fragP->fr_subtype))
454 {
455 case STATE_PC_RELATIVE:
456 p[0] |= VAX_PC_RELATIVE_MODE; /* Preserve @ bit. */
457 fragP->fr_fix += 1 + 4;
458 fix_new (fragP, old_fr_fix + 1, 4, fragP->fr_symbol,
459 fragP->fr_offset, 1, reloc_type);
460 break;
461
462 case STATE_CONDITIONAL_BRANCH:
463 *fragP->fr_opcode ^= 1; /* Reverse sense of branch. */
464 p[0] = 6;
465 p[1] = VAX_JMP;
466 p[2] = VAX_PC_RELATIVE_MODE; /* ...(PC) */
467 fragP->fr_fix += 1 + 1 + 1 + 4;
468 fix_new (fragP, old_fr_fix + 3, 4, fragP->fr_symbol,
469 fragP->fr_offset, 1, NO_RELOC);
470 break;
471
472 case STATE_COMPLEX_BRANCH:
473 p[0] = 2;
474 p[1] = 0;
475 p[2] = VAX_BRB;
476 p[3] = 6;
477 p[4] = VAX_JMP;
478 p[5] = VAX_PC_RELATIVE_MODE; /* ...(pc) */
479 fragP->fr_fix += 2 + 2 + 1 + 1 + 4;
480 fix_new (fragP, old_fr_fix + 6, 4, fragP->fr_symbol,
481 fragP->fr_offset, 1, NO_RELOC);
482 break;
483
484 case STATE_COMPLEX_HOP:
485 p[0] = 2;
486 p[1] = VAX_BRB;
487 p[2] = 6;
488 p[3] = VAX_JMP;
489 p[4] = VAX_PC_RELATIVE_MODE; /* ...(pc) */
490 fragP->fr_fix += 1 + 2 + 1 + 1 + 4;
491 fix_new (fragP, old_fr_fix + 5, 4, fragP->fr_symbol,
492 fragP->fr_offset, 1, NO_RELOC);
493 break;
494
495 case STATE_ALWAYS_BRANCH:
496 *fragP->fr_opcode += VAX_WIDEN_LONG;
497 p[0] = VAX_PC_RELATIVE_MODE; /* ...(PC) */
498 fragP->fr_fix += 1 + 4;
499 fix_new (fragP, old_fr_fix + 1, 4, fragP->fr_symbol,
500 fragP->fr_offset, 1, NO_RELOC);
501 break;
502
503 default:
504 abort ();
505 }
506 frag_wane (fragP);
507
508 /* Return the growth in the fixed part of the frag. */
509 return fragP->fr_fix - old_fr_fix;
510 }
511
512 /* Relaxable cases. Set up the initial guess for the variable
513 part of the frag. */
514 switch (RELAX_STATE (fragP->fr_subtype))
515 {
516 case STATE_PC_RELATIVE:
517 fragP->fr_subtype = ENCODE_RELAX (STATE_PC_RELATIVE, STATE_BYTE);
518 break;
519 case STATE_CONDITIONAL_BRANCH:
520 fragP->fr_subtype = ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_BYTE);
521 break;
522 case STATE_COMPLEX_BRANCH:
523 fragP->fr_subtype = ENCODE_RELAX (STATE_COMPLEX_BRANCH, STATE_WORD);
524 break;
525 case STATE_COMPLEX_HOP:
526 fragP->fr_subtype = ENCODE_RELAX (STATE_COMPLEX_HOP, STATE_BYTE);
527 break;
528 case STATE_ALWAYS_BRANCH:
529 fragP->fr_subtype = ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_BYTE);
530 break;
531 }
532 }
533
534 if (fragP->fr_subtype >= sizeof (md_relax_table) / sizeof (md_relax_table[0]))
535 abort ();
536
537 /* Return the size of the variable part of the frag. */
538 return md_relax_table[fragP->fr_subtype].rlx_length;
539 }
540
541 /* Called after relax() is finished.
543 In: Address of frag.
544 fr_type == rs_machine_dependent.
545 fr_subtype is what the address relaxed to.
546
547 Out: Any fixSs and constants are set up.
548 Caller will turn frag into a ".space 0". */
549 void
550 md_convert_frag (bfd *headers ATTRIBUTE_UNUSED,
551 segT seg ATTRIBUTE_UNUSED,
552 fragS *fragP)
553 {
554 char *addressP; /* -> _var to change. */
555 char *opcodeP; /* -> opcode char(s) to change. */
556 short int extension = 0; /* Size of relaxed address. */
557 /* Added to fr_fix: incl. ALL var chars. */
558 symbolS *symbolP;
559 long where;
560
561 know (fragP->fr_type == rs_machine_dependent);
562 where = fragP->fr_fix;
563 addressP = &fragP->fr_literal[0] + where;
564 opcodeP = fragP->fr_opcode;
565 symbolP = fragP->fr_symbol;
566 know (symbolP);
567
568 switch (fragP->fr_subtype)
569 {
570 case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_BYTE):
571 know (*addressP == 0 || *addressP == 0x10); /* '@' bit. */
572 addressP[0] |= 0xAF; /* Byte displacement. */
573 fix_new (fragP, fragP->fr_fix + 1, 1, fragP->fr_symbol,
574 fragP->fr_offset, 1, NO_RELOC);
575 extension = 2;
576 break;
577
578 case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_WORD):
579 know (*addressP == 0 || *addressP == 0x10); /* '@' bit. */
580 addressP[0] |= 0xCF; /* Word displacement. */
581 fix_new (fragP, fragP->fr_fix + 1, 2, fragP->fr_symbol,
582 fragP->fr_offset, 1, NO_RELOC);
583 extension = 3;
584 break;
585
586 case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_LONG):
587 know (*addressP == 0 || *addressP == 0x10); /* '@' bit. */
588 addressP[0] |= 0xEF; /* Long word displacement. */
589 fix_new (fragP, fragP->fr_fix + 1, 4, fragP->fr_symbol,
590 fragP->fr_offset, 1, NO_RELOC);
591 extension = 5;
592 break;
593
594 case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_BYTE):
595 fix_new (fragP, fragP->fr_fix, 1, fragP->fr_symbol,
596 fragP->fr_offset, 1, NO_RELOC);
597 extension = 1;
598 break;
599
600 case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_WORD):
601 opcodeP[0] ^= 1; /* Reverse sense of test. */
602 addressP[0] = 3;
603 addressP[1] = VAX_BRW;
604 fix_new (fragP, fragP->fr_fix + 2, 2, fragP->fr_symbol,
605 fragP->fr_offset, 1, NO_RELOC);
606 extension = 4;
607 break;
608
609 case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_LONG):
610 opcodeP[0] ^= 1; /* Reverse sense of test. */
611 addressP[0] = 6;
612 addressP[1] = VAX_JMP;
613 addressP[2] = VAX_PC_RELATIVE_MODE;
614 fix_new (fragP, fragP->fr_fix + 3, 4, fragP->fr_symbol,
615 fragP->fr_offset, 1, NO_RELOC);
616 extension = 7;
617 break;
618
619 case ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_BYTE):
620 fix_new (fragP, fragP->fr_fix, 1, fragP->fr_symbol,
621 fragP->fr_offset, 1, NO_RELOC);
622 extension = 1;
623 break;
624
625 case ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_WORD):
626 opcodeP[0] += VAX_WIDEN_WORD; /* brb -> brw, bsbb -> bsbw */
627 fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, fragP->fr_offset,
628 1, NO_RELOC);
629 extension = 2;
630 break;
631
632 case ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_LONG):
633 opcodeP[0] += VAX_WIDEN_LONG; /* brb -> jmp, bsbb -> jsb */
634 addressP[0] = VAX_PC_RELATIVE_MODE;
635 fix_new (fragP, fragP->fr_fix + 1, 4, fragP->fr_symbol,
636 fragP->fr_offset, 1, NO_RELOC);
637 extension = 5;
638 break;
639
640 case ENCODE_RELAX (STATE_COMPLEX_BRANCH, STATE_WORD):
641 fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
642 fragP->fr_offset, 1, NO_RELOC);
643 extension = 2;
644 break;
645
646 case ENCODE_RELAX (STATE_COMPLEX_BRANCH, STATE_LONG):
647 addressP[0] = 2;
648 addressP[1] = 0;
649 addressP[2] = VAX_BRB;
650 addressP[3] = 6;
651 addressP[4] = VAX_JMP;
652 addressP[5] = VAX_PC_RELATIVE_MODE;
653 fix_new (fragP, fragP->fr_fix + 6, 4, fragP->fr_symbol,
654 fragP->fr_offset, 1, NO_RELOC);
655 extension = 10;
656 break;
657
658 case ENCODE_RELAX (STATE_COMPLEX_HOP, STATE_BYTE):
659 fix_new (fragP, fragP->fr_fix, 1, fragP->fr_symbol,
660 fragP->fr_offset, 1, NO_RELOC);
661 extension = 1;
662 break;
663
664 case ENCODE_RELAX (STATE_COMPLEX_HOP, STATE_WORD):
665 addressP[0] = 2;
666 addressP[1] = VAX_BRB;
667 addressP[2] = 3;
668 addressP[3] = VAX_BRW;
669 fix_new (fragP, fragP->fr_fix + 4, 2, fragP->fr_symbol,
670 fragP->fr_offset, 1, NO_RELOC);
671 extension = 6;
672 break;
673
674 case ENCODE_RELAX (STATE_COMPLEX_HOP, STATE_LONG):
675 addressP[0] = 2;
676 addressP[1] = VAX_BRB;
677 addressP[2] = 6;
678 addressP[3] = VAX_JMP;
679 addressP[4] = VAX_PC_RELATIVE_MODE;
680 fix_new (fragP, fragP->fr_fix + 5, 4, fragP->fr_symbol,
681 fragP->fr_offset, 1, NO_RELOC);
682 extension = 9;
683 break;
684
685 default:
686 BAD_CASE (fragP->fr_subtype);
687 break;
688 }
689 fragP->fr_fix += extension;
690 }
691
692 /* Translate internal format of relocation info into target format.
693
694 On vax: first 4 bytes are normal unsigned long, next three bytes
695 are symbolnum, least sig. byte first. Last byte is broken up with
696 the upper nibble as nuthin, bit 3 as extern, bits 2 & 1 as length, and
697 bit 0 as pcrel. */
698 #ifdef comment
699 void
700 md_ri_to_chars (char *the_bytes, struct reloc_info_generic ri)
701 {
702 /* This is easy. */
703 md_number_to_chars (the_bytes, ri.r_address, sizeof (ri.r_address));
704 /* Now the fun stuff. */
705 the_bytes[6] = (ri.r_symbolnum >> 16) & 0x0ff;
706 the_bytes[5] = (ri.r_symbolnum >> 8) & 0x0ff;
707 the_bytes[4] = ri.r_symbolnum & 0x0ff;
708 the_bytes[7] = (((ri.r_extern << 3) & 0x08) | ((ri.r_length << 1) & 0x06)
709 | ((ri.r_pcrel << 0) & 0x01)) & 0x0F;
710 }
711
712 #endif /* comment */
713
714 /* BUGS, GRIPES, APOLOGIA, etc.
715
716 The opcode table 'votstrs' needs to be sorted on opcode frequency.
717 That is, AFTER we hash it with hash_...(), we want most-used opcodes
718 to come out of the hash table faster.
719
720 I am sorry to inflict yet another VAX assembler on the world, but
721 RMS says we must do everything from scratch, to prevent pin-heads
722 restricting this software.
723
724 This is a vaguely modular set of routines in C to parse VAX
725 assembly code using DEC mnemonics. It is NOT un*x specific.
726
727 The idea here is that the assembler has taken care of all:
728 labels
729 macros
730 listing
731 pseudo-ops
732 line continuation
733 comments
734 condensing any whitespace down to exactly one space
735 and all we have to do is parse 1 line into a vax instruction
736 partially formed. We will accept a line, and deliver:
737 an error message (hopefully empty)
738 a skeleton VAX instruction (tree structure)
739 textual pointers to all the operand expressions
740 a warning message that notes a silly operand (hopefully empty)
741
742 E D I T H I S T O R Y
743
744 17may86 Dean Elsner. Bug if line ends immediately after opcode.
745 30apr86 Dean Elsner. New vip_op() uses arg block so change call.
746 6jan86 Dean Elsner. Crock vip_begin() to call vip_op_defaults().
747 2jan86 Dean Elsner. Invent synthetic opcodes.
748 Widen vax_opcodeT to 32 bits. Use a bit for VIT_OPCODE_SYNTHETIC,
749 which means this is not a real opcode, it is like a macro; it will
750 be relax()ed into 1 or more instructions.
751 Use another bit for VIT_OPCODE_SPECIAL if the op-code is not optimised
752 like a regular branch instruction. Option added to vip_begin():
753 exclude synthetic opcodes. Invent synthetic_votstrs[].
754 31dec85 Dean Elsner. Invent vit_opcode_nbytes.
755 Also make vit_opcode into a char[]. We now have n-byte vax opcodes,
756 so caller's don't have to know the difference between a 1-byte & a
757 2-byte op-code. Still need vax_opcodeT concept, so we know how
758 big an object must be to hold an op.code.
759 30dec85 Dean Elsner. Widen typedef vax_opcodeT in "vax-inst.h"
760 because vax opcodes may be 16 bits. Our crufty C compiler was
761 happily initialising 8-bit vot_codes with 16-bit numbers!
762 (Wouldn't the 'phone company like to compress data so easily!)
763 29dec85 Dean Elsner. New static table vax_operand_width_size[].
764 Invented so we know hw many bytes a "I^#42" needs in its immediate
765 operand. Revised struct vop in "vax-inst.h": explicitly include
766 byte length of each operand, and it's letter-code datum type.
767 17nov85 Dean Elsner. Name Change.
768 Due to ar(1) truncating names, we learned the hard way that
769 "vax-inst-parse.c" -> "vax-inst-parse." dropping the "o" off
770 the archived object name. SO... we shortened the name of this
771 source file, and changed the makefile. */
772
773 /* Handle of the OPCODE hash table. */
774 static htab_t op_hash;
775
776 /* In: 1 character, from "bdfghloqpw" being the data-type of an operand
777 of a vax instruction.
778
779 Out: the length of an operand of that type, in bytes.
780 Special branch operands types "-?!" have length 0. */
781
782 static const short int vax_operand_width_size[256] =
783 {
784 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
785 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
786 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
787 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
788 0, 0, 1, 0, 8, 0, 4, 8, 16, 0, 0, 0, 4, 0, 0,16, /* ..b.d.fgh...l..o */
789 0, 8, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, /* .q.....w........ */
790 0, 0, 1, 0, 8, 0, 4, 8, 16, 0, 0, 0, 4, 0, 0,16, /* ..b.d.fgh...l..o */
791 0, 8, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, /* .q.....w........ */
792 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
793 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
794 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
795 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
796 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
797 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
798 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
799 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
800 };
801
802 /* This perversion encodes all the vax opcodes as a bunch of strings.
804 RMS says we should build our hash-table at run-time. Hmm.
805 Please would someone arrange these in decreasing frequency of opcode?
806 Because of the way hash_...() works, the most frequently used opcode
807 should be textually first and so on.
808
809 Input for this table was 'vax.opcodes', awk(1)ed by 'vax.opcodes.c.awk' .
810 So change 'vax.opcodes', then re-generate this table. */
811
812 #include "opcode/vax.h"
813
814 /* This is a table of optional op-codes. All of them represent
816 'synthetic' instructions that seem popular.
817
818 Here we make some pseudo op-codes. Every code has a bit set to say
819 it is synthetic. This lets you catch them if you want to
820 ban these opcodes. They are mnemonics for "elastic" instructions
821 that are supposed to assemble into the fewest bytes needed to do a
822 branch, or to do a conditional branch, or whatever.
823
824 The opcode is in the usual place [low-order n*8 bits]. This means
825 that if you mask off the bucky bits, the usual rules apply about
826 how long the opcode is.
827
828 All VAX branch displacements come at the end of the instruction.
829 For simple branches (1-byte opcode + 1-byte displacement) the last
830 operand is coded 'b?' where the "data type" '?' is a clue that we
831 may reverse the sense of the branch (complement lowest order bit)
832 and branch around a jump. This is by far the most common case.
833 That is why the VIT_OPCODE_SYNTHETIC bit is set: it says this is
834 a 0-byte op-code followed by 2 or more bytes of operand address.
835
836 If the op-code has VIT_OPCODE_SPECIAL set, then we have a more unusual
837 case.
838
839 For JBSB & JBR the treatment is the similar, except (1) we have a 'bw'
840 option before (2) we can directly JSB/JMP because there is no condition.
841 These operands have 'b-' as their access/data type.
842
843 That leaves a bunch of random opcodes: JACBx, JxOBxxx. In these
844 cases, we do the same idea. JACBxxx are all marked with a 'b!'
845 JAOBxxx & JSOBxxx are marked with a 'b:'. */
846 #if (VIT_OPCODE_SYNTHETIC != 0x80000000)
847 #error "You have just broken the encoding below, which assumes the sign bit means 'I am an imaginary instruction'."
848 #endif
849
850 #if (VIT_OPCODE_SPECIAL != 0x40000000)
851 #error "You have just broken the encoding below, which assumes the 0x40 M bit means 'I am not to be "optimised" the way normal branches are'."
852 #endif
853
854 static const struct vot
855 synthetic_votstrs[] =
856 {
857 {"jbsb", {"b-", 0xC0000010}}, /* BSD 4.2 */
858 /* jsb used already */
859 {"jbr", {"b-", 0xC0000011}}, /* BSD 4.2 */
860 {"jr", {"b-", 0xC0000011}}, /* consistent */
861 {"jneq", {"b?", 0x80000012}},
862 {"jnequ", {"b?", 0x80000012}},
863 {"jeql", {"b?", 0x80000013}},
864 {"jeqlu", {"b?", 0x80000013}},
865 {"jgtr", {"b?", 0x80000014}},
866 {"jleq", {"b?", 0x80000015}},
867 /* un-used opcodes here */
868 {"jgeq", {"b?", 0x80000018}},
869 {"jlss", {"b?", 0x80000019}},
870 {"jgtru", {"b?", 0x8000001a}},
871 {"jlequ", {"b?", 0x8000001b}},
872 {"jvc", {"b?", 0x8000001c}},
873 {"jvs", {"b?", 0x8000001d}},
874 {"jgequ", {"b?", 0x8000001e}},
875 {"jcc", {"b?", 0x8000001e}},
876 {"jlssu", {"b?", 0x8000001f}},
877 {"jcs", {"b?", 0x8000001f}},
878
879 {"jacbw", {"rwrwmwb!", 0xC000003d}},
880 {"jacbf", {"rfrfmfb!", 0xC000004f}},
881 {"jacbd", {"rdrdmdb!", 0xC000006f}},
882 {"jacbb", {"rbrbmbb!", 0xC000009d}},
883 {"jacbl", {"rlrlmlb!", 0xC00000f1}},
884 {"jacbg", {"rgrgmgb!", 0xC0004ffd}},
885 {"jacbh", {"rhrhmhb!", 0xC0006ffd}},
886
887 {"jbs", {"rlvbb?", 0x800000e0}},
888 {"jbc", {"rlvbb?", 0x800000e1}},
889 {"jbss", {"rlvbb?", 0x800000e2}},
890 {"jbcs", {"rlvbb?", 0x800000e3}},
891 {"jbsc", {"rlvbb?", 0x800000e4}},
892 {"jbcc", {"rlvbb?", 0x800000e5}},
893 {"jbssi", {"rlvbb?", 0x800000e6}},
894 {"jbcci", {"rlvbb?", 0x800000e7}},
895 {"jlbs", {"rlb?", 0x800000e8}},
896 {"jlbc", {"rlb?", 0x800000e9}},
897
898 {"jaoblss", {"rlmlb:", 0xC00000f2}},
899 {"jaobleq", {"rlmlb:", 0xC00000f3}},
900 {"jsobgeq", {"mlb:", 0xC00000f4}},
901 {"jsobgtr", {"mlb:", 0xC00000f5}},
902
903 /* CASEx has no branch addresses in our conception of it. */
904 /* You should use ".word ..." statements after the "case ...". */
905
906 {"", {"", 0}} /* Empty is end sentinel. */
907 };
908
909 /* Because this module is useful for both VMS and UN*X style assemblers
911 and because of the variety of UN*X assemblers we must recognise
912 the different conventions for assembler operand notation. For example
913 VMS says "#42" for immediate mode, while most UN*X say "$42".
914 We permit arbitrary sets of (single) characters to represent the
915 3 concepts that DEC writes '#', '@', '^'. */
916
917 /* Character tests. */
918 #define VIP_IMMEDIATE 01 /* Character is like DEC # */
919 #define VIP_INDIRECT 02 /* Char is like DEC @ */
920 #define VIP_DISPLEN 04 /* Char is like DEC ^ */
921
922 #define IMMEDIATEP(c) (vip_metacharacters [(c) & 0xff] & VIP_IMMEDIATE)
923 #define INDIRECTP(c) (vip_metacharacters [(c) & 0xff] & VIP_INDIRECT)
924 #define DISPLENP(c) (vip_metacharacters [(c) & 0xff] & VIP_DISPLEN)
925
926 /* We assume 8 bits per byte. Use vip_op_defaults() to set these up BEFORE we
927 are ever called. */
928
929 #if defined(CONST_TABLE)
930 #define _ 0,
931 #define I VIP_IMMEDIATE,
932 #define S VIP_INDIRECT,
933 #define D VIP_DISPLEN,
934 static const char
935 vip_metacharacters[256] =
936 {
937 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /* ^@ ^A ^B ^C ^D ^E ^F ^G ^H ^I ^J ^K ^L ^M ^N ^O*/
938 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /* ^P ^Q ^R ^S ^T ^U ^V ^W ^X ^Y ^Z ^[ ^\ ^] ^^ ^_ */
939 _ _ _ _ I _ _ _ _ _ S _ _ _ _ _ /* sp ! " # $ % & ' ( ) * + , - . / */
940 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /*0 1 2 3 4 5 6 7 8 9 : ; < = > ?*/
941 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /*@ A B C D E F G H I J K L M N O*/
942 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /*P Q R S T U V W X Y Z [ \ ] ^ _*/
943 D _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /*` a b c d e f g h i j k l m n o*/
944 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /*p q r s t u v w x y z { | } ~ ^?*/
945
946 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
947 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
948 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
949 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
950 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
951 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
952 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
953 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
954 };
955 #undef _
956 #undef I
957 #undef S
958 #undef D
959
960 #else
961
962 static char vip_metacharacters[256];
963
964 static void
965 vip_op_1 (int bit, const char *syms)
966 {
967 unsigned char t;
968
969 while ((t = *syms++) != 0)
970 vip_metacharacters[t] |= bit;
971 }
972
973 /* Can be called any time. More arguments may appear in future. */
974 static void
975 vip_op_defaults (const char *immediate, const char *indirect, const char *displen)
976 {
977 vip_op_1 (VIP_IMMEDIATE, immediate);
978 vip_op_1 (VIP_INDIRECT, indirect);
979 vip_op_1 (VIP_DISPLEN, displen);
980 }
981
982 #endif
983
984 /* Call me once before you decode any lines.
985 I decode votstrs into a hash table at op_hash (which I create).
986 I return an error text or null.
987 If you want, I will include the 'synthetic' jXXX instructions in the
988 instruction table.
989 You must nominate metacharacters for eg DEC's "#", "@", "^". */
990
991 static void
992 vip_begin (int synthetic_too, /* 1 means include jXXX op-codes. */
993 const char *immediate,
994 const char *indirect,
995 const char *displen)
996 {
997 const struct vot *vP; /* scan votstrs */
998
999 op_hash = str_htab_create ();
1000
1001 for (vP = votstrs; *vP->vot_name; vP++)
1002 if (str_hash_insert (op_hash, vP->vot_name, &vP->vot_detail, 0) != NULL)
1003 as_fatal (_("duplicate %s"), vP->vot_name);
1004
1005 if (synthetic_too)
1006 for (vP = synthetic_votstrs; *vP->vot_name; vP++)
1007 if (str_hash_insert (op_hash, vP->vot_name, &vP->vot_detail, 0) != NULL)
1008 as_fatal (_("duplicate %s"), vP->vot_name);
1009
1010 #ifndef CONST_TABLE
1011 vip_op_defaults (immediate, indirect, displen);
1012 #endif
1013 }
1014
1015 /* Take 3 char.s, the last of which may be `\0` (non-existent)
1016 and return the VAX register number that they represent.
1017
1018 Return -1 if they don't form a register name. Good names return
1019 a number from 0:15 inclusive.
1020
1021 Case is not important in a name.
1022
1023 Register names understood are:
1024
1025 R0
1026 R1
1027 R2
1028 R3
1029 R4
1030 R5
1031 R6
1032 R7
1033 R8
1034 R9
1035 R10
1036 R11
1037 R12 AP
1038 R13 FP
1039 R14 SP
1040 R15 PC */
1041
1042 #define AP 12
1043 #define FP 13
1044 #define SP 14
1045 #define PC 15
1046
1047 /* Returns the register number of something like '%r15' or 'ap', supplied
1048 in four single chars. Returns -1 if the register isn't recognized,
1049 0..15 otherwise. */
1050 static int
1051 vax_reg_parse (char c1, char c2, char c3, char c4)
1052 {
1053 int retval = -1;
1054
1055 #ifdef OBJ_ELF
1056 if (c1 != '%') /* Register prefixes are mandatory for ELF. */
1057 return retval;
1058 c1 = c2;
1059 c2 = c3;
1060 c3 = c4;
1061 #endif
1062 #ifdef OBJ_VMS
1063 if (c4 != 0) /* Register prefixes are not allowed under VMS. */
1064 return retval;
1065 #endif
1066 #ifdef OBJ_AOUT
1067 if (c1 == '%') /* Register prefixes are optional under a.out. */
1068 {
1069 c1 = c2;
1070 c2 = c3;
1071 c3 = c4;
1072 }
1073 else if (c3 && c4) /* Can't be 4 characters long. */
1074 return retval;
1075 #endif
1076
1077 c1 = TOLOWER (c1);
1078 c2 = TOLOWER (c2);
1079 if (ISDIGIT (c2) && c1 == 'r')
1080 {
1081 retval = c2 - '0';
1082 if (ISDIGIT (c3))
1083 {
1084 retval = retval * 10 + c3 - '0';
1085 retval = (retval > 15) ? -1 : retval;
1086 /* clamp the register value to 1 hex digit */
1087 }
1088 else if (c3)
1089 retval = -1; /* c3 must be '\0' or a digit. */
1090 }
1091 else if (c3) /* There are no three letter regs. */
1092 retval = -1;
1093 else if (c2 == 'p')
1094 {
1095 switch (c1)
1096 {
1097 case 's':
1098 retval = SP;
1099 break;
1100 case 'f':
1101 retval = FP;
1102 break;
1103 case 'a':
1104 retval = AP;
1105 break;
1106 default:
1107 retval = -1;
1108 }
1109 }
1110 else if (c1 == 'p' && c2 == 'c')
1111 retval = PC;
1112 else
1113 retval = -1;
1114 return retval;
1115 }
1116
1117 #ifdef OBJ_AOUT
1118 #ifndef BFD_ASSEMBLER
1119 void
1120 tc_aout_fix_to_chars (where, fixP, segment_address_in_file)
1121 char *where;
1122 fixS *fixP;
1123 relax_addressT segment_address_in_file;
1124 {
1125 /*
1126 * In: length of relocation (or of address) in chars: 1, 2 or 4.
1127 * Out: GNU LD relocation length code: 0, 1, or 2.
1128 */
1129
1130 static const unsigned char nbytes_r_length[] = {42, 0, 1, 42, 2};
1131 int r_symbolnum;
1132 int r_flags;
1133
1134 know (fixP->fx_addsy != NULL);
1135
1136 md_number_to_chars (where,
1137 fixP->fx_frag->fr_address + fixP->fx_where - segment_address_in_file,
1138 4);
1139
1140 r_symbolnum = (S_IS_DEFINED (fixP->fx_addsy)
1141 ? S_GET_TYPE (fixP->fx_addsy)
1142 : fixP->fx_addsy->sy_number);
1143 r_flags = (fixP->fx_pcrel ? 1 : 0)
1144 | (!S_IS_DEFINED (fixP->fx_addsy) ? 8 : 0) /* extern */
1145 | ((nbytes_r_length[fixP->fx_size] & 3) << 1);
1146
1147 switch (fixP->fx_r_type) {
1148 case NO_RELOC:
1149 break;
1150 case NO_RELOC2:
1151 if (r_flags & 8)
1152 r_flags |= 0x80; /* setting the copy bit */
1153 /* says we can convert */
1154 /* to gotslot if needed */
1155 break;
1156 case RELOC_32:
1157 if (flag_want_pic && S_IS_EXTERNAL(fixP->fx_addsy)) {
1158 r_symbolnum = fixP->fx_addsy->sy_number;
1159 r_flags |= 8; /* set extern bit */
1160 }
1161 break;
1162 case RELOC_JMP_SLOT:
1163 if (flag_want_pic) {
1164 r_flags |= 0x20; /* set jmptable */
1165 r_flags &= ~0x08; /* clear extern bit */
1166 }
1167 break;
1168 case RELOC_JMP_TBL:
1169 if (flag_want_pic) {
1170 r_flags |= 0x20; /* set jmptable */
1171 r_flags |= 0x08; /* set extern bit */
1172 }
1173 break;
1174 case RELOC_GLOB_DAT:
1175 if (flag_want_pic) {
1176 r_flags |= 0x10; /* set baserel bit */
1177 r_symbolnum = fixP->fx_addsy->sy_number;
1178 if (S_IS_EXTERNAL(fixP->fx_addsy))
1179 r_flags |= 8; /* set extern bit */
1180 }
1181 break;
1182 }
1183
1184 where[4] = (r_symbolnum >> 0) & 0xff;
1185 where[5] = (r_symbolnum >> 8) & 0xff;
1186 where[6] = (r_symbolnum >> 16) & 0xff;
1187 where[7] = r_flags;
1188 }
1189 #endif /* !BFD_ASSEMBLER */
1190 #endif /* OBJ_AOUT */
1191
1192 /* Parse a vax operand in DEC assembler notation.
1193 For speed, expect a string of whitespace to be reduced to a single ' '.
1194 This is the case for GNU AS, and is easy for other DEC-compatible
1195 assemblers.
1196
1197 Knowledge about DEC VAX assembler operand notation lives here.
1198 This doesn't even know what a register name is, except it believes
1199 all register names are 2 or 3 characters, and lets vax_reg_parse() say
1200 what number each name represents.
1201 It does, however, know that PC, SP etc are special registers so it can
1202 detect addressing modes that are silly for those registers.
1203
1204 Where possible, it delivers 1 fatal or 1 warning message if the operand
1205 is suspect. Exactly what we test for is still evolving.
1206
1207 ---
1208 Arg block.
1209
1210 There were a number of 'mismatched argument type' bugs to vip_op.
1211 The most general solution is to typedef each (of many) arguments.
1212 We used instead a typedef'd argument block. This is less modular
1213 than using separate return pointers for each result, but runs faster
1214 on most engines, and seems to keep programmers happy. It will have
1215 to be done properly if we ever want to use vip_op as a general-purpose
1216 module (it was designed to be).
1217
1218 G^
1219
1220 Doesn't support DEC "G^" format operands. These always take 5 bytes
1221 to express, and code as modes 8F or 9F. Reason: "G^" deprives you of
1222 optimising to (say) a "B^" if you are lucky in the way you link.
1223 When someone builds a linker smart enough to convert "G^" to "B^", "W^"
1224 whenever possible, then we should implement it.
1225 If there is some other use for "G^", feel free to code it in!
1226
1227 speed
1228
1229 If I nested if()s more, I could avoid testing (*err) which would save
1230 time, space and page faults. I didn't nest all those if()s for clarity
1231 and because I think the mode testing can be re-arranged 1st to test the
1232 commoner constructs 1st. Does anybody have statistics on this?
1233
1234 error messages
1235
1236 In future, we should be able to 'compose' error messages in a scratch area
1237 and give the user MUCH more informative error messages. Although this takes
1238 a little more code at run-time, it will make this module much more self-
1239 documenting. As an example of what sucks now: most error messages have
1240 hardwired into them the DEC VAX metacharacters "#^@" which are nothing like
1241 the Un*x characters "$`*", that most users will expect from this AS.
1242
1243 ----
1244
1245 The input is a string, ending with '\0'.
1246
1247 We also require a 'hint' of what kind of operand is expected: so
1248 we can remind caller not to write into literals for instance.
1249
1250 The output is a skeletal instruction.
1251
1252 The algorithm has two parts.
1253 1. extract the syntactic features (parse off all the @^#-()+[] mode crud);
1254 2. express the @^#-()+[] as some parameters suited to further analysis.
1255
1256 2nd step is where we detect the googles of possible invalid combinations
1257 a human (or compiler) might write. Note that if we do a half-way
1258 decent assembler, we don't know how long to make (eg) displacement
1259 fields when we first meet them (because they may not have defined values).
1260 So we must wait until we know how many bits are needed for each address,
1261 then we can know both length and opcodes of instructions.
1262 For reason(s) above, we will pass to our caller a 'broken' instruction
1263 of these major components, from which our caller can generate instructions:
1264 - displacement length I^ S^ L^ B^ W^ unspecified
1265 - mode (many)
1266 - register R0-R15 or absent
1267 - index register R0-R15 or absent
1268 - expression text what we don't parse
1269 - error text(s) why we couldn't understand the operand
1270
1271 ----
1272
1273 To decode output of this, test errtxt. If errtxt[0] == '\0', then
1274 we had no errors that prevented parsing. Also, if we ever report
1275 an internal bug, errtxt[0] is set non-zero. So one test tells you
1276 if the other outputs are to be taken seriously.
1277
1278 ----
1279
1280 Dec defines the semantics of address modes (and values)
1281 by a two-letter code, explained here.
1282
1283 letter 1: access type
1284
1285 a address calculation - no data access, registers forbidden
1286 b branch displacement
1287 m read - let go of bus - write back "modify"
1288 r read
1289 v bit field address: like 'a' but registers are OK
1290 w write
1291 space no operator (eg ".long foo") [our convention]
1292
1293 letter 2: data type (i.e. width, alignment)
1294
1295 b byte
1296 d double precision floating point (D format)
1297 f single precision floating point (F format)
1298 g G format floating
1299 h H format floating
1300 l longword
1301 o octaword
1302 q quadword
1303 w word
1304 ? simple synthetic branch operand
1305 - unconditional synthetic JSB/JSR operand
1306 ! complex synthetic branch operand
1307
1308 The '-?!' letter 2's are not for external consumption. They are used
1309 for various assemblers. Generally, all unknown widths are assumed 0.
1310 We don't limit your choice of width character.
1311
1312 DEC operands are hard work to parse. For example, '@' as the first
1313 character means indirect (deferred) mode but elsewhere it is a shift
1314 operator.
1315 The long-winded explanation of how this is supposed to work is
1316 cancelled. Read a DEC vax manual.
1317 We try hard not to parse anything that MIGHT be part of the expression
1318 buried in that syntax. For example if we see @...(Rn) we don't check
1319 for '-' before the '(' because mode @-(Rn) does not exist.
1320
1321 After parsing we have:
1322
1323 at 1 if leading '@' (or Un*x '*')
1324 len takes one value from " bilsw". eg B^ -> 'b'.
1325 hash 1 if leading '#' (or Un*x '$')
1326 expr_begin, expr_end the expression we did not parse
1327 even though we don't interpret it, we make use
1328 of its presence or absence.
1329 sign -1: -(Rn) 0: absent +1: (Rn)+
1330 paren 1 if () are around register
1331 reg major register number 0:15 -1 means absent
1332 ndx index register number 0:15 -1 means absent
1333
1334 Again, I dare not explain it: just trace ALL the code!
1335
1336 Summary of vip_op outputs.
1337
1338 mode reg len ndx
1339 (Rn) => @Rn
1340 {@}Rn 5+@ n ' ' optional
1341 branch operand 0 -1 ' ' -1
1342 S^#foo 0 -1 's' -1
1343 -(Rn) 7 n ' ' optional
1344 {@}(Rn)+ 8+@ n ' ' optional
1345 {@}#foo, no S^ 8+@ PC " i" optional
1346 {@}{q^}{(Rn)} 10+@+q option " bwl" optional */
1347
1348 /* Dissect user-input 'optext' (which is something like "@B^foo@bar(AP)[FP]:")
1349 using the vop in vopP. vopP's vop_access and vop_width. We fill _ndx, _reg,
1350 _mode, _short, _warn, _error, _expr_begin, _expr_end and _nbytes. */
1351
1352 static void
1353 vip_op (char *optext, struct vop *vopP)
1354 {
1355 /* Track operand text forward. */
1356 char *p;
1357 /* Track operand text backward. */
1358 char *q;
1359 /* 1 if leading '@' ('*') seen. */
1360 int at;
1361 /* one of " bilsw" */
1362 char len;
1363 /* 1 if leading '#' ('$') seen. */
1364 int hash;
1365 /* -1, 0 or +1. */
1366 int sign = 0;
1367 /* 1 if () surround register. */
1368 int paren = 0;
1369 /* Register number, -1:absent. */
1370 int reg = 0;
1371 /* Index register number -1:absent. */
1372 int ndx = 0;
1373 /* Report illegal operand, ""==OK. */
1374 /* " " is a FAKE error: means we won. */
1375 /* ANY err that begins with ' ' is a fake. */
1376 /* " " is converted to "" before return. */
1377 const char *err;
1378 /* Warn about weird modes pf address. */
1379 const char *wrn;
1380 /* Preserve q in case we backup. */
1381 char *oldq = NULL;
1382 /* Build up 4-bit operand mode here. */
1383 /* Note: index mode is in ndx, this is. */
1384 /* The major mode of operand address. */
1385 int mode = 0;
1386 /* Notice how we move wrong-arg-type bugs INSIDE this module: if we
1387 get the types wrong below, we lose at compile time rather than at
1388 lint or run time. */
1389 char access_mode; /* vop_access. */
1390
1391 access_mode = vopP->vop_access;
1392 /* None of our code bugs (yet), no user text errors, no warnings
1393 even. */
1394 err = wrn = 0;
1395
1396 p = optext;
1397
1398 if (*p == ' ') /* Expect all whitespace reduced to ' '. */
1399 p++; /* skip over whitespace */
1400
1401 if ((at = INDIRECTP (*p)) != 0)
1402 { /* 1 if *p=='@'(or '*' for Un*x) */
1403 p++; /* at is determined */
1404 if (*p == ' ') /* Expect all whitespace reduced to ' '. */
1405 p++; /* skip over whitespace */
1406 }
1407
1408 /* This code is subtle. It tries to detect all legal (letter)'^'
1409 but it doesn't waste time explicitly testing for premature '\0' because
1410 this case is rejected as a mismatch against either (letter) or '^'. */
1411 {
1412 char c;
1413
1414 c = *p;
1415 c = TOLOWER (c);
1416 if (DISPLENP (p[1]) && strchr ("bilws", len = c))
1417 p += 2; /* Skip (letter) '^'. */
1418 else /* No (letter) '^' seen. */
1419 len = ' '; /* Len is determined. */
1420 }
1421
1422 if (*p == ' ') /* Expect all whitespace reduced to ' '. */
1423 p++;
1424
1425 if ((hash = IMMEDIATEP (*p)) != 0) /* 1 if *p=='#' ('$' for Un*x) */
1426 p++; /* Hash is determined. */
1427
1428 /* p points to what may be the beginning of an expression.
1429 We have peeled off the front all that is peelable.
1430 We know at, len, hash.
1431
1432 Lets point q at the end of the text and parse that (backwards). */
1433
1434 for (q = p; *q; q++)
1435 ;
1436 q--; /* Now q points at last char of text. */
1437
1438 if (*q == ' ' && q >= p) /* Expect all whitespace reduced to ' '. */
1439 q--;
1440
1441 /* Reverse over whitespace, but don't. */
1442 /* Run back over *p. */
1443
1444 /* As a matter of policy here, we look for [Rn], although both Rn and S^#
1445 forbid [Rn]. This is because it is easy, and because only a sick
1446 cyborg would have [...] trailing an expression in a VAX-like assembler.
1447 A meticulous parser would first check for Rn followed by '(' or '['
1448 and not parse a trailing ']' if it found another. We just ban expressions
1449 ending in ']'. */
1450 if (*q == ']')
1451 {
1452 while (q >= p && *q != '[')
1453 q--;
1454 /* Either q<p or we got matching '['. */
1455 if (q < p)
1456 err = _("no '[' to match ']'");
1457 else
1458 {
1459 /* Confusers like "[]" will eventually lose with a bad register
1460 * name error. So again we don't need to check for early '\0'. */
1461 if (q[3] == ']')
1462 ndx = vax_reg_parse (q[1], q[2], 0, 0);
1463 else if (q[4] == ']')
1464 ndx = vax_reg_parse (q[1], q[2], q[3], 0);
1465 else if (q[5] == ']')
1466 ndx = vax_reg_parse (q[1], q[2], q[3], q[4]);
1467 else
1468 ndx = -1;
1469 /* Since we saw a ']' we will demand a register name in the [].
1470 * If luser hasn't given us one: be rude. */
1471 if (ndx < 0)
1472 err = _("bad register in []");
1473 else if (ndx == PC)
1474 err = _("[PC] index banned");
1475 else
1476 /* Point q just before "[...]". */
1477 q--;
1478 }
1479 }
1480 else
1481 /* No ']', so no iNDeX register. */
1482 ndx = -1;
1483
1484 /* If err = "..." then we lost: run away.
1485 Otherwise ndx == -1 if there was no "[...]".
1486 Otherwise, ndx is index register number, and q points before "[...]". */
1487
1488 if (*q == ' ' && q >= p) /* Expect all whitespace reduced to ' '. */
1489 q--;
1490 /* Reverse over whitespace, but don't. */
1491 /* Run back over *p. */
1492 if (!err || !*err)
1493 {
1494 /* no ()+ or -() seen yet */
1495 sign = 0;
1496
1497 if (q > p + 3 && *q == '+' && q[-1] == ')')
1498 {
1499 sign = 1; /* we saw a ")+" */
1500 q--; /* q points to ')' */
1501 }
1502
1503 if (*q == ')' && q > p + 2)
1504 {
1505 paren = 1; /* assume we have "(...)" */
1506 while (q >= p && *q != '(')
1507 q--;
1508 /* either q<p or we got matching '(' */
1509 if (q < p)
1510 err = _("no '(' to match ')'");
1511 else
1512 {
1513 /* Confusers like "()" will eventually lose with a bad register
1514 name error. So again we don't need to check for early '\0'. */
1515 if (q[3] == ')')
1516 reg = vax_reg_parse (q[1], q[2], 0, 0);
1517 else if (q[4] == ')')
1518 reg = vax_reg_parse (q[1], q[2], q[3], 0);
1519 else if (q[5] == ')')
1520 reg = vax_reg_parse (q[1], q[2], q[3], q[4]);
1521 else
1522 reg = -1;
1523 /* Since we saw a ')' we will demand a register name in the ')'.
1524 This is nasty: why can't our hypothetical assembler permit
1525 parenthesised expressions? BECAUSE I AM LAZY! That is why.
1526 Abuse luser if we didn't spy a register name. */
1527 if (reg < 0)
1528 {
1529 /* JF allow parenthesized expressions. I hope this works. */
1530 paren = 0;
1531 while (*q != ')')
1532 q++;
1533 /* err = "unknown register in ()"; */
1534 }
1535 else
1536 q--; /* point just before '(' of "(...)" */
1537 /* If err == "..." then we lost. Run away.
1538 Otherwise if reg >= 0 then we saw (Rn). */
1539 }
1540 /* If err == "..." then we lost.
1541 Otherwise paren==1 and reg = register in "()". */
1542 }
1543 else
1544 paren = 0;
1545 /* If err == "..." then we lost.
1546 Otherwise, q points just before "(Rn)", if any.
1547 If there was a "(...)" then paren==1, and reg is the register. */
1548
1549 /* We should only seek '-' of "-(...)" if:
1550 we saw "(...)" paren == 1
1551 we have no errors so far ! *err
1552 we did not see '+' of "(...)+" sign < 1
1553 We don't check len. We want a specific error message later if
1554 user tries "x^...-(Rn)". This is a feature not a bug. */
1555 if (!err || !*err)
1556 {
1557 if (paren && sign < 1)/* !sign is adequate test */
1558 {
1559 if (*q == '-')
1560 {
1561 sign = -1;
1562 q--;
1563 }
1564 }
1565 /* We have back-tracked over most
1566 of the crud at the end of an operand.
1567 Unless err, we know: sign, paren. If paren, we know reg.
1568 The last case is of an expression "Rn".
1569 This is worth hunting for if !err, !paren.
1570 We wouldn't be here if err.
1571 We remember to save q, in case we didn't want "Rn" anyway. */
1572 if (!paren)
1573 {
1574 if (*q == ' ' && q >= p) /* Expect all whitespace reduced to ' '. */
1575 q--;
1576 /* Reverse over whitespace, but don't. */
1577 /* Run back over *p. */
1578 /* Room for Rn or Rnn (include prefix) exactly? */
1579 if (q > p && q < p + 4)
1580 reg = vax_reg_parse (p[0], p[1],
1581 q < p + 2 ? 0 : p[2],
1582 q < p + 3 ? 0 : p[3]);
1583 else
1584 reg = -1; /* Always comes here if no register at all. */
1585 /* Here with a definitive reg value. */
1586 if (reg >= 0)
1587 {
1588 oldq = q;
1589 q = p - 1;
1590 }
1591 }
1592 }
1593 }
1594 /* have reg. -1:absent; else 0:15. */
1595
1596 /* We have: err, at, len, hash, ndx, sign, paren, reg.
1597 Also, any remaining expression is from *p through *q inclusive.
1598 Should there be no expression, q==p-1. So expression length = q-p+1.
1599 This completes the first part: parsing the operand text. */
1600
1601 /* We now want to boil the data down, checking consistency on the way.
1603 We want: len, mode, reg, ndx, err, p, q, wrn, bug.
1604 We will deliver a 4-bit reg, and a 4-bit mode. */
1605
1606 /* Case of branch operand. Different. No L^B^W^I^S^ allowed for instance.
1607
1608 in: at ?
1609 len ?
1610 hash ?
1611 p:q ?
1612 sign ?
1613 paren ?
1614 reg ?
1615 ndx ?
1616
1617 out: mode 0
1618 reg -1
1619 len ' '
1620 p:q whatever was input
1621 ndx -1
1622 err " " or error message, and other outputs trashed. */
1623 /* Branch operands have restricted forms. */
1624 if ((!err || !*err) && access_mode == 'b')
1625 {
1626 if (at || hash || sign || paren || ndx >= 0 || reg >= 0 || len != ' ')
1627 err = _("invalid branch operand");
1628 else
1629 err = " ";
1630 }
1631
1632 /* Since nobody seems to use it: comment this 'feature'(?) out for now. */
1633 #ifdef NEVER
1634 /* Case of stand-alone operand. e.g. ".long foo"
1635
1636 in: at ?
1637 len ?
1638 hash ?
1639 p:q ?
1640 sign ?
1641 paren ?
1642 reg ?
1643 ndx ?
1644
1645 out: mode 0
1646 reg -1
1647 len ' '
1648 p:q whatever was input
1649 ndx -1
1650 err " " or error message, and other outputs trashed. */
1651 if ((!err || !*err) && access_mode == ' ')
1652 {
1653 if (at)
1654 err = _("address prohibits @");
1655 else if (hash)
1656 err = _("address prohibits #");
1657 else if (sign)
1658 {
1659 if (sign < 0)
1660 err = _("address prohibits -()");
1661 else
1662 err = _("address prohibits ()+");
1663 }
1664 else if (paren)
1665 err = _("address prohibits ()");
1666 else if (ndx >= 0)
1667 err = _("address prohibits []");
1668 else if (reg >= 0)
1669 err = _("address prohibits register");
1670 else if (len != ' ')
1671 err = _("address prohibits displacement length specifier");
1672 else
1673 {
1674 err = " "; /* succeed */
1675 mode = 0;
1676 }
1677 }
1678 #endif
1679
1680 /* Case of S^#.
1681
1682 in: at 0
1683 len 's' definition
1684 hash 1 demand
1685 p:q demand not empty
1686 sign 0 by paren==0
1687 paren 0 by "()" scan logic because "S^" seen
1688 reg -1 or nn by mistake
1689 ndx -1
1690
1691 out: mode 0
1692 reg -1
1693 len 's'
1694 exp
1695 ndx -1 */
1696 if ((!err || !*err) && len == 's')
1697 {
1698 if (!hash || paren || at || ndx >= 0)
1699 err = _("invalid operand of S^#");
1700 else
1701 {
1702 if (reg >= 0)
1703 {
1704 /* Darn! we saw S^#Rnn ! put the Rnn back in
1705 expression. KLUDGE! Use oldq so we don't
1706 need to know exact length of reg name. */
1707 q = oldq;
1708 reg = 0;
1709 }
1710 /* We have all the expression we will ever get. */
1711 if (p > q)
1712 err = _("S^# needs expression");
1713 else if (access_mode == 'r')
1714 {
1715 err = " "; /* WIN! */
1716 mode = 0;
1717 }
1718 else
1719 err = _("S^# may only read-access");
1720 }
1721 }
1722
1723 /* Case of -(Rn), which is weird case.
1724
1725 in: at 0
1726 len '
1727 hash 0
1728 p:q q<p
1729 sign -1 by definition
1730 paren 1 by definition
1731 reg present by definition
1732 ndx optional
1733
1734 out: mode 7
1735 reg present
1736 len ' '
1737 exp "" enforce empty expression
1738 ndx optional warn if same as reg. */
1739 if ((!err || !*err) && sign < 0)
1740 {
1741 if (len != ' ' || hash || at || p <= q)
1742 err = _("invalid operand of -()");
1743 else
1744 {
1745 err = " "; /* win */
1746 mode = 7;
1747 if (reg == PC)
1748 wrn = _("-(PC) unpredictable");
1749 else if (reg == ndx)
1750 wrn = _("[]index same as -()register: unpredictable");
1751 }
1752 }
1753
1754 /* We convert "(Rn)" to "@Rn" for our convenience.
1755 (I hope this is convenient: has someone got a better way to parse this?)
1756 A side-effect of this is that "@Rn" is a valid operand. */
1757 if (paren && !sign && !hash && !at && len == ' ' && p > q)
1758 {
1759 at = 1;
1760 paren = 0;
1761 }
1762
1763 /* Case of (Rn)+, which is slightly different.
1764
1765 in: at
1766 len ' '
1767 hash 0
1768 p:q q<p
1769 sign +1 by definition
1770 paren 1 by definition
1771 reg present by definition
1772 ndx optional
1773
1774 out: mode 8+@
1775 reg present
1776 len ' '
1777 exp "" enforce empty expression
1778 ndx optional warn if same as reg. */
1779 if ((!err || !*err) && sign > 0)
1780 {
1781 if (len != ' ' || hash || p <= q)
1782 err = _("invalid operand of ()+");
1783 else
1784 {
1785 err = " "; /* win */
1786 mode = 8 + (at ? 1 : 0);
1787 if (reg == PC)
1788 wrn = _("(PC)+ unpredictable");
1789 else if (reg == ndx)
1790 wrn = _("[]index same as ()+register: unpredictable");
1791 }
1792 }
1793
1794 /* Case of #, without S^.
1795
1796 in: at
1797 len ' ' or 'i'
1798 hash 1 by definition
1799 p:q
1800 sign 0
1801 paren 0
1802 reg absent
1803 ndx optional
1804
1805 out: mode 8+@
1806 reg PC
1807 len ' ' or 'i'
1808 exp
1809 ndx optional. */
1810 if ((!err || !*err) && hash)
1811 {
1812 if (len != 'i' && len != ' ')
1813 err = _("# conflicts length");
1814 else if (paren)
1815 err = _("# bars register");
1816 else
1817 {
1818 if (reg >= 0)
1819 {
1820 /* Darn! we saw #Rnn! Put the Rnn back into the expression.
1821 By using oldq, we don't need to know how long Rnn was.
1822 KLUDGE! */
1823 q = oldq;
1824 reg = -1; /* No register any more. */
1825 }
1826 err = " "; /* Win. */
1827
1828 /* JF a bugfix, I think! */
1829 if (at && access_mode == 'a')
1830 vopP->vop_nbytes = 4;
1831
1832 mode = (at ? 9 : 8);
1833 reg = PC;
1834 if ((access_mode == 'm' || access_mode == 'w') && !at)
1835 wrn = _("writing or modifying # is unpredictable");
1836 }
1837 }
1838 /* If !*err, then sign == 0
1839 hash == 0 */
1840
1841 /* Case of Rn. We separate this one because it has a few special
1842 errors the remaining modes lack.
1843
1844 in: at optional
1845 len ' '
1846 hash 0 by program logic
1847 p:q empty
1848 sign 0 by program logic
1849 paren 0 by definition
1850 reg present by definition
1851 ndx optional
1852
1853 out: mode 5+@
1854 reg present
1855 len ' ' enforce no length
1856 exp "" enforce empty expression
1857 ndx optional warn if same as reg. */
1858 if ((!err || !*err) && !paren && reg >= 0)
1859 {
1860 if (len != ' ')
1861 err = _("length not needed");
1862 else if (at)
1863 {
1864 err = " "; /* win */
1865 mode = 6; /* @Rn */
1866 }
1867 else if (ndx >= 0)
1868 err = _("can't []index a register, because it has no address");
1869 else if (access_mode == 'a')
1870 err = _("a register has no address");
1871 else
1872 {
1873 /* Idea here is to detect from length of datum
1874 and from register number if we will touch PC.
1875 Warn if we do.
1876 vop_nbytes is number of bytes in operand.
1877 Compute highest byte affected, compare to PC0. */
1878 if ((vopP->vop_nbytes + reg * 4) > 60)
1879 wrn = _("PC part of operand unpredictable");
1880 err = " "; /* win */
1881 mode = 5; /* Rn */
1882 }
1883 }
1884 /* If !*err, sign == 0
1885 hash == 0
1886 paren == 1 OR reg==-1 */
1887
1888 /* Rest of cases fit into one bunch.
1889
1890 in: at optional
1891 len ' ' or 'b' or 'w' or 'l'
1892 hash 0 by program logic
1893 p:q expected (empty is not an error)
1894 sign 0 by program logic
1895 paren optional
1896 reg optional
1897 ndx optional
1898
1899 out: mode 10 + @ + len
1900 reg optional
1901 len ' ' or 'b' or 'w' or 'l'
1902 exp maybe empty
1903 ndx optional warn if same as reg. */
1904 if (!err || !*err)
1905 {
1906 err = " "; /* win (always) */
1907 mode = 10 + (at ? 1 : 0);
1908 switch (len)
1909 {
1910 case 'l':
1911 mode += 2;
1912 /* Fall through. */
1913 case 'w':
1914 mode += 2;
1915 /* Fall through. */
1916 case ' ': /* Assumed B^ until our caller changes it. */
1917 case 'b':
1918 break;
1919 }
1920 }
1921
1922 /* here with completely specified mode
1923 len
1924 reg
1925 expression p,q
1926 ndx. */
1927
1928 if (*err == ' ')
1929 err = 0; /* " " is no longer an error. */
1930
1931 vopP->vop_mode = mode;
1932 vopP->vop_reg = reg;
1933 vopP->vop_short = len;
1934 vopP->vop_expr_begin = p;
1935 vopP->vop_expr_end = q;
1936 vopP->vop_ndx = ndx;
1937 vopP->vop_error = err;
1938 vopP->vop_warn = wrn;
1939 }
1940
1941 /* This converts a string into a vax instruction.
1942 The string must be a bare single instruction in dec-vax (with BSD4 frobs)
1943 format.
1944 It provides some error messages: at most one fatal error message (which
1945 stops the scan) and at most one warning message for each operand.
1946 The vax instruction is returned in exploded form, since we have no
1947 knowledge of how you parse (or evaluate) your expressions.
1948 We do however strip off and decode addressing modes and operation
1949 mnemonic.
1950
1951 The exploded instruction is returned to a struct vit of your choice.
1952 #include "vax-inst.h" to know what a struct vit is.
1953
1954 This function's value is a string. If it is not "" then an internal
1955 logic error was found: read this code to assign meaning to the string.
1956 No argument string should generate such an error string:
1957 it means a bug in our code, not in the user's text.
1958
1959 You MUST have called vip_begin() once before using this function. */
1960
1961 static void
1962 vip (struct vit *vitP, /* We build an exploded instruction here. */
1963 char *instring) /* Text of a vax instruction: we modify. */
1964 {
1965 /* How to bit-encode this opcode. */
1966 struct vot_wot *vwP;
1967 /* 1/skip whitespace.2/scan vot_how */
1968 char *p;
1969 char *q;
1970 /* counts number of operands seen */
1971 unsigned char count;
1972 /* scan operands in struct vit */
1973 struct vop *operandp;
1974 /* error over all operands */
1975 const char *alloperr;
1976 /* Remember char, (we clobber it with '\0' temporarily). */
1977 char c;
1978 /* Op-code of this instruction. */
1979 vax_opcodeT oc;
1980
1981 if (*instring == ' ')
1982 ++instring;
1983
1984 /* MUST end in end-of-string or exactly 1 space. */
1985 for (p = instring; *p && *p != ' '; p++)
1986 ;
1987
1988 /* Scanned up to end of operation-code. */
1989 /* Operation-code is ended with whitespace. */
1990 if (p - instring == 0)
1991 {
1992 vitP->vit_error = _("No operator");
1993 count = 0;
1994 memset (vitP->vit_opcode, '\0', sizeof (vitP->vit_opcode));
1995 }
1996 else
1997 {
1998 c = *p;
1999 *p = '\0';
2000 /* Here with instring pointing to what better be an op-name, and p
2001 pointing to character just past that.
2002 We trust instring points to an op-name, with no whitespace. */
2003 vwP = (struct vot_wot *) str_hash_find (op_hash, instring);
2004 /* Restore char after op-code. */
2005 *p = c;
2006 if (vwP == 0)
2007 {
2008 vitP->vit_error = _("Unknown operator");
2009 count = 0;
2010 memset (vitP->vit_opcode, '\0', sizeof (vitP->vit_opcode));
2011 }
2012 else
2013 {
2014 /* We found a match! So let's pick up as many operands as the
2015 instruction wants, and even gripe if there are too many.
2016 We expect comma to separate each operand.
2017 We let instring track the text, while p tracks a part of the
2018 struct vot. */
2019 const char *howp;
2020 /* The lines below know about 2-byte opcodes starting FD,FE or FF.
2021 They also understand synthetic opcodes. Note:
2022 we return 32 bits of opcode, including bucky bits, BUT
2023 an opcode length is either 8 or 16 bits for vit_opcode_nbytes. */
2024 oc = vwP->vot_code; /* The op-code. */
2025 vitP->vit_opcode_nbytes = (oc & 0xFF) >= 0xFD ? 2 : 1;
2026 md_number_to_chars (vitP->vit_opcode, oc, 4);
2027 count = 0; /* No operands seen yet. */
2028 instring = p; /* Point just past operation code. */
2029 alloperr = "";
2030 for (howp = vwP->vot_how, operandp = vitP->vit_operand;
2031 !(alloperr && *alloperr) && *howp;
2032 operandp++, howp += 2)
2033 {
2034 /* Here to parse one operand. Leave instring pointing just
2035 past any one ',' that marks the end of this operand. */
2036 if (!howp[1])
2037 as_fatal (_("odd number of bytes in operand description"));
2038 else if (*instring)
2039 {
2040 for (q = instring; (c = *q) && c != ','; q++)
2041 ;
2042 /* Q points to ',' or '\0' that ends argument. C is that
2043 character. */
2044 *q = 0;
2045 operandp->vop_width = howp[1];
2046 operandp->vop_nbytes = vax_operand_width_size[(unsigned) howp[1]];
2047 operandp->vop_access = howp[0];
2048 vip_op (instring, operandp);
2049 *q = c; /* Restore input text. */
2050 if (operandp->vop_error)
2051 alloperr = _("Bad operand");
2052 instring = q + (c ? 1 : 0); /* Next operand (if any). */
2053 count++; /* Won another argument, may have an operr. */
2054 }
2055 else
2056 alloperr = _("Not enough operands");
2057 }
2058 if (!*alloperr)
2059 {
2060 if (*instring == ' ')
2061 instring++;
2062 if (*instring)
2063 alloperr = _("Too many operands");
2064 }
2065 vitP->vit_error = alloperr;
2066 }
2067 }
2068 vitP->vit_operands = count;
2069 }
2070
2071 #ifdef test
2073
2074 /* Test program for above. */
2075
2076 struct vit myvit; /* Build an exploded vax instruction here. */
2077 char answer[100]; /* Human types a line of vax assembler here. */
2078 char *mybug; /* "" or an internal logic diagnostic. */
2079 int mycount; /* Number of operands. */
2080 struct vop *myvop; /* Scan operands from myvit. */
2081 int mysynth; /* 1 means want synthetic opcodes. */
2082 char my_immediate[200];
2083 char my_indirect[200];
2084 char my_displen[200];
2085
2086 int
2087 main (void)
2088 {
2089 char *p;
2090
2091 printf ("0 means no synthetic instructions. ");
2092 printf ("Value for vip_begin? ");
2093 gets (answer);
2094 sscanf (answer, "%d", &mysynth);
2095 printf ("Synthetic opcodes %s be included.\n", mysynth ? "will" : "will not");
2096 printf ("enter immediate symbols eg enter # ");
2097 gets (my_immediate);
2098 printf ("enter indirect symbols eg enter @ ");
2099 gets (my_indirect);
2100 printf ("enter displen symbols eg enter ^ ");
2101 gets (my_displen);
2102
2103 vip_begin (mysynth, my_immediate, my_indirect, my_displen)
2104
2105 printf ("An empty input line will quit you from the vax instruction parser\n");
2106 for (;;)
2107 {
2108 printf ("vax instruction: ");
2109 fflush (stdout);
2110 gets (answer);
2111 if (!*answer)
2112 break; /* Out of for each input text loop. */
2113
2114 vip (& myvit, answer);
2115 if (*myvit.vit_error)
2116 printf ("ERR:\"%s\"\n", myvit.vit_error);
2117
2118 printf ("opcode=");
2119 for (mycount = myvit.vit_opcode_nbytes, p = myvit.vit_opcode;
2120 mycount;
2121 mycount--, p++)
2122 printf ("%02x ", *p & 0xFF);
2123
2124 printf (" operand count=%d.\n", mycount = myvit.vit_operands);
2125 for (myvop = myvit.vit_operand; mycount; mycount--, myvop++)
2126 {
2127 printf ("mode=%xx reg=%xx ndx=%xx len='%c'=%c%c%d. expr=\"",
2128 myvop->vop_mode, myvop->vop_reg, myvop->vop_ndx,
2129 myvop->vop_short, myvop->vop_access, myvop->vop_width,
2130 myvop->vop_nbytes);
2131 for (p = myvop->vop_expr_begin; p <= myvop->vop_expr_end; p++)
2132 putchar (*p);
2133
2134 printf ("\"\n");
2135 if (myvop->vop_error)
2136 printf (" err:\"%s\"\n", myvop->vop_error);
2137
2138 if (myvop->vop_warn)
2139 printf (" wrn:\"%s\"\n", myvop->vop_warn);
2140 }
2141 }
2142 vip_end ();
2143 exit (EXIT_SUCCESS);
2144 }
2145
2146 #endif
2147
2148 #ifdef TEST /* #Define to use this testbed. */
2150
2151 /* Follows a test program for this function.
2152 We declare arrays non-local in case some of our tiny-minded machines
2153 default to small stacks. Also, helps with some debuggers. */
2154
2155 char answer[100]; /* Human types into here. */
2156 char *p; /* */
2157 char *myerr;
2158 char *mywrn;
2159 char *mybug;
2160 char myaccess;
2161 char mywidth;
2162 char mymode;
2163 char myreg;
2164 char mylen;
2165 char *myleft;
2166 char *myright;
2167 char myndx;
2168 int my_operand_length;
2169 char my_immediate[200];
2170 char my_indirect[200];
2171 char my_displen[200];
2172
2173 int
2174 main (void)
2175 {
2176 printf ("enter immediate symbols eg enter # ");
2177 gets (my_immediate);
2178 printf ("enter indirect symbols eg enter @ ");
2179 gets (my_indirect);
2180 printf ("enter displen symbols eg enter ^ ");
2181 gets (my_displen);
2182 vip_op_defaults (my_immediate, my_indirect, my_displen);
2183
2184 for (;;)
2185 {
2186 printf ("access,width (eg 'ab' or 'wh') [empty line to quit] : ");
2187 fflush (stdout);
2188 gets (answer);
2189 if (!answer[0])
2190 exit (EXIT_SUCCESS);
2191 myaccess = answer[0];
2192 mywidth = answer[1];
2193 switch (mywidth)
2194 {
2195 case 'b':
2196 my_operand_length = 1;
2197 break;
2198 case 'd':
2199 my_operand_length = 8;
2200 break;
2201 case 'f':
2202 my_operand_length = 4;
2203 break;
2204 case 'g':
2205 my_operand_length = 16;
2206 break;
2207 case 'h':
2208 my_operand_length = 32;
2209 break;
2210 case 'l':
2211 my_operand_length = 4;
2212 break;
2213 case 'o':
2214 my_operand_length = 16;
2215 break;
2216 case 'q':
2217 my_operand_length = 8;
2218 break;
2219 case 'w':
2220 my_operand_length = 2;
2221 break;
2222 case '!':
2223 case '?':
2224 case '-':
2225 my_operand_length = 0;
2226 break;
2227
2228 default:
2229 my_operand_length = 2;
2230 printf ("I don't understand access width %c\n", mywidth);
2231 break;
2232 }
2233 printf ("VAX assembler instruction operand: ");
2234 fflush (stdout);
2235 gets (answer);
2236 mybug = vip_op (answer, myaccess, mywidth, my_operand_length,
2237 &mymode, &myreg, &mylen, &myleft, &myright, &myndx,
2238 &myerr, &mywrn);
2239 if (*myerr)
2240 {
2241 printf ("error: \"%s\"\n", myerr);
2242 if (*mybug)
2243 printf (" bug: \"%s\"\n", mybug);
2244 }
2245 else
2246 {
2247 if (*mywrn)
2248 printf ("warning: \"%s\"\n", mywrn);
2249 mumble ("mode", mymode);
2250 mumble ("register", myreg);
2251 mumble ("index", myndx);
2252 printf ("width:'%c' ", mylen);
2253 printf ("expression: \"");
2254 while (myleft <= myright)
2255 putchar (*myleft++);
2256 printf ("\"\n");
2257 }
2258 }
2259 }
2260
2261 void
2262 mumble (char *text, int value)
2263 {
2264 printf ("%s:", text);
2265 if (value >= 0)
2266 printf ("%xx", value);
2267 else
2268 printf ("ABSENT");
2269 printf (" ");
2270 }
2271
2272 #endif
2273
2274 int md_short_jump_size = 3;
2275 int md_long_jump_size = 6;
2276
2277 void
2278 md_create_short_jump (char *ptr,
2279 addressT from_addr,
2280 addressT to_addr ATTRIBUTE_UNUSED,
2281 fragS *frag ATTRIBUTE_UNUSED,
2282 symbolS *to_symbol ATTRIBUTE_UNUSED)
2283 {
2284 valueT offset;
2285
2286 /* This former calculation was off by two:
2287 offset = to_addr - (from_addr + 1);
2288 We need to account for the one byte instruction and also its
2289 two byte operand. */
2290 offset = to_addr - (from_addr + 1 + 2);
2291 *ptr++ = VAX_BRW; /* Branch with word (16 bit) offset. */
2292 md_number_to_chars (ptr, offset, 2);
2293 }
2294
2295 void
2296 md_create_long_jump (char *ptr,
2297 addressT from_addr,
2298 addressT to_addr,
2299 fragS *frag ATTRIBUTE_UNUSED,
2300 symbolS *to_symbol ATTRIBUTE_UNUSED)
2301 {
2302 valueT offset;
2303
2304 /* Account for 1 byte instruction, 1 byte of address specifier and
2305 4 bytes of offset from PC. */
2306 offset = to_addr - (from_addr + 1 + 1 + 4);
2307 *ptr++ = VAX_JMP;
2308 *ptr++ = VAX_PC_RELATIVE_MODE;
2309 md_number_to_chars (ptr, offset, 4);
2310 }
2311
2312 #ifdef OBJ_VMS
2314 const char *md_shortopts = "d:STt:V+1h:Hv::";
2315 #elif defined(OBJ_ELF)
2316 const char *md_shortopts = "d:STt:VkKQ:";
2317 #else
2318 const char *md_shortopts = "d:STt:V";
2319 #endif
2320 struct option md_longopts[] =
2321 {
2322 #ifdef OBJ_ELF
2323 #define OPTION_PIC (OPTION_MD_BASE)
2324 { "pic", no_argument, NULL, OPTION_PIC },
2325 #endif
2326 { NULL, no_argument, NULL, 0 }
2327 };
2328 size_t md_longopts_size = sizeof (md_longopts);
2329
2330 int
2331 md_parse_option (int c, const char *arg)
2332 {
2333 switch (c)
2334 {
2335 case 'S':
2336 as_warn (_("SYMBOL TABLE not implemented"));
2337 break;
2338
2339 case 'T':
2340 as_warn (_("TOKEN TRACE not implemented"));
2341 break;
2342
2343 case 'd':
2344 as_warn (_("Displacement length %s ignored!"), arg);
2345 break;
2346
2347 case 't':
2348 as_warn (_("I don't need or use temp. file \"%s\"."), arg);
2349 break;
2350
2351 case 'V':
2352 as_warn (_("I don't use an interpass file! -V ignored"));
2353 break;
2354
2355 #ifdef OBJ_VMS
2356 case '+': /* For g++. Hash any name > 31 chars long. */
2357 flag_hash_long_names = 1;
2358 break;
2359
2360 case '1': /* For backward compatibility. */
2361 flag_one = 1;
2362 break;
2363
2364 case 'H': /* Show new symbol after hash truncation. */
2365 flag_show_after_trunc = 1;
2366 break;
2367
2368 case 'h': /* No hashing of mixed-case names. */
2369 {
2370 extern char vms_name_mapping;
2371 vms_name_mapping = atoi (arg);
2372 flag_no_hash_mixed_case = 1;
2373 }
2374 break;
2375
2376 case 'v':
2377 {
2378 extern char *compiler_version_string;
2379
2380 if (!arg || !*arg || access (arg, 0) == 0)
2381 return 0; /* Have caller show the assembler version. */
2382 compiler_version_string = arg;
2383 }
2384 break;
2385 #endif
2386
2387 #ifdef OBJ_ELF
2388 case OPTION_PIC:
2389 case 'k':
2390 flag_want_pic = 1;
2391 break; /* -pic, Position Independent Code. */
2392
2393 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment
2394 section should be emitted or not. FIXME: Not implemented. */
2395 case 'Q':
2396 break;
2397 #endif
2398
2399 default:
2400 return 0;
2401 }
2402
2403 return 1;
2404 }
2405
2406 void
2407 md_show_usage (FILE *stream)
2408 {
2409 fprintf (stream, _("\
2410 VAX options:\n\
2411 -d LENGTH ignored\n\
2412 -J ignored\n\
2413 -S ignored\n\
2414 -t FILE ignored\n\
2415 -T ignored\n\
2416 -V ignored\n"));
2417 #ifdef OBJ_VMS
2418 fprintf (stream, _("\
2419 VMS options:\n\
2420 -+ hash encode names longer than 31 characters\n\
2421 -1 `const' handling compatible with gcc 1.x\n\
2422 -H show new symbol after hash truncation\n\
2423 -h NUM don't hash mixed-case names, and adjust case:\n\
2424 0 = upper, 2 = lower, 3 = preserve case\n\
2425 -v\"VERSION\" code being assembled was produced by compiler \"VERSION\"\n"));
2426 #endif
2427 }
2428
2429 /* We have no need to default values of symbols. */
2431
2432 symbolS *
2433 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
2434 {
2435 return NULL;
2436 }
2437
2438 /* Round up a section size to the appropriate boundary. */
2439 valueT
2440 md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
2441 {
2442 /* Byte alignment is fine */
2443 return size;
2444 }
2445
2446 /* Exactly what point is a PC-relative offset relative TO?
2447 On the vax, they're relative to the address of the offset, plus
2448 its size. */
2449 long
2450 md_pcrel_from (fixS *fixP)
2451 {
2452 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
2453 }
2454
2455 arelent *
2456 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
2457 {
2458 arelent *reloc;
2459 bfd_reloc_code_real_type code;
2460
2461 if (fixp->fx_tcbit)
2462 abort ();
2463
2464 if (fixp->fx_r_type != NO_RELOC)
2465 {
2466 code = fixp->fx_r_type;
2467
2468 if (fixp->fx_pcrel)
2469 {
2470 switch (code)
2471 {
2472 case BFD_RELOC_8_PCREL:
2473 case BFD_RELOC_16_PCREL:
2474 case BFD_RELOC_32_PCREL:
2475 #ifdef OBJ_ELF
2476 case BFD_RELOC_8_GOT_PCREL:
2477 case BFD_RELOC_16_GOT_PCREL:
2478 case BFD_RELOC_32_GOT_PCREL:
2479 case BFD_RELOC_8_PLT_PCREL:
2480 case BFD_RELOC_16_PLT_PCREL:
2481 case BFD_RELOC_32_PLT_PCREL:
2482 #endif
2483 break;
2484 default:
2485 as_bad_where (fixp->fx_file, fixp->fx_line,
2486 _("Cannot make %s relocation PC relative"),
2487 bfd_get_reloc_code_name (code));
2488 }
2489 }
2490 }
2491 else
2492 {
2493 #define F(SZ,PCREL) (((SZ) << 1) + (PCREL))
2494 switch (F (fixp->fx_size, fixp->fx_pcrel))
2495 {
2496 #define MAP(SZ,PCREL,TYPE) case F(SZ,PCREL): code = (TYPE); break
2497 MAP (1, 0, BFD_RELOC_8);
2498 MAP (2, 0, BFD_RELOC_16);
2499 MAP (4, 0, BFD_RELOC_32);
2500 MAP (1, 1, BFD_RELOC_8_PCREL);
2501 MAP (2, 1, BFD_RELOC_16_PCREL);
2502 MAP (4, 1, BFD_RELOC_32_PCREL);
2503 default:
2504 abort ();
2505 }
2506 }
2507 #undef F
2508 #undef MAP
2509
2510 reloc = XNEW (arelent);
2511 reloc->sym_ptr_ptr = XNEW (asymbol *);
2512 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2513 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
2514 #ifndef OBJ_ELF
2515 if (fixp->fx_pcrel)
2516 reloc->addend = fixp->fx_addnumber;
2517 else
2518 reloc->addend = 0;
2519 #else
2520 reloc->addend = fixp->fx_offset;
2521 #endif
2522
2523 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
2524 gas_assert (reloc->howto != 0);
2525
2526 return reloc;
2527 }
2528
2529 /* vax:md_assemble() emit frags for 1 instruction given in textual form. */
2530 void
2531 md_assemble (char *instruction_string)
2532 {
2533 /* Non-zero if operand expression's segment is not known yet. */
2534 int is_undefined;
2535 /* Non-zero if operand expression's segment is absolute. */
2536 int is_absolute;
2537 int length_code;
2538 char *p;
2539 /* An operand. Scans all operands. */
2540 struct vop *operandP;
2541 char *save_input_line_pointer;
2542 /* What used to live after an expression. */
2543 char c_save;
2544 /* 1: instruction_string bad for all passes. */
2545 int goofed;
2546 /* Points to slot just after last operand. */
2547 struct vop *end_operandP;
2548 /* Points to expression values for this operand. */
2549 expressionS *expP;
2550 segT *segP;
2551
2552 /* These refer to an instruction operand expression. */
2553 /* Target segment of the address. */
2554 segT to_seg;
2555 valueT this_add_number;
2556 /* Positive (minuend) symbol. */
2557 symbolS *this_add_symbol;
2558 /* As a number. */
2559 long opcode_as_number;
2560 /* Least significant byte 1st. */
2561 char *opcode_as_chars;
2562 /* As an array of characters. */
2563 /* Least significant byte 1st */
2564 char *opcode_low_byteP;
2565 /* length (bytes) meant by vop_short. */
2566 int length;
2567 /* 0, or 1 if '@' is in addressing mode. */
2568 int at;
2569 /* From vop_nbytes: vax_operand_width (in bytes) */
2570 int nbytes;
2571 FLONUM_TYPE *floatP;
2572 LITTLENUM_TYPE literal_float[8];
2573 /* Big enough for any floating point literal. */
2574
2575 vip (&v, instruction_string);
2576
2577 /* Now we try to find as many as_warn()s as we can. If we do any as_warn()s
2578 then goofed=1. Notice that we don't make any frags yet.
2579 Should goofed be 1, then this instruction will wedge in any pass,
2580 and we can safely flush it, without causing interpass symbol phase
2581 errors. That is, without changing label values in different passes. */
2582 if ((goofed = (*v.vit_error)) != 0)
2583 {
2584 as_fatal (_("Ignoring statement due to \"%s\""), v.vit_error);
2585 }
2586 /* We need to use expression() and friends, which require us to diddle
2587 input_line_pointer. So we save it and restore it later. */
2588 save_input_line_pointer = input_line_pointer;
2589 for (operandP = v.vit_operand,
2590 expP = exp_of_operand,
2591 segP = seg_of_operand,
2592 floatP = float_operand,
2593 end_operandP = v.vit_operand + v.vit_operands;
2594
2595 operandP < end_operandP;
2596
2597 operandP++, expP++, segP++, floatP++)
2598 {
2599 if (operandP->vop_error)
2600 {
2601 as_fatal (_("Aborting because statement has \"%s\""), operandP->vop_error);
2602 goofed = 1;
2603 }
2604 else
2605 {
2606 /* Statement has no syntax goofs: let's sniff the expression. */
2607 int can_be_short = 0; /* 1 if a bignum can be reduced to a short literal. */
2608
2609 input_line_pointer = operandP->vop_expr_begin;
2610 c_save = operandP->vop_expr_end[1];
2611 operandP->vop_expr_end[1] = '\0';
2612 /* If to_seg == SEG_PASS1, expression() will have set need_pass_2 = 1. */
2613 *segP = expression (expP);
2614 switch (expP->X_op)
2615 {
2616 case O_absent:
2617 /* for BSD4.2 compatibility, missing expression is absolute 0 */
2618 expP->X_op = O_constant;
2619 expP->X_add_number = 0;
2620 /* For SEG_ABSOLUTE, we shouldn't need to set X_op_symbol,
2621 X_add_symbol to any particular value. But, we will program
2622 defensively. Since this situation occurs rarely so it costs
2623 us little to do, and stops Dean worrying about the origin of
2624 random bits in expressionS's. */
2625 expP->X_add_symbol = NULL;
2626 expP->X_op_symbol = NULL;
2627 break;
2628
2629 case O_symbol:
2630 case O_constant:
2631 break;
2632
2633 default:
2634 /* Major bug. We can't handle the case of a
2635 SEG_OP expression in a VIT_OPCODE_SYNTHETIC
2636 variable-length instruction.
2637 We don't have a frag type that is smart enough to
2638 relax a SEG_OP, and so we just force all
2639 SEG_OPs to behave like SEG_PASS1s.
2640 Clearly, if there is a demand we can invent a new or
2641 modified frag type and then coding up a frag for this
2642 case will be easy. SEG_OP was invented for the
2643 .words after a CASE opcode, and was never intended for
2644 instruction operands. */
2645 need_pass_2 = 1;
2646 as_fatal (_("Can't relocate expression"));
2647 break;
2648
2649 case O_big:
2650 /* Preserve the bits. */
2651 if (expP->X_add_number > 0)
2652 {
2653 bignum_copy (generic_bignum, expP->X_add_number,
2654 floatP->low, SIZE_OF_LARGE_NUMBER);
2655 }
2656 else
2657 {
2658 know (expP->X_add_number < 0);
2659 flonum_copy (&generic_floating_point_number,
2660 floatP);
2661 if (strchr ("s i", operandP->vop_short))
2662 {
2663 /* Could possibly become S^# */
2664 flonum_gen2vax (-expP->X_add_number, floatP, literal_float);
2665 switch (-expP->X_add_number)
2666 {
2667 case 'f':
2668 can_be_short =
2669 (literal_float[0] & 0xFC0F) == 0x4000
2670 && literal_float[1] == 0;
2671 break;
2672
2673 case 'd':
2674 can_be_short =
2675 (literal_float[0] & 0xFC0F) == 0x4000
2676 && literal_float[1] == 0
2677 && literal_float[2] == 0
2678 && literal_float[3] == 0;
2679 break;
2680
2681 case 'g':
2682 can_be_short =
2683 (literal_float[0] & 0xFF81) == 0x4000
2684 && literal_float[1] == 0
2685 && literal_float[2] == 0
2686 && literal_float[3] == 0;
2687 break;
2688
2689 case 'h':
2690 can_be_short = ((literal_float[0] & 0xFFF8) == 0x4000
2691 && (literal_float[1] & 0xE000) == 0
2692 && literal_float[2] == 0
2693 && literal_float[3] == 0
2694 && literal_float[4] == 0
2695 && literal_float[5] == 0
2696 && literal_float[6] == 0
2697 && literal_float[7] == 0);
2698 break;
2699
2700 default:
2701 BAD_CASE (-expP->X_add_number);
2702 break;
2703 }
2704 }
2705 }
2706
2707 if (operandP->vop_short == 's'
2708 || operandP->vop_short == 'i'
2709 || (operandP->vop_short == ' '
2710 && operandP->vop_reg == 0xF
2711 && (operandP->vop_mode & 0xE) == 0x8))
2712 {
2713 /* Saw a '#'. */
2714 if (operandP->vop_short == ' ')
2715 {
2716 /* We must chose S^ or I^. */
2717 if (expP->X_add_number > 0)
2718 {
2719 /* Bignum: Short literal impossible. */
2720 operandP->vop_short = 'i';
2721 operandP->vop_mode = 8;
2722 operandP->vop_reg = 0xF; /* VAX PC. */
2723 }
2724 else
2725 {
2726 /* Flonum: Try to do it. */
2727 if (can_be_short)
2728 {
2729 operandP->vop_short = 's';
2730 operandP->vop_mode = 0;
2731 operandP->vop_ndx = -1;
2732 operandP->vop_reg = -1;
2733 expP->X_op = O_constant;
2734 }
2735 else
2736 {
2737 operandP->vop_short = 'i';
2738 operandP->vop_mode = 8;
2739 operandP->vop_reg = 0xF; /* VAX PC */
2740 }
2741 } /* bignum or flonum ? */
2742 } /* if #, but no S^ or I^ seen. */
2743 /* No more ' ' case: either 's' or 'i'. */
2744 if (operandP->vop_short == 's')
2745 {
2746 /* Wants to be a short literal. */
2747 if (expP->X_add_number > 0)
2748 {
2749 as_warn (_("Bignum not permitted in short literal. Immediate mode assumed."));
2750 operandP->vop_short = 'i';
2751 operandP->vop_mode = 8;
2752 operandP->vop_reg = 0xF; /* VAX PC. */
2753 }
2754 else
2755 {
2756 if (!can_be_short)
2757 {
2758 as_warn (_("Can't do flonum short literal: immediate mode used."));
2759 operandP->vop_short = 'i';
2760 operandP->vop_mode = 8;
2761 operandP->vop_reg = 0xF; /* VAX PC. */
2762 }
2763 else
2764 {
2765 /* Encode short literal now. */
2766 int temp = 0;
2767
2768 switch (-expP->X_add_number)
2769 {
2770 case 'f':
2771 case 'd':
2772 temp = literal_float[0] >> 4;
2773 break;
2774
2775 case 'g':
2776 temp = literal_float[0] >> 1;
2777 break;
2778
2779 case 'h':
2780 temp = ((literal_float[0] << 3) & 070)
2781 | ((literal_float[1] >> 13) & 07);
2782 break;
2783
2784 default:
2785 BAD_CASE (-expP->X_add_number);
2786 break;
2787 }
2788
2789 floatP->low[0] = temp & 077;
2790 floatP->low[1] = 0;
2791 }
2792 }
2793 }
2794 else
2795 {
2796 /* I^# seen: set it up if float. */
2797 if (expP->X_add_number < 0)
2798 {
2799 memcpy (floatP->low, literal_float, sizeof (literal_float));
2800 }
2801 } /* if S^# seen. */
2802 }
2803 else
2804 {
2805 as_warn (_("A bignum/flonum may not be a displacement: 0x%"
2806 PRIx64 " used"),
2807 (uint64_t) (expP->X_add_number = 0x80000000L));
2808 /* Chosen so luser gets the most offset bits to patch later. */
2809 }
2810 expP->X_add_number = floatP->low[0]
2811 | ((LITTLENUM_MASK & (floatP->low[1])) << LITTLENUM_NUMBER_OF_BITS);
2812
2813 /* For the O_big case we have:
2814 If vop_short == 's' then a short floating literal is in the
2815 lowest 6 bits of floatP -> low [0], which is
2816 big_operand_bits [---] [0].
2817 If vop_short == 'i' then the appropriate number of elements
2818 of big_operand_bits [---] [...] are set up with the correct
2819 bits.
2820 Also, just in case width is byte word or long, we copy the lowest
2821 32 bits of the number to X_add_number. */
2822 break;
2823 }
2824 if (input_line_pointer != operandP->vop_expr_end + 1)
2825 {
2826 as_fatal ("Junk at end of expression \"%s\"", input_line_pointer);
2827 goofed = 1;
2828 }
2829 operandP->vop_expr_end[1] = c_save;
2830 }
2831 }
2832
2833 input_line_pointer = save_input_line_pointer;
2834
2835 if (need_pass_2 || goofed)
2836 return;
2837
2838 dwarf2_emit_insn (0);
2839 /* Emit op-code. */
2840 /* Remember where it is, in case we want to modify the op-code later. */
2841 opcode_low_byteP = frag_more (v.vit_opcode_nbytes);
2842 memcpy (opcode_low_byteP, v.vit_opcode, v.vit_opcode_nbytes);
2843 opcode_as_chars = v.vit_opcode;
2844 opcode_as_number = md_chars_to_number ((unsigned char *) opcode_as_chars, 4);
2845 for (operandP = v.vit_operand,
2846 expP = exp_of_operand,
2847 segP = seg_of_operand,
2848 floatP = float_operand,
2849 end_operandP = v.vit_operand + v.vit_operands;
2850
2851 operandP < end_operandP;
2852
2853 operandP++,
2854 floatP++,
2855 segP++,
2856 expP++)
2857 {
2858 if (operandP->vop_ndx >= 0)
2859 {
2860 /* Indexed addressing byte. */
2861 /* Legality of indexed mode already checked: it is OK. */
2862 FRAG_APPEND_1_CHAR (0x40 + operandP->vop_ndx);
2863 } /* if(vop_ndx>=0) */
2864
2865 /* Here to make main operand frag(s). */
2866 this_add_number = expP->X_add_number;
2867 this_add_symbol = expP->X_add_symbol;
2868 to_seg = *segP;
2869 is_undefined = (to_seg == undefined_section);
2870 is_absolute = (to_seg == absolute_section);
2871 at = operandP->vop_mode & 1;
2872 length = (operandP->vop_short == 'b'
2873 ? 1 : (operandP->vop_short == 'w'
2874 ? 2 : (operandP->vop_short == 'l'
2875 ? 4 : 0)));
2876 nbytes = operandP->vop_nbytes;
2877 if (operandP->vop_access == 'b')
2878 {
2879 if (to_seg == now_seg || is_undefined)
2880 {
2881 /* If is_undefined, then it might BECOME now_seg. */
2882 if (nbytes)
2883 {
2884 p = frag_more (nbytes);
2885 fix_new (frag_now, p - frag_now->fr_literal, nbytes,
2886 this_add_symbol, this_add_number, 1, NO_RELOC);
2887 }
2888 else
2889 {
2890 /* to_seg==now_seg || to_seg == SEG_UNKNOWN */
2891 /* nbytes==0 */
2892 length_code = is_undefined ? STATE_UNDF : STATE_BYTE;
2893 if (opcode_as_number & VIT_OPCODE_SPECIAL)
2894 {
2895 if (operandP->vop_width == VAX_WIDTH_UNCONDITIONAL_JUMP)
2896 {
2897 /* br or jsb */
2898 frag_var (rs_machine_dependent, 5, 1,
2899 ENCODE_RELAX (STATE_ALWAYS_BRANCH, length_code),
2900 this_add_symbol, this_add_number,
2901 opcode_low_byteP);
2902 }
2903 else
2904 {
2905 if (operandP->vop_width == VAX_WIDTH_WORD_JUMP)
2906 {
2907 length_code = STATE_WORD;
2908 /* JF: There is no state_byte for this one! */
2909 frag_var (rs_machine_dependent, 10, 2,
2910 ENCODE_RELAX (STATE_COMPLEX_BRANCH, length_code),
2911 this_add_symbol, this_add_number,
2912 opcode_low_byteP);
2913 }
2914 else
2915 {
2916 know (operandP->vop_width == VAX_WIDTH_BYTE_JUMP);
2917 frag_var (rs_machine_dependent, 9, 1,
2918 ENCODE_RELAX (STATE_COMPLEX_HOP, length_code),
2919 this_add_symbol, this_add_number,
2920 opcode_low_byteP);
2921 }
2922 }
2923 }
2924 else
2925 {
2926 know (operandP->vop_width == VAX_WIDTH_CONDITIONAL_JUMP);
2927 frag_var (rs_machine_dependent, 7, 1,
2928 ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, length_code),
2929 this_add_symbol, this_add_number,
2930 opcode_low_byteP);
2931 }
2932 }
2933 }
2934 else
2935 {
2936 /* to_seg != now_seg && to_seg != SEG_UNKNOWN */
2937 /* --- SEG FLOAT MAY APPEAR HERE --- */
2938 if (is_absolute)
2939 {
2940 if (nbytes)
2941 {
2942 know (!(opcode_as_number & VIT_OPCODE_SYNTHETIC));
2943 p = frag_more (nbytes);
2944 /* Conventional relocation. */
2945 fix_new (frag_now, p - frag_now->fr_literal, nbytes,
2946 section_symbol (absolute_section),
2947 this_add_number, 1, NO_RELOC);
2948 }
2949 else
2950 {
2951 know (opcode_as_number & VIT_OPCODE_SYNTHETIC);
2952 if (opcode_as_number & VIT_OPCODE_SPECIAL)
2953 {
2954 if (operandP->vop_width == VAX_WIDTH_UNCONDITIONAL_JUMP)
2955 {
2956 /* br or jsb */
2957 *opcode_low_byteP = opcode_as_chars[0] + VAX_WIDEN_LONG;
2958 know (opcode_as_chars[1] == 0);
2959 p = frag_more (5);
2960 p[0] = VAX_ABSOLUTE_MODE; /* @#... */
2961 md_number_to_chars (p + 1, this_add_number, 4);
2962 /* Now (eg) JMP @#foo or JSB @#foo. */
2963 }
2964 else
2965 {
2966 if (operandP->vop_width == VAX_WIDTH_WORD_JUMP)
2967 {
2968 p = frag_more (10);
2969 p[0] = 2;
2970 p[1] = 0;
2971 p[2] = VAX_BRB;
2972 p[3] = 6;
2973 p[4] = VAX_JMP;
2974 p[5] = VAX_ABSOLUTE_MODE; /* @#... */
2975 md_number_to_chars (p + 6, this_add_number, 4);
2976 /* Now (eg) ACBx 1f
2977 BRB 2f
2978 1: JMP @#foo
2979 2: */
2980 }
2981 else
2982 {
2983 know (operandP->vop_width == VAX_WIDTH_BYTE_JUMP);
2984 p = frag_more (9);
2985 p[0] = 2;
2986 p[1] = VAX_BRB;
2987 p[2] = 6;
2988 p[3] = VAX_JMP;
2989 p[4] = VAX_ABSOLUTE_MODE; /* @#... */
2990 md_number_to_chars (p + 5, this_add_number, 4);
2991 /* Now (eg) xOBxxx 1f
2992 BRB 2f
2993 1: JMP @#foo
2994 2: */
2995 }
2996 }
2997 }
2998 else
2999 {
3000 /* b<cond> */
3001 *opcode_low_byteP ^= 1;
3002 /* To reverse the condition in a VAX branch,
3003 complement the lowest order bit. */
3004 p = frag_more (7);
3005 p[0] = 6;
3006 p[1] = VAX_JMP;
3007 p[2] = VAX_ABSOLUTE_MODE; /* @#... */
3008 md_number_to_chars (p + 3, this_add_number, 4);
3009 /* Now (eg) BLEQ 1f
3010 JMP @#foo
3011 1: */
3012 }
3013 }
3014 }
3015 else
3016 {
3017 /* to_seg != now_seg && !is_undefinfed && !is_absolute */
3018 if (nbytes > 0)
3019 {
3020 /* Pc-relative. Conventional relocation. */
3021 know (!(opcode_as_number & VIT_OPCODE_SYNTHETIC));
3022 p = frag_more (nbytes);
3023 fix_new (frag_now, p - frag_now->fr_literal, nbytes,
3024 section_symbol (absolute_section),
3025 this_add_number, 1, NO_RELOC);
3026 }
3027 else
3028 {
3029 know (opcode_as_number & VIT_OPCODE_SYNTHETIC);
3030 if (opcode_as_number & VIT_OPCODE_SPECIAL)
3031 {
3032 if (operandP->vop_width == VAX_WIDTH_UNCONDITIONAL_JUMP)
3033 {
3034 /* br or jsb */
3035 know (opcode_as_chars[1] == 0);
3036 *opcode_low_byteP = opcode_as_chars[0] + VAX_WIDEN_LONG;
3037 p = frag_more (5);
3038 p[0] = VAX_PC_RELATIVE_MODE;
3039 fix_new (frag_now,
3040 p + 1 - frag_now->fr_literal, 4,
3041 this_add_symbol,
3042 this_add_number, 1, NO_RELOC);
3043 /* Now eg JMP foo or JSB foo. */
3044 }
3045 else
3046 {
3047 if (operandP->vop_width == VAX_WIDTH_WORD_JUMP)
3048 {
3049 p = frag_more (10);
3050 p[0] = 0;
3051 p[1] = 2;
3052 p[2] = VAX_BRB;
3053 p[3] = 6;
3054 p[4] = VAX_JMP;
3055 p[5] = VAX_PC_RELATIVE_MODE;
3056 fix_new (frag_now,
3057 p + 6 - frag_now->fr_literal, 4,
3058 this_add_symbol,
3059 this_add_number, 1, NO_RELOC);
3060 /* Now (eg) ACBx 1f
3061 BRB 2f
3062 1: JMP foo
3063 2: */
3064 }
3065 else
3066 {
3067 know (operandP->vop_width == VAX_WIDTH_BYTE_JUMP);
3068 p = frag_more (10);
3069 p[0] = 2;
3070 p[1] = VAX_BRB;
3071 p[2] = 6;
3072 p[3] = VAX_JMP;
3073 p[4] = VAX_PC_RELATIVE_MODE;
3074 fix_new (frag_now,
3075 p + 5 - frag_now->fr_literal,
3076 4, this_add_symbol,
3077 this_add_number, 1, NO_RELOC);
3078 /* Now (eg) xOBxxx 1f
3079 BRB 2f
3080 1: JMP foo
3081 2: */
3082 }
3083 }
3084 }
3085 else
3086 {
3087 know (operandP->vop_width == VAX_WIDTH_CONDITIONAL_JUMP);
3088 *opcode_low_byteP ^= 1; /* Reverse branch condition. */
3089 p = frag_more (7);
3090 p[0] = 6;
3091 p[1] = VAX_JMP;
3092 p[2] = VAX_PC_RELATIVE_MODE;
3093 fix_new (frag_now, p + 3 - frag_now->fr_literal,
3094 4, this_add_symbol,
3095 this_add_number, 1, NO_RELOC);
3096 }
3097 }
3098 }
3099 }
3100 }
3101 else
3102 {
3103 /* So it is ordinary operand. */
3104 know (operandP->vop_access != 'b');
3105 /* ' ' target-independent: elsewhere. */
3106 know (operandP->vop_access != ' ');
3107 know (operandP->vop_access == 'a'
3108 || operandP->vop_access == 'm'
3109 || operandP->vop_access == 'r'
3110 || operandP->vop_access == 'v'
3111 || operandP->vop_access == 'w');
3112 if (operandP->vop_short == 's')
3113 {
3114 if (is_absolute)
3115 {
3116 if (this_add_number >= 64)
3117 {
3118 as_warn (_("Short literal overflow(%ld.), immediate mode assumed."),
3119 (long) this_add_number);
3120 operandP->vop_short = 'i';
3121 operandP->vop_mode = 8;
3122 operandP->vop_reg = 0xF;
3123 }
3124 }
3125 else
3126 {
3127 as_warn (_("Forced short literal to immediate mode. now_seg=%s to_seg=%s"),
3128 segment_name (now_seg), segment_name (to_seg));
3129 operandP->vop_short = 'i';
3130 operandP->vop_mode = 8;
3131 operandP->vop_reg = 0xF;
3132 }
3133 }
3134 if (operandP->vop_reg >= 0 && (operandP->vop_mode < 8
3135 || (operandP->vop_reg != 0xF && operandP->vop_mode < 10)))
3136 {
3137 /* One byte operand. */
3138 know (operandP->vop_mode > 3);
3139 FRAG_APPEND_1_CHAR (operandP->vop_mode << 4 | operandP->vop_reg);
3140 /* All 1-bytes except S^# happen here. */
3141 }
3142 else
3143 {
3144 /* {@}{q^}foo{(Rn)} or S^#foo */
3145 if (operandP->vop_reg == -1 && operandP->vop_short != 's')
3146 {
3147 /* "{@}{q^}foo" */
3148 if (to_seg == now_seg)
3149 {
3150 if (length == 0)
3151 {
3152 know (operandP->vop_short == ' ');
3153 length_code = STATE_BYTE;
3154 #ifdef OBJ_ELF
3155 if (S_IS_EXTERNAL (this_add_symbol)
3156 || S_IS_WEAK (this_add_symbol))
3157 length_code = STATE_UNDF;
3158 #endif
3159 p = frag_var (rs_machine_dependent, 10, 2,
3160 ENCODE_RELAX (STATE_PC_RELATIVE, length_code),
3161 this_add_symbol, this_add_number,
3162 opcode_low_byteP);
3163 know (operandP->vop_mode == 10 + at);
3164 *p = at << 4;
3165 /* At is the only context we need to carry
3166 to other side of relax() process. Must
3167 be in the correct bit position of VAX
3168 operand spec. byte. */
3169 }
3170 else
3171 {
3172 know (length);
3173 know (operandP->vop_short != ' ');
3174 p = frag_more (length + 1);
3175 p[0] = 0xF | ((at + "?\12\14?\16"[length]) << 4);
3176 fix_new (frag_now, p + 1 - frag_now->fr_literal,
3177 length, this_add_symbol,
3178 this_add_number, 1, NO_RELOC);
3179 }
3180 }
3181 else
3182 {
3183 /* to_seg != now_seg */
3184 if (this_add_symbol == NULL)
3185 {
3186 know (is_absolute);
3187 /* Do @#foo: simpler relocation than foo-.(pc) anyway. */
3188 p = frag_more (5);
3189 p[0] = VAX_ABSOLUTE_MODE; /* @#... */
3190 md_number_to_chars (p + 1, this_add_number, 4);
3191 if (length && length != 4)
3192 as_warn (_("Length specification ignored. Address mode 9F used"));
3193 }
3194 else
3195 {
3196 /* {@}{q^}other_seg */
3197 know ((length == 0 && operandP->vop_short == ' ')
3198 || (length > 0 && operandP->vop_short != ' '));
3199 if (is_undefined
3200 #ifdef OBJ_ELF
3201 || S_IS_WEAK(this_add_symbol)
3202 || S_IS_EXTERNAL(this_add_symbol)
3203 #endif
3204 )
3205 {
3206 switch (length)
3207 {
3208 default: length_code = STATE_UNDF; break;
3209 case 1: length_code = STATE_BYTE; break;
3210 case 2: length_code = STATE_WORD; break;
3211 case 4: length_code = STATE_LONG; break;
3212 }
3213 /* We have a SEG_UNKNOWN symbol. It might
3214 turn out to be in the same segment as
3215 the instruction, permitting relaxation. */
3216 p = frag_var (rs_machine_dependent, 5, 2,
3217 ENCODE_RELAX (STATE_PC_RELATIVE, length_code),
3218 this_add_symbol, this_add_number,
3219 opcode_low_byteP);
3220 p[0] = at << 4;
3221 }
3222 else
3223 {
3224 if (length == 0)
3225 {
3226 know (operandP->vop_short == ' ');
3227 length = 4; /* Longest possible. */
3228 }
3229 p = frag_more (length + 1);
3230 p[0] = 0xF | ((at + "?\12\14?\16"[length]) << 4);
3231 md_number_to_chars (p + 1, this_add_number, length);
3232 fix_new (frag_now,
3233 p + 1 - frag_now->fr_literal,
3234 length, this_add_symbol,
3235 this_add_number, 1, NO_RELOC);
3236 }
3237 }
3238 }
3239 }
3240 else
3241 {
3242 /* {@}{q^}foo(Rn) or S^# or I^# or # */
3243 if (operandP->vop_mode < 0xA)
3244 {
3245 /* # or S^# or I^# */
3246 if (operandP->vop_access == 'v'
3247 || operandP->vop_access == 'a')
3248 {
3249 if (operandP->vop_access == 'v')
3250 as_warn (_("Invalid operand: immediate value used as base address."));
3251 else
3252 as_warn (_("Invalid operand: immediate value used as address."));
3253 /* gcc 2.6.3 is known to generate these in at least
3254 one case. */
3255 }
3256 if (length == 0
3257 && is_absolute && (expP->X_op != O_big)
3258 && operandP->vop_mode == 8 /* No '@'. */
3259 && this_add_number < 64)
3260 {
3261 operandP->vop_short = 's';
3262 }
3263 if (operandP->vop_short == 's')
3264 {
3265 FRAG_APPEND_1_CHAR (this_add_number);
3266 }
3267 else
3268 {
3269 /* I^#... */
3270 know (nbytes);
3271 p = frag_more (nbytes + 1);
3272 know (operandP->vop_reg == 0xF);
3273 #ifdef OBJ_ELF
3274 if (flag_want_pic && operandP->vop_mode == 8
3275 && this_add_symbol != NULL)
3276 {
3277 as_warn (_("Symbol '%s' used as immediate operand in PIC mode."),
3278 S_GET_NAME (this_add_symbol));
3279 }
3280 #endif
3281 p[0] = (operandP->vop_mode << 4) | 0xF;
3282 if ((is_absolute) && (expP->X_op != O_big))
3283 {
3284 /* If nbytes > 4, then we are scrod. We
3285 don't know if the high order bytes
3286 are to be 0xFF or 0x00. BSD4.2 & RMS
3287 say use 0x00. OK --- but this
3288 assembler needs ANOTHER rewrite to
3289 cope properly with this bug. */
3290 md_number_to_chars (p + 1, this_add_number,
3291 min (sizeof (valueT),
3292 (size_t) nbytes));
3293 if ((size_t) nbytes > sizeof (valueT))
3294 memset (p + 1 + sizeof (valueT),
3295 '\0', nbytes - sizeof (valueT));
3296 }
3297 else
3298 {
3299 if (expP->X_op == O_big)
3300 {
3301 /* Problem here is to get the bytes
3302 in the right order. We stored
3303 our constant as LITTLENUMs, not
3304 bytes. */
3305 LITTLENUM_TYPE *lP;
3306
3307 lP = floatP->low;
3308 if (nbytes & 1)
3309 {
3310 know (nbytes == 1);
3311 p[1] = *lP;
3312 }
3313 else
3314 {
3315 for (p++; nbytes; nbytes -= 2, p += 2, lP++)
3316 md_number_to_chars (p, *lP, 2);
3317 }
3318 }
3319 else
3320 {
3321 fix_new (frag_now, p + 1 - frag_now->fr_literal,
3322 nbytes, this_add_symbol,
3323 this_add_number, 0, NO_RELOC);
3324 }
3325 }
3326 }
3327 }
3328 else
3329 {
3330 /* {@}{q^}foo(Rn) */
3331 know ((length == 0 && operandP->vop_short == ' ')
3332 || (length > 0 && operandP->vop_short != ' '));
3333 if (length == 0)
3334 {
3335 if (is_absolute)
3336 {
3337 long test;
3338
3339 test = this_add_number;
3340
3341 if (test < 0)
3342 test = ~test;
3343
3344 length = test & 0xffff8000 ? 4
3345 : test & 0xffffff80 ? 2
3346 : 1;
3347 }
3348 else
3349 {
3350 length = 4;
3351 }
3352 }
3353 #ifdef OBJ_ELF
3354 if (flag_want_pic && this_add_symbol != NULL)
3355 {
3356 as_warn (_("Symbol '%s' used as displacement in PIC mode."),
3357 S_GET_NAME (this_add_symbol));
3358 }
3359 #endif
3360 p = frag_more (1 + length);
3361 know (operandP->vop_reg != 0xf);
3362 know (operandP->vop_reg >= 0);
3363 p[0] = operandP->vop_reg
3364 | ((at | "?\12\14?\16"[length]) << 4);
3365 if (is_absolute)
3366 {
3367 md_number_to_chars (p + 1, this_add_number, length);
3368 }
3369 else
3370 {
3371 fix_new (frag_now, p + 1 - frag_now->fr_literal,
3372 length, this_add_symbol,
3373 this_add_number, 0, NO_RELOC);
3374 }
3375 }
3376 }
3377 }
3378 }
3379 }
3380 }
3381
3382 void
3383 md_begin (void)
3384 {
3385 FLONUM_TYPE *fP;
3386 int i;
3387
3388 vip_begin (1, "$", "*", "`");
3389
3390 for (i = 0, fP = float_operand;
3391 fP < float_operand + VIT_MAX_OPERANDS;
3392 i++, fP++)
3393 {
3394 fP->low = &big_operand_bits[i][0];
3395 fP->high = &big_operand_bits[i][SIZE_OF_LARGE_NUMBER - 1];
3396 }
3397 }
3398
3399 bfd_reloc_code_real_type
3400 vax_cons (expressionS *exp, int size)
3401 {
3402 char *save;
3403 const char *vax_cons_special_reloc;
3404
3405 SKIP_WHITESPACE ();
3406 vax_cons_special_reloc = NULL;
3407 save = input_line_pointer;
3408 if (input_line_pointer[0] == '%')
3409 {
3410 if (startswith (input_line_pointer + 1, "pcrel"))
3411 {
3412 input_line_pointer += 6;
3413 vax_cons_special_reloc = "pcrel";
3414 }
3415 if (vax_cons_special_reloc)
3416 {
3417 int bad = 0;
3418
3419 switch (size)
3420 {
3421 case 1:
3422 if (*input_line_pointer != '8')
3423 bad = 1;
3424 input_line_pointer--;
3425 break;
3426 case 2:
3427 if (input_line_pointer[0] != '1' || input_line_pointer[1] != '6')
3428 bad = 1;
3429 break;
3430 case 4:
3431 if (input_line_pointer[0] != '3' || input_line_pointer[1] != '2')
3432 bad = 1;
3433 break;
3434 default:
3435 bad = 1;
3436 break;
3437 }
3438
3439 if (bad)
3440 {
3441 as_bad (_("Illegal operands: Only %%r_%s%d allowed in %d-byte data fields"),
3442 vax_cons_special_reloc, size * 8, size);
3443 }
3444 else
3445 {
3446 input_line_pointer += 2;
3447 if (*input_line_pointer != '(')
3448 {
3449 as_bad (_("Illegal operands: %%r_%s%d requires arguments in ()"),
3450 vax_cons_special_reloc, size * 8);
3451 bad = 1;
3452 }
3453 }
3454
3455 if (bad)
3456 {
3457 input_line_pointer = save;
3458 vax_cons_special_reloc = NULL;
3459 }
3460 else
3461 {
3462 int c;
3463 char *end = ++input_line_pointer;
3464 int npar = 0;
3465
3466 while (! is_end_of_line[(c = *end)])
3467 {
3468 if (c == '(')
3469 npar++;
3470 else if (c == ')')
3471 {
3472 if (!npar)
3473 break;
3474 npar--;
3475 }
3476 end++;
3477 }
3478
3479 if (c != ')')
3480 as_bad (_("Illegal operands: %%r_%s%d requires arguments in ()"),
3481 vax_cons_special_reloc, size * 8);
3482 else
3483 {
3484 *end = '\0';
3485 expression (exp);
3486 *end = c;
3487 if (input_line_pointer != end)
3488 {
3489 as_bad (_("Illegal operands: %%r_%s%d requires arguments in ()"),
3490 vax_cons_special_reloc, size * 8);
3491 }
3492 else
3493 {
3494 input_line_pointer++;
3495 SKIP_WHITESPACE ();
3496 c = *input_line_pointer;
3497 if (! is_end_of_line[c] && c != ',')
3498 as_bad (_("Illegal operands: garbage after %%r_%s%d()"),
3499 vax_cons_special_reloc, size * 8);
3500 }
3501 }
3502 }
3503 }
3504 }
3505 if (vax_cons_special_reloc == NULL)
3506 expression (exp);
3507 else
3508 switch (size)
3509 {
3510 case 1: return BFD_RELOC_8_PCREL;
3511 case 2: return BFD_RELOC_16_PCREL;
3512 case 4: return BFD_RELOC_32_PCREL;
3513 }
3514 return NO_RELOC;
3515 }
3516
3517 /* This is called by emit_expr via TC_CONS_FIX_NEW when creating a
3518 reloc for a cons. */
3519
3520 void
3521 vax_cons_fix_new (fragS *frag, int where, unsigned int nbytes, expressionS *exp,
3522 bfd_reloc_code_real_type r)
3523 {
3524 int pcrel;
3525 // fix PC relative frags too ...
3526 switch (r)
3527 {
3528 case BFD_RELOC_8_PCREL:
3529 case BFD_RELOC_16_PCREL:
3530 case BFD_RELOC_32_PCREL:
3531 pcrel = 1;
3532 /*
3533 * Displacement mode addressing (of which PC relative is one
3534 * type) uses the updated contents of the register as the base
3535 * address. VARM, Leonard 1987, pp34
3536 */
3537 switch (exp->X_op)
3538 {
3539 case O_constant:
3540 case O_symbol:
3541 exp->X_add_number += nbytes;
3542 break;
3543 }
3544 break;
3545 case NO_RELOC:
3546 r = (nbytes == 1 ? BFD_RELOC_8
3547 : nbytes == 2 ? BFD_RELOC_16
3548 : BFD_RELOC_32);
3549 pcrel = 0;
3550 break;
3551 default:
3552 pcrel = 0;
3553 break;
3554 }
3555
3556 fix_new_exp (frag, where, (int) nbytes, exp, pcrel, r);
3557 }
3558
3559 const char *
3560 md_atof (int type, char * litP, int * sizeP)
3561 {
3562 return vax_md_atof (type, litP, sizeP);
3563 }
3564
3565 void
3566 vax_cfi_frame_initial_instructions (void)
3567 {
3568 cfi_add_CFA_def_cfa (14, 0);
3569 }
3570
3571 int
3572 tc_vax_regname_to_dw2regnum (char *regname)
3573 {
3574 unsigned int i;
3575 static const struct { char *name; int dw2regnum; } regnames[] =
3576 {
3577 { "r0", 0 }, { "r1", 1 }, { "r2", 2 }, { "r3", 3 },
3578 { "r4", 4 }, { "r5", 5 }, { "r6", 6 }, { "r7", 7 },
3579 { "r8", 8 }, { "r9", 9 }, { "r10", 10 }, { "r11", 11 },
3580 { "ap", 12 }, { "fp", 13 }, { "sp", 14 }, { "pc", 15 },
3581 { "psw", 16 },
3582 };
3583
3584 for (i = 0; i < ARRAY_SIZE (regnames); ++i)
3585 if (strcmp (regnames[i].name, regname) == 0)
3586 return regnames[i].dw2regnum;
3587
3588 return -1;
3589 }
3590
3591 void
3592 vax_cfi_emit_pcrel_expr (expressionS *expP, unsigned int nbytes)
3593 {
3594 expressionS tmp = *expP;
3595
3596 tmp.X_op = O_subtract;
3597 tmp.X_op_symbol = symbol_temp_new_now ();
3598 expP = &tmp;
3599 expP->X_add_number += nbytes;
3600 emit_expr (expP, nbytes);
3601 }
3602