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);
|
emitField(90, 1, 1);
|
||||||
emitPRED (87, insn->src(0));
|
emitPRED (87, insn->src(0));
|
||||||
break;
|
break;
|
||||||
|
case FILE_BARRIER:
|
||||||
|
case FILE_THREAD_STATE:
|
||||||
|
emitInsn (0x355);
|
||||||
|
emitBTS (24, insn->src(0));
|
||||||
|
emitGPR (16, insn->def(0));
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
assert(!"bad src file");
|
assert(!"bad src file");
|
||||||
break;
|
break;
|
||||||
|
@ -329,6 +335,31 @@ CodeEmitterGV100::emitMOV()
|
||||||
emitGPR (24, insn->src(0));
|
emitGPR (24, insn->src(0));
|
||||||
emitGPR (32);
|
emitGPR (32);
|
||||||
break;
|
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:
|
default:
|
||||||
assert(!"bad dst file");
|
assert(!"bad dst file");
|
||||||
break;
|
break;
|
||||||
|
@ -1753,7 +1784,11 @@ CodeEmitterGV100::emitInstruction(Instruction *i)
|
||||||
case OP_FLOOR:
|
case OP_FLOOR:
|
||||||
case OP_TRUNC:
|
case OP_TRUNC:
|
||||||
if (insn->op == OP_CVT && (insn->def(0).getFile() == FILE_PREDICATE ||
|
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();
|
emitMOV();
|
||||||
} else if (isFloatType(insn->dType)) {
|
} else if (isFloatType(insn->dType)) {
|
||||||
if (isFloatType(insn->sType)) {
|
if (isFloatType(insn->sType)) {
|
||||||
|
|
|
@ -228,6 +228,23 @@ private:
|
||||||
emitSYS(pos, ref.get() ? ref.rep() : (const Value *)NULL);
|
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) {
|
inline void emitGPR(int pos, const Value *val, int off) {
|
||||||
emitField(pos, 8, val && !val->inFile(FILE_FLAGS) ?
|
emitField(pos, 8, val && !val->inFile(FILE_FLAGS) ?
|
||||||
val->reg.data.id + off: 255);
|
val->reg.data.id + off: 255);
|
||||||
|
|
Loading…
Reference in New Issue