Rationalize some of the i386 intel mode code.
Indentation and white space changes.
This commit is contained in:
parent
05fad94de0
commit
24eab124bd
2 changed files with 857 additions and 911 deletions
|
@ -4,8 +4,21 @@
|
|||
|
||||
1999-08-03 Alan Modra <alan@spri.levels.unisa.edu.au>
|
||||
|
||||
* config/tc-i386.c (i386_operand): Add INFER_ADDR_PREFIX code, but
|
||||
don't enable it by default. White space changes.
|
||||
* config/tc-i386.c: Indentation and white space changes.
|
||||
(i386_index_check): New function. Add INFER_ADDR_PREFIX code, but
|
||||
don't enable it by default.
|
||||
(i386_intel_operand): Remove redundant prototype.
|
||||
Move check on number of memory operands, and i.mem_operands++
|
||||
(i386_intel_memory_operand): To here.
|
||||
Remove i386_immediate code from here. Remove special case code
|
||||
for input and output using (%dx). Remove base/index checks and
|
||||
call i386_index_check instead. Save initial operand_string
|
||||
argument for error message.
|
||||
(i386_operand): Remove redundant prototype. Move base/index
|
||||
checks to i386_index_check.
|
||||
(i386_displacement): Move intel mode check for non-zero
|
||||
i.disp_operand
|
||||
(i386_intel_memory_operand): To here.
|
||||
|
||||
1999-07-30 Jakub Jelinek <jj@ultra.linux.cz>
|
||||
|
||||
|
|
|
@ -268,7 +268,7 @@ static int allow_naked_reg = 0; /* 1 if register prefix % not required */
|
|||
|
||||
const relax_typeS md_relax_table[] =
|
||||
{
|
||||
/* The fields are:
|
||||
/* The fields are:
|
||||
1) most positive reach of this state,
|
||||
2) most negative reach of this state,
|
||||
3) how many bytes this mode will add to the size of the current frag
|
||||
|
@ -2060,7 +2060,7 @@ md_assemble (line)
|
|||
}
|
||||
else if ((i.tm.opcode_modifier & Ugh) != 0)
|
||||
{
|
||||
/* UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc */
|
||||
/* UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc. */
|
||||
as_warn (_("translating to `%sp'"), i.tm.name);
|
||||
}
|
||||
}
|
||||
|
@ -2716,10 +2716,6 @@ i386_displacement (disp_start, disp_end)
|
|||
char *save_input_line_pointer;
|
||||
int bigdisp = Disp32;
|
||||
|
||||
/* All of the pieces of the displacement expression are handled together. */
|
||||
if (intel_syntax && i.disp_operands != 0)
|
||||
return 1;
|
||||
|
||||
if (flag_16bit_code ^ (i.prefix[ADDR_PREFIX] != 0))
|
||||
bigdisp = Disp16;
|
||||
i.types[this_operand] |= bigdisp;
|
||||
|
@ -3068,22 +3064,64 @@ i386_parse_seg (op_string)
|
|||
|
||||
}
|
||||
|
||||
static int i386_index_check PARAMS((void));
|
||||
|
||||
static int
|
||||
i386_index_check ()
|
||||
{
|
||||
/* Make sure the memory operand we've been dealt is valid. */
|
||||
#if INFER_ADDR_PREFIX
|
||||
tryprefix:
|
||||
#endif
|
||||
if (flag_16bit_code ^ (i.prefix[ADDR_PREFIX] != 0) ?
|
||||
/* 16 bit mode checks */
|
||||
((i.base_reg
|
||||
&& ((i.base_reg->reg_type & (Reg16|BaseIndex))
|
||||
!= (Reg16|BaseIndex)))
|
||||
|| (i.index_reg
|
||||
&& (((i.index_reg->reg_type & (Reg16|BaseIndex))
|
||||
!= (Reg16|BaseIndex))
|
||||
|| ! (i.base_reg
|
||||
&& i.base_reg->reg_num < 6
|
||||
&& i.index_reg->reg_num >= 6
|
||||
&& i.log2_scale_factor == 0)))) :
|
||||
/* 32 bit mode checks */
|
||||
((i.base_reg
|
||||
&& (i.base_reg->reg_type & Reg32) == 0)
|
||||
|| (i.index_reg
|
||||
&& ((i.index_reg->reg_type & (Reg32|BaseIndex))
|
||||
!= (Reg32|BaseIndex)))))
|
||||
{
|
||||
#if INFER_ADDR_PREFIX
|
||||
if (i.prefix[ADDR_PREFIX] == 0)
|
||||
{
|
||||
i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
|
||||
i.prefixes += 1;
|
||||
goto tryprefix;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int i386_intel_memory_operand PARAMS ((char *));
|
||||
|
||||
static int
|
||||
i386_intel_memory_operand (op_string)
|
||||
char *op_string;
|
||||
i386_intel_memory_operand (operand_string)
|
||||
char *operand_string;
|
||||
{
|
||||
|
||||
char *op_string = operand_string;
|
||||
char *end_of_operand_string;
|
||||
|
||||
if (is_digit_char (*op_string)
|
||||
&& strchr (op_string, '[') == 0)
|
||||
if ((i.mem_operands == 1
|
||||
&& (current_templates->start->opcode_modifier & IsString) == 0)
|
||||
|| i.mem_operands == 2)
|
||||
{
|
||||
if (!i386_immediate (op_string))
|
||||
as_bad (_("too many memory references for `%s'"),
|
||||
current_templates->start->name);
|
||||
return 0;
|
||||
else
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Look for displacement preceding open bracket */
|
||||
|
@ -3101,7 +3139,9 @@ i386_intel_memory_operand (op_string)
|
|||
}
|
||||
|
||||
temp_string = build_displacement_string (true, op_string);
|
||||
if (!i386_displacement (temp_string, temp_string + strlen (temp_string)))
|
||||
|
||||
if (i.disp_operands == 0 &&
|
||||
!i386_displacement (temp_string, temp_string + strlen (temp_string)))
|
||||
return 0;
|
||||
|
||||
end_of_operand_string = strchr (op_string, '[');
|
||||
|
@ -3170,7 +3210,8 @@ i386_intel_memory_operand (op_string)
|
|||
if (*temp_string == '+')
|
||||
++temp_string;
|
||||
|
||||
if (!i386_displacement (temp_string, temp_string + strlen (temp_string)))
|
||||
if (i.disp_operands == 0 &&
|
||||
!i386_displacement (temp_string, temp_string + strlen (temp_string)))
|
||||
return 0;
|
||||
|
||||
++op_string;
|
||||
|
@ -3199,11 +3240,17 @@ i386_intel_memory_operand (op_string)
|
|||
}
|
||||
}
|
||||
|
||||
if (i386_index_check () == 0)
|
||||
{
|
||||
as_bad (_("`%s' is not a valid base/index expression"),
|
||||
operand_string);
|
||||
return 0;
|
||||
}
|
||||
|
||||
i.mem_operands++;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int i386_intel_operand PARAMS ((char *, int));
|
||||
|
||||
static int
|
||||
i386_intel_operand (operand_string, got_a_float)
|
||||
char *operand_string;
|
||||
|
@ -3222,30 +3269,17 @@ i386_intel_operand (operand_string, got_a_float)
|
|||
case DWORD_PTR:
|
||||
case QWORD_PTR:
|
||||
case XWORD_PTR:
|
||||
if ((i.mem_operands == 1
|
||||
&& (current_templates->start->opcode_modifier & IsString) == 0)
|
||||
|| i.mem_operands == 2)
|
||||
{
|
||||
as_bad (_("too many memory references for `%s'"),
|
||||
current_templates->start->name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!i386_intel_memory_operand (op_string))
|
||||
return 0;
|
||||
|
||||
i.mem_operands++;
|
||||
break;
|
||||
|
||||
case FLAT:
|
||||
|
||||
case OFFSET_FLAT:
|
||||
if (!i386_immediate (op_string))
|
||||
return 0;
|
||||
break;
|
||||
|
||||
case SHORT:
|
||||
|
||||
case NONE_FOUND:
|
||||
/* Should be register or immediate */
|
||||
if (is_digit_char (*op_string)
|
||||
|
@ -3258,7 +3292,6 @@ i386_intel_operand (operand_string, got_a_float)
|
|||
|| (allow_naked_reg
|
||||
&& i386_is_reg (op_string)))
|
||||
{
|
||||
|
||||
register const reg_entry * r;
|
||||
char *end_op;
|
||||
|
||||
|
@ -3300,69 +3333,20 @@ i386_intel_operand (operand_string, got_a_float)
|
|||
i.regs[this_operand] = r;
|
||||
i.reg_operands++;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
|
||||
if (!i386_intel_memory_operand (op_string))
|
||||
return 0;
|
||||
|
||||
i.mem_operands++;
|
||||
}
|
||||
break;
|
||||
|
||||
} /* end switch */
|
||||
/* Special case for (%dx) while doing input/output op. */
|
||||
if (i.base_reg
|
||||
&& i.base_reg->reg_type == (Reg16 | InOutPortReg)
|
||||
&& i.index_reg == 0
|
||||
&& i.log2_scale_factor == 0
|
||||
&& i.seg[i.mem_operands] == 0
|
||||
&& (i.types[this_operand] & Disp) == 0)
|
||||
{
|
||||
i.types[this_operand] = InOutPortReg;
|
||||
return 1;
|
||||
}
|
||||
/* Make sure the memory operand we've been dealt is valid. */
|
||||
if (flag_16bit_code ^ (i.prefix[ADDR_PREFIX] != 0))
|
||||
{
|
||||
if ((i.base_reg
|
||||
&& ((i.base_reg->reg_type & (Reg16|BaseIndex))
|
||||
!= (Reg16|BaseIndex)))
|
||||
|| (i.index_reg
|
||||
&& (((i.index_reg->reg_type & (Reg16|BaseIndex))
|
||||
!= (Reg16|BaseIndex))
|
||||
|| ! (i.base_reg
|
||||
&& i.base_reg->reg_num < 6
|
||||
&& i.index_reg->reg_num >= 6
|
||||
&& i.log2_scale_factor == 0))))
|
||||
{
|
||||
as_bad (_("`%s' is not a valid %s bit base/index expression"),
|
||||
operand_string, "16");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((i.base_reg
|
||||
&& (i.base_reg->reg_type & Reg32) == 0)
|
||||
|| (i.index_reg
|
||||
&& ((i.index_reg->reg_type & (Reg32|BaseIndex))
|
||||
!= (Reg32|BaseIndex))))
|
||||
{
|
||||
as_bad (_("`%s' is not a valid %s bit base/index expression"),
|
||||
operand_string, "32");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Parse OPERAND_STRING into the i386_insn structure I. Returns non-zero
|
||||
on error. */
|
||||
|
||||
static int i386_operand PARAMS ((char *));
|
||||
|
||||
static int
|
||||
i386_operand (operand_string)
|
||||
char *operand_string;
|
||||
|
@ -3653,64 +3637,13 @@ i386_operand (operand_string)
|
|||
i.types[this_operand] = InOutPortReg;
|
||||
return 1;
|
||||
}
|
||||
/* Make sure the memory operand we've been dealt is valid. */
|
||||
if (flag_16bit_code ^ (i.prefix[ADDR_PREFIX] != 0))
|
||||
|
||||
if (i386_index_check () == 0)
|
||||
{
|
||||
#if INFER_ADDR_PREFIX
|
||||
try16:
|
||||
#endif
|
||||
if ((i.base_reg
|
||||
&& ((i.base_reg->reg_type & (Reg16|BaseIndex))
|
||||
!= (Reg16|BaseIndex)))
|
||||
|| (i.index_reg
|
||||
&& (((i.index_reg->reg_type & (Reg16|BaseIndex))
|
||||
!= (Reg16|BaseIndex))
|
||||
|| ! (i.base_reg
|
||||
&& i.base_reg->reg_num < 6
|
||||
&& i.index_reg->reg_num >= 6
|
||||
&& i.log2_scale_factor == 0))))
|
||||
{
|
||||
#if INFER_ADDR_PREFIX
|
||||
if (i.prefix[ADDR_PREFIX] == 0)
|
||||
{
|
||||
i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
|
||||
goto try32;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
as_bad (_("`%s' is not a valid %s bit base/index expression"),
|
||||
operand_string, "16");
|
||||
as_bad (_("`%s' is not a valid base/index expression"),
|
||||
operand_string);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
#if INFER_ADDR_PREFIX
|
||||
try32:
|
||||
#endif
|
||||
if ((i.base_reg
|
||||
&& (i.base_reg->reg_type & Reg32) == 0)
|
||||
|| (i.index_reg
|
||||
&& ((i.index_reg->reg_type & (Reg32|BaseIndex))
|
||||
!= (Reg32|BaseIndex))))
|
||||
{
|
||||
#if INFER_ADDR_PREFIX
|
||||
if (i.prefix[ADDR_PREFIX] == 0)
|
||||
{
|
||||
i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
|
||||
goto try16;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
as_bad (_("`%s' is not a valid %s bit base/index expression"),
|
||||
operand_string, "32");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
i.mem_operands++;
|
||||
}
|
||||
else
|
||||
|
@ -3775,8 +3708,8 @@ md_estimate_size_before_relax (fragP, segment)
|
|||
break;
|
||||
|
||||
default:
|
||||
/* This changes the byte-displacement jump 0x7N -->
|
||||
the dword-displacement jump 0x0f8N */
|
||||
/* This changes the byte-displacement jump 0x7N
|
||||
to the dword-displacement jump 0x0f8N. */
|
||||
opcode[1] = opcode[0] + 0x10;
|
||||
opcode[0] = TWO_BYTE_OPCODE_ESCAPE; /* two-byte escape */
|
||||
fragP->fr_fix += 1 + size; /* we've added an opcode byte */
|
||||
|
|
Loading…
Reference in a new issue