Index: lib/Target/X86/AsmParser/X86AsmParser.cpp =================================================================== --- lib/Target/X86/AsmParser/X86AsmParser.cpp +++ lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -2360,7 +2360,7 @@ Name == "lock" || Name == "rep" || Name == "repe" || Name == "repz" || Name == "repne" || Name == "repnz" || - Name == "rex64" || Name == "data16"; + Name == "rex64" || Name == "data16" || Name == "data32"; bool CurlyAsEndOfStatement = false; // This does the actual operand parsing. Don't parse any more if we have a Index: lib/Target/X86/X86InstrInfo.td =================================================================== --- lib/Target/X86/X86InstrInfo.td +++ lib/Target/X86/X86InstrInfo.td @@ -1965,7 +1965,12 @@ Requires<[In64BitMode]>; // Data16 instruction prefix -def DATA16_PREFIX : I<0x66, RawFrm, (outs), (ins), "data16", []>; +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]>; // Repeat string operation instruction prefixes // These uses the DF flag in the EFLAGS register to inc or dec ECX Index: test/MC/X86/x86-16.s =================================================================== --- test/MC/X86/x86-16.s +++ test/MC/X86/x86-16.s @@ -959,3 +959,7 @@ // CHECK: lretl // CHECK: encoding: [0x66,0xcb] lretl + +// CHECK: data32 +// CHECK: encoding: [0x66] +data32 \ No newline at end of file Index: utils/TableGen/X86DisassemblerTables.cpp =================================================================== --- utils/TableGen/X86DisassemblerTables.cpp +++ utils/TableGen/X86DisassemblerTables.cpp @@ -879,6 +879,10 @@ 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;