i915: Calculate partial result to temp register first
authorIan Romanick <ian.d.romanick@intel.com>
Thu, 10 Feb 2011 19:48:59 +0000 (11:48 -0800)
committerIan Romanick <ian.d.romanick@intel.com>
Thu, 10 Feb 2011 21:26:49 +0000 (13:26 -0800)
Previously the SNE and SEQ instructions would calculate the partial
result to the destination register.  This would cause problems if the
destination register was also one of the source registers.

Fixes piglit tests glsl-fs-any, glsl-fs-struct-equal,
glsl-fs-struct-notequal, glsl-fs-vec4-operator-equal,
glsl-fs-vec4-operator-notequal.

NOTE: This is a candidate for the 7.9 and 7.10 branches.

src/mesa/drivers/dri/i915/i915_fragprog.c

index 624f18d6710ed26c2e3de1f20a379d42a4c288a2..8bc88a8f4416d5c44a3406a8344134fa4521058c 100644 (file)
@@ -809,18 +809,18 @@ upload_program(struct i915_fragment_program *p)
         flags = get_result_flags(inst);
         dst = get_result_vector(p, inst);
 
-        /* dst = src1 >= src2 */
+        /* tmp = src1 >= src2 */
         i915_emit_arith(p,
                         A0_SGE,
-                        dst,
+                        tmp,
                         flags, 0,
                         src_vector(p, &inst->SrcReg[0], program),
                         src_vector(p, &inst->SrcReg[1], program),
                         0);
-        /* tmp = src1 <= src2 */
+        /* dst = src1 <= src2 */
         i915_emit_arith(p,
                         A0_SGE,
-                        tmp,
+                        dst,
                         flags, 0,
                         negate(src_vector(p, &inst->SrcReg[0], program),
                                1, 1, 1, 1),
@@ -958,18 +958,18 @@ upload_program(struct i915_fragment_program *p)
         flags = get_result_flags(inst);
         dst = get_result_vector(p, inst);
 
-        /* dst = src1 < src2 */
+        /* tmp = src1 < src2 */
         i915_emit_arith(p,
                         A0_SLT,
-                        dst,
+                        tmp,
                         flags, 0,
                         src_vector(p, &inst->SrcReg[0], program),
                         src_vector(p, &inst->SrcReg[1], program),
                         0);
-        /* tmp = src1 > src2 */
+        /* dst = src1 > src2 */
         i915_emit_arith(p,
                         A0_SLT,
-                        tmp,
+                        dst,
                         flags, 0,
                         negate(src_vector(p, &inst->SrcReg[0], program),
                                1, 1, 1, 1),