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