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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [binutils-2.20.1/] [gas/] [config/] [tc-vax.c] - Blame information for rev 860

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 205 julius
/* tc-vax.c - vax-specific -
2
   Copyright 1987, 1991, 1992, 1993, 1994, 1995, 1998, 2000, 2001, 2002,
3
   2003, 2004, 2005, 2006, 2007, 2008, 2009
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
              /* Indirect references cannot go through the GOT or PLT,
400
                 let's hope they'll become local in the final link.  */
401
              if ((ELF_ST_VISIBILITY (S_GET_OTHER (fragP->fr_symbol))
402
                   != STV_DEFAULT)
403
                  || (p[0] & 0x10))
404
                reloc_type = BFD_RELOC_32_PCREL;
405
              else if (((unsigned char *) fragP->fr_opcode)[0] == VAX_CALLS
406
                       || ((unsigned char *) fragP->fr_opcode)[0] == VAX_CALLG
407
                       || ((unsigned char *) fragP->fr_opcode)[0] == VAX_JSB
408
                       || ((unsigned char *) fragP->fr_opcode)[0] == VAX_JMP
409
                       || S_IS_FUNCTION (fragP->fr_symbol))
410
                reloc_type = BFD_RELOC_32_PLT_PCREL;
411
              else
412
                reloc_type = BFD_RELOC_32_GOT_PCREL;
413
            }
414
#endif
415
          switch (RELAX_STATE (fragP->fr_subtype))
416
            {
417
            case STATE_PC_RELATIVE:
418
              p[0] |= VAX_PC_RELATIVE_MODE;      /* Preserve @ bit.  */
419
              fragP->fr_fix += 1 + 4;
420
              fix_new (fragP, old_fr_fix + 1, 4, fragP->fr_symbol,
421
                       fragP->fr_offset, 1, reloc_type);
422
              break;
423
 
424
            case STATE_CONDITIONAL_BRANCH:
425
              *fragP->fr_opcode ^= 1;           /* Reverse sense of branch.  */
426
              p[0] = 6;
427
              p[1] = VAX_JMP;
428
              p[2] = VAX_PC_RELATIVE_MODE;      /* ...(PC) */
429
              fragP->fr_fix += 1 + 1 + 1 + 4;
430
              fix_new (fragP, old_fr_fix + 3, 4, fragP->fr_symbol,
431
                       fragP->fr_offset, 1, NO_RELOC);
432
              break;
433
 
434
            case STATE_COMPLEX_BRANCH:
435
              p[0] = 2;
436
              p[1] = 0;
437
              p[2] = VAX_BRB;
438
              p[3] = 6;
439
              p[4] = VAX_JMP;
440
              p[5] = VAX_PC_RELATIVE_MODE;      /* ...(pc) */
441
              fragP->fr_fix += 2 + 2 + 1 + 1 + 4;
442
              fix_new (fragP, old_fr_fix + 6, 4, fragP->fr_symbol,
443
                       fragP->fr_offset, 1, NO_RELOC);
444
              break;
445
 
446
            case STATE_COMPLEX_HOP:
447
              p[0] = 2;
448
              p[1] = VAX_BRB;
449
              p[2] = 6;
450
              p[3] = VAX_JMP;
451
              p[4] = VAX_PC_RELATIVE_MODE;      /* ...(pc) */
452
              fragP->fr_fix += 1 + 2 + 1 + 1 + 4;
453
              fix_new (fragP, old_fr_fix + 5, 4, fragP->fr_symbol,
454
                       fragP->fr_offset, 1, NO_RELOC);
455
              break;
456
 
457
            case STATE_ALWAYS_BRANCH:
458
              *fragP->fr_opcode += VAX_WIDEN_LONG;
459
              p[0] = VAX_PC_RELATIVE_MODE;       /* ...(PC) */
460
              fragP->fr_fix += 1 + 4;
461
              fix_new (fragP, old_fr_fix + 1, 4, fragP->fr_symbol,
462
                       fragP->fr_offset, 1, NO_RELOC);
463
              break;
464
 
465
            default:
466
              abort ();
467
            }
468
          frag_wane (fragP);
469
 
470
          /* Return the growth in the fixed part of the frag.  */
471
          return fragP->fr_fix - old_fr_fix;
472
        }
473
 
474
      /* Relaxable cases.  Set up the initial guess for the variable
475
         part of the frag.  */
476
      switch (RELAX_STATE (fragP->fr_subtype))
477
        {
478
        case STATE_PC_RELATIVE:
479
          fragP->fr_subtype = ENCODE_RELAX (STATE_PC_RELATIVE, STATE_BYTE);
480
          break;
481
        case STATE_CONDITIONAL_BRANCH:
482
          fragP->fr_subtype = ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_BYTE);
483
          break;
484
        case STATE_COMPLEX_BRANCH:
485
          fragP->fr_subtype = ENCODE_RELAX (STATE_COMPLEX_BRANCH, STATE_WORD);
486
          break;
487
        case STATE_COMPLEX_HOP:
488
          fragP->fr_subtype = ENCODE_RELAX (STATE_COMPLEX_HOP, STATE_BYTE);
489
          break;
490
        case STATE_ALWAYS_BRANCH:
491
          fragP->fr_subtype = ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_BYTE);
492
          break;
493
        }
494
    }
495
 
496
  if (fragP->fr_subtype >= sizeof (md_relax_table) / sizeof (md_relax_table[0]))
497
    abort ();
498
 
499
  /* Return the size of the variable part of the frag.  */
500
  return md_relax_table[fragP->fr_subtype].rlx_length;
501
}
502
 
503
/* Called after relax() is finished.
504
   In:  Address of frag.
505
        fr_type == rs_machine_dependent.
506
        fr_subtype is what the address relaxed to.
507
 
508
   Out: Any fixSs and constants are set up.
509
        Caller will turn frag into a ".space 0".  */
510
void
511
md_convert_frag (bfd *headers ATTRIBUTE_UNUSED,
512
                 segT seg ATTRIBUTE_UNUSED,
513
                 fragS *fragP)
514
{
515
  char *addressP;               /* -> _var to change.  */
516
  char *opcodeP;                /* -> opcode char(s) to change.  */
517
  short int extension = 0;       /* Size of relaxed address.  */
518
  /* Added to fr_fix: incl. ALL var chars.  */
519
  symbolS *symbolP;
520
  long where;
521
 
522
  know (fragP->fr_type == rs_machine_dependent);
523
  where = fragP->fr_fix;
524
  addressP = fragP->fr_literal + where;
525
  opcodeP = fragP->fr_opcode;
526
  symbolP = fragP->fr_symbol;
527
  know (symbolP);
528
 
529
  switch (fragP->fr_subtype)
530
    {
531
    case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_BYTE):
532
      know (*addressP == 0 || *addressP == 0x10);        /* '@' bit.  */
533
      addressP[0] |= 0xAF;       /* Byte displacement. */
534
      fix_new (fragP, fragP->fr_fix + 1, 1, fragP->fr_symbol,
535
               fragP->fr_offset, 1, NO_RELOC);
536
      extension = 2;
537
      break;
538
 
539
    case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_WORD):
540
      know (*addressP == 0 || *addressP == 0x10);        /* '@' bit.  */
541
      addressP[0] |= 0xCF;       /* Word displacement. */
542
      fix_new (fragP, fragP->fr_fix + 1, 2, fragP->fr_symbol,
543
               fragP->fr_offset, 1, NO_RELOC);
544
      extension = 3;
545
      break;
546
 
547
    case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_LONG):
548
      know (*addressP == 0 || *addressP == 0x10);        /* '@' bit.  */
549
      addressP[0] |= 0xEF;       /* Long word displacement. */
550
      fix_new (fragP, fragP->fr_fix + 1, 4, fragP->fr_symbol,
551
               fragP->fr_offset, 1, NO_RELOC);
552
      extension = 5;
553
      break;
554
 
555
    case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_BYTE):
556
      fix_new (fragP, fragP->fr_fix, 1, fragP->fr_symbol,
557
               fragP->fr_offset, 1, NO_RELOC);
558
      extension = 1;
559
      break;
560
 
561
    case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_WORD):
562
      opcodeP[0] ^= 1;           /* Reverse sense of test.  */
563
      addressP[0] = 3;
564
      addressP[1] = VAX_BRW;
565
      fix_new (fragP, fragP->fr_fix + 2, 2, fragP->fr_symbol,
566
               fragP->fr_offset, 1, NO_RELOC);
567
      extension = 4;
568
      break;
569
 
570
    case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_LONG):
571
      opcodeP[0] ^= 1;           /* Reverse sense of test.  */
572
      addressP[0] = 6;
573
      addressP[1] = VAX_JMP;
574
      addressP[2] = VAX_PC_RELATIVE_MODE;
575
      fix_new (fragP, fragP->fr_fix + 3, 4, fragP->fr_symbol,
576
               fragP->fr_offset, 1, NO_RELOC);
577
      extension = 7;
578
      break;
579
 
580
    case ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_BYTE):
581
      fix_new (fragP, fragP->fr_fix, 1, fragP->fr_symbol,
582
               fragP->fr_offset, 1, NO_RELOC);
583
      extension = 1;
584
      break;
585
 
586
    case ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_WORD):
587
      opcodeP[0] += VAX_WIDEN_WORD;      /* brb -> brw, bsbb -> bsbw */
588
      fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, fragP->fr_offset,
589
               1, NO_RELOC);
590
      extension = 2;
591
      break;
592
 
593
    case ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_LONG):
594
      opcodeP[0] += VAX_WIDEN_LONG;      /* brb -> jmp, bsbb -> jsb */
595
      addressP[0] = VAX_PC_RELATIVE_MODE;
596
      fix_new (fragP, fragP->fr_fix + 1, 4, fragP->fr_symbol,
597
               fragP->fr_offset, 1, NO_RELOC);
598
      extension = 5;
599
      break;
600
 
601
    case ENCODE_RELAX (STATE_COMPLEX_BRANCH, STATE_WORD):
602
      fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
603
               fragP->fr_offset, 1, NO_RELOC);
604
      extension = 2;
605
      break;
606
 
607
    case ENCODE_RELAX (STATE_COMPLEX_BRANCH, STATE_LONG):
608
      addressP[0] = 2;
609
      addressP[1] = 0;
610
      addressP[2] = VAX_BRB;
611
      addressP[3] = 6;
612
      addressP[4] = VAX_JMP;
613
      addressP[5] = VAX_PC_RELATIVE_MODE;
614
      fix_new (fragP, fragP->fr_fix + 6, 4, fragP->fr_symbol,
615
               fragP->fr_offset, 1, NO_RELOC);
616
      extension = 10;
617
      break;
618
 
619
    case ENCODE_RELAX (STATE_COMPLEX_HOP, STATE_BYTE):
620
      fix_new (fragP, fragP->fr_fix, 1, fragP->fr_symbol,
621
               fragP->fr_offset, 1, NO_RELOC);
622
      extension = 1;
623
      break;
624
 
625
    case ENCODE_RELAX (STATE_COMPLEX_HOP, STATE_WORD):
626
      addressP[0] = 2;
627
      addressP[1] = VAX_BRB;
628
      addressP[2] = 3;
629
      addressP[3] = VAX_BRW;
630
      fix_new (fragP, fragP->fr_fix + 4, 2, fragP->fr_symbol,
631
               fragP->fr_offset, 1, NO_RELOC);
632
      extension = 6;
633
      break;
634
 
635
    case ENCODE_RELAX (STATE_COMPLEX_HOP, STATE_LONG):
636
      addressP[0] = 2;
637
      addressP[1] = VAX_BRB;
638
      addressP[2] = 6;
639
      addressP[3] = VAX_JMP;
640
      addressP[4] = VAX_PC_RELATIVE_MODE;
641
      fix_new (fragP, fragP->fr_fix + 5, 4, fragP->fr_symbol,
642
               fragP->fr_offset, 1, NO_RELOC);
643
      extension = 9;
644
      break;
645
 
646
    default:
647
      BAD_CASE (fragP->fr_subtype);
648
      break;
649
    }
650
  fragP->fr_fix += extension;
651
}
652
 
653
/* Translate internal format of relocation info into target format.
654
 
655
   On vax: first 4 bytes are normal unsigned long, next three bytes
656
   are symbolnum, least sig. byte first.  Last byte is broken up with
657
   the upper nibble as nuthin, bit 3 as extern, bits 2 & 1 as length, and
658
   bit 0 as pcrel.  */
659
#ifdef comment
660
void
661
md_ri_to_chars (char *the_bytes, struct reloc_info_generic ri)
662
{
663
  /* This is easy.  */
664
  md_number_to_chars (the_bytes, ri.r_address, sizeof (ri.r_address));
665
  /* Now the fun stuff.  */
666
  the_bytes[6] = (ri.r_symbolnum >> 16) & 0x0ff;
667
  the_bytes[5] = (ri.r_symbolnum >> 8) & 0x0ff;
668
  the_bytes[4] = ri.r_symbolnum & 0x0ff;
669
  the_bytes[7] = (((ri.r_extern << 3) & 0x08) | ((ri.r_length << 1) & 0x06)
670
                  | ((ri.r_pcrel << 0) & 0x01)) & 0x0F;
671
}
672
 
