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