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