diff options
author | Ilia Mirkin <[email protected]> | 2014-03-14 06:11:37 -0400 |
---|---|---|
committer | Ilia Mirkin <[email protected]> | 2014-03-18 05:56:54 -0400 |
commit | 3c40be2615872b9f9c95f6b551b37498561273d2 (patch) | |
tree | 20954eeedceac3a08d61dd4127166c75e2b24289 /src | |
parent | 72310869f02edce3d2b896659b45e2f882e05bbf (diff) |
nv50/ir/gk110: fix handling of OP_SUB for floating point ops
Signed-off-by: Ilia Mirkin <[email protected]>
Diffstat (limited to 'src')
-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; } } } |