From 3c40be2615872b9f9c95f6b551b37498561273d2 Mon Sep 17 00:00:00 2001 From: Ilia Mirkin Date: Fri, 14 Mar 2014 06:11:37 -0400 Subject: [PATCH] nv50/ir/gk110: fix handling of OP_SUB for floating point ops Signed-off-by: Ilia Mirkin --- src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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; } } } -- 2.30.2