mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-26 05:47:26 +08:00
x86: fold individual Jump* attributes into a single Jump one
..., taking just 3 bits instead of 5. No two of them are used together.
This commit is contained in:
@ -1,3 +1,11 @@
|
|||||||
|
2019-11-14 Jan Beulich <jbeulich@suse.com>
|
||||||
|
|
||||||
|
* config/tc-i386.c (operand_size_match, md_assemble,
|
||||||
|
parse_insn, match_template, process_suffix, output_jump,
|
||||||
|
output_insn, i386_displacement): Adjust jump* field use/
|
||||||
|
handling.
|
||||||
|
* config/tc-i386-intel.c (i386_intel_operand): Likewise.
|
||||||
|
|
||||||
2019-11-14 Jan Beulich <jbeulich@suse.com>
|
2019-11-14 Jan Beulich <jbeulich@suse.com>
|
||||||
|
|
||||||
* config/tc-i386.c (struct _i386_insn): Add jumpabsolute field.
|
* config/tc-i386.c (struct _i386_insn): Add jumpabsolute field.
|
||||||
|
@ -658,8 +658,9 @@ i386_intel_operand (char *operand_string, int got_a_float)
|
|||||||
|| current_templates->start->base_opcode == 0x62 /* bound */)
|
|| current_templates->start->base_opcode == 0x62 /* bound */)
|
||||||
suffix = WORD_MNEM_SUFFIX;
|
suffix = WORD_MNEM_SUFFIX;
|
||||||
else if (flag_code == CODE_16BIT
|
else if (flag_code == CODE_16BIT
|
||||||
&& (current_templates->start->opcode_modifier.jump
|
&& (current_templates->start->opcode_modifier.jump == JUMP
|
||||||
|| current_templates->start->opcode_modifier.jumpdword))
|
|| current_templates->start->opcode_modifier.jump
|
||||||
|
== JUMP_DWORD))
|
||||||
suffix = LONG_DOUBLE_MNEM_SUFFIX;
|
suffix = LONG_DOUBLE_MNEM_SUFFIX;
|
||||||
else if (got_a_float == 1) /* "f..." */
|
else if (got_a_float == 1) /* "f..." */
|
||||||
suffix = SHORT_MNEM_SUFFIX;
|
suffix = SHORT_MNEM_SUFFIX;
|
||||||
@ -717,8 +718,8 @@ i386_intel_operand (char *operand_string, int got_a_float)
|
|||||||
suffix = LONG_DOUBLE_MNEM_SUFFIX;
|
suffix = LONG_DOUBLE_MNEM_SUFFIX;
|
||||||
/* FALLTHROUGH */
|
/* FALLTHROUGH */
|
||||||
case O_near_ptr:
|
case O_near_ptr:
|
||||||
if (!current_templates->start->opcode_modifier.jump
|
if (current_templates->start->opcode_modifier.jump != JUMP
|
||||||
&& !current_templates->start->opcode_modifier.jumpdword)
|
&& current_templates->start->opcode_modifier.jump != JUMP_DWORD)
|
||||||
suffix = got_a_float /* so it will cause an error */
|
suffix = got_a_float /* so it will cause an error */
|
||||||
? BYTE_MNEM_SUFFIX
|
? BYTE_MNEM_SUFFIX
|
||||||
: LONG_DOUBLE_MNEM_SUFFIX;
|
: LONG_DOUBLE_MNEM_SUFFIX;
|
||||||
@ -739,9 +740,9 @@ i386_intel_operand (char *operand_string, int got_a_float)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Operands for jump/call need special consideration. */
|
/* Operands for jump/call need special consideration. */
|
||||||
if (current_templates->start->opcode_modifier.jump
|
if (current_templates->start->opcode_modifier.jump == JUMP
|
||||||
|| current_templates->start->opcode_modifier.jumpdword
|
|| current_templates->start->opcode_modifier.jump == JUMP_DWORD
|
||||||
|| current_templates->start->opcode_modifier.jumpintersegment)
|
|| current_templates->start->opcode_modifier.jump == JUMP_INTERSEGMENT)
|
||||||
{
|
{
|
||||||
bfd_boolean jumpabsolute = FALSE;
|
bfd_boolean jumpabsolute = FALSE;
|
||||||
|
|
||||||
@ -857,9 +858,9 @@ i386_intel_operand (char *operand_string, int got_a_float)
|
|||||||
ljmp 0x9090,0x90909090
|
ljmp 0x9090,0x90909090
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if ((current_templates->start->opcode_modifier.jumpintersegment
|
if ((current_templates->start->opcode_modifier.jump == JUMP_INTERSEGMENT
|
||||||
|| current_templates->start->opcode_modifier.jumpdword
|
|| current_templates->start->opcode_modifier.jump == JUMP_DWORD
|
||||||
|| current_templates->start->opcode_modifier.jump)
|
|| current_templates->start->opcode_modifier.jump == JUMP)
|
||||||
&& this_operand == 1
|
&& this_operand == 1
|
||||||
&& intel_state.seg == NULL
|
&& intel_state.seg == NULL
|
||||||
&& i.mem_operands == 1
|
&& i.mem_operands == 1
|
||||||
|
@ -2066,11 +2066,9 @@ operand_size_match (const insn_template *t)
|
|||||||
{
|
{
|
||||||
unsigned int j, match = MATCH_STRAIGHT;
|
unsigned int j, match = MATCH_STRAIGHT;
|
||||||
|
|
||||||
/* Don't check jump instructions. */
|
/* Don't check non-absolute jump instructions. */
|
||||||
if (t->opcode_modifier.jump
|
if (t->opcode_modifier.jump
|
||||||
|| t->opcode_modifier.jumpbyte
|
&& t->opcode_modifier.jump != JUMP_ABSOLUTE)
|
||||||
|| t->opcode_modifier.jumpdword
|
|
||||||
|| t->opcode_modifier.jumpintersegment)
|
|
||||||
return match;
|
return match;
|
||||||
|
|
||||||
/* Check memory and accumulator operand size. */
|
/* Check memory and accumulator operand size. */
|
||||||
@ -4462,9 +4460,9 @@ md_assemble (char *line)
|
|||||||
i.imm_operands = 0;
|
i.imm_operands = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((i.tm.opcode_modifier.jump
|
if ((i.tm.opcode_modifier.jump == JUMP
|
||||||
|| i.tm.opcode_modifier.jumpbyte
|
|| i.tm.opcode_modifier.jump == JUMP_BYTE
|
||||||
|| i.tm.opcode_modifier.jumpdword)
|
|| i.tm.opcode_modifier.jump == JUMP_DWORD)
|
||||||
&& i.op[0].disps->X_op == O_constant)
|
&& i.op[0].disps->X_op == O_constant)
|
||||||
{
|
{
|
||||||
/* Convert "jmp constant" (and "call constant") to a jump (call) to
|
/* Convert "jmp constant" (and "call constant") to a jump (call) to
|
||||||
@ -4764,8 +4762,8 @@ check_suffix:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (current_templates->start->opcode_modifier.jump
|
if (current_templates->start->opcode_modifier.jump == JUMP
|
||||||
|| current_templates->start->opcode_modifier.jumpbyte)
|
|| current_templates->start->opcode_modifier.jump == JUMP_BYTE)
|
||||||
{
|
{
|
||||||
/* Check for a branch hint. We allow ",pt" and ",pn" for
|
/* Check for a branch hint. We allow ",pt" and ",pn" for
|
||||||
predict taken and predict not taken respectively.
|
predict taken and predict not taken respectively.
|
||||||
@ -5745,11 +5743,11 @@ match_template (char mnem_suffix)
|
|||||||
|
|
||||||
/* This is intentionally not
|
/* This is intentionally not
|
||||||
|
|
||||||
if (i.jumpabsolute != t->opcode_modifier.jumpabsolute)
|
if (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE))
|
||||||
|
|
||||||
as the case of a missing * on the operand is accepted (perhaps with
|
as the case of a missing * on the operand is accepted (perhaps with
|
||||||
a warning, issued further down). */
|
a warning, issued further down). */
|
||||||
if (i.jumpabsolute && !t->opcode_modifier.jumpabsolute)
|
if (i.jumpabsolute && t->opcode_modifier.jump != JUMP_ABSOLUTE)
|
||||||
{
|
{
|
||||||
i.error = operand_type_mismatch;
|
i.error = operand_type_mismatch;
|
||||||
continue;
|
continue;
|
||||||
@ -6132,7 +6130,7 @@ check_reverse:
|
|||||||
if (!quiet_warnings)
|
if (!quiet_warnings)
|
||||||
{
|
{
|
||||||
if (!intel_syntax
|
if (!intel_syntax
|
||||||
&& (i.jumpabsolute != t->opcode_modifier.jumpabsolute))
|
&& (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE)))
|
||||||
as_warn (_("indirect %s without `*'"), t->name);
|
as_warn (_("indirect %s without `*'"), t->name);
|
||||||
|
|
||||||
if (t->opcode_modifier.isprefix
|
if (t->opcode_modifier.isprefix
|
||||||
@ -6331,9 +6329,9 @@ process_suffix (void)
|
|||||||
}
|
}
|
||||||
else if (intel_syntax
|
else if (intel_syntax
|
||||||
&& !i.suffix
|
&& !i.suffix
|
||||||
&& (i.tm.opcode_modifier.jumpabsolute
|
&& (i.tm.opcode_modifier.jump == JUMP_ABSOLUTE
|
||||||
|| i.tm.opcode_modifier.jumpbyte
|
|| i.tm.opcode_modifier.jump == JUMP_BYTE
|
||||||
|| i.tm.opcode_modifier.jumpintersegment
|
|| i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT
|
||||||
|| (i.tm.base_opcode == 0x0f01 /* [ls][gi]dt */
|
|| (i.tm.base_opcode == 0x0f01 /* [ls][gi]dt */
|
||||||
&& i.tm.extension_opcode <= 3)))
|
&& i.tm.extension_opcode <= 3)))
|
||||||
{
|
{
|
||||||
@ -6443,11 +6441,11 @@ process_suffix (void)
|
|||||||
&& !is_any_vex_encoding (&i.tm)
|
&& !is_any_vex_encoding (&i.tm)
|
||||||
&& ((i.suffix == LONG_MNEM_SUFFIX) == (flag_code == CODE_16BIT)
|
&& ((i.suffix == LONG_MNEM_SUFFIX) == (flag_code == CODE_16BIT)
|
||||||
|| (flag_code == CODE_64BIT
|
|| (flag_code == CODE_64BIT
|
||||||
&& i.tm.opcode_modifier.jumpbyte)))
|
&& i.tm.opcode_modifier.jump == JUMP_BYTE)))
|
||||||
{
|
{
|
||||||
unsigned int prefix = DATA_PREFIX_OPCODE;
|
unsigned int prefix = DATA_PREFIX_OPCODE;
|
||||||
|
|
||||||
if (i.tm.opcode_modifier.jumpbyte) /* jcxz, loop */
|
if (i.tm.opcode_modifier.jump == JUMP_BYTE) /* jcxz, loop */
|
||||||
prefix = ADDR_PREFIX_OPCODE;
|
prefix = ADDR_PREFIX_OPCODE;
|
||||||
|
|
||||||
if (!add_prefix (prefix))
|
if (!add_prefix (prefix))
|
||||||
@ -7898,7 +7896,7 @@ output_jump (void)
|
|||||||
fixS *fixP;
|
fixS *fixP;
|
||||||
bfd_reloc_code_real_type jump_reloc = i.reloc[0];
|
bfd_reloc_code_real_type jump_reloc = i.reloc[0];
|
||||||
|
|
||||||
if (i.tm.opcode_modifier.jumpbyte)
|
if (i.tm.opcode_modifier.jump == JUMP_BYTE)
|
||||||
{
|
{
|
||||||
/* This is a loop or jecxz type instruction. */
|
/* This is a loop or jecxz type instruction. */
|
||||||
size = 1;
|
size = 1;
|
||||||
@ -8289,12 +8287,12 @@ output_insn (void)
|
|||||||
insn_start_off = frag_now_fix ();
|
insn_start_off = frag_now_fix ();
|
||||||
|
|
||||||
/* Output jumps. */
|
/* Output jumps. */
|
||||||
if (i.tm.opcode_modifier.jump)
|
if (i.tm.opcode_modifier.jump == JUMP)
|
||||||
output_branch ();
|
output_branch ();
|
||||||
else if (i.tm.opcode_modifier.jumpbyte
|
else if (i.tm.opcode_modifier.jump == JUMP_BYTE
|
||||||
|| i.tm.opcode_modifier.jumpdword)
|
|| i.tm.opcode_modifier.jump == JUMP_DWORD)
|
||||||
output_jump ();
|
output_jump ();
|
||||||
else if (i.tm.opcode_modifier.jumpintersegment)
|
else if (i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT)
|
||||||
output_interseg_jump ();
|
output_interseg_jump ();
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -9474,8 +9472,8 @@ i386_displacement (char *disp_start, char *disp_end)
|
|||||||
|
|
||||||
operand_type_set (&bigdisp, 0);
|
operand_type_set (&bigdisp, 0);
|
||||||
if (i.jumpabsolute
|
if (i.jumpabsolute
|
||||||
|| (!current_templates->start->opcode_modifier.jump
|
|| (current_templates->start->opcode_modifier.jump != JUMP
|
||||||
&& !current_templates->start->opcode_modifier.jumpdword))
|
&& current_templates->start->opcode_modifier.jump != JUMP_DWORD))
|
||||||
{
|
{
|
||||||
bigdisp.bitfield.disp32 = 1;
|
bigdisp.bitfield.disp32 = 1;
|
||||||
override = (i.prefix[ADDR_PREFIX] != 0);
|
override = (i.prefix[ADDR_PREFIX] != 0);
|
||||||
|
@ -1,3 +1,16 @@
|
|||||||
|
2019-11-14 Jan Beulich <jbeulich@suse.com>
|
||||||
|
|
||||||
|
* i386-gen.c (opcode_modifiers): Remove JumpDword, JumpByte,
|
||||||
|
JumpInterSegment, and JumpAbsolute entries.
|
||||||
|
* i386-opc.h (JUMP, JUMP_DWORD, JUMP_BYTE, JUMP_INTERSEGMENT,
|
||||||
|
JUMP_ABSOLUTE): Define.
|
||||||
|
(struct i386_opcode_modifier): Extend jump field to 3 bits.
|
||||||
|
Remove jumpdword, jumpbyte, jumpintersegment, and jumpabsolute
|
||||||
|
fields.
|
||||||
|
* i386-opc.tbl (JumpByte, JumpDword, JumpAbsolute,
|
||||||
|
JumpInterSegment): Define.
|
||||||
|
* i386-tbl.h: Re-generate.
|
||||||
|
|
||||||
2019-11-14 Jan Beulich <jbeulich@suse.com>
|
2019-11-14 Jan Beulich <jbeulich@suse.com>
|
||||||
|
|
||||||
* i386-gen.c (operand_type_init): Remove
|
* i386-gen.c (operand_type_init): Remove
|
||||||
|
@ -615,10 +615,6 @@ static bitfield opcode_modifiers[] =
|
|||||||
BITFIELD (Modrm),
|
BITFIELD (Modrm),
|
||||||
BITFIELD (ShortForm),
|
BITFIELD (ShortForm),
|
||||||
BITFIELD (Jump),
|
BITFIELD (Jump),
|
||||||
BITFIELD (JumpDword),
|
|
||||||
BITFIELD (JumpByte),
|
|
||||||
BITFIELD (JumpInterSegment),
|
|
||||||
BITFIELD (JumpAbsolute),
|
|
||||||
BITFIELD (FloatMF),
|
BITFIELD (FloatMF),
|
||||||
BITFIELD (FloatR),
|
BITFIELD (FloatR),
|
||||||
BITFIELD (Size),
|
BITFIELD (Size),
|
||||||
|
@ -403,16 +403,17 @@ enum
|
|||||||
Modrm,
|
Modrm,
|
||||||
/* register is in low 3 bits of opcode */
|
/* register is in low 3 bits of opcode */
|
||||||
ShortForm,
|
ShortForm,
|
||||||
/* special case for jump insns. */
|
/* special case for jump insns; value has to be 1 */
|
||||||
Jump,
|
#define JUMP 1
|
||||||
/* call and jump */
|
/* call and jump */
|
||||||
JumpDword,
|
#define JUMP_DWORD 2
|
||||||
/* loop and jecxz */
|
/* loop and jecxz */
|
||||||
JumpByte,
|
#define JUMP_BYTE 3
|
||||||
/* special case for intersegment leaps/calls */
|
/* special case for intersegment leaps/calls */
|
||||||
JumpInterSegment,
|
#define JUMP_INTERSEGMENT 4
|
||||||
/* absolute address for jump */
|
/* absolute address for jump */
|
||||||
JumpAbsolute,
|
#define JUMP_ABSOLUTE 5
|
||||||
|
Jump,
|
||||||
/* FP insn memory format bit, sized by 0x4 */
|
/* FP insn memory format bit, sized by 0x4 */
|
||||||
FloatMF,
|
FloatMF,
|
||||||
/* src/dest swap for floats. */
|
/* src/dest swap for floats. */
|
||||||
@ -652,11 +653,7 @@ typedef struct i386_opcode_modifier
|
|||||||
unsigned int load:1;
|
unsigned int load:1;
|
||||||
unsigned int modrm:1;
|
unsigned int modrm:1;
|
||||||
unsigned int shortform:1;
|
unsigned int shortform:1;
|
||||||
unsigned int jump:1;
|
unsigned int jump:3;
|
||||||
unsigned int jumpdword:1;
|
|
||||||
unsigned int jumpbyte:1;
|
|
||||||
unsigned int jumpintersegment:1;
|
|
||||||
unsigned int jumpabsolute:1;
|
|
||||||
unsigned int floatmf:1;
|
unsigned int floatmf:1;
|
||||||
unsigned int floatr:1;
|
unsigned int floatr:1;
|
||||||
unsigned int size:2;
|
unsigned int size:2;
|
||||||
|
@ -53,6 +53,11 @@
|
|||||||
|
|
||||||
#define RegBND Class=RegBND
|
#define RegBND Class=RegBND
|
||||||
|
|
||||||
|
#define JumpByte Jump=JUMP_BYTE
|
||||||
|
#define JumpDword Jump=JUMP_DWORD
|
||||||
|
#define JumpAbsolute Jump=JUMP_ABSOLUTE
|
||||||
|
#define JumpInterSegment Jump=JUMP_INTERSEGMENT
|
||||||
|
|
||||||
#define Size16 Size=SIZE16
|
#define Size16 Size=SIZE16
|
||||||
#define Size32 Size=SIZE32
|
#define Size32 Size=SIZE32
|
||||||
#define Size64 Size=SIZE64
|
#define Size64 Size=SIZE64
|
||||||
|
25765
opcodes/i386-tbl.h
25765
opcodes/i386-tbl.h
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user