673
#endif /* comment */
674
 
675
/*       BUGS, GRIPES,  APOLOGIA, etc.
676
 
677
   The opcode table 'votstrs' needs to be sorted on opcode frequency.
678
   That is, AFTER we hash it with hash_...(), we want most-used opcodes
679
   to come out of the hash table faster.
680
 
681
   I am sorry to inflict yet another VAX assembler on the world, but
682
   RMS says we must do everything from scratch, to prevent pin-heads
683
   restricting this software.
684
 
685
   This is a vaguely modular set of routines in C to parse VAX
686
   assembly code using DEC mnemonics. It is NOT un*x specific.
687
 
688
   The idea here is that the assembler has taken care of all:
689
     labels
690
     macros
691
     listing
692
     pseudo-ops
693
     line continuation
694
     comments
695
     condensing any whitespace down to exactly one space
696
   and all we have to do is parse 1 line into a vax instruction
697
   partially formed. We will accept a line, and deliver:
698
     an error message (hopefully empty)
699
     a skeleton VAX instruction (tree structure)
700
     textual pointers to all the operand expressions
701
     a warning message that notes a silly operand (hopefully empty)
702
 
703
                E D I T   H I S T O R Y
704
 
705
   17may86 Dean Elsner. Bug if line ends immediately after opcode.
706
   30apr86 Dean Elsner. New vip_op() uses arg block so change call.
707
    6jan86 Dean Elsner. Crock vip_begin() to call vip_op_defaults().
708
    2jan86 Dean Elsner. Invent synthetic opcodes.
709
        Widen vax_opcodeT to 32 bits. Use a bit for VIT_OPCODE_SYNTHETIC,
710
        which means this is not a real opcode, it is like a macro; it will
711
        be relax()ed into 1 or more instructions.
712
        Use another bit for VIT_OPCODE_SPECIAL if the op-code is not optimised
713
        like a regular branch instruction. Option added to vip_begin():
714
        exclude synthetic opcodes. Invent synthetic_votstrs[].
715
   31dec85 Dean Elsner. Invent vit_opcode_nbytes.
716
        Also make vit_opcode into a char[]. We now have n-byte vax opcodes,
717
        so caller's don't have to know the difference between a 1-byte & a
718
        2-byte op-code. Still need vax_opcodeT concept, so we know how
719
        big an object must be to hold an op.code.
720
   30dec85 Dean Elsner. Widen typedef vax_opcodeT in "vax-inst.h"
721
        because vax opcodes may be 16 bits. Our crufty C compiler was
722
        happily initialising 8-bit vot_codes with 16-bit numbers!
723
        (Wouldn't the 'phone company like to compress data so easily!)
724
   29dec85 Dean Elsner. New static table vax_operand_width_size[].
725
        Invented so we know hw many bytes a "I^#42" needs in its immediate
726
        operand. Revised struct vop in "vax-inst.h": explicitly include
727
        byte length of each operand, and it's letter-code datum type.
728
   17nov85 Dean Elsner. Name Change.
729
        Due to ar(1) truncating names, we learned the hard way that
730
        "vax-inst-parse.c" -> "vax-inst-parse." dropping the "o" off
731
        the archived object name. SO... we shortened the name of this
732
        source file, and changed the makefile.  */
733
 
734
/* Handle of the OPCODE hash table.  */
735
static struct hash_control *op_hash;
736
 
737
/* In:  1 character, from "bdfghloqpw" being the data-type of an operand
738
        of a vax instruction.
739
 
740
   Out: the length of an operand of that type, in bytes.
741
        Special branch operands types "-?!" have length 0.  */
742
 
743
static const short int vax_operand_width_size[256] =
744
{
745
  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
746
  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
747
  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
748
  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
749
  0, 0, 1, 0, 8, 0, 4, 8, 16, 0, 0, 0, 4, 0, 0,16,       /* ..b.d.fgh...l..o  */
750
  0, 8, 0, 0, 0, 0, 0, 2,  0, 0, 0, 0, 0, 0, 0, 0,    /* .q.....w........  */
751
  0, 0, 1, 0, 8, 0, 4, 8, 16, 0, 0, 0, 4, 0, 0,16,       /* ..b.d.fgh...l..o  */
752
  0, 8, 0, 0, 0, 0, 0, 2,  0, 0, 0, 0, 0, 0, 0, 0,    /* .q.....w........  */
753
  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
754
  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
755
  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
756
  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
757
  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
758
  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
759
  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
760
  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
761
};
762
 
763
/* This perversion encodes all the vax opcodes as a bunch of strings.
764
   RMS says we should build our hash-table at run-time. Hmm.
765
   Please would someone arrange these in decreasing frequency of opcode?
766
   Because of the way hash_...() works, the most frequently used opcode
767
   should be textually first and so on.
768
 
769
   Input for this table was 'vax.opcodes', awk(1)ed by 'vax.opcodes.c.awk' .
770
   So change 'vax.opcodes', then re-generate this table.  */
771
 
772
#include "opcode/vax.h"
773
 
774
/* This is a table of optional op-codes. All of them represent
775
   'synthetic' instructions that seem popular.
776
 
777
   Here we make some pseudo op-codes. Every code has a bit set to say
778
   it is synthetic. This lets you catch them if you want to
779
   ban these opcodes. They are mnemonics for "elastic" instructions
780
   that are supposed to assemble into the fewest bytes needed to do a
781
   branch, or to do a conditional branch, or whatever.
782
 
783
   The opcode is in the usual place [low-order n*8 bits]. This means
784
   that if you mask off the bucky bits, the usual rules apply about
785
   how long the opcode is.
786
 
787
   All VAX branch displacements come at the end of the instruction.
788
   For simple branches (1-byte opcode + 1-byte displacement) the last
789
   operand is coded 'b?' where the "data type" '?' is a clue that we
790
   may reverse the sense of the branch (complement lowest order bit)
791
   and branch around a jump. This is by far the most common case.
792
   That is why the VIT_OPCODE_SYNTHETIC bit is set: it says this is
793
   a 0-byte op-code followed by 2 or more bytes of operand address.
794
 
795
   If the op-code has VIT_OPCODE_SPECIAL set, then we have a more unusual
796
   case.
797
 
798
   For JBSB & JBR the treatment is the similar, except (1) we have a 'bw'
799
   option before (2) we can directly JSB/JMP because there is no condition.
800
   These operands have 'b-' as their access/data type.
801
 
802
   That leaves a bunch of random opcodes: JACBx, JxOBxxx. In these
803
   cases, we do the same idea. JACBxxx are all marked with a 'b!'
804
   JAOBxxx & JSOBxxx are marked with a 'b:'.  */
805
#if (VIT_OPCODE_SYNTHETIC != 0x80000000)
806
#error "You have just broken the encoding below, which assumes the sign bit means 'I am an imaginary instruction'."
807
#endif
808
 
809
#if (VIT_OPCODE_SPECIAL != 0x40000000)
810
#error "You have just broken the encoding below, which assumes the 0x40 M bit means 'I am not to be "optimised" the way normal branches are'."
811
#endif
812
 
813
static const struct vot
814
  synthetic_votstrs[] =
815
{
816
  {"jbsb",      {"b-", 0xC0000010}},            /* BSD 4.2 */
817
/* jsb used already */
818
  {"jbr",       {"b-", 0xC0000011}},            /* BSD 4.2 */
819
  {"jr",        {"b-", 0xC0000011}},            /* consistent */
820
  {"jneq",      {"b?", 0x80000012}},
821
  {"jnequ",     {"b?", 0x80000012}},
822
  {"jeql",      {"b?", 0x80000013}},
823
  {"jeqlu",     {"b?", 0x80000013}},
824
  {"jgtr",      {"b?", 0x80000014}},
825
  {"jleq",      {"b?", 0x80000015}},
826
/* un-used opcodes here */
827
  {"jgeq",      {"b?", 0x80000018}},
828
  {"jlss",      {"b?", 0x80000019}},
829
  {"jgtru",     {"b?", 0x8000001a}},
830
  {"jlequ",     {"b?", 0x8000001b}},
831
  {"jvc",       {"b?", 0x8000001c}},
832
  {"jvs",       {"b?", 0x8000001d}},
833
  {"jgequ",     {"b?", 0x8000001e}},
834
  {"jcc",       {"b?", 0x8000001e}},
835
  {"jlssu",     {"b?", 0x8000001f}},
836
  {"jcs",       {"b?", 0x8000001f}},
837
 
838
  {"jacbw",     {"rwrwmwb!", 0xC000003d}},
839
  {"jacbf",     {"rfrfmfb!", 0xC000004f}},
840
  {"jacbd",     {"rdrdmdb!", 0xC000006f}},
841
  {"jacbb",     {"rbrbmbb!", 0xC000009d}},
842
  {"jacbl",     {"rlrlmlb!", 0xC00000f1}},
843
  {"jacbg",     {"rgrgmgb!", 0xC0004ffd}},
844
  {"jacbh",     {"rhrhmhb!", 0xC0006ffd}},
845
 
846
  {"jbs",       {"rlvbb?", 0x800000e0}},
847
  {"jbc",       {"rlvbb?", 0x800000e1}},
848
  {"jbss",      {"rlvbb?", 0x800000e2}},
849
  {"jbcs",      {"rlvbb?", 0x800000e3}},
850
  {"jbsc",      {"rlvbb?", 0x800000e4}},
851
  {"jbcc",      {"rlvbb?", 0x800000e5}},
852
  {"jbssi",     {"rlvbb?", 0x800000e6}},
853
  {"jbcci",     {"rlvbb?", 0x800000e7}},
854
  {"jlbs",      {"rlb?", 0x800000e8}},
855
  {"jlbc",      {"rlb?", 0x800000e9}},
856
 
857
  {"jaoblss",   {"rlmlb:", 0xC00000f2}},
858
  {"jaobleq",   {"rlmlb:", 0xC00000f3}},
859
  {"jsobgeq",   {"mlb:", 0xC00000f4}},
860
  {"jsobgtr",   {"mlb:", 0xC00000f5}},
861
 
862
/* CASEx has no branch addresses in our conception of it.  */
863
/* You should use ".word ..." statements after the "case ...".  */
864
 
865
  {"",          {"", 0}} /* Empty is end sentinel.  */
866
};
867
 
868
/* Because this module is useful for both VMS and UN*X style assemblers
869
   and because of the variety of UN*X assemblers we must recognise
870
   the different conventions for assembler operand notation. For example
871
   VMS says "#42" for immediate mode, while most UN*X say "$42".
872
   We permit arbitrary sets of (single) characters to represent the
873
   3 concepts that DEC writes '#', '@', '^'.  */
874
 
875
/* Character tests.  */
876
#define VIP_IMMEDIATE 01        /* Character is like DEC # */
877
#define VIP_INDIRECT  02        /* Char is like DEC @ */
878
#define VIP_DISPLEN   04        /* Char is like DEC ^ */
879
 
880
#define IMMEDIATEP(c)   (vip_metacharacters [(c) & 0xff] & VIP_IMMEDIATE)
881
#define INDIRECTP(c)    (vip_metacharacters [(c) & 0xff] & VIP_INDIRECT)
882
#define DISPLENP(c)     (vip_metacharacters [(c) & 0xff] & VIP_DISPLEN)
883
 
884
/* We assume 8 bits per byte. Use vip_op_defaults() to set these up BEFORE we
885
   are ever called.  */
886
 
887
#if defined(CONST_TABLE)
888
#define _ 0,
889
#define I VIP_IMMEDIATE,
890
#define S VIP_INDIRECT,
891
#define D VIP_DISPLEN,
892
static const char
893
vip_metacharacters[256] =
894
{
895
  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _       /* ^@ ^A ^B ^C ^D ^E ^F ^G ^H ^I ^J ^K ^L ^M ^N ^O*/
896
  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _       /* ^P ^Q ^R ^S ^T ^U ^V ^W ^X ^Y ^Z ^[ ^\ ^] ^^ ^_ */
897
  _ _ _ _ I _ _ _ _ _ S _ _ _ _ _       /* sp !  "  #  $  %  & '  (  )  *  +  ,  -  .  / */
898
  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _       /*0  1  2  3  4  5  6  7  8  9  :  ;  <  =  >  ?*/
899
  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _       /*@  A  B  C  D  E  F  G  H  I  J  K  L  M  N  O*/
900
  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _       /*P  Q  R  S  T  U  V  W  X  Y  Z  [  \  ]  ^  _*/
901
  D _ _ _ _ _ _ _ _ _ _ _ _ _ _ _       /*`  a  b  c  d  e  f  g  h  i  j  k  l  m  n  o*/
902
  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _       /*p  q  r  s  t  u  v  w  x  y  z  {  |  }  ~  ^?*/
903
 
904
  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
905
  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
906
  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
907
  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
908
  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
909
  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
910
  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
911
  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
912
};
913
#undef _
914
#undef I
915
#undef S
916
#undef D
917
 
