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