summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStéphane Marchesin <[email protected]>2011-06-06 12:32:17 -0700
committerStéphane Marchesin <[email protected]>2011-06-06 12:36:00 -0700
commit2292025c49f2165b59f578c926d320913b08b1b5 (patch)
tree8fa17c0823fd856cf20880a89c17fd9e414402f0
parent0f091333d1ef403a67a8639ac13d9a9bbe93092a (diff)
i915g: implement more opcodes.
-rw-r--r--src/gallium/drivers/i915/i915_fpc_translate.c94
1 files changed, 82 insertions, 12 deletions
diff --git a/src/gallium/drivers/i915/i915_fpc_translate.c b/src/gallium/drivers/i915/i915_fpc_translate.c
index 695a3966bbb..51766cd6da1 100644
--- a/src/gallium/drivers/i915/i915_fpc_translate.c
+++ b/src/gallium/drivers/i915/i915_fpc_translate.c
@@ -501,6 +501,17 @@ i915_translate_instruction(struct i915_fp_compile *p,
i915_emit_const4fv(p, cos_constants), 0);
break;
+ case TGSI_OPCODE_DP2:
+ src0 = src_vector(p, &inst->Src[0]);
+ src1 = src_vector(p, &inst->Src[1]);
+
+ i915_emit_arith(p,
+ A0_DP3,
+ get_result_vector(p, &inst->Dst[0]),
+ get_result_flags(inst), 0,
+ swizzle(src0, X, Y, ZERO, ZERO), src1, 0);
+ break;
+
case TGSI_OPCODE_DP3:
emit_simple_arith(p, inst, A0_DP3, 2);
break;
@@ -706,7 +717,7 @@ i915_translate_instruction(struct i915_fp_compile *p,
i915_emit_arith(p,
A0_RCP,
get_result_vector(p, &inst->Dst[0]),
- get_result_flags(inst), 0,
+ get_result_flags(inst), 0,
swizzle(src0, X, X, X, X), 0, 0);
break;
@@ -784,13 +795,36 @@ i915_translate_instruction(struct i915_fp_compile *p,
}
break;
- case TGSI_OPCODE_SGE:
- emit_simple_arith(p, inst, A0_SGE, 2);
+ case TGSI_OPCODE_SEQ:
+ /* if we're both >= and <= then we're == */
+ src0 = src_vector(p, &inst->Src[0]);
+ src1 = src_vector(p, &inst->Src[1]);
+ tmp = i915_get_utemp(p);
+
+ i915_emit_arith(p,
+ A0_SGE,
+ tmp, A0_DEST_CHANNEL_ALL, 0,
+ src0,
+ src1, 0);
+
+ i915_emit_arith(p,
+ A0_SGE,
+ get_result_vector(p, &inst->Dst[0]),
+ A0_DEST_CHANNEL_ALL, 0,
+ src1,
+ src0, 0);
+
+ i915_emit_arith(p,
+ A0_MUL,
+ get_result_vector(p, &inst->Dst[0]),
+ A0_DEST_CHANNEL_ALL, 0,
+ get_result_vector(p, &inst->Dst[0]),
+ tmp, 0);
+
break;
- case TGSI_OPCODE_SLE:
- /* like SGE, but swap reg0, reg1 */
- emit_simple_arith_swap2(p, inst, A0_SGE, 2);
+ case TGSI_OPCODE_SGE:
+ emit_simple_arith(p, inst, A0_SGE, 2);
break;
case TGSI_OPCODE_SIN:
@@ -843,6 +877,11 @@ i915_translate_instruction(struct i915_fp_compile *p,
i915_emit_const4fv(p, sin_constants), 0);
break;
+ case TGSI_OPCODE_SLE:
+ /* like SGE, but swap reg0, reg1 */
+ emit_simple_arith_swap2(p, inst, A0_SGE, 2);
+ break;
+
case TGSI_OPCODE_SLT:
emit_simple_arith(p, inst, A0_SLT, 2);
break;
@@ -852,32 +891,59 @@ i915_translate_instruction(struct i915_fp_compile *p,
emit_simple_arith_swap2(p, inst, A0_SLT, 2);
break;
- case TGSI_OPCODE_SEQ:
- /* if we're both >= and <= then we're == */
+ case TGSI_OPCODE_SNE:
+ /* if we're neither < nor > then we're != */
src0 = src_vector(p, &inst->Src[0]);
src1 = src_vector(p, &inst->Src[1]);
tmp = i915_get_utemp(p);
i915_emit_arith(p,
- A0_SGE,
- tmp, A0_DEST_CHANNEL_ALL, 0,
+ A0_SLT,
+ tmp,
+ A0_DEST_CHANNEL_ALL, 0,
src0,
src1, 0);
i915_emit_arith(p,
- A0_SGE,
+ A0_SLT,
get_result_vector(p, &inst->Dst[0]),
A0_DEST_CHANNEL_ALL, 0,
src1,
src0, 0);
i915_emit_arith(p,
- A0_MUL,
+ A0_ADD,
get_result_vector(p, &inst->Dst[0]),
A0_DEST_CHANNEL_ALL, 0,
get_result_vector(p, &inst->Dst[0]),
tmp, 0);
+ break;
+ case TGSI_OPCODE_SSG:
+ /* compute (src>0) - (src<0) */
+ src0 = src_vector(p, &inst->Src[0]);
+ tmp = i915_get_utemp(p);
+
+ i915_emit_arith(p,
+ A0_SLT,
+ tmp,
+ A0_DEST_CHANNEL_ALL, 0,
+ src0,
+ swizzle(src0, ZERO, ZERO, ZERO, ZERO), 0);
+
+ i915_emit_arith(p,
+ A0_SLT,
+ get_result_vector(p, &inst->Dst[0]),
+ A0_DEST_CHANNEL_ALL, 0,
+ swizzle(src0, ZERO, ZERO, ZERO, ZERO),
+ src0, 0);
+
+ i915_emit_arith(p,
+ A0_ADD,
+ get_result_vector(p, &inst->Dst[0]),
+ A0_DEST_CHANNEL_ALL, 0,
+ get_result_vector(p, &inst->Dst[0]),
+ negate(tmp, 1, 1, 1, 1), 0);
break;
case TGSI_OPCODE_SUB:
@@ -895,6 +961,10 @@ i915_translate_instruction(struct i915_fp_compile *p,
emit_tex(p, inst, T0_TEXLD);
break;
+ case TGSI_OPCODE_TRUNC:
+ emit_simple_arith(p, inst, A0_TRC, 1);
+ break;
+
case TGSI_OPCODE_TXB:
emit_tex(p, inst, T0_TEXLDB);
break;