nvc0/ir: add initial code to support GK110 ISA encoding
This commit is contained in:
parent
8a497e5955
commit
3433471e8b
|
@ -93,6 +93,11 @@ struct nv50_ir_prog_symbol
|
|||
uint32_t offset;
|
||||
};
|
||||
|
||||
#define NVISA_GF100_CHIPSET_C0 0xc0
|
||||
#define NVISA_GF100_CHIPSET_D0 0xd0
|
||||
#define NVISA_GK104_CHIPSET 0xe0
|
||||
#define NVISA_GK110_CHIPSET 0xf0
|
||||
|
||||
struct nv50_ir_prog_info
|
||||
{
|
||||
uint16_t target; /* chipset (0x50, 0x84, 0xc0, ...) */
|
||||
|
|
|
@ -73,6 +73,31 @@ static inline unsigned int typeSizeof(DataType ty)
|
|||
}
|
||||
}
|
||||
|
||||
static inline unsigned int typeSizeofLog2(DataType ty)
|
||||
{
|
||||
switch (ty) {
|
||||
case TYPE_F16:
|
||||
case TYPE_U16:
|
||||
case TYPE_S16:
|
||||
return 1;
|
||||
case TYPE_F32:
|
||||
case TYPE_U32:
|
||||
case TYPE_S32:
|
||||
return 2;
|
||||
case TYPE_F64:
|
||||
case TYPE_U64:
|
||||
case TYPE_S64:
|
||||
return 3;
|
||||
case TYPE_B96:
|
||||
case TYPE_B128:
|
||||
return 4;
|
||||
case TYPE_U8:
|
||||
case TYPE_S8:
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static inline DataType typeOfSize(unsigned int size,
|
||||
bool flt = false, bool sgn = false)
|
||||
{
|
||||
|
|
|
@ -1907,6 +1907,7 @@ RegAlloc::InsertConstraintsPass::visit(BasicBlock *bb)
|
|||
texConstraintNVC0(tex);
|
||||
break;
|
||||
case 0xe0:
|
||||
case NVISA_GK110_CHIPSET:
|
||||
texConstraintNVE0(tex);
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -121,6 +121,7 @@ Target *Target::create(unsigned int chipset)
|
|||
case 0xc0:
|
||||
case 0xd0:
|
||||
case 0xe0:
|
||||
case NVISA_GK110_CHIPSET:
|
||||
return getTargetNVC0(chipset);
|
||||
case 0x50:
|
||||
case 0x80:
|
||||
|
|
|
@ -16,6 +16,7 @@ C_SOURCES := \
|
|||
nvc0_query.c
|
||||
|
||||
CPP_SOURCES := \
|
||||
codegen/nv50_ir_emit_gk110.cpp \
|
||||
codegen/nv50_ir_emit_nvc0.cpp \
|
||||
codegen/nv50_ir_lowering_nvc0.cpp \
|
||||
codegen/nv50_ir_target_nvc0.cpp
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -2298,6 +2298,13 @@ SchedDataCalculator::recordRd(const Value *v, const int ready)
|
|||
}
|
||||
}
|
||||
|
||||
bool
|
||||
calculateSchedDataNVC0(const Target *targ, Function *func)
|
||||
{
|
||||
SchedDataCalculator sched(targ);
|
||||
return sched.run(func, true, true);
|
||||
}
|
||||
|
||||
void
|
||||
CodeEmitterNVC0::prepareEmission(Function *func)
|
||||
{
|
||||
|
@ -2305,10 +2312,8 @@ CodeEmitterNVC0::prepareEmission(Function *func)
|
|||
|
||||
CodeEmitter::prepareEmission(func);
|
||||
|
||||
if (targ->hasSWSched) {
|
||||
SchedDataCalculator sched(targ);
|
||||
sched.run(func, true, true);
|
||||
}
|
||||
if (targ->hasSWSched)
|
||||
calculateSchedDataNVC0(targ, func);
|
||||
}
|
||||
|
||||
CodeEmitterNVC0::CodeEmitterNVC0(const TargetNVC0 *target)
|
||||
|
@ -2321,11 +2326,19 @@ CodeEmitterNVC0::CodeEmitterNVC0(const TargetNVC0 *target)
|
|||
}
|
||||
|
||||
CodeEmitter *
|
||||
TargetNVC0::getCodeEmitter(Program::Type type)
|
||||
TargetNVC0::createCodeEmitterNVC0(Program::Type type)
|
||||
{
|
||||
CodeEmitterNVC0 *emit = new CodeEmitterNVC0(this);
|
||||
emit->setProgramType(type);
|
||||
return emit;
|
||||
}
|
||||
|
||||
CodeEmitter *
|
||||
TargetNVC0::getCodeEmitter(Program::Type type)
|
||||
{
|
||||
if (chipset >= NVISA_GK110_CHIPSET)
|
||||
return createCodeEmitterGK110(type);
|
||||
return createCodeEmitterNVC0(type);
|
||||
}
|
||||
|
||||
} // namespace nv50_ir
|
||||
|
|
|
@ -157,7 +157,7 @@ private:
|
|||
const Instruction *recurseDef(const Instruction *);
|
||||
|
||||
private:
|
||||
LValue *r63;
|
||||
LValue *rZero;
|
||||
const bool needTexBar;
|
||||
};
|
||||
|
||||
|
@ -467,8 +467,8 @@ NVC0LegalizePostRA::visit(Function *fn)
|
|||
if (needTexBar)
|
||||
insertTextureBarriers(fn);
|
||||
|
||||
r63 = new_LValue(fn, FILE_GPR);
|
||||
r63->reg.data.id = 63;
|
||||
rZero = new_LValue(fn, FILE_GPR);
|
||||
rZero->reg.data.id = prog->getTarget()->getFileSize(FILE_GPR);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -478,7 +478,7 @@ NVC0LegalizePostRA::replaceZero(Instruction *i)
|
|||
for (int s = 0; i->srcExists(s); ++s) {
|
||||
ImmediateValue *imm = i->getSrc(s)->asImm();
|
||||
if (imm && imm->reg.data.u64 == 0)
|
||||
i->setSrc(s, r63);
|
||||
i->setSrc(s, rZero);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -556,7 +556,7 @@ NVC0LegalizePostRA::visit(BasicBlock *bb)
|
|||
if (!i->getDef(0)->refCount())
|
||||
i->setDef(0, NULL);
|
||||
if (i->src(0).getFile() == FILE_IMMEDIATE)
|
||||
i->setSrc(0, r63); // initial value must be 0
|
||||
i->setSrc(0, rZero); // initial value must be 0
|
||||
} else
|
||||
if (i->isNop()) {
|
||||
bb->remove(i);
|
||||
|
|
|
@ -334,7 +334,7 @@ TargetNVC0::getFileSize(DataFile file) const
|
|||
{
|
||||
switch (file) {
|
||||
case FILE_NULL: return 0;
|
||||
case FILE_GPR: return 63;
|
||||
case FILE_GPR: return (chipset >= NVISA_GK110_CHIPSET) ? 255 : 63;
|
||||
case FILE_PREDICATE: return 7;
|
||||
case FILE_FLAGS: return 1;
|
||||
case FILE_ADDRESS: return 0;
|
||||
|
@ -392,7 +392,7 @@ TargetNVC0::insnCanLoad(const Instruction *i, int s,
|
|||
{
|
||||
DataFile sf = ld->src(0).getFile();
|
||||
|
||||
// immediate 0 can be represented by GPR $r63
|
||||
// immediate 0 can be represented by GPR $r63/$r255
|
||||
if (sf == FILE_IMMEDIATE && ld->getSrc(0)->reg.data.u64 == 0)
|
||||
return (!i->asTex() && i->op != OP_EXPORT && i->op != OP_STORE);
|
||||
|
||||
|
|
|
@ -38,6 +38,9 @@ public:
|
|||
|
||||
virtual CodeEmitter *getCodeEmitter(Program::Type);
|
||||
|
||||
CodeEmitter *createCodeEmitterNVC0(Program::Type);
|
||||
CodeEmitter *createCodeEmitterGK110(Program::Type);
|
||||
|
||||
virtual bool runLegalizePass(Program *, CGStage stage) const;
|
||||
|
||||
virtual void getBuiltinCode(const uint32_t **code, uint32_t *size) const;
|
||||
|
@ -64,7 +67,8 @@ public:
|
|||
|
||||
private:
|
||||
void initOpInfo();
|
||||
|
||||
};
|
||||
|
||||
bool calculateSchedDataNVC0(const Target *, Function *);
|
||||
|
||||
} // namespace nv50_ir
|
||||
|
|
Loading…
Reference in New Issue