918
#else
919
 
920
static char vip_metacharacters[256];
921
 
922
static void
923
vip_op_1 (int bit, const char *syms)
924
{
925
  unsigned char t;
926
 
927
  while ((t = *syms++) != 0)
928
    vip_metacharacters[t] |= bit;
929
}
930
 
931
/* Can be called any time.  More arguments may appear in future.  */
932
static void
933
vip_op_defaults (const char *immediate, const char *indirect, const char *displen)
934
{
935
  vip_op_1 (VIP_IMMEDIATE, immediate);
936
  vip_op_1 (VIP_INDIRECT, indirect);
937
  vip_op_1 (VIP_DISPLEN, displen);
938
}
939
 
940
#endif
941
 
942
/* Call me once before you decode any lines.
943
   I decode votstrs into a hash table at op_hash (which I create).
944
   I return an error text or null.
945
   If you want, I will include the 'synthetic' jXXX instructions in the
946
   instruction table.
947
   You must nominate metacharacters for eg DEC's "#", "@", "^".  */
948
 
949
static const char *
950
vip_begin (int synthetic_too,           /* 1 means include jXXX op-codes.  */
951
           const char *immediate,
952
           const char *indirect,
953
           const char *displen)
954
{
955
  const struct vot *vP;         /* scan votstrs */
956
  const char *retval = 0;        /* error text */
957
 
958
  op_hash = hash_new ();
959
 
960
  for (vP = votstrs; *vP->vot_name && !retval; vP++)
961
    retval = hash_insert (op_hash, vP->vot_name, (void *) &vP->vot_detail);
962
 
963
  if (synthetic_too)
964
    for (vP = synthetic_votstrs; *vP->vot_name && !retval; vP++)
965
      retval = hash_insert (op_hash, vP->vot_name, (void *) &vP->vot_detail);
966
 
967
#ifndef CONST_TABLE
968
  vip_op_defaults (immediate, indirect, displen);
969
#endif
970
 
971
  return retval;
972
}
973
 
974
/* Take 3 char.s, the last of which may be `\0` (non-existent)
975
   and return the VAX register number that they represent.
976
 
977
   Return -1 if they don't form a register name. Good names return
978
   a number from 0:15 inclusive.
979
 
980
   Case is not important in a name.
981
 
982
   Register names understood are:
983
 
984
        R0
985
        R1
986
        R2
987
        R3
988
        R4
989
        R5
990
        R6
991
        R7
992
        R8
993
        R9
994
        R10
995
        R11
996
        R12     AP
997
        R13     FP
998
        R14     SP
999
        R15     PC  */
1000
 
1001
#define AP 12
1002
#define FP 13
1003
#define SP 14
1004
#define PC 15
1005
 
1006
/* Returns the register number of something like '%r15' or 'ap', supplied
1007
   in four single chars. Returns -1 if the register isn't recognized,
1008
   0..15 otherwise.  */
1009
static int
1010
vax_reg_parse (char c1, char c2, char c3, char c4)
1011
{
1012
  int retval = -1;
1013
 
1014
#ifdef OBJ_ELF
1015
  if (c1 != '%')        /* Register prefixes are mandatory for ELF.  */
1016
    return retval;
1017
  c1 = c2;
1018
  c2 = c3;
1019
  c3 = c4;
1020
#endif
1021
#ifdef OBJ_VMS
1022
  if (c4 != 0)           /* Register prefixes are not allowed under VMS.  */
1023
    return retval;
1024
#endif
1025
#ifdef OBJ_AOUT
1026
  if (c1 == '%')        /* Register prefixes are optional under a.out.  */
1027
    {
1028
      c1 = c2;
1029
      c2 = c3;
1030
      c3 = c4;
1031
    }
1032
  else if (c3 && c4)    /* Can't be 4 characters long.  */
1033
    return retval;
1034
#endif
1035
 
1036
  c1 = TOLOWER (c1);
1037
  c2 = TOLOWER (c2);
1038
  if (ISDIGIT (c2) && c1 == 'r')
1039
    {
1040
      retval = c2 - '0';
1041
      if (ISDIGIT (c3))
1042
        {
1043
          retval = retval * 10 + c3 - '0';
1044
          retval = (retval > 15) ? -1 : retval;
1045
          /* clamp the register value to 1 hex digit */
1046
        }
1047
      else if (c3)
1048
        retval = -1;            /* c3 must be '\0' or a digit.  */
1049
    }
1050
  else if (c3)                  /* There are no three letter regs.  */
1051
    retval = -1;
1052
  else if (c2 == 'p')
1053
    {
1054
      switch (c1)
1055
        {
1056
        case 's':
1057
          retval = SP;
1058
          break;
1059
        case 'f':
1060
          retval = FP;
1061
          break;
1062
        case 'a':
1063
          retval = AP;
1064
          break;
1065
        default:
1066
          retval = -1;
1067
        }
1068
    }
1069
  else if (c1 == 'p' && c2 == 'c')
1070
    retval = PC;
1071
  else
1072
    retval = -1;
1073
  return retval;
1074
}
1075
 
1076
/* Parse a vax operand in DEC assembler notation.
1077
   For speed, expect a string of whitespace to be reduced to a single ' '.
1078
   This is the case for GNU AS, and is easy for other DEC-compatible
1079
   assemblers.
1080
 
1081
   Knowledge about DEC VAX assembler operand notation lives here.
1082
   This doesn't even know what a register name is, except it believes
1083
   all register names are 2 or 3 characters, and lets vax_reg_parse() say
1084
   what number each name represents.
1085
   It does, however, know that PC, SP etc are special registers so it can
1086
   detect addressing modes that are silly for those registers.
1087
 
1088
   Where possible, it delivers 1 fatal or 1 warning message if the operand
1089
   is suspect. Exactly what we test for is still evolving.
1090
 
1091
   ---
1092
        Arg block.
1093
 
1094
   There were a number of 'mismatched argument type' bugs to vip_op.
1095
   The most general solution is to typedef each (of many) arguments.
1096
   We used instead a typedef'd argument block. This is less modular
1097
   than using separate return pointers for each result, but runs faster
1098
   on most engines, and seems to keep programmers happy. It will have
1099
   to be done properly if we ever want to use vip_op as a general-purpose
1100
   module (it was designed to be).
1101
 
1102
        G^
1103
 
1104
   Doesn't support DEC "G^" format operands. These always take 5 bytes
1105
   to express, and code as modes 8F or 9F. Reason: "G^" deprives you of
1106
   optimising to (say) a "B^" if you are lucky in the way you link.
1107
   When someone builds a linker smart enough to convert "G^" to "B^", "W^"
1108
   whenever possible, then we should implement it.
1109
   If there is some other use for "G^", feel free to code it in!
1110
 
1111
        speed
1112
 
1113
   If I nested if()s more, I could avoid testing (*err) which would save
1114
   time, space and page faults. I didn't nest all those if()s for clarity
1115
   and because I think the mode testing can be re-arranged 1st to test the
1116
   commoner constructs 1st. Does anybody have statistics on this?
1117
 
1118
        error messages
1119
 
1120
   In future, we should be able to 'compose' error messages in a scratch area
1121
   and give the user MUCH more informative error messages. Although this takes
1122
   a little more code at run-time, it will make this module much more self-
1123
   documenting. As an example of what sucks now: most error messages have
1124
   hardwired into them the DEC VAX metacharacters "#^@" which are nothing like
1125
   the Un*x characters "$`*", that most users will expect from this AS.
1126
 
1127
   ----
1128
 
1129
   The input is a string, ending with '\0'.
1130
 
1131
   We also require a 'hint' of what kind of operand is expected: so
1132
   we can remind caller not to write into literals for instance.
1133
 
1134
   The output is a skeletal instruction.
1135
 
1136
   The algorithm has two parts.
1137
   1. extract the syntactic features (parse off all the @^#-()+[] mode crud);
1138
   2. express the @^#-()+[] as some parameters suited to further analysis.
1139
 
1140
   2nd step is where we detect the googles of possible invalid combinations
1141
   a human (or compiler) might write. Note that if we do a half-way
1142
   decent assembler, we don't know how long to make (eg) displacement
1143
   fields when we first meet them (because they may not have defined values).
1144
   So we must wait until we know how many bits are needed for each address,
1145
   then we can know both length and opcodes of instructions.
1146
   For reason(s) above, we will pass to our caller a 'broken' instruction
1147
   of these major components, from which our caller can generate instructions:
1148
    -  displacement length      I^ S^ L^ B^ W^ unspecified
1149
    -  mode                     (many)
1150
    -  register                 R0-R15 or absent
1151
    -  index register           R0-R15 or absent
1152
    -  expression text          what we don't parse
1153
    -  error text(s)            why we couldn't understand the operand
1154
 
1155
   ----
1156
 
1157
   To decode output of this, test errtxt. If errtxt[0] == '\0', then
1158
   we had no errors that prevented parsing. Also, if we ever report
1159
   an internal bug, errtxt[0] is set non-zero. So one test tells you
1160
   if the other outputs are to be taken seriously.
1161
 
1162
   ----
1163
 
1164
   Dec defines the semantics of address modes (and values)
1165
   by a two-letter code, explained here.
1166
 
1167
     letter 1:   access type
1168
 
1169
       a         address calculation - no data access, registers forbidden
1170
       b         branch displacement
1171
       m         read - let go of bus - write back    "modify"
1172
       r         read
1173
       v         bit field address: like 'a' but registers are OK
1174
       w         write
1175
       space     no operator (eg ".long foo") [our convention]
1176
 
1177
     letter 2:   data type (i.e. width, alignment)
1178
 
1179
       b         byte
1180
       d         double precision floating point (D format)
1181
       f         single precision floating point (F format)
1182
       g         G format floating
1183
       h         H format floating
1184
       l         longword
1185
       o         octaword
1186
       q         quadword
1187
       w         word
1188
       ?         simple synthetic branch operand
1189
       -         unconditional synthetic JSB/JSR operand
1190
       !         complex synthetic branch operand
1191
 
1192
   The '-?!' letter 2's are not for external consumption. They are used
1193
   for various assemblers. Generally, all unknown widths are assumed 0.
1194
   We don't limit your choice of width character.
1195
 
1196
   DEC operands are hard work to parse. For example, '@' as the first
1197
   character means indirect (deferred) mode but elsewhere it is a shift
1198
   operator.
1199
   The long-winded explanation of how this is supposed to work is
1200
   cancelled. Read a DEC vax manual.
1201
   We try hard not to parse anything that MIGHT be part of the expression
1202
   buried in that syntax. For example if we see @...(Rn) we don't check
1203
   for '-' before the '(' because mode @-(Rn) does not exist.
1204
 
1205
   After parsing we have:
1206
 
1207
   at                     1 if leading '@' (or Un*x '*')
1208
   len                    takes one value from " bilsw". eg B^ -> 'b'.
1209
   hash                   1 if leading '#' (or Un*x '$')
1210
   expr_begin, expr_end   the expression we did not parse
1211
                          even though we don't interpret it, we make use
1212
                          of its presence or absence.
1213
   sign                   -1: -(Rn)    0: absent    +1: (Rn)+
1214
   paren                  1 if () are around register
1215
   reg                    major register number 0:15    -1 means absent
1216
   ndx                    index register number 0:15    -1 means absent
1217
 
1218
   Again, I dare not explain it: just trace ALL the code!
1219
 
1220
   Summary of vip_op outputs.
1221
 
1222
  mode  reg     len     ndx
1223
  (Rn) => @Rn
1224
  {@}Rn                 5+@     n       ' '     optional
1225
  branch operand                0        -1      ' '     -1
1226
  S^#foo                        0        -1      's'     -1
1227
  -(Rn)                 7       n       ' '     optional
1228
  {@}(Rn)+              8+@     n       ' '     optional
1229
  {@}#foo, no S^                8+@     PC      " i"    optional
1230
  {@}{q^}{(Rn)}         10+@+q  option  " bwl"  optional  */
1231
 
1232
/* Dissect user-input 'optext' (which is something like "@B^foo@bar(AP)[FP]:")
1233
   using the vop in vopP. vopP's vop_access and vop_width. We fill _ndx, _reg,
1234
   _mode, _short, _warn, _error, _expr_begin, _expr_end and _nbytes.  */
1235
 
