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.
This commit is contained in:
Ian Romanick
2011-02-10 11:48:59 -08:00
parent 05a16b8e1c
commit 53b8b68843

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