mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-26 05:47:26 +08:00
x86/Intel: drop LONG_DOUBLE_MNEM_SUFFIX
With the removal of its use for FPU insns the suffix is now finally properly misnamed. Drop its use altogether, replacing it by a separate boolean instead.
This commit is contained in:
@ -715,8 +715,10 @@ i386_intel_operand (char *operand_string, int got_a_float)
|
|||||||
&& (current_templates->start->opcode_modifier.jump == JUMP
|
&& (current_templates->start->opcode_modifier.jump == JUMP
|
||||||
|| current_templates->start->opcode_modifier.jump
|
|| current_templates->start->opcode_modifier.jump
|
||||||
== JUMP_DWORD))
|
== JUMP_DWORD))
|
||||||
suffix = flag_code == CODE_16BIT ? LONG_DOUBLE_MNEM_SUFFIX
|
{
|
||||||
: WORD_MNEM_SUFFIX;
|
i.far_branch = true;
|
||||||
|
suffix = WORD_MNEM_SUFFIX;
|
||||||
|
}
|
||||||
else if (got_a_float == 1) /* "f..." */
|
else if (got_a_float == 1) /* "f..." */
|
||||||
suffix = SHORT_MNEM_SUFFIX;
|
suffix = SHORT_MNEM_SUFFIX;
|
||||||
else
|
else
|
||||||
@ -733,7 +735,7 @@ i386_intel_operand (char *operand_string, int got_a_float)
|
|||||||
{
|
{
|
||||||
if (flag_code == CODE_16BIT)
|
if (flag_code == CODE_16BIT)
|
||||||
add_prefix (DATA_PREFIX_OPCODE);
|
add_prefix (DATA_PREFIX_OPCODE);
|
||||||
suffix = LONG_DOUBLE_MNEM_SUFFIX;
|
i.far_branch = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -774,7 +776,7 @@ i386_intel_operand (char *operand_string, int got_a_float)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case O_far_ptr:
|
case O_far_ptr:
|
||||||
suffix = LONG_DOUBLE_MNEM_SUFFIX;
|
i.far_branch = true;
|
||||||
/* FALLTHROUGH */
|
/* FALLTHROUGH */
|
||||||
case O_near_ptr:
|
case O_near_ptr:
|
||||||
if (current_templates->start->opcode_modifier.jump != JUMP
|
if (current_templates->start->opcode_modifier.jump != JUMP
|
||||||
@ -833,10 +835,6 @@ i386_intel_operand (char *operand_string, int got_a_float)
|
|||||||
if (t->opcode_modifier.no_ssuf)
|
if (t->opcode_modifier.no_ssuf)
|
||||||
continue;
|
continue;
|
||||||
break;
|
break;
|
||||||
case LONG_DOUBLE_MNEM_SUFFIX:
|
|
||||||
if (t->opcode_modifier.no_ldsuf)
|
|
||||||
continue;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
@ -916,7 +914,11 @@ i386_intel_operand (char *operand_string, int got_a_float)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else if (S_GET_SEGMENT (intel_state.seg) == reg_section)
|
else if (S_GET_SEGMENT (intel_state.seg) == reg_section)
|
||||||
jumpabsolute = true;
|
{
|
||||||
|
jumpabsolute = true;
|
||||||
|
if (intel_state.op_modifier == O_far_ptr)
|
||||||
|
i.far_branch = true;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
i386_operand_type types;
|
i386_operand_type types;
|
||||||
@ -943,8 +945,6 @@ i386_intel_operand (char *operand_string, int got_a_float)
|
|||||||
this_operand = i.operands++;
|
this_operand = i.operands++;
|
||||||
i.types[this_operand].bitfield.unspecified = 1;
|
i.types[this_operand].bitfield.unspecified = 1;
|
||||||
}
|
}
|
||||||
if (suffix == LONG_DOUBLE_MNEM_SUFFIX)
|
|
||||||
i.suffix = 0;
|
|
||||||
intel_state.seg = NULL;
|
intel_state.seg = NULL;
|
||||||
intel_state.is_mem = 0;
|
intel_state.is_mem = 0;
|
||||||
}
|
}
|
||||||
|
@ -80,9 +80,6 @@
|
|||||||
#define SHORT_MNEM_SUFFIX 's'
|
#define SHORT_MNEM_SUFFIX 's'
|
||||||
#define LONG_MNEM_SUFFIX 'l'
|
#define LONG_MNEM_SUFFIX 'l'
|
||||||
#define QWORD_MNEM_SUFFIX 'q'
|
#define QWORD_MNEM_SUFFIX 'q'
|
||||||
/* Intel Syntax. Use a non-ascii letter since since it never appears
|
|
||||||
in instructions. */
|
|
||||||
#define LONG_DOUBLE_MNEM_SUFFIX '\1'
|
|
||||||
|
|
||||||
#define END_OF_INSN '\0'
|
#define END_OF_INSN '\0'
|
||||||
|
|
||||||
@ -313,6 +310,9 @@ struct _i386_insn
|
|||||||
/* The operand to a branch insn indicates an absolute branch. */
|
/* The operand to a branch insn indicates an absolute branch. */
|
||||||
bool jumpabsolute;
|
bool jumpabsolute;
|
||||||
|
|
||||||
|
/* The operand to a branch insn indicates a far branch. */
|
||||||
|
bool far_branch;
|
||||||
|
|
||||||
/* There is a memory operand of (%dx) which should be only used
|
/* There is a memory operand of (%dx) which should be only used
|
||||||
with input/output instructions. */
|
with input/output instructions. */
|
||||||
bool input_output_operand;
|
bool input_output_operand;
|
||||||
@ -6494,14 +6494,6 @@ match_template (char mnem_suffix)
|
|||||||
case QWORD_MNEM_SUFFIX:
|
case QWORD_MNEM_SUFFIX:
|
||||||
suffix_check.no_qsuf = 1;
|
suffix_check.no_qsuf = 1;
|
||||||
break;
|
break;
|
||||||
default:
|
|
||||||
/* NB: In Intel syntax, normally we can check for memory operand
|
|
||||||
size when there is no mnemonic suffix. But jmp and call have
|
|
||||||
2 different encodings with Dword memory operand size, one with
|
|
||||||
No_ldSuf and the other without. i.suffix is set to
|
|
||||||
LONG_DOUBLE_MNEM_SUFFIX to skip the one with No_ldSuf. */
|
|
||||||
if (i.suffix == LONG_DOUBLE_MNEM_SUFFIX)
|
|
||||||
suffix_check.no_ldsuf = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (t = current_templates->start; t < current_templates->end; t++)
|
for (t = current_templates->start; t < current_templates->end; t++)
|
||||||
@ -6555,8 +6547,7 @@ match_template (char mnem_suffix)
|
|||||||
|| (t->opcode_modifier.no_wsuf && suffix_check.no_wsuf)
|
|| (t->opcode_modifier.no_wsuf && suffix_check.no_wsuf)
|
||||||
|| (t->opcode_modifier.no_lsuf && suffix_check.no_lsuf)
|
|| (t->opcode_modifier.no_lsuf && suffix_check.no_lsuf)
|
||||||
|| (t->opcode_modifier.no_ssuf && suffix_check.no_ssuf)
|
|| (t->opcode_modifier.no_ssuf && suffix_check.no_ssuf)
|
||||||
|| (t->opcode_modifier.no_qsuf && suffix_check.no_qsuf)
|
|| (t->opcode_modifier.no_qsuf && suffix_check.no_qsuf))
|
||||||
|| (t->opcode_modifier.no_ldsuf && suffix_check.no_ldsuf))
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
specific_error = progress (operand_size_mismatch);
|
specific_error = progress (operand_size_mismatch);
|
||||||
@ -6574,6 +6565,15 @@ match_template (char mnem_suffix)
|
|||||||
if (i.jumpabsolute && t->opcode_modifier.jump != JUMP_ABSOLUTE)
|
if (i.jumpabsolute && t->opcode_modifier.jump != JUMP_ABSOLUTE)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* In Intel syntax, normally we can check for memory operand size when
|
||||||
|
there is no mnemonic suffix. But jmp and call have 2 different
|
||||||
|
encodings with Dword memory operand size. Skip the "near" one
|
||||||
|
(permitting a register operand) when "far" was requested. */
|
||||||
|
if (i.far_branch
|
||||||
|
&& t->opcode_modifier.jump == JUMP_ABSOLUTE
|
||||||
|
&& t->operand_types[0].bitfield.class == Reg)
|
||||||
|
continue;
|
||||||
|
|
||||||
for (j = 0; j < MAX_OPERANDS; j++)
|
for (j = 0; j < MAX_OPERANDS; j++)
|
||||||
operand_types[j] = t->operand_types[j];
|
operand_types[j] = t->operand_types[j];
|
||||||
|
|
||||||
|
@ -434,7 +434,7 @@ call, 0xff, 2, Cpu64, Amd64|Modrm|JumpAbsolute|DefaultSize|No_bSuf|No_lSuf|No_sS
|
|||||||
call, 0xff, 2, Cpu64, Intel64|Modrm|JumpAbsolute|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_ldSuf|NoRex64|BNDPrefixOk|NoTrackPrefixOk, { Reg64|Unspecified|BaseIndex }
|
call, 0xff, 2, Cpu64, Intel64|Modrm|JumpAbsolute|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_ldSuf|NoRex64|BNDPrefixOk|NoTrackPrefixOk, { Reg64|Unspecified|BaseIndex }
|
||||||
// Intel Syntax remaining call instances.
|
// Intel Syntax remaining call instances.
|
||||||
call, 0x9a, None, CpuNo64, JumpInterSegment|DefaultSize|No_bSuf|No_sSuf|No_qSuf|No_ldSuf, { Imm16, Imm16|Imm32 }
|
call, 0x9a, None, CpuNo64, JumpInterSegment|DefaultSize|No_bSuf|No_sSuf|No_qSuf|No_ldSuf, { Imm16, Imm16|Imm32 }
|
||||||
call, 0xff, 3, 0, Amd64|Modrm|JumpAbsolute|DefaultSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf, { Dword|Fword|BaseIndex }
|
call, 0xff, 3, 0, Amd64|Modrm|JumpAbsolute|DefaultSize|NoSuf, { Dword|Fword|BaseIndex }
|
||||||
call, 0xff, 3, Cpu64, Intel64|Modrm|JumpAbsolute|NoSuf, { Dword|Fword|Tbyte|BaseIndex }
|
call, 0xff, 3, Cpu64, Intel64|Modrm|JumpAbsolute|NoSuf, { Dword|Fword|Tbyte|BaseIndex }
|
||||||
lcall, 0x9a, None, CpuNo64, JumpInterSegment|DefaultSize|No_bSuf|No_sSuf|No_qSuf|No_ldSuf, { Imm16, Imm16|Imm32 }
|
lcall, 0x9a, None, CpuNo64, JumpInterSegment|DefaultSize|No_bSuf|No_sSuf|No_qSuf|No_ldSuf, { Imm16, Imm16|Imm32 }
|
||||||
lcall, 0xff, 3, 0, Amd64|Modrm|JumpAbsolute|DefaultSize|No_bSuf|No_sSuf|No_qSuf|No_ldSuf, { Unspecified|BaseIndex }
|
lcall, 0xff, 3, 0, Amd64|Modrm|JumpAbsolute|DefaultSize|No_bSuf|No_sSuf|No_qSuf|No_ldSuf, { Unspecified|BaseIndex }
|
||||||
@ -447,7 +447,7 @@ jmp, 0xff, 4, Cpu64, Amd64|Modrm|JumpAbsolute|No_bSuf|No_lSuf|No_sSuf|No_ldSuf|N
|
|||||||
jmp, 0xff, 4, Cpu64, Intel64|Modrm|JumpAbsolute|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_ldSuf|NoRex64|BNDPrefixOk|NoTrackPrefixOk, { Reg64|Unspecified|BaseIndex }
|
jmp, 0xff, 4, Cpu64, Intel64|Modrm|JumpAbsolute|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_ldSuf|NoRex64|BNDPrefixOk|NoTrackPrefixOk, { Reg64|Unspecified|BaseIndex }
|
||||||
// Intel Syntax remaining jmp instances.
|
// Intel Syntax remaining jmp instances.
|
||||||
jmp, 0xea, None, CpuNo64, JumpInterSegment|No_bSuf|No_sSuf|No_qSuf|No_ldSuf, { Imm16, Imm16|Imm32 }
|
jmp, 0xea, None, CpuNo64, JumpInterSegment|No_bSuf|No_sSuf|No_qSuf|No_ldSuf, { Imm16, Imm16|Imm32 }
|
||||||
jmp, 0xff, 5, 0, Amd64|Modrm|JumpAbsolute|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf, { Dword|Fword|BaseIndex }
|
jmp, 0xff, 5, 0, Amd64|Modrm|JumpAbsolute|NoSuf, { Dword|Fword|BaseIndex }
|
||||||
jmp, 0xff, 5, Cpu64, Intel64|Modrm|JumpAbsolute|NoSuf, { Dword|Fword|Tbyte|BaseIndex }
|
jmp, 0xff, 5, Cpu64, Intel64|Modrm|JumpAbsolute|NoSuf, { Dword|Fword|Tbyte|BaseIndex }
|
||||||
ljmp, 0xea, None, CpuNo64, JumpInterSegment|No_bSuf|No_sSuf|No_qSuf|No_ldSuf, { Imm16, Imm16|Imm32 }
|
ljmp, 0xea, None, CpuNo64, JumpInterSegment|No_bSuf|No_sSuf|No_qSuf|No_ldSuf, { Imm16, Imm16|Imm32 }
|
||||||
ljmp, 0xff, 5, 0, Amd64|Modrm|JumpAbsolute|No_bSuf|No_sSuf|No_qSuf|No_ldSuf, { Unspecified|BaseIndex }
|
ljmp, 0xff, 5, 0, Amd64|Modrm|JumpAbsolute|No_bSuf|No_sSuf|No_qSuf|No_ldSuf, { Unspecified|BaseIndex }
|
||||||
|
@ -3143,7 +3143,7 @@ const insn_template i386_optab[] =
|
|||||||
{ { 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
{ { 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0 } } } },
|
0, 0, 0, 0, 0, 0 } } } },
|
||||||
{ "call", 0xff, 1, 3,
|
{ "call", 0xff, 1, 3,
|
||||||
{ 0, 0, 0, 1, 5, 0, 0, 0, 0, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
|
{ 0, 0, 0, 1, 5, 0, 0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
0, 0, 1 },
|
0, 0, 1 },
|
||||||
{ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
{ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
@ -3290,7 +3290,7 @@ const insn_template i386_optab[] =
|
|||||||
{ { 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
{ { 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0 } } } },
|
0, 0, 0, 0, 0, 0 } } } },
|
||||||
{ "jmp", 0xff, 1, 5,
|
{ "jmp", 0xff, 1, 5,
|
||||||
{ 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
|
{ 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
0, 0, 1 },
|
0, 0, 1 },
|
||||||
{ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
{ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
Reference in New Issue
Block a user