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:
Jan Beulich
2019-11-14 08:47:44 +01:00
parent 6f2f06bea8
commit 0cfa3eb352
8 changed files with 10989 additions and 14892 deletions

View File

@ -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.

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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),

View File

@ -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;

View File

@ -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

File diff suppressed because it is too large Load Diff