x86/Intel: address quoted-symbol related FIXMEs
[binutils-gdb.git] / gas / config / tc-i386-intel.c
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 #define O_offset O_md32
41 /* offset X_add_symbol */
42 #define O_short O_md31
43 /* near ptr X_add_symbol */
44 #define O_near_ptr O_md30
45 /* far ptr X_add_symbol */
46 #define O_far_ptr O_md29
47 /* byte ptr X_add_symbol */
48 #define O_byte_ptr O_md28
49 /* word ptr X_add_symbol */
50 #define O_word_ptr O_md27
51 /* dword ptr X_add_symbol */
52 #define O_dword_ptr O_md26
53 /* qword ptr X_add_symbol */
54 #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 #define O_fword_ptr O_md24
59 /* tbyte ptr X_add_symbol */
60 #define O_tbyte_ptr O_md23
61 /* oword ptr X_add_symbol */
62 #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 #define O_ymmword_ptr O_md21
67 /* zmmword ptr X_add_symbol */
68 #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 {
124 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 if (!intel_syntax)
137 return O_absent;
138
139 if (!name)
140 {
141 if (operands != 2)
142 return O_illegal;
143 switch (*input_line_pointer)
144 {
145 case ':':
146 ++input_line_pointer;
147 return O_full_ptr;
148 case '[':
149 ++input_line_pointer;
150 return O_index;
151 case '@':
152 if (this_operand >= 0 && i.reloc[this_operand] == NO_RELOC)
153 {
154 int adjust = 0;
155 char *gotfree_input_line = lex_got (&i.reloc[this_operand],
156 &adjust,
157 &intel_state.reloc_types);
158
159 if (!gotfree_input_line)
160 break;
161 free (gotfree_input_line);
162 *input_line_pointer++ = '+';
163 memset (input_line_pointer, '0', adjust - 1);
164 input_line_pointer[adjust - 1] = ' ';
165 return O_add;
166 }
167 break;
168 }
169 return O_illegal;
170 }
171
172 /* See the quotation related comment in i386_parse_name(). */
173 if (*pc == '"')
174 return O_absent;
175
176 for (j = 0; i386_operators[j].name; ++j)
177 if (strcasecmp (i386_operators[j].name, name) == 0)
178 {
179 if (i386_operators[j].operands
180 && i386_operators[j].operands != operands)
181 return O_illegal;
182 return i386_operators[j].op;
183 }
184
185 for (j = 0; i386_types[j].name; ++j)
186 if (strcasecmp (i386_types[j].name, name) == 0)
187 break;
188
189 if (i386_types[j].name && *pc == ' ')
190 {
191 const char *start = ++input_line_pointer;
192 char *pname;
193 char c = get_symbol_name (&pname);
194
195 if (strcasecmp (pname, "ptr") == 0 && (c != '"' || pname == start))
196 {
197 pname[-1] = *pc;
198 *pc = c;
199 if (intel_syntax > 0 || operands != 1)
200 return O_illegal;
201 return i386_types[j].op;
202 }
203
204 if (strcasecmp (pname, "bcst") == 0 && (c != '"' || pname == start))
205 {
206 pname[-1] = *pc;
207 *pc = c;
208 if (intel_syntax > 0 || operands != 1
209 || i386_types[j].sz[0] > 8
210 || (i386_types[j].sz[0] & (i386_types[j].sz[0] - 1)))
211 return O_illegal;
212 if (!i.broadcast.bytes && !i.broadcast.type)
213 {
214 i.broadcast.bytes = i386_types[j].sz[0];
215 i.broadcast.operand = this_operand;
216 }
217 return i386_types[j].op;
218 }
219
220 (void) restore_line_pointer (c);
221 input_line_pointer = pname - 1;
222 }
223
224 return O_absent;
225 }
226
227 static int i386_intel_parse_name (const char *name, expressionS *e)
228 {
229 unsigned int j;
230
231 if (! strcmp (name, "$"))
232 {
233 current_location (e);
234 return 1;
235 }
236
237 for (j = 0; i386_types[j].name; ++j)
238 if (strcasecmp(i386_types[j].name, name) == 0)
239 {
240 e->X_op = O_constant;
241 e->X_add_number = i386_types[j].sz[flag_code];
242 e->X_add_symbol = NULL;
243 e->X_op_symbol = NULL;
244 return 1;
245 }
246
247 return 0;
248 }
249
250 static INLINE int i386_intel_check (const reg_entry *rreg,
251 const reg_entry *base,
252 const reg_entry *iindex)
253 {
254 if ((this_operand >= 0
255 && rreg != i.op[this_operand].regs)
256 || base != intel_state.base
257 || iindex != intel_state.index)
258 {
259 as_bad (_("invalid use of register"));
260 return 0;
261 }
262 return 1;
263 }
264
265 static INLINE void i386_intel_fold (expressionS *e, symbolS *sym)
266 {
267 expressionS *exp = symbol_get_value_expression (sym);
268 if (S_GET_SEGMENT (sym) == absolute_section)
269 {
270 offsetT val = e->X_add_number;
271
272 *e = *exp;
273 e->X_add_number += val;
274 }
275 else
276 {
277 if (exp->X_op == O_symbol
278 && strcmp (S_GET_NAME (exp->X_add_symbol),
279 GLOBAL_OFFSET_TABLE_NAME) == 0)
280 sym = exp->X_add_symbol;
281 e->X_add_symbol = sym;
282 e->X_op_symbol = NULL;
283 e->X_op = O_symbol;
284 }
285 }
286
287 static int
288 i386_intel_simplify_register (expressionS *e)
289 {
290 int reg_num;
291
292 if (this_operand < 0 || intel_state.in_offset)
293 {
294 as_bad (_("invalid use of register"));
295 return 0;
296 }
297
298 if (e->X_op == O_register)
299 reg_num = e->X_add_number;
300 else
301 reg_num = e->X_md - 1;
302
303 if (reg_num < 0 || reg_num >= (int) i386_regtab_size)
304 {
305 as_bad (_("invalid register number"));
306 return 0;
307 }
308
309 if (!check_register (&i386_regtab[reg_num]))
310 {
311 as_bad (_("register '%s%s' cannot be used here"),
312 register_prefix, i386_regtab[reg_num].reg_name);
313 return 0;
314 }
315
316 if (!intel_state.in_bracket)
317 {
318 if (i.op[this_operand].regs)
319 {
320 as_bad (_("invalid use of register"));
321 return 0;
322 }
323 if ((i386_regtab[reg_num].reg_type.bitfield.class == SReg
324 && i386_regtab[reg_num].reg_num == RegFlat)
325 || (dot_insn ()
326 && i386_regtab[reg_num].reg_type.bitfield.class == ClassNone))
327 {
328 as_bad (_("invalid use of pseudo-register"));
329 return 0;
330 }
331 i.op[this_operand].regs = i386_regtab + reg_num;
332 }
333 else if (!intel_state.index
334 && (i386_regtab[reg_num].reg_type.bitfield.xmmword
335 || i386_regtab[reg_num].reg_type.bitfield.ymmword
336 || i386_regtab[reg_num].reg_type.bitfield.zmmword
337 || i386_regtab[reg_num].reg_num == RegIZ))
338 intel_state.index = i386_regtab + reg_num;
339 else if (!intel_state.base && !intel_state.in_scale)
340 intel_state.base = i386_regtab + reg_num;
341 else if (!intel_state.index)
342 {
343 const insn_template *t = current_templates->start;
344
345 if (intel_state.in_scale
346 || i386_regtab[reg_num].reg_type.bitfield.baseindex
347 || dot_insn ()
348 || t->mnem_off == MN_bndmk
349 || t->mnem_off == MN_bndldx
350 || t->mnem_off == MN_bndstx)
351 intel_state.index = i386_regtab + reg_num;
352 else
353 {
354 /* Convert base to index and make ESP/RSP the base. */
355 intel_state.index = intel_state.base;
356 intel_state.base = i386_regtab + reg_num;
357 }
358 }
359 else
360 {
361 /* esp is invalid as index */
362 intel_state.index = reg_eax + ESP_REG_NUM;
363 }
364 return 2;
365 }
366
367 static int i386_intel_simplify (expressionS *);
368
369 static INLINE int i386_intel_simplify_symbol(symbolS *sym)
370 {
371 int ret = i386_intel_simplify (symbol_get_value_expression (sym));
372
373 if (ret == 2)
374 {
375 S_SET_SEGMENT(sym, absolute_section);
376 ret = 1;
377 }
378 return ret;
379 }
380
381 static int i386_intel_simplify (expressionS *e)
382 {
383 const reg_entry *the_reg = (this_operand >= 0
384 ? i.op[this_operand].regs : NULL);
385 const reg_entry *base = intel_state.base;
386 const reg_entry *state_index = intel_state.index;
387 int ret;
388
389 if (!intel_syntax)
390 return 1;
391
392 switch (e->X_op)
393 {
394 case O_index:
395 if (e->X_add_symbol)
396 {
397 if (!i386_intel_simplify_symbol (e->X_add_symbol)
398 || !i386_intel_check(the_reg, intel_state.base,
399 intel_state.index))
400 return 0;
401 }
402 if (!intel_state.in_offset)
403 ++intel_state.in_bracket;
404 ret = i386_intel_simplify_symbol (e->X_op_symbol);
405 if (!intel_state.in_offset)
406 --intel_state.in_bracket;
407 if (!ret)
408 return 0;
409 if (e->X_add_symbol)
410 e->X_op = O_add;
411 else
412 i386_intel_fold (e, e->X_op_symbol);
413 break;
414
415 case O_offset:
416 intel_state.has_offset = 1;
417 ++intel_state.in_offset;
418 ret = i386_intel_simplify_symbol (e->X_add_symbol);
419 --intel_state.in_offset;
420 if (!ret || !i386_intel_check(the_reg, base, state_index))
421 return 0;
422 i386_intel_fold (e, e->X_add_symbol);
423 return ret;
424
425 case O_byte_ptr:
426 case O_word_ptr:
427 case O_dword_ptr:
428 case O_fword_ptr:
429 case O_qword_ptr: /* O_mmword_ptr */
430 case O_tbyte_ptr:
431 case O_oword_ptr: /* O_xmmword_ptr */
432 case O_ymmword_ptr:
433 case O_zmmword_ptr:
434 case O_near_ptr:
435 case O_far_ptr:
436 if (intel_state.op_modifier == O_absent)
437 intel_state.op_modifier = e->X_op;
438 /* FALLTHROUGH */
439 case O_short:
440 if (symbol_get_value_expression (e->X_add_symbol)->X_op
441 == O_register)
442 {
443 as_bad (_("invalid use of register"));
444 return 0;
445 }
446 if (!i386_intel_simplify_symbol (e->X_add_symbol))
447 return 0;
448 i386_intel_fold (e, e->X_add_symbol);
449 break;
450
451 case O_full_ptr:
452 if (symbol_get_value_expression (e->X_op_symbol)->X_op
453 == O_register)
454 {
455 as_bad (_("invalid use of register"));
456 return 0;
457 }
458 if (!i386_intel_simplify_symbol (e->X_op_symbol)
459 || !i386_intel_check(the_reg, intel_state.base,
460 intel_state.index))
461 return 0;
462 if (!intel_state.in_offset)
463 {
464 if (!intel_state.seg)
465 intel_state.seg = e->X_add_symbol;
466 else
467 {
468 expressionS exp;
469
470 exp.X_op = O_full_ptr;
471 exp.X_add_symbol = e->X_add_symbol;
472 exp.X_op_symbol = intel_state.seg;
473 intel_state.seg = make_expr_symbol (&exp);
474 }
475 }
476 i386_intel_fold (e, e->X_op_symbol);
477 break;
478
479 case O_multiply:
480 if (this_operand >= 0 && intel_state.in_bracket)
481 {
482 expressionS *scale = NULL;
483 int has_index = (intel_state.index != NULL);
484
485 if (!intel_state.in_scale++)
486 intel_state.scale_factor = 1;
487
488 ret = i386_intel_simplify_symbol (e->X_add_symbol);
489 if (ret && !has_index && intel_state.index)
490 scale = symbol_get_value_expression (e->X_op_symbol);
491
492 if (ret)
493 ret = i386_intel_simplify_symbol (e->X_op_symbol);
494 if (ret && !scale && !has_index && intel_state.index)
495 scale = symbol_get_value_expression (e->X_add_symbol);
496
497 if (ret && scale)
498 {
499 resolve_expression (scale);
500 if (scale->X_op != O_constant
501 || intel_state.index->reg_type.bitfield.word)
502 scale->X_add_number = 0;
503 intel_state.scale_factor *= scale->X_add_number;
504 }
505
506 --intel_state.in_scale;
507 if (!ret)
508 return 0;
509
510 if (!intel_state.in_scale)
511 switch (intel_state.scale_factor)
512 {
513 case 1:
514 i.log2_scale_factor = 0;
515 break;
516 case 2:
517 i.log2_scale_factor = 1;
518 break;
519 case 4:
520 i.log2_scale_factor = 2;
521 break;
522 case 8:
523 i.log2_scale_factor = 3;
524 break;
525 default:
526 /* esp is invalid as index */
527 intel_state.index = reg_eax + ESP_REG_NUM;
528 break;
529 }
530
531 break;
532 }
533 goto fallthrough;
534
535 case O_register:
536 ret = i386_intel_simplify_register (e);
537 if (ret == 2)
538 {
539 gas_assert (e->X_add_number < (unsigned short) -1);
540 e->X_md = (unsigned short) e->X_add_number + 1;
541 e->X_op = O_constant;
542 e->X_add_number = 0;
543 }
544 return ret;
545
546 case O_constant:
547 if (e->X_md)
548 return i386_intel_simplify_register (e);
549
550 /* FALLTHROUGH */
551 default:
552 fallthrough:
553 if (e->X_add_symbol
554 && !i386_intel_simplify_symbol (e->X_add_symbol))
555 return 0;
556 if (!the_reg && this_operand >= 0
557 && e->X_op == O_symbol && !e->X_add_number)
558 the_reg = i.op[this_operand].regs;
559 if (e->X_op == O_add || e->X_op == O_subtract)
560 {
561 base = intel_state.base;
562 state_index = intel_state.index;
563 }
564 if (!i386_intel_check (the_reg, base, state_index)
565 || (e->X_op_symbol
566 && !i386_intel_simplify_symbol (e->X_op_symbol))
567 || !i386_intel_check (the_reg,
568 (e->X_op != O_add
569 ? base : intel_state.base),
570 (e->X_op != O_add
571 ? state_index : intel_state.index)))
572 return 0;
573 break;
574 }
575
576 if (this_operand >= 0
577 && e->X_op == O_symbol
578 && !intel_state.in_offset)
579 {
580 segT seg = S_GET_SEGMENT (e->X_add_symbol);
581
582 if (seg != absolute_section
583 && seg != reg_section
584 && seg != expr_section)
585 intel_state.is_mem |= 2 - !intel_state.in_bracket;
586 }
587
588 return 1;
589 }
590
591 int i386_need_index_operator (void)
592 {
593 return intel_syntax < 0;
594 }
595
596 static int
597 i386_intel_operand (char *operand_string, int got_a_float)
598 {
599 char *saved_input_line_pointer, *buf;
600 segT exp_seg;
601 expressionS exp, *expP;
602 char suffix = 0;
603 bool rc_sae_modifier = i.rounding.type != rc_none && i.rounding.modifier;
604 int ret;
605
606 /* Handle vector immediates. */
607 if (RC_SAE_immediate (operand_string))
608 {
609 if (i.imm_operands)
610 {
611 as_bad (_("`%s': RC/SAE operand must precede immediate operands"),
612 insn_name (current_templates->start));
613 return 0;
614 }
615
616 return 1;
617 }
618
619 /* Initialize state structure. */
620 intel_state.op_modifier = O_absent;
621 intel_state.is_mem = 0;
622 intel_state.is_indirect = 0;
623 intel_state.has_offset = 0;
624 intel_state.base = NULL;
625 intel_state.index = NULL;
626 intel_state.seg = NULL;
627 operand_type_set (&intel_state.reloc_types, ~0);
628 gas_assert (!intel_state.in_offset);
629 gas_assert (!intel_state.in_bracket);
630 gas_assert (!intel_state.in_scale);
631
632 saved_input_line_pointer = input_line_pointer;
633 input_line_pointer = buf = xstrdup (operand_string);
634
635 intel_syntax = -1;
636 expr_mode = expr_operator_none;
637 memset (&exp, 0, sizeof(exp));
638 exp_seg = expression (&exp);
639 ret = i386_intel_simplify (&exp);
640 intel_syntax = 1;
641
642 SKIP_WHITESPACE ();
643
644 /* Handle vector operations. */
645 if (*input_line_pointer == '{')
646 {
647 char *end = check_VecOperations (input_line_pointer);
648 if (end)
649 input_line_pointer = end;
650 else
651 ret = 0;
652 }
653
654 if (!is_end_of_line[(unsigned char) *input_line_pointer])
655 {
656 if (ret)
657 as_bad (_("junk `%s' after expression"), input_line_pointer);
658 ret = 0;
659 }
660 else if (exp.X_op == O_illegal || exp.X_op == O_absent)
661 {
662 if (ret)
663 as_bad (_("invalid expression"));
664 ret = 0;
665 }
666 else if (!intel_state.has_offset
667 && input_line_pointer > buf
668 && *(input_line_pointer - 1) == ']')
669 {
670 intel_state.is_mem |= 1;
671 intel_state.is_indirect = 1;
672 }
673
674 input_line_pointer = saved_input_line_pointer;
675 free (buf);
676
677 gas_assert (!intel_state.in_offset);
678 gas_assert (!intel_state.in_bracket);
679 gas_assert (!intel_state.in_scale);
680
681 if (!ret)
682 return 0;
683
684 if (intel_state.op_modifier != O_absent
685 && current_templates->start->mnem_off != MN_lea)
686 {
687 i.types[this_operand].bitfield.unspecified = 0;
688
689 switch (intel_state.op_modifier)
690 {
691 case O_byte_ptr:
692 i.types[this_operand].bitfield.byte = 1;
693 suffix = BYTE_MNEM_SUFFIX;
694 break;
695
696 case O_word_ptr:
697 i.types[this_operand].bitfield.word = 1;
698 if (got_a_float == 2) /* "fi..." */
699 suffix = SHORT_MNEM_SUFFIX;
700 else if (current_templates->start->mnem_off != MN_lar
701 && current_templates->start->mnem_off != MN_lsl
702 && current_templates->start->mnem_off != MN_arpl)
703 suffix = WORD_MNEM_SUFFIX;
704 break;
705
706 case O_dword_ptr:
707 i.types[this_operand].bitfield.dword = 1;
708 if ((insn_name (current_templates->start)[0] == 'l'
709 && insn_name (current_templates->start)[2] == 's'
710 && insn_name (current_templates->start)[3] == 0)
711 || current_templates->start->mnem_off == MN_bound)
712 suffix = WORD_MNEM_SUFFIX;
713 else if (flag_code != CODE_32BIT
714 && (current_templates->start->opcode_modifier.jump == JUMP
715 || current_templates->start->opcode_modifier.jump
716 == JUMP_DWORD))
717 {
718 i.far_branch = true;
719 suffix = WORD_MNEM_SUFFIX;
720 }
721 else if (got_a_float == 1) /* "f..." */
722 suffix = SHORT_MNEM_SUFFIX;
723 else
724 suffix = LONG_MNEM_SUFFIX;
725 break;
726
727 case O_fword_ptr:
728 i.types[this_operand].bitfield.fword = 1;
729 if (current_templates->start->mnem_off == MN_les
730 || current_templates->start->mnem_off == MN_lds
731 || current_templates->start->mnem_off == MN_lss
732 || current_templates->start->mnem_off == MN_lfs
733 || current_templates->start->mnem_off == MN_lgs)
734 suffix = LONG_MNEM_SUFFIX;
735 else if (!got_a_float)
736 {
737 if (flag_code == CODE_16BIT)
738 add_prefix (DATA_PREFIX_OPCODE);
739 i.far_branch = true;
740 }
741 break;
742
743 case O_qword_ptr: /* O_mmword_ptr */
744 i.types[this_operand].bitfield.qword = 1;
745 if (current_templates->start->mnem_off == MN_bound
746 || got_a_float == 1) /* "f..." */
747 suffix = LONG_MNEM_SUFFIX;
748 else
749 suffix = QWORD_MNEM_SUFFIX;
750 break;
751
752 case O_tbyte_ptr:
753 i.types[this_operand].bitfield.tbyte = 1;
754 if (got_a_float)
755 break;
756 if (flag_code == CODE_64BIT
757 && (current_templates->start->operand_types[0].bitfield.fword
758 || current_templates->start->operand_types[0].bitfield.tbyte
759 || current_templates->start->opcode_modifier.jump == JUMP_DWORD
760 || current_templates->start->opcode_modifier.jump == JUMP))
761 suffix = QWORD_MNEM_SUFFIX; /* l[fgs]s, [ls][gi]dt, call, jmp */
762 else
763 i.types[this_operand].bitfield.byte = 1; /* cause an error */
764 break;
765
766 case O_oword_ptr: /* O_xmmword_ptr */
767 i.types[this_operand].bitfield.xmmword = 1;
768 break;
769
770 case O_ymmword_ptr:
771 i.types[this_operand].bitfield.ymmword = 1;
772 break;
773
774 case O_zmmword_ptr:
775 i.types[this_operand].bitfield.zmmword = 1;
776 break;
777
778 case O_far_ptr:
779 i.far_branch = true;
780 /* FALLTHROUGH */
781 case O_near_ptr:
782 if (current_templates->start->opcode_modifier.jump != JUMP
783 && current_templates->start->opcode_modifier.jump != JUMP_DWORD)
784 {
785 /* cause an error */
786 i.types[this_operand].bitfield.byte = 1;
787 i.types[this_operand].bitfield.tbyte = 1;
788 suffix = i.suffix;
789 }
790 break;
791
792 default:
793 BAD_CASE (intel_state.op_modifier);
794 break;
795 }
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 if (suffix && suffix != i.suffix
802 && current_templates->start->mnem_off != MN_bound)
803 {
804 const insn_template *t;
805
806 for (t = current_templates->start; t < current_templates->end; ++t)
807 {
808 /* Operands haven't been swapped yet. */
809 unsigned int op = t->operands - 1 - this_operand;
810
811 /* Easy checks to skip templates which won't match anyway. */
812 if (this_operand >= t->operands || t->opcode_modifier.attsyntax)
813 continue;
814
815 switch (suffix)
816 {
817 case BYTE_MNEM_SUFFIX:
818 if (t->opcode_modifier.no_bsuf)
819 continue;
820 break;
821 case WORD_MNEM_SUFFIX:
822 if (t->opcode_modifier.no_wsuf)
823 continue;
824 break;
825 case LONG_MNEM_SUFFIX:
826 if (t->opcode_modifier.no_lsuf)
827 continue;
828 break;
829 case QWORD_MNEM_SUFFIX:
830 if (t->opcode_modifier.no_qsuf || !q_suffix_allowed (t))
831 continue;
832 break;
833 case SHORT_MNEM_SUFFIX:
834 if (t->opcode_modifier.no_ssuf)
835 continue;
836 break;
837 default:
838 abort ();
839 }
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 if (t->opcode_modifier.d)
845 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 if (!t->opcode_modifier.modrm)
851 break;
852
853 if (!t->operand_types[op].bitfield.baseindex)
854 continue;
855
856 switch (t->operand_types[op].bitfield.class)
857 {
858 case RegMMX:
859 case RegSIMD:
860 case RegMask:
861 continue;
862 }
863
864 break;
865 }
866
867 if (t == current_templates->end)
868 suffix = 0;
869 }
870
871 if (!i.suffix)
872 i.suffix = suffix;
873 else if (suffix && i.suffix != suffix)
874 {
875 as_bad (_("conflicting operand size modifiers"));
876 return 0;
877 }
878 }
879
880 /* Operands for jump/call need special consideration. */
881 if (current_templates->start->opcode_modifier.jump == JUMP
882 || current_templates->start->opcode_modifier.jump == JUMP_DWORD
883 || current_templates->start->opcode_modifier.jump == JUMP_INTERSEGMENT)
884 {
885 bool jumpabsolute = false;
886
887 if (i.op[this_operand].regs
888 || intel_state.base
889 || intel_state.index
890 || intel_state.is_mem > 1)
891 jumpabsolute = true;
892 else
893 switch (intel_state.op_modifier)
894 {
895 case O_near_ptr:
896 if (intel_state.seg)
897 jumpabsolute = true;
898 else
899 intel_state.is_mem = 1;
900 break;
901 case O_far_ptr:
902 case O_absent:
903 if (!intel_state.seg)
904 {
905 intel_state.is_mem = 1;
906 if (intel_state.op_modifier == O_absent)
907 {
908 if (intel_state.is_indirect == 1)
909 jumpabsolute = true;
910 break;
911 }
912 as_bad (_("cannot infer the segment part of the operand"));
913 return 0;
914 }
915 else if (S_GET_SEGMENT (intel_state.seg) == reg_section)
916 {
917 jumpabsolute = true;
918 if (intel_state.op_modifier == O_far_ptr)
919 i.far_branch = true;
920 }
921 else
922 {
923 i386_operand_type types;
924
925 if (i.imm_operands >= MAX_IMMEDIATE_OPERANDS)
926 {
927 as_bad (_("at most %d immediate operands are allowed"),
928 MAX_IMMEDIATE_OPERANDS);
929 return 0;
930 }
931 expP = &im_expressions[i.imm_operands++];
932 memset (expP, 0, sizeof(*expP));
933 expP->X_op = O_symbol;
934 expP->X_add_symbol = intel_state.seg;
935 i.op[this_operand].imms = expP;
936
937 resolve_expression (expP);
938 operand_type_set (&types, ~0);
939 if (!i386_finalize_immediate (S_GET_SEGMENT (intel_state.seg),
940 expP, types, operand_string))
941 return 0;
942 if (i.operands < MAX_OPERANDS)
943 {
944 this_operand = i.operands++;
945 i.types[this_operand].bitfield.unspecified = 1;
946 }
947 intel_state.seg = NULL;
948 intel_state.is_mem = 0;
949 }
950 break;
951 default:
952 jumpabsolute = true;
953 break;
954 }
955 if (jumpabsolute)
956 {
957 i.jumpabsolute = true;
958 intel_state.is_mem |= 1;
959 }
960 }
961 else if (intel_state.seg)
962 intel_state.is_mem |= 1;
963
964 if (i.op[this_operand].regs)
965 {
966 i386_operand_type temp;
967
968 /* Register operand. */
969 if (intel_state.base || intel_state.index || intel_state.seg
970 || i.imm_bits[this_operand])
971 {
972 as_bad (_("invalid operand"));
973 return 0;
974 }
975
976 temp = i.op[this_operand].regs->reg_type;
977 temp.bitfield.baseindex = 0;
978 i.types[this_operand] = operand_type_or (i.types[this_operand],
979 temp);
980 i.types[this_operand].bitfield.unspecified = 0;
981 ++i.reg_operands;
982
983 if ((i.rounding.type != rc_none && !i.rounding.modifier
984 && temp.bitfield.class != Reg)
985 || rc_sae_modifier)
986 {
987 unsigned int j;
988
989 for (j = 0; j < ARRAY_SIZE (RC_NamesTable); ++j)
990 if (i.rounding.type == RC_NamesTable[j].type)
991 break;
992 as_bad (_("`%s': misplaced `{%s}'"),
993 insn_name (current_templates->start), RC_NamesTable[j].name);
994 return 0;
995 }
996 }
997 else if (intel_state.base
998 || intel_state.index
999 || intel_state.seg
1000 || intel_state.is_mem)
1001 {
1002 /* Memory operand. */
1003 if (i.imm_bits[this_operand])
1004 {
1005 as_bad (_("invalid operand"));
1006 return 0;
1007 }
1008
1009 if (i.mem_operands)
1010 {
1011 /* Handle
1012
1013 call 0x9090,0x90909090
1014 lcall 0x9090,0x90909090
1015 jmp 0x9090,0x90909090
1016 ljmp 0x9090,0x90909090
1017 */
1018
1019 if ((current_templates->start->opcode_modifier.jump == JUMP_INTERSEGMENT
1020 || current_templates->start->opcode_modifier.jump == JUMP_DWORD
1021 || current_templates->start->opcode_modifier.jump == JUMP)
1022 && this_operand == 1
1023 && intel_state.seg == NULL
1024 && i.mem_operands == 1
1025 && i.disp_operands == 1
1026 && intel_state.op_modifier == O_absent)
1027 {
1028 /* Try to process the first operand as immediate, */
1029 this_operand = 0;
1030 if (i386_finalize_immediate (exp_seg, i.op[0].imms,
1031 intel_state.reloc_types,
1032 NULL))
1033 {
1034 this_operand = 1;
1035 expP = &im_expressions[0];
1036 i.op[this_operand].imms = expP;
1037 *expP = exp;
1038
1039 /* Try to process the second operand as immediate, */
1040 if (i386_finalize_immediate (exp_seg, expP,
1041 intel_state.reloc_types,
1042 NULL))
1043 {
1044 i.mem_operands = 0;
1045 i.disp_operands = 0;
1046 i.imm_operands = 2;
1047 i.flags[0] &= ~Operand_Mem;
1048 i.types[0].bitfield.disp16 = 0;
1049 i.types[0].bitfield.disp32 = 0;
1050 return 1;
1051 }
1052 }
1053 }
1054 }
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 if (intel_state.base
1060 && intel_state.index
1061 && intel_state.base->reg_type.bitfield.word
1062 && intel_state.index->reg_type.bitfield.word
1063 && intel_state.base->reg_num >= 6
1064 && intel_state.index->reg_num < 6)
1065 {
1066 i.base_reg = intel_state.index;
1067 i.index_reg = intel_state.base;
1068 }
1069 else
1070 {
1071 i.base_reg = intel_state.base;
1072 i.index_reg = intel_state.index;
1073 }
1074
1075 if (i.base_reg || i.index_reg)
1076 i.types[this_operand].bitfield.baseindex = 1;
1077
1078 expP = &disp_expressions[i.disp_operands];
1079 memcpy (expP, &exp, sizeof(exp));
1080 resolve_expression (expP);
1081
1082 if (expP->X_op != O_constant
1083 || expP->X_add_number
1084 || !i.types[this_operand].bitfield.baseindex)
1085 {
1086 i.op[this_operand].disps = expP;
1087 i.disp_operands++;
1088
1089 i386_addressing_mode ();
1090
1091 if (flag_code == CODE_64BIT)
1092 {
1093 i.types[this_operand].bitfield.disp32 = 1;
1094 if (!i.prefix[ADDR_PREFIX])
1095 i.types[this_operand].bitfield.disp64 = 1;
1096 }
1097 else if (!i.prefix[ADDR_PREFIX] ^ (flag_code == CODE_16BIT))
1098 i.types[this_operand].bitfield.disp32 = 1;
1099 else
1100 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 if (!i386_finalize_displacement (exp_seg, expP,
1122 intel_state.reloc_types,
1123 operand_string))
1124 return 0;
1125 }
1126
1127 if (intel_state.seg)
1128 {
1129 for (ret = check_none; ; ret = operand_check)
1130 {
1131 expP = symbol_get_value_expression (intel_state.seg);
1132 if (expP->X_op != O_full_ptr
1133 || symbol_get_value_expression (expP->X_op_symbol)->X_op
1134 != O_register)
1135 break;
1136 intel_state.seg = expP->X_add_symbol;
1137 }
1138 if (expP->X_op != O_register)
1139 {
1140 as_bad (_("segment register name expected"));
1141 return 0;
1142 }
1143 if (i386_regtab[expP->X_add_number].reg_type.bitfield.class != SReg)
1144 {
1145 as_bad (_("invalid use of register"));
1146 return 0;
1147 }
1148 switch (ret)
1149 {
1150 case check_error:
1151 as_bad (_("redundant segment overrides"));
1152 return 0;
1153 case check_warning:
1154 as_warn (_("redundant segment overrides"));
1155 break;
1156 }
1157 if (i386_regtab[expP->X_add_number].reg_num == RegFlat)
1158 i.seg[i.mem_operands] = NULL;
1159 else
1160 i.seg[i.mem_operands] = &i386_regtab[expP->X_add_number];
1161 }
1162
1163 if (!i386_index_check (operand_string))
1164 return 0;
1165
1166 i.flags[this_operand] |= Operand_Mem;
1167 ++i.mem_operands;
1168 }
1169 else
1170 {
1171 /* Immediate. */
1172 if (i.imm_operands >= MAX_IMMEDIATE_OPERANDS)
1173 {
1174 as_bad (_("at most %d immediate operands are allowed"),
1175 MAX_IMMEDIATE_OPERANDS);
1176 return 0;
1177 }
1178
1179 expP = &im_expressions[i.imm_operands++];
1180 i.op[this_operand].imms = expP;
1181 *expP = exp;
1182
1183 return i386_finalize_immediate (exp_seg, expP, intel_state.reloc_types,
1184 operand_string);
1185 }
1186
1187 return 1;
1188 }