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