1236
static void
1237
vip_op (char *optext, struct vop *vopP)
1238
{
1239
  /* Track operand text forward.  */
1240
  char *p;
1241
  /* Track operand text backward.  */
1242
  char *q;
1243
  /* 1 if leading '@' ('*') seen.  */
1244
  int at;
1245
  /* one of " bilsw" */
1246
  char len;
1247
  /* 1 if leading '#' ('$') seen.  */
1248
  int hash;
1249
  /* -1, 0 or +1.  */
1250
  int sign = 0;
1251
  /* 1 if () surround register.  */
1252
  int paren = 0;
1253
  /* Register number, -1:absent.  */
1254
  int reg = 0;
1255
  /* Index register number -1:absent.  */
1256
  int ndx = 0;
1257
  /* Report illegal operand, ""==OK.  */
1258
  /* " " is a FAKE error: means we won.  */
1259
  /* ANY err that begins with ' ' is a fake.  */
1260
  /* " " is converted to "" before return.  */
1261
  const char *err;
1262
  /* Warn about weird modes pf address.  */
1263
  const char *wrn;
1264
  /* Preserve q in case we backup.  */
1265
  char *oldq = NULL;
1266
  /* Build up 4-bit operand mode here.  */
1267
  /* Note: index mode is in ndx, this is.  */
1268
  /* The major mode of operand address.  */
1269
  int mode = 0;
1270
  /* Notice how we move wrong-arg-type bugs INSIDE this module: if we
1271
     get the types wrong below, we lose at compile time rather than at
1272
     lint or run time.  */
1273
  char access_mode;             /* vop_access.  */
1274
  char width;                   /* vop_width.  */
1275
 
1276
  access_mode = vopP->vop_access;
1277
  width = vopP->vop_width;
1278
  /* None of our code bugs (yet), no user text errors, no warnings
1279
     even.  */
1280
  err = wrn = 0;
1281
 
1282
  p = optext;
1283
 
1284
  if (*p == ' ')                /* Expect all whitespace reduced to ' '.  */
1285
    p++;                        /* skip over whitespace */
1286
 
1287
  if ((at = INDIRECTP (*p)) != 0)
1288
    {                           /* 1 if *p=='@'(or '*' for Un*x) */
1289
      p++;                      /* at is determined */
1290
      if (*p == ' ')            /* Expect all whitespace reduced to ' '.  */
1291
        p++;                    /* skip over whitespace */
1292
    }
1293
 
1294
  /* This code is subtle. It tries to detect all legal (letter)'^'
1295
     but it doesn't waste time explicitly testing for premature '\0' because
1296
     this case is rejected as a mismatch against either (letter) or '^'.  */
1297
  {
1298
    char c;
1299
 
1300
    c = *p;
1301
    c = TOLOWER (c);
1302
    if (DISPLENP (p[1]) && strchr ("bilws", len = c))
1303
      p += 2;                   /* Skip (letter) '^'.  */
1304
    else                        /* No (letter) '^' seen.  */
1305
      len = ' ';                /* Len is determined.  */
1306
  }
1307
 
1308
  if (*p == ' ')                /* Expect all whitespace reduced to ' '.  */
1309
    p++;
1310
 
1311
  if ((hash = IMMEDIATEP (*p)) != 0)     /* 1 if *p=='#' ('$' for Un*x) */
1312
    p++;                        /* Hash is determined.  */
1313
 
1314
  /* p points to what may be the beginning of an expression.
1315
     We have peeled off the front all that is peelable.
1316
     We know at, len, hash.
1317
 
1318
     Lets point q at the end of the text and parse that (backwards).  */
1319
 
1320
  for (q = p; *q; q++)
1321
    ;
1322
  q--;                          /* Now q points at last char of text.  */
1323
 
1324
  if (*q == ' ' && q >= p)      /* Expect all whitespace reduced to ' '.  */
1325
    q--;
1326
 
1327
  /* Reverse over whitespace, but don't.  */
1328
  /* Run back over *p.  */
1329
 
1330
  /* As a matter of policy here, we look for [Rn], although both Rn and S^#
1331
     forbid [Rn]. This is because it is easy, and because only a sick
1332
     cyborg would have [...] trailing an expression in a VAX-like assembler.
1333
     A meticulous parser would first check for Rn followed by '(' or '['
1334
     and not parse a trailing ']' if it found another. We just ban expressions
1335
     ending in ']'.  */
1336
  if (*q == ']')
1337
    {
1338
      while (q >= p && *q != '[')
1339
        q--;
1340
      /* Either q<p or we got matching '['.  */
1341
      if (q < p)
1342
        err = _("no '[' to match ']'");
1343
      else
1344
        {
1345
          /* Confusers like "[]" will eventually lose with a bad register
1346
           * name error. So again we don't need to check for early '\0'.  */
1347
          if (q[3] == ']')
1348
            ndx = vax_reg_parse (q[1], q[2], 0, 0);
1349
          else if (q[4] == ']')
1350
            ndx = vax_reg_parse (q[1], q[2], q[3], 0);
1351
          else if (q[5] == ']')
1352
            ndx = vax_reg_parse (q[1], q[2], q[3], q[4]);
1353
          else
1354
            ndx = -1;
1355
          /* Since we saw a ']' we will demand a register name in the [].
1356
           * If luser hasn't given us one: be rude.  */
1357
          if (ndx < 0)
1358
            err = _("bad register in []");
1359
          else if (ndx == PC)
1360
            err = _("[PC] index banned");
1361
          else
1362
            /* Point q just before "[...]".  */
1363
            q--;
1364
        }
1365
    }
1366
  else
1367
    /* No ']', so no iNDeX register.  */
1368
    ndx = -1;
1369
 
1370
  /* If err = "..." then we lost: run away.
1371
     Otherwise ndx == -1 if there was no "[...]".
1372
     Otherwise, ndx is index register number, and q points before "[...]".  */
1373
 
1374
  if (*q == ' ' && q >= p)      /* Expect all whitespace reduced to ' '.  */
1375
    q--;
1376
  /* Reverse over whitespace, but don't.  */
1377
  /* Run back over *p.  */
1378
  if (!err || !*err)
1379
    {
1380
      /* no ()+ or -() seen yet */
1381
      sign = 0;
1382
 
1383
      if (q > p + 3 && *q == '+' && q[-1] == ')')
1384
        {
1385
          sign = 1;             /* we saw a ")+" */
1386
          q--;                  /* q points to ')' */
1387
        }
1388
 
1389
      if (*q == ')' && q > p + 2)
1390
        {
1391
          paren = 1;            /* assume we have "(...)" */
1392
          while (q >= p && *q != '(')
1393
            q--;
1394
          /* either q<p or we got matching '(' */
1395
          if (q < p)
1396
            err = _("no '(' to match ')'");
1397
          else
1398
            {
1399
              /* Confusers like "()" will eventually lose with a bad register
1400
                 name error. So again we don't need to check for early '\0'.  */
1401
              if (q[3] == ')')
1402
                reg = vax_reg_parse (q[1], q[2], 0, 0);
1403
              else if (q[4] == ')')
1404
                reg = vax_reg_parse (q[1], q[2], q[3], 0);
1405
              else if (q[5] == ')')
1406
                reg = vax_reg_parse (q[1], q[2], q[3], q[4]);
1407
              else
1408
                reg = -1;
1409
              /* Since we saw a ')' we will demand a register name in the ')'.
1410
                 This is nasty: why can't our hypothetical assembler permit
1411
                 parenthesised expressions? BECAUSE I AM LAZY! That is why.
1412
                 Abuse luser if we didn't spy a register name.  */
1413
              if (reg < 0)
1414
                {
1415
                  /* JF allow parenthesized expressions.  I hope this works.  */
1416
                  paren = 0;
1417
                  while (*q != ')')
1418
                    q++;
1419
                  /* err = "unknown register in ()"; */
1420
                }
1421
              else
1422
                q--;            /* point just before '(' of "(...)" */
1423
              /* If err == "..." then we lost. Run away.
1424
                 Otherwise if reg >= 0 then we saw (Rn).  */
1425
            }
1426
          /* If err == "..." then we lost.
1427
             Otherwise paren==1 and reg = register in "()".  */
1428
        }
1429
      else
1430
        paren = 0;
1431
      /* If err == "..." then we lost.
1432
         Otherwise, q points just before "(Rn)", if any.
1433
         If there was a "(...)" then paren==1, and reg is the register.  */
1434
 
1435
      /* We should only seek '-' of "-(...)" if:
1436
           we saw "(...)"                    paren == 1
1437
           we have no errors so far          ! *err
1438
           we did not see '+' of "(...)+"    sign < 1
1439
         We don't check len. We want a specific error message later if
1440
         user tries "x^...-(Rn)". This is a feature not a bug.  */
1441
      if (!err || !*err)
1442
        {
1443
          if (paren && sign < 1)/* !sign is adequate test */
1444
            {
1445
              if (*q == '-')
1446
                {
1447
                  sign = -1;
1448
                  q--;
1449
                }
1450
            }
1451
          /* We have back-tracked over most
1452
             of the crud at the end of an operand.
1453
             Unless err, we know: sign, paren. If paren, we know reg.
1454
             The last case is of an expression "Rn".
1455
             This is worth hunting for if !err, !paren.
1456
             We wouldn't be here if err.
1457
             We remember to save q, in case we didn't want "Rn" anyway.  */
1458
          if (!paren)
1459
            {
1460
              if (*q == ' ' && q >= p)  /* Expect all whitespace reduced to ' '.  */
1461
                q--;
1462
              /* Reverse over whitespace, but don't.  */
1463
              /* Run back over *p.  */
1464
              /* Room for Rn or Rnn (include prefix) exactly?  */
1465
              if (q > p && q < p + 4)
1466
                reg = vax_reg_parse (p[0], p[1],
1467
                  q < p + 2 ? 0 : p[2],
1468
                  q < p + 3 ? 0 : p[3]);
1469
              else
1470
                reg = -1;       /* Always comes here if no register at all.  */
1471
              /* Here with a definitive reg value.  */
1472
              if (reg >= 0)
1473
                {
1474
                  oldq = q;
1475
                  q = p - 1;
1476
                }
1477
            }
1478
        }
1479
    }
1480
  /* have reg. -1:absent; else 0:15.  */
1481
 
1482
  /* We have:  err, at, len, hash, ndx, sign, paren, reg.
1483
     Also, any remaining expression is from *p through *q inclusive.
1484
     Should there be no expression, q==p-1. So expression length = q-p+1.
1485
     This completes the first part: parsing the operand text.  */
1486
 
1487
  /* We now want to boil the data down, checking consistency on the way.
1488
     We want:  len, mode, reg, ndx, err, p, q, wrn, bug.
1489
     We will deliver a 4-bit reg, and a 4-bit mode.  */
1490
 
1491
  /* Case of branch operand. Different. No L^B^W^I^S^ allowed for instance.
1492
 
1493
     in:  at    ?
1494
          len   ?
1495
          hash  ?
1496
          p:q   ?
1497
          sign  ?
1498
          paren ?
1499
          reg   ?
1500
          ndx   ?
1501
 
1502
     out: mode  0
1503
          reg   -1
1504
          len   ' '
1505
          p:q   whatever was input
1506
          ndx   -1
1507
          err   " "              or error message, and other outputs trashed.  */
1508
  /* Branch operands have restricted forms.  */
1509
  if ((!err || !*err) && access_mode == 'b')
1510
    {
1511
      if (at || hash || sign || paren || ndx >= 0 || reg >= 0 || len != ' ')
1512
        err = _("invalid branch operand");
1513
      else
1514
        err = " ";
1515
    }
1516
 
1517
  /* Since nobody seems to use it: comment this 'feature'(?) out for now.  */
1518
#ifdef NEVER
1519
  /* Case of stand-alone operand. e.g. ".long foo"
1520
 
1521
     in:  at    ?
1522
          len   ?
1523
          hash  ?
1524
          p:q   ?
1525
          sign  ?
1526
          paren ?
1527
          reg   ?
1528
          ndx   ?
1529
 
1530
     out: mode  0
1531
          reg   -1
1532
          len   ' '
1533
          p:q   whatever was input
1534
          ndx   -1
1535
          err   " "              or error message, and other outputs trashed.  */
1536
  if ((!err || !*err) && access_mode == ' ')
1537
    {
1538
      if (at)
1539
        err = _("address prohibits @");
1540
      else if (hash)
1541
        err = _("address prohibits #");
1542
      else if (sign)
1543
        {
1544
          if (sign < 0)
1545
            err = _("address prohibits -()");
1546
          else
1547
            err = _("address prohibits ()+");
1548
        }
1549
      else if (paren)
1550
        err = _("address prohibits ()");
1551
      else if (ndx >= 0)
1552
        err = _("address prohibits []");
1553
      else if (reg >= 0)
1554
        err = _("address prohibits register");
1555
      else if (len != ' ')
1556
        err = _("address prohibits displacement length specifier");
1557
      else
1558
        {
1559
          err = " ";    /* succeed */
1560
          mode = 0;
1561
        }
1562
    }
1563
#endif
1564
 
1565
  /* Case of S^#.
1566
 
1567
     in:  at       0
1568
          len      's'               definition
1569
          hash     1              demand
1570
          p:q                        demand not empty
1571
          sign     0                 by paren==0
1572
          paren    0             by "()" scan logic because "S^" seen
1573
          reg      -1                or nn by mistake
1574
          ndx      -1
1575
 
1576
     out: mode     0
1577
          reg      -1
1578
          len      's'
1579
          exp
1580
          ndx      -1  */
1581
  if ((!err || !*err) && len == 's')
1582
    {
1583
      if (!hash || paren || at || ndx >= 0)
1584
        err = _("invalid operand of S^#");
1585
      else
1586
        {
1587
          if (reg >= 0)
1588
            {
1589
              /* Darn! we saw S^#Rnn ! put the Rnn back in
1590
                 expression. KLUDGE! Use oldq so we don't
1591
                 need to know exact length of reg name.  */
1592
              q = oldq;
1593
              reg = 0;
1594
            }
1595
          /* We have all the expression we will ever get.  */
1596
          if (p > q)
1597
            err = _("S^# needs expression");
1598
          else if (access_mode == 'r')
1599
            {
1600
              err = " ";        /* WIN! */
1601
              mode = 0;
1602
            }
1603
          else
1604
            err = _("S^# may only read-access");
1605
        }
1606
    }
1607
 
1608
  /* Case of -(Rn), which is weird case.
1609
 
1610
     in:  at       0
1611
          len      '
1612
          hash     0
1613
          p:q      q<p
1614
          sign     -1                by definition
1615
          paren    1              by definition
1616
          reg      present           by definition
1617
          ndx      optional
1618
 
1619
     out: mode     7
1620
          reg      present
1621
          len      ' '
1622
          exp      ""                enforce empty expression
1623
          ndx      optional          warn if same as reg.  */
1624
  if ((!err || !*err) && sign < 0)
1625
    {
1626
      if (len != ' ' || hash || at || p <= q)
1627
        err = _("invalid operand of -()");
1628
      else
1629
        {
1630
          err = " ";            /* win */
1631
          mode = 7;
1632
          if (reg == PC)
1633
            wrn = _("-(PC) unpredictable");
1634
          else if (reg == ndx)
1635
            wrn = _("[]index same as -()register: unpredictable");
1636
        }
1637
    }
1638
 
1639
  /* We convert "(Rn)" to "@Rn" for our convenience.
1640
     (I hope this is convenient: has someone got a better way to parse this?)
1641
     A side-effect of this is that "@Rn" is a valid operand.  */
1642
  if (paren && !sign && !hash && !at && len == ' ' && p > q)
1643
    {
1644
      at = 1;
1645
      paren = 0;
1646
    }
1647
 
1648
  /* Case of (Rn)+, which is slightly different.
1649
 
1650
     in:  at
1651
          len      ' '
1652
          hash     0
1653
          p:q      q<p
1654
          sign     +1                by definition
1655
          paren    1              by definition
1656
          reg      present           by definition
1657
          ndx      optional
1658
 
1659
     out: mode     8+@
1660
          reg      present
1661
          len      ' '
1662
          exp      ""                enforce empty expression
1663
          ndx      optional          warn if same as reg.  */
1664
  if ((!err || !*err) && sign > 0)
1665
    {
1666
      if (len != ' ' || hash || p <= q)
1667
        err = _("invalid operand of ()+");
1668
      else
1669
        {
1670
          err = " ";            /* win */
1671
          mode = 8 + (at ? 1 : 0);
1672
          if (reg == PC)
1673
            wrn = _("(PC)+ unpredictable");
1674
          else if (reg == ndx)
1675
            wrn = _("[]index same as ()+register: unpredictable");
1676
        }
1677
    }
1678
 
1679
  /* Case of #, without S^.
1680
 
1681
     in:  at
1682
          len      ' ' or 'i'
1683
          hash     1              by definition
1684
          p:q
1685
          sign     0
1686
          paren    0
1687
          reg      absent
1688
          ndx      optional
1689
 
1690
     out: mode     8+@
1691
          reg      PC
1692
          len      ' ' or 'i'
1693
          exp
1694
          ndx      optional.  */
1695
  if ((!err || !*err) && hash)
1696
    {
1697
      if (len != 'i' && len != ' ')
1698
        err = _("# conflicts length");
1699
      else if (paren)
1700
        err = _("# bars register");
1701
      else
1702
        {
1703
          if (reg >= 0)
1704
            {
1705
              /* Darn! we saw #Rnn! Put the Rnn back into the expression.
1706
                 By using oldq, we don't need to know how long Rnn was.
1707
                 KLUDGE!  */
1708
              q = oldq;
1709
              reg = -1;         /* No register any more.  */
1710
            }
1711
          err = " ";            /* Win.  */
1712
 
1713
          /* JF a bugfix, I think!  */
1714
          if (at && access_mode == 'a')
1715
            vopP->vop_nbytes = 4;
1716
 
1717
          mode = (at ? 9 : 8);
1718
          reg = PC;
1719
          if ((access_mode == 'm' || access_mode == 'w') && !at)
1720
            wrn = _("writing or modifying # is unpredictable");
1721
        }
1722
    }
1723
  /* If !*err, then       sign == 0
1724
                          hash == 0 */
1725
 
1726
  /* Case of Rn. We separate this one because it has a few special
1727
     errors the remaining modes lack.
1728
 
1729
     in:  at       optional
1730
          len      ' '
1731
          hash     0             by program logic
1732
          p:q      empty
1733
          sign     0                 by program logic
1734
          paren    0             by definition
1735
          reg      present           by definition
1736
          ndx      optional
1737
 
1738
     out: mode     5+@
1739
          reg      present
1740
          len      ' '               enforce no length
1741
          exp      ""                enforce empty expression
1742
          ndx      optional          warn if same as reg.  */
1743
  if ((!err || !*err) && !paren && reg >= 0)
1744
    {
1745
      if (len != ' ')
1746
        err = _("length not needed");
1747
      else if (at)
1748
        {
1749
          err = " ";            /* win */
1750
          mode = 6;             /* @Rn */
1751
        }
1752
      else if (ndx >= 0)
1753
        err = _("can't []index a register, because it has no address");
1754
      else if (access_mode == 'a')
1755
        err = _("a register has no address");
1756
      else
1757
        {
1758
          /* Idea here is to detect from length of datum
1759
             and from register number if we will touch PC.
1760
             Warn if we do.
1761
             vop_nbytes is number of bytes in operand.
1762
             Compute highest byte affected, compare to PC0.  */
1763
          if ((vopP->vop_nbytes + reg * 4) > 60)
1764
            wrn = _("PC part of operand unpredictable");
1765
          err = " ";            /* win */
1766
          mode = 5;             /* Rn */
1767
        }
1768
    }
1769
  /* If !*err,        sign  == 0
1770
                      hash  == 0
1771
                      paren == 1  OR reg==-1  */
1772
 
1773
  /* Rest of cases fit into one bunch.
1774
 
1775
     in:  at       optional
1776
          len      ' ' or 'b' or 'w' or 'l'
1777
          hash     0             by program logic
1778
          p:q      expected          (empty is not an error)
1779
          sign     0                 by program logic
1780
          paren    optional
1781
          reg      optional
1782
          ndx      optional
1783
 
1784
     out: mode     10 + @ + len
1785
          reg      optional
1786
          len      ' ' or 'b' or 'w' or 'l'
1787
          exp                        maybe empty
1788
          ndx      optional          warn if same as reg.  */
1789
  if (!err || !*err)
1790
    {
1791
      err = " ";                /* win (always) */
1792
      mode = 10 + (at ? 1 : 0);
1793
      switch (len)
1794
        {
1795
        case 'l':
1796
          mode += 2;
1797
        case 'w':
1798
          mode += 2;
1799
        case ' ':       /* Assumed B^ until our caller changes it.  */
1800
        case 'b':
1801
          break;
1802
        }
1803
    }
1804
 
1805
  /* here with completely specified     mode
1806
                                        len
1807
                                        reg
1808
                                        expression   p,q
1809
                                        ndx.  */
1810
 
1811
  if (*err == ' ')
1812
    err = 0;                     /* " " is no longer an error.  */
1813
 
1814
  vopP->vop_mode = mode;
1815
  vopP->vop_reg = reg;
1816
  vopP->vop_short = len;
1817
  vopP->vop_expr_begin = p;
1818
  vopP->vop_expr_end = q;
1819
  vopP->vop_ndx = ndx;
1820
  vopP->vop_error = err;
1821
  vopP->vop_warn = wrn;
1822
}
1823
 
