Coverage Report

Created: 2023-08-28 06:31

/src/binutils-gdb/gas/config/tc-i386-intel.c
Line
Count
Source (jump to first uncovered line)
1
/* tc-i386.c -- Assemble Intel syntax code for ix86/x86-64
2
   Copyright (C) 2009-2023 Free Software Foundation, Inc.
3
4
   This file is part of GAS, the GNU Assembler.
5
6
   GAS is free software; you can redistribute it and/or modify
7
   it under the terms of the GNU General Public License as published by
8
   the Free Software Foundation; either version 3, or (at your option)
9
   any later version.
10
11
   GAS is distributed in the hope that it will be useful,
12
   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
   GNU General Public License for more details.
15
16
   You should have received a copy of the GNU General Public License
17
   along with GAS; see the file COPYING.  If not, write to the Free
18
   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
19
   02110-1301, USA.  */
20
21
static struct
22
  {
23
    operatorT op_modifier;  /* Operand modifier.  */
24
    int is_mem;     /* 1 if operand is memory reference.  */
25
    int is_indirect;    /* 1 if operand is indirect reference.  */
26
    int has_offset;   /* 1 if operand has offset.  */
27
    unsigned int in_offset; /* >=1 if processing operand of offset.  */
28
    unsigned int in_bracket;  /* >=1 if processing operand in brackets.  */
29
    unsigned int in_scale;  /* >=1 if processing multiplication operand
30
         * in brackets.  */
31
    i386_operand_type reloc_types;  /* Value obtained from lex_got().  */
32
    const reg_entry *base;  /* Base register (if any).  */
33
    const reg_entry *index; /* Index register (if any).  */
34
    offsetT scale_factor; /* Accumulated scale factor.  */
35
    symbolS *seg;
36
  }
37
intel_state;
38
39
/* offset X_add_symbol */
40
0
#define O_offset O_md32
41
/* offset X_add_symbol */
42
0
#define O_short O_md31
43
/* near ptr X_add_symbol */
44
0
#define O_near_ptr O_md30
45
/* far ptr X_add_symbol */
46
0
#define O_far_ptr O_md29
47
/* byte ptr X_add_symbol */
48
0
#define O_byte_ptr O_md28
49
/* word ptr X_add_symbol */
50
0
#define O_word_ptr O_md27
51
/* dword ptr X_add_symbol */
52
0
#define O_dword_ptr O_md26
53
/* qword ptr X_add_symbol */
54
0
#define O_qword_ptr O_md25
55
/* mmword ptr X_add_symbol */
56
#define O_mmword_ptr O_qword_ptr
57
/* fword ptr X_add_symbol */
58
0
#define O_fword_ptr O_md24
59
/* tbyte ptr X_add_symbol */
60
0
#define O_tbyte_ptr O_md23
61
/* oword ptr X_add_symbol */
62
0
#define O_oword_ptr O_md22
63
/* xmmword ptr X_add_symbol */
64
#define O_xmmword_ptr O_oword_ptr
65
/* ymmword ptr X_add_symbol */
66
0
#define O_ymmword_ptr O_md21
67
/* zmmword ptr X_add_symbol */
68
0
#define O_zmmword_ptr O_md20
69
70
static struct
71
  {
72
    const char *name;
73
    operatorT op;
74
    unsigned int operands;
75
  }
76
const i386_operators[] =
77
  {
78
    { "and", O_bit_and, 2 },
79
    { "eq", O_eq, 2 },
80
    { "ge", O_ge, 2 },
81
    { "gt", O_gt, 2 },
82
    { "le", O_le, 2 },
83
    { "lt", O_lt, 2 },
84
    { "mod", O_modulus, 2 },
85
    { "ne", O_ne, 2 },
86
    { "not", O_bit_not, 1 },
87
    { "offset", O_offset, 1 },
88
    { "or", O_bit_inclusive_or, 2 },
89
    { "shl", O_left_shift, 2 },
90
    { "short", O_short, 1 },
91
    { "shr", O_right_shift, 2 },
92
    { "xor", O_bit_exclusive_or, 2 },
93
    { NULL, O_illegal, 0 }
94
  };
95
96
static struct
97
  {
98
    const char *name;
99
    operatorT op;
100
    unsigned short sz[3];
101
  }
102
const i386_types[] =
103
  {
104
#define I386_TYPE(t, n) { #t, O_##t##_ptr, { n, n, n } }
105
    I386_TYPE(byte, 1),
106
    I386_TYPE(word, 2),
107
    I386_TYPE(dword, 4),
108
    I386_TYPE(fword, 6),
109
    I386_TYPE(qword, 8),
110
    I386_TYPE(mmword, 8),
111
    I386_TYPE(tbyte, 10),
112
    I386_TYPE(oword, 16),
113
    I386_TYPE(xmmword, 16),
114
    I386_TYPE(ymmword, 32),
115
    I386_TYPE(zmmword, 64),
116
#undef I386_TYPE
117
    { "near", O_near_ptr, { 0xff04, 0xff02, 0xff08 } },
118
    { "far", O_far_ptr, { 0xff06, 0xff05, 0xff06 } },
119
    { NULL, O_illegal, { 0, 0, 0 } }
120
  };
