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