SUB & LRP instructions should toggle NEG bit instead of setting it,
otherwise e.g. "SUB a,b,-1" is translated as "ADD a,b,-1"

Signed-off-by: Vadim Girlin <vadimgir...@gmail.com>
---
 src/gallium/drivers/r600/r600_shader.c |   10 ++++++++--
 1 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_shader.c 
b/src/gallium/drivers/r600/r600_shader.c
index 871ef6e..eaa07f3 100644
--- a/src/gallium/drivers/r600/r600_shader.c
+++ b/src/gallium/drivers/r600/r600_shader.c
@@ -945,6 +945,12 @@ static inline void r600_bc_src_set_abs(struct 
r600_bc_alu_src *bc_src)
        bc_src->neg = 0;
 }
 
+static inline void r600_bc_src_toggle_neg(struct r600_bc_alu_src *bc_src)
+{
+       bc_src->neg = 1 - bc_src->neg;
+}
+
+
 static void tgsi_dst(struct r600_shader_ctx *ctx,
                     const struct tgsi_full_dst_register *tgsi_dst,
                     unsigned swizzle,
@@ -1001,7 +1007,7 @@ static int tgsi_op2_s(struct r600_shader_ctx *ctx, int 
swap)
                /* handle some special cases */
                switch (ctx->inst_info->tgsi_opcode) {
                case TGSI_OPCODE_SUB:
-                       alu.src[1].neg = 1;
+                       r600_bc_src_toggle_neg(&alu.src[1]);
                        break;
                case TGSI_OPCODE_ABS:
                        r600_bc_src_set_abs(&alu.src[0].abs);
@@ -2195,7 +2201,7 @@ static int tgsi_lrp(struct r600_shader_ctx *ctx)
                alu.src[0].sel = V_SQ_ALU_SRC_1;
                alu.src[0].chan = 0;
                r600_bc_src(&alu.src[1], &ctx->src[0], i);
-               alu.src[1].neg = 1;
+               r600_bc_src_toggle_neg(&alu.src[1]);
                alu.dst.sel = ctx->temp_reg;
                alu.dst.chan = i;
                if (i == lasti) {
-- 
1.7.6

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to