OSDN Git Service

* gas/app, gas/as.c, gas/as.h, gas/atof-generic.c, gas/cgen.c,
[pf3gnuchains/pf3gnuchains3x.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
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   char width;                   /* vop_width.  */
1275
1276   access_mode = vopP->vop_access;
1277   width = vopP->vop_width;
1278   /* None of our code bugs (yet), no user text errors, no warnings
1279      even.  */
1280   err = wrn = 0;
1281
1282   p = optext;
1283
1284   if (*p == ' ')                /* Expect all whitespace reduced to ' '.  */
1285     p++;                        /* skip over whitespace */
1286
1287   if ((at = INDIRECTP (*p)) != 0)
1288     {                           /* 1 if *p=='@'(or '*' for Un*x) */
1289       p++;                      /* at is determined */
1290       if (*p == ' ')            /* Expect all whitespace reduced to ' '.  */
1291         p++;                    /* skip over whitespace */
1292     }
1293
1294   /* This code is subtle. It tries to detect all legal (letter)'^'
1295      but it doesn't waste time explicitly testing for premature '\0' because
1296      this case is rejected as a mismatch against either (letter) or '^'.  */
1297   {
1298     char c;
1299
1300     c = *p;
1301     c = TOLOWER (c);
1302     if (DISPLENP (p[1]) && strchr ("bilws", len = c))
1303       p += 2;                   /* Skip (letter) '^'.  */
1304     else                        /* No (letter) '^' seen.  */
1305       len = ' ';                /* Len is determined.  */
1306   }
1307
1308   if (*p == ' ')                /* Expect all whitespace reduced to ' '.  */
1309     p++;
1310
1311   if ((hash = IMMEDIATEP (*p)) != 0)    /* 1 if *p=='#' ('$' for Un*x) */
1312     p++;                        /* Hash is determined.  */
1313
1314   /* p points to what may be the beginning of an expression.
1315      We have peeled off the front all that is peelable.
1316      We know at, len, hash.
1317     
1318      Lets point q at the end of the text and parse that (backwards).  */
1319
1320   for (q = p; *q; q++)
1321     ;
1322   q--;                          /* Now q points at last char of text.  */
1323
1324   if (*q == ' ' && q >= p)      /* Expect all whitespace reduced to ' '.  */
1325     q--;
1326
1327   /* Reverse over whitespace, but don't.  */
1328   /* Run back over *p.  */
1329
1330   /* As a matter of policy here, we look for [Rn], although both Rn and S^#
1331      forbid [Rn]. This is because it is easy, and because only a sick
1332      cyborg would have [...] trailing an expression in a VAX-like assembler.
1333      A meticulous parser would first check for Rn followed by '(' or '['
1334      and not parse a trailing ']' if it found another. We just ban expressions
1335      ending in ']'.  */
1336   if (*q == ']')
1337     {
1338       while (q >= p && *q != '[')
1339         q--;
1340       /* Either q<p or we got matching '['.  */
1341       if (q < p)
1342         err = _("no '[' to match ']'");
1343       else
1344         {
1345           /* Confusers like "[]" will eventually lose with a bad register
1346            * name error. So again we don't need to check for early '\0'.  */
1347           if (q[3] == ']')
1348             ndx = vax_reg_parse (q[1], q[2], 0, 0);
1349           else if (q[4] == ']')
1350             ndx = vax_reg_parse (q[1], q[2], q[3], 0);
1351           else if (q[5] == ']')
1352             ndx = vax_reg_parse (q[1], q[2], q[3], q[4]);
1353           else
1354             ndx = -1;
1355           /* Since we saw a ']' we will demand a register name in the [].
1356            * If luser hasn't given us one: be rude.  */
1357           if (ndx < 0)
1358             err = _("bad register in []");
1359           else if (ndx == PC)
1360             err = _("[PC] index banned");
1361           else
1362             /* Point q just before "[...]".  */
1363             q--;
1364         }
1365     }
1366   else
1367     /* No ']', so no iNDeX register.  */
1368     ndx = -1;
1369
1370   /* If err = "..." then we lost: run away.
1371      Otherwise ndx == -1 if there was no "[...]".
1372      Otherwise, ndx is index register number, and q points before "[...]".  */
1373
1374   if (*q == ' ' && q >= p)      /* Expect all whitespace reduced to ' '.  */
1375     q--;
1376   /* Reverse over whitespace, but don't.  */
1377   /* Run back over *p.  */
1378   if (!err || !*err)
1379     {
1380       /* no ()+ or -() seen yet */
1381       sign = 0;
1382
1383       if (q > p + 3 && *q == '+' && q[-1] == ')')
1384         {
1385           sign = 1;             /* we saw a ")+" */
1386           q--;                  /* q points to ')' */
1387         }
1388
1389       if (*q == ')' && q > p + 2)
1390         {
1391           paren = 1;            /* assume we have "(...)" */
1392           while (q >= p && *q != '(')
1393             q--;
1394           /* either q<p or we got matching '(' */
1395           if (q < p)
1396             err = _("no '(' to match ')'");
1397           else
1398             {
1399               /* Confusers like "()" will eventually lose with a bad register
1400                  name error. So again we don't need to check for early '\0'.  */
1401               if (q[3] == ')')
1402                 reg = vax_reg_parse (q[1], q[2], 0, 0);
1403               else if (q[4] == ')')
1404                 reg = vax_reg_parse (q[1], q[2], q[3], 0);
1405               else if (q[5] == ')')
1406                 reg = vax_reg_parse (q[1], q[2], q[3], q[4]);
1407               else
1408                 reg = -1;
1409               /* Since we saw a ')' we will demand a register name in the ')'.
1410                  This is nasty: why can't our hypothetical assembler permit
1411                  parenthesised expressions? BECAUSE I AM LAZY! That is why.
1412                  Abuse luser if we didn't spy a register name.  */
1413               if (reg < 0)
1414                 {
1415                   /* JF allow parenthesized expressions.  I hope this works.  */
1416                   paren = 0;
1417                   while (*q != ')')
1418                     q++;
1419                   /* err = "unknown register in ()"; */
1420                 }
1421               else
1422                 q--;            /* point just before '(' of "(...)" */
1423               /* If err == "..." then we lost. Run away.
1424                  Otherwise if reg >= 0 then we saw (Rn).  */
1425             }
1426           /* If err == "..." then we lost.
1427              Otherwise paren==1 and reg = register in "()".  */
1428         }
1429       else
1430         paren = 0;
1431       /* If err == "..." then we lost.
1432          Otherwise, q points just before "(Rn)", if any.
1433          If there was a "(...)" then paren==1, and reg is the register.  */
1434
1435       /* We should only seek '-' of "-(...)" if:
1436            we saw "(...)"                    paren == 1
1437            we have no errors so far          ! *err
1438            we did not see '+' of "(...)+"    sign < 1
1439          We don't check len. We want a specific error message later if
1440          user tries "x^...-(Rn)". This is a feature not a bug.  */
1441       if (!err || !*err)
1442         {
1443           if (paren && sign < 1)/* !sign is adequate test */
1444             {
1445               if (*q == '-')
1446                 {
1447                   sign = -1;
1448                   q--;
1449                 }
1450             }
1451           /* We have back-tracked over most
1452              of the crud at the end of an operand.
1453              Unless err, we know: sign, paren. If paren, we know reg.
1454              The last case is of an expression "Rn".
1455              This is worth hunting for if !err, !paren.
1456              We wouldn't be here if err.
1457              We remember to save q, in case we didn't want "Rn" anyway.  */
1458           if (!paren)
1459             {
1460               if (*q == ' ' && q >= p)  /* Expect all whitespace reduced to ' '.  */
1461                 q--;
1462               /* Reverse over whitespace, but don't.  */
1463               /* Run back over *p.  */
1464               /* Room for Rn or Rnn (include prefix) exactly?  */
1465               if (q > p && q < p + 4)
1466                 reg = vax_reg_parse (p[0], p[1],
1467                   q < p + 2 ? 0 : p[2],
1468                   q < p + 3 ? 0 : p[3]);
1469               else
1470                 reg = -1;       /* Always comes here if no register at all.  */
1471               /* Here with a definitive reg value.  */
1472               if (reg >= 0)
1473                 {
1474                   oldq = q;
1475                   q = p - 1;
1476                 }
1477             }
1478         }
1479     }
1480   /* have reg. -1:absent; else 0:15.  */
1481
1482   /* We have:  err, at, len, hash, ndx, sign, paren, reg.
1483      Also, any remaining expression is from *p through *q inclusive.
1484      Should there be no expression, q==p-1. So expression length = q-p+1.
1485      This completes the first part: parsing the operand text.  */
1486 \f
1487   /* We now want to boil the data down, checking consistency on the way.
1488      We want:  len, mode, reg, ndx, err, p, q, wrn, bug.
1489      We will deliver a 4-bit reg, and a 4-bit mode.  */
1490
1491   /* Case of branch operand. Different. No L^B^W^I^S^ allowed for instance.
1492     
1493      in:  at    ?
1494           len   ?
1495           hash  ?
1496           p:q   ?
1497           sign  ?
1498           paren ?
1499           reg   ?
1500           ndx   ?
1501     
1502      out: mode  0
1503           reg   -1
1504           len   ' '
1505           p:q   whatever was input
1506           ndx   -1
1507           err   " "              or error message, and other outputs trashed.  */
1508   /* Branch operands have restricted forms.  */
1509   if ((!err || !*err) && access_mode == 'b')
1510     {
1511       if (at || hash || sign || paren || ndx >= 0 || reg >= 0 || len != ' ')
1512         err = _("invalid branch operand");
1513       else
1514         err = " ";
1515     }
1516
1517   /* Since nobody seems to use it: comment this 'feature'(?) out for now.  */
1518 #ifdef NEVER
1519   /* Case of stand-alone operand. e.g. ".long foo"
1520     
1521      in:  at    ?
1522           len   ?
1523           hash  ?
1524           p:q   ?
1525           sign  ?
1526           paren ?
1527           reg   ?
1528           ndx   ?
1529     
1530      out: mode  0
1531           reg   -1
1532           len   ' '
1533           p:q   whatever was input
1534           ndx   -1
1535           err   " "              or error message, and other outputs trashed.  */
1536   if ((!err || !*err) && access_mode == ' ')
1537     {
1538       if (at)
1539         err = _("address prohibits @");
1540       else if (hash)
1541         err = _("address prohibits #");
1542       else if (sign)
1543         {
1544           if (sign < 0)
1545             err = _("address prohibits -()");
1546           else
1547             err = _("address prohibits ()+");
1548         }
1549       else if (paren)
1550         err = _("address prohibits ()");
1551       else if (ndx >= 0)
1552         err = _("address prohibits []");
1553       else if (reg >= 0)
1554         err = _("address prohibits register");
1555       else if (len != ' ')
1556         err = _("address prohibits displacement length specifier");
1557       else
1558         {
1559           err = " ";    /* succeed */
1560           mode = 0;
1561         }
1562     }
1563 #endif
1564
1565   /* Case of S^#.
1566     
1567      in:  at       0
1568           len      's'               definition
1569           hash     1              demand
1570           p:q                        demand not empty
1571           sign     0                 by paren==0
1572           paren    0             by "()" scan logic because "S^" seen
1573           reg      -1                or nn by mistake
1574           ndx      -1
1575     
1576      out: mode     0
1577           reg      -1
1578           len      's'
1579           exp
1580           ndx      -1  */
1581   if ((!err || !*err) && len == 's')
1582     {
1583       if (!hash || paren || at || ndx >= 0)
1584         err = _("invalid operand of S^#");
1585       else
1586         {
1587           if (reg >= 0)
1588             {
1589               /* Darn! we saw S^#Rnn ! put the Rnn back in
1590                  expression. KLUDGE! Use oldq so we don't
1591                  need to know exact length of reg name.  */
1592               q = oldq;
1593               reg = 0;
1594             }
1595           /* We have all the expression we will ever get.  */
1596           if (p > q)
1597             err = _("S^# needs expression");
1598           else if (access_mode == 'r')
1599             {
1600               err = " ";        /* WIN! */
1601               mode = 0;
1602             }
1603           else
1604             err = _("S^# may only read-access");
1605         }
1606     }
1607   
1608   /* Case of -(Rn), which is weird case.
1609     
1610      in:  at       0
1611           len      '
1612           hash     0
1613           p:q      q<p
1614           sign     -1                by definition
1615           paren    1              by definition
1616           reg      present           by definition
1617           ndx      optional
1618     
1619      out: mode     7
1620           reg      present
1621           len      ' '
1622           exp      ""                enforce empty expression
1623           ndx      optional          warn if same as reg.  */
1624   if ((!err || !*err) && sign < 0)
1625     {
1626       if (len != ' ' || hash || at || p <= q)
1627         err = _("invalid operand of -()");
1628       else
1629         {
1630           err = " ";            /* win */
1631           mode = 7;
1632           if (reg == PC)
1633             wrn = _("-(PC) unpredictable");
1634           else if (reg == ndx)
1635             wrn = _("[]index same as -()register: unpredictable");
1636         }
1637     }
1638
1639   /* We convert "(Rn)" to "@Rn" for our convenience.
1640      (I hope this is convenient: has someone got a better way to parse this?)
1641      A side-effect of this is that "@Rn" is a valid operand.  */
1642   if (paren && !sign && !hash && !at && len == ' ' && p > q)
1643     {
1644       at = 1;
1645       paren = 0;
1646     }
1647
1648   /* Case of (Rn)+, which is slightly different.
1649     
1650      in:  at
1651           len      ' '
1652           hash     0
1653           p:q      q<p
1654           sign     +1                by definition
1655           paren    1              by definition
1656           reg      present           by definition
1657           ndx      optional
1658     
1659      out: mode     8+@
1660           reg      present
1661           len      ' '
1662           exp      ""                enforce empty expression
1663           ndx      optional          warn if same as reg.  */
1664   if ((!err || !*err) && sign > 0)
1665     {
1666       if (len != ' ' || hash || p <= q)
1667         err = _("invalid operand of ()+");
1668       else
1669         {
1670           err = " ";            /* win */
1671           mode = 8 + (at ? 1 : 0);
1672           if (reg == PC)
1673             wrn = _("(PC)+ unpredictable");
1674           else if (reg == ndx)
1675             wrn = _("[]index same as ()+register: unpredictable");
1676         }
1677     }
1678
1679   /* Case of #, without S^.
1680     
1681      in:  at
1682           len      ' ' or 'i'
1683           hash     1              by definition
1684           p:q
1685           sign     0
1686           paren    0
1687           reg      absent
1688           ndx      optional
1689     
1690      out: mode     8+@
1691           reg      PC
1692           len      ' ' or 'i'
1693           exp
1694           ndx      optional.  */
1695   if ((!err || !*err) && hash)
1696     {
1697       if (len != 'i' && len != ' ')
1698         err = _("# conflicts length");
1699       else if (paren)
1700         err = _("# bars register");
1701       else
1702         {
1703           if (reg >= 0)
1704             {
1705               /* Darn! we saw #Rnn! Put the Rnn back into the expression.
1706                  By using oldq, we don't need to know how long Rnn was.
1707                  KLUDGE!  */
1708               q = oldq;
1709               reg = -1;         /* No register any more.  */
1710             }
1711           err = " ";            /* Win.  */
1712
1713           /* JF a bugfix, I think!  */
1714           if (at && access_mode == 'a')
1715             vopP->vop_nbytes = 4;
1716
1717           mode = (at ? 9 : 8);
1718           reg = PC;
1719           if ((access_mode == 'm' || access_mode == 'w') && !at)
1720             wrn = _("writing or modifying # is unpredictable");
1721         }
1722     }
1723   /* If !*err, then       sign == 0
1724                           hash == 0 */
1725
1726   /* Case of Rn. We separate this one because it has a few special
1727      errors the remaining modes lack.
1728     
1729      in:  at       optional
1730           len      ' '
1731           hash     0             by program logic
1732           p:q      empty
1733           sign     0                 by program logic
1734           paren    0             by definition
1735           reg      present           by definition
1736           ndx      optional
1737     
1738      out: mode     5+@
1739           reg      present
1740           len      ' '               enforce no length
1741           exp      ""                enforce empty expression
1742           ndx      optional          warn if same as reg.  */
1743   if ((!err || !*err) && !paren && reg >= 0)
1744     {
1745       if (len != ' ')
1746         err = _("length not needed");
1747       else if (at)
1748         {
1749           err = " ";            /* win */
1750           mode = 6;             /* @Rn */
1751         }
1752       else if (ndx >= 0)
1753         err = _("can't []index a register, because it has no address");
1754       else if (access_mode == 'a')
1755         err = _("a register has no address");
1756       else
1757         {
1758           /* Idea here is to detect from length of datum
1759              and from register number if we will touch PC.
1760              Warn if we do.
1761              vop_nbytes is number of bytes in operand.
1762              Compute highest byte affected, compare to PC0.  */
1763           if ((vopP->vop_nbytes + reg * 4) > 60)
1764             wrn = _("PC part of operand unpredictable");
1765           err = " ";            /* win */
1766           mode = 5;             /* Rn */
1767         }
1768     }
1769   /* If !*err,        sign  == 0
1770                       hash  == 0
1771                       paren == 1  OR reg==-1  */
1772
1773   /* Rest of cases fit into one bunch.
1774     
1775      in:  at       optional
1776           len      ' ' or 'b' or 'w' or 'l'
1777           hash     0             by program logic
1778           p:q      expected          (empty is not an error)
1779           sign     0                 by program logic
1780           paren    optional
1781           reg      optional
1782           ndx      optional
1783     
1784      out: mode     10 + @ + len
1785           reg      optional
1786           len      ' ' or 'b' or 'w' or 'l'
1787           exp                        maybe empty
1788           ndx      optional          warn if same as reg.  */
1789   if (!err || !*err)
1790     {
1791       err = " ";                /* win (always) */
1792       mode = 10 + (at ? 1 : 0);
1793       switch (len)
1794         {
1795         case 'l':
1796           mode += 2;
1797         case 'w':
1798           mode += 2;
1799         case ' ':       /* Assumed B^ until our caller changes it.  */
1800         case 'b':
1801           break;
1802         }
1803     }
1804
1805   /* here with completely specified     mode
1806                                         len
1807                                         reg
1808                                         expression   p,q
1809                                         ndx.  */
1810
1811   if (*err == ' ')
1812     err = 0;                    /* " " is no longer an error.  */
1813
1814   vopP->vop_mode = mode;
1815   vopP->vop_reg = reg;
1816   vopP->vop_short = len;
1817   vopP->vop_expr_begin = p;
1818   vopP->vop_expr_end = q;
1819   vopP->vop_ndx = ndx;
1820   vopP->vop_error = err;
1821   vopP->vop_warn = wrn;
1822 }
1823
1824 /* This converts a string into a vax instruction.
1825    The string must be a bare single instruction in dec-vax (with BSD4 frobs)
1826    format.
1827    It provides some error messages: at most one fatal error message (which
1828    stops the scan) and at most one warning message for each operand.
1829    The vax instruction is returned in exploded form, since we have no
1830    knowledge of how you parse (or evaluate) your expressions.
1831    We do however strip off and decode addressing modes and operation
1832    mnemonic.
1833   
1834    The exploded instruction is returned to a struct vit of your choice.
1835    #include "vax-inst.h" to know what a struct vit is.
1836   
1837    This function's value is a string. If it is not "" then an internal
1838    logic error was found: read this code to assign meaning to the string.
1839    No argument string should generate such an error string:
1840    it means a bug in our code, not in the user's text.
1841   
1842    You MUST have called vip_begin() once before using this function.  */
1843
1844 static void
1845 vip (struct vit *vitP,          /* We build an exploded instruction here.  */
1846      char *instring)            /* Text of a vax instruction: we modify.  */
1847 {
1848   /* How to bit-encode this opcode.  */
1849   struct vot_wot *vwP;
1850   /* 1/skip whitespace.2/scan vot_how */
1851   char *p;
1852   char *q;
1853   /* counts number of operands seen */
1854   unsigned char count;
1855   /* scan operands in struct vit */
1856   struct vop *operandp;
1857   /* error over all operands */
1858   const char *alloperr;
1859   /* Remember char, (we clobber it with '\0' temporarily).  */
1860   char c;
1861   /* Op-code of this instruction.  */
1862   vax_opcodeT oc;
1863
1864   if (*instring == ' ')
1865     ++instring;
1866   
1867   /* MUST end in end-of-string or exactly 1 space.  */
1868   for (p = instring; *p && *p != ' '; p++)
1869     ;
1870
1871   /* Scanned up to end of operation-code.  */
1872   /* Operation-code is ended with whitespace.  */
1873   if (p - instring == 0)
1874     {
1875       vitP->vit_error = _("No operator");
1876       count = 0;
1877       memset (vitP->vit_opcode, '\0', sizeof (vitP->vit_opcode));
1878     }
1879   else
1880     {
1881       c = *p;
1882       *p = '\0';
1883       /* Here with instring pointing to what better be an op-name, and p
1884          pointing to character just past that.
1885          We trust instring points to an op-name, with no whitespace.  */
1886       vwP = (struct vot_wot *) hash_find (op_hash, instring);
1887       /* Restore char after op-code.  */
1888       *p = c;
1889       if (vwP == 0)
1890         {
1891           vitP->vit_error = _("Unknown operator");
1892           count = 0;
1893           memset (vitP->vit_opcode, '\0', sizeof (vitP->vit_opcode));
1894         }
1895       else
1896         {
1897           /* We found a match! So let's pick up as many operands as the
1898              instruction wants, and even gripe if there are too many.
1899              We expect comma to separate each operand.
1900              We let instring track the text, while p tracks a part of the
1901              struct vot.  */
1902           const char *howp;
1903           /* The lines below know about 2-byte opcodes starting FD,FE or FF.
1904              They also understand synthetic opcodes. Note:
1905              we return 32 bits of opcode, including bucky bits, BUT
1906              an opcode length is either 8 or 16 bits for vit_opcode_nbytes.  */
1907           oc = vwP->vot_code;   /* The op-code.  */
1908           vitP->vit_opcode_nbytes = (oc & 0xFF) >= 0xFD ? 2 : 1;
1909           md_number_to_chars (vitP->vit_opcode, oc, 4);
1910           count = 0;            /* No operands seen yet.  */
1911           instring = p;         /* Point just past operation code.  */
1912           alloperr = "";
1913           for (howp = vwP->vot_how, operandp = vitP->vit_operand;
1914                !(alloperr && *alloperr) && *howp;
1915                operandp++, howp += 2)
1916             {
1917               /* Here to parse one operand. Leave instring pointing just
1918                  past any one ',' that marks the end of this operand.  */
1919               if (!howp[1])
1920                 as_fatal (_("odd number of bytes in operand description"));
1921               else if (*instring)
1922                 {
1923                   for (q = instring; (c = *q) && c != ','; q++)
1924                     ;
1925                   /* Q points to ',' or '\0' that ends argument. C is that
1926                      character.  */
1927                   *q = 0;
1928                   operandp->vop_width = howp[1];
1929                   operandp->vop_nbytes = vax_operand_width_size[(unsigned) howp[1]];
1930                   operandp->vop_access = howp[0];
1931                   vip_op (instring, operandp);
1932                   *q = c;       /* Restore input text.  */
1933                   if (operandp->vop_error)
1934                     alloperr = _("Bad operand");
1935                   instring = q + (c ? 1 : 0);   /* Next operand (if any).  */
1936                   count++;      /*  Won another argument, may have an operr.  */
1937                 }
1938               else
1939                 alloperr = _("Not enough operands");
1940             }
1941           if (!*alloperr)
1942             {
1943               if (*instring == ' ')
1944                 instring++;
1945               if (*instring)
1946                 alloperr = _("Too many operands");
1947             }
1948           vitP->vit_error = alloperr;
1949         }
1950     }
1951   vitP->vit_operands = count;
1952 }
1953 \f
1954 #ifdef test
1955
1956 /* Test program for above.  */
1957
1958 struct vit myvit;               /* Build an exploded vax instruction here.  */
1959 char answer[100];               /* Human types a line of vax assembler here.  */
1960 char *mybug;                    /* "" or an internal logic diagnostic.  */
1961 int mycount;                    /* Number of operands.  */
1962 struct vop *myvop;              /* Scan operands from myvit.  */
1963 int mysynth;                    /* 1 means want synthetic opcodes.  */
1964 char my_immediate[200];
1965 char my_indirect[200];
1966 char my_displen[200];
1967
1968 int
1969 main (void)
1970 {
1971   char *p;
1972
1973   printf ("0 means no synthetic instructions.   ");
1974   printf ("Value for vip_begin?  ");
1975   gets (answer);
1976   sscanf (answer, "%d", &mysynth);
1977   printf ("Synthetic opcodes %s be included.\n", mysynth ? "will" : "will not");
1978   printf ("enter immediate symbols eg enter #   ");
1979   gets (my_immediate);
1980   printf ("enter indirect symbols  eg enter @   ");
1981   gets (my_indirect);
1982   printf ("enter displen symbols   eg enter ^   ");
1983   gets (my_displen);
1984
1985   if (p = vip_begin (mysynth, my_immediate, my_indirect, my_displen))
1986     error ("vip_begin=%s", p);
1987
1988   printf ("An empty input line will quit you from the vax instruction parser\n");
1989   for (;;)
1990     {
1991       printf ("vax instruction: ");
1992       fflush (stdout);
1993       gets (answer);
1994       if (!*answer)
1995         break;          /* Out of for each input text loop.  */
1996
1997       vip (& myvit, answer);
1998       if (*myvit.vit_error)
1999         printf ("ERR:\"%s\"\n", myvit.vit_error);
2000
2001       printf ("opcode=");
2002       for (mycount = myvit.vit_opcode_nbytes, p = myvit.vit_opcode;
2003            mycount;
2004            mycount--, p++)
2005         printf ("%02x ", *p & 0xFF);
2006
2007       printf ("   operand count=%d.\n", mycount = myvit.vit_operands);
2008       for (myvop = myvit.vit_operand; mycount; mycount--, myvop++)
2009         {
2010           printf ("mode=%xx reg=%xx ndx=%xx len='%c'=%c%c%d. expr=\"",
2011                   myvop->vop_mode, myvop->vop_reg, myvop->vop_ndx,
2012                   myvop->vop_short, myvop->vop_access, myvop->vop_width,
2013                   myvop->vop_nbytes);
2014           for (p = myvop->vop_expr_begin; p <= myvop->vop_expr_end; p++)
2015             putchar (*p);
2016
2017           printf ("\"\n");
2018           if (myvop->vop_error)
2019             printf ("  err:\"%s\"\n", myvop->vop_error);
2020
2021           if (myvop->vop_warn)
2022             printf ("  wrn:\"%s\"\n", myvop->vop_warn);
2023         }
2024     }
2025   vip_end ();
2026   exit (EXIT_SUCCESS);
2027 }
2028
2029 #endif
2030 \f
2031 #ifdef TEST                     /* #Define to use this testbed.  */
2032
2033 /* Follows a test program for this function.
2034    We declare arrays non-local in case some of our tiny-minded machines
2035    default to small stacks. Also, helps with some debuggers.  */
2036
2037 char answer[100];               /* Human types into here.  */
2038 char *p;                        /*  */
2039 char *myerr;
2040 char *mywrn;
2041 char *mybug;
2042 char myaccess;
2043 char mywidth;
2044 char mymode;
2045 char myreg;
2046 char mylen;
2047 char *myleft;
2048 char *myright;
2049 char myndx;
2050 int my_operand_length;
2051 char my_immediate[200];
2052 char my_indirect[200];
2053 char my_displen[200];
2054
2055 int
2056 main (void)
2057 {
2058   printf ("enter immediate symbols eg enter #   ");
2059   gets (my_immediate);
2060   printf ("enter indirect symbols  eg enter @   ");
2061   gets (my_indirect);
2062   printf ("enter displen symbols   eg enter ^   ");
2063   gets (my_displen);
2064   vip_op_defaults (my_immediate, my_indirect, my_displen);
2065
2066   for (;;)
2067     {
2068       printf ("access,width (eg 'ab' or 'wh') [empty line to quit] :  ");
2069       fflush (stdout);
2070       gets (answer);
2071       if (!answer[0])
2072         exit (EXIT_SUCCESS);
2073       myaccess = answer[0];
2074       mywidth = answer[1];
2075       switch (mywidth)
2076         {
2077         case 'b':
2078           my_operand_length = 1;
2079           break;
2080         case 'd':
2081           my_operand_length = 8;
2082           break;
2083         case 'f':
2084           my_operand_length = 4;
2085           break;
2086         case 'g':
2087           my_operand_length = 16;
2088           break;
2089         case 'h':
2090           my_operand_length = 32;
2091           break;
2092         case 'l':
2093           my_operand_length = 4;
2094           break;
2095         case 'o':
2096           my_operand_length = 16;
2097           break;
2098         case 'q':
2099           my_operand_length = 8;
2100           break;
2101         case 'w':
2102           my_operand_length = 2;
2103           break;
2104         case '!':
2105         case '?':
2106         case '-':
2107           my_operand_length = 0;
2108           break;
2109
2110         default:
2111           my_operand_length = 2;
2112           printf ("I dn't understand access width %c\n", mywidth);
2113           break;
2114         }
2115       printf ("VAX assembler instruction operand: ");
2116       fflush (stdout);
2117       gets (answer);
2118       mybug = vip_op (answer, myaccess, mywidth, my_operand_length,
2119                       &mymode, &myreg, &mylen, &myleft, &myright, &myndx,
2120                       &myerr, &mywrn);
2121       if (*myerr)
2122         {
2123           printf ("error: \"%s\"\n", myerr);
2124           if (*mybug)
2125             printf (" bug: \"%s\"\n", mybug);
2126         }
2127       else
2128         {
2129           if (*mywrn)
2130             printf ("warning: \"%s\"\n", mywrn);
2131           mumble ("mode", mymode);
2132           mumble ("register", myreg);
2133           mumble ("index", myndx);
2134           printf ("width:'%c'  ", mylen);
2135           printf ("expression: \"");
2136           while (myleft <= myright)
2137             putchar (*myleft++);
2138           printf ("\"\n");
2139         }
2140     }
2141 }
2142
2143 void
2144 mumble (char *text, int value)
2145 {
2146   printf ("%s:", text);
2147   if (value >= 0)
2148     printf ("%xx", value);
2149   else
2150     printf ("ABSENT");
2151   printf ("  ");
2152 }
2153
2154 #endif
2155
2156 int md_short_jump_size = 3;
2157 int md_long_jump_size = 6;
2158
2159 void
2160 md_create_short_jump (char *ptr,
2161                       addressT from_addr,
2162                       addressT to_addr ATTRIBUTE_UNUSED,
2163                       fragS *frag ATTRIBUTE_UNUSED,
2164                       symbolS *to_symbol ATTRIBUTE_UNUSED)
2165 {
2166   valueT offset;
2167
2168   /* This former calculation was off by two:
2169       offset = to_addr - (from_addr + 1);
2170      We need to account for the one byte instruction and also its
2171      two byte operand.  */
2172   offset = to_addr - (from_addr + 1 + 2);
2173   *ptr++ = VAX_BRW;             /* Branch with word (16 bit) offset.  */
2174   md_number_to_chars (ptr, offset, 2);
2175 }
2176
2177 void
2178 md_create_long_jump (char *ptr,
2179                      addressT from_addr ATTRIBUTE_UNUSED,
2180                      addressT to_addr,
2181                      fragS *frag,
2182                      symbolS *to_symbol)
2183 {
2184   valueT offset;
2185
2186   offset = to_addr - S_GET_VALUE (to_symbol);
2187   *ptr++ = VAX_JMP;             /* Arbitrary jump.  */
2188   *ptr++ = VAX_ABSOLUTE_MODE;
2189   md_number_to_chars (ptr, offset, 4);
2190   fix_new (frag, ptr - frag->fr_literal, 4, to_symbol, (long) 0, 0, NO_RELOC);
2191 }
2192 \f
2193 #ifdef OBJ_VMS
2194 const char *md_shortopts = "d:STt:V+1h:Hv::";
2195 #elif defined(OBJ_ELF)
2196 const char *md_shortopts = "d:STt:VkKQ:";
2197 #else
2198 const char *md_shortopts = "d:STt:V";
2199 #endif
2200 struct option md_longopts[] =
2201 {
2202 #ifdef OBJ_ELF
2203 #define OPTION_PIC (OPTION_MD_BASE)
2204   { "pic", no_argument, NULL, OPTION_PIC },
2205 #endif
2206   { NULL, no_argument, NULL, 0 }
2207 };
2208 size_t md_longopts_size = sizeof (md_longopts);
2209
2210 int
2211 md_parse_option (int c, char *arg)
2212 {
2213   switch (c)
2214     {
2215     case 'S':
2216       as_warn (_("SYMBOL TABLE not implemented"));
2217       break;
2218
2219     case 'T':
2220       as_warn (_("TOKEN TRACE not implemented"));
2221       break;
2222
2223     case 'd':
2224       as_warn (_("Displacement length %s ignored!"), arg);
2225       break;
2226
2227     case 't':
2228       as_warn (_("I don't need or use temp. file \"%s\"."), arg);
2229       break;
2230
2231     case 'V':
2232       as_warn (_("I don't use an interpass file! -V ignored"));
2233       break;
2234
2235 #ifdef OBJ_VMS
2236     case '+':                   /* For g++.  Hash any name > 31 chars long.  */
2237       flag_hash_long_names = 1;
2238       break;
2239
2240     case '1':                   /* For backward compatibility.  */
2241       flag_one = 1;
2242       break;
2243
2244     case 'H':                   /* Show new symbol after hash truncation.  */
2245       flag_show_after_trunc = 1;
2246       break;
2247
2248     case 'h':                   /* No hashing of mixed-case names.  */
2249       {
2250         extern char vms_name_mapping;
2251         vms_name_mapping = atoi (arg);
2252         flag_no_hash_mixed_case = 1;
2253       }
2254       break;
2255
2256     case 'v':
2257       {
2258         extern char *compiler_version_string;
2259
2260         if (!arg || !*arg || access (arg, 0) == 0)
2261           return 0;             /* Have caller show the assembler version.  */
2262         compiler_version_string = arg;
2263       }
2264       break;
2265 #endif
2266
2267 #ifdef OBJ_ELF
2268     case OPTION_PIC:
2269     case 'k':
2270       flag_want_pic = 1;
2271       break;                    /* -pic, Position Independent Code.  */
2272
2273      /* -Qy, -Qn: SVR4 arguments controlling whether a .comment
2274         section should be emitted or not.  FIXME: Not implemented.  */
2275     case 'Q':
2276       break;
2277 #endif
2278
2279     default:
2280       return 0;
2281     }
2282
2283   return 1;
2284 }
2285
2286 void
2287 md_show_usage (FILE *stream)
2288 {
2289   fprintf (stream, _("\
2290 VAX options:\n\
2291 -d LENGTH               ignored\n\
2292 -J                      ignored\n\
2293 -S                      ignored\n\
2294 -t FILE                 ignored\n\
2295 -T                      ignored\n\
2296 -V                      ignored\n"));
2297 #ifdef OBJ_VMS
2298   fprintf (stream, _("\
2299 VMS options:\n\
2300 -+                      hash encode names longer than 31 characters\n\
2301 -1                      `const' handling compatible with gcc 1.x\n\
2302 -H                      show new symbol after hash truncation\n\
2303 -h NUM                  don't hash mixed-case names, and adjust case:\n\
2304                         0 = upper, 2 = lower, 3 = preserve case\n\
2305 -v\"VERSION\"           code being assembled was produced by compiler \"VERSION\"\n"));
2306 #endif
2307 }
2308 \f
2309 /* We have no need to default values of symbols.  */
2310
2311 symbolS *
2312 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
2313 {
2314   return NULL;
2315 }
2316
2317 /* Round up a section size to the appropriate boundary.  */
2318 valueT
2319 md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
2320 {
2321   /* Byte alignment is fine */
2322   return size;
2323 }
2324
2325 /* Exactly what point is a PC-relative offset relative TO?
2326    On the vax, they're relative to the address of the offset, plus
2327    its size. */
2328 long
2329 md_pcrel_from (fixS *fixP)
2330 {
2331   return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
2332 }
2333
2334 arelent *
2335 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
2336 {
2337   arelent *reloc;
2338   bfd_reloc_code_real_type code;
2339
2340   if (fixp->fx_tcbit)
2341     abort ();
2342
2343   if (fixp->fx_r_type != BFD_RELOC_NONE)
2344     {
2345       code = fixp->fx_r_type;
2346
2347       if (fixp->fx_pcrel)
2348         {
2349           switch (code)
2350             {
2351             case BFD_RELOC_8_PCREL:
2352             case BFD_RELOC_16_PCREL:
2353             case BFD_RELOC_32_PCREL:
2354 #ifdef OBJ_ELF
2355             case BFD_RELOC_8_GOT_PCREL:
2356             case BFD_RELOC_16_GOT_PCREL:
2357             case BFD_RELOC_32_GOT_PCREL:
2358             case BFD_RELOC_8_PLT_PCREL:
2359             case BFD_RELOC_16_PLT_PCREL:
2360             case BFD_RELOC_32_PLT_PCREL:
2361 #endif
2362               break;
2363             default:
2364               as_bad_where (fixp->fx_file, fixp->fx_line,
2365                             _("Cannot make %s relocation PC relative"),
2366                             bfd_get_reloc_code_name (code));
2367             }
2368         }
2369     }
2370   else
2371     {
2372 #define F(SZ,PCREL)             (((SZ) << 1) + (PCREL))
2373       switch (F (fixp->fx_size, fixp->fx_pcrel))
2374         {
2375 #define MAP(SZ,PCREL,TYPE)      case F(SZ,PCREL): code = (TYPE); break
2376           MAP (1, 0, BFD_RELOC_8);
2377           MAP (2, 0, BFD_RELOC_16);
2378           MAP (4, 0, BFD_RELOC_32);
2379           MAP (1, 1, BFD_RELOC_8_PCREL);
2380           MAP (2, 1, BFD_RELOC_16_PCREL);
2381           MAP (4, 1, BFD_RELOC_32_PCREL);
2382         default:
2383           abort ();
2384         }
2385     }
2386 #undef F
2387 #undef MAP
2388
2389   reloc = xmalloc (sizeof (arelent));
2390   reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
2391   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2392   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
2393 #ifndef OBJ_ELF
2394   if (fixp->fx_pcrel)
2395     reloc->addend = fixp->fx_addnumber;
2396   else
2397     reloc->addend = 0;
2398 #else
2399   reloc->addend = fixp->fx_offset;
2400 #endif
2401
2402   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
2403   gas_assert (reloc->howto != 0);
2404
2405   return reloc;
2406 }
2407
2408 /* vax:md_assemble() emit frags for 1 instruction given in textual form.  */
2409 void
2410 md_assemble (char *instruction_string)
2411 {
2412   /* Non-zero if operand expression's segment is not known yet.  */
2413   int is_undefined;
2414   /* Non-zero if operand expression's segment is absolute.  */
2415   int is_absolute;
2416   int length_code;
2417   char *p;
2418   /* An operand. Scans all operands.  */
2419   struct vop *operandP;
2420   char *save_input_line_pointer;
2421                         /* What used to live after an expression.  */
2422   char c_save;
2423   /* 1: instruction_string bad for all passes.  */
2424   int goofed;
2425   /* Points to slot just after last operand.  */
2426   struct vop *end_operandP;
2427   /* Points to expression values for this operand.  */
2428   expressionS *expP;
2429   segT *segP;
2430
2431   /* These refer to an instruction operand expression.  */
2432   /* Target segment of the address.      */
2433   segT to_seg;
2434   valueT this_add_number;
2435   /* Positive (minuend) symbol.  */
2436   symbolS *this_add_symbol;
2437   /* As a number.  */
2438   long opcode_as_number;
2439   /* Least significant byte 1st.  */
2440   char *opcode_as_chars;
2441   /* As an array of characters.  */
2442   /* Least significant byte 1st */
2443   char *opcode_low_byteP;
2444   /* length (bytes) meant by vop_short.  */
2445   int length;
2446   /* 0, or 1 if '@' is in addressing mode.  */
2447   int at;
2448   /* From vop_nbytes: vax_operand_width (in bytes) */
2449   int nbytes;
2450   FLONUM_TYPE *floatP;
2451   LITTLENUM_TYPE literal_float[8];
2452   /* Big enough for any floating point literal.  */
2453
2454   vip (&v, instruction_string);
2455
2456   /* Now we try to find as many as_warn()s as we can. If we do any as_warn()s
2457      then goofed=1. Notice that we don't make any frags yet.
2458      Should goofed be 1, then this instruction will wedge in any pass,
2459      and we can safely flush it, without causing interpass symbol phase
2460      errors. That is, without changing label values in different passes.  */
2461   if ((goofed = (*v.vit_error)) != 0)
2462     {
2463       as_fatal (_("Ignoring statement due to \"%s\""), v.vit_error);
2464     }
2465   /* We need to use expression() and friends, which require us to diddle
2466      input_line_pointer. So we save it and restore it later.  */
2467   save_input_line_pointer = input_line_pointer;
2468   for (operandP = v.vit_operand,
2469        expP = exp_of_operand,
2470        segP = seg_of_operand,
2471        floatP = float_operand,
2472        end_operandP = v.vit_operand + v.vit_operands;
2473
2474        operandP < end_operandP;
2475
2476        operandP++, expP++, segP++, floatP++)
2477     {
2478       if (operandP->vop_error)
2479         {
2480           as_fatal (_("Aborting because statement has \"%s\""), operandP->vop_error);
2481           goofed = 1;
2482         }
2483       else
2484         {
2485           /* Statement has no syntax goofs: let's sniff the expression.  */
2486           int can_be_short = 0; /* 1 if a bignum can be reduced to a short literal.  */
2487
2488           input_line_pointer = operandP->vop_expr_begin;
2489           c_save = operandP->vop_expr_end[1];
2490           operandP->vop_expr_end[1] = '\0';
2491           /* If to_seg == SEG_PASS1, expression() will have set need_pass_2 = 1.  */
2492           *segP = expression (expP);
2493           switch (expP->X_op)
2494             {
2495             case O_absent:
2496               /* for BSD4.2 compatibility, missing expression is absolute 0 */
2497               expP->X_op = O_constant;
2498               expP->X_add_number = 0;
2499               /* For SEG_ABSOLUTE, we shouldn't need to set X_op_symbol,
2500                  X_add_symbol to any particular value.  But, we will program
2501                  defensively. Since this situation occurs rarely so it costs
2502                  us little to do, and stops Dean worrying about the origin of
2503                  random bits in expressionS's.  */
2504               expP->X_add_symbol = NULL;
2505               expP->X_op_symbol = NULL;
2506               break;
2507
2508             case O_symbol:
2509             case O_constant:
2510               break;
2511
2512             default:
2513               /* Major bug. We can't handle the case of a
2514                  SEG_OP expression in a VIT_OPCODE_SYNTHETIC
2515                  variable-length instruction.
2516                  We don't have a frag type that is smart enough to
2517                  relax a SEG_OP, and so we just force all
2518                  SEG_OPs to behave like SEG_PASS1s.
2519                  Clearly, if there is a demand we can invent a new or
2520                  modified frag type and then coding up a frag for this
2521                  case will be easy. SEG_OP was invented for the
2522                  .words after a CASE opcode, and was never intended for
2523                  instruction operands.  */
2524               need_pass_2 = 1;
2525               as_fatal (_("Can't relocate expression"));
2526               break;
2527
2528             case O_big:
2529               /* Preserve the bits.  */
2530               if (expP->X_add_number > 0)
2531                 {
2532                   bignum_copy (generic_bignum, expP->X_add_number,
2533                                floatP->low, SIZE_OF_LARGE_NUMBER);
2534                 }
2535               else
2536                 {
2537                   know (expP->X_add_number < 0);
2538                   flonum_copy (&generic_floating_point_number,
2539                                floatP);
2540                   if (strchr ("s i", operandP->vop_short))
2541                     {
2542                       /* Could possibly become S^# */
2543                       flonum_gen2vax (-expP->X_add_number, floatP, literal_float);
2544                       switch (-expP->X_add_number)
2545                         {
2546                         case 'f':
2547                           can_be_short =
2548                             (literal_float[0] & 0xFC0F) == 0x4000
2549                             && literal_float[1] == 0;
2550                           break;
2551
2552                         case 'd':
2553                           can_be_short =
2554                             (literal_float[0] & 0xFC0F) == 0x4000
2555                             && literal_float[1] == 0
2556                             && literal_float[2] == 0
2557                             && literal_float[3] == 0;
2558                           break;
2559
2560                         case 'g':
2561                           can_be_short =
2562                             (literal_float[0] & 0xFF81) == 0x4000
2563                             && literal_float[1] == 0
2564                             && literal_float[2] == 0
2565                             && literal_float[3] == 0;
2566                           break;
2567
2568                         case 'h':
2569                           can_be_short = ((literal_float[0] & 0xFFF8) == 0x4000
2570                                           && (literal_float[1] & 0xE000) == 0
2571                                           && literal_float[2] == 0
2572                                           && literal_float[3] == 0
2573                                           && literal_float[4] == 0
2574                                           && literal_float[5] == 0
2575                                           && literal_float[6] == 0
2576                                           && literal_float[7] == 0);
2577                           break;
2578
2579                         default:
2580                           BAD_CASE (-expP->X_add_number);
2581                           break;
2582                         }
2583                     }
2584                 }
2585
2586               if (operandP->vop_short == 's'
2587                   || operandP->vop_short == 'i'
2588                   || (operandP->vop_short == ' '
2589                       && operandP->vop_reg == 0xF
2590                       && (operandP->vop_mode & 0xE) == 0x8))
2591                 {
2592                   /* Saw a '#'.  */
2593                   if (operandP->vop_short == ' ')
2594                     {
2595                       /* We must chose S^ or I^.  */
2596                       if (expP->X_add_number > 0)
2597                         {
2598                           /* Bignum: Short literal impossible.  */
2599                           operandP->vop_short = 'i';
2600                           operandP->vop_mode = 8;
2601                           operandP->vop_reg = 0xF;      /* VAX PC.  */
2602                         }
2603                       else
2604                         {
2605                           /* Flonum: Try to do it.  */
2606                           if (can_be_short)
2607                             {
2608                               operandP->vop_short = 's';
2609                               operandP->vop_mode = 0;
2610                               operandP->vop_ndx = -1;
2611                               operandP->vop_reg = -1;
2612                               expP->X_op = O_constant;
2613                             }
2614                           else
2615                             {
2616                               operandP->vop_short = 'i';
2617                               operandP->vop_mode = 8;
2618                               operandP->vop_reg = 0xF;  /* VAX PC */
2619                             }
2620                         }       /* bignum or flonum ? */
2621                     }           /*  if #, but no S^ or I^ seen.  */
2622                   /* No more ' ' case: either 's' or 'i'.  */
2623                   if (operandP->vop_short == 's')
2624                     {
2625                       /* Wants to be a short literal.  */
2626                       if (expP->X_add_number > 0)
2627                         {
2628                           as_warn (_("Bignum not permitted in short literal. Immediate mode assumed."));
2629                           operandP->vop_short = 'i';
2630                           operandP->vop_mode = 8;
2631                           operandP->vop_reg = 0xF;      /* VAX PC.  */
2632                         }
2633                       else
2634                         {
2635                           if (!can_be_short)
2636                             {
2637                               as_warn (_("Can't do flonum short literal: immediate mode used."));
2638                               operandP->vop_short = 'i';
2639                               operandP->vop_mode = 8;
2640                               operandP->vop_reg = 0xF;  /* VAX PC.  */
2641                             }
2642                           else
2643                             {
2644                               /* Encode short literal now.  */
2645                               int temp = 0;
2646
2647                               switch (-expP->X_add_number)
2648                                 {
2649                                 case 'f':
2650                                 case 'd':
2651                                   temp = literal_float[0] >> 4;
2652                                   break;
2653
2654                                 case 'g':
2655                                   temp = literal_float[0] >> 1;
2656                                   break;
2657
2658                                 case 'h':
2659                                   temp = ((literal_float[0] << 3) & 070)
2660                                     | ((literal_float[1] >> 13) & 07);
2661                                   break;
2662
2663                                 default:
2664                                   BAD_CASE (-expP->X_add_number);
2665                                   break;
2666                                 }
2667
2668                               floatP->low[0] = temp & 077;
2669                               floatP->low[1] = 0;
2670                             }
2671                         }
2672                     }
2673                   else
2674                     {
2675                       /* I^# seen: set it up if float.  */
2676                       if (expP->X_add_number < 0)
2677                         {
2678                           memcpy (floatP->low, literal_float, sizeof (literal_float));
2679                         }
2680                     }           /* if S^# seen.  */
2681                 }
2682               else
2683                 {
2684                   as_warn (_("A bignum/flonum may not be a displacement: 0x%lx used"),
2685                            (expP->X_add_number = 0x80000000L));
2686                   /* Chosen so luser gets the most offset bits to patch later.  */
2687                 }
2688               expP->X_add_number = floatP->low[0]
2689                 | ((LITTLENUM_MASK & (floatP->low[1])) << LITTLENUM_NUMBER_OF_BITS);
2690
2691               /* For the O_big case we have:
2692                  If vop_short == 's' then a short floating literal is in the
2693                         lowest 6 bits of floatP -> low [0], which is
2694                         big_operand_bits [---] [0].
2695                  If vop_short == 'i' then the appropriate number of elements
2696                         of big_operand_bits [---] [...] are set up with the correct
2697                         bits.
2698                  Also, just in case width is byte word or long, we copy the lowest
2699                  32 bits of the number to X_add_number.  */
2700               break;
2701             }
2702           if (input_line_pointer != operandP->vop_expr_end + 1)
2703             {
2704               as_fatal ("Junk at end of expression \"%s\"", input_line_pointer);
2705               goofed = 1;
2706             }
2707           operandP->vop_expr_end[1] = c_save;
2708         }
2709     }
2710
2711   input_line_pointer = save_input_line_pointer;
2712
2713   if (need_pass_2 || goofed)
2714     return;
2715
2716   /* Emit op-code.  */
2717   /* Remember where it is, in case we want to modify the op-code later.  */
2718   opcode_low_byteP = frag_more (v.vit_opcode_nbytes);
2719   memcpy (opcode_low_byteP, v.vit_opcode, v.vit_opcode_nbytes);
2720   opcode_as_chars = v.vit_opcode;
2721   opcode_as_number = md_chars_to_number ((unsigned char *) opcode_as_chars, 4);
2722   for (operandP = v.vit_operand,
2723        expP = exp_of_operand,
2724        segP = seg_of_operand,
2725        floatP = float_operand,
2726        end_operandP = v.vit_operand + v.vit_operands;
2727
2728        operandP < end_operandP;
2729
2730        operandP++,
2731        floatP++,
2732        segP++,
2733        expP++)
2734     {
2735       if (operandP->vop_ndx >= 0)
2736         {
2737           /* Indexed addressing byte.  */
2738           /* Legality of indexed mode already checked: it is OK.  */
2739           FRAG_APPEND_1_CHAR (0x40 + operandP->vop_ndx);
2740         }                       /* if(vop_ndx>=0) */
2741
2742       /* Here to make main operand frag(s).  */
2743       this_add_number = expP->X_add_number;
2744       this_add_symbol = expP->X_add_symbol;
2745       to_seg = *segP;
2746       is_undefined = (to_seg == undefined_section);
2747       is_absolute = (to_seg == absolute_section);
2748       at = operandP->vop_mode & 1;
2749       length = (operandP->vop_short == 'b'
2750                 ? 1 : (operandP->vop_short == 'w'
2751                        ? 2 : (operandP->vop_short == 'l'
2752                               ? 4 : 0)));
2753       nbytes = operandP->vop_nbytes;
2754       if (operandP->vop_access == 'b')
2755         {
2756           if (to_seg == now_seg || is_undefined)
2757             {
2758               /* If is_undefined, then it might BECOME now_seg.  */
2759               if (nbytes)
2760                 {
2761                   p = frag_more (nbytes);
2762                   fix_new (frag_now, p - frag_now->fr_literal, nbytes,
2763                            this_add_symbol, this_add_number, 1, NO_RELOC);
2764                 }
2765               else
2766                 {
2767                   /* to_seg==now_seg || to_seg == SEG_UNKNOWN */
2768                   /* nbytes==0 */
2769                   length_code = is_undefined ? STATE_UNDF : STATE_BYTE;
2770                   if (opcode_as_number & VIT_OPCODE_SPECIAL)
2771                     {
2772                       if (operandP->vop_width == VAX_WIDTH_UNCONDITIONAL_JUMP)
2773                         {
2774                           /* br or jsb */
2775                           frag_var (rs_machine_dependent, 5, 1,
2776                             ENCODE_RELAX (STATE_ALWAYS_BRANCH, length_code),
2777                                     this_add_symbol, this_add_number,
2778                                     opcode_low_byteP);
2779                         }
2780                       else
2781                         {
2782                           if (operandP->vop_width == VAX_WIDTH_WORD_JUMP)
2783                             {
2784                               length_code = STATE_WORD;
2785                               /* JF: There is no state_byte for this one! */
2786                               frag_var (rs_machine_dependent, 10, 2,
2787                                         ENCODE_RELAX (STATE_COMPLEX_BRANCH, length_code),
2788                                         this_add_symbol, this_add_number,
2789                                         opcode_low_byteP);
2790                             }
2791                           else
2792                             {
2793                               know (operandP->vop_width == VAX_WIDTH_BYTE_JUMP);
2794                               frag_var (rs_machine_dependent, 9, 1,
2795                               ENCODE_RELAX (STATE_COMPLEX_HOP, length_code),
2796                                         this_add_symbol, this_add_number,
2797                                         opcode_low_byteP);
2798                             }
2799                         }
2800                     }
2801                   else
2802                     {
2803                       know (operandP->vop_width == VAX_WIDTH_CONDITIONAL_JUMP);
2804                       frag_var (rs_machine_dependent, 7, 1,
2805                        ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, length_code),
2806                                 this_add_symbol, this_add_number,
2807                                 opcode_low_byteP);
2808                     }
2809                 }
2810             }
2811           else
2812             {
2813               /* to_seg != now_seg && to_seg != SEG_UNKNOWN */
2814               /* --- SEG FLOAT MAY APPEAR HERE ---  */
2815               if (is_absolute)
2816                 {
2817                   if (nbytes)
2818                     {
2819                       know (!(opcode_as_number & VIT_OPCODE_SYNTHETIC));
2820                       p = frag_more (nbytes);
2821                       /* Conventional relocation.  */
2822                       fix_new (frag_now, p - frag_now->fr_literal, nbytes,
2823                                section_symbol (absolute_section),
2824                                this_add_number, 1, NO_RELOC);
2825                     }
2826                   else
2827                     {
2828                       know (opcode_as_number & VIT_OPCODE_SYNTHETIC);
2829                       if (opcode_as_number & VIT_OPCODE_SPECIAL)
2830                         {
2831                           if (operandP->vop_width == VAX_WIDTH_UNCONDITIONAL_JUMP)
2832                             {
2833                               /* br or jsb */
2834                               *opcode_low_byteP = opcode_as_chars[0] + VAX_WIDEN_LONG;
2835                               know (opcode_as_chars[1] == 0);
2836                               p = frag_more (5);
2837                               p[0] = VAX_ABSOLUTE_MODE; /* @#...  */
2838                               md_number_to_chars (p + 1, this_add_number, 4);
2839                               /* Now (eg) JMP @#foo or JSB @#foo.  */
2840                             }
2841                           else
2842                             {
2843                               if (operandP->vop_width == VAX_WIDTH_WORD_JUMP)
2844                                 {
2845                                   p = frag_more (10);
2846                                   p[0] = 2;
2847                                   p[1] = 0;
2848                                   p[2] = VAX_BRB;
2849                                   p[3] = 6;
2850                                   p[4] = VAX_JMP;
2851                                   p[5] = VAX_ABSOLUTE_MODE;     /* @#...  */
2852                                   md_number_to_chars (p + 6, this_add_number, 4);
2853                                   /* Now (eg)   ACBx    1f
2854                                                 BRB     2f
2855                                         1:      JMP     @#foo
2856                                         2:  */
2857                                 }
2858                               else
2859                                 {
2860                                   know (operandP->vop_width == VAX_WIDTH_BYTE_JUMP);
2861                                   p = frag_more (9);
2862                                   p[0] = 2;
2863                                   p[1] = VAX_BRB;
2864                                   p[2] = 6;
2865                                   p[3] = VAX_JMP;
2866                                   p[4] = VAX_ABSOLUTE_MODE;     /* @#...  */
2867                                   md_number_to_chars (p + 5, this_add_number, 4);
2868                                   /* Now (eg)   xOBxxx  1f
2869                                                 BRB     2f
2870                                         1:      JMP     @#foo
2871                                         2:  */
2872                                 }
2873                             }
2874                         }
2875                       else
2876                         {
2877                           /* b<cond> */
2878                           *opcode_low_byteP ^= 1;
2879                           /* To reverse the condition in a VAX branch,
2880                              complement the lowest order bit.  */
2881                           p = frag_more (7);
2882                           p[0] = 6;
2883                           p[1] = VAX_JMP;
2884                           p[2] = VAX_ABSOLUTE_MODE;     /* @#...  */
2885                           md_number_to_chars (p + 3, this_add_number, 4);
2886                           /* Now (eg)   BLEQ    1f
2887                                         JMP     @#foo
2888                                 1:  */
2889                         }
2890                     }
2891                 }
2892               else
2893                 {
2894                   /* to_seg != now_seg && !is_undefinfed && !is_absolute */
2895                   if (nbytes > 0)
2896                     {
2897                       /* Pc-relative. Conventional relocation.  */
2898                       know (!(opcode_as_number & VIT_OPCODE_SYNTHETIC));
2899                       p = frag_more (nbytes);
2900                       fix_new (frag_now, p - frag_now->fr_literal, nbytes,
2901                                section_symbol (absolute_section),
2902                                this_add_number, 1, NO_RELOC);
2903                     }
2904                   else
2905                     {
2906                       know (opcode_as_number & VIT_OPCODE_SYNTHETIC);
2907                       if (opcode_as_number & VIT_OPCODE_SPECIAL)
2908                         {
2909                           if (operandP->vop_width == VAX_WIDTH_UNCONDITIONAL_JUMP)
2910                             {
2911                               /* br or jsb */
2912                               know (opcode_as_chars[1] == 0);
2913                               *opcode_low_byteP = opcode_as_chars[0] + VAX_WIDEN_LONG;
2914                               p = frag_more (5);
2915                               p[0] = VAX_PC_RELATIVE_MODE;
2916                               fix_new (frag_now,
2917                                        p + 1 - frag_now->fr_literal, 4,
2918                                        this_add_symbol,
2919                                        this_add_number, 1, NO_RELOC);
2920                               /* Now eg JMP foo or JSB foo.  */
2921                             }
2922                           else
2923                             {
2924                               if (operandP->vop_width == VAX_WIDTH_WORD_JUMP)
2925                                 {
2926                                   p = frag_more (10);
2927                                   p[0] = 0;
2928                                   p[1] = 2;
2929                                   p[2] = VAX_BRB;
2930                                   p[3] = 6;
2931                                   p[4] = VAX_JMP;
2932                                   p[5] = VAX_PC_RELATIVE_MODE;
2933                                   fix_new (frag_now,
2934                                            p + 6 - frag_now->fr_literal, 4,
2935                                            this_add_symbol,
2936                                            this_add_number, 1, NO_RELOC);
2937                                   /* Now (eg)   ACBx    1f
2938                                                 BRB     2f
2939                                         1:      JMP     foo
2940                                         2:  */
2941                                 }
2942                               else
2943                                 {
2944                                   know (operandP->vop_width == VAX_WIDTH_BYTE_JUMP);
2945                                   p = frag_more (10);
2946                                   p[0] = 2;
2947                                   p[1] = VAX_BRB;
2948                                   p[2] = 6;
2949                                   p[3] = VAX_JMP;
2950                                   p[4] = VAX_PC_RELATIVE_MODE;
2951                                   fix_new (frag_now,
2952                                            p + 5 - frag_now->fr_literal,
2953                                            4, this_add_symbol,
2954                                            this_add_number, 1, NO_RELOC);
2955                                   /* Now (eg)   xOBxxx  1f
2956                                                 BRB     2f
2957                                         1:      JMP     foo
2958                                         2:  */
2959                                 }
2960                             }
2961                         }
2962                       else
2963                         {
2964                           know (operandP->vop_width == VAX_WIDTH_CONDITIONAL_JUMP);
2965                           *opcode_low_byteP ^= 1;       /* Reverse branch condition.  */
2966                           p = frag_more (7);
2967                           p[0] = 6;
2968                           p[1] = VAX_JMP;
2969                           p[2] = VAX_PC_RELATIVE_MODE;
2970                           fix_new (frag_now, p + 3 - frag_now->fr_literal,
2971                                    4, this_add_symbol,
2972                                    this_add_number, 1, NO_RELOC);
2973                         }
2974                     }
2975                 }
2976             }
2977         }
2978       else
2979         {
2980           /* So it is ordinary operand.  */
2981           know (operandP->vop_access != 'b');
2982           /* ' ' target-independent: elsewhere.  */
2983           know (operandP->vop_access != ' ');
2984           know (operandP->vop_access == 'a'
2985                 || operandP->vop_access == 'm'
2986                 || operandP->vop_access == 'r'
2987                 || operandP->vop_access == 'v'
2988                 || operandP->vop_access == 'w');
2989           if (operandP->vop_short == 's')
2990             {
2991               if (is_absolute)
2992                 {
2993                   if (this_add_number >= 64)
2994                     {
2995                       as_warn (_("Short literal overflow(%ld.), immediate mode assumed."),
2996                                (long) this_add_number);
2997                       operandP->vop_short = 'i';
2998                       operandP->vop_mode = 8;
2999                       operandP->vop_reg = 0xF;
3000                     }
3001                 }
3002               else
3003                 {
3004                   as_warn (_("Forced short literal to immediate mode. now_seg=%s to_seg=%s"),
3005                            segment_name (now_seg), segment_name (to_seg));
3006                   operandP->vop_short = 'i';
3007                   operandP->vop_mode = 8;
3008                   operandP->vop_reg = 0xF;
3009                 }
3010             }
3011           if (operandP->vop_reg >= 0 && (operandP->vop_mode < 8
3012                   || (operandP->vop_reg != 0xF && operandP->vop_mode < 10)))
3013             {
3014               /* One byte operand.  */
3015               know (operandP->vop_mode > 3);
3016               FRAG_APPEND_1_CHAR (operandP->vop_mode << 4 | operandP->vop_reg);
3017               /* All 1-bytes except S^# happen here.  */
3018             }
3019           else
3020             {
3021               /* {@}{q^}foo{(Rn)} or S^#foo */
3022               if (operandP->vop_reg == -1 && operandP->vop_short != 's')
3023                 {
3024                   /* "{@}{q^}foo" */
3025                   if (to_seg == now_seg)
3026                     {
3027                       if (length == 0)
3028                         {
3029                           know (operandP->vop_short == ' ');
3030                           length_code = STATE_BYTE;
3031 #ifdef OBJ_ELF
3032                           if (S_IS_EXTERNAL (this_add_symbol)
3033                               || S_IS_WEAK (this_add_symbol))
3034                             length_code = STATE_UNDF;
3035 #endif
3036                           p = frag_var (rs_machine_dependent, 10, 2,
3037                                ENCODE_RELAX (STATE_PC_RELATIVE, length_code),
3038                                         this_add_symbol, this_add_number,
3039                                         opcode_low_byteP);
3040                           know (operandP->vop_mode == 10 + at);
3041                           *p = at << 4;
3042                           /* At is the only context we need to carry
3043                              to other side of relax() process.  Must
3044                              be in the correct bit position of VAX
3045                              operand spec. byte.  */
3046                         }
3047                       else
3048                         {
3049                           know (length);
3050                           know (operandP->vop_short != ' ');
3051                           p = frag_more (length + 1);
3052                           p[0] = 0xF | ((at + "?\12\14?\16"[length]) << 4);
3053                           fix_new (frag_now, p + 1 - frag_now->fr_literal,
3054                                    length, this_add_symbol,
3055                                    this_add_number, 1, NO_RELOC);
3056                         }
3057                     }
3058                   else
3059                     {
3060                       /* to_seg != now_seg */
3061                       if (this_add_symbol == NULL)
3062                         {
3063                           know (is_absolute);
3064                           /* Do @#foo: simpler relocation than foo-.(pc) anyway.  */
3065                           p = frag_more (5);
3066                           p[0] = VAX_ABSOLUTE_MODE;     /* @#...  */
3067                           md_number_to_chars (p + 1, this_add_number, 4);
3068                           if (length && length != 4)
3069                             as_warn (_("Length specification ignored. Address mode 9F used"));
3070                         }
3071                       else
3072                         {
3073                           /* {@}{q^}other_seg */
3074                           know ((length == 0 && operandP->vop_short == ' ')
3075                              || (length > 0 && operandP->vop_short != ' '));
3076                           if (is_undefined
3077 #ifdef OBJ_ELF
3078                               || S_IS_WEAK(this_add_symbol)
3079                               || S_IS_EXTERNAL(this_add_symbol)
3080 #endif
3081                               )
3082                             {
3083                               switch (length)
3084                                 {
3085                                 default: length_code = STATE_UNDF; break;
3086                                 case 1: length_code = STATE_BYTE; break;
3087                                 case 2: length_code = STATE_WORD; break;
3088                                 case 4: length_code = STATE_LONG; break;
3089                                 }
3090                               /* We have a SEG_UNKNOWN symbol. It might
3091                                  turn out to be in the same segment as
3092                                  the instruction, permitting relaxation.  */
3093                               p = frag_var (rs_machine_dependent, 5, 2,
3094                                ENCODE_RELAX (STATE_PC_RELATIVE, length_code),
3095                                             this_add_symbol, this_add_number,
3096                                             opcode_low_byteP);
3097                               p[0] = at << 4;
3098                             }
3099                           else
3100                             {
3101                               if (length == 0)
3102                                 {
3103                                   know (operandP->vop_short == ' ');
3104                                   length = 4;   /* Longest possible.  */
3105                                 }
3106                               p = frag_more (length + 1);
3107                               p[0] = 0xF | ((at + "?\12\14?\16"[length]) << 4);
3108                               md_number_to_chars (p + 1, this_add_number, length);
3109                               fix_new (frag_now,
3110                                        p + 1 - frag_now->fr_literal,
3111                                        length, this_add_symbol,
3112                                        this_add_number, 1, NO_RELOC);
3113                             }
3114                         }
3115                     }
3116                 }
3117               else
3118                 {
3119                   /* {@}{q^}foo(Rn) or S^# or I^# or # */
3120                   if (operandP->vop_mode < 0xA)
3121                     {
3122                       /* # or S^# or I^# */
3123                       if (operandP->vop_access == 'v'
3124                           || operandP->vop_access == 'a')
3125                         {
3126                           if (operandP->vop_access == 'v')
3127                             as_warn (_("Invalid operand:  immediate value used as base address."));
3128                           else
3129                             as_warn (_("Invalid operand:  immediate value used as address."));
3130                           /* gcc 2.6.3 is known to generate these in at least
3131                              one case.  */
3132                         }
3133                       if (length == 0
3134                           && is_absolute && (expP->X_op != O_big)
3135                           && operandP->vop_mode == 8    /* No '@'.  */
3136                           && this_add_number < 64)
3137                         {
3138                           operandP->vop_short = 's';
3139                         }
3140                       if (operandP->vop_short == 's')
3141                         {
3142                           FRAG_APPEND_1_CHAR (this_add_number);
3143                         }
3144                       else
3145                         {
3146                           /* I^#...  */
3147                           know (nbytes);
3148                           p = frag_more (nbytes + 1);
3149                           know (operandP->vop_reg == 0xF);
3150 #ifdef OBJ_ELF
3151                           if (flag_want_pic && operandP->vop_mode == 8
3152                                 && this_add_symbol != NULL)
3153                             {
3154                               as_warn (_("Symbol %s used as immediate operand in PIC mode."),
3155                                        S_GET_NAME (this_add_symbol));
3156                             }
3157 #endif
3158                           p[0] = (operandP->vop_mode << 4) | 0xF;
3159                           if ((is_absolute) && (expP->X_op != O_big))
3160                             {
3161                               /* If nbytes > 4, then we are scrod. We
3162                                  don't know if the high order bytes
3163                                  are to be 0xFF or 0x00.  BSD4.2 & RMS
3164                                  say use 0x00. OK --- but this
3165                                  assembler needs ANOTHER rewrite to
3166                                  cope properly with this bug.  */
3167                               md_number_to_chars (p + 1, this_add_number,
3168                                                   min (sizeof (valueT),
3169                                                        (size_t) nbytes));
3170                               if ((size_t) nbytes > sizeof (valueT))
3171                                 memset (p + 1 + sizeof (valueT),
3172                                         '\0', nbytes - sizeof (valueT));
3173                             }
3174                           else
3175                             {
3176                               if (expP->X_op == O_big)
3177                                 {
3178                                   /* Problem here is to get the bytes
3179                                      in the right order.  We stored
3180                                      our constant as LITTLENUMs, not
3181                                      bytes.  */
3182                                   LITTLENUM_TYPE *lP;
3183
3184                                   lP = floatP->low;
3185                                   if (nbytes & 1)
3186                                     {
3187                                       know (nbytes == 1);
3188                                       p[1] = *lP;
3189                                     }
3190                                   else
3191                                     {
3192                                       for (p++; nbytes; nbytes -= 2, p += 2, lP++)
3193                                         md_number_to_chars (p, *lP, 2);
3194                                     }
3195                                 }
3196                               else
3197                                 {
3198                                   fix_new (frag_now, p + 1 - frag_now->fr_literal,
3199                                            nbytes, this_add_symbol,
3200                                            this_add_number, 0, NO_RELOC);
3201                                 }
3202                             }
3203                         }
3204                     }
3205                   else
3206                     {
3207                       /* {@}{q^}foo(Rn) */
3208                       know ((length == 0 && operandP->vop_short == ' ')
3209                             || (length > 0 && operandP->vop_short != ' '));
3210                       if (length == 0)
3211                         {
3212                           if (is_absolute)
3213                             {
3214                               long test;
3215
3216                               test = this_add_number;
3217
3218                               if (test < 0)
3219                                 test = ~test;
3220
3221                               length = test & 0xffff8000 ? 4
3222                                 : test & 0xffffff80 ? 2
3223                                 : 1;
3224                             }
3225                           else
3226                             {
3227                               length = 4;
3228                             }
3229                         }
3230                       p = frag_more (1 + length);
3231                       know (operandP->vop_reg >= 0);
3232                       p[0] = operandP->vop_reg
3233                         | ((at | "?\12\14?\16"[length]) << 4);
3234                       if (is_absolute)
3235                         {
3236                           md_number_to_chars (p + 1, this_add_number, length);
3237                         }
3238                       else
3239                         {
3240                           fix_new (frag_now, p + 1 - frag_now->fr_literal,
3241                                    length, this_add_symbol,
3242                                    this_add_number, 0, NO_RELOC);
3243                         }
3244                     }
3245                 }
3246             }
3247         }
3248     }
3249 }
3250
3251 void
3252 md_begin (void)
3253 {
3254   const char *errtxt;
3255   FLONUM_TYPE *fP;
3256   int i;
3257
3258   if ((errtxt = vip_begin (1, "$", "*", "`")) != 0)
3259     as_fatal (_("VIP_BEGIN error:%s"), errtxt);
3260
3261   for (i = 0, fP = float_operand;
3262        fP < float_operand + VIT_MAX_OPERANDS;
3263        i++, fP++)
3264     {
3265       fP->low = &big_operand_bits[i][0];
3266       fP->high = &big_operand_bits[i][SIZE_OF_LARGE_NUMBER - 1];
3267     }
3268 }
3269
3270 static char *vax_cons_special_reloc;
3271
3272 void
3273 vax_cons (expressionS *exp, int size)
3274 {
3275   char *save;
3276
3277   SKIP_WHITESPACE ();
3278   vax_cons_special_reloc = NULL;
3279   save = input_line_pointer;
3280   if (input_line_pointer[0] == '%')
3281     {
3282       if (strncmp (input_line_pointer + 1, "pcrel", 5) == 0)
3283         {
3284           input_line_pointer += 6;
3285           vax_cons_special_reloc = "pcrel";
3286         }
3287       if (vax_cons_special_reloc)
3288         {
3289           int bad = 0;
3290
3291           switch (size)
3292             {
3293             case 1:
3294               if (*input_line_pointer != '8')
3295                 bad = 1;
3296               input_line_pointer--;
3297               break;
3298             case 2:
3299               if (input_line_pointer[0] != '1' || input_line_pointer[1] != '6')
3300                 bad = 1;
3301               break;
3302             case 4:
3303               if (input_line_pointer[0] != '3' || input_line_pointer[1] != '2')
3304                 bad = 1;
3305               break;
3306             default:
3307               bad = 1;
3308               break;
3309             }
3310
3311           if (bad)
3312             {
3313               as_bad (_("Illegal operands: Only %%r_%s%d allowed in %d-byte data fields"),
3314                       vax_cons_special_reloc, size * 8, size);
3315             }
3316           else
3317             {
3318               input_line_pointer += 2;
3319               if (*input_line_pointer != '(')
3320                 {
3321                   as_bad (_("Illegal operands: %%r_%s%d requires arguments in ()"),
3322                           vax_cons_special_reloc, size * 8);
3323                   bad = 1;
3324                 }
3325             }
3326
3327           if (bad)
3328             {
3329               input_line_pointer = save;
3330               vax_cons_special_reloc = NULL;
3331             }
3332           else
3333             {
3334               int c;
3335               char *end = ++input_line_pointer;
3336               int npar = 0;
3337
3338               while (! is_end_of_line[(c = *end)])
3339                 {
3340                   if (c == '(')
3341                     npar++;
3342                   else if (c == ')')
3343                     {
3344                       if (!npar)
3345                         break;
3346                       npar--;
3347                     }
3348                   end++;
3349                 }
3350
3351               if (c != ')')
3352                 as_bad (_("Illegal operands: %%r_%s%d requires arguments in ()"),
3353                         vax_cons_special_reloc, size * 8);
3354               else
3355                 {
3356                   *end = '\0';
3357                   expression (exp);
3358                   *end = c;
3359                   if (input_line_pointer != end)
3360                     {
3361                       as_bad (_("Illegal operands: %%r_%s%d requires arguments in ()"),
3362                               vax_cons_special_reloc, size * 8);
3363                     }
3364                   else
3365                     {
3366                       input_line_pointer++;
3367                       SKIP_WHITESPACE ();
3368                       c = *input_line_pointer;
3369                       if (! is_end_of_line[c] && c != ',')
3370                         as_bad (_("Illegal operands: garbage after %%r_%s%d()"),
3371                                 vax_cons_special_reloc, size * 8);
3372                     }
3373                 }
3374             }
3375         }
3376     }
3377   if (vax_cons_special_reloc == NULL)
3378     expression (exp);
3379 }
3380
3381 /* This is called by emit_expr via TC_CONS_FIX_NEW when creating a
3382    reloc for a cons.  */
3383
3384 void
3385 vax_cons_fix_new (fragS *frag, int where, unsigned int nbytes, expressionS *exp)
3386 {
3387   bfd_reloc_code_real_type r;
3388
3389   r = (nbytes == 1 ? BFD_RELOC_8 :
3390        (nbytes == 2 ? BFD_RELOC_16 : BFD_RELOC_32));
3391
3392   if (vax_cons_special_reloc)
3393     {
3394       if (*vax_cons_special_reloc == 'p')
3395         {
3396           switch (nbytes)
3397             {
3398             case 1: r = BFD_RELOC_8_PCREL; break;
3399             case 2: r = BFD_RELOC_16_PCREL; break;
3400             case 4: r = BFD_RELOC_32_PCREL; break;
3401             default: abort ();
3402             }
3403         }
3404     }
3405
3406   fix_new_exp (frag, where, (int) nbytes, exp, 0, r);
3407   vax_cons_special_reloc = NULL;
3408 }
3409
3410 char *
3411 md_atof (int type, char * litP, int * sizeP)
3412 {
3413   return vax_md_atof (type, litP, sizeP);
3414 }