[AMDGPU] Update s_sendmsg messages

Update the list of s_sendmsg messages known to the assembler and
disassembler and validate the ones that were added or removed in gfx9
and gfx10.

Differential Revision: https://reviews.llvm.org/D97295
This commit is contained in:
Jay Foad 2021-01-25 17:40:56 +00:00
parent 0512b01ebe
commit 67f0620831
12 changed files with 138 additions and 42 deletions

View File

@ -6062,7 +6062,7 @@ AMDGPUAsmParser::validateSendMsg(const OperandInfoTy &Msg,
}
return false;
}
if (!isValidMsgOp(Msg.Id, Op.Id, Strict)) {
if (!isValidMsgOp(Msg.Id, Op.Id, getSTI(), Strict)) {
Error(Op.Loc, "invalid operation id");
return false;
}
@ -6070,7 +6070,7 @@ AMDGPUAsmParser::validateSendMsg(const OperandInfoTy &Msg,
Error(Stream.Loc, "message operation does not support streams");
return false;
}
if (!isValidMsgStream(Msg.Id, Op.Id, Stream.Id, Strict)) {
if (!isValidMsgStream(Msg.Id, Op.Id, Stream.Id, getSTI(), Strict)) {
Error(Stream.Loc, "invalid message stream id");
return false;
}

View File

@ -1266,8 +1266,8 @@ void AMDGPUInstPrinter::printSendMsg(const MCInst *MI, unsigned OpNo,
decodeMsg(Imm16, MsgId, OpId, StreamId);
if (isValidMsgId(MsgId, STI) &&
isValidMsgOp(MsgId, OpId) &&
isValidMsgStream(MsgId, OpId, StreamId)) {
isValidMsgOp(MsgId, OpId, STI) &&
isValidMsgStream(MsgId, OpId, StreamId, STI)) {
O << "sendmsg(" << getMsgName(MsgId);
if (msgRequiresOp(MsgId)) {
O << ", " << getMsgOpName(MsgId, OpId);

View File

@ -281,10 +281,16 @@ namespace SendMsg { // Encoding of SIMM16 used in s_sendmsg* insns.
enum Id { // Message ID, width(4) [3:0].
ID_UNKNOWN_ = -1,
ID_INTERRUPT = 1,
ID_GS,
ID_GS_DONE,
ID_GS_ALLOC_REQ = 9,
ID_GET_DOORBELL = 10,
ID_GS = 2,
ID_GS_DONE = 3,
ID_SAVEWAVE = 4, // added in GFX8
ID_STALL_WAVE_GEN = 5, // added in GFX9
ID_HALT_WAVES = 6, // added in GFX9
ID_ORDERED_PS_DONE = 7, // added in GFX9
ID_EARLY_PRIM_DEALLOC = 8, // added in GFX9, removed in GFX10
ID_GS_ALLOC_REQ = 9, // added in GFX9
ID_GET_DOORBELL = 10, // added in GFX9
ID_GET_DDID = 11, // added in GFX10
ID_SYSMSG = 15,
ID_GAPS_LAST_, // Indicate that sequence has gaps.
ID_GAPS_FIRST_ = ID_INTERRUPT,
@ -302,16 +308,16 @@ enum Op { // Both GS and SYS operation IDs.
OP_MASK_ = (((1 << OP_WIDTH_) - 1) << OP_SHIFT_),
// GS operations are encoded in bits 5:4
OP_GS_NOP = 0,
OP_GS_CUT,
OP_GS_EMIT,
OP_GS_EMIT_CUT,
OP_GS_CUT = 1,
OP_GS_EMIT = 2,
OP_GS_EMIT_CUT = 3,
OP_GS_LAST_,
OP_GS_FIRST_ = OP_GS_NOP,
// SYS operations are encoded in bits 6:4
OP_SYS_ECC_ERR_INTERRUPT = 1,
OP_SYS_REG_RD,
OP_SYS_HOST_TRAP_ACK,
OP_SYS_TTRACE_PC,
OP_SYS_REG_RD = 2,
OP_SYS_HOST_TRAP_ACK = 3,
OP_SYS_TTRACE_PC = 4,
OP_SYS_LAST_,
OP_SYS_FIRST_ = OP_SYS_ECC_ERR_INTERRUPT,
};

View File

@ -15,19 +15,19 @@ namespace AMDGPU {
namespace SendMsg {
// This must be in sync with llvm::AMDGPU::SendMsg::Id enum members, see SIDefines.h.
const char* const IdSymbolic[] = {
const char *const IdSymbolic[ID_GAPS_LAST_] = {
nullptr,
"MSG_INTERRUPT",
"MSG_GS",
"MSG_GS_DONE",
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
"MSG_SAVEWAVE",
"MSG_STALL_WAVE_GEN",
"MSG_HALT_WAVES",
"MSG_ORDERED_PS_DONE",
"MSG_EARLY_PRIM_DEALLOC",
"MSG_GS_ALLOC_REQ",
"MSG_GET_DOORBELL",
nullptr,
"MSG_GET_DDID",
nullptr,
nullptr,
nullptr,
@ -35,7 +35,7 @@ const char* const IdSymbolic[] = {
};
// These two must be in sync with llvm::AMDGPU::SendMsg::Op enum members, see SIDefines.h.
const char* const OpSysSymbolic[] = {
const char *const OpSysSymbolic[OP_SYS_LAST_] = {
nullptr,
"SYSMSG_OP_ECC_ERR_INTERRUPT",
"SYSMSG_OP_REG_RD",
@ -43,7 +43,7 @@ const char* const OpSysSymbolic[] = {
"SYSMSG_OP_TTRACE_PC"
};
const char* const OpGsSymbolic[] = {
const char *const OpGsSymbolic[OP_GS_LAST_] = {
"GS_OP_NOP",
"GS_OP_CUT",
"GS_OP_EMIT",

View File

@ -9,6 +9,8 @@
#ifndef LLVM_LIB_TARGET_AMDGPU_UTILS_AMDGPUASMUTILS_H
#define LLVM_LIB_TARGET_AMDGPU_UTILS_AMDGPUASMUTILS_H
#include "SIDefines.h"
namespace llvm {
class StringLiteral;
@ -17,9 +19,9 @@ namespace AMDGPU {
namespace SendMsg { // Symbolic names for the sendmsg(...) syntax.
extern const char* const IdSymbolic[];
extern const char* const OpSysSymbolic[];
extern const char* const OpGsSymbolic[];
extern const char *const IdSymbolic[ID_GAPS_LAST_];
extern const char *const OpSysSymbolic[OP_SYS_LAST_];
extern const char *const OpGsSymbolic[OP_GS_LAST_];
} // namespace SendMsg

View File

@ -1065,23 +1065,32 @@ int64_t getMsgId(const StringRef Name) {
return ID_UNKNOWN_;
}
static bool isValidMsgId(int64_t MsgId) {
return (ID_GAPS_FIRST_ <= MsgId && MsgId < ID_GAPS_LAST_) && IdSymbolic[MsgId];
}
bool isValidMsgId(int64_t MsgId, const MCSubtargetInfo &STI, bool Strict) {
if (Strict) {
if (MsgId == ID_GS_ALLOC_REQ || MsgId == ID_GET_DOORBELL)
switch (MsgId) {
case ID_SAVEWAVE:
return isVI(STI) || isGFX9Plus(STI);
case ID_STALL_WAVE_GEN:
case ID_HALT_WAVES:
case ID_ORDERED_PS_DONE:
case ID_GS_ALLOC_REQ:
case ID_GET_DOORBELL:
return isGFX9Plus(STI);
else
return isValidMsgId(MsgId);
case ID_EARLY_PRIM_DEALLOC:
return isGFX9(STI);
case ID_GET_DDID:
return isGFX10Plus(STI);
default:
return 0 <= MsgId && MsgId < ID_GAPS_LAST_ && IdSymbolic[MsgId];
}
} else {
return 0 <= MsgId && isUInt<ID_WIDTH_>(MsgId);
}
}
StringRef getMsgName(int64_t MsgId) {
return isValidMsgId(MsgId)? IdSymbolic[MsgId] : "";
assert(0 <= MsgId && MsgId < ID_GAPS_LAST_);
return IdSymbolic[MsgId];
}
int64_t getMsgOpId(int64_t MsgId, const StringRef Name) {
@ -1096,7 +1105,9 @@ int64_t getMsgOpId(int64_t MsgId, const StringRef Name) {
return OP_UNKNOWN_;
}
bool isValidMsgOp(int64_t MsgId, int64_t OpId, bool Strict) {
bool isValidMsgOp(int64_t MsgId, int64_t OpId, const MCSubtargetInfo &STI,
bool Strict) {
assert(isValidMsgId(MsgId, STI, Strict));
if (!Strict)
return 0 <= OpId && isUInt<OP_WIDTH_>(OpId);
@ -1119,7 +1130,9 @@ StringRef getMsgOpName(int64_t MsgId, int64_t OpId) {
return (MsgId == ID_SYSMSG)? OpSysSymbolic[OpId] : OpGsSymbolic[OpId];
}
bool isValidMsgStream(int64_t MsgId, int64_t OpId, int64_t StreamId, bool Strict) {
bool isValidMsgStream(int64_t MsgId, int64_t OpId, int64_t StreamId,
const MCSubtargetInfo &STI, bool Strict) {
assert(isValidMsgOp(MsgId, OpId, STI, Strict));
if (!Strict)
return 0 <= StreamId && isUInt<STREAM_ID_WIDTH_>(StreamId);

View File

@ -627,10 +627,12 @@ LLVM_READNONE
bool isValidMsgId(int64_t MsgId, const MCSubtargetInfo &STI, bool Strict = true);
LLVM_READNONE
bool isValidMsgOp(int64_t MsgId, int64_t OpId, bool Strict = true);
bool isValidMsgOp(int64_t MsgId, int64_t OpId, const MCSubtargetInfo &STI,
bool Strict = true);
LLVM_READNONE
bool isValidMsgStream(int64_t MsgId, int64_t OpId, int64_t StreamId, bool Strict = true);
bool isValidMsgStream(int64_t MsgId, int64_t OpId, int64_t StreamId,
const MCSubtargetInfo &STI, bool Strict = true);
LLVM_READNONE
bool msgRequiresOp(int64_t MsgId);

View File

@ -82,6 +82,26 @@ s_sendmsg sendmsg(MSG_GS_DONE, GS_OP_NOP, 0)
s_sendmsg sendmsg(MSG_GS_DONE, 0, 0)
// GCN: error: message operation does not support streams
s_sendmsg sendmsg(MSG_SAVEWAVE)
// SICI: error: invalid message id
s_sendmsg sendmsg(MSG_STALL_WAVE_GEN)
// SICI: error: invalid message id
// VI: error: invalid message id
s_sendmsg sendmsg(MSG_HALT_WAVES)
// SICI: error: invalid message id
// VI: error: invalid message id
s_sendmsg sendmsg(MSG_ORDERED_PS_DONE)
// SICI: error: invalid message id
// VI: error: invalid message id
s_sendmsg sendmsg(MSG_EARLY_PRIM_DEALLOC)
// SICI: error: invalid message id
// VI: error: invalid message id
// GFX10: error: invalid message id
s_sendmsg sendmsg(MSG_GS_ALLOC_REQ)
// VI: error: invalid message id
// SICI: error: invalid message id
@ -91,6 +111,14 @@ s_sendmsg sendmsg(MSG_GS_ALLOC_REQ, 0)
// SICI: error: invalid message id
// GFX10: error: message does not support operations
s_sendmsg sendmsg(MSG_GET_DOORBELL)
// SICI: error: invalid message id
// VI: error: invalid message id
s_sendmsg sendmsg(MSG_GET_DDID)
// SICI: error: invalid message id
// VI: error: invalid message id
s_sendmsg sendmsg(-1)
// VI: error: invalid message id
// SICI: error: invalid message id

View File

@ -15,3 +15,9 @@ s_sendmsg 10
s_sendmsg sendmsg(MSG_GET_DOORBELL)
// GFX10: s_sendmsg sendmsg(MSG_GET_DOORBELL) ; encoding: [0x0a,0x00,0x90,0xbf]
s_sendmsg 11
// GFX10: s_sendmsg sendmsg(MSG_GET_DDID) ; encoding: [0x0b,0x00,0x90,0xbf]
s_sendmsg sendmsg(MSG_GET_DDID)
// GFX10: s_sendmsg sendmsg(MSG_GET_DDID) ; encoding: [0x0b,0x00,0x90,0xbf]

View File

@ -74,6 +74,30 @@ s_waitcnt vmcnt(62) expcnt(6) lgkmcnt(14)
// s_sendmsg
//===----------------------------------------------------------------------===//
s_sendmsg 5
// GFX9: s_sendmsg sendmsg(MSG_STALL_WAVE_GEN) ; encoding: [0x05,0x00,0x90,0xbf]
s_sendmsg sendmsg(MSG_STALL_WAVE_GEN)
// GFX9: s_sendmsg sendmsg(MSG_STALL_WAVE_GEN) ; encoding: [0x05,0x00,0x90,0xbf]
s_sendmsg 6
// GFX9: s_sendmsg sendmsg(MSG_HALT_WAVES) ; encoding: [0x06,0x00,0x90,0xbf]
s_sendmsg sendmsg(MSG_HALT_WAVES)
// GFX9: s_sendmsg sendmsg(MSG_HALT_WAVES) ; encoding: [0x06,0x00,0x90,0xbf]
s_sendmsg 7
// GFX9: s_sendmsg sendmsg(MSG_ORDERED_PS_DONE) ; encoding: [0x07,0x00,0x90,0xbf]
s_sendmsg sendmsg(MSG_ORDERED_PS_DONE)
// GFX9: s_sendmsg sendmsg(MSG_ORDERED_PS_DONE) ; encoding: [0x07,0x00,0x90,0xbf]
s_sendmsg 8
// GFX9: s_sendmsg sendmsg(MSG_EARLY_PRIM_DEALLOC) ; encoding: [0x08,0x00,0x90,0xbf]
s_sendmsg sendmsg(MSG_EARLY_PRIM_DEALLOC)
// GFX9: s_sendmsg sendmsg(MSG_EARLY_PRIM_DEALLOC) ; encoding: [0x08,0x00,0x90,0xbf]
s_sendmsg 9
// GFX9: s_sendmsg sendmsg(MSG_GS_ALLOC_REQ) ; encoding: [0x09,0x00,0x90,0xbf]

View File

@ -1,4 +1,4 @@
// RUN: not llvm-mc -arch=amdgcn -show-encoding %s | FileCheck --check-prefix=GCN %s
// RUN: not llvm-mc -arch=amdgcn -show-encoding %s | FileCheck --check-prefixes=GCN,SI %s
// RUN: not llvm-mc -arch=amdgcn %s 2>&1 | FileCheck %s --check-prefix=NOSICI --implicit-check-not=error:
// RUN: llvm-mc -arch=amdgcn -mcpu=fiji -show-encoding %s | FileCheck --check-prefixes=GCN,VI %s
@ -228,6 +228,18 @@ s_sendmsg sendmsg(3, 0)
s_sendmsg sendmsg(MSG_GS_DONE, GS_OP_NOP)
// GCN: s_sendmsg sendmsg(MSG_GS_DONE, GS_OP_NOP) ; encoding: [0x03,0x00,0x90,0xbf]
s_sendmsg 0x4
// SI: s_sendmsg sendmsg(4, 0, 0) ; encoding: [0x04,0x00,0x90,0xbf]
// VI: s_sendmsg sendmsg(MSG_SAVEWAVE) ; encoding: [0x04,0x00,0x90,0xbf]
s_sendmsg sendmsg(4)
// SI: s_sendmsg sendmsg(4, 0, 0) ; encoding: [0x04,0x00,0x90,0xbf]
// VI: s_sendmsg sendmsg(MSG_SAVEWAVE) ; encoding: [0x04,0x00,0x90,0xbf]
s_sendmsg sendmsg(MSG_SAVEWAVE)
// NOSICI: error: invalid message id
// VI: s_sendmsg sendmsg(MSG_SAVEWAVE) ; encoding: [0x04,0x00,0x90,0xbf]
s_sendmsg 0x1f
// GCN: s_sendmsg sendmsg(MSG_SYSMSG, SYSMSG_OP_ECC_ERR_INTERRUPT) ; encoding: [0x1f,0x00,0x90,0xbf]
@ -250,9 +262,6 @@ s_sendmsghalt sendmsg(MSG_GS, GS_OP_EMIT, 1)
s_sendmsg 2
// GCN: s_sendmsg sendmsg(2, 0, 0) ; encoding: [0x02,0x00,0x90,0xbf]
s_sendmsg 0x4
// GCN: s_sendmsg sendmsg(4, 0, 0) ; encoding: [0x04,0x00,0x90,0xbf]
s_sendmsg 9
// GCN: s_sendmsg sendmsg(9, 0, 0) ; encoding: [0x09,0x00,0x90,0xbf]

View File

@ -93,6 +93,9 @@
# GCN: s_sendmsg sendmsg(MSG_GS_DONE, GS_OP_NOP) ; encoding: [0x03,0x00,0x90,0xbf]
0x03 0x00 0x90 0xbf
# GCN: s_sendmsg sendmsg(MSG_SAVEWAVE) ; encoding: [0x04,0x00,0x90,0xbf]
0x04 0x00 0x90 0xbf
# GCN: s_sendmsg sendmsg(11, 0, 0) ; encoding: [0x0b,0x00,0x90,0xbf]
0x0b 0x00 0x90 0xbf
@ -120,6 +123,9 @@
# GCN: s_sendmsg sendmsg(2, 0, 1) ; encoding: [0x02,0x01,0x90,0xbf]
0x02 0x01 0x90 0xbf
# GCN: s_sendmsg sendmsg(4, 0, 1) ; encoding: [0x04,0x01,0x90,0xbf]
0x04 0x01 0x90 0xbf
# GCN: s_sendmsg sendmsg(15, 7, 3) ; encoding: [0x7f,0x03,0x90,0xbf]
0x7f 0x03 0x90 0xbf