diff options
| author | Craig Topper <craig.topper@gmail.com> | 2015-01-03 00:00:20 +0000 |
|---|---|---|
| committer | Craig Topper <craig.topper@gmail.com> | 2015-01-03 00:00:20 +0000 |
| commit | ae8e1b3831502d49dd76fe96809876918552b3b4 (patch) | |
| tree | dcc8f78ccbf082d91989ff32ed76b84d0bf8776f /llvm/lib | |
| parent | 017b830564b9f28bba4eee711f7b90227ea2496c (diff) | |
| download | bcm5719-llvm-ae8e1b3831502d49dd76fe96809876918552b3b4.tar.gz bcm5719-llvm-ae8e1b3831502d49dd76fe96809876918552b3b4.zip | |
[X86] Disassembler support for move to/from %rax with a 32-bit memory offset is REX.W and AdSize prefix are both present.
llvm-svn: 225099
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/AsmParser/X86Operand.h | 3 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoderCommon.h | 2 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrInfo.td | 17 |
3 files changed, 22 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/AsmParser/X86Operand.h b/llvm/lib/Target/X86/AsmParser/X86Operand.h index 04614332755..4362fc5026d 100644 --- a/llvm/lib/Target/X86/AsmParser/X86Operand.h +++ b/llvm/lib/Target/X86/AsmParser/X86Operand.h @@ -316,6 +316,9 @@ struct X86Operand : public MCParsedAsmOperand { bool isMemOffs32_32() const { return isMemOffs() && Mem.ModeSize == 32 && (!Mem.Size || Mem.Size == 32); } + bool isMemOffs32_64() const { + return isMemOffs() && Mem.ModeSize == 32 && (!Mem.Size || Mem.Size == 64); + } bool isMemOffs64_8() const { return isMemOffs() && Mem.ModeSize == 64 && (!Mem.Size || Mem.Size == 8); } diff --git a/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoderCommon.h b/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoderCommon.h index d04d8c0f063..3e8172e6cee 100644 --- a/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoderCommon.h +++ b/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoderCommon.h @@ -93,6 +93,8 @@ enum attributeBits { "operands change width") \ ENUM_ENTRY(IC_64BIT_REXW, 5, "requires a REX.W prefix, so operands "\ "change width; overrides IC_OPSIZE") \ + ENUM_ENTRY(IC_64BIT_REXW_ADSIZE, 6, "requires a REX.W prefix and 0x67 " \ + "prefix") \ ENUM_ENTRY(IC_64BIT_OPSIZE, 3, "Just as meaningful as IC_OPSIZE") \ ENUM_ENTRY(IC_64BIT_ADSIZE, 3, "Just as meaningful as IC_ADSIZE") \ ENUM_ENTRY(IC_64BIT_OPSIZE_ADSIZE, 4, "Just as meaningful as IC_OPSIZE/" \ diff --git a/llvm/lib/Target/X86/X86InstrInfo.td b/llvm/lib/Target/X86/X86InstrInfo.td index 0efbd06548b..5a9b51aa0cc 100644 --- a/llvm/lib/Target/X86/X86InstrInfo.td +++ b/llvm/lib/Target/X86/X86InstrInfo.td @@ -494,6 +494,11 @@ def X86MemOffs32_32AsmOperand : AsmOperandClass { let RenderMethod = "addMemOffsOperands"; let SuperClasses = [X86Mem32AsmOperand]; } +def X86MemOffs32_64AsmOperand : AsmOperandClass { + let Name = "MemOffs32_64"; + let RenderMethod = "addMemOffsOperands"; + let SuperClasses = [X86Mem64AsmOperand]; +} def X86MemOffs64_8AsmOperand : AsmOperandClass { let Name = "MemOffs64_8"; let RenderMethod = "addMemOffsOperands"; @@ -571,6 +576,10 @@ def offset32_32 : Operand<iPTR> { let ParserMatchClass = X86MemOffs32_32AsmOperand; let MIOperandInfo = (ops i64imm, i8imm); let PrintMethod = "printMemOffs32"; } +def offset32_64 : Operand<iPTR> { + let ParserMatchClass = X86MemOffs32_64AsmOperand; + let MIOperandInfo = (ops i64imm, i8imm); + let PrintMethod = "printMemOffs64"; } def offset64_8 : Operand<iPTR> { let ParserMatchClass = X86MemOffs64_8AsmOperand; let MIOperandInfo = (ops i64imm, i8imm); @@ -1318,6 +1327,10 @@ let Defs = [EAX] in def MOV32ao32 : Ii32<0xA1, RawFrmMemOffs, (outs), (ins offset32_32:$src), "mov{l}\t{$src, %eax|eax, $src}", [], IIC_MOV_MEM>, OpSize32, AdSize32; +let Defs = [RAX] in +def MOV64ao32 : RIi32<0xA1, RawFrmMemOffs, (outs), (ins offset32_64:$src), + "mov{q}\t{$src, %rax|rax, $src}", [], IIC_MOV_MEM>, + AdSize32; let Defs = [AL] in def MOV8ao16 : Ii16<0xA0, RawFrmMemOffs, (outs), (ins offset16_8:$src), @@ -1343,6 +1356,10 @@ let Uses = [EAX] in def MOV32o32a : Ii32<0xA3, RawFrmMemOffs, (outs offset32_32:$dst), (ins), "mov{l}\t{%eax, $dst|$dst, eax}", [], IIC_MOV_MEM>, OpSize32, AdSize32; +let Uses = [RAX] in +def MOV64o32a : RIi32<0xA3, RawFrmMemOffs, (outs offset32_64:$dst), (ins), + "mov{q}\t{%rax, $dst|$dst, rax}", [], IIC_MOV_MEM>, + AdSize32; let Uses = [AL] in def MOV8o16a : Ii16<0xA2, RawFrmMemOffs, (outs offset16_8:$dst), (ins), |

