diff options
-rw-r--r-- | src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp index 92fbf26647c..7c60837eb68 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp @@ -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; } } } |