diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2017-04-10 17:58:06 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2017-04-10 17:58:06 +0000 |
commit | 678e111e11307b52ba1da0b5538cda9b8b4746cb (patch) | |
tree | fbd642d870226fdc5f60dd52d9264e7e3afbdecc /llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp | |
parent | 08582c8e50ac2b99c049b9757b52bf15e9d23a31 (diff) | |
download | bcm5719-llvm-678e111e11307b52ba1da0b5538cda9b8b4746cb.tar.gz bcm5719-llvm-678e111e11307b52ba1da0b5538cda9b8b4746cb.zip |
AMDGPU: Fix crash when disassembling VOP3 mac
The unused dummy src2_modifiers is missing, so it crashes
when trying to print it.
I tried to fully remove src2_modifiers, but there are some
irritations in the places where it is converted to mad since
it starts to require modifying use lists while iterating over
them.
llvm-svn: 299861
Diffstat (limited to 'llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp')
-rw-r--r-- | llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp b/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp index d274d6a7505..4fb03b62bba 100644 --- a/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp +++ b/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp @@ -22,6 +22,7 @@ #include "AMDGPURegisterInfo.h" #include "SIDefines.h" #include "Utils/AMDGPUBaseInfo.h" +#include "MCTargetDesc/AMDGPUMCTargetDesc.h" #include "llvm/MC/MCContext.h" #include "llvm/MC/MCFixedLenDisassembler.h" @@ -105,10 +106,6 @@ static DecodeStatus decodeOperand_VSrcV216(MCInst &Inst, return addOperand(Inst, DAsm->decodeOperand_VSrcV216(Imm)); } -#define GET_SUBTARGETINFO_ENUM -#include "AMDGPUGenSubtargetInfo.inc" -#undef GET_SUBTARGETINFO_ENUM - #include "AMDGPUGenDisassemblerTables.inc" //===----------------------------------------------------------------------===// @@ -188,6 +185,17 @@ DecodeStatus AMDGPUDisassembler::getInstruction(MCInst &MI, uint64_t &Size, Res = tryDecodeInst(DecoderTableAMDGPU64, MI, QW, Address); } while (false); + if (Res && (MI.getOpcode() == AMDGPU::V_MAC_F32_e64_vi || + MI.getOpcode() == AMDGPU::V_MAC_F32_e64_si || + MI.getOpcode() == AMDGPU::V_MAC_F16_e64_vi)) { + // Insert dummy unused src2_modifiers. + int Src2ModIdx = AMDGPU::getNamedOperandIdx(MI.getOpcode(), + AMDGPU::OpName::src2_modifiers); + auto I = MI.begin(); + std::advance(I, Src2ModIdx); + MI.insert(I, MCOperand::createImm(0)); + } + Size = Res ? (MaxInstBytesNum - Bytes.size()) : 0; return Res; } |