diff options
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 8 | ||||
-rw-r--r-- | gas/config/tc-i386-intel.c | 21 | ||||
-rw-r--r-- | gas/config/tc-i386.c | 46 |
3 files changed, 41 insertions, 34 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index e2db6fd..7e9e6ef 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,13 @@ 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> + * config/tc-i386.c (struct _i386_insn): Add jumpabsolute field. (operand_type_match): Drop jumpabsolute use. (type_names): Remove OPERAND_TYPE_JUMPABSOLUTE entry. diff --git a/gas/config/tc-i386-intel.c b/gas/config/tc-i386-intel.c index fd71afb..49f558d 100644 --- a/gas/config/tc-i386-intel.c +++ b/gas/config/tc-i386-intel.c @@ -658,8 +658,9 @@ i386_intel_operand (char *operand_string, int got_a_float) || current_templates->start->base_opcode == 0x62 /* bound */) suffix = WORD_MNEM_SUFFIX; else if (flag_code == CODE_16BIT - && (current_templates->start->opcode_modifier.jump - || current_templates->start->opcode_modifier.jumpdword)) + && (current_templates->start->opcode_modifier.jump == JUMP + || current_templates->start->opcode_modifier.jump + == JUMP_DWORD)) suffix = LONG_DOUBLE_MNEM_SUFFIX; else if (got_a_float == 1) /* "f..." */ suffix = SHORT_MNEM_SUFFIX; @@ -717,8 +718,8 @@ i386_intel_operand (char *operand_string, int got_a_float) suffix = LONG_DOUBLE_MNEM_SUFFIX; /* FALLTHROUGH */ case O_near_ptr: - if (!current_templates->start->opcode_modifier.jump - && !current_templates->start->opcode_modifier.jumpdword) + if (current_templates->start->opcode_modifier.jump != JUMP + && current_templates->start->opcode_modifier.jump != JUMP_DWORD) suffix = got_a_float /* so it will cause an error */ ? BYTE_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. */ - if (current_templates->start->opcode_modifier.jump - || current_templates->start->opcode_modifier.jumpdword - || current_templates->start->opcode_modifier.jumpintersegment) + if (current_templates->start->opcode_modifier.jump == JUMP + || current_templates->start->opcode_modifier.jump == JUMP_DWORD + || current_templates->start->opcode_modifier.jump == JUMP_INTERSEGMENT) { bfd_boolean jumpabsolute = FALSE; @@ -857,9 +858,9 @@ i386_intel_operand (char *operand_string, int got_a_float) ljmp 0x9090,0x90909090 */ - if ((current_templates->start->opcode_modifier.jumpintersegment - || current_templates->start->opcode_modifier.jumpdword - || current_templates->start->opcode_modifier.jump) + if ((current_templates->start->opcode_modifier.jump == JUMP_INTERSEGMENT + || current_templates->start->opcode_modifier.jump == JUMP_DWORD + || current_templates->start->opcode_modifier.jump == JUMP) && this_operand == 1 && intel_state.seg == NULL && i.mem_operands == 1 diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index fcd6215..120367d 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -2066,11 +2066,9 @@ operand_size_match (const insn_template *t) { unsigned int j, match = MATCH_STRAIGHT; - /* Don't check jump instructions. */ + /* Don't check non-absolute jump instructions. */ if (t->opcode_modifier.jump - || t->opcode_modifier.jumpbyte - || t->opcode_modifier.jumpdword - || t->opcode_modifier.jumpintersegment) + && t->opcode_modifier.jump != JUMP_ABSOLUTE) return match; /* Check memory and accumulator operand size. */ @@ -4462,9 +4460,9 @@ md_assemble (char *line) i.imm_operands = 0; } - if ((i.tm.opcode_modifier.jump - || i.tm.opcode_modifier.jumpbyte - || i.tm.opcode_modifier.jumpdword) + if ((i.tm.opcode_modifier.jump == JUMP + || i.tm.opcode_modifier.jump == JUMP_BYTE + || i.tm.opcode_modifier.jump == JUMP_DWORD) && i.op[0].disps->X_op == O_constant) { /* Convert "jmp constant" (and "call constant") to a jump (call) to @@ -4764,8 +4762,8 @@ check_suffix: } } - if (current_templates->start->opcode_modifier.jump - || current_templates->start->opcode_modifier.jumpbyte) + if (current_templates->start->opcode_modifier.jump == JUMP + || current_templates->start->opcode_modifier.jump == JUMP_BYTE) { /* Check for a branch hint. We allow ",pt" and ",pn" for predict taken and predict not taken respectively. @@ -5745,11 +5743,11 @@ match_template (char mnem_suffix) /* 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 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; continue; @@ -6132,7 +6130,7 @@ check_reverse: if (!quiet_warnings) { if (!intel_syntax - && (i.jumpabsolute != t->opcode_modifier.jumpabsolute)) + && (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE))) as_warn (_("indirect %s without `*'"), t->name); if (t->opcode_modifier.isprefix @@ -6331,9 +6329,9 @@ process_suffix (void) } else if (intel_syntax && !i.suffix - && (i.tm.opcode_modifier.jumpabsolute - || i.tm.opcode_modifier.jumpbyte - || i.tm.opcode_modifier.jumpintersegment + && (i.tm.opcode_modifier.jump == JUMP_ABSOLUTE + || i.tm.opcode_modifier.jump == JUMP_BYTE + || i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT || (i.tm.base_opcode == 0x0f01 /* [ls][gi]dt */ && i.tm.extension_opcode <= 3))) { @@ -6443,11 +6441,11 @@ process_suffix (void) && !is_any_vex_encoding (&i.tm) && ((i.suffix == LONG_MNEM_SUFFIX) == (flag_code == CODE_16BIT) || (flag_code == CODE_64BIT - && i.tm.opcode_modifier.jumpbyte))) + && i.tm.opcode_modifier.jump == JUMP_BYTE))) { 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; if (!add_prefix (prefix)) @@ -7898,7 +7896,7 @@ output_jump (void) fixS *fixP; 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. */ size = 1; @@ -8289,12 +8287,12 @@ output_insn (void) insn_start_off = frag_now_fix (); /* Output jumps. */ - if (i.tm.opcode_modifier.jump) + if (i.tm.opcode_modifier.jump == JUMP) output_branch (); - else if (i.tm.opcode_modifier.jumpbyte - || i.tm.opcode_modifier.jumpdword) + else if (i.tm.opcode_modifier.jump == JUMP_BYTE + || i.tm.opcode_modifier.jump == JUMP_DWORD) output_jump (); - else if (i.tm.opcode_modifier.jumpintersegment) + else if (i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT) output_interseg_jump (); else { @@ -9474,8 +9472,8 @@ i386_displacement (char *disp_start, char *disp_end) operand_type_set (&bigdisp, 0); if (i.jumpabsolute - || (!current_templates->start->opcode_modifier.jump - && !current_templates->start->opcode_modifier.jumpdword)) + || (current_templates->start->opcode_modifier.jump != JUMP + && current_templates->start->opcode_modifier.jump != JUMP_DWORD)) { bigdisp.bitfield.disp32 = 1; override = (i.prefix[ADDR_PREFIX] != 0); |