1824
/* This converts a string into a vax instruction.
1825
   The string must be a bare single instruction in dec-vax (with BSD4 frobs)
1826
   format.
1827
   It provides some error messages: at most one fatal error message (which
1828
   stops the scan) and at most one warning message for each operand.
1829
   The vax instruction is returned in exploded form, since we have no
1830
   knowledge of how you parse (or evaluate) your expressions.
1831
   We do however strip off and decode addressing modes and operation
1832
   mnemonic.
1833
 
1834
   The exploded instruction is returned to a struct vit of your choice.
1835
   #include "vax-inst.h" to know what a struct vit is.
1836
 
1837
   This function's value is a string. If it is not "" then an internal
1838
   logic error was found: read this code to assign meaning to the string.
1839
   No argument string should generate such an error string:
1840
   it means a bug in our code, not in the user's text.
1841
 
1842
   You MUST have called vip_begin() once before using this function.  */
1843
 
1844
static void
1845
vip (struct vit *vitP,          /* We build an exploded instruction here.  */
1846
     char *instring)            /* Text of a vax instruction: we modify.  */
1847
{
1848
  /* How to bit-encode this opcode.  */
1849
  struct vot_wot *vwP;
1850
  /* 1/skip whitespace.2/scan vot_how */
1851
  char *p;
1852
  char *q;
1853
  /* counts number of operands seen */
1854
  unsigned char count;
1855
  /* scan operands in struct vit */
1856
  struct vop *operandp;
1857
  /* error over all operands */
1858
  const char *alloperr;
1859
  /* Remember char, (we clobber it with '\0' temporarily).  */
1860
  char c;
1861
  /* Op-code of this instruction.  */
1862
  vax_opcodeT oc;
1863
 
1864
  if (*instring == ' ')
1865
    ++instring;
1866
 
1867
  /* MUST end in end-of-string or exactly 1 space.  */
1868
  for (p = instring; *p && *p != ' '; p++)
1869
    ;
1870
 
1871
  /* Scanned up to end of operation-code.  */
1872
  /* Operation-code is ended with whitespace.  */
1873
  if (p - instring == 0)
1874
    {
1875
      vitP->vit_error = _("No operator");
1876
      count = 0;
1877
      memset (vitP->vit_opcode, '\0', sizeof (vitP->vit_opcode));
1878
    }
1879
  else
1880
    {
1881
      c = *p;
1882
      *p = '\0';
1883
      /* Here with instring pointing to what better be an op-name, and p
1884
         pointing to character just past that.
1885
         We trust instring points to an op-name, with no whitespace.  */
1886
      vwP = (struct vot_wot *) hash_find (op_hash, instring);
1887
      /* Restore char after op-code.  */
1888
      *p = c;
1889
      if (vwP == 0)
1890
        {
1891
          vitP->vit_error = _("Unknown operator");
1892
          count = 0;
1893
          memset (vitP->vit_opcode, '\0', sizeof (vitP->vit_opcode));
1894
        }
1895
      else
1896
        {
1897
          /* We found a match! So let's pick up as many operands as the
1898
             instruction wants, and even gripe if there are too many.
1899
             We expect comma to separate each operand.
1900
             We let instring track the text, while p tracks a part of the
1901
             struct vot.  */
1902
          const char *howp;
1903
          /* The lines below know about 2-byte opcodes starting FD,FE or FF.
1904
             They also understand synthetic opcodes. Note:
1905
             we return 32 bits of opcode, including bucky bits, BUT
1906
             an opcode length is either 8 or 16 bits for vit_opcode_nbytes.  */
1907
          oc = vwP->vot_code;   /* The op-code.  */
1908
          vitP->vit_opcode_nbytes = (oc & 0xFF) >= 0xFD ? 2 : 1;
1909
          md_number_to_chars (vitP->vit_opcode, oc, 4);
1910
          count = 0;             /* No operands seen yet.  */
1911
          instring = p;         /* Point just past operation code.  */
1912
          alloperr = "";
1913
          for (howp = vwP->vot_how, operandp = vitP->vit_operand;
1914
               !(alloperr && *alloperr) && *howp;
1915
               operandp++, howp += 2)
1916
            {
1917
              /* Here to parse one operand. Leave instring pointing just
1918
                 past any one ',' that marks the end of this operand.  */
1919
              if (!howp[1])
1920
                as_fatal (_("odd number of bytes in operand description"));
1921
              else if (*instring)
1922
                {
1923
                  for (q = instring; (c = *q) && c != ','; q++)
1924
                    ;
1925
                  /* Q points to ',' or '\0' that ends argument. C is that
1926
                     character.  */
1927
                  *q = 0;
1928
                  operandp->vop_width = howp[1];
1929
                  operandp->vop_nbytes = vax_operand_width_size[(unsigned) howp[1]];
1930
                  operandp->vop_access = howp[0];
1931
                  vip_op (instring, operandp);
1932
                  *q = c;       /* Restore input text.  */
1933
                  if (operandp->vop_error)
1934
                    alloperr = _("Bad operand");
1935
                  instring = q + (c ? 1 : 0);    /* Next operand (if any).  */
1936
                  count++;      /*  Won another argument, may have an operr.  */
1937
                }
1938
              else
1939
                alloperr = _("Not enough operands");
1940
            }
1941
          if (!*alloperr)
1942
            {
1943
              if (*instring == ' ')
1944
                instring++;
1945
              if (*instring)
1946
                alloperr = _("Too many operands");
1947
            }
1948
          vitP->vit_error = alloperr;
1949
        }
1950
    }
1951
  vitP->vit_operands = count;
1952
}
1953
 
