i915: Calculate partial result to temp register first

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.
(cherry picked from commit 53b8b68843)
This commit is contained in:
Ian Romanick 2011-02-10 11:48:59 -08:00
parent 38c93ba921
commit 24a9d95ec7

View 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),