x86 indirect jump/call syntax fixes. Disassembly fix for lcall.

This commit is contained in:
Alan Modra 1999-12-27 16:10:31 +00:00
parent 221f77a9db
commit 3138f287b1
6 changed files with 29 additions and 11 deletions

View file

@ -1,3 +1,9 @@
1999-12-27 Alan Modra <alan@spri.levels.unisa.edu.au>
* config/tc-i386.c (MATCH): Relax JumpAbsolute check. Emit a
warning for absolute jump/call without `*' in non-intel mode. No
need to set i.types[0] JumpAbsolute in intel mode.
1999-12-22 Philip Blundell <pb@futuretv.com> 1999-12-22 Philip Blundell <pb@futuretv.com>
* config/tc-arm.c (arm_s_text): If OBJ_ELF, call the appropriate * config/tc-arm.c (arm_s_text): If OBJ_ELF, call the appropriate

View file

@ -1255,9 +1255,8 @@ md_assemble (line)
with the template operand types. */ with the template operand types. */
#define MATCH(overlap, given, template) \ #define MATCH(overlap, given, template) \
((overlap) \ ((overlap & ~JumpAbsolute) \
&& ((given) & BaseIndex) == ((overlap) & BaseIndex) \ && ((given) & (BaseIndex|JumpAbsolute)) == ((overlap) & (BaseIndex|JumpAbsolute)))
&& ((given) & JumpAbsolute) == ((template) & JumpAbsolute))
/* If given types r0 and r1 are registers they must be of the same type /* If given types r0 and r1 are registers they must be of the same type
unless the expected operand type register overlap is null. unless the expected operand type register overlap is null.
@ -1347,11 +1346,6 @@ md_assemble (line)
i.types[xchg1] = temp_type; i.types[xchg1] = temp_type;
} }
if (!strcmp(mnemonic,"jmp")
|| !strcmp (mnemonic, "call"))
if ((i.types[0] & Reg) || i.types[0] & BaseIndex)
i.types[0] |= JumpAbsolute;
} }
overlap0 = 0; overlap0 = 0;
overlap1 = 0; overlap1 = 0;
@ -1460,6 +1454,12 @@ md_assemble (line)
return; return;
} }
if (!intel_syntax
&& (i.types[0] & JumpAbsolute) != (t->operand_types[0] & JumpAbsolute))
{
as_warn (_("Indirect %s without `*'"), t->name);
}
if ((t->opcode_modifier & (IsPrefix|IgnoreSize)) == (IsPrefix|IgnoreSize)) if ((t->opcode_modifier & (IsPrefix|IgnoreSize)) == (IsPrefix|IgnoreSize))
{ {
/* Warn them that a data or address size prefix doesn't affect /* Warn them that a data or address size prefix doesn't affect

View file

@ -1,3 +1,8 @@
1999-12-27 Alan Modra <alan@spri.levels.unisa.edu.au>
* i386.h: Add JumpAbsolute qualifier to all non-intel mode
indirect jumps and calls. Add FF/3 call for intel mode.
Wed Dec 1 03:05:25 1999 Jeffrey A Law (law@cygnus.com) Wed Dec 1 03:05:25 1999 Jeffrey A Law (law@cygnus.com)
* mn10300.h: Add new operand types. Add new instruction formats. * mn10300.h: Add new operand types. Add new instruction formats.

View file

@ -315,17 +315,20 @@ static const template i386_optab[] = {
{"call", 1, 0xff, 2, wl_Suf|Modrm|DefaultSize, { WordReg|WordMem|JumpAbsolute, 0, 0} }, {"call", 1, 0xff, 2, wl_Suf|Modrm|DefaultSize, { WordReg|WordMem|JumpAbsolute, 0, 0} },
/* Intel Syntax */ /* Intel Syntax */
{"call", 2, 0x9a, X, wl_Suf|JumpInterSegment|DefaultSize, { Imm16, Imm16|Imm32, 0} }, {"call", 2, 0x9a, X, wl_Suf|JumpInterSegment|DefaultSize, { Imm16, Imm16|Imm32, 0} },
/* Intel Syntax */
{"call", 1, 0xff, 3, wl_Suf|Modrm|DefaultSize, { WordMem, 0, 0} },
{"lcall", 2, 0x9a, X, wl_Suf|JumpInterSegment|DefaultSize, { Imm16, Imm16|Imm32, 0} }, {"lcall", 2, 0x9a, X, wl_Suf|JumpInterSegment|DefaultSize, { Imm16, Imm16|Imm32, 0} },
{"lcall", 1, 0xff, 3, wl_Suf|Modrm|DefaultSize, { WordMem, 0, 0} }, {"lcall", 1, 0xff, 3, wl_Suf|Modrm|DefaultSize, { WordMem|JumpAbsolute, 0, 0} },
#define JUMP_PC_RELATIVE 0xeb #define JUMP_PC_RELATIVE 0xeb
{"jmp", 1, 0xeb, X, NoSuf|Jump, { Disp, 0, 0} }, {"jmp", 1, 0xeb, X, NoSuf|Jump, { Disp, 0, 0} },
{"jmp", 1, 0xff, 4, wl_Suf|Modrm, { WordReg|WordMem|JumpAbsolute, 0, 0} }, {"jmp", 1, 0xff, 4, wl_Suf|Modrm, { WordReg|WordMem|JumpAbsolute, 0, 0} },
/* Intel Syntax */ /* Intel Syntax */
{"jmp", 2, 0xea, X, wl_Suf|JumpInterSegment, { Imm16, Imm16|Imm32, 0} }, {"jmp", 2, 0xea, X, wl_Suf|JumpInterSegment, { Imm16, Imm16|Imm32, 0} },
/* Intel Syntax */
{"jmp", 1, 0xff, 5, wl_Suf|Modrm, { WordMem, 0, 0} }, {"jmp", 1, 0xff, 5, wl_Suf|Modrm, { WordMem, 0, 0} },
{"ljmp", 2, 0xea, X, wl_Suf|JumpInterSegment, { Imm16, Imm16|Imm32, 0} }, {"ljmp", 2, 0xea, X, wl_Suf|JumpInterSegment, { Imm16, Imm16|Imm32, 0} },
{"ljmp", 1, 0xff, 5, wl_Suf|Modrm, { WordMem, 0, 0} }, {"ljmp", 1, 0xff, 5, wl_Suf|Modrm, { WordMem|JumpAbsolute, 0, 0} },
{"ret", 0, 0xc3, X, wl_Suf|DefaultSize, { 0, 0, 0} }, {"ret", 0, 0xc3, X, wl_Suf|DefaultSize, { 0, 0, 0} },
{"ret", 1, 0xc2, X, wl_Suf|DefaultSize, { Imm16, 0, 0} }, {"ret", 1, 0xc2, X, wl_Suf|DefaultSize, { Imm16, 0, 0} },

View file

@ -1,3 +1,7 @@
1999-12-27 Alan Modra <alan@spri.levels.unisa.edu.au>
* i386-dis.c (grps[]): Correct GRP5 FF/3 from "call" to "lcall".
Wed Dec 1 03:34:53 1999 Jeffrey A Law (law@cygnus.com) Wed Dec 1 03:34:53 1999 Jeffrey A Law (law@cygnus.com)
* m10300-opc.c, m10300-dis.c: Add am33 support. * m10300-opc.c, m10300-dis.c: Add am33 support.

View file

@ -1749,7 +1749,7 @@ static const struct dis386 grps[][8] = {
{ "incQ", Ev, XX, XX }, { "incQ", Ev, XX, XX },
{ "decQ", Ev, XX, XX }, { "decQ", Ev, XX, XX },
{ "callP", indirEv, XX, XX }, { "callP", indirEv, XX, XX },
{ "callP", indirEv, XX, XX }, { "lcallP", indirEv, XX, XX },
{ "jmpP", indirEv, XX, XX }, { "jmpP", indirEv, XX, XX },
{ "ljmpP", indirEv, XX, XX }, { "ljmpP", indirEv, XX, XX },
{ "pushQ", Ev, XX, XX }, { "pushQ", Ev, XX, XX },