forked from OSchip/llvm-project
[AMDGPU][MC][GFX9] Corrected parsing of v_cndmask_b32_sdwa
See https://bugs.llvm.org/show_bug.cgi?id=43607 Reviewers: arsenm, rampitec Differential Revision: https://reviews.llvm.org/D69095 llvm-svn: 375231
This commit is contained in:
parent
fa0ac2558e
commit
7d325fe57b
|
@ -1423,9 +1423,12 @@ public:
|
||||||
void cvtSdwaVOP1(MCInst &Inst, const OperandVector &Operands);
|
void cvtSdwaVOP1(MCInst &Inst, const OperandVector &Operands);
|
||||||
void cvtSdwaVOP2(MCInst &Inst, const OperandVector &Operands);
|
void cvtSdwaVOP2(MCInst &Inst, const OperandVector &Operands);
|
||||||
void cvtSdwaVOP2b(MCInst &Inst, const OperandVector &Operands);
|
void cvtSdwaVOP2b(MCInst &Inst, const OperandVector &Operands);
|
||||||
|
void cvtSdwaVOP2e(MCInst &Inst, const OperandVector &Operands);
|
||||||
void cvtSdwaVOPC(MCInst &Inst, const OperandVector &Operands);
|
void cvtSdwaVOPC(MCInst &Inst, const OperandVector &Operands);
|
||||||
void cvtSDWA(MCInst &Inst, const OperandVector &Operands,
|
void cvtSDWA(MCInst &Inst, const OperandVector &Operands,
|
||||||
uint64_t BasicInstType, bool skipVcc = false);
|
uint64_t BasicInstType,
|
||||||
|
bool SkipDstVcc = false,
|
||||||
|
bool SkipSrcVcc = false);
|
||||||
|
|
||||||
AMDGPUOperand::Ptr defaultBLGP() const;
|
AMDGPUOperand::Ptr defaultBLGP() const;
|
||||||
AMDGPUOperand::Ptr defaultCBSZ() const;
|
AMDGPUOperand::Ptr defaultCBSZ() const;
|
||||||
|
@ -6813,7 +6816,11 @@ void AMDGPUAsmParser::cvtSdwaVOP2(MCInst &Inst, const OperandVector &Operands) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void AMDGPUAsmParser::cvtSdwaVOP2b(MCInst &Inst, const OperandVector &Operands) {
|
void AMDGPUAsmParser::cvtSdwaVOP2b(MCInst &Inst, const OperandVector &Operands) {
|
||||||
cvtSDWA(Inst, Operands, SIInstrFlags::VOP2, true);
|
cvtSDWA(Inst, Operands, SIInstrFlags::VOP2, true, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AMDGPUAsmParser::cvtSdwaVOP2e(MCInst &Inst, const OperandVector &Operands) {
|
||||||
|
cvtSDWA(Inst, Operands, SIInstrFlags::VOP2, false, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AMDGPUAsmParser::cvtSdwaVOPC(MCInst &Inst, const OperandVector &Operands) {
|
void AMDGPUAsmParser::cvtSdwaVOPC(MCInst &Inst, const OperandVector &Operands) {
|
||||||
|
@ -6821,11 +6828,14 @@ void AMDGPUAsmParser::cvtSdwaVOPC(MCInst &Inst, const OperandVector &Operands) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void AMDGPUAsmParser::cvtSDWA(MCInst &Inst, const OperandVector &Operands,
|
void AMDGPUAsmParser::cvtSDWA(MCInst &Inst, const OperandVector &Operands,
|
||||||
uint64_t BasicInstType, bool skipVcc) {
|
uint64_t BasicInstType,
|
||||||
|
bool SkipDstVcc,
|
||||||
|
bool SkipSrcVcc) {
|
||||||
using namespace llvm::AMDGPU::SDWA;
|
using namespace llvm::AMDGPU::SDWA;
|
||||||
|
|
||||||
OptionalImmIndexMap OptionalIdx;
|
OptionalImmIndexMap OptionalIdx;
|
||||||
bool skippedVcc = false;
|
bool SkipVcc = SkipDstVcc || SkipSrcVcc;
|
||||||
|
bool SkippedVcc = false;
|
||||||
|
|
||||||
unsigned I = 1;
|
unsigned I = 1;
|
||||||
const MCInstrDesc &Desc = MII.get(Inst.getOpcode());
|
const MCInstrDesc &Desc = MII.get(Inst.getOpcode());
|
||||||
|
@ -6835,19 +6845,21 @@ void AMDGPUAsmParser::cvtSDWA(MCInst &Inst, const OperandVector &Operands,
|
||||||
|
|
||||||
for (unsigned E = Operands.size(); I != E; ++I) {
|
for (unsigned E = Operands.size(); I != E; ++I) {
|
||||||
AMDGPUOperand &Op = ((AMDGPUOperand &)*Operands[I]);
|
AMDGPUOperand &Op = ((AMDGPUOperand &)*Operands[I]);
|
||||||
if (skipVcc && !skippedVcc && Op.isReg() &&
|
if (SkipVcc && !SkippedVcc && Op.isReg() &&
|
||||||
(Op.getReg() == AMDGPU::VCC || Op.getReg() == AMDGPU::VCC_LO)) {
|
(Op.getReg() == AMDGPU::VCC || Op.getReg() == AMDGPU::VCC_LO)) {
|
||||||
// VOP2b (v_add_u32, v_sub_u32 ...) sdwa use "vcc" token as dst.
|
// VOP2b (v_add_u32, v_sub_u32 ...) sdwa use "vcc" token as dst.
|
||||||
// Skip it if it's 2nd (e.g. v_add_i32_sdwa v1, vcc, v2, v3)
|
// Skip it if it's 2nd (e.g. v_add_i32_sdwa v1, vcc, v2, v3)
|
||||||
// or 4th (v_addc_u32_sdwa v1, vcc, v2, v3, vcc) operand.
|
// or 4th (v_addc_u32_sdwa v1, vcc, v2, v3, vcc) operand.
|
||||||
// Skip VCC only if we didn't skip it on previous iteration.
|
// Skip VCC only if we didn't skip it on previous iteration.
|
||||||
|
// Note that src0 and src1 occupy 2 slots each because of modifiers.
|
||||||
if (BasicInstType == SIInstrFlags::VOP2 &&
|
if (BasicInstType == SIInstrFlags::VOP2 &&
|
||||||
(Inst.getNumOperands() == 1 || Inst.getNumOperands() == 5)) {
|
((SkipDstVcc && Inst.getNumOperands() == 1) ||
|
||||||
skippedVcc = true;
|
(SkipSrcVcc && Inst.getNumOperands() == 5))) {
|
||||||
|
SkippedVcc = true;
|
||||||
continue;
|
continue;
|
||||||
} else if (BasicInstType == SIInstrFlags::VOPC &&
|
} else if (BasicInstType == SIInstrFlags::VOPC &&
|
||||||
Inst.getNumOperands() == 0) {
|
Inst.getNumOperands() == 0) {
|
||||||
skippedVcc = true;
|
SkippedVcc = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6859,7 +6871,7 @@ void AMDGPUAsmParser::cvtSDWA(MCInst &Inst, const OperandVector &Operands,
|
||||||
} else {
|
} else {
|
||||||
llvm_unreachable("Invalid operand type");
|
llvm_unreachable("Invalid operand type");
|
||||||
}
|
}
|
||||||
skippedVcc = false;
|
SkippedVcc = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Inst.getOpcode() != AMDGPU::V_NOP_sdwa_gfx10 &&
|
if (Inst.getOpcode() != AMDGPU::V_NOP_sdwa_gfx10 &&
|
||||||
|
|
|
@ -224,7 +224,7 @@ multiclass VOP2eInst <string opName,
|
||||||
|
|
||||||
foreach _ = BoolToList<P.HasExtSDWA>.ret in
|
foreach _ = BoolToList<P.HasExtSDWA>.ret in
|
||||||
def _sdwa : VOP2_SDWA_Pseudo <opName, P> {
|
def _sdwa : VOP2_SDWA_Pseudo <opName, P> {
|
||||||
let AsmMatchConverter = "cvtSdwaVOP2b";
|
let AsmMatchConverter = "cvtSdwaVOP2e";
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach _ = BoolToList<P.HasExtDPP>.ret in
|
foreach _ = BoolToList<P.HasExtDPP>.ret in
|
||||||
|
|
|
@ -594,6 +594,11 @@ v_cndmask_b32_sdwa v5, -1, v2, vcc dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:
|
||||||
// GFX89: v_cndmask_b32_sdwa v5, v1, sext(v2), vcc dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD ; encoding: [0xf9,0x04,0x0a,0x00,0x01,0x06,0x06,0x0e]
|
// GFX89: v_cndmask_b32_sdwa v5, v1, sext(v2), vcc dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD ; encoding: [0xf9,0x04,0x0a,0x00,0x01,0x06,0x06,0x0e]
|
||||||
v_cndmask_b32_sdwa v5, v1, sext(v2), vcc dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
|
v_cndmask_b32_sdwa v5, v1, sext(v2), vcc dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:DWORD
|
||||||
|
|
||||||
|
v_cndmask_b32_sdwa v5, vcc_lo, v2, vcc dst_sel:DWORD dst_unused:UNUSED_PRESERVE src0_sel:DWORD src1_sel:DWORD
|
||||||
|
// NOSICI: error: not a valid operand
|
||||||
|
// NOVI: error: invalid operand for instruction
|
||||||
|
// NOGFX9: error: invalid operand (violates constant bus restrictions)
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Check VOPC opcodes
|
// Check VOPC opcodes
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
Loading…
Reference in New Issue