121
122
operatorT i386_operator (const char *name, unsigned int operands, char *pc)
123
2.34M
{
124
2.34M
  unsigned int j;
125
126
#ifdef SVR4_COMMENT_CHARS
127
  if (!name && operands == 2 && *input_line_pointer == '\\')
128
    switch (input_line_pointer[1])
129
      {
130
      case '/': input_line_pointer += 2; return O_divide;
131
      case '%': input_line_pointer += 2; return O_modulus;
132
      case '*': input_line_pointer += 2; return O_multiply;
133
      }
134
#endif
135
136
2.34M
  if (!intel_syntax)
137
2.34M
    return O_absent;
138
139
0
  if (!name)
140
0
    {
141
0
      if (operands != 2)
142
0
  return O_illegal;
143
0
      switch (*input_line_pointer)
144
0
  {
145
0
  case ':':
146
0
    ++input_line_pointer;
147
0
    return O_full_ptr;
148
0
  case '[':
149
0
    ++input_line_pointer;
150
0
    return O_index;
151
0
  case '@':
152
0
    if (this_operand >= 0 && i.reloc[this_operand] == NO_RELOC)
153
0
      {
154
0
        int adjust = 0;
155
0
        char *gotfree_input_line = lex_got (&i.reloc[this_operand],
156
0
              &adjust,
157
0
              &intel_state.reloc_types);
158
159
0
        if (!gotfree_input_line)
160
0
    break;
161
0
        free (gotfree_input_line);
162
0
        *input_line_pointer++ = '+';
163
0
        memset (input_line_pointer, '0', adjust - 1);
164
0
        input_line_pointer[adjust - 1] = ' ';
165
0
        return O_add;
166
0
      }
167
0
    break;
168
0
  }
169
0
      return O_illegal;
170
0
    }
171
172
  /* See the quotation related comment in i386_parse_name().  */
173
0
  if (*pc == '"')
174
0
    return O_absent;
175
176
0
  for (j = 0; i386_operators[j].name; ++j)
177
0
    if (strcasecmp (i386_operators[j].name, name) == 0)
178
0
      {
179
0
  if (i386_operators[j].operands
180
0
      && i386_operators[j].operands != operands)
181
0
    return O_illegal;
182
0
  return i386_operators[j].op;
183
0
      }
184
185
0
  for (j = 0; i386_types[j].name; ++j)
186
0
    if (strcasecmp (i386_types[j].name, name) == 0)
187
0
      break;
188
189
0
  if (i386_types[j].name && *pc == ' ')
190
0
    {
191
0
      const char *start = ++input_line_pointer;
192
0
      char *pname;
193
0
      char c = get_symbol_name (&pname);
194
195
0
      if (strcasecmp (pname, "ptr") == 0 && (c != '"' || pname == start))
196
0
  {
197
0
    pname[-1] = *pc;
198
0
    *pc = c;
199
0
    if (intel_syntax > 0 || operands != 1)
200
0
      return O_illegal;
201
0
    return i386_types[j].op;
202
0
  }
203
204
0
      if (strcasecmp (pname, "bcst") == 0 && (c != '"' || pname == start))
205
0
  {
206
0
    pname[-1] = *pc;
207
0
    *pc = c;
208
0
    if (intel_syntax > 0 || operands != 1
209
0
        || i386_types[j].sz[0] > 8
210
0
        || (i386_types[j].sz[0] & (i386_types[j].sz[0] - 1)))
211
0
      return O_illegal;
212
0
    if (!i.broadcast.bytes && !i.broadcast.type)
213
0
      {
214
0
        i.broadcast.bytes = i386_types[j].sz[0];
215
0
        i.broadcast.operand = this_operand;
216
0
      }
217
0
    return i386_types[j].op;
218
0
  }
219
220
0
      (void) restore_line_pointer (c);
221
0
      input_line_pointer = pname - 1;
222
0
    }
223
224
0
  return O_absent;
225
0
}
226
227
static int i386_intel_parse_name (const char *name, expressionS *e)
228
0
{
229
0
  unsigned int j;
230
231
0
  if (! strcmp (name, "$"))
232
0
    {
233
0
      current_location (e);
234
0
      return 1;
235
0
    }
236
237
0
  for (j = 0; i386_types[j].name; ++j)
238
0
    if (strcasecmp(i386_types[j].name, name) == 0)
239
0
      {
240
0
  e->X_op = O_constant;
241
0
  e->X_add_number = i386_types[j].sz[flag_code];
242
0
  e->X_add_symbol = NULL;
243
0
  e->X_op_symbol = NULL;
244
0
  return 1;
245
0
      }
246
247
0
  return 0;
248
0
}
249
250
static INLINE int i386_intel_check (const reg_entry *rreg,
251
            const reg_entry *base,
252
            const reg_entry *iindex)
