gv100/ir: add support for barrier thread state files for OP_CVT

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:36:02 +02:00 committed by Marge Bot
parent f14ed4f077
commit de666cc418
2 changed files with 53 additions and 1 deletions

View File

@ -313,6 +313,12 @@ CodeEmitterGV100::emitMOV()
emitField(90, 1, 1);
emitPRED (87, insn->src(0));
break;
case FILE_BARRIER:
case FILE_THREAD_STATE:
emitInsn (0x355);
emitBTS (24, insn->src(0));
emitGPR (16, insn->def(0));
break;
default:
assert(!"bad src file");
break;
@ -329,6 +335,31 @@ CodeEmitterGV100::emitMOV()
emitGPR (24, insn->src(0));
emitGPR (32);
break;
case FILE_BARRIER:
case FILE_THREAD_STATE:
switch (insn->src(0).getFile()) {
case FILE_GPR:
emitInsn (0x356);
emitGPR (32, insn->src(0));
emitBTS (24, insn->def(0));
break;
case FILE_BARRIER:
emitInsn (0xf56);
emitBTS (24, insn->def(0));
emitBTS (16, insn->src(0));
break;
case FILE_THREAD_STATE:
assert(insn->def(0).getFile() == FILE_BARRIER);
emitInsn (0xf55);
emitBTS (24, insn->src(0));
emitBTS (16, insn->def(0));
break;
default:
assert(!"bad src file");
break;
}
emitField(84, 1, insn->getDef(0)->reg.data.ts == TS_PQUAD_MACTIVE ? 1 : 0);
break;
default:
assert(!"bad dst file");
break;
@ -1753,7 +1784,11 @@ CodeEmitterGV100::emitInstruction(Instruction *i)
case OP_FLOOR:
case OP_TRUNC:
if (insn->op == OP_CVT && (insn->def(0).getFile() == FILE_PREDICATE ||
insn->src(0).getFile() == FILE_PREDICATE)) {
insn->def(0).getFile() == FILE_BARRIER ||
insn->def(0).getFile() == FILE_THREAD_STATE ||
insn->src(0).getFile() == FILE_PREDICATE ||
insn->src(0).getFile() == FILE_BARRIER ||
insn->src(0).getFile() == FILE_THREAD_STATE)) {
emitMOV();
} else if (isFloatType(insn->dType)) {
if (isFloatType(insn->sType)) {

View File

@ -228,6 +228,23 @@ private:
emitSYS(pos, ref.get() ? ref.rep() : (const Value *)NULL);
}
inline void emitBTS(int pos, const Value *val) {
if (val->inFile(FILE_THREAD_STATE)) {
TSSemantic ts = val->reg.data.ts == TS_PQUAD_MACTIVE ? TS_MACTIVE : val->reg.data.ts;
emitField(pos, 5, ts | 0x10);
} else {
emitField(pos, 5, val->reg.data.id);
}
}
inline void emitBTS(int pos, const ValueRef &ref) {
emitBTS(pos, ref.get() ? ref.rep() : (const Value *)NULL);
}
inline void emitBTS(int pos, const ValueDef &def) {
emitBTS(pos, def.get() ? def.rep() : (const Value *)NULL);
}
inline void emitGPR(int pos, const Value *val, int off) {
emitField(pos, 8, val && !val->inFile(FILE_FLAGS) ?
val->reg.data.id + off: 255);