diff options
author | Marek Olšák <[email protected]> | 2017-08-19 22:23:08 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2017-08-22 13:29:47 +0200 |
commit | 985e6b5ef91ec8de7ae5e03fcfb978ea6e8993ea (patch) | |
tree | dc0d1343692b0fd7889905db57dbe85c728554eb /src/gallium/drivers | |
parent | 3e2ff8fade879cedfdff0e180a6996df1223a823 (diff) |
gallium: remove TGSI opcode XPD
use MUL+MAD+MOV instead.
Reviewed-by: Roland Scheidegger <[email protected]>
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r-- | src/gallium/drivers/etnaviv/etnaviv_compiler.c | 1 | ||||
-rw-r--r-- | src/gallium/drivers/i915/i915_fpc_optimize.c | 1 | ||||
-rw-r--r-- | src/gallium/drivers/i915/i915_fpc_translate.c | 26 | ||||
-rw-r--r-- | src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp | 27 | ||||
-rw-r--r-- | src/gallium/drivers/nouveau/nv30/nv30_vertprog.h | 1 | ||||
-rw-r--r-- | src/gallium/drivers/nouveau/nv30/nvfx_fragprog.c | 5 | ||||
-rw-r--r-- | src/gallium/drivers/nouveau/nv30/nvfx_shader.h | 1 | ||||
-rw-r--r-- | src/gallium/drivers/nouveau/nv30/nvfx_vertprog.c | 5 | ||||
-rw-r--r-- | src/gallium/drivers/r300/r300_tgsi_to_rc.c | 1 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_shader.c | 78 | ||||
-rw-r--r-- | src/gallium/drivers/svga/svga_tgsi_insn.c | 61 | ||||
-rw-r--r-- | src/gallium/drivers/svga/svga_tgsi_vgpu10.c | 113 |
12 files changed, 3 insertions, 317 deletions
diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler.c b/src/gallium/drivers/etnaviv/etnaviv_compiler.c index 3ccb7373817..4f09f71cc10 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_compiler.c +++ b/src/gallium/drivers/etnaviv/etnaviv_compiler.c @@ -2317,7 +2317,6 @@ etna_compile_shader(struct etna_shader_variant *v) .lower_LOG = true, .lower_DP2 = true, .lower_TRUNC = true, - .lower_XPD = true }; c = CALLOC_STRUCT(etna_compile); diff --git a/src/gallium/drivers/i915/i915_fpc_optimize.c b/src/gallium/drivers/i915/i915_fpc_optimize.c index da06e16bf0e..fb97e9ea868 100644 --- a/src/gallium/drivers/i915/i915_fpc_optimize.c +++ b/src/gallium/drivers/i915/i915_fpc_optimize.c @@ -118,7 +118,6 @@ static const struct { [ TGSI_OPCODE_TRUNC ] = { false, false, 0, 1, 1 }, [ TGSI_OPCODE_TXB ] = { true, false, 0, 1, 2 }, [ TGSI_OPCODE_TXP ] = { true, false, 0, 1, 2 }, - [ TGSI_OPCODE_XPD ] = { false, false, 0, 1, 2 }, }; static boolean op_has_dst(unsigned opcode) diff --git a/src/gallium/drivers/i915/i915_fpc_translate.c b/src/gallium/drivers/i915/i915_fpc_translate.c index 22a42eeeab4..2faab338b77 100644 --- a/src/gallium/drivers/i915/i915_fpc_translate.c +++ b/src/gallium/drivers/i915/i915_fpc_translate.c @@ -1027,32 +1027,6 @@ i915_translate_instruction(struct i915_fp_compile *p, emit_tex(p, inst, T0_TEXLDP, fs); break; - case TGSI_OPCODE_XPD: - /* Cross product: - * result.x = src0.y * src1.z - src0.z * src1.y; - * result.y = src0.z * src1.x - src0.x * src1.z; - * result.z = src0.x * src1.y - src0.y * src1.x; - * result.w = undef; - */ - src0 = src_vector(p, &inst->Src[0], fs); - src1 = src_vector(p, &inst->Src[1], fs); - tmp = i915_get_utemp(p); - - i915_emit_arith(p, - A0_MUL, - tmp, A0_DEST_CHANNEL_ALL, 0, - swizzle(src0, Z, X, Y, ONE), - swizzle(src1, Y, Z, X, ONE), 0); - - i915_emit_arith(p, - A0_MAD, - get_result_vector(p, &inst->Dst[0]), - get_result_flags(inst), 0, - swizzle(src0, Y, Z, X, ONE), - swizzle(src1, Z, X, Y, ONE), - negate(tmp, 1, 1, 1, 0)); - break; - default: i915_program_error(p, "bad opcode %d", inst->Instruction.Opcode); p->error = 1; diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp index c06e74e2f81..a862f985fd4 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp @@ -346,14 +346,6 @@ unsigned int Instruction::srcMask(unsigned int s) const return mask; case TGSI_OPCODE_TXQ: return 1; - case TGSI_OPCODE_XPD: - { - unsigned int x = 0; - if (mask & 1) x |= 0x6; - if (mask & 2) x |= 0x5; - if (mask & 4) x |= 0x3; - return x; - } case TGSI_OPCODE_D2I: case TGSI_OPCODE_D2U: case TGSI_OPCODE_D2F: @@ -3347,25 +3339,6 @@ Converter::handleInstruction(const struct tgsi_full_instruction *insn) case TGSI_OPCODE_LIT: handleLIT(dst0); break; - case TGSI_OPCODE_XPD: - FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { - if (c < 3) { - val0 = getSSA(); - src0 = fetchSrc(1, (c + 1) % 3); - src1 = fetchSrc(0, (c + 2) % 3); - mkOp2(OP_MUL, TYPE_F32, val0, src0, src1) - ->dnz = info->io.mul_zero_wins; - mkOp1(OP_NEG, TYPE_F32, val0, val0); - - src0 = fetchSrc(0, (c + 1) % 3); - src1 = fetchSrc(1, (c + 2) % 3); - mkOp3(OP_MAD, TYPE_F32, dst0[c], src0, src1, val0) - ->dnz = info->io.mul_zero_wins; - } else { - loadImm(dst0[c], 1.0f); - } - } - break; case TGSI_OPCODE_ISSG: case TGSI_OPCODE_SSG: FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { diff --git a/src/gallium/drivers/nouveau/nv30/nv30_vertprog.h b/src/gallium/drivers/nouveau/nv30/nv30_vertprog.h index 5556e0c77bd..89d5b935e9f 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_vertprog.h +++ b/src/gallium/drivers/nouveau/nv30/nv30_vertprog.h @@ -10,7 +10,6 @@ * POW - EX2 + MUL + LG2 * SUB - ADD, second source negated * SWZ - MOV - * XPD - * * Register access * - Only one INPUT can be accessed per-instruction (move extras into TEMPs) diff --git a/src/gallium/drivers/nouveau/nv30/nvfx_fragprog.c b/src/gallium/drivers/nouveau/nv30/nvfx_fragprog.c index a3ed5c6526b..7d006fb2dd7 100644 --- a/src/gallium/drivers/nouveau/nv30/nvfx_fragprog.c +++ b/src/gallium/drivers/nouveau/nv30/nvfx_fragprog.c @@ -774,11 +774,6 @@ nvfx_fragprog_parse_instruction(struct nvfx_fpc *fpc, case TGSI_OPCODE_TXP: nvfx_fp_emit(fpc, tex(sat, TXP, unit, dst, mask, src[0], none, none)); break; - case TGSI_OPCODE_XPD: - tmp = nvfx_src(temp(fpc)); - nvfx_fp_emit(fpc, arith(0, MUL, tmp.reg, mask, swz(src[0], Z, X, Y, Y), swz(src[1], Y, Z, X, X), none)); - nvfx_fp_emit(fpc, arith(sat, MAD, dst, (mask & ~NVFX_FP_MASK_W), swz(src[0], Y, Z, X, X), swz(src[1], Z, X, Y, Y), neg(tmp))); - break; case TGSI_OPCODE_IF: // MOVRC0 R31 (TR0.xyzw), R<src>: diff --git a/src/gallium/drivers/nouveau/nv30/nvfx_shader.h b/src/gallium/drivers/nouveau/nv30/nvfx_shader.h index e66d8af7620..f196c4fc17d 100644 --- a/src/gallium/drivers/nouveau/nv30/nvfx_shader.h +++ b/src/gallium/drivers/nouveau/nv30/nvfx_shader.h @@ -164,7 +164,6 @@ * RSQ - LG2 + EX2 * POW - LG2 + MUL + EX2 * SCS - COS + SIN - * XPD * * NV40 Looping * Loops appear to be fairly expensive on NV40 at least, the proprietary diff --git a/src/gallium/drivers/nouveau/nv30/nvfx_vertprog.c b/src/gallium/drivers/nouveau/nv30/nvfx_vertprog.c index 8ba3d5a0500..83823a148b3 100644 --- a/src/gallium/drivers/nouveau/nv30/nvfx_vertprog.c +++ b/src/gallium/drivers/nouveau/nv30/nvfx_vertprog.c @@ -683,11 +683,6 @@ nvfx_vertprog_parse_instruction(struct nvfx_vpc *vpc, insn.cc_test = NVFX_COND_LT; nvfx_vp_emit(vpc, insn); break; - case TGSI_OPCODE_XPD: - tmp = nvfx_src(temp(vpc)); - nvfx_vp_emit(vpc, arith(0, VEC, MUL, tmp.reg, mask, swz(src[0], Z, X, Y, Y), swz(src[1], Y, Z, X, X), none)); - nvfx_vp_emit(vpc, arith(sat, VEC, MAD, dst, (mask & ~NVFX_VP_MASK_W), swz(src[0], Y, Z, X, X), swz(src[1], Z, X, Y, Y), neg(tmp))); - break; case TGSI_OPCODE_IF: insn = arith(0, VEC, MOV, none.reg, NVFX_VP_MASK_X, src[0], none, none); insn.cc_update = 1; diff --git a/src/gallium/drivers/r300/r300_tgsi_to_rc.c b/src/gallium/drivers/r300/r300_tgsi_to_rc.c index 78af1242b4f..fa6c0b9104d 100644 --- a/src/gallium/drivers/r300/r300_tgsi_to_rc.c +++ b/src/gallium/drivers/r300/r300_tgsi_to_rc.c @@ -57,7 +57,6 @@ static unsigned translate_opcode(unsigned opcode) case TGSI_OPCODE_EX2: return RC_OPCODE_EX2; case TGSI_OPCODE_LG2: return RC_OPCODE_LG2; case TGSI_OPCODE_POW: return RC_OPCODE_POW; - case TGSI_OPCODE_XPD: return RC_OPCODE_XPD; case TGSI_OPCODE_COS: return RC_OPCODE_COS; case TGSI_OPCODE_DDX: return RC_OPCODE_DDX; case TGSI_OPCODE_DDY: return RC_OPCODE_DDY; diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c index fd76c93de88..18d4bc4c600 100644 --- a/src/gallium/drivers/r600/r600_shader.c +++ b/src/gallium/drivers/r600/r600_shader.c @@ -7844,78 +7844,6 @@ static int tgsi_ucmp(struct r600_shader_ctx *ctx) return 0; } -static int tgsi_xpd(struct r600_shader_ctx *ctx) -{ - struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; - static const unsigned int src0_swizzle[] = {2, 0, 1}; - static const unsigned int src1_swizzle[] = {1, 2, 0}; - struct r600_bytecode_alu alu; - uint32_t use_temp = 0; - int i, r; - - if (inst->Dst[0].Register.WriteMask != 0xf) - use_temp = 1; - - for (i = 0; i < 4; i++) { - memset(&alu, 0, sizeof(struct r600_bytecode_alu)); - alu.op = ALU_OP2_MUL; - if (i < 3) { - r600_bytecode_src(&alu.src[0], &ctx->src[0], src0_swizzle[i]); - r600_bytecode_src(&alu.src[1], &ctx->src[1], src1_swizzle[i]); - } else { - alu.src[0].sel = V_SQ_ALU_SRC_0; - alu.src[0].chan = i; - alu.src[1].sel = V_SQ_ALU_SRC_0; - alu.src[1].chan = i; - } - - alu.dst.sel = ctx->temp_reg; - alu.dst.chan = i; - alu.dst.write = 1; - - if (i == 3) - alu.last = 1; - r = r600_bytecode_add_alu(ctx->bc, &alu); - if (r) - return r; - } - - for (i = 0; i < 4; i++) { - memset(&alu, 0, sizeof(struct r600_bytecode_alu)); - alu.op = ALU_OP3_MULADD; - - if (i < 3) { - r600_bytecode_src(&alu.src[0], &ctx->src[0], src1_swizzle[i]); - r600_bytecode_src(&alu.src[1], &ctx->src[1], src0_swizzle[i]); - } else { - alu.src[0].sel = V_SQ_ALU_SRC_0; - alu.src[0].chan = i; - alu.src[1].sel = V_SQ_ALU_SRC_0; - alu.src[1].chan = i; - } - - alu.src[2].sel = ctx->temp_reg; - alu.src[2].neg = 1; - alu.src[2].chan = i; - - if (use_temp) - alu.dst.sel = ctx->temp_reg; - else - tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); - alu.dst.chan = i; - alu.dst.write = 1; - alu.is_op3 = 1; - if (i == 3) - alu.last = 1; - r = r600_bytecode_add_alu(ctx->bc, &alu); - if (r) - return r; - } - if (use_temp) - return tgsi_helper_copy(ctx, inst); - return 0; -} - static int tgsi_exp(struct r600_shader_ctx *ctx) { struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; @@ -9092,7 +9020,7 @@ static const struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] [TGSI_OPCODE_EX2] = { ALU_OP1_EXP_IEEE, tgsi_trans_srcx_replicate}, [TGSI_OPCODE_LG2] = { ALU_OP1_LOG_IEEE, tgsi_trans_srcx_replicate}, [TGSI_OPCODE_POW] = { ALU_OP0_NOP, tgsi_pow}, - [TGSI_OPCODE_XPD] = { ALU_OP0_NOP, tgsi_xpd}, + [31] = { ALU_OP0_NOP, tgsi_unsupported}, [32] = { ALU_OP0_NOP, tgsi_unsupported}, [33] = { ALU_OP0_NOP, tgsi_unsupported}, [34] = { ALU_OP0_NOP, tgsi_unsupported}, @@ -9290,7 +9218,7 @@ static const struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = [TGSI_OPCODE_EX2] = { ALU_OP1_EXP_IEEE, tgsi_trans_srcx_replicate}, [TGSI_OPCODE_LG2] = { ALU_OP1_LOG_IEEE, tgsi_trans_srcx_replicate}, [TGSI_OPCODE_POW] = { ALU_OP0_NOP, tgsi_pow}, - [TGSI_OPCODE_XPD] = { ALU_OP0_NOP, tgsi_xpd}, + [31] = { ALU_OP0_NOP, tgsi_unsupported}, [32] = { ALU_OP0_NOP, tgsi_unsupported}, [33] = { ALU_OP0_NOP, tgsi_unsupported}, [34] = { ALU_OP0_NOP, tgsi_unsupported}, @@ -9513,7 +9441,7 @@ static const struct r600_shader_tgsi_instruction cm_shader_tgsi_instruction[] = [TGSI_OPCODE_EX2] = { ALU_OP1_EXP_IEEE, cayman_emit_float_instr}, [TGSI_OPCODE_LG2] = { ALU_OP1_LOG_IEEE, cayman_emit_float_instr}, [TGSI_OPCODE_POW] = { ALU_OP0_NOP, cayman_pow}, - [TGSI_OPCODE_XPD] = { ALU_OP0_NOP, tgsi_xpd}, + [31] = { ALU_OP0_NOP, tgsi_unsupported}, [32] = { ALU_OP0_NOP, tgsi_unsupported}, [33] = { ALU_OP0_NOP, tgsi_unsupported}, [34] = { ALU_OP0_NOP, tgsi_unsupported}, diff --git a/src/gallium/drivers/svga/svga_tgsi_insn.c b/src/gallium/drivers/svga/svga_tgsi_insn.c index 928330ce147..a325a567c18 100644 --- a/src/gallium/drivers/svga/svga_tgsi_insn.c +++ b/src/gallium/drivers/svga/svga_tgsi_insn.c @@ -2196,63 +2196,6 @@ emit_pow(struct svga_shader_emitter *emit, /** - * Translate/emit TGSI XPD (vector cross product) instruction. - */ -static boolean -emit_xpd(struct svga_shader_emitter *emit, - const struct tgsi_full_instruction *insn) -{ - SVGA3dShaderDestToken dst = translate_dst_register( emit, insn, 0 ); - const struct src_register src0 = translate_src_register( - emit, &insn->Src[0] ); - const struct src_register src1 = translate_src_register( - emit, &insn->Src[1] ); - boolean need_dst_tmp = FALSE; - - /* XPD can only output to a temporary */ - if (SVGA3dShaderGetRegType(dst.value) != SVGA3DREG_TEMP) - need_dst_tmp = TRUE; - - /* The dst reg must not be the same as src0 or src1*/ - if (alias_src_dst(src0, dst) || - alias_src_dst(src1, dst)) - need_dst_tmp = TRUE; - - if (need_dst_tmp) { - SVGA3dShaderDestToken tmp = get_temp( emit ); - - /* Obey DX9 restrictions on mask: - */ - tmp.mask = dst.mask & TGSI_WRITEMASK_XYZ; - - if (!submit_op2(emit, inst_token( SVGA3DOP_CRS ), tmp, src0, src1)) - return FALSE; - - if (!submit_op1(emit, inst_token( SVGA3DOP_MOV ), dst, src( tmp ))) - return FALSE; - } - else { - if (!submit_op2(emit, inst_token( SVGA3DOP_CRS ), dst, src0, src1)) - return FALSE; - } - - /* Need to emit 1.0 to dst.w? - */ - if (dst.mask & TGSI_WRITEMASK_W) { - struct src_register one = get_one_immediate( emit ); - - if (!submit_op1(emit, - inst_token( SVGA3DOP_MOV ), - writemask(dst, TGSI_WRITEMASK_W), - one)) - return FALSE; - } - - return TRUE; -} - - -/** * Emit a LRP (linear interpolation) instruction. */ static boolean @@ -2986,9 +2929,6 @@ svga_emit_instruction(struct svga_shader_emitter *emit, case TGSI_OPCODE_BRK: return emit_brk( emit, insn ); - case TGSI_OPCODE_XPD: - return emit_xpd( emit, insn ); - case TGSI_OPCODE_KILL: return emit_kill( emit, insn ); @@ -3604,7 +3544,6 @@ needs_to_create_common_immediate(const struct svga_shader_emitter *emit) emit->info.opcode_count[TGSI_OPCODE_SEQ] >= 1 || emit->info.opcode_count[TGSI_OPCODE_EXP] >= 1 || emit->info.opcode_count[TGSI_OPCODE_LOG] >= 1 || - emit->info.opcode_count[TGSI_OPCODE_XPD] >= 1 || emit->info.opcode_count[TGSI_OPCODE_KILL] >= 1) return TRUE; diff --git a/src/gallium/drivers/svga/svga_tgsi_vgpu10.c b/src/gallium/drivers/svga/svga_tgsi_vgpu10.c index e57e78d11a5..9d86f72ea05 100644 --- a/src/gallium/drivers/svga/svga_tgsi_vgpu10.c +++ b/src/gallium/drivers/svga/svga_tgsi_vgpu10.c @@ -5210,117 +5210,6 @@ emit_txp(struct svga_shader_emitter_v10 *emit, } -/* - * Emit code for TGSI_OPCODE_XPD instruction. - */ -static boolean -emit_xpd(struct svga_shader_emitter_v10 *emit, - const struct tgsi_full_instruction *inst) -{ - /* dst.x = src0.y * src1.z - src1.y * src0.z - * dst.y = src0.z * src1.x - src1.z * src0.x - * dst.z = src0.x * src1.y - src1.x * src0.y - * dst.w = 1 - */ - struct tgsi_full_src_register s0_xxxx = - scalar_src(&inst->Src[0], TGSI_SWIZZLE_X); - struct tgsi_full_src_register s0_yyyy = - scalar_src(&inst->Src[0], TGSI_SWIZZLE_Y); - struct tgsi_full_src_register s0_zzzz = - scalar_src(&inst->Src[0], TGSI_SWIZZLE_Z); - - struct tgsi_full_src_register s1_xxxx = - scalar_src(&inst->Src[1], TGSI_SWIZZLE_X); - struct tgsi_full_src_register s1_yyyy = - scalar_src(&inst->Src[1], TGSI_SWIZZLE_Y); - struct tgsi_full_src_register s1_zzzz = - scalar_src(&inst->Src[1], TGSI_SWIZZLE_Z); - - unsigned tmp1 = get_temp_index(emit); - struct tgsi_full_src_register tmp1_src = make_src_temp_reg(tmp1); - struct tgsi_full_dst_register tmp1_dst = make_dst_temp_reg(tmp1); - - unsigned tmp2 = get_temp_index(emit); - struct tgsi_full_src_register tmp2_src = make_src_temp_reg(tmp2); - struct tgsi_full_dst_register tmp2_dst = make_dst_temp_reg(tmp2); - struct tgsi_full_src_register neg_tmp2_src = negate_src(&tmp2_src); - - unsigned tmp3 = get_temp_index(emit); - struct tgsi_full_src_register tmp3_src = make_src_temp_reg(tmp3); - struct tgsi_full_dst_register tmp3_dst = make_dst_temp_reg(tmp3); - struct tgsi_full_dst_register tmp3_dst_x = - writemask_dst(&tmp3_dst, TGSI_WRITEMASK_X); - struct tgsi_full_dst_register tmp3_dst_y = - writemask_dst(&tmp3_dst, TGSI_WRITEMASK_Y); - struct tgsi_full_dst_register tmp3_dst_z = - writemask_dst(&tmp3_dst, TGSI_WRITEMASK_Z); - struct tgsi_full_dst_register tmp3_dst_w = - writemask_dst(&tmp3_dst, TGSI_WRITEMASK_W); - - /* Note: we put all the intermediate computations into tmp3 in case - * the XPD dest register is that same as one of the src regs (in which - * case we could clobber a src reg before we're done with it) . - * - * Note: we could get by with just one temp register instead of three - * since we're doing scalar operations and there's enough room in one - * temp for everything. - */ - - /* MUL tmp1, src0.y, src1.z */ - /* MUL tmp2, src1.y, src0.z */ - /* ADD tmp3.x, tmp1, -tmp2 */ - if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) { - emit_instruction_op2(emit, VGPU10_OPCODE_MUL, &tmp1_dst, - &s0_yyyy, &s1_zzzz, FALSE); - emit_instruction_op2(emit, VGPU10_OPCODE_MUL, &tmp2_dst, - &s1_yyyy, &s0_zzzz, FALSE); - emit_instruction_op2(emit, VGPU10_OPCODE_ADD, &tmp3_dst_x, - &tmp1_src, &neg_tmp2_src, FALSE); - } - - /* MUL tmp1, src0.z, src1.x */ - /* MUL tmp2, src1.z, src0.x */ - /* ADD tmp3.y, tmp1, -tmp2 */ - if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) { - emit_instruction_op2(emit, VGPU10_OPCODE_MUL, &tmp1_dst, &s0_zzzz, - &s1_xxxx, FALSE); - emit_instruction_op2(emit, VGPU10_OPCODE_MUL, &tmp2_dst, &s1_zzzz, - &s0_xxxx, FALSE); - emit_instruction_op2(emit, VGPU10_OPCODE_ADD, &tmp3_dst_y, - &tmp1_src, &neg_tmp2_src, FALSE); - } - - /* MUL tmp1, src0.x, src1.y */ - /* MUL tmp2, src1.x, src0.y */ - /* ADD tmp3.z, tmp1, -tmp2 */ - if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) { - emit_instruction_op2(emit, VGPU10_OPCODE_MUL, &tmp1_dst, &s0_xxxx, - &s1_yyyy, FALSE); - emit_instruction_op2(emit, VGPU10_OPCODE_MUL, &tmp2_dst, &s1_xxxx, - &s0_yyyy, FALSE); - emit_instruction_op2(emit, VGPU10_OPCODE_ADD, &tmp3_dst_z, - &tmp1_src, &neg_tmp2_src, FALSE); - } - - /* MOV tmp3.w, 1.0 */ - if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) { - struct tgsi_full_src_register one = - make_immediate_reg_float(emit, 1.0f); - - emit_instruction_op1(emit, VGPU10_OPCODE_MOV, &tmp3_dst_w, &one, FALSE); - } - - /* MOV dst, tmp3 */ - emit_instruction_op1(emit, VGPU10_OPCODE_MOV, &inst->Dst[0], &tmp3_src, - inst->Instruction.Saturate); - - - free_temp_indexes(emit); - - return TRUE; -} - - /** * Emit code for TGSI_OPCODE_TXD (explicit derivatives) */ @@ -5742,8 +5631,6 @@ emit_vgpu10_instruction(struct svga_shader_emitter_v10 *emit, return emit_txq(emit, inst); case TGSI_OPCODE_UIF: return emit_if(emit, inst); - case TGSI_OPCODE_XPD: - return emit_xpd(emit, inst); case TGSI_OPCODE_UMUL_HI: case TGSI_OPCODE_IMUL_HI: case TGSI_OPCODE_UDIV: |