253
0
{
254
0
  if ((this_operand >= 0
255
0
       && rreg != i.op[this_operand].regs)
256
0
      || base != intel_state.base
257
0
      || iindex != intel_state.index)
258
0
    {
259
0
      as_bad (_("invalid use of register"));
260
0
      return 0;
261
0
    }
262
0
  return 1;
263
0
}
264
265
static INLINE void i386_intel_fold (expressionS *e, symbolS *sym)
266
0
{
267
0
  expressionS *exp = symbol_get_value_expression (sym);
268
0
  if (S_GET_SEGMENT (sym) == absolute_section)
269
0
    {
270
0
      offsetT val = e->X_add_number;
271
272
0
      *e = *exp;
273
0
      e->X_add_number += val;
274
0
    }
275
0
  else
276
0
    {
277
0
      if (exp->X_op == O_symbol
278
0
    && strcmp (S_GET_NAME (exp->X_add_symbol),
279
0
         GLOBAL_OFFSET_TABLE_NAME) == 0)
280
0
  sym = exp->X_add_symbol;
281
0
      e->X_add_symbol = sym;
282
0
      e->X_op_symbol = NULL;
283
0
      e->X_op = O_symbol;
284
0
    }
285
0
}
286
287
static int
288
i386_intel_simplify_register (expressionS *e)
289
0
{
290
0
  int reg_num;
291
292
0
  if (this_operand < 0 || intel_state.in_offset)
293
0
    {
294
0
      as_bad (_("invalid use of register"));
295
0
      return 0;
296
0
    }
297
298
0
  if (e->X_op == O_register)
299
0
    reg_num = e->X_add_number;
300
0
  else
301
0
    reg_num = e->X_md - 1;
302
303
0
  if (reg_num < 0 || reg_num >= (int) i386_regtab_size)
304
0
    {
305
0
      as_bad (_("invalid register number"));
306
0
      return 0;
307
0
    }
308
309
0
  if (!check_register (&i386_regtab[reg_num]))
310
0
    {
311
0
      as_bad (_("register '%s%s' cannot be used here"),
312
0
        register_prefix, i386_regtab[reg_num].reg_name);
313
0
      return 0;
314
0
    }
315
316
0
  if (!intel_state.in_bracket)
317
0
    {
318
0
      if (i.op[this_operand].regs)
319
0
  {
320
0
    as_bad (_("invalid use of register"));
321
0
    return 0;
322
0
  }
323
0
      if ((i386_regtab[reg_num].reg_type.bitfield.class == SReg
324
0
     && i386_regtab[reg_num].reg_num == RegFlat)
325
0
    || (dot_insn ()
326
0
        && i386_regtab[reg_num].reg_type.bitfield.class == ClassNone))
327
0
  {
328
0
    as_bad (_("invalid use of pseudo-register"));
329
0
    return 0;
330
0
  }
331
0
      i.op[this_operand].regs = i386_regtab + reg_num;
332
0
    }
333
0
  else if (!intel_state.index
334
0
     && (i386_regtab[reg_num].reg_type.bitfield.xmmword
335
0
         || i386_regtab[reg_num].reg_type.bitfield.ymmword
336
0
         || i386_regtab[reg_num].reg_type.bitfield.zmmword
337
0
         || i386_regtab[reg_num].reg_num == RegIZ))
338
0
    intel_state.index = i386_regtab + reg_num;
339
0
  else if (!intel_state.base && !intel_state.in_scale)
340
0
    intel_state.base = i386_regtab + reg_num;
341
0
  else if (!intel_state.index)
342
0
    {
343
0
      const insn_template *t = current_templates->start;
344
345
0
      if (intel_state.in_scale
346
0
    || i386_regtab[reg_num].reg_type.bitfield.baseindex
347
0
    || dot_insn ()
348
0
    || t->mnem_off == MN_bndmk
349
0
    || t->mnem_off == MN_bndldx
350
0
    || t->mnem_off == MN_bndstx)
351
0
  intel_state.index = i386_regtab + reg_num;
352
0
      else
353
0
  {
354
    /* Convert base to index and make ESP/RSP the base.  */
355
0
    intel_state.index = intel_state.base;
356
0
    intel_state.base = i386_regtab + reg_num;
357
0
  }
358
0
    }
359
0
  else
360
0
    {
361
      /* esp is invalid as index */
362
0
      intel_state.index = reg_eax + ESP_REG_NUM;
363
0
    }
364
0
  return 2;
365
0
}
366
367
static int i386_intel_simplify (expressionS *);
368
369
static INLINE int i386_intel_simplify_symbol(symbolS *sym)
370
0
{
371
0
  int ret = i386_intel_simplify (symbol_get_value_expression (sym));
372
373
0
  if (ret == 2)
374
0
  {
375
0
    S_SET_SEGMENT(sym, absolute_section);
376
0
    ret = 1;
377
0
  }
378
0
  return ret;
379
0
}
380
381
static int i386_intel_simplify (expressionS *e)
382
0
{
383
0
  const reg_entry *the_reg = (this_operand >= 0
384
0
            ? i.op[this_operand].regs : NULL);
385
0
  const reg_entry *base = intel_state.base;
386
0
  const reg_entry *state_index = intel_state.index;
387
0
  int ret;
388
389
0
  if (!intel_syntax)
390
0
    return 1;
391
392
0
  switch (e->X_op)
393
0
    {
394
0
    case O_index:
395
0
      if (e->X_add_symbol)
396
0
  {
397
0
    if (!i386_intel_simplify_symbol (e->X_add_symbol)
398
0
        || !i386_intel_check(the_reg, intel_state.base,
399
0
           intel_state.index))
400
0
      return 0;
401
0
  }
402
0
      if (!intel_state.in_offset)
403
0
  ++intel_state.in_bracket;
404
0
      ret = i386_intel_simplify_symbol (e->X_op_symbol);
405
0
      if (!intel_state.in_offset)
406
0
  --intel_state.in_bracket;
407
0
      if (!ret)
408
0
  return 0;
409
0
      if (e->X_add_symbol)
410
0
  e->X_op = O_add;
411
0
      else
412
0
  i386_intel_fold (e, e->X_op_symbol);
413
0
      break;
414
415
0
    case O_offset:
416
0
      intel_state.has_offset = 1;
417
0
      ++intel_state.in_offset;
418
0
      ret = i386_intel_simplify_symbol (e->X_add_symbol);
419
0
      --intel_state.in_offset;
420
0
      if (!ret || !i386_intel_check(the_reg, base, state_index))
421
0
  return 0;
422
0
      i386_intel_fold (e, e->X_add_symbol);
423
0
      return ret;
424
425
0
    case O_byte_ptr:
426
0
    case O_word_ptr:
427
0
    case O_dword_ptr:
428
0
    case O_fword_ptr:
429
0
    case O_qword_ptr: /* O_mmword_ptr */
430
0
    case O_tbyte_ptr:
431
0
    case O_oword_ptr: /* O_xmmword_ptr */
432
0
    case O_ymmword_ptr:
433
0
    case O_zmmword_ptr:
434
0
    case O_near_ptr:
435
0
    case O_far_ptr:
436
0
      if (intel_state.op_modifier == O_absent)
437
0
  intel_state.op_modifier = e->X_op;
438
      /* FALLTHROUGH */
439
0
    case O_short:
440
0
      if (symbol_get_value_expression (e->X_add_symbol)->X_op
441
0
    == O_register)
442
0
  {
443
0
    as_bad (_("invalid use of register"));
444
0
    return 0;
445
0
  }
446
0
      if (!i386_intel_simplify_symbol (e->X_add_symbol))
447
0
  return 0;
448
0
      i386_intel_fold (e, e->X_add_symbol);
449
0
      break;
450
451
0
    case O_full_ptr:
452
0
      if (symbol_get_value_expression (e->X_op_symbol)->X_op
453
0
    == O_register)
454
0
  {
455
0
    as_bad (_("invalid use of register"));
456
0
    return 0;
457
0
  }
458
0
      if (!i386_intel_simplify_symbol (e->X_op_symbol)
459
0
    || !i386_intel_check(the_reg, intel_state.base,
460
0
             intel_state.index))
461
0
  return 0;
462
0
      if (!intel_state.in_offset)
463
0
  {
464
0
    if (!intel_state.seg)
465
0
      intel_state.seg = e->X_add_symbol;
466
0
    else
467
0
      {
468
0
        expressionS exp;
469
470
0
        exp.X_op = O_full_ptr;
471
0
        exp.X_add_symbol = e->X_add_symbol;
472
0
        exp.X_op_symbol = intel_state.seg;
473
0
        intel_state.seg = make_expr_symbol (&exp);
474
0
      }
475
0
  }
476
0
      i386_intel_fold (e, e->X_op_symbol);
477
0
      break;
478
479
0
    case O_multiply:
480
0
      if (this_operand >= 0 && intel_state.in_bracket)
481
0
  {
482
0
    expressionS *scale = NULL;
483
0
    int has_index = (intel_state.index != NULL);
484
485
0
    if (!intel_state.in_scale++)
486
0
      intel_state.scale_factor = 1;
487
488
0
    ret = i386_intel_simplify_symbol (e->X_add_symbol);
489
0
    if (ret && !has_index && intel_state.index)
490
0
      scale = symbol_get_value_expression (e->X_op_symbol);
491
492
0
    if (ret)
493
0
      ret = i386_intel_simplify_symbol (e->X_op_symbol);
494
0
    if (ret && !scale && !has_index && intel_state.index)
495
0
      scale = symbol_get_value_expression (e->X_add_symbol);
496
497
0
    if (ret && scale)
498
0
      {
499
0
        resolve_expression (scale);
500
0
        if (scale->X_op != O_constant
501
0
      || intel_state.index->reg_type.bitfield.word)
502
0
    scale->X_add_number = 0;
503
0
        intel_state.scale_factor *= scale->X_add_number;
504
0
      }
505
506
0
    --intel_state.in_scale;
507
0
    if (!ret)
508
0
      return 0;
509
510
0
    if (!intel_state.in_scale)
511
0
      switch (intel_state.scale_factor)
512
0
        {
513
0
        case 1:
514
0
    i.log2_scale_factor = 0;
515
0
    break;
516
0
        case 2:
517
0
    i.log2_scale_factor = 1;
518
0
    break;
519
0
        case 4:
520
0
    i.log2_scale_factor = 2;
521
0
    break;
522
0
        case 8:
523
0
    i.log2_scale_factor = 3;
524
0
    break;
525
0
        default:
526
    /* esp is invalid as index */
527
0
    intel_state.index = reg_eax + ESP_REG_NUM;
528
0
    break;
529
0
        }
530
531
0
    break;
532
0
  }
533
0
      goto fallthrough;
534
535
0
    case O_register:
536
0
      ret = i386_intel_simplify_register (e);
537
0
      if (ret == 2)
538
0
  {
539
0
    gas_assert (e->X_add_number < (unsigned short) -1);
540
0
    e->X_md = (unsigned short) e->X_add_number + 1;
541
0
    e->X_op = O_constant;
542
0
    e->X_add_number = 0;
543
0
  }
544
0
      return ret;
545
546
0
    case O_constant:
547
0
      if (e->X_md)
548
0
  return i386_intel_simplify_register (e);
549
550
      /* FALLTHROUGH */
551
0
    default:
552
0
    fallthrough:
553
0
      if (e->X_add_symbol
554
0
    && !i386_intel_simplify_symbol (e->X_add_symbol))
555
0
  return 0;
556
0
      if (!the_reg && this_operand >= 0
557
0
    && e->X_op == O_symbol && !e->X_add_number)
558
0
  the_reg = i.op[this_operand].regs;
559
0
      if (e->X_op == O_add || e->X_op == O_subtract)
560
0
  {
561
0
    base = intel_state.base;
562
0
    state_index = intel_state.index;
563
0
  }
564
0
      if (!i386_intel_check (the_reg, base, state_index)
565
0
    || (e->X_op_symbol
566
0
        && !i386_intel_simplify_symbol (e->X_op_symbol))
567
0
    || !i386_intel_check (the_reg,
568
0
        (e->X_op != O_add
569
0
         ? base : intel_state.base),
570
0
        (e->X_op != O_add
571
0
         ? state_index : intel_state.index)))
572
0
  return 0;
573
0
      break;
574
0
    }
575
576
0
  if (this_operand >= 0
577
0
      && e->X_op == O_symbol
578
0
      && !intel_state.in_offset)
579
0
    {
580
0
      segT seg = S_GET_SEGMENT (e->X_add_symbol);
581
582
0
      if (seg != absolute_section
583
0
    && seg != reg_section
584
0
    && seg != expr_section)
585
0
  intel_state.is_mem |= 2 - !intel_state.in_bracket;
586
0
    }
587
588
0
  return 1;
589
0
}
590
591
int i386_need_index_operator (void)
592
15.4k
{
593
15.4k
  return intel_syntax < 0;
594
15.4k
}
595
596
static int
597
i386_intel_operand (char *operand_string, int got_a_float)
598
0
{
599
0
  char *saved_input_line_pointer, *buf;
600
0
  segT exp_seg;
601
0
  expressionS exp, *expP;
602
0
  char suffix = 0;
603
0
  bool rc_sae_modifier = i.rounding.type != rc_none && i.rounding.modifier;
604
0
  int ret;
605
606
  /* Handle vector immediates.  */
607
0
  if (RC_SAE_immediate (operand_string))
608
0
    {
609
0
      if (i.imm_operands)
610
0
  {
611
0
    as_bad (_("`%s': RC/SAE operand must precede immediate operands"),
612
0
      insn_name (current_templates->start));
613
0
    return 0;
614
0
  }
615
616
0
      return 1;
617
0
    }
618
619
  /* Initialize state structure.  */
620
0
  intel_state.op_modifier = O_absent;
621
0
  intel_state.is_mem = 0;
622
0
  intel_state.is_indirect = 0;
623
0
  intel_state.has_offset = 0;
624
0
  intel_state.base = NULL;
625
0
  intel_state.index = NULL;
626
0
  intel_state.seg = NULL;
627
0
  operand_type_set (&intel_state.reloc_types, ~0);
628
0
  gas_assert (!intel_state.in_offset);
629
0
  gas_assert (!intel_state.in_bracket);
630
0
  gas_assert (!intel_state.in_scale);
631
632
0
  saved_input_line_pointer = input_line_pointer;
633
0
  input_line_pointer = buf = xstrdup (operand_string);
634
635
0
  intel_syntax = -1;
636
0
  expr_mode = expr_operator_none;
637
0
  memset (&exp, 0, sizeof(exp));
638
0
  exp_seg = expression (&exp);
639
0
  ret = i386_intel_simplify (&exp);
640
0
  intel_syntax = 1;
641
642
0
  SKIP_WHITESPACE ();
643
644
  /* Handle vector operations.  */
645
0
  if (*input_line_pointer == '{')
646
0
    {
647
0
      char *end = check_VecOperations (input_line_pointer);
648
0
      if (end)
649
0
  input_line_pointer = end;
650
0
      else
651
0
  ret = 0;
652
0
    }
653
654
0
  if (!is_end_of_line[(unsigned char) *input_line_pointer])
655
0
    {
656
0
      if (ret)
657
0
  as_bad (_("junk `%s' after expression"), input_line_pointer);
658
0
      ret = 0;
659
0
    }
660
0
  else if (exp.X_op == O_illegal || exp.X_op == O_absent)
661
0
    {
662
0
      if (ret)
663
0
  as_bad (_("invalid expression"));
664
0
      ret = 0;
665
0
    }
666
0
  else if (!intel_state.has_offset
667
0
     && input_line_pointer > buf
668
0
     && *(input_line_pointer - 1) == ']')
669
0
    {
670
0
      intel_state.is_mem |= 1;
671
0
      intel_state.is_indirect = 1;
672
0
    }
673
674
0
  input_line_pointer = saved_input_line_pointer;
675
0
  free (buf);
676
677
0
  gas_assert (!intel_state.in_offset);
678
0
  gas_assert (!intel_state.in_bracket);
679
0
  gas_assert (!intel_state.in_scale);
680
681
0
  if (!ret)
682
0
    return 0;
683
684
0
  if (intel_state.op_modifier != O_absent
685
0
      && current_templates->start->mnem_off != MN_lea)
686
0
    {
687
0
      i.types[this_operand].bitfield.unspecified = 0;
688
689
0
      switch (intel_state.op_modifier)
690
0
  {
691
0
  case O_byte_ptr:
692
0
    i.types[this_operand].bitfield.byte = 1;
693
0
    suffix = BYTE_MNEM_SUFFIX;
694
0
    break;
695
696
0
  case O_word_ptr:
697
0
    i.types[this_operand].bitfield.word = 1;
698
0
    if (got_a_float == 2) /* "fi..." */
699
0
      suffix = SHORT_MNEM_SUFFIX;
700
0
    else if (current_templates->start->mnem_off != MN_lar
701
0
       && current_templates->start->mnem_off != MN_lsl
702
0
       && current_templates->start->mnem_off != MN_arpl)
703
0
      suffix = WORD_MNEM_SUFFIX;
704
0
    break;
705
706
0
  case O_dword_ptr:
707
0
    i.types[this_operand].bitfield.dword = 1;
708
0
    if ((insn_name (current_templates->start)[0] == 'l'
709
0
         && insn_name (current_templates->start)[2] == 's'
710
0
         && insn_name (current_templates->start)[3] == 0)
711
0
        || current_templates->start->mnem_off == MN_bound)
712
0
      suffix = WORD_MNEM_SUFFIX;
713
0
    else if (flag_code != CODE_32BIT
714
0
       && (current_templates->start->opcode_modifier.jump == JUMP
715
0
           || current_templates->start->opcode_modifier.jump
716
0
        == JUMP_DWORD))
717
0
      {
718
0
        i.far_branch = true;
719
0
        suffix = WORD_MNEM_SUFFIX;
720
0
      }
721
0
    else if (got_a_float == 1) /* "f..." */
722
0
      suffix = SHORT_MNEM_SUFFIX;
723
0
    else
724
0
      suffix = LONG_MNEM_SUFFIX;
725
0
    break;
726
727
0
  case O_fword_ptr:
728
0
    i.types[this_operand].bitfield.fword = 1;
729
0
    if (current_templates->start->mnem_off == MN_les
730
0
        || current_templates->start->mnem_off == MN_lds
731
0
        || current_templates->start->mnem_off == MN_lss
732
0
        || current_templates->start->mnem_off == MN_lfs
733
0
        || current_templates->start->mnem_off == MN_lgs)
734
0
      suffix = LONG_MNEM_SUFFIX;
735
0
    else if (!got_a_float)
736
0
      {
737
0
        if (flag_code == CODE_16BIT)
738
0
    add_prefix (DATA_PREFIX_OPCODE);
739
0
        i.far_branch = true;
740
0
      }
741
0
    break;
742
743
0
  case O_qword_ptr: /* O_mmword_ptr */
744
0
    i.types[this_operand].bitfield.qword = 1;
745
0
    if (current_templates->start->mnem_off == MN_bound
746
0
        || got_a_float == 1) /* "f..." */
747
0
      suffix = LONG_MNEM_SUFFIX;
748
0
    else
749
0
      suffix = QWORD_MNEM_SUFFIX;
750
0
    break;
751
752
0
  case O_tbyte_ptr:
753
0
    i.types[this_operand].bitfield.tbyte = 1;
754
0
    if (got_a_float)
755
0
      break;
756
0
    if (flag_code == CODE_64BIT
757
0
        && (current_templates->start->operand_types[0].bitfield.fword
758
0
      || current_templates->start->operand_types[0].bitfield.tbyte
759
0
      || current_templates->start->opcode_modifier.jump == JUMP_DWORD
760
0
      || current_templates->start->opcode_modifier.jump == JUMP))
761
0
      suffix = QWORD_MNEM_SUFFIX; /* l[fgs]s, [ls][gi]dt, call, jmp */
762
0
    else
763
0
      i.types[this_operand].bitfield.byte = 1; /* cause an error */
764
0
    break;
765
766
0
  case O_oword_ptr: /* O_xmmword_ptr */
767
0
    i.types[this_operand].bitfield.xmmword = 1;
768
0
    break;
769
770
0
  case O_ymmword_ptr:
771
0
    i.types[this_operand].bitfield.ymmword = 1;
772
0
    break;
773
774
0
  case O_zmmword_ptr:
775
0
    i.types[this_operand].bitfield.zmmword = 1;
776
0
    break;
777
778
0
  case O_far_ptr:
779
0
    i.far_branch = true;
780
    /* FALLTHROUGH */
781
0
  case O_near_ptr:
782
0
    if (current_templates->start->opcode_modifier.jump != JUMP
783
0
        && current_templates->start->opcode_modifier.jump != JUMP_DWORD)
784
0
      {
785
        /* cause an error */
786
0
        i.types[this_operand].bitfield.byte = 1;
787
0
        i.types[this_operand].bitfield.tbyte = 1;
788
0
        suffix = i.suffix;
789
0
      }
790
0
    break;
791
792
0
  default:
793
0
    BAD_CASE (intel_state.op_modifier);
794
0
    break;
795
0
  }
796
797
      /* Now check whether we actually want to infer an AT&T-like suffix.
798
   We really only need to do this when operand size determination (incl.
799
   REX.W) is going to be derived from it.  For this we check whether the
800
   given suffix is valid for any of the candidate templates.  */
801
0
      if (suffix && suffix != i.suffix
802
0
    && current_templates->start->mnem_off != MN_bound)
803
0
  {
804
0
    const insn_template *t;
805
806
0
    for (t = current_templates->start; t < current_templates->end; ++t)
807
0
      {
808
        /* Operands haven't been swapped yet.  */
809
0
        unsigned int op = t->operands - 1 - this_operand;
810
811
        /* Easy checks to skip templates which won't match anyway.  */
812
0
        if (this_operand >= t->operands || t->opcode_modifier.attsyntax)
813
0
    continue;
814
815
0
        switch (suffix)
816
0
    {
817
0
    case BYTE_MNEM_SUFFIX:
818
0
      if (t->opcode_modifier.no_bsuf)
819
0
        continue;
820
0
      break;
821
0
    case WORD_MNEM_SUFFIX:
822
0
      if (t->opcode_modifier.no_wsuf)
823
0
        continue;
824
0
      break;
825
0
    case LONG_MNEM_SUFFIX:
826
0
      if (t->opcode_modifier.no_lsuf)
827
0
        continue;
828
0
      break;
829
0
    case QWORD_MNEM_SUFFIX:
830
0
      if (t->opcode_modifier.no_qsuf || !q_suffix_allowed (t))
831
0
        continue;
832
0
      break;
833
0
    case SHORT_MNEM_SUFFIX:
834
0
      if (t->opcode_modifier.no_ssuf)
835
0
        continue;
836
0
      break;
837
0
    default:
838
0
      abort ();
839
0
    }
840
841
        /* We can skip templates with swappable operands here, as one
842
     operand will be a register, which operand size can be
843
     determined from.  */
844
0
        if (t->opcode_modifier.d)
845
0
    continue;
846
847
        /* In a few cases suffixes are permitted, but we can nevertheless
848
     derive that these aren't going to be needed.  This is only of
849
     interest for insns using ModR/M.  */
850
0
        if (!t->opcode_modifier.modrm)
851
0
    break;
852
853
0
        if (!t->operand_types[op].bitfield.baseindex)
854
0
    continue;
855
856
0
        switch (t->operand_types[op].bitfield.class)
857
0
    {
858
0
    case RegMMX:
859
0
    case RegSIMD:
860
0
    case RegMask:
861
0
      continue;
862
0
    }
863
864
0
        break;
865
0
      }
866
867
0
    if (t == current_templates->end)
868
0
      suffix = 0;
869
0
  }
870
871
0
      if (!i.suffix)
872
0
  i.suffix = suffix;
873
0
      else if (suffix && i.suffix != suffix)
874
0
  {
875
0
    as_bad (_("conflicting operand size modifiers"));
876
0
    return 0;
877
0
  }
878
0
    }
879
880
  /* Operands for jump/call need special consideration.  */
881
0
  if (current_templates->start->opcode_modifier.jump == JUMP
882
0
      || current_templates->start->opcode_modifier.jump == JUMP_DWORD
883
0
      || current_templates->start->opcode_modifier.jump == JUMP_INTERSEGMENT)
884
0
    {
885
0
      bool jumpabsolute = false;
886
887
0
      if (i.op[this_operand].regs
888
0
    || intel_state.base
889
0
    || intel_state.index
890
0
    || intel_state.is_mem > 1)
891
0
  jumpabsolute = true;
892
0
      else
893
0
  switch (intel_state.op_modifier)
894
0
    {
895
0
    case O_near_ptr:
896
0
      if (intel_state.seg)
897
0
        jumpabsolute = true;
898
0
      else
899
0
        intel_state.is_mem = 1;
900
0
      break;
901
0
    case O_far_ptr:
902
0
    case O_absent:
903
0
      if (!intel_state.seg)
904
0
        {
905
0
    intel_state.is_mem = 1;
906
0
    if (intel_state.op_modifier == O_absent)
907
0
      {
908
0
        if (intel_state.is_indirect == 1)
909
0
          jumpabsolute = true;
910
0
        break;
911
0
      }
912
0
    as_bad (_("cannot infer the segment part of the operand"));
913
0
    return 0;
914
0
        }
915
0
      else if (S_GET_SEGMENT (intel_state.seg) == reg_section)
916
0
        {
917
0
    jumpabsolute = true;
918
0
    if (intel_state.op_modifier == O_far_ptr)
919
0
      i.far_branch = true;
920
0
        }
921
0
      else
922
0
        {
923
0
    i386_operand_type types;
924
925
0
    if (i.imm_operands >= MAX_IMMEDIATE_OPERANDS)
926
0
      {
927
0
        as_bad (_("at most %d immediate operands are allowed"),
928
0
          MAX_IMMEDIATE_OPERANDS);
929
0
        return 0;
930
0
      }
931
0
    expP = &im_expressions[i.imm_operands++];
932
0
    memset (expP, 0, sizeof(*expP));
933
0
    expP->X_op = O_symbol;
934
0
    expP->X_add_symbol = intel_state.seg;
935
0
    i.op[this_operand].imms = expP;
936
937
0
    resolve_expression (expP);
938
0
    operand_type_set (&types, ~0);
939
0
    if (!i386_finalize_immediate (S_GET_SEGMENT (intel_state.seg),
940
0
                expP, types, operand_string))
941
0
      return 0;
942
0
    if (i.operands < MAX_OPERANDS)
943
0
      {
944
0
        this_operand = i.operands++;
945
0
        i.types[this_operand].bitfield.unspecified = 1;
946
0
      }
947
0
    intel_state.seg = NULL;
948
0
    intel_state.is_mem = 0;
949
0
        }
950
0
      break;
951
0
    default:
952
0
      jumpabsolute = true;
953
0
      break;
954
0
    }
955
0
      if (jumpabsolute)
956
0
  {
957
0
    i.jumpabsolute = true;
958
0
    intel_state.is_mem |= 1;
959
0
  }
960
0
    }
961
0
  else if (intel_state.seg)
962
0
    intel_state.is_mem |= 1;
963
964
0
  if (i.op[this_operand].regs)
965
0
    {
966
0
      i386_operand_type temp;
967
968
      /* Register operand.  */
969
0
      if (intel_state.base || intel_state.index || intel_state.seg
970
0
          || i.imm_bits[this_operand])
971
0
  {
972
0
    as_bad (_("invalid operand"));
973
0
    return 0;
974
0
  }
975
976
0
      temp = i.op[this_operand].regs->reg_type;
977
0
      temp.bitfield.baseindex = 0;
978
0
      i.types[this_operand] = operand_type_or (i.types[this_operand],
979
0
                 temp);
980
0
      i.types[this_operand].bitfield.unspecified = 0;
981
0
      ++i.reg_operands;
982
983
0
      if ((i.rounding.type != rc_none && !i.rounding.modifier
984
0
     && temp.bitfield.class != Reg)
985
0
    || rc_sae_modifier)
986
0
  {
987
0
    unsigned int j;
988
989
0
    for (j = 0; j < ARRAY_SIZE (RC_NamesTable); ++j)
990
0
      if (i.rounding.type == RC_NamesTable[j].type)
991
0
        break;
992
0
    as_bad (_("`%s': misplaced `{%s}'"),
993
0
      insn_name (current_templates->start), RC_NamesTable[j].name);
994
0
    return 0;
995
0
  }
996
0
    }
997
0
  else if (intel_state.base
998
0
     || intel_state.index
999
0
     || intel_state.seg
1000
0
     || intel_state.is_mem)
1001
0
    {
1002
      /* Memory operand.  */
1003
0
      if (i.imm_bits[this_operand])
1004
0
  {
1005
0
    as_bad (_("invalid operand"));
1006
0
    return 0;
1007
0
  }
1008
1009
0
      if (i.mem_operands)
1010
0
  {
1011
    /* Handle
1012
1013
       call 0x9090,0x90909090
1014
       lcall  0x9090,0x90909090
1015
       jmp  0x9090,0x90909090
1016
       ljmp 0x9090,0x90909090
1017
     */
1018
1019
0
    if ((current_templates->start->opcode_modifier.jump == JUMP_INTERSEGMENT
1020
0
         || current_templates->start->opcode_modifier.jump == JUMP_DWORD
1021
0
         || current_templates->start->opcode_modifier.jump == JUMP)
1022
0
        && this_operand == 1
1023
0
        && intel_state.seg == NULL
1024
0
        && i.mem_operands == 1
1025
0
        && i.disp_operands == 1
1026
0
        && intel_state.op_modifier == O_absent)
1027
0
      {
1028
        /* Try to process the first operand as immediate,  */
1029
0
        this_operand = 0;
1030
0
        if (i386_finalize_immediate (exp_seg, i.op[0].imms,
1031
0
             intel_state.reloc_types,
1032
0
             NULL))
1033
0
    {
1034
0
      this_operand = 1;
1035
0
      expP = &im_expressions[0];
1036
0
      i.op[this_operand].imms = expP;
1037
0
      *expP = exp;
1038
1039
      /* Try to process the second operand as immediate,  */
1040
0
      if (i386_finalize_immediate (exp_seg, expP,
1041
0
                 intel_state.reloc_types,
1042
0
                 NULL))
1043
0
        {
1044
0
          i.mem_operands = 0;
1045
0
          i.disp_operands = 0;
1046
0
          i.imm_operands = 2;
1047
0
          i.flags[0] &= ~Operand_Mem;
1048
0
          i.types[0].bitfield.disp16 = 0;
1049
0
          i.types[0].bitfield.disp32 = 0;
1050
0
          return 1;
1051
0
        }
1052
0
    }
1053
0
      }
1054
0
  }
1055
1056
      /* Swap base and index in 16-bit memory operands like
1057
   [si+bx]. Since i386_index_check is also used in AT&T
1058
   mode we have to do this here.  */
1059
0
      if (intel_state.base
1060
0
    && intel_state.index
1061
0
    && intel_state.base->reg_type.bitfield.word
1062
0
    && intel_state.index->reg_type.bitfield.word
1063
0
    && intel_state.base->reg_num >= 6
1064
0
    && intel_state.index->reg_num < 6)
1065
0
  {
1066
0
    i.base_reg = intel_state.index;
1067
0
    i.index_reg = intel_state.base;
1068
0
  }
1069
0
      else
1070
0
  {
1071
0
    i.base_reg = intel_state.base;
1072
0
    i.index_reg = intel_state.index;
1073
0
  }
1074
1075
0
      if (i.base_reg || i.index_reg)
1076
0
  i.types[this_operand].bitfield.baseindex = 1;
1077
1078
0
      expP = &disp_expressions[i.disp_operands];
1079
0
      memcpy (expP, &exp, sizeof(exp));
1080
0
      resolve_expression (expP);
1081
1082
0
      if (expP->X_op != O_constant
1083
0
    || expP->X_add_number
1084
0
    || !i.types[this_operand].bitfield.baseindex)
1085
0
  {
1086
0
    i.op[this_operand].disps = expP;
1087
0
    i.disp_operands++;
1088
1089
0
    i386_addressing_mode ();
1090
1091
0
    if (flag_code == CODE_64BIT)
1092
0
      {
1093
0
        i.types[this_operand].bitfield.disp32 = 1;
1094
0
        if (!i.prefix[ADDR_PREFIX])
1095
0
    i.types[this_operand].bitfield.disp64 = 1;
1096
0
      }
1097
0
    else if (!i.prefix[ADDR_PREFIX] ^ (flag_code == CODE_16BIT))
1098
0
      i.types[this_operand].bitfield.disp32 = 1;
1099
0
    else
1100
0
      i.types[this_operand].bitfield.disp16 = 1;
1101
1102
#if defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT)
1103
    /*
1104
     * exp_seg is used only for verification in
1105
     * i386_finalize_displacement, and we can end up seeing reg_section
1106
     * here - but we know we removed all registers from the expression
1107
     * (or error-ed on any remaining ones) in i386_intel_simplify.  I
1108
     * consider the check in i386_finalize_displacement bogus anyway, in
1109
     * particular because it doesn't allow for expr_section, so I'd
1110
     * rather see that check (and the similar one in
1111
     * i386_finalize_immediate) use SEG_NORMAL(), but not being an a.out
1112
     * expert I can't really say whether that would have other bad side
1113
     * effects.
1114
     */
1115
    if (OUTPUT_FLAVOR == bfd_target_aout_flavour
1116
        && exp_seg == reg_section)
1117
      exp_seg = expP->X_op != O_constant ? undefined_section
1118
                 : absolute_section;
1119
#endif
1120
1121
0
    if (!i386_finalize_displacement (exp_seg, expP,
1122
0
             intel_state.reloc_types,
1123
0
             operand_string))
1124
0
      return 0;
1125
0
  }
1126
1127
0
      if (intel_state.seg)
1128
0
  {
1129
0
    for (ret = check_none; ; ret = operand_check)
1130
0
      {
1131
0
        expP = symbol_get_value_expression (intel_state.seg);
1132
0
        if (expP->X_op != O_full_ptr 
1133
0
      || symbol_get_value_expression (expP->X_op_symbol)->X_op
1134
0
         != O_register)
1135
0
    break;
1136
0
        intel_state.seg = expP->X_add_symbol;
1137
0
      }
1138
0
    if (expP->X_op != O_register)
1139
0
      {
1140
0
        as_bad (_("segment register name expected"));
1141
0
        return 0;
1142
0
      }
1143
0
    if (i386_regtab[expP->X_add_number].reg_type.bitfield.class != SReg)
1144
0
      {
1145
0
        as_bad (_("invalid use of register"));
1146
0
        return 0;
1147
0
      }
1148
0
    switch (ret)
1149
0
      {
1150
0
      case check_error:
1151
0
        as_bad (_("redundant segment overrides"));
1152
0
        return 0;
1153
0
      case check_warning:
1154
0
        as_warn (_("redundant segment overrides"));
1155
0
        break;
1156
0
      }
1157
0
    if (i386_regtab[expP->X_add_number].reg_num == RegFlat)
1158
0
      i.seg[i.mem_operands] = NULL;
1159
0
    else
1160
0
      i.seg[i.mem_operands] = &i386_regtab[expP->X_add_number];
1161
0
  }
1162
1163
0
      if (!i386_index_check (operand_string))
1164
0
  return 0;
1165
1166
0
      i.flags[this_operand] |= Operand_Mem;
1167
0
      ++i.mem_operands;
1168
0
    }
1169
0
  else
1170
0
    {
1171
      /* Immediate.  */
1172
0
      if (i.imm_operands >= MAX_IMMEDIATE_OPERANDS)
1173
0
  {
1174
0
    as_bad (_("at most %d immediate operands are allowed"),
1175
0
      MAX_IMMEDIATE_OPERANDS);
1176
0
    return 0;
1177
0
  }
1178
1179
0
      expP = &im_expressions[i.imm_operands++];
1180
0
      i.op[this_operand].imms = expP;
1181
0
      *expP = exp;
1182
1183
0
      return i386_finalize_immediate (exp_seg, expP, intel_state.reloc_types,
1184
0
              operand_string);
1185
0
    }
1186
1187
0
  return 1;
1188
0
}