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:
Karol Herbst
2017-03-26 21:45:59 +02:00
committed by Ilia Mirkin
parent d346b8588c
commit ad638514e3
2 changed files with 36 additions and 20 deletions

View File

@@ -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

View File

@@ -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;