1954
#ifdef test
1955
 
1956
/* Test program for above.  */
1957
 
1958
struct vit myvit;               /* Build an exploded vax instruction here.  */
1959
char answer[100];               /* Human types a line of vax assembler here.  */
1960
char *mybug;                    /* "" or an internal logic diagnostic.  */
1961
int mycount;                    /* Number of operands.  */
1962
struct vop *myvop;              /* Scan operands from myvit.  */
1963
int mysynth;                    /* 1 means want synthetic opcodes.  */
1964
char my_immediate[200];
1965
char my_indirect[200];
1966
char my_displen[200];
1967
 
1968
int
1969
main (void)
1970
{
1971
  char *p;
1972
 
1973
  printf ("0 means no synthetic instructions.   ");
1974
  printf ("Value for vip_begin?  ");
1975
  gets (answer);
1976
  sscanf (answer, "%d", &mysynth);
1977
  printf ("Synthetic opcodes %s be included.\n", mysynth ? "will" : "will not");
1978
  printf ("enter immediate symbols eg enter #   ");
1979
  gets (my_immediate);
1980
  printf ("enter indirect symbols  eg enter @   ");
1981
  gets (my_indirect);
1982
  printf ("enter displen symbols   eg enter ^   ");
1983
  gets (my_displen);
1984
 
1985
  if (p = vip_begin (mysynth, my_immediate, my_indirect, my_displen))
1986
    error ("vip_begin=%s", p);
1987
 
1988
  printf ("An empty input line will quit you from the vax instruction parser\n");
1989
  for (;;)
1990
    {
1991
      printf ("vax instruction: ");
1992
      fflush (stdout);
1993
      gets (answer);
1994
      if (!*answer)
1995
        break;          /* Out of for each input text loop.  */
1996
 
1997
      vip (& myvit, answer);
1998
      if (*myvit.vit_error)
1999
        printf ("ERR:\"%s\"\n", myvit.vit_error);
2000
 
2001
      printf ("opcode=");
2002
      for (mycount = myvit.vit_opcode_nbytes, p = myvit.vit_opcode;
2003
           mycount;
2004
           mycount--, p++)
2005
        printf ("%02x ", *p & 0xFF);
2006
 
2007
      printf ("   operand count=%d.\n", mycount = myvit.vit_operands);
2008
      for (myvop = myvit.vit_operand; mycount; mycount--, myvop++)
2009
        {
2010
          printf ("mode=%xx reg=%xx ndx=%xx len='%c'=%c%c%d. expr=\"",
2011
                  myvop->vop_mode, myvop->vop_reg, myvop->vop_ndx,
2012
                  myvop->vop_short, myvop->vop_access, myvop->vop_width,
2013
                  myvop->vop_nbytes);
2014
          for (p = myvop->vop_expr_begin; p <= myvop->vop_expr_end; p++)
2015
            putchar (*p);
2016
 
2017
          printf ("\"\n");
2018
          if (myvop->vop_error)
2019
            printf ("  err:\"%s\"\n", myvop->vop_error);
2020
 
2021
          if (myvop->vop_warn)
2022
            printf ("  wrn:\"%s\"\n", myvop->vop_warn);
2023
        }
2024
    }
2025
  vip_end ();
2026
  exit (EXIT_SUCCESS);
2027
}
2028
 
2029
#endif
2030
 
2031
#ifdef TEST                     /* #Define to use this testbed.  */
2032
 
2033
/* Follows a test program for this function.
2034
   We declare arrays non-local in case some of our tiny-minded machines
2035
   default to small stacks. Also, helps with some debuggers.  */
2036
 
2037
char answer[100];               /* Human types into here.  */
2038
char *p;                        /*  */
2039
char *myerr;
2040
char *mywrn;
2041
char *mybug;
2042
char myaccess;
2043
char mywidth;
2044
char mymode;
2045
char myreg;
2046
char mylen;
2047
char *myleft;
2048
char *myright;
2049
char myndx;
2050
int my_operand_length;
2051
char my_immediate[200];
2052
char my_indirect[200];
2053
char my_displen[200];
2054
 
2055
int
2056
main (void)
2057
{
2058
  printf ("enter immediate symbols eg enter #   ");
2059
  gets (my_immediate);
2060
  printf ("enter indirect symbols  eg enter @   ");
2061
  gets (my_indirect);
2062
  printf ("enter displen symbols   eg enter ^   ");
2063
  gets (my_displen);
2064
  vip_op_defaults (my_immediate, my_indirect, my_displen);
2065
 
2066
  for (;;)
2067
    {
2068
      printf ("access,width (eg 'ab' or 'wh') [empty line to quit] :  ");
2069
      fflush (stdout);
2070
      gets (answer);
2071
      if (!answer[0])
2072
        exit (EXIT_SUCCESS);
2073
      myaccess = answer[0];
2074
      mywidth = answer[1];
2075
      switch (mywidth)
2076
        {
2077
        case 'b':
2078
          my_operand_length = 1;
2079
          break;
2080
        case 'd':
2081
          my_operand_length = 8;
2082
          break;
2083
        case 'f':
2084
          my_operand_length = 4;
2085
          break;
2086
        case 'g':
2087
          my_operand_length = 16;
2088
          break;
2089
        case 'h':
2090
          my_operand_length = 32;
2091
          break;
2092
        case 'l':
2093
          my_operand_length = 4;
2094
          break;
2095
        case 'o':
2096
          my_operand_length = 16;
2097
          break;
2098
        case 'q':
2099
          my_operand_length = 8;
2100
          break;
2101
        case 'w':
2102
          my_operand_length = 2;
2103
          break;
2104
        case '!':
2105
        case '?':
2106
        case '-':
2107
          my_operand_length = 0;
2108
          break;
2109
 
2110
        default:
2111
          my_operand_length = 2;
2112
          printf ("I dn't understand access width %c\n", mywidth);
2113
          break;
2114
        }
2115
      printf ("VAX assembler instruction operand: ");
2116
      fflush (stdout);
2117
      gets (answer);
2118
      mybug = vip_op (answer, myaccess, mywidth, my_operand_length,
2119
                      &mymode, &myreg, &mylen, &myleft, &myright, &myndx,
2120
                      &myerr, &mywrn);
2121
      if (*myerr)
2122
        {
2123
          printf ("error: \"%s\"\n", myerr);
2124
          if (*mybug)
2125
            printf (" bug: \"%s\"\n", mybug);
2126
        }
2127
      else
2128
        {
2129
          if (*mywrn)
2130
            printf ("warning: \"%s\"\n", mywrn);
2131
          mumble ("mode", mymode);
2132
          mumble ("register", myreg);
2133
          mumble ("index", myndx);
2134
          printf ("width:'%c'  ", mylen);
2135
          printf ("expression: \"");
2136
          while (myleft <= myright)
2137
            putchar (*myleft++);
2138
          printf ("\"\n");
2139
        }
2140
    }
2141
}
2142
 
2143
void
2144
mumble (char *text, int value)
2145
{
2146
  printf ("%s:", text);
2147
  if (value >= 0)
2148
    printf ("%xx", value);
2149
  else
2150
    printf ("ABSENT");
2151
  printf ("  ");
2152
}
2153
 
2154
#endif
2155
 
2156
int md_short_jump_size = 3;
2157
int md_long_jump_size = 6;
2158
 
2159
void
2160
md_create_short_jump (char *ptr,
2161
                      addressT from_addr,
2162
                      addressT to_addr ATTRIBUTE_UNUSED,
2163
                      fragS *frag ATTRIBUTE_UNUSED,
2164
                      symbolS *to_symbol ATTRIBUTE_UNUSED)
2165
{
2166
  valueT offset;
2167
 
2168
  /* This former calculation was off by two:
2169
      offset = to_addr - (from_addr + 1);
2170
     We need to account for the one byte instruction and also its
2171
     two byte operand.  */
2172
  offset = to_addr - (from_addr + 1 + 2);
2173
  *ptr++ = VAX_BRW;             /* Branch with word (16 bit) offset.  */
2174
  md_number_to_chars (ptr, offset, 2);
2175
}
2176
 
2177
void
2178
md_create_long_jump (char *ptr,
2179
                     addressT from_addr ATTRIBUTE_UNUSED,
2180
                     addressT to_addr,
2181
                     fragS *frag,
2182
                     symbolS *to_symbol)
2183
{
2184
  valueT offset;
2185
 
2186
  offset = to_addr - S_GET_VALUE (to_symbol);
2187
  *ptr++ = VAX_JMP;             /* Arbitrary jump.  */
2188
  *ptr++ = VAX_ABSOLUTE_MODE;
2189
  md_number_to_chars (ptr, offset, 4);
2190
  fix_new (frag, ptr - frag->fr_literal, 4, to_symbol, (long) 0, 0, NO_RELOC);
2191
}
2192
 
2193
#ifdef OBJ_VMS
2194
const char *md_shortopts = "d:STt:V+1h:Hv::";
2195
#elif defined(OBJ_ELF)
2196
const char *md_shortopts = "d:STt:VkKQ:";
2197
#else
2198
const char *md_shortopts = "d:STt:V";
2199
#endif
2200
struct option md_longopts[] =
2201
{
2202
#ifdef OBJ_ELF
2203
#define OPTION_PIC (OPTION_MD_BASE)
2204
  { "pic", no_argument, NULL, OPTION_PIC },
2205
#endif
2206
  { NULL, no_argument, NULL, 0 }
2207
};
2208
size_t md_longopts_size = sizeof (md_longopts);
2209
 
2210
int
2211
md_parse_option (int c, char *arg)
2212
{
2213
  switch (c)
2214
    {
2215
    case 'S':
2216
      as_warn (_("SYMBOL TABLE not implemented"));
2217
      break;
2218
 
2219
    case 'T':
2220
      as_warn (_("TOKEN TRACE not implemented"));
2221
      break;
2222
 
2223
    case 'd':
2224
      as_warn (_("Displacement length %s ignored!"), arg);
2225
      break;
2226
 
2227
    case 't':
2228
      as_warn (_("I don't need or use temp. file \"%s\"."), arg);
2229
      break;
2230
 
2231
    case 'V':
2232
      as_warn (_("I don't use an interpass file! -V ignored"));
2233
      break;
2234
 
2235
#ifdef OBJ_VMS
2236
    case '+':                   /* For g++.  Hash any name > 31 chars long.  */
2237
      flag_hash_long_names = 1;
2238
      break;
2239
 
2240
    case '1':                   /* For backward compatibility.  */
2241
      flag_one = 1;
2242
      break;
2243
 
2244
    case 'H':                   /* Show new symbol after hash truncation.  */
2245
      flag_show_after_trunc = 1;
2246
      break;
2247
 
2248
    case 'h':                   /* No hashing of mixed-case names.  */
2249
      {
2250
        extern char vms_name_mapping;
2251
        vms_name_mapping = atoi (arg);
2252
        flag_no_hash_mixed_case = 1;
2253
      }
2254
      break;
2255
 
2256
    case 'v':
2257
      {
2258
        extern char *compiler_version_string;
2259
 
2260
        if (!arg || !*arg || access (arg, 0) == 0)
2261
          return 0;              /* Have caller show the assembler version.  */
2262
        compiler_version_string = arg;
2263
      }
2264
      break;
2265
#endif
2266
 
2267
#ifdef OBJ_ELF
2268
    case OPTION_PIC:
2269
    case 'k':
2270
      flag_want_pic = 1;
2271
      break;                    /* -pic, Position Independent Code.  */
2272
 
2273
     /* -Qy, -Qn: SVR4 arguments controlling whether a .comment
2274
        section should be emitted or not.  FIXME: Not implemented.  */
2275
    case 'Q':
2276
      break;
2277
#endif
2278
 
2279
    default:
2280
      return 0;
2281
    }
2282
 
2283
  return 1;
2284
}
2285
 
