nv50/ir/gk110: fix handling of OP_SUB for floating point ops

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
Ilia Mirkin 2014-03-14 06:11:37 -04:00
parent 72310869f0
commit 3c40be2615
1 changed files with 6 additions and 1 deletions

View File

@ -534,7 +534,10 @@ CodeEmitterGK110::emitFADD(const Instruction *i)
assert(i->rnd == ROUND_N);
assert(!i->saturate);
emitForm_L(i, 0x400, 0, i->src(1).mod);
Modifier mod = i->src(1).mod ^
Modifier(i->op == OP_SUB ? NV50_IR_MOD_NEG : 0);
emitForm_L(i, 0x400, 0, mod);
FTZ_(3a);
NEG_(3b, 0);
@ -549,9 +552,11 @@ CodeEmitterGK110::emitFADD(const Instruction *i)
if (code[0] & 0x1) {
modNegAbsF32_3b(i, 1);
if (i->op == OP_SUB) code[1] ^= 1 << 27;
} else {
ABS_(34, 1);
NEG_(30, 1);
if (i->op == OP_SUB) code[1] ^= 1 << 16;
}
}
}