summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorDmitry Preobrazhensky <dmitry.preobrazhensky@amd.com>2017-11-17 15:15:40 +0000
committerDmitry Preobrazhensky <dmitry.preobrazhensky@amd.com>2017-11-17 15:15:40 +0000
commit682a6547582c70702e698d6263bbf78592d66084 (patch)
tree7ce19a45e803eec5de65081e5f9a139748e3b37a /llvm/lib
parent6649665d5a1670a74f93b1efdc3bac6a21b6644a (diff)
downloadbcm5719-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.cpp23
-rw-r--r--llvm/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp9
-rw-r--r--llvm/lib/Target/AMDGPU/SIDefines.h5
-rw-r--r--llvm/lib/Target/AMDGPU/SIInstrFormats.td5
-rw-r--r--llvm/lib/Target/AMDGPU/VOPInstructions.td10
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;
}
OpenPOWER on IntegriCloud