2286
void
2287
md_show_usage (FILE *stream)
2288
{
2289
  fprintf (stream, _("\
2290
VAX options:\n\
2291
-d LENGTH               ignored\n\
2292
-J                      ignored\n\
2293
-S                      ignored\n\
2294
-t FILE                 ignored\n\
2295
-T                      ignored\n\
2296
-V                      ignored\n"));
2297
#ifdef OBJ_VMS
2298
  fprintf (stream, _("\
2299
VMS options:\n\
2300
-+                      hash encode names longer than 31 characters\n\
2301
-1                      `const' handling compatible with gcc 1.x\n\
2302
-H                      show new symbol after hash truncation\n\
2303
-h NUM                  don't hash mixed-case names, and adjust case:\n\
2304
 
2305
-v\"VERSION\"           code being assembled was produced by compiler \"VERSION\"\n"));
2306
#endif
2307
}
2308
 
2309
/* We have no need to default values of symbols.  */
2310
 
2311
symbolS *
2312
md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
2313
{
2314
  return NULL;
2315
}
2316
 
2317
/* Round up a section size to the appropriate boundary.  */
2318
valueT
2319
md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
2320
{
2321
  /* Byte alignment is fine */
2322
  return size;
2323
}
2324
 
2325
/* Exactly what point is a PC-relative offset relative TO?
2326
   On the vax, they're relative to the address of the offset, plus
2327
   its size. */
2328
long
2329
md_pcrel_from (fixS *fixP)
2330
{
2331
  return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
2332
}
2333
 
2334
arelent *
2335
tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
2336
{
2337
  arelent *reloc;
2338
  bfd_reloc_code_real_type code;
2339
 
2340
  if (fixp->fx_tcbit)
2341
    abort ();
2342
 
2343
  if (fixp->fx_r_type != BFD_RELOC_NONE)
2344
    {
2345
      code = fixp->fx_r_type;
2346
 
2347
      if (fixp->fx_pcrel)
2348
        {
2349
          switch (code)
2350
            {
2351
            case BFD_RELOC_8_PCREL:
2352
            case BFD_RELOC_16_PCREL:
2353
            case BFD_RELOC_32_PCREL:
2354
#ifdef OBJ_ELF
2355
            case BFD_RELOC_8_GOT_PCREL:
2356
            case BFD_RELOC_16_GOT_PCREL:
2357
            case BFD_RELOC_32_GOT_PCREL:
2358
            case BFD_RELOC_8_PLT_PCREL:
2359
            case BFD_RELOC_16_PLT_PCREL:
2360
            case BFD_RELOC_32_PLT_PCREL:
2361
#endif
2362
              break;
2363
            default:
2364
              as_bad_where (fixp->fx_file, fixp->fx_line,
2365
                            _("Cannot make %s relocation PC relative"),
2366
                            bfd_get_reloc_code_name (code));
2367
            }
2368
        }
2369
    }
2370
  else
2371
    {
2372
#define F(SZ,PCREL)             (((SZ) << 1) + (PCREL))
2373
      switch (F (fixp->fx_size, fixp->fx_pcrel))
2374
        {
2375
#define MAP(SZ,PCREL,TYPE)      case F(SZ,PCREL): code = (TYPE); break
2376
          MAP (1, 0, BFD_RELOC_8);
2377
          MAP (2, 0, BFD_RELOC_16);
2378
          MAP (4, 0, BFD_RELOC_32);
2379
          MAP (1, 1, BFD_RELOC_8_PCREL);
2380
          MAP (2, 1, BFD_RELOC_16_PCREL);
2381
          MAP (4, 1, BFD_RELOC_32_PCREL);
2382
        default:
2383
          abort ();
2384
        }
2385
    }
2386
#undef F
2387
#undef MAP
2388
 
2389
  reloc = xmalloc (sizeof (arelent));
2390
  reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
2391
  *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2392
  reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
2393
#ifndef OBJ_ELF
2394
  if (fixp->fx_pcrel)
2395
    reloc->addend = fixp->fx_addnumber;
2396
  else
2397
    reloc->addend = 0;
2398
#else
2399
  reloc->addend = fixp->fx_offset;
2400
#endif
2401
 
2402
  reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
2403
  gas_assert (reloc->howto != 0);
2404
 
2405
  return reloc;
2406
}
2407
 
2408
/* vax:md_assemble() emit frags for 1 instruction given in textual form.  */
2409
void
2410
md_assemble (char *instruction_string)
2411
{
2412
  /* Non-zero if operand expression's segment is not known yet.  */
2413
  int is_undefined;
2414
  /* Non-zero if operand expression's segment is absolute.  */
2415
  int is_absolute;
2416
  int length_code;
2417
  char *p;
2418
  /* An operand. Scans all operands.  */
2419
  struct vop *operandP;
2420
  char *save_input_line_pointer;
2421
                        /* What used to live after an expression.  */
2422
  char c_save;
2423
  /* 1: instruction_string bad for all passes.  */
2424
  int goofed;
2425
  /* Points to slot just after last operand.  */
2426
  struct vop *end_operandP;
2427
  /* Points to expression values for this operand.  */
2428
  expressionS *expP;
2429
  segT *segP;
2430
 
2431
  /* These refer to an instruction operand expression.  */
2432
  /* Target segment of the address.      */
2433
  segT to_seg;
2434
  valueT this_add_number;
2435
  /* Positive (minuend) symbol.  */
2436
  symbolS *this_add_symbol;
2437
  /* As a number.  */
2438
  long opcode_as_number;
2439
  /* Least significant byte 1st.  */
2440
  char *opcode_as_chars;
2441
  /* As an array of characters.  */
2442
  /* Least significant byte 1st */
2443
  char *opcode_low_byteP;
2444
  /* length (bytes) meant by vop_short.  */
2445
  int length;
2446
  /* 0, or 1 if '@' is in addressing mode.  */
2447
  int at;
2448
  /* From vop_nbytes: vax_operand_width (in bytes) */
2449
  int nbytes;
2450
  FLONUM_TYPE *floatP;
2451
  LITTLENUM_TYPE literal_float[8];
2452
  /* Big enough for any floating point literal.  */
2453
 
2454
  vip (&v, instruction_string);
2455
 
2456
  /* Now we try to find as many as_warn()s as we can. If we do any as_warn()s
2457
     then goofed=1. Notice that we don't make any frags yet.
2458
     Should goofed be 1, then this instruction will wedge in any pass,
2459
     and we can safely flush it, without causing interpass symbol phase
2460
     errors. That is, without changing label values in different passes.  */
2461
  if ((goofed = (*v.vit_error)) != 0)
2462
    {
2463
      as_fatal (_("Ignoring statement due to \"%s\""), v.vit_error);
2464
    }
2465
  /* We need to use expression() and friends, which require us to diddle
2466
     input_line_pointer. So we save it and restore it later.  */
2467
  save_input_line_pointer = input_line_pointer;
2468
  for (operandP = v.vit_operand,
2469
       expP = exp_of_operand,
2470
       segP = seg_of_operand,
2471
       floatP = float_operand,
2472
       end_operandP = v.vit_operand + v.vit_operands;
2473
 
2474
       operandP < end_operandP;
2475
 
2476
       operandP++, expP++, segP++, floatP++)
2477
    {
2478
      if (operandP->vop_error)
2479
        {
2480
          as_fatal (_("Aborting because statement has \"%s\""), operandP->vop_error);
2481
          goofed = 1;
2482
        }
2483
      else
2484
        {
2485
          /* Statement has no syntax goofs: let's sniff the expression.  */
2486
          int can_be_short = 0;  /* 1 if a bignum can be reduced to a short literal.  */
2487
 
2488
          input_line_pointer = operandP->vop_expr_begin;
2489
          c_save = operandP->vop_expr_end[1];
2490
          operandP->vop_expr_end[1] = '\0';
2491
          /* If to_seg == SEG_PASS1, expression() will have set need_pass_2 = 1.  */
2492
          *segP = expression (expP);
2493
          switch (expP->X_op)
2494
            {
2495
            case O_absent:
2496
              /* for BSD4.2 compatibility, missing expression is absolute 0 */
2497
              expP->X_op = O_constant;
2498
              expP->X_add_number = 0;
2499
              /* For SEG_ABSOLUTE, we shouldn't need to set X_op_symbol,
2500
                 X_add_symbol to any particular value.  But, we will program
2501
                 defensively. Since this situation occurs rarely so it costs
2502
                 us little to do, and stops Dean worrying about the origin of
2503
                 random bits in expressionS's.  */
2504
              expP->X_add_symbol = NULL;
2505
              expP->X_op_symbol = NULL;
2506
              break;
2507
 
2508
            case O_symbol:
2509
            case O_constant:
2510
              break;
2511
 
2512
            default:
2513
              /* Major bug. We can't handle the case of a
2514
                 SEG_OP expression in a VIT_OPCODE_SYNTHETIC
2515
                 variable-length instruction.
2516
                 We don't have a frag type that is smart enough to
2517
                 relax a SEG_OP, and so we just force all
2518
                 SEG_OPs to behave like SEG_PASS1s.
2519
                 Clearly, if there is a demand we can invent a new or
2520
                 modified frag type and then coding up a frag for this
2521
                 case will be easy. SEG_OP was invented for the
2522
                 .words after a CASE opcode, and was never intended for
2523
                 instruction operands.  */
2524
              need_pass_2 = 1;
2525
              as_fatal (_("Can't relocate expression"));
2526
              break;
2527
 
2528
            case O_big:
2529
              /* Preserve the bits.  */
2530
              if (expP->X_add_number > 0)
2531
                {
2532
                  bignum_copy (generic_bignum, expP->X_add_number,
2533
                               floatP->low, SIZE_OF_LARGE_NUMBER);
2534
                }
2535
              else
2536
                {
2537
                  know (expP->X_add_number < 0);
2538
                  flonum_copy (&generic_floating_point_number,
2539
                               floatP);
2540
                  if (strchr ("s i", operandP->vop_short))
2541
                    {
2542
                      /* Could possibly become S^# */
2543
                      flonum_gen2vax (-expP->X_add_number, floatP, literal_float);
2544
                      switch (-expP->X_add_number)
2545
                        {
2546
                        case 'f':
2547
                          can_be_short =
2548
                            (literal_float[0] & 0xFC0F) == 0x4000
2549
                            && literal_float[1] == 0;
2550
                          break;
2551
 
2552
                        case 'd':
2553
                          can_be_short =
2554
                            (literal_float[0] & 0xFC0F) == 0x4000
2555
                            && literal_float[1] == 0
2556
                            && literal_float[2] == 0
2557
                            && literal_float[3] == 0;
2558
                          break;
2559
 
2560
                        case 'g':
2561
                          can_be_short =
2562
                            (literal_float[0] & 0xFF81) == 0x4000
2563
                            && literal_float[1] == 0
2564
                            && literal_float[2] == 0
2565
                            && literal_float[3] == 0;
2566
                          break;
2567
 
2568
                        case 'h':
2569
                          can_be_short = ((literal_float[0] & 0xFFF8) == 0x4000
2570
                                          && (literal_float[1] & 0xE000) == 0
2571
                                          && literal_float[2] == 0
2572
                                          && literal_float[3] == 0
2573
                                          && literal_float[4] == 0
2574
                                          && literal_float[5] == 0
2575
                                          && literal_float[6] == 0
2576
                                          && literal_float[7] == 0);
2577
                          break;
2578
 
2579
                        default:
2580
                          BAD_CASE (-expP->X_add_number);
2581
                          break;
2582
                        }
2583
                    }
2584
                }
2585
 
2586
              if (operandP->vop_short == 's'
2587
                  || operandP->vop_short == 'i'
2588
                  || (operandP->vop_short == ' '
2589
                      && operandP->vop_reg == 0xF
2590
                      && (operandP->vop_mode & 0xE) == 0x8))
2591
                {
2592
                  /* Saw a '#'.  */
2593
                  if (operandP->vop_short == ' ')
2594
                    {
2595
                      /* We must chose S^ or I^.  */
2596
                      if (expP->X_add_number > 0)
2597
                        {
2598
                          /* Bignum: Short literal impossible.  */
2599
                          operandP->vop_short = 'i';
2600
                          operandP->vop_mode = 8;
2601
                          operandP->vop_reg = 0xF;      /* VAX PC.  */
2602
                        }
2603
                      else
2604
                        {
2605
                          /* Flonum: Try to do it.  */
2606
                          if (can_be_short)
2607
                            {
2608
                              operandP->vop_short = 's';
2609
                              operandP->vop_mode = 0;
2610
                              operandP->vop_ndx = -1;
2611
                              operandP->vop_reg = -1;
2612
                              expP->X_op = O_constant;
2613
                            }
2614
                          else
2615
                            {
2616
                              operandP->vop_short = 'i';
2617
                              operandP->vop_mode = 8;
2618
                              operandP->vop_reg = 0xF;  /* VAX PC */
2619
                            }
2620
                        }       /* bignum or flonum ? */
2621
                    }           /*  if #, but no S^ or I^ seen.  */
2622
                  /* No more ' ' case: either 's' or 'i'.  */
2623
                  if (operandP->vop_short == 's')
2624
                    {
2625
                      /* Wants to be a short literal.  */
2626
                      if (expP->X_add_number > 0)
2627
                        {
2628
                          as_warn (_("Bignum not permitted in short literal. Immediate mode assumed."));
2629
                          operandP->vop_short = 'i';
2630
                          operandP->vop_mode = 8;
2631
                          operandP->vop_reg = 0xF;      /* VAX PC.  */
2632
                        }
2633
                      else
2634
                        {
2635
                          if (!can_be_short)
2636
                            {
2637
                              as_warn (_("Can't do flonum short literal: immediate mode used."));
2638
                              operandP->vop_short = 'i';
2639
                              operandP->vop_mode = 8;
2640
                              operandP->vop_reg = 0xF;  /* VAX PC.  */
2641
                            }
2642
                          else
2643
                            {
2644
                              /* Encode short literal now.  */
2645
                              int temp = 0;
2646
 
2647
                              switch (-expP->X_add_number)
2648
                                {
2649
                                case 'f':
2650
                                case 'd':
2651
                                  temp = literal_float[0] >> 4;
2652
                                  break;
2653
 
2654
                                case 'g':
2655
                                  temp = literal_float[0] >> 1;
2656
                                  break;
2657
 
2658
                                case 'h':
2659
                                  temp = ((literal_float[0] << 3) & 070)
2660
                                    | ((literal_float[1] >> 13) & 07);
2661
                                  break;
2662
 
2663
                                default:
2664
                                  BAD_CASE (-expP->X_add_number);
2665
                                  break;
2666
                                }
2667
 
2668
                              floatP->low[0] = temp & 077;
2669
                              floatP->low[1] = 0;
2670
                            }
2671
                        }
2672
                    }
2673
                  else
2674
                    {
2675
                      /* I^# seen: set it up if float.  */
2676
                      if (expP->X_add_number < 0)
2677
                        {
2678
                          memcpy (floatP->low, literal_float, sizeof (literal_float));
2679
                        }
2680
                    }           /* if S^# seen.  */
2681
                }
2682
              else
2683
                {
2684
                  as_warn (_("A bignum/flonum may not be a displacement: 0x%lx used"),
2685
                           (expP->X_add_number = 0x80000000L));
2686
                  /* Chosen so luser gets the most offset bits to patch later.  */
2687
                }
2688
              expP->X_add_number = floatP->low[0]
2689
                | ((LITTLENUM_MASK & (floatP->low[1])) << LITTLENUM_NUMBER_OF_BITS);
2690
 
2691
              /* For the O_big case we have:
2692
                 If vop_short == 's' then a short floating literal is in the
2693
                        lowest 6 bits of floatP -> low [0], which is
2694
                        big_operand_bits [---] [0].
2695
                 If vop_short == 'i' then the appropriate number of elements
2696
                        of big_operand_bits [---] [...] are set up with the correct
2697
                        bits.
2698
                 Also, just in case width is byte word or long, we copy the lowest
2699
                 32 bits of the number to X_add_number.  */
2700
              break;
2701
            }
2702
          if (input_line_pointer != operandP->vop_expr_end + 1)
2703
            {
2704
              as_fatal ("Junk at end of expression \"%s\"", input_line_pointer);
2705
              goofed = 1;
2706
            }
2707
          operandP->vop_expr_end[1] = c_save;
2708
        }
2709
    }
2710
 
2711
  input_line_pointer = save_input_line_pointer;
2712
 
2713
  if (need_pass_2 || goofed)
2714
    return;
2715
 
2716
  dwarf2_emit_insn (0);
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 %s used as immediate operand in PIC mode."),
3156
                                       S_GET_NAME (this_add_symbol));
3157
                            }
3158
#endif
3159
                          p[0] = (operandP->vop_mode << 4) | 0xF;
3160
                          if ((is_absolute) && (expP->X_op != O_big))
3161
                            {
3162
                              /* If nbytes > 4, then we are scrod. We
3163
                                 don't know if the high order bytes
3164
                                 are to be 0xFF or 0x00.  BSD4.2 & RMS
3165
                                 say use 0x00. OK --- but this
3166
                                 assembler needs ANOTHER rewrite to
3167
                                 cope properly with this bug.  */
3168
                              md_number_to_chars (p + 1, this_add_number,
3169
                                                  min (sizeof (valueT),
3170
                                                       (size_t) nbytes));
3171
                              if ((size_t) nbytes > sizeof (valueT))
3172
                                memset (p + 1 + sizeof (valueT),
3173
                                        '\0', nbytes - sizeof (valueT));
3174
                            }
3175
                          else
3176
                            {
3177
                              if (expP->X_op == O_big)
3178
                                {
3179
                                  /* Problem here is to get the bytes
3180
                                     in the right order.  We stored
3181
                                     our constant as LITTLENUMs, not
3182
                                     bytes.  */
3183
                                  LITTLENUM_TYPE *lP;
3184
 
3185
                                  lP = floatP->low;
3186
                                  if (nbytes & 1)
3187
                                    {
3188
                                      know (nbytes == 1);
3189
                                      p[1] = *lP;
3190
                                    }
3191
                                  else
3192
                                    {
3193
                                      for (p++; nbytes; nbytes -= 2, p += 2, lP++)
3194
                                        md_number_to_chars (p, *lP, 2);
3195
                                    }
3196
                                }
3197
                              else
3198
                                {
3199
                                  fix_new (frag_now, p + 1 - frag_now->fr_literal,
3200
                                           nbytes, this_add_symbol,
3201
                                           this_add_number, 0, NO_RELOC);
3202
                                }
3203
                            }
3204
                        }
3205
                    }
3206
                  else
3207
                    {
3208
                      /* {@}{q^}foo(Rn) */
3209
                      know ((length == 0 && operandP->vop_short == ' ')
3210
                            || (length > 0 && operandP->vop_short != ' '));
3211
                      if (length == 0)
3212
                        {
3213
                          if (is_absolute)
3214
                            {
3215
                              long test;
3216
 
3217
                              test = this_add_number;
3218
 
3219
                              if (test < 0)
3220
                                test = ~test;
3221
 
3222
                              length = test & 0xffff8000 ? 4
3223
                                : test & 0xffffff80 ? 2
3224
                                : 1;
3225
                            }
3226
                          else
3227
                            {
3228
                              length = 4;
3229
                            }
3230
                        }
3231
                      p = frag_more (1 + length);
3232
                      know (operandP->vop_reg >= 0);
3233
                      p[0] = operandP->vop_reg
3234
                        | ((at | "?\12\14?\16"[length]) << 4);
3235
                      if (is_absolute)
3236
                        {
3237
                          md_number_to_chars (p + 1, this_add_number, length);
3238
                        }
3239
                      else
3240
                        {
3241
                          fix_new (frag_now, p + 1 - frag_now->fr_literal,
3242
                                   length, this_add_symbol,
3243
                                   this_add_number, 0, NO_RELOC);
3244
                        }
3245
                    }
3246
                }
3247
            }
3248
        }
3249
    }
3250
}
3251
 
3252
void
3253
md_begin (void)
3254
{
3255
  const char *errtxt;
3256
  FLONUM_TYPE *fP;
3257
  int i;
3258
 
3259
  if ((errtxt = vip_begin (1, "$", "*", "`")) != 0)
3260
    as_fatal (_("VIP_BEGIN error:%s"), errtxt);
3261
 
3262
  for (i = 0, fP = float_operand;
3263
       fP < float_operand + VIT_MAX_OPERANDS;
3264
       i++, fP++)
3265
    {
3266
      fP->low = &big_operand_bits[i][0];
3267
      fP->high = &big_operand_bits[i][SIZE_OF_LARGE_NUMBER - 1];
3268
    }
3269
}
3270
 
3271
static char *vax_cons_special_reloc;
3272
 
3273
void
3274
vax_cons (expressionS *exp, int size)
3275
{
3276
  char *save;
3277
 
3278
  SKIP_WHITESPACE ();
3279
  vax_cons_special_reloc = NULL;
3280
  save = input_line_pointer;
3281
  if (input_line_pointer[0] == '%')
3282
    {
3283
      if (strncmp (input_line_pointer + 1, "pcrel", 5) == 0)
3284
        {
3285
          input_line_pointer += 6;
3286
          vax_cons_special_reloc = "pcrel";
3287
        }
3288
      if (vax_cons_special_reloc)
3289
        {
3290
          int bad = 0;
3291
 
3292
          switch (size)
3293
            {
3294
            case 1:
3295
              if (*input_line_pointer != '8')
3296
                bad = 1;
3297
              input_line_pointer--;
3298
              break;
3299
            case 2:
3300
              if (input_line_pointer[0] != '1' || input_line_pointer[1] != '6')
3301
                bad = 1;
3302
              break;
3303
            case 4:
3304
              if (input_line_pointer[0] != '3' || input_line_pointer[1] != '2')
3305
                bad = 1;
3306
              break;
3307
            default:
3308
              bad = 1;
3309
              break;
3310
            }
3311
 
3312
          if (bad)
3313
            {
3314
              as_bad (_("Illegal operands: Only %%r_%s%d allowed in %d-byte data fields"),
3315
                      vax_cons_special_reloc, size * 8, size);
3316
            }
3317
          else
3318
            {
3319
              input_line_pointer += 2;
3320
              if (*input_line_pointer != '(')
3321
                {
3322
                  as_bad (_("Illegal operands: %%r_%s%d requires arguments in ()"),
3323
                          vax_cons_special_reloc, size * 8);
3324
                  bad = 1;
3325
                }
3326
            }
3327
 
3328
          if (bad)
3329
            {
3330
              input_line_pointer = save;
3331
              vax_cons_special_reloc = NULL;
3332
            }
3333
          else
3334
            {
3335
              int c;
3336
              char *end = ++input_line_pointer;
3337
              int npar = 0;
3338
 
3339
              while (! is_end_of_line[(c = *end)])
3340
                {
3341
                  if (c == '(')
3342
                    npar++;
3343
                  else if (c == ')')
3344
                    {
3345
                      if (!npar)
3346
                        break;
3347
                      npar--;
3348
                    }
3349
                  end++;
3350
                }
3351
 
3352
              if (c != ')')
3353
                as_bad (_("Illegal operands: %%r_%s%d requires arguments in ()"),
3354
                        vax_cons_special_reloc, size * 8);
3355
              else
3356
                {
3357
                  *end = '\0';
3358
                  expression (exp);
3359
                  *end = c;
3360
                  if (input_line_pointer != end)
3361
                    {
3362
                      as_bad (_("Illegal operands: %%r_%s%d requires arguments in ()"),
3363
                              vax_cons_special_reloc, size * 8);
3364
                    }
3365
                  else
3366
                    {
3367
                      input_line_pointer++;
3368
                      SKIP_WHITESPACE ();
3369
                      c = *input_line_pointer;
3370
                      if (! is_end_of_line[c] && c != ',')
3371
                        as_bad (_("Illegal operands: garbage after %%r_%s%d()"),
3372
                                vax_cons_special_reloc, size * 8);
3373
                    }
3374
                }
3375
            }
3376
        }
3377
    }
3378
  if (vax_cons_special_reloc == NULL)
3379
    expression (exp);
3380
}
3381
 
3382
/* This is called by emit_expr via TC_CONS_FIX_NEW when creating a
3383
   reloc for a cons.  */
3384
 
3385
void
3386
vax_cons_fix_new (fragS *frag, int where, unsigned int nbytes, expressionS *exp)
3387
{
3388
  bfd_reloc_code_real_type r;
3389
 
3390
  r = (nbytes == 1 ? BFD_RELOC_8 :
3391
       (nbytes == 2 ? BFD_RELOC_16 : BFD_RELOC_32));
3392
 
3393
  if (vax_cons_special_reloc)
3394
    {
3395
      if (*vax_cons_special_reloc == 'p')
3396
        {
3397
          switch (nbytes)
3398
            {
3399
            case 1: r = BFD_RELOC_8_PCREL; break;
3400
            case 2: r = BFD_RELOC_16_PCREL; break;
3401
            case 4: r = BFD_RELOC_32_PCREL; break;
3402
            default: abort ();
3403
            }
3404
        }
3405
    }
3406
 
3407
  fix_new_exp (frag, where, (int) nbytes, exp, 0, r);
3408
  vax_cons_special_reloc = NULL;
3409
}
3410
 
3411
char *
3412
md_atof (int type, char * litP, int * sizeP)
3413
{
3414
  return vax_md_atof (type, litP, sizeP);
3415
}

powered by: WebSVN 2.1.0

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