OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [binutils-2.18.50/] [gas/] [config/] [tc-vax.c] - Blame information for rev 816

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.