Skip to content

Commit 905fa15

Browse files
committed
[AMDGPU][AsmParser] Distinguish literal and modifier SMEM offsets.
Reviewed By: foad Differential Revision: https://reviews.llvm.org/D144902
1 parent ac67ec3 commit 905fa15

File tree

3 files changed

+23
-21
lines changed

3 files changed

+23
-21
lines changed

llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ class AMDGPUOperand : public MCParsedAsmOperand {
119119
ImmTyInstOffset,
120120
ImmTyOffset0,
121121
ImmTyOffset1,
122+
ImmTySMEMOffsetMod,
122123
ImmTyCPol,
123124
ImmTySWZ,
124125
ImmTyTFE,
@@ -372,7 +373,7 @@ class AMDGPUOperand : public MCParsedAsmOperand {
372373
bool isOffset() const { return isImmTy(ImmTyOffset) && isUInt<16>(getImm()); }
373374
bool isOffset0() const { return isImmTy(ImmTyOffset0) && isUInt<8>(getImm()); }
374375
bool isOffset1() const { return isImmTy(ImmTyOffset1) && isUInt<8>(getImm()); }
375-
376+
bool isSMEMOffsetMod() const { return isImmTy(ImmTySMEMOffsetMod); }
376377
bool isFlatOffset() const { return isImmTy(ImmTyOffset) || isImmTy(ImmTyInstOffset); }
377378
bool isGDS() const { return isImmTy(ImmTyGDS); }
378379
bool isLDS() const { return isImmTy(ImmTyLDS); }
@@ -1034,6 +1035,7 @@ class AMDGPUOperand : public MCParsedAsmOperand {
10341035
case ImmTyInstOffset: OS << "InstOffset"; break;
10351036
case ImmTyOffset0: OS << "Offset0"; break;
10361037
case ImmTyOffset1: OS << "Offset1"; break;
1038+
case ImmTySMEMOffsetMod: OS << "SMEMOffsetMod"; break;
10371039
case ImmTyCPol: OS << "CPol"; break;
10381040
case ImmTySWZ: OS << "SWZ"; break;
10391041
case ImmTyTFE: OS << "TFE"; break;
@@ -1755,6 +1757,7 @@ class AMDGPUAsmParser : public MCTargetAsmParser {
17551757

17561758
AMDGPUOperand::Ptr defaultSMRDOffset8() const;
17571759
AMDGPUOperand::Ptr defaultSMEMOffset() const;
1760+
AMDGPUOperand::Ptr defaultSMEMOffsetMod() const;
17581761
AMDGPUOperand::Ptr defaultSMRDLiteralOffset() const;
17591762
AMDGPUOperand::Ptr defaultFlatOffset() const;
17601763

@@ -4154,7 +4157,7 @@ SMLoc AMDGPUAsmParser::getSMEMOffsetLoc(const OperandVector &Operands) const {
41544157
// Start with second operand because SMEM Offset cannot be dst or src0.
41554158
for (unsigned i = 2, e = Operands.size(); i != e; ++i) {
41564159
AMDGPUOperand &Op = ((AMDGPUOperand &)*Operands[i]);
4157-
if (Op.isSMEMOffset())
4160+
if (Op.isSMEMOffset() || Op.isSMEMOffsetMod())
41584161
return Op.getStartLoc();
41594162
}
41604163
return getLoc();
@@ -7938,7 +7941,8 @@ void AMDGPUAsmParser::cvtSMEMAtomic(MCInst &Inst, const OperandVector &Operands)
79387941

79397942
if ((int)Inst.getNumOperands() <=
79407943
AMDGPU::getNamedOperandIdx(Inst.getOpcode(), AMDGPU::OpName::offset))
7941-
addOptionalImmOperand(Inst, Operands, OptionalIdx, AMDGPUOperand::ImmTyOffset);
7944+
addOptionalImmOperand(Inst, Operands, OptionalIdx,
7945+
AMDGPUOperand::ImmTySMEMOffsetMod);
79427946
addOptionalImmOperand(Inst, Operands, OptionalIdx, AMDGPUOperand::ImmTyCPol, 0);
79437947
}
79447948

@@ -7962,8 +7966,8 @@ bool AMDGPUOperand::isSMRDOffset8() const {
79627966
}
79637967

79647968
bool AMDGPUOperand::isSMEMOffset() const {
7965-
return isImmTy(ImmTyNone) ||
7966-
isImmTy(ImmTyOffset); // Offset range is checked later by validator.
7969+
// Offset range is checked later by validator.
7970+
return isImmLiteral();
79677971
}
79687972

79697973
bool AMDGPUOperand::isSMRDLiteralOffset() const {
@@ -7977,7 +7981,12 @@ AMDGPUOperand::Ptr AMDGPUAsmParser::defaultSMRDOffset8() const {
79777981
}
79787982

79797983
AMDGPUOperand::Ptr AMDGPUAsmParser::defaultSMEMOffset() const {
7980-
return AMDGPUOperand::CreateImm(this, 0, SMLoc(), AMDGPUOperand::ImmTyOffset);
7984+
return AMDGPUOperand::CreateImm(this, 0, SMLoc());
7985+
}
7986+
7987+
AMDGPUOperand::Ptr AMDGPUAsmParser::defaultSMEMOffsetMod() const {
7988+
return AMDGPUOperand::CreateImm(this, 0, SMLoc(),
7989+
AMDGPUOperand::ImmTySMEMOffsetMod);
79817990
}
79827991

79837992
AMDGPUOperand::Ptr AMDGPUAsmParser::defaultSMRDLiteralOffset() const {
@@ -9147,8 +9156,6 @@ AMDGPUAsmParser::parseCustomOperand(OperandVector &Operands, unsigned MCK) {
91479156
case MCK_ImmNegLo:
91489157
return parseOperandArrayWithPrefix("neg_lo", Operands,
91499158
AMDGPUOperand::ImmTyNegLo);
9150-
case MCK_ImmSMEMOffset:
9151-
return parseIntWithPrefix("offset", Operands, AMDGPUOperand::ImmTyOffset);
91529159
case MCK_ImmOModSI:
91539160
return parseOModOperand(Operands);
91549161
case MCK_ImmOpSel:
@@ -9216,8 +9223,6 @@ unsigned AMDGPUAsmParser::validateTargetOperandClass(MCParsedAsmOperand &Op,
92169223
return Operand.isInterpAttr() ? Match_Success : Match_InvalidOperand;
92179224
case MCK_AttrChan:
92189225
return Operand.isAttrChan() ? Match_Success : Match_InvalidOperand;
9219-
case MCK_ImmSMEMOffset:
9220-
return Operand.isSMEMOffset() ? Match_Success : Match_InvalidOperand;
92219226
case MCK_SReg_64:
92229227
case MCK_SReg_64_XEXEC:
92239228
// Null is defined as a 32-bit register but

llvm/lib/Target/AMDGPU/SMInstructions.td

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,11 @@ def smrd_offset_8 : NamedOperandU32<"SMRDOffset8",
1111
let OperandType = "OPERAND_IMMEDIATE";
1212
}
1313

14-
class SMEMOffset : NamedOperandU32<"SMEMOffset",
15-
NamedMatchClass<"SMEMOffset">> {
16-
let OperandType = "OPERAND_IMMEDIATE";
17-
let EncoderMethod = "getSMEMOffsetEncoding";
18-
let DecoderMethod = "decodeSMEMOffset";
19-
}
20-
21-
def smem_offset : SMEMOffset;
22-
23-
def smem_offset_mod : SMEMOffset {
24-
let PrintMethod = "printSMEMOffsetMod";
14+
let OperandType = "OPERAND_IMMEDIATE",
15+
EncoderMethod = "getSMEMOffsetEncoding",
16+
DecoderMethod = "decodeSMEMOffset" in {
17+
def smem_offset : NamedOperandU32<"SMEMOffset", NamedMatchClass<"SMEMOffset">>;
18+
def smem_offset_mod : NamedIntOperand<i32, "offset", "SMEMOffsetMod">;
2519
}
2620

2721
//===----------------------------------------------------------------------===//

llvm/test/MC/AMDGPU/gfx11_asm_err.s

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,3 +140,6 @@ v_fmac_f32_e64_dpp v5, v2, s3 quad_perm:[3,2,1,0]
140140

141141
v_fmac_f32_e64_dpp v5, v2, 0x1234 quad_perm:[3,2,1,0]
142142
// GFX11: :[[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
143+
144+
s_load_dword s1, s[2:3], s0 0x1
145+
// GFX11: :[[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction

0 commit comments

Comments
 (0)