gk110/ir: add LIMM form of mad
v2: renamed commit reordered modifiers add assert(dst == src2) v3: removed wrong neg mod emission Signed-off-by: Karol Herbst <karolherbst@gmail.com> Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:

committed by
Ilia Mirkin

parent
d346b8588c
commit
ad638514e3
@@ -47,7 +47,7 @@ private:
|
|||||||
private:
|
private:
|
||||||
void emitForm_21(const Instruction *, uint32_t opc2, uint32_t opc1);
|
void emitForm_21(const Instruction *, uint32_t opc2, uint32_t opc1);
|
||||||
void emitForm_C(const Instruction *, uint32_t opc, uint8_t ctg);
|
void emitForm_C(const Instruction *, uint32_t opc, uint8_t ctg);
|
||||||
void emitForm_L(const Instruction *, uint32_t opc, uint8_t ctg, Modifier);
|
void emitForm_L(const Instruction *, uint32_t opc, uint8_t ctg, Modifier, int sCount = 3);
|
||||||
|
|
||||||
void emitPredicate(const Instruction *);
|
void emitPredicate(const Instruction *);
|
||||||
|
|
||||||
@@ -365,7 +365,7 @@ CodeEmitterGK110::setImmediate32(const Instruction *i, const int s,
|
|||||||
|
|
||||||
void
|
void
|
||||||
CodeEmitterGK110::emitForm_L(const Instruction *i, uint32_t opc, uint8_t ctg,
|
CodeEmitterGK110::emitForm_L(const Instruction *i, uint32_t opc, uint8_t ctg,
|
||||||
Modifier mod)
|
Modifier mod, int sCount)
|
||||||
{
|
{
|
||||||
code[0] = ctg;
|
code[0] = ctg;
|
||||||
code[1] = opc << 20;
|
code[1] = opc << 20;
|
||||||
@@ -374,7 +374,7 @@ CodeEmitterGK110::emitForm_L(const Instruction *i, uint32_t opc, uint8_t ctg,
|
|||||||
|
|
||||||
defId(i->def(0), 2);
|
defId(i->def(0), 2);
|
||||||
|
|
||||||
for (int s = 0; s < 3 && i->srcExists(s); ++s) {
|
for (int s = 0; s < sCount && i->srcExists(s); ++s) {
|
||||||
switch (i->src(s).getFile()) {
|
switch (i->src(s).getFile()) {
|
||||||
case FILE_GPR:
|
case FILE_GPR:
|
||||||
srcId(i->src(s), s ? 42 : 10);
|
srcId(i->src(s), s ? 42 : 10);
|
||||||
@@ -487,25 +487,41 @@ CodeEmitterGK110::emitNOP(const Instruction *i)
|
|||||||
void
|
void
|
||||||
CodeEmitterGK110::emitFMAD(const Instruction *i)
|
CodeEmitterGK110::emitFMAD(const Instruction *i)
|
||||||
{
|
{
|
||||||
assert(!isLIMM(i->src(1), TYPE_F32));
|
|
||||||
|
|
||||||
emitForm_21(i, 0x0c0, 0x940);
|
|
||||||
|
|
||||||
NEG_(34, 2);
|
|
||||||
SAT_(35);
|
|
||||||
RND_(36, F);
|
|
||||||
FTZ_(38);
|
|
||||||
DNZ_(39);
|
|
||||||
|
|
||||||
bool neg1 = (i->src(0).mod ^ i->src(1).mod).neg();
|
bool neg1 = (i->src(0).mod ^ i->src(1).mod).neg();
|
||||||
|
|
||||||
if (code[0] & 0x1) {
|
if (isLIMM(i->src(1), TYPE_F32)) {
|
||||||
if (neg1)
|
assert(i->getDef(0)->reg.data.id == i->getSrc(2)->reg.data.id);
|
||||||
code[1] ^= 1 << 27;
|
|
||||||
} else
|
// last source is dst, so force 2 sources
|
||||||
if (neg1) {
|
emitForm_L(i, 0x600, 0x0, 0, 2);
|
||||||
code[1] |= 1 << 19;
|
|
||||||
|
if (i->flagsDef >= 0)
|
||||||
|
code[1] |= 1 << 23;
|
||||||
|
|
||||||
|
SAT_(3a);
|
||||||
|
NEG_(3c, 2);
|
||||||
|
|
||||||
|
if (neg1) {
|
||||||
|
code[1] |= 1 << 27;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
emitForm_21(i, 0x0c0, 0x940);
|
||||||
|
|
||||||
|
NEG_(34, 2);
|
||||||
|
SAT_(35);
|
||||||
|
RND_(36, F);
|
||||||
|
|
||||||
|
if (code[0] & 0x1) {
|
||||||
|
if (neg1)
|
||||||
|
code[1] ^= 1 << 27;
|
||||||
|
} else
|
||||||
|
if (neg1) {
|
||||||
|
code[1] |= 1 << 19;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FTZ_(38);
|
||||||
|
DNZ_(39);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@@ -3741,7 +3741,7 @@ bool
|
|||||||
Program::optimizePostRA(int level)
|
Program::optimizePostRA(int level)
|
||||||
{
|
{
|
||||||
RUN_PASS(2, FlatteningPass, run);
|
RUN_PASS(2, FlatteningPass, run);
|
||||||
if (getTarget()->getChipset() < NVISA_GK20A_CHIPSET)
|
if (getTarget()->getChipset() < NVISA_GM107_CHIPSET)
|
||||||
RUN_PASS(2, PostRaLoadPropagation, run);
|
RUN_PASS(2, PostRaLoadPropagation, run);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
Reference in New Issue
Block a user