[llvm] r330531 - [X86] Remove DATA32_PREFIX. Hack the printing for DATA16_PREFIX to print 'data32' in 16-bit mode. Hack the asm parser to convert 'data32' to 'data16' in 16-bit mode.
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Sat Apr 21 17:52:02 PDT 2018
Author: ctopper
Date: Sat Apr 21 17:52:02 2018
New Revision: 330531
URL: http://llvm.org/viewvc/llvm-project?rev=330531&view=rev
Log:
[X86] Remove DATA32_PREFIX. Hack the printing for DATA16_PREFIX to print 'data32' in 16-bit mode. Hack the asm parser to convert 'data32' to 'data16' in 16-bit mode.
Improve the error messages to match GNU assembler.
This also allows us to remove the hack from the disassembler table building.
Modified:
llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp
llvm/trunk/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp
llvm/trunk/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp
llvm/trunk/lib/Target/X86/X86InstrInfo.td
llvm/trunk/test/MC/X86/data-prefix-fail.s
llvm/trunk/utils/TableGen/X86DisassemblerTables.cpp
Modified: llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp?rev=330531&r1=330530&r2=330531&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp (original)
+++ llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp Sat Apr 21 17:52:02 2018
@@ -2385,6 +2385,20 @@ bool X86AsmParser::ParseInstruction(Pars
if (Flags)
PatchedName = Name;
+
+ // Hacks to handle 'data16' and 'data32'
+ if (PatchedName == "data16" && is16BitMode()) {
+ return Error(NameLoc, "redundant data16 prefix");
+ }
+ if (PatchedName == "data32") {
+ if (is32BitMode())
+ return Error(NameLoc, "redundant data32 prefix");
+ if (is64BitMode())
+ return Error(NameLoc, "'data32' is not supported in 64-bit mode");
+ // Hack to 'data16' for the table lookup.
+ PatchedName = "data16";
+ }
+
Operands.push_back(X86Operand::CreateToken(PatchedName, NameLoc));
// This does the actual operand parsing. Don't parse any more if we have a
@@ -2419,7 +2433,7 @@ bool X86AsmParser::ParseInstruction(Pars
(getLexer().is(AsmToken::LCurly) || getLexer().is(AsmToken::RCurly));
if (getLexer().isNot(AsmToken::EndOfStatement) && !CurlyAsEndOfStatement)
return TokError("unexpected token in argument list");
- }
+ }
// Consume the EndOfStatement or the prefix separator Slash
if (getLexer().is(AsmToken::EndOfStatement) ||
Modified: llvm/trunk/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp?rev=330531&r1=330530&r2=330531&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp (original)
+++ llvm/trunk/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp Sat Apr 21 17:52:02 2018
@@ -78,10 +78,8 @@ void X86ATTInstPrinter::printInst(const
// 0x66 to be interpreted as "data16" by the asm printer.
// Thus we add an adjustment here in order to print the "right" instruction.
else if (MI->getOpcode() == X86::DATA16_PREFIX &&
- (STI.getFeatureBits()[X86::Mode16Bit])) {
- MCInst Data32MI(*MI);
- Data32MI.setOpcode(X86::DATA32_PREFIX);
- printInstruction(&Data32MI, OS);
+ STI.getFeatureBits()[X86::Mode16Bit]) {
+ OS << "\tdata32";
}
// Try to print any aliases first.
else if (!printAliasInstr(MI, OS))
Modified: llvm/trunk/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp?rev=330531&r1=330530&r2=330531&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp (original)
+++ llvm/trunk/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp Sat Apr 21 17:52:02 2018
@@ -19,6 +19,7 @@
#include "llvm/MC/MCInst.h"
#include "llvm/MC/MCInstrDesc.h"
#include "llvm/MC/MCInstrInfo.h"
+#include "llvm/MC/MCSubtargetInfo.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/ErrorHandling.h"
#include <cassert>
@@ -52,7 +53,12 @@ void X86IntelInstPrinter::printInst(cons
if ((TSFlags & X86II::NOTRACK) || (Flags & X86::IP_HAS_NOTRACK))
OS << "\tnotrack\t";
- printInstruction(MI, OS);
+ // In 16-bit mode, print data16 as data32.
+ if (MI->getOpcode() == X86::DATA16_PREFIX &&
+ STI.getFeatureBits()[X86::Mode16Bit]) {
+ OS << "\tdata32";
+ } else
+ printInstruction(MI, OS);
// Next always print the annotation.
printAnnotation(OS, Annot);
Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.td?rev=330531&r1=330530&r2=330531&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86InstrInfo.td (original)
+++ llvm/trunk/lib/Target/X86/X86InstrInfo.td Sat Apr 21 17:52:02 2018
@@ -2063,12 +2063,7 @@ def REX64_PREFIX : I<0x48, RawFrm, (outs
Requires<[In64BitMode]>;
// Data16 instruction prefix
-def DATA16_PREFIX : I<0x66, RawFrm, (outs), (ins), "data16", []>,
- Requires<[Not16BitMode]>;
-
-// Data instruction prefix
-def DATA32_PREFIX : I<0x66, RawFrm, (outs), (ins), "data32", []>,
- Requires<[In16BitMode]>;
+def DATA16_PREFIX : I<0x66, RawFrm, (outs), (ins), "data16", []>;
} // SchedRW
// Repeat string operation instruction prefixes
Modified: llvm/trunk/test/MC/X86/data-prefix-fail.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/X86/data-prefix-fail.s?rev=330531&r1=330530&r2=330531&view=diff
==============================================================================
--- llvm/trunk/test/MC/X86/data-prefix-fail.s (original)
+++ llvm/trunk/test/MC/X86/data-prefix-fail.s Sat Apr 21 17:52:02 2018
@@ -5,8 +5,8 @@
// RUN: not llvm-mc -triple i386-unknown-unknown-code16 --show-encoding %s 2> %t.err | FileCheck --check-prefix=16 %s
// RUN: FileCheck --check-prefix=ERR16 < %t.err %s
-// ERR64: error: instruction requires: 16-bit mode
-// ERR32: error: instruction requires: 16-bit mode
+// ERR64: error: 'data32' is not supported in 64-bit mode
+// ERR32: error: redundant data32 prefix
// 16: data32
// 16: encoding: [0x66]
// 16: lgdtw 0
@@ -21,5 +21,5 @@ data32 lgdt 0
// 32: encoding: [0x66]
// 32: lgdtl 0
// 32: encoding: [0x0f,0x01,0x15,0x00,0x00,0x00,0x00]
-// ERR16: error: instruction requires: Not 16-bit mode
+// ERR16: error: redundant data16 prefix
data16 lgdt 0
Modified: llvm/trunk/utils/TableGen/X86DisassemblerTables.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/X86DisassemblerTables.cpp?rev=330531&r1=330530&r2=330531&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/X86DisassemblerTables.cpp (original)
+++ llvm/trunk/utils/TableGen/X86DisassemblerTables.cpp Sat Apr 21 17:52:02 2018
@@ -1088,10 +1088,6 @@ void DisassemblerTables::setTableFields(
newInfo.name == "XCHG64ar"))
continue; // special case for XCHG*ar and NOOP
- if (previousInfo.name == "DATA16_PREFIX" &&
- newInfo.name == "DATA32_PREFIX")
- continue; // special case for data16 and data32
-
if (outranks(previousInfo.insnContext, newInfo.insnContext))
continue;
More information about the llvm-commits
mailing list