diff options
Diffstat (limited to 'gas/config/tc-i386.c')
-rw-r--r-- | gas/config/tc-i386.c | 40 |
1 files changed, 30 insertions, 10 deletions
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 945ceb2..543fe25 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -598,9 +598,11 @@ static int shared = 0; 0 if att syntax. */ static int intel_syntax = 0; -/* 1 for Intel64 ISA, - 0 if AMD64 ISA. */ -static int intel64; +static enum x86_64_isa +{ + amd64 = 1, /* AMD64 ISA. */ + intel64 /* Intel64 ISA. */ +} isa64; /* 1 for intel mnemonic, 0 if att mnemonic. */ @@ -5805,14 +5807,32 @@ match_template (char mnem_suffix) if (intel_mnemonic && t->opcode_modifier.attmnemonic) continue; - /* Check AT&T/Intel syntax and Intel64/AMD64 ISA. */ + /* Check AT&T/Intel syntax. */ i.error = unsupported_syntax; if ((intel_syntax && t->opcode_modifier.attsyntax) - || (!intel_syntax && t->opcode_modifier.intelsyntax) - || (intel64 && t->opcode_modifier.amd64) - || (!intel64 && t->opcode_modifier.intel64)) + || (!intel_syntax && t->opcode_modifier.intelsyntax)) continue; + /* Check Intel64/AMD64 ISA. */ + switch (isa64) + { + default: + /* Default: Don't accept Intel64. */ + if (t->opcode_modifier.isa64 == INTEL64) + continue; + break; + case amd64: + /* -mamd64: Don't accept Intel64 and Intel64 only. */ + if (t->opcode_modifier.isa64 >= INTEL64) + continue; + break; + case intel64: + /* -mintel64: Don't accept AMD64. */ + if (t->opcode_modifier.isa64 == AMD64) + continue; + break; + } + /* Check the suffix. */ i.error = invalid_instruction_suffix; if ((t->opcode_modifier.no_bsuf && suffix_check.no_bsuf) @@ -9963,7 +9983,7 @@ i386_displacement (char *disp_start, char *disp_end) if (t->opcode_modifier.jump != current_templates->start->opcode_modifier.jump) break; - if (t->opcode_modifier.intel64) + if ((t->opcode_modifier.isa64 >= INTEL64)) has_intel64 = TRUE; } if (t < current_templates->end) @@ -12525,11 +12545,11 @@ md_parse_option (int c, const char *arg) break; case OPTION_MAMD64: - intel64 = 0; + isa64 = amd64; break; case OPTION_MINTEL64: - intel64 = 1; + isa64 = intel64; break; case 'O': |