diff options
author | Harald van Dijk <harald@gigawatt.nl> | 2021-07-15 22:56:08 +0100 |
---|---|---|
committer | Harald van Dijk <harald@gigawatt.nl> | 2021-07-15 22:56:08 +0100 |
commit | a8ad9170543906fc58336ab736a109fb42082fbf (patch) | |
tree | 02cf25b48d9256ab794f41ea5f72d2f4c2c68868 /llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp | |
parent | 81ce3aa30cc275bd7f2b51acf391ab69609ca211 (diff) | |
download | llvm-a8ad9170543906fc58336ab736a109fb42082fbf.zip llvm-a8ad9170543906fc58336ab736a109fb42082fbf.tar.gz llvm-a8ad9170543906fc58336ab736a109fb42082fbf.tar.bz2 |
[X86] Fix handling of maskmovdqu in X32
The maskmovdqu instruction is an odd one: it has a 32-bit and a 64-bit
variant, the former using EDI, the latter RDI, but the use of the
register is implicit. In 64-bit mode, a 0x67 prefix can be used to get
the version using EDI, but there is no way to express this in
assembly in a single instruction, the only way is with an explicit
addr32.
This change adds support for the instruction. When generating assembly
text, that explicit addr32 will be added. When not generating assembly
text, it will be kept as a single instruction and will be emitted with
that 0x67 prefix. When parsing assembly text, it will be re-parsed as
ADDR32 followed by MASKMOVDQU64, which still results in the correct
bytes when converted to machine code.
The same applies to vmaskmovdqu as well.
Reviewed By: craig.topper
Differential Revision: https://reviews.llvm.org/D103427
Diffstat (limited to 'llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp')
-rw-r--r-- | llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp b/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp index 4e6d8e8..82581eb 100644 --- a/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp +++ b/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp @@ -1119,6 +1119,8 @@ static int getInstructionID(struct InternalInstruction *insn, switch (ppFromVEX2of2(insn->vectorExtensionPrefix[1])) { case VEX_PREFIX_66: attrMask |= ATTR_OPSIZE; + if (insn->hasAdSize) + attrMask |= ATTR_ADSIZE; break; case VEX_PREFIX_F3: attrMask |= ATTR_XS; @@ -1175,6 +1177,8 @@ static int getInstructionID(struct InternalInstruction *insn, case 0x66: if (insn->mode != MODE_16BIT) attrMask |= ATTR_OPSIZE; + if (insn->hasAdSize) + attrMask |= ATTR_ADSIZE; break; case 0x67: attrMask |= ATTR_ADSIZE; |