nv50/ir: add barrier and thread_state files

Those are required on Turing+ to handle cross thread synchronization and
other goodies as the c/r stack is gone.

Signed-off-by: Karol Herbst <kherbst@redhat.com>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11061>
This commit is contained in:
Karol Herbst 2020-07-14 22:34:34 +02:00 committed by Marge Bot
parent f4c6c89dec
commit f14ed4f077
6 changed files with 73 additions and 2 deletions

View File

@ -385,7 +385,8 @@ enum DataFile
FILE_PREDICATE, // boolean predicate
FILE_FLAGS, // zero/sign/carry/overflow bits
FILE_ADDRESS,
LAST_REGISTER_FILE = FILE_ADDRESS,
FILE_BARRIER,
LAST_REGISTER_FILE = FILE_BARRIER,
FILE_IMMEDIATE,
FILE_MEMORY_CONST,
FILE_SHADER_INPUT,
@ -395,6 +396,7 @@ enum DataFile
FILE_MEMORY_SHARED,
FILE_MEMORY_LOCAL,
FILE_SYSTEM_VALUE,
FILE_THREAD_STATE, // "special" barrier registers
DATA_FILE_COUNT
};
@ -532,6 +534,29 @@ enum SVSemantic
SV_LAST
};
enum TSSemantic
{
// 0-15 are fixed ones on Volta/Turing
TS_THREAD_STATE_ENUM0 = 0,
TS_THREAD_STATE_ENUM1 = 1,
TS_THREAD_STATE_ENUM2 = 2,
TS_THREAD_STATE_ENUM3 = 3,
TS_THREAD_STATE_ENUM4 = 4,
TS_TRAP_RETURN_PC_LO = 5,
TS_TRAP_RETURN_PC_HI = 6,
TS_TRAP_RETURN_MASK = 7,
TS_MEXITED = 8,
TS_MKILL = 9,
TS_MACTIVE = 10,
TS_MATEXIT = 11,
TS_OPT_STACK = 12,
TS_API_CALL_DEPTH = 13,
TS_ATEXIT_PC_LO = 14,
TS_ATEXIT_PC_HI = 15,
// special ones to make our life easier
TS_PQUAD_MACTIVE,
};
class Program;
class Function;
class BasicBlock;
@ -571,6 +596,7 @@ struct Storage
SVSemantic sv;
int index;
} sv;
TSSemantic ts;
} data;
};

View File

@ -486,6 +486,16 @@ BuildUtil::mkSysVal(SVSemantic svName, uint32_t svIndex)
return sym;
}
Symbol *
BuildUtil::mkTSVal(TSSemantic tsName)
{
Symbol *sym = new_Symbol(prog, FILE_THREAD_STATE, 0);
sym->reg.type = TYPE_U32;
sym->reg.size = typeSizeof(sym->reg.type);
sym->reg.data.ts = tsName;
return sym;
}
void
BuildUtil::DataArray::setup(unsigned array, unsigned arrayIdx,
uint32_t base, int len, int vecDim, int eltSize,

View File

@ -178,6 +178,7 @@ public:
DataType ty, uint32_t baseAddress);
Symbol *mkSysVal(SVSemantic svName, uint32_t svIndex);
Symbol *mkTSVal(TSSemantic tsName);
private:
void init(Program *);

View File

@ -348,6 +348,27 @@ static const char *SemanticStr[] =
"(INVALID)"
};
static const char *TSStr[17] =
{
"THREAD_STATE_ENUM0",
"THREAD_STATE_ENUM1",
"THREAD_STATE_ENUM2",
"THREAD_STATE_ENUM3",
"THREAD_STATE_ENUM4",
"TRAP_RETURN_PC_LO",
"TRAP_RETURN_PC_HI",
"TRAP_RETURN_MASK",
"MEXITED",
"MKILL",
"MACTIVE",
"MATEXIT",
"OPT_STACK",
"API_CALL_DEPTH",
"ATEXIT_PC_LO",
"ATEXIT_PC_HI",
"PQUAD_MACTIVE",
};
static const char *interpStr[16] =
{
"pass",
@ -476,6 +497,9 @@ int LValue::print(char *buf, size_t size, DataType ty) const
case FILE_ADDRESS:
r = 'a'; col = TXT_REGISTER;
break;
case FILE_BARRIER:
r = 'b'; col = TXT_REGISTER;
break;
default:
assert(!"invalid file for lvalue");
r = '?';
@ -537,6 +561,10 @@ int Symbol::print(char *buf, size_t size,
}
PRINT("%s]", colour[TXT_MEM]);
return pos;
} else if (reg.file == FILE_THREAD_STATE) {
PRINT("%sts[%s%s%s]", colour[TXT_MEM], colour[TXT_REGISTER],
TSStr[reg.data.ts], colour[TXT_MEM]);
return pos;
}
switch (reg.file) {
@ -547,6 +575,7 @@ int Symbol::print(char *buf, size_t size,
case FILE_MEMORY_GLOBAL: c = 'g'; break;
case FILE_MEMORY_SHARED: c = 's'; break;
case FILE_MEMORY_LOCAL: c = 'l'; break;
case FILE_BARRIER: c = 'b'; break;
default:
assert(!"invalid file");
c = '?';

View File

@ -207,6 +207,7 @@ TargetNV50::getFileSize(DataFile file) const
case FILE_PREDICATE: return 0;
case FILE_FLAGS: return 4;
case FILE_ADDRESS: return 4;
case FILE_BARRIER: return 0;
case FILE_IMMEDIATE: return 0;
case FILE_MEMORY_CONST: return 65536;
case FILE_SHADER_INPUT: return 0x200;

View File

@ -267,12 +267,14 @@ TargetNVC0::getFileSize(DataFile file) const
{
const unsigned int gprs = (chipset >= NVISA_GK20A_CHIPSET) ? 255 : 63;
const unsigned int smregs = (chipset >= NVISA_GK104_CHIPSET) ? 65536 : 32768;
const unsigned int bs = (chipset >= NVISA_GV100_CHIPSET) ? 16 : 0;
switch (file) {
case FILE_NULL: return 0;
case FILE_GPR: return MIN2(gprs, smregs / threads);
case FILE_PREDICATE: return 7;
case FILE_FLAGS: return 1;
case FILE_ADDRESS: return 0;
case FILE_BARRIER: return bs;
case FILE_IMMEDIATE: return 0;
case FILE_MEMORY_CONST: return 65536;
case FILE_SHADER_INPUT: return 0x400;
@ -282,6 +284,7 @@ TargetNVC0::getFileSize(DataFile file) const
case FILE_MEMORY_SHARED: return 16 << 10;
case FILE_MEMORY_LOCAL: return 48 << 10;
case FILE_SYSTEM_VALUE: return 32;
case FILE_THREAD_STATE: return bs;
default:
assert(!"invalid file");
return 0;
@ -291,7 +294,8 @@ TargetNVC0::getFileSize(DataFile file) const
unsigned int
TargetNVC0::getFileUnit(DataFile file) const
{
if (file == FILE_GPR || file == FILE_ADDRESS || file == FILE_SYSTEM_VALUE)
if (file == FILE_GPR || file == FILE_ADDRESS || file == FILE_SYSTEM_VALUE ||
file == FILE_BARRIER || file == FILE_THREAD_STATE)
return 2;
return 0;
}