From: Ilia Mirkin Date: Fri, 14 Mar 2014 10:11:37 +0000 (-0400) Subject: nv50/ir/gk110: fix handling of OP_SUB for floating point ops X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3c40be2615872b9f9c95f6b551b37498561273d2;p=mesa.git nv50/ir/gk110: fix handling of OP_SUB for floating point ops Signed-off-by: Ilia Mirkin --- 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; } } }