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