diff options
author | Dmitry Preobrazhensky <dmitry.preobrazhensky@amd.com> | 2017-11-17 15:15:40 +0000 |
---|---|---|
committer | Dmitry Preobrazhensky <dmitry.preobrazhensky@amd.com> | 2017-11-17 15:15:40 +0000 |
commit | 682a6547582c70702e698d6263bbf78592d66084 (patch) | |
tree | 7ce19a45e803eec5de65081e5f9a139748e3b37a /llvm/lib | |
parent | 6649665d5a1670a74f93b1efdc3bac6a21b6644a (diff) | |
download | bcm5719-llvm-682a6547582c70702e698d6263bbf78592d66084.tar.gz bcm5719-llvm-682a6547582c70702e698d6263bbf78592d66084.zip |
[AMDGPU][MC][GFX9][disassembler] Corrected decoding of op_sel_hi for v_mad_mix*
See bug 35148: https://bugs.llvm.org//show_bug.cgi?id=35148
Reviewers: tamazov, SamWot, arsenm
Differential Revision: https://reviews.llvm.org/D39492
llvm-svn: 318526
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp | 23 | ||||
-rw-r--r-- | llvm/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp | 9 | ||||
-rw-r--r-- | llvm/lib/Target/AMDGPU/SIDefines.h | 5 | ||||
-rw-r--r-- | llvm/lib/Target/AMDGPU/SIInstrFormats.td | 5 | ||||
-rw-r--r-- | llvm/lib/Target/AMDGPU/VOPInstructions.td | 10 |
5 files changed, 26 insertions, 26 deletions
diff --git a/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp b/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp index 806aa420c50..cdb57508850 100644 --- a/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp +++ b/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp @@ -1077,10 +1077,7 @@ public: OptionalImmIndexMap &OptionalIdx); void cvtVOP3OpSel(MCInst &Inst, const OperandVector &Operands); void cvtVOP3(MCInst &Inst, const OperandVector &Operands); - void cvtVOP3PImpl(MCInst &Inst, const OperandVector &Operands, - bool IsPacked); void cvtVOP3P(MCInst &Inst, const OperandVector &Operands); - void cvtVOP3P_NotPacked(MCInst &Inst, const OperandVector &Operands); void cvtVOP3Interp(MCInst &Inst, const OperandVector &Operands); @@ -4320,11 +4317,13 @@ void AMDGPUAsmParser::cvtVOP3(MCInst &Inst, const OperandVector &Operands) { cvtVOP3(Inst, Operands, OptionalIdx); } -void AMDGPUAsmParser::cvtVOP3PImpl(MCInst &Inst, - const OperandVector &Operands, - bool IsPacked) { +void AMDGPUAsmParser::cvtVOP3P(MCInst &Inst, + const OperandVector &Operands) { OptionalImmIndexMap OptIdx; - int Opc = Inst.getOpcode(); + const int Opc = Inst.getOpcode(); + const MCInstrDesc &Desc = MII.get(Opc); + + const bool IsPacked = (Desc.TSFlags & SIInstrFlags::IsPacked) != 0; cvtVOP3(Inst, Operands, OptIdx); @@ -4340,7 +4339,6 @@ void AMDGPUAsmParser::cvtVOP3PImpl(MCInst &Inst, int OpSelHiIdx = AMDGPU::getNamedOperandIdx(Opc, AMDGPU::OpName::op_sel_hi); if (OpSelHiIdx != -1) { - // TODO: Should we change the printing to match? int DefaultVal = IsPacked ? -1 : 0; addOptionalImmOperand(Inst, Operands, OptIdx, AMDGPUOperand::ImmTyOpSelHi, DefaultVal); @@ -4402,15 +4400,6 @@ void AMDGPUAsmParser::cvtVOP3PImpl(MCInst &Inst, } } -void AMDGPUAsmParser::cvtVOP3P(MCInst &Inst, const OperandVector &Operands) { - cvtVOP3PImpl(Inst, Operands, true); -} - -void AMDGPUAsmParser::cvtVOP3P_NotPacked(MCInst &Inst, - const OperandVector &Operands) { - cvtVOP3PImpl(Inst, Operands, false); -} - //===----------------------------------------------------------------------===// // dpp //===----------------------------------------------------------------------===// diff --git a/llvm/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp b/llvm/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp index cd79fbe5751..537769bf27e 100644 --- a/llvm/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp +++ b/llvm/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp @@ -806,8 +806,8 @@ void AMDGPUInstPrinter::printExpTgt(const MCInst *MI, unsigned OpNo, } static bool allOpsDefaultValue(const int* Ops, int NumOps, int Mod, - bool HasDstSel) { - int DefaultValue = (Mod == SISrcMods::OP_SEL_1); + bool IsPacked, bool HasDstSel) { + int DefaultValue = IsPacked && (Mod == SISrcMods::OP_SEL_1); for (int I = 0; I < NumOps; ++I) { if (!!(Ops[I] & Mod) != DefaultValue) @@ -843,7 +843,10 @@ void AMDGPUInstPrinter::printPackedModifier(const MCInst *MI, Mod == SISrcMods::OP_SEL_0 && MII.get(MI->getOpcode()).TSFlags & SIInstrFlags::VOP3_OPSEL; - if (allOpsDefaultValue(Ops, NumOps, Mod, HasDstSel)) + const bool IsPacked = + MII.get(MI->getOpcode()).TSFlags & SIInstrFlags::IsPacked; + + if (allOpsDefaultValue(Ops, NumOps, Mod, IsPacked, HasDstSel)) return; O << Name; diff --git a/llvm/lib/Target/AMDGPU/SIDefines.h b/llvm/lib/Target/AMDGPU/SIDefines.h index 5a767882c95..32a23c982ff 100644 --- a/llvm/lib/Target/AMDGPU/SIDefines.h +++ b/llvm/lib/Target/AMDGPU/SIDefines.h @@ -82,7 +82,10 @@ enum : uint64_t { // Clamps hi component of register. // ClampLo and ClampHi set for packed clamp. - ClampHi = UINT64_C(1) << 48 + ClampHi = UINT64_C(1) << 48, + + // Is a packed VOP3P instruction. + IsPacked = UINT64_C(1) << 49 }; // v_cmp_class_* etc. use a 10-bit mask for what operation is checked. diff --git a/llvm/lib/Target/AMDGPU/SIInstrFormats.td b/llvm/lib/Target/AMDGPU/SIInstrFormats.td index 250fb9eda2a..5b0ebd9eb2c 100644 --- a/llvm/lib/Target/AMDGPU/SIInstrFormats.td +++ b/llvm/lib/Target/AMDGPU/SIInstrFormats.td @@ -115,6 +115,9 @@ class InstSI <dag outs, dag ins, string asm = "", // of a packed output register. field bit ClampHi = 0; + // This bit indicates that this is a packed VOP3P instruction + field bit IsPacked = 0; + // These need to be kept in sync with the enum in SIInstrFlags. let TSFlags{0} = SALU; let TSFlags{1} = VALU; @@ -168,6 +171,8 @@ class InstSI <dag outs, dag ins, string asm = "", let TSFlags{47} = ClampLo; let TSFlags{48} = ClampHi; + let TSFlags{49} = IsPacked; + let SchedRW = [Write32Bit]; field bits<1> DisableSIDecoder = 0; diff --git a/llvm/lib/Target/AMDGPU/VOPInstructions.td b/llvm/lib/Target/AMDGPU/VOPInstructions.td index 6f9f3339e6d..f24ff5ce8de 100644 --- a/llvm/lib/Target/AMDGPU/VOPInstructions.td +++ b/llvm/lib/Target/AMDGPU/VOPInstructions.td @@ -80,6 +80,7 @@ class VOP3_Pseudo <string opName, VOPProfile P, list<dag> pattern = [], let isCodeGenOnly = 1; let UseNamedOperandTable = 1; let VOP3_OPSEL = isVop3OpSel; + let IsPacked = P.IsPacked; string Mnemonic = opName; string AsmOperands = !if(isVop3OpSel, @@ -114,12 +115,11 @@ class VOP3_Pseudo <string opName, VOPProfile P, list<dag> pattern = [], let AsmVariantName = AMDGPUAsmVariants.VOP3; let AsmMatchConverter = - !if(!and(P.IsPacked, isVOP3P), + !if(isVOP3P, "cvtVOP3P", - !if(isVOP3P, "cvtVOP3P_NotPacked", - !if(!or(P.HasModifiers, !or(P.HasOMod, P.HasIntClamp)), - "cvtVOP3", - ""))); + !if(!or(P.HasModifiers, !or(P.HasOMod, P.HasIntClamp)), + "cvtVOP3", + "")); VOPProfile Pfl = P; } |