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:
parent
f14ed4f077
commit
de666cc418
|
@ -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)) {
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue