Skip to content

Commit cc9acb9

Browse files
authored
[AMDGPU] Add s_set_vgpr_msb gfx1250 instruction (#156524)
1 parent 81131f3 commit cc9acb9

File tree

7 files changed

+65
-0
lines changed

7 files changed

+65
-0
lines changed

llvm/lib/Target/AMDGPU/AMDGPU.td

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1210,6 +1210,12 @@ def Feature64BitLiterals : SubtargetFeature<"64-bit-literals",
12101210
"Can use 64-bit literals with single DWORD instructions"
12111211
>;
12121212

1213+
def Feature1024AddressableVGPRs : SubtargetFeature<"1024-addressable-vgprs",
1214+
"Has1024AddressableVGPRs",
1215+
"true",
1216+
"Has 1024 addressable VGPRs"
1217+
>;
1218+
12131219
def FeatureWaitXcnt : SubtargetFeature<"wait-xcnt",
12141220
"HasWaitXcnt",
12151221
"true",
@@ -2033,6 +2039,7 @@ def FeatureISAVersion12_50 : FeatureSet<
20332039
FeatureCUStores,
20342040
FeatureAddressableLocalMemorySize327680,
20352041
FeatureCuMode,
2042+
Feature1024AddressableVGPRs,
20362043
Feature64BitLiterals,
20372044
FeatureLDSBankCount32,
20382045
FeatureDLInsts,
@@ -2841,6 +2848,9 @@ def HasBVHDualAndBVH8Insts : Predicate<"Subtarget->hasBVHDualAndBVH8Insts()">,
28412848
def Has64BitLiterals : Predicate<"Subtarget->has64BitLiterals()">,
28422849
AssemblerPredicate<(all_of Feature64BitLiterals)>;
28432850

2851+
def Has1024AddressableVGPRs : Predicate<"Subtarget->has1024AddressableVGPRs()">,
2852+
AssemblerPredicate<(all_of Feature1024AddressableVGPRs)>;
2853+
28442854
def HasWaitXcnt : Predicate<"Subtarget->hasWaitXcnt()">,
28452855
AssemblerPredicate<(all_of FeatureWaitXcnt)>;
28462856

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1886,6 +1886,7 @@ class AMDGPUAsmParser : public MCTargetAsmParser {
18861886
bool validateTHAndScopeBits(const MCInst &Inst, const OperandVector &Operands,
18871887
const unsigned CPol);
18881888
bool validateTFE(const MCInst &Inst, const OperandVector &Operands);
1889+
bool validateSetVgprMSB(const MCInst &Inst, const OperandVector &Operands);
18891890
std::optional<StringRef> validateLdsDirect(const MCInst &Inst);
18901891
bool validateWMMA(const MCInst &Inst, const OperandVector &Operands);
18911892
unsigned getConstantBusLimit(unsigned Opcode) const;
@@ -5542,6 +5543,22 @@ bool AMDGPUAsmParser::validateTFE(const MCInst &Inst,
55425543
return true;
55435544
}
55445545

5546+
bool AMDGPUAsmParser::validateSetVgprMSB(const MCInst &Inst,
5547+
const OperandVector &Operands) {
5548+
if (Inst.getOpcode() != AMDGPU::S_SET_VGPR_MSB_gfx12)
5549+
return true;
5550+
5551+
int Simm16Pos =
5552+
AMDGPU::getNamedOperandIdx(Inst.getOpcode(), AMDGPU::OpName::simm16);
5553+
if ((unsigned)Inst.getOperand(Simm16Pos).getImm() > 255) {
5554+
SMLoc Loc = Operands[1]->getStartLoc();
5555+
Error(Loc, "s_set_vgpr_msb accepts values in range [0..255]");
5556+
return false;
5557+
}
5558+
5559+
return true;
5560+
}
5561+
55455562
bool AMDGPUAsmParser::validateWMMA(const MCInst &Inst,
55465563
const OperandVector &Operands) {
55475564
unsigned Opc = Inst.getOpcode();
@@ -5706,6 +5723,9 @@ bool AMDGPUAsmParser::validateInstruction(const MCInst &Inst,
57065723
if (!validateTFE(Inst, Operands)) {
57075724
return false;
57085725
}
5726+
if (!validateSetVgprMSB(Inst, Operands)) {
5727+
return false;
5728+
}
57095729
if (!validateWMMA(Inst, Operands)) {
57105730
return false;
57115731
}

llvm/lib/Target/AMDGPU/GCNSubtarget.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ class GCNSubtarget final : public AMDGPUGenSubtargetInfo,
236236
bool HasPseudoScalarTrans = false;
237237
bool HasRestrictedSOffset = false;
238238
bool Has64BitLiterals = false;
239+
bool Has1024AddressableVGPRs = false;
239240
bool HasBitOp3Insts = false;
240241
bool HasTanhInsts = false;
241242
bool HasTensorCvtLutInsts = false;
@@ -1437,6 +1438,8 @@ class GCNSubtarget final : public AMDGPUGenSubtargetInfo,
14371438

14381439
bool hasAddPC64Inst() const { return GFX1250Insts; }
14391440

1441+
bool has1024AddressableVGPRs() const { return Has1024AddressableVGPRs; }
1442+
14401443
bool hasMinimum3Maximum3PKF16() const {
14411444
return HasMinimum3Maximum3PKF16;
14421445
}

llvm/lib/Target/AMDGPU/SOPInstructions.td

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1844,6 +1844,13 @@ let SubtargetPredicate = HasWaitXcnt, hasSideEffects = 1 in {
18441844
SOPP_Pseudo<"s_wait_xcnt", (ins s16imm:$simm16), "$simm16">;
18451845
} // End SubtargetPredicate = hasWaitXcnt, hasSideEffects = 1
18461846

1847+
let SubtargetPredicate = Has1024AddressableVGPRs in {
1848+
def S_SET_VGPR_MSB : SOPP_Pseudo<"s_set_vgpr_msb" , (ins i16imm:$simm16), "$simm16"> {
1849+
let hasSideEffects = 1;
1850+
let Defs = [MODE];
1851+
}
1852+
}
1853+
18471854
//===----------------------------------------------------------------------===//
18481855
// SOP1 Patterns
18491856
//===----------------------------------------------------------------------===//
@@ -2691,6 +2698,7 @@ defm S_WAIT_STORECNT_DSCNT : SOPP_Real_32_gfx12<0x049>;
26912698
//===----------------------------------------------------------------------===//
26922699
// SOPP - GFX1250 only.
26932700
//===----------------------------------------------------------------------===//
2701+
defm S_SET_VGPR_MSB : SOPP_Real_32_gfx12<0x006>;
26942702
defm S_SETPRIO_INC_WG : SOPP_Real_32_gfx12<0x03e>;
26952703
defm S_WAIT_XCNT : SOPP_Real_32_gfx12<0x045>;
26962704
defm S_WAIT_ASYNCCNT : SOPP_Real_32_gfx12<0x04a>;

llvm/test/MC/AMDGPU/gfx1250_asm_sopp.s

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,14 @@ s_setprio_inc_wg 100
3737
// GFX1250: [0x64,0x00,0xbe,0xbf]
3838
// GFX12-ERR: :[[@LINE-2]]:{{[0-9]+}}: error: instruction not supported on this GPU
3939

40+
s_set_vgpr_msb 10
41+
// GFX1250: [0x0a,0x00,0x86,0xbf]
42+
// GFX12-ERR: :[[@LINE-2]]:{{[0-9]+}}: error: instruction not supported on this GPU
43+
44+
s_set_vgpr_msb 255
45+
// GFX1250: [0xff,0x00,0x86,0xbf]
46+
// GFX12-ERR: :[[@LINE-2]]:{{[0-9]+}}: error: instruction not supported on this GPU
47+
4048
s_monitor_sleep 1
4149
// GFX1250: s_monitor_sleep 1 ; encoding: [0x01,0x00,0x84,0xbf]
4250
// GFX12-ERR: :[[@LINE-2]]:{{[0-9]+}}: error: instruction not supported on this GPU

llvm/test/MC/AMDGPU/gfx1250_err.s

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
// RUN: not llvm-mc -triple=amdgcn -mcpu=gfx1250 -show-encoding %s 2>&1 | FileCheck --check-prefixes=GFX1250-ERR --implicit-check-not=error: -strict-whitespace %s
22

3+
s_set_vgpr_msb -1
4+
// GFX1250-ERR: :[[@LINE-1]]:{{[0-9]+}}: error: s_set_vgpr_msb accepts values in range [0..255]
5+
// GFX1250-ERR: s_set_vgpr_msb -1
6+
// GFX1250-ERR: ^
7+
8+
s_set_vgpr_msb 256
9+
// GFX1250-ERR: :[[@LINE-1]]:{{[0-9]+}}: error: s_set_vgpr_msb accepts values in range [0..255]
10+
// GFX1250-ERR: s_set_vgpr_msb 256
11+
// GFX1250-ERR: ^
12+
313
s_load_b32 s4, s[2:3], 10 th:TH_LOAD_NT th:TH_LOAD_NT
414
// GFX1250-ERR: :[[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
515
// GFX1250-ERR: s_load_b32 s4, s[2:3], 10 th:TH_LOAD_NT th:TH_LOAD_NT

llvm/test/MC/Disassembler/AMDGPU/gfx1250_dasm_sopp.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@
2727
# GFX1250: s_setprio_inc_wg 0x64 ; encoding: [0x64,0x00,0xbe,0xbf]
2828
0x64,0x00,0xbe,0xbf
2929

30+
# GFX1250: s_set_vgpr_msb 10 ; encoding: [0x0a,0x00,0x86,0xbf]
31+
0x0a,0x00,0x86,0xbf
32+
33+
# GFX1250: s_set_vgpr_msb 0xff ; encoding: [0xff,0x00,0x86,0xbf]
34+
0xff,0x00,0x86,0xbf
35+
3036
# GFX1250: s_monitor_sleep 0 ; encoding: [0x00,0x00,0x84,0xbf]
3137
0x00,0x00,0x84,0xbf
3238

0 commit comments

Comments
 (0)