Home | History | Annotate | Download | only in config
      1 /* tc-i386.c -- Assemble Intel syntax code for ix86/x86-64
      2    Copyright (C) 2009-2014 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 multipication 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 /* oword ptr X_add_symbol */
     56 #define O_oword_ptr O_md24
     57 /* fword ptr X_add_symbol */
     58 #define O_fword_ptr O_md23
     59 /* tbyte ptr X_add_symbol */
     60 #define O_tbyte_ptr O_md22
     61 /* xmmword ptr X_add_symbol */
     62 #define O_xmmword_ptr O_md21
     63 /* ymmword ptr X_add_symbol */
     64 #define O_ymmword_ptr O_md20
     65 /* zmmword ptr X_add_symbol */
     66 #define O_zmmword_ptr O_md19
     67 
     68 static struct
     69   {
     70     const char *name;
     71     operatorT op;
     72     unsigned int operands;
     73   }
     74 const i386_operators[] =
     75   {
     76     { "and", O_bit_and, 2 },
     77     { "eq", O_eq, 2 },
     78     { "ge", O_ge, 2 },
     79     { "gt", O_gt, 2 },
     80     { "le", O_le, 2 },
     81     { "lt", O_lt, 2 },
     82     { "mod", O_modulus, 2 },
     83     { "ne", O_ne, 2 },
     84     { "not", O_bit_not, 1 },
     85     { "offset", O_offset, 1 },
     86     { "or", O_bit_inclusive_or, 2 },
     87     { "shl", O_left_shift, 2 },
     88     { "short", O_short, 1 },
     89     { "shr", O_right_shift, 2 },
     90     { "xor", O_bit_exclusive_or, 2 },
     91     { NULL, O_illegal, 0 }
     92   };
     93 
     94 static struct
     95   {
     96     const char *name;
     97     operatorT op;
     98     unsigned short sz[3];
     99   }
    100 const i386_types[] =
    101   {
    102 #define I386_TYPE(t, n) { #t, O_##t##_ptr, { n, n, n } }
    103     I386_TYPE(byte, 1),
    104     I386_TYPE(word, 2),
    105     I386_TYPE(dword, 4),
    106     I386_TYPE(fword, 6),
    107     I386_TYPE(qword, 8),
    108     I386_TYPE(tbyte, 10),
    109     I386_TYPE(oword, 16),
    110     I386_TYPE(xmmword, 16),
    111     I386_TYPE(ymmword, 32),
    112     I386_TYPE(zmmword, 64),
    113 #undef I386_TYPE
    114     { "near", O_near_ptr, { 0xff04, 0xff02, 0xff08 } },
    115     { "far", O_far_ptr, { 0xff06, 0xff05, 0xff06 } },
    116     { NULL, O_illegal, { 0, 0, 0 } }
    117   };
    118 
    119 operatorT i386_operator (const char *name, unsigned int operands, char *pc)
    120 {
    121   unsigned int j;
    122 
    123   if (!intel_syntax)
    124     return O_absent;
    125 
    126   if (!name)
    127     {
    128       if (operands != 2)
    129 	return O_illegal;
    130       switch (*input_line_pointer)
    131 	{
    132 	case ':':
    133 	  ++input_line_pointer;
    134 	  return O_full_ptr;
    135 	case '[':
    136 	  ++input_line_pointer;
    137 	  return O_index;
    138 	case '@':
    139 	  if (this_operand >= 0 && i.reloc[this_operand] == NO_RELOC)
    140 	    {
    141 	      int adjust = 0;
    142 	      char *gotfree_input_line = lex_got (&i.reloc[this_operand],
    143 						  &adjust,
    144 						  &intel_state.reloc_types,
    145 						  (i.bnd_prefix != NULL
    146 						   || add_bnd_prefix));
    147 
    148 	      if (!gotfree_input_line)
    149 		break;
    150 	      free (gotfree_input_line);
    151 	      *input_line_pointer++ = '+';
    152 	      memset (input_line_pointer, '0', adjust - 1);
    153 	      input_line_pointer[adjust - 1] = ' ';
    154 	      return O_add;
    155 	    }
    156 	  break;
    157 	}
    158       return O_illegal;
    159     }
    160 
    161   for (j = 0; i386_operators[j].name; ++j)
    162     if (strcasecmp (i386_operators[j].name, name) == 0)
    163       {
    164 	if (i386_operators[j].operands
    165 	    && i386_operators[j].operands != operands)
    166 	  return O_illegal;
    167 	return i386_operators[j].op;
    168       }
    169 
    170   for (j = 0; i386_types[j].name; ++j)
    171     if (strcasecmp (i386_types[j].name, name) == 0)
    172       break;
    173   if (i386_types[j].name && *pc == ' ')
    174     {
    175       char *pname = ++input_line_pointer;
    176       char c = get_symbol_end ();
    177 
    178       if (strcasecmp (pname, "ptr") == 0)
    179 	{
    180 	  pname[-1] = *pc;
    181 	  *pc = c;
    182 	  if (intel_syntax > 0 || operands != 1)
    183 	    return O_illegal;
    184 	  return i386_types[j].op;
    185 	}
    186 
    187       *input_line_pointer = c;
    188       input_line_pointer = pname - 1;
    189     }
    190 
    191   return O_absent;
    192 }
    193 
    194 static int i386_intel_parse_name (const char *name, expressionS *e)
    195 {
    196   unsigned int j;
    197 
    198   if (! strcmp (name, "$"))
    199     {
    200       current_location (e);
    201       return 1;
    202     }
    203 
    204   for (j = 0; i386_types[j].name; ++j)
    205     if (strcasecmp(i386_types[j].name, name) == 0)
    206       {
    207 	e->X_op = O_constant;
    208 	e->X_add_number = i386_types[j].sz[flag_code];
    209 	e->X_add_symbol = NULL;
    210 	e->X_op_symbol = NULL;
    211 	return 1;
    212       }
    213 
    214   return 0;
    215 }
    216 
    217 static INLINE int i386_intel_check (const reg_entry *rreg,
    218 				    const reg_entry *base,
    219 				    const reg_entry *iindex)
    220 {
    221   if ((this_operand >= 0
    222        && rreg != i.op[this_operand].regs)
    223       || base != intel_state.base
    224       || iindex != intel_state.index)
    225     {
    226       as_bad (_("invalid use of register"));
    227       return 0;
    228     }
    229   return 1;
    230 }
    231 
    232 static INLINE void i386_intel_fold (expressionS *e, symbolS *sym)
    233 {
    234   expressionS *exp = symbol_get_value_expression (sym);
    235   if (S_GET_SEGMENT (sym) == absolute_section)
    236     {
    237       offsetT val = e->X_add_number;
    238 
    239       *e = *exp;
    240       e->X_add_number += val;
    241     }
    242   else
    243     {
    244       if (exp->X_op == O_symbol
    245 	  && strcmp (S_GET_NAME (exp->X_add_symbol),
    246 		     GLOBAL_OFFSET_TABLE_NAME) == 0)
    247 	sym = exp->X_add_symbol;
    248       e->X_add_symbol = sym;
    249       e->X_op_symbol = NULL;
    250       e->X_op = O_symbol;
    251     }
    252 }
    253 
    254 static int
    255 i386_intel_simplify_register (expressionS *e)
    256 {
    257   int reg_num;
    258 
    259   if (this_operand < 0 || intel_state.in_offset)
    260     {
    261       as_bad (_("invalid use of register"));
    262       return 0;
    263     }
    264 
    265   if (e->X_op == O_register)
    266     reg_num = e->X_add_number;
    267   else
    268     reg_num = e->X_md - 1;
    269 
    270   if (!intel_state.in_bracket)
    271     {
    272       if (i.op[this_operand].regs)
    273 	{
    274 	  as_bad (_("invalid use of register"));
    275 	  return 0;
    276 	}
    277       if (i386_regtab[reg_num].reg_type.bitfield.sreg3
    278 	  && i386_regtab[reg_num].reg_num == RegFlat)
    279 	{
    280 	  as_bad (_("invalid use of pseudo-register"));
    281 	  return 0;
    282 	}
    283       i.op[this_operand].regs = i386_regtab + reg_num;
    284     }
    285   else if (!intel_state.index
    286 	   && (i386_regtab[reg_num].reg_type.bitfield.regxmm
    287 	       || i386_regtab[reg_num].reg_type.bitfield.regymm
    288 	       || i386_regtab[reg_num].reg_type.bitfield.regzmm))
    289     intel_state.index = i386_regtab + reg_num;
    290   else if (!intel_state.base && !intel_state.in_scale)
    291     intel_state.base = i386_regtab + reg_num;
    292   else if (!intel_state.index)
    293     {
    294       if (intel_state.in_scale
    295 	  || current_templates->start->base_opcode == 0xf30f1b /* bndmk */
    296 	  || (current_templates->start->base_opcode & ~1) == 0x0f1a /* bnd{ld,st}x */
    297 	  || i386_regtab[reg_num].reg_type.bitfield.baseindex)
    298 	intel_state.index = i386_regtab + reg_num;
    299       else
    300 	{
    301 	  /* Convert base to index and make ESP/RSP the base.  */
    302 	  intel_state.index = intel_state.base;
    303 	  intel_state.base = i386_regtab + reg_num;
    304 	}
    305     }
    306   else
    307     {
    308       /* esp is invalid as index */
    309       intel_state.index = i386_regtab + REGNAM_EAX + ESP_REG_NUM;
    310     }
    311   return 2;
    312 }
    313 
    314 static int i386_intel_simplify (expressionS *);
    315 
    316 static INLINE int i386_intel_simplify_symbol(symbolS *sym)
    317 {
    318   int ret = i386_intel_simplify (symbol_get_value_expression (sym));
    319 
    320   if (ret == 2)
    321   {
    322     S_SET_SEGMENT(sym, absolute_section);
    323     ret = 1;
    324   }
    325   return ret;
    326 }
    327 
    328 static int i386_intel_simplify (expressionS *e)
    329 {
    330   const reg_entry *the_reg = (this_operand >= 0
    331 			      ? i.op[this_operand].regs : NULL);
    332   const reg_entry *base = intel_state.base;
    333   const reg_entry *state_index = intel_state.index;
    334   int ret;
    335 
    336   if (!intel_syntax)
    337     return 1;
    338 
    339   switch (e->X_op)
    340     {
    341     case O_index:
    342       if (e->X_add_symbol)
    343 	{
    344 	  if (!i386_intel_simplify_symbol (e->X_add_symbol)
    345 	      || !i386_intel_check(the_reg, intel_state.base,
    346 				   intel_state.index))
    347 	    return 0;
    348 	}
    349       if (!intel_state.in_offset)
    350 	++intel_state.in_bracket;
    351       ret = i386_intel_simplify_symbol (e->X_op_symbol);
    352       if (!intel_state.in_offset)
    353 	--intel_state.in_bracket;
    354       if (!ret)
    355 	return 0;
    356       if (e->X_add_symbol)
    357 	e->X_op = O_add;
    358       else
    359 	i386_intel_fold (e, e->X_op_symbol);
    360       break;
    361 
    362     case O_offset:
    363       intel_state.has_offset = 1;
    364       ++intel_state.in_offset;
    365       ret = i386_intel_simplify_symbol (e->X_add_symbol);
    366       --intel_state.in_offset;
    367       if (!ret || !i386_intel_check(the_reg, base, state_index))
    368 	return 0;
    369       i386_intel_fold (e, e->X_add_symbol);
    370       return ret;
    371 
    372     case O_byte_ptr:
    373     case O_word_ptr:
    374     case O_dword_ptr:
    375     case O_fword_ptr:
    376     case O_qword_ptr:
    377     case O_tbyte_ptr:
    378     case O_oword_ptr:
    379     case O_xmmword_ptr:
    380     case O_ymmword_ptr:
    381     case O_zmmword_ptr:
    382     case O_near_ptr:
    383     case O_far_ptr:
    384       if (intel_state.op_modifier == O_absent)
    385 	intel_state.op_modifier = e->X_op;
    386       /* FALLTHROUGH */
    387     case O_short:
    388       if (symbol_get_value_expression (e->X_add_symbol)->X_op
    389 	  == O_register)
    390 	{
    391 	  as_bad (_("invalid use of register"));
    392 	  return 0;
    393 	}
    394       if (!i386_intel_simplify_symbol (e->X_add_symbol))
    395 	return 0;
    396       i386_intel_fold (e, e->X_add_symbol);
    397       break;
    398 
    399     case O_full_ptr:
    400       if (symbol_get_value_expression (e->X_op_symbol)->X_op
    401 	  == O_register)
    402 	{
    403 	  as_bad (_("invalid use of register"));
    404 	  return 0;
    405 	}
    406       if (!i386_intel_simplify_symbol (e->X_op_symbol)
    407 	  || !i386_intel_check(the_reg, intel_state.base,
    408 			       intel_state.index))
    409 	return 0;
    410       if (!intel_state.in_offset)
    411 	intel_state.seg = e->X_add_symbol;
    412       i386_intel_fold (e, e->X_op_symbol);
    413       break;
    414 
    415     case O_multiply:
    416       if (this_operand >= 0 && intel_state.in_bracket)
    417 	{
    418 	  expressionS *scale = NULL;
    419 	  int has_index = (intel_state.index != NULL);
    420 
    421 	  if (!intel_state.in_scale++)
    422 	    intel_state.scale_factor = 1;
    423 
    424 	  ret = i386_intel_simplify_symbol (e->X_add_symbol);
    425 	  if (ret && !has_index && intel_state.index)
    426 	    scale = symbol_get_value_expression (e->X_op_symbol);
    427 
    428 	  if (ret)
    429 	    ret = i386_intel_simplify_symbol (e->X_op_symbol);
    430 	  if (ret && !scale && !has_index && intel_state.index)
    431 	    scale = symbol_get_value_expression (e->X_add_symbol);
    432 
    433 	  if (ret && scale)
    434 	    {
    435 	      resolve_expression (scale);
    436 	      if (scale->X_op != O_constant
    437 		  || intel_state.index->reg_type.bitfield.reg16)
    438 		scale->X_add_number = 0;
    439 	      intel_state.scale_factor *= scale->X_add_number;
    440 	    }
    441 
    442 	  --intel_state.in_scale;
    443 	  if (!ret)
    444 	    return 0;
    445 
    446 	  if (!intel_state.in_scale)
    447 	    switch (intel_state.scale_factor)
    448 	      {
    449 	      case 1:
    450 		i.log2_scale_factor = 0;
    451 		break;
    452 	      case 2:
    453 		i.log2_scale_factor = 1;
    454 		break;
    455 	      case 4:
    456 		i.log2_scale_factor = 2;
    457 		break;
    458 	      case 8:
    459 		i.log2_scale_factor = 3;
    460 		break;
    461 	      default:
    462 		/* esp is invalid as index */
    463 		intel_state.index = i386_regtab + REGNAM_EAX + ESP_REG_NUM;
    464 		break;
    465 	      }
    466 
    467 	  break;
    468 	}
    469       goto fallthrough;
    470 
    471     case O_register:
    472       ret = i386_intel_simplify_register (e);
    473       if (ret == 2)
    474 	{
    475 	  gas_assert (e->X_add_number < (unsigned short) -1);
    476 	  e->X_md = (unsigned short) e->X_add_number + 1;
    477 	  e->X_op = O_constant;
    478 	  e->X_add_number = 0;
    479 	}
    480       return ret;
    481 
    482     case O_constant:
    483       if (e->X_md)
    484 	return i386_intel_simplify_register (e);
    485 
    486       /* FALLTHROUGH */
    487     default:
    488 fallthrough:
    489       if (e->X_add_symbol
    490 	  && !i386_intel_simplify_symbol (e->X_add_symbol))
    491 	return 0;
    492       if (e->X_op == O_add || e->X_op == O_subtract)
    493 	{
    494 	  base = intel_state.base;
    495 	  state_index = intel_state.index;
    496 	}
    497       if (!i386_intel_check (the_reg, base, state_index)
    498 	  || (e->X_op_symbol
    499 	      && !i386_intel_simplify_symbol (e->X_op_symbol))
    500 	  || !i386_intel_check (the_reg,
    501 				(e->X_op != O_add
    502 				 ? base : intel_state.base),
    503 				(e->X_op != O_add
    504 				 ? state_index : intel_state.index)))
    505 	return 0;
    506       break;
    507     }
    508 
    509   if (this_operand >= 0
    510       && e->X_op == O_symbol
    511       && !intel_state.in_offset)
    512     {
    513       segT seg = S_GET_SEGMENT (e->X_add_symbol);
    514 
    515       if (seg != absolute_section
    516 	  && seg != reg_section
    517 	  && seg != expr_section)
    518 	intel_state.is_mem |= 2 - !intel_state.in_bracket;
    519     }
    520 
    521   return 1;
    522 }
    523 
    524 int i386_need_index_operator (void)
    525 {
    526   return intel_syntax < 0;
    527 }
    528 
    529 static int
    530 i386_intel_operand (char *operand_string, int got_a_float)
    531 {
    532   char *saved_input_line_pointer, *buf;
    533   segT exp_seg;
    534   expressionS exp, *expP;
    535   char suffix = 0;
    536   int ret;
    537 
    538   /* Handle vector immediates.  */
    539   if (RC_SAE_immediate (operand_string))
    540     return 1;
    541 
    542   /* Initialize state structure.  */
    543   intel_state.op_modifier = O_absent;
    544   intel_state.is_mem = 0;
    545   intel_state.is_indirect = 0;
    546   intel_state.has_offset = 0;
    547   intel_state.base = NULL;
    548   intel_state.index = NULL;
    549   intel_state.seg = NULL;
    550   operand_type_set (&intel_state.reloc_types, ~0);
    551   gas_assert (!intel_state.in_offset);
    552   gas_assert (!intel_state.in_bracket);
    553   gas_assert (!intel_state.in_scale);
    554 
    555   saved_input_line_pointer = input_line_pointer;
    556   input_line_pointer = buf = xstrdup (operand_string);
    557 
    558   intel_syntax = -1;
    559   memset (&exp, 0, sizeof(exp));
    560   exp_seg = expression (&exp);
    561   ret = i386_intel_simplify (&exp);
    562   intel_syntax = 1;
    563 
    564   SKIP_WHITESPACE ();
    565 
    566   /* Handle vector operations.  */
    567   if (*input_line_pointer == '{')
    568     {
    569       char *end = check_VecOperations (input_line_pointer, NULL);
    570       if (end)
    571 	input_line_pointer = end;
    572       else
    573 	ret = 0;
    574     }
    575 
    576   if (!is_end_of_line[(unsigned char) *input_line_pointer])
    577     {
    578       as_bad (_("junk `%s' after expression"), input_line_pointer);
    579       ret = 0;
    580     }
    581   else if (exp.X_op == O_illegal || exp.X_op == O_absent)
    582     {
    583       as_bad (_("invalid expression"));
    584       ret = 0;
    585     }
    586   else if (!intel_state.has_offset
    587 	   && input_line_pointer > buf
    588 	   && *(input_line_pointer - 1) == ']')
    589     {
    590       intel_state.is_mem |= 1;
    591       intel_state.is_indirect = 1;
    592     }
    593 
    594   input_line_pointer = saved_input_line_pointer;
    595   free (buf);
    596 
    597   gas_assert (!intel_state.in_offset);
    598   gas_assert (!intel_state.in_bracket);
    599   gas_assert (!intel_state.in_scale);
    600 
    601   if (!ret)
    602     return 0;
    603 
    604   if (intel_state.op_modifier != O_absent
    605       && current_templates->start->base_opcode != 0x8d /* lea */)
    606     {
    607       i.types[this_operand].bitfield.unspecified = 0;
    608 
    609       switch (intel_state.op_modifier)
    610 	{
    611 	case O_byte_ptr:
    612 	  i.types[this_operand].bitfield.byte = 1;
    613 	  suffix = BYTE_MNEM_SUFFIX;
    614 	  break;
    615 
    616 	case O_word_ptr:
    617 	  i.types[this_operand].bitfield.word = 1;
    618 	  if ((current_templates->start->name[0] == 'l'
    619 	       && current_templates->start->name[2] == 's'
    620 	       && current_templates->start->name[3] == 0)
    621 	      || current_templates->start->base_opcode == 0x62 /* bound */)
    622 	    suffix = BYTE_MNEM_SUFFIX; /* so it will cause an error */
    623 	  else if (got_a_float == 2)	/* "fi..." */
    624 	    suffix = SHORT_MNEM_SUFFIX;
    625 	  else
    626 	    suffix = WORD_MNEM_SUFFIX;
    627 	  break;
    628 
    629 	case O_dword_ptr:
    630 	  i.types[this_operand].bitfield.dword = 1;
    631 	  if ((current_templates->start->name[0] == 'l'
    632 	       && current_templates->start->name[2] == 's'
    633 	       && current_templates->start->name[3] == 0)
    634 	      || current_templates->start->base_opcode == 0x62 /* bound */)
    635 	    suffix = WORD_MNEM_SUFFIX;
    636 	  else if (flag_code == CODE_16BIT
    637 		   && (current_templates->start->opcode_modifier.jump
    638 		       || current_templates->start->opcode_modifier.jumpdword))
    639 	    suffix = LONG_DOUBLE_MNEM_SUFFIX;
    640 	  else if (got_a_float == 1)	/* "f..." */
    641 	    suffix = SHORT_MNEM_SUFFIX;
    642 	  else
    643 	    suffix = LONG_MNEM_SUFFIX;
    644 	  break;
    645 
    646 	case O_fword_ptr:
    647 	  i.types[this_operand].bitfield.fword = 1;
    648 	  if (current_templates->start->name[0] == 'l'
    649 	      && current_templates->start->name[2] == 's'
    650 	      && current_templates->start->name[3] == 0)
    651 	    suffix = LONG_MNEM_SUFFIX;
    652 	  else if (!got_a_float)
    653 	    {
    654 	      if (flag_code == CODE_16BIT)
    655 		add_prefix (DATA_PREFIX_OPCODE);
    656 	      suffix = LONG_DOUBLE_MNEM_SUFFIX;
    657 	    }
    658 	  else
    659 	    suffix = BYTE_MNEM_SUFFIX; /* so it will cause an error */
    660 	  break;
    661 
    662 	case O_qword_ptr:
    663 	  i.types[this_operand].bitfield.qword = 1;
    664 	  if (current_templates->start->base_opcode == 0x62 /* bound */
    665 	      || got_a_float == 1)	/* "f..." */
    666 	    suffix = LONG_MNEM_SUFFIX;
    667 	  else
    668 	    suffix = QWORD_MNEM_SUFFIX;
    669 	  break;
    670 
    671 	case O_tbyte_ptr:
    672 	  i.types[this_operand].bitfield.tbyte = 1;
    673 	  if (got_a_float == 1)
    674 	    suffix = LONG_DOUBLE_MNEM_SUFFIX;
    675 	  else
    676 	    suffix = BYTE_MNEM_SUFFIX; /* so it will cause an error */
    677 	  break;
    678 
    679 	case O_oword_ptr:
    680 	case O_xmmword_ptr:
    681 	  i.types[this_operand].bitfield.xmmword = 1;
    682 	  suffix = XMMWORD_MNEM_SUFFIX;
    683 	  break;
    684 
    685 	case O_ymmword_ptr:
    686 	  i.types[this_operand].bitfield.ymmword = 1;
    687 	  suffix = YMMWORD_MNEM_SUFFIX;
    688 	  break;
    689 
    690 	case O_zmmword_ptr:
    691 	  i.types[this_operand].bitfield.zmmword = 1;
    692 	  suffix = ZMMWORD_MNEM_SUFFIX;
    693 	  break;
    694 
    695 	case O_far_ptr:
    696 	  suffix = LONG_DOUBLE_MNEM_SUFFIX;
    697 	  /* FALLTHROUGH */
    698 	case O_near_ptr:
    699 	  if (!current_templates->start->opcode_modifier.jump
    700 	      && !current_templates->start->opcode_modifier.jumpdword)
    701 	    suffix = got_a_float /* so it will cause an error */
    702 		     ? BYTE_MNEM_SUFFIX
    703 		     : LONG_DOUBLE_MNEM_SUFFIX;
    704 	  break;
    705 
    706 	default:
    707 	  BAD_CASE (intel_state.op_modifier);
    708 	  break;
    709 	}
    710 
    711       if (!i.suffix)
    712 	i.suffix = suffix;
    713       else if (i.suffix != suffix)
    714 	{
    715 	  as_bad (_("conflicting operand size modifiers"));
    716 	  return 0;
    717 	}
    718     }
    719 
    720   /* Operands for jump/call need special consideration.  */
    721   if (current_templates->start->opcode_modifier.jump
    722       || current_templates->start->opcode_modifier.jumpdword
    723       || current_templates->start->opcode_modifier.jumpintersegment)
    724     {
    725       if (i.op[this_operand].regs
    726 	  || intel_state.base
    727 	  || intel_state.index
    728 	  || intel_state.is_mem > 1)
    729 	i.types[this_operand].bitfield.jumpabsolute = 1;
    730       else
    731 	switch (intel_state.op_modifier)
    732 	  {
    733 	  case O_near_ptr:
    734 	    if (intel_state.seg)
    735 	      i.types[this_operand].bitfield.jumpabsolute = 1;
    736 	    else
    737 	      intel_state.is_mem = 1;
    738 	    break;
    739 	  case O_far_ptr:
    740 	  case O_absent:
    741 	    if (!intel_state.seg)
    742 	      {
    743 		intel_state.is_mem = 1;
    744 		if (intel_state.op_modifier == O_absent)
    745 		  {
    746 		    if (intel_state.is_indirect == 1)
    747 		      i.types[this_operand].bitfield.jumpabsolute = 1;
    748 		    break;
    749 		  }
    750 		as_bad (_("cannot infer the segment part of the operand"));
    751 		return 0;
    752 	      }
    753 	    else if (S_GET_SEGMENT (intel_state.seg) == reg_section)
    754 	      i.types[this_operand].bitfield.jumpabsolute = 1;
    755 	    else
    756 	      {
    757 		i386_operand_type types;
    758 
    759 		if (i.imm_operands >= MAX_IMMEDIATE_OPERANDS)
    760 		  {
    761 		    as_bad (_("at most %d immediate operands are allowed"),
    762 			    MAX_IMMEDIATE_OPERANDS);
    763 		    return 0;
    764 		  }
    765 		expP = &im_expressions[i.imm_operands++];
    766 		memset (expP, 0, sizeof(*expP));
    767 		expP->X_op = O_symbol;
    768 		expP->X_add_symbol = intel_state.seg;
    769 		i.op[this_operand].imms = expP;
    770 
    771 		resolve_expression (expP);
    772 		operand_type_set (&types, ~0);
    773 		if (!i386_finalize_immediate (S_GET_SEGMENT (intel_state.seg),
    774 					      expP, types, operand_string))
    775 		  return 0;
    776 		if (i.operands < MAX_OPERANDS)
    777 		  {
    778 		    this_operand = i.operands++;
    779 		    i.types[this_operand].bitfield.unspecified = 1;
    780 		  }
    781 		if (suffix == LONG_DOUBLE_MNEM_SUFFIX)
    782 		  i.suffix = 0;
    783 		intel_state.seg = NULL;
    784 		intel_state.is_mem = 0;
    785 	      }
    786 	    break;
    787 	  default:
    788 	    i.types[this_operand].bitfield.jumpabsolute = 1;
    789 	    break;
    790 	  }
    791       if (i.types[this_operand].bitfield.jumpabsolute)
    792 	intel_state.is_mem |= 1;
    793     }
    794   else if (intel_state.seg)
    795     intel_state.is_mem |= 1;
    796 
    797   if (i.op[this_operand].regs)
    798     {
    799       i386_operand_type temp;
    800 
    801       /* Register operand.  */
    802       if (intel_state.base || intel_state.index || intel_state.seg)
    803 	{
    804 	  as_bad (_("invalid operand"));
    805 	  return 0;
    806 	}
    807 
    808       temp = i.op[this_operand].regs->reg_type;
    809       temp.bitfield.baseindex = 0;
    810       i.types[this_operand] = operand_type_or (i.types[this_operand],
    811 					       temp);
    812       i.types[this_operand].bitfield.unspecified = 0;
    813       ++i.reg_operands;
    814     }
    815   else if (intel_state.base
    816 	   || intel_state.index
    817 	   || intel_state.seg
    818 	   || intel_state.is_mem)
    819     {
    820       /* Memory operand.  */
    821       if ((int) i.mem_operands
    822 	  >= 2 - !current_templates->start->opcode_modifier.isstring)
    823 	{
    824 	  /* Handle
    825 
    826 	     call	0x9090,0x90909090
    827 	     lcall	0x9090,0x90909090
    828 	     jmp	0x9090,0x90909090
    829 	     ljmp	0x9090,0x90909090
    830 	   */
    831 
    832 	  if ((current_templates->start->opcode_modifier.jumpintersegment
    833 	       || current_templates->start->opcode_modifier.jumpdword
    834 	       || current_templates->start->opcode_modifier.jump)
    835 	      && this_operand == 1
    836 	      && intel_state.seg == NULL
    837 	      && i.mem_operands == 1
    838 	      && i.disp_operands == 1
    839 	      && intel_state.op_modifier == O_absent)
    840 	    {
    841 	      /* Try to process the first operand as immediate,  */
    842 	      this_operand = 0;
    843 	      if (i386_finalize_immediate (exp_seg, i.op[0].imms,
    844 					   intel_state.reloc_types,
    845 					   NULL))
    846 		{
    847 		  this_operand = 1;
    848 		  expP = &im_expressions[0];
    849 		  i.op[this_operand].imms = expP;
    850 		  *expP = exp;
    851 
    852 		  /* Try to process the second operand as immediate,  */
    853 		  if (i386_finalize_immediate (exp_seg, expP,
    854 					       intel_state.reloc_types,
    855 					       NULL))
    856 		    {
    857 		      i.mem_operands = 0;
    858 		      i.disp_operands = 0;
    859 		      i.imm_operands = 2;
    860 		      i.types[0].bitfield.mem = 0;
    861 		      i.types[0].bitfield.disp16 = 0;
    862 		      i.types[0].bitfield.disp32 = 0;
    863 		      i.types[0].bitfield.disp32s = 0;
    864 		      return 1;
    865 		    }
    866 		}
    867 	    }
    868 
    869 	  as_bad (_("too many memory references for `%s'"),
    870 		  current_templates->start->name);
    871 	  return 0;
    872 	}
    873 
    874       expP = &disp_expressions[i.disp_operands];
    875       memcpy (expP, &exp, sizeof(exp));
    876       resolve_expression (expP);
    877 
    878       if (expP->X_op != O_constant
    879 	  || expP->X_add_number
    880 	  || (!intel_state.base
    881 	      && !intel_state.index))
    882 	{
    883 	  i.op[this_operand].disps = expP;
    884 	  i.disp_operands++;
    885 
    886 	  if (flag_code == CODE_64BIT)
    887 	    {
    888 	      i.types[this_operand].bitfield.disp32 = 1;
    889 	      if (!i.prefix[ADDR_PREFIX])
    890 		{
    891 		  i.types[this_operand].bitfield.disp64 = 1;
    892 		  i.types[this_operand].bitfield.disp32s = 1;
    893 		}
    894 	    }
    895 	  else if (!i.prefix[ADDR_PREFIX] ^ (flag_code == CODE_16BIT))
    896 	    i.types[this_operand].bitfield.disp32 = 1;
    897 	  else
    898 	    i.types[this_operand].bitfield.disp16 = 1;
    899 
    900 #if defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT)
    901 	  /*
    902 	   * exp_seg is used only for verification in
    903 	   * i386_finalize_displacement, and we can end up seeing reg_section
    904 	   * here - but we know we removed all registers from the expression
    905 	   * (or error-ed on any remaining ones) in i386_intel_simplify.  I
    906 	   * consider the check in i386_finalize_displacement bogus anyway, in
    907 	   * particular because it doesn't allow for expr_section, so I'd
    908 	   * rather see that check (and the similar one in
    909 	   * i386_finalize_immediate) use SEG_NORMAL(), but not being an a.out
    910 	   * expert I can't really say whether that would have other bad side
    911 	   * effects.
    912 	   */
    913 	  if (OUTPUT_FLAVOR == bfd_target_aout_flavour
    914 	      && exp_seg == reg_section)
    915 	    exp_seg = expP->X_op != O_constant ? undefined_section
    916 					       : absolute_section;
    917 #endif
    918 
    919 	  if (!i386_finalize_displacement (exp_seg, expP,
    920 					   intel_state.reloc_types,
    921 					   operand_string))
    922 	    return 0;
    923 	}
    924 
    925       if (intel_state.base || intel_state.index)
    926 	i.types[this_operand].bitfield.baseindex = 1;
    927 
    928       if (intel_state.seg)
    929 	{
    930 	  for (;;)
    931 	    {
    932 	      expP = symbol_get_value_expression (intel_state.seg);
    933 	      if (expP->X_op != O_full_ptr)
    934 		break;
    935 	      intel_state.seg = expP->X_add_symbol;
    936 	    }
    937 	  if (expP->X_op != O_register)
    938 	    {
    939 	      as_bad (_("segment register name expected"));
    940 	      return 0;
    941 	    }
    942 	  if (!i386_regtab[expP->X_add_number].reg_type.bitfield.sreg2
    943 	      && !i386_regtab[expP->X_add_number].reg_type.bitfield.sreg3)
    944 	    {
    945 	      as_bad (_("invalid use of register"));
    946 	      return 0;
    947 	    }
    948 	  switch (i386_regtab[expP->X_add_number].reg_num)
    949 	    {
    950 	    case 0: i.seg[i.mem_operands] = &es; break;
    951 	    case 1: i.seg[i.mem_operands] = &cs; break;
    952 	    case 2: i.seg[i.mem_operands] = &ss; break;
    953 	    case 3: i.seg[i.mem_operands] = &ds; break;
    954 	    case 4: i.seg[i.mem_operands] = &fs; break;
    955 	    case 5: i.seg[i.mem_operands] = &gs; break;
    956 	    case RegFlat: i.seg[i.mem_operands] = NULL; break;
    957 	    }
    958 	}
    959 
    960       /* Swap base and index in 16-bit memory operands like
    961 	 [si+bx]. Since i386_index_check is also used in AT&T
    962 	 mode we have to do that here.  */
    963       if (intel_state.base
    964 	  && intel_state.index
    965 	  && intel_state.base->reg_type.bitfield.reg16
    966 	  && intel_state.index->reg_type.bitfield.reg16
    967 	  && intel_state.base->reg_num >= 6
    968 	  && intel_state.index->reg_num < 6)
    969 	{
    970 	  i.base_reg = intel_state.index;
    971 	  i.index_reg = intel_state.base;
    972 	}
    973       else
    974 	{
    975 	  i.base_reg = intel_state.base;
    976 	  i.index_reg = intel_state.index;
    977 	}
    978 
    979       if (!i386_index_check (operand_string))
    980 	return 0;
    981 
    982       i.types[this_operand].bitfield.mem = 1;
    983       ++i.mem_operands;
    984     }
    985   else
    986     {
    987       /* Immediate.  */
    988       if (i.imm_operands >= MAX_IMMEDIATE_OPERANDS)
    989 	{
    990 	  as_bad (_("at most %d immediate operands are allowed"),
    991 		  MAX_IMMEDIATE_OPERANDS);
    992 	  return 0;
    993 	}
    994 
    995       expP = &im_expressions[i.imm_operands++];
    996       i.op[this_operand].imms = expP;
    997       *expP = exp;
    998 
    999       return i386_finalize_immediate (exp_seg, expP, intel_state.reloc_types,
   1000 				      operand_string);
   1001     }
   1002 
   1003   return 1;
   1004 }
   1005