r600g/sb: fix a bug in constants folding optimisation pass
authorXavier Bouchoux <xavierb@gmail.com>
Wed, 28 Jan 2015 01:31:58 +0000 (02:31 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Fri, 6 Feb 2015 19:03:06 +0000 (20:03 +0100)
    ADD     R6.y.1,    R5.w.1, ~1|3f800000
    ADD     R6.y.2,    |R6.y.1|, -0.0001|b8d1b717

was wrongly being converted to

    ADD     R6.y.1,    R5.w.1, ~1|3f800000
    ADD     R6.y.2,    R5.w.1, -1.0001|bf800347

because abs() modifier was ignored.

Signed-off-by: Xavier Bouchoux <xavierb@gmail.com>
Reviewed-by: Glenn Kennard <glenn.kennard@gmail.com>
src/gallium/drivers/r600/sb/sb_expr.cpp

index 52c0c1796ba744c8e92dd7d4cff01c90592f32db..9c2274e65a3779191dbd503b72199f3ba41ed81a 100644 (file)
@@ -645,6 +645,7 @@ bool expr_handler::fold_assoc(alu_node *n) {
                                                (op == ALU_OP2_MUL_IEEE &&
                                                                d0->is_alu_op(ALU_OP2_MUL))) &&
                                                !d0->bc.omod && !d0->bc.clamp &&
+                                               !a->bc.src[0].abs &&
                                                (!a->bc.src[0].neg || allow_neg)) {
                                        cur_neg ^= a->bc.src[0].neg;
                                        a = d0;
@@ -678,6 +679,7 @@ bool expr_handler::fold_assoc(alu_node *n) {
                                                (op == ALU_OP2_MUL_IEEE &&
                                                                d1->is_alu_op(ALU_OP2_MUL))) &&
                                                !d1->bc.omod && !d1->bc.clamp &&
+                                               !a->bc.src[1].abs &&
                                                (!a->bc.src[1].neg || allow_neg)) {
                                        cur_neg ^= a->bc.src[1].neg;
                                        a = d1;