r600_shader.c revision b777db32541b360516203865a0fa41f4b8cebf7c
172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse/*
272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Copyright 2010 Jerome Glisse <glisse@freedesktop.org>
372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse *
472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Permission is hereby granted, free of charge, to any person obtaining a
572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * copy of this software and associated documentation files (the "Software"),
672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * to deal in the Software without restriction, including without limitation
772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * on the rights to use, copy, modify, merge, publish, distribute, sub
872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * license, and/or sell copies of the Software, and to permit persons to whom
972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * the Software is furnished to do so, subject to the following conditions:
1072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse *
1172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * The above copyright notice and this permission notice (including the next
1272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * paragraph) shall be included in all copies or substantial portions of the
1372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * Software.
1472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse *
1572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
1872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
1972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
2072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
2172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse * USE OR OTHER DEALINGS IN THE SOFTWARE.
2272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse */
23de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "pipe/p_shader_tokens.h"
24de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "tgsi/tgsi_parse.h"
25de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "tgsi/tgsi_scan.h"
2633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse#include "tgsi/tgsi_dump.h"
27de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "util/u_format.h"
2872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600_screen.h"
2972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600_context.h"
30de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_shader.h"
31de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_asm.h"
32de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include "r600_sq.h"
3372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600d.h"
34de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <stdio.h>
35de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <errno.h>
36de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
372b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
382b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction;
392b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
402b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx {
412b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_shader_info			info;
422b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_parse_context		parse;
432b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	const struct tgsi_token			*tokens;
442b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				type;
452b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				file_offset[TGSI_FILE_COUNT];
462b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				temp_reg;
472b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader_tgsi_instruction	*inst_info;
482b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_bc				*bc;
492b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader			*shader;
502b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	u32					value[4];
512b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
522b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
532b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction {
542b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	tgsi_opcode;
552b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	is_op3;
562b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	r600_opcode;
572b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	int (*process)(struct r600_shader_ctx *ctx);
582b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
592b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
602b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[];
61de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader);
62de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
63de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int r600_shader_update(struct pipe_context *ctx, struct r600_shader *shader)
64de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
65de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_context *rctx = r600_context(ctx);
66de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	const struct util_format_description *desc;
67de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	enum pipe_format resource_format[160];
68de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i, nresources = 0;
69de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc *bc = &shader->bc;
70de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_cf *cf;
71de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_vtx *vtx;
72de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
73de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (shader->processor_type != TGSI_PROCESSOR_VERTEX)
74de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return 0;
75de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < rctx->vertex_elements->count; i++) {
76de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		resource_format[nresources++] = rctx->vertex_elements->elements[i].src_format;
77de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
78de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	LIST_FOR_EACH_ENTRY(cf, &bc->cf, list) {
79de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (cf->inst) {
80de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case V_SQ_CF_WORD1_SQ_CF_INST_VTX:
81de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case V_SQ_CF_WORD1_SQ_CF_INST_VTX_TC:
82de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			LIST_FOR_EACH_ENTRY(vtx, &cf->vtx, list) {
83de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				desc = util_format_description(resource_format[vtx->buffer_id]);
84de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				if (desc == NULL) {
85de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse					R600_ERR("unknown format %d\n", resource_format[vtx->buffer_id]);
86de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse					return -EINVAL;
87de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				}
88de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				vtx->dst_sel_x = desc->swizzle[0];
89de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				vtx->dst_sel_y = desc->swizzle[1];
90de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				vtx->dst_sel_z = desc->swizzle[2];
91de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				vtx->dst_sel_w = desc->swizzle[3];
92de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
93de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
94de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
95de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
96de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
97de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
98de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r600_bc_build(&shader->bc);
99de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
100de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1016f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisseint r600_pipe_shader_create(struct pipe_context *ctx,
1026f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse			struct r600_context_state *rpshader,
1036f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse			const struct tgsi_token *tokens)
104de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
105de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_screen *rscreen = r600_screen(ctx->screen);
106de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int r;
107de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
108457378e031ffb89a2011604c7798a6f5f2142207Jerome Glissefprintf(stderr, "--------------------------------------------------------------\n");
109457378e031ffb89a2011604c7798a6f5f2142207Jerome Glissetgsi_dump(tokens, 0);
110de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (rpshader == NULL)
1116f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		return -ENOMEM;
112de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	rpshader->shader.family = radeon_get_family(rscreen->rw);
113de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_shader_from_tgsi(tokens, &rpshader->shader);
114de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r) {
115de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("translation from TGSI failed !\n");
1166f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		return r;
117de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
118de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_bc_build(&rpshader->shader.bc);
119de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r) {
120de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("building bytecode failed !\n");
1216f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		return r;
122de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
123457378e031ffb89a2011604c7798a6f5f2142207Jerome Glissefprintf(stderr, "______________________________________________________________\n");
1246f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	return 0;
125de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
12672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
1276f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader_vs(struct pipe_context *ctx, struct r600_context_state *rpshader)
12872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
129ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_screen *rscreen = r600_screen(ctx->screen);
13072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct r600_shader *rshader = &rpshader->shader;
13172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct radeon_state *state;
132313df4156279f84ebc5b98a7540820b994762650Jerome Glisse	unsigned i, tmp;
13372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
1346e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate = radeon_state_decref(rpshader->rstate);
1356e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	state = radeon_state(rscreen->rw, R600_VS_SHADER_TYPE, R600_VS_SHADER);
1366e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	if (state == NULL)
1376e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse		return -ENOMEM;
138de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 10; i++) {
139de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		state->states[R600_VS_SHADER__SPI_VS_OUT_ID_0 + i] = 0;
140de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1416c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	/* so far never got proper semantic id from tgsi */
1426c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	for (i = 0; i < 32; i++) {
1436c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse		tmp = i << ((i & 3) * 8);
1446c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse		state->states[R600_VS_SHADER__SPI_VS_OUT_ID_0 + i / 4] |= tmp;
145de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
146de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	state->states[R600_VS_SHADER__SPI_VS_OUT_CONFIG] = S_0286C4_VS_EXPORT_COUNT(rshader->noutput - 2);
147de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	state->states[R600_VS_SHADER__SQ_PGM_RESOURCES_VS] = S_028868_NUM_GPRS(rshader->bc.ngpr);
1486e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate = state;
1496e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate->bo[0] = radeon_bo_incref(rscreen->rw, rpshader->bo);
1506e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate->bo[1] = radeon_bo_incref(rscreen->rw, rpshader->bo);
1516e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate->nbo = 2;
1526e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate->placement[0] = RADEON_GEM_DOMAIN_GTT;
15372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	return radeon_state_pm4(state);
15472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
15572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
1566f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader_ps(struct pipe_context *ctx, struct r600_context_state *rpshader)
15772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
158457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	const struct pipe_rasterizer_state *rasterizer;
159ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_screen *rscreen = r600_screen(ctx->screen);
16072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct r600_shader *rshader = &rpshader->shader;
161457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	struct r600_context *rctx = r600_context(ctx);
16272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct radeon_state *state;
1635f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie	unsigned i, tmp, exports_ps, num_cout;
16472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
165457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	rasterizer = &rctx->rasterizer->state.rasterizer;
1666e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate = radeon_state_decref(rpshader->rstate);
1676e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	state = radeon_state(rscreen->rw, R600_PS_SHADER_TYPE, R600_PS_SHADER);
1686e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	if (state == NULL)
1696e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse		return -ENOMEM;
17072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	for (i = 0; i < rshader->ninput; i++) {
1716c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse		tmp = S_028644_SEMANTIC(i);
17272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		tmp |= S_028644_SEL_CENTROID(1);
17335e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		if (rshader->input[i].name == TGSI_SEMANTIC_COLOR ||
17435e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse			rshader->input[i].name == TGSI_SEMANTIC_BCOLOR) {
17535e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse			tmp |= S_028644_FLAT_SHADE(rshader->flat_shade);
17635e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		}
177457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (rasterizer->sprite_coord_enable & (1 << i)) {
178457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			tmp |= S_028644_PT_SPRITE_TEX(1);
179457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
18072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		state->states[R600_PS_SHADER__SPI_PS_INPUT_CNTL_0 + i] = tmp;
18172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
1825f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie
1835f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie	exports_ps = 0;
1845f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie	num_cout = 0;
1855f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie	for (i = 0; i < rshader->noutput; i++) {
1865f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie		if (rshader->output[i].name == TGSI_SEMANTIC_POSITION)
1875f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			exports_ps |= 1;
1885f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie		else if (rshader->output[i].name == TGSI_SEMANTIC_COLOR) {
1895f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			exports_ps |= (1 << (num_cout+1));
1905f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			num_cout++;
1915f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie		}
1925f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie	}
19372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	state->states[R600_PS_SHADER__SPI_PS_IN_CONTROL_0] = S_0286CC_NUM_INTERP(rshader->ninput) |
19472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse							S_0286CC_PERSP_GRADIENT_ENA(1);
19572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	state->states[R600_PS_SHADER__SPI_PS_IN_CONTROL_1] = 0x00000000;
196de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	state->states[R600_PS_SHADER__SQ_PGM_RESOURCES_PS] = S_028868_NUM_GPRS(rshader->bc.ngpr);
1975f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie	state->states[R600_PS_SHADER__SQ_PGM_EXPORTS_PS] = exports_ps;
1986e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate = state;
1996e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate->bo[0] = radeon_bo_incref(rscreen->rw, rpshader->bo);
2006e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate->nbo = 1;
2016e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate->placement[0] = RADEON_GEM_DOMAIN_GTT;
20272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	return radeon_state_pm4(state);
20372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
20472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
2056f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_context_state *rpshader)
20672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
207ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_screen *rscreen = r600_screen(ctx->screen);
208ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_context *rctx = r600_context(ctx);
20972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct r600_shader *rshader = &rpshader->shader;
21072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	int r;
21172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
21272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	/* copy new shader */
21372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	radeon_bo_decref(rscreen->rw, rpshader->bo);
21472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->bo = NULL;
215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	rpshader->bo = radeon_bo(rscreen->rw, 0, rshader->bc.ndw * 4,
21672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse				4096, NULL);
21772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (rpshader->bo == NULL) {
21872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		return -ENOMEM;
21972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
22072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	radeon_bo_map(rscreen->rw, rpshader->bo);
221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	memcpy(rpshader->bo->data, rshader->bc.bytecode, rshader->bc.ndw * 4);
22272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	radeon_bo_unmap(rscreen->rw, rpshader->bo);
22372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	/* build state */
22472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rshader->flat_shade = rctx->flat_shade;
225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (rshader->processor_type) {
226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_PROCESSOR_VERTEX:
22772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		r = r600_pipe_shader_vs(ctx, rpshader);
22872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_PROCESSOR_FRAGMENT:
23072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		r = r600_pipe_shader_ps(ctx, rpshader);
23172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
23272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	default:
23372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		r = -EINVAL;
23472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
23572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
23672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	return r;
23772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
23872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
2396f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisseint r600_pipe_shader_update(struct pipe_context *ctx, struct r600_context_state *rpshader)
24072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_context *rctx = r600_context(ctx);
24272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	int r;
24372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
24472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (rpshader == NULL)
245de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
246de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* there should be enough input */
247de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (rctx->vertex_elements->count < rpshader->shader.bc.nresource) {
248de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("%d resources provided, expecting %d\n",
249de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			rctx->vertex_elements->count, rpshader->shader.bc.nresource);
250de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
25172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
252de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_shader_update(ctx, &rpshader->shader);
253de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r)
254de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return r;
255de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r600_pipe_shader(ctx, rpshader);
256de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
257de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
259de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
260de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
261de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
265de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
26672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
268de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
270c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
271de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
272de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
273de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
27472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
275de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
276de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i->Src[j].Register.Indirect ||
277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			i->Src[j].Register.Dimension ||
278de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			i->Src[j].Register.Absolute) {
279de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported src (indirect|dimension|absolute)\n");
280de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
281de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
282de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
283de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
284de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i->Dst[j].Register.Indirect || i->Dst[j].Register.Dimension) {
285de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported dst (indirect|dimension)\n");
286de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
287de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
288de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
289de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
29072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
29172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
292de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
29372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
294de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
295de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_vtx vtx;
296de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
297de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int r;
29872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
299de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
300de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
301de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
302de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
303de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
30435e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->input[i].interpolate = d->Declaration.Interpolate;
305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i;
306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (ctx->type == TGSI_PROCESSOR_VERTEX) {
307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			/* turn input into fetch */
308de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			memset(&vtx, 0, sizeof(struct r600_bc_vtx));
309de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.inst = 0;
310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.fetch_type = 0;
311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.buffer_id = i;
312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			/* register containing the index into the buffer */
313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.src_gpr = 0;
314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.src_sel_x = 0;
315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.mega_fetch_count = 0x1F;
316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_gpr = ctx->shader->input[i].gpr;
317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_x = 0;
318de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_y = 1;
319de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_z = 2;
320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_w = 3;
321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = r600_bc_add_vtx(ctx->bc, &vtx);
322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
326de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
328de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
330de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i;
33135e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->output[i].interpolate = d->Declaration.Interpolate;
332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
333de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
334de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
33533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
340de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
341de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
34272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
34372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader)
34572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
346de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
347de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
348c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	struct r600_bc_output output[32];
349457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	unsigned output_done, noutput;
350de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
351de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, r = 0, pos0;
35272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
353de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
354de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
355de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_bc_init(ctx.bc, shader->family);
356de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r)
357de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return r;
358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
359de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
360de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
362de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
364de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* Values [0,127] correspond to GPR[0..127].
366de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Values [256,511] correspond to cfile constants c[0..255].
367de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
368de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
369de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
370de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
371de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
372de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
373de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
374de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
375de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
376de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
377de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
378de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
379de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
380de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
381de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
382de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
383de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] +
384de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_INPUT];
385de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
386de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_OUTPUT];
387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_CONSTANT] = 256;
388de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_IMMEDIATE] = 253;
389de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
390de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			ctx.info.file_count[TGSI_FILE_TEMPORARY];
391de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
392de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
393de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
394de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
395de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
396de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
3972b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			ctx.value[0] = immediate->u[0].Uint;
3982b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			ctx.value[1] = immediate->u[1].Uint;
3992b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			ctx.value[2] = immediate->u[2].Uint;
4002b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			ctx.value[3] = immediate->u[3].Uint;
401de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
402de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
403de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
404de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
406de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
407de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
408de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
409de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
410de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
411de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
412de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
413de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
414de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
415de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
4162b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			r = r600_bc_add_literal(ctx.bc, ctx.value);
417de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
418de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
419de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
420de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
421de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
422de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
423de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
424de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
425de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
426de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* export output */
427457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	noutput = shader->noutput;
428457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0, pos0 = 0; i < noutput; i++) {
429c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		memset(&output[i], 0, sizeof(struct r600_bc_output));
430c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].gpr = shader->output[i].gpr;
431c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].elem_size = 3;
432c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_x = 0;
433c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_y = 1;
434c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_z = 2;
435c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_w = 3;
436c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].barrier = 1;
437c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
438c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].array_base = i - pos0;
439c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT;
440457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		switch (ctx.type) {
441de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
442de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
443c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 60;
444c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
445de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				/* position doesn't count in array_base */
446457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
447457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
448457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) {
449457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].array_base = 61;
450457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
451457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				/* position doesn't count in array_base */
452457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
453de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
454de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
455de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
456de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
457b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse				output[i].array_base = shader->output[i].sid;
458c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
4595f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
460c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 61;
461c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
462de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
463de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
464de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
465de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
466de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
467de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
468de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
469de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
470de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
471de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
47272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
473457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	}
474457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add fake param output for vertex shader if no param is exported */
475457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
476457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		for (i = 0, pos0 = 0; i < noutput; i++) {
477457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) {
478457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0 = 1;
479457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				break;
480457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
481457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
482457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (!pos0) {
483457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			memset(&output[i], 0, sizeof(struct r600_bc_output));
484457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].gpr = 0;
485457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].elem_size = 3;
486457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_x = 0;
487457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_y = 1;
488457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_z = 2;
489457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_w = 3;
490457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].barrier = 1;
491457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
492457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].array_base = 0;
493457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT;
494457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			noutput++;
495de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
496c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
497481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	/* add fake pixel export */
498481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) {
499481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		memset(&output[0], 0, sizeof(struct r600_bc_output));
500481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].gpr = 0;
501481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].elem_size = 3;
502481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_x = 7;
503481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_y = 7;
504481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_z = 7;
505481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_w = 7;
506481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].barrier = 1;
507608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse		output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
508481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].array_base = 0;
509481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT;
510481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		noutput++;
511481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	}
512457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* set export done on last export of each type */
513457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
514457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (i == (noutput - 1)) {
515457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].end_of_program = 1;
516457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
517b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse		if (!(output_done & (1 << output[i].type))) {
518b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse			output_done |= (1 << output[i].type);
519c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse			output[i].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE;
520c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		}
521c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
522457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add output to bytecode */
523457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0; i < noutput; i++) {
524c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		r = r600_bc_add_output(ctx.bc, &output[i]);
525de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
530de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
533de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
536de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
537de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode);
538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
539de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
541de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
542de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
543de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx,
547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_src_register *tgsi_src,
548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_src *r600_src)
549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
5507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(r600_src, 0, sizeof(struct r600_bc_alu_src));
551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel = tgsi_src->Register.Index;
552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r600_src->sel = 0;
554de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
5551bb0427a856ffa3fea1b177ea5b0395a00de3833Jerome Glisse	r600_src->neg = tgsi_src->Register.Negate;
556de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
557de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
560de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx,
561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_dst_register *tgsi_dst,
562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			unsigned swizzle,
563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_dst *r600_dst)
564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
5657a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
5667a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
568de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
5717a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
5727a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
5737a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
575de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
576de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
5777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic unsigned tgsi_chan(const struct tgsi_full_src_register *tgsi_src, unsigned swizzle)
5787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
5797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	switch (swizzle) {
5807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 0:
5817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleX;
5827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 1:
5837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleY;
5847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 2:
5857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleZ;
5867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 3:
5877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleW;
5887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	default:
5897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return 0;
5907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
5917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
5927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
5937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic int tgsi_split_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3])
5947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
5957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
5967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
5977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	int i, j, k, nconst, r;
5987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
5997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
6007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
6017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			nconst++;
6027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
6037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[i], &r600_src[i]);
6047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r) {
6057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
6067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
6077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
6087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
6097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (inst->Src[j].Register.File == TGSI_FILE_CONSTANT && j > 0) {
6107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			for (k = 0; k < 4; k++) {
6117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				memset(&alu, 0, sizeof(struct r600_bc_alu));
6127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
6137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[0].sel = r600_src[0].sel;
6147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[0].chan = k;
6157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.sel = ctx->temp_reg + j;
6167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.chan = k;
6177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.write = 1;
6187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				if (k == 3)
6197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse					alu.last = 1;
6207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				r = r600_bc_add_alu(ctx->bc, &alu);
6217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				if (r)
6227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse					return r;
6237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			}
6247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			r600_src[0].sel = ctx->temp_reg + j;
6257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			j--;
6267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
6277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
6287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
6297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
6307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
631de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op2(struct r600_shader_ctx *ctx)
632de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
633de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
6347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
635de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
636de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
637de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
6387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
6397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
6407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
641de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
642de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
643de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP;
6456c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
646de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		} else {
647de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.inst = ctx->inst_info->r600_opcode;
648de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
6497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j] = r600_src[j];
6507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
651de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
654de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
655de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
656de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
657de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
658de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
659de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.src[1].neg = 1;
660de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
6617a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
6627a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			alu.src[0].abs = 1;
6637a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
664de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
665de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
667de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
668de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
669de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
670de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
672de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
673de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
674de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
675de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
676de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
677094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
678094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
679094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
680094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct r600_bc_alu alu;
681094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
682094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
683094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
684094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
685094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
686094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
687094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.src[0].sel = 248;
6887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]);
689094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
690094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
6917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
692094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
693094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
694094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
695094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
696094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
697094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
698094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
699094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
700094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
701094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
702de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_slt(struct r600_shader_ctx *ctx)
703de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
704de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
7057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
706de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, r;
708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
7097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
7107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
7117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
713de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
715de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP;
7166c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
717de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		} else {
718de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.inst = ctx->inst_info->r600_opcode;
7197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[1] = r600_src[0];
7207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
7217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[0] = r600_src[1];
7227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[0].chan = tgsi_chan(&inst->Src[1], i);
723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
726de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
727de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
728de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
729de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
730de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
731de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
732de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
733de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
734de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
73572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
736de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
7370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
7380bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
7390bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
7400bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct r600_bc_alu alu;
7410bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
7420bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
7437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.x, <- 1.0  */
7447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
7457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
7467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].sel  = 249; /*1.0*/
7477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
7487e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
7497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
7507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
7517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
7527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
7537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
7547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
7550bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
7567e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.y = max(src.x, 0.0) */
7577e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
7587e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX;
7597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
7607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
7617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
7627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[1].sel  = 248; /*0.0*/
7637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[1].chan = tgsi_chan(&inst->Src[0], 0);
7647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
7657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
7667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
7677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
7687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
7697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
7707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
7710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
7727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.z = NOP - fill Z slot */
7737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
7747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP;
7757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.chan = 2;
7767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
7777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
7787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
7790bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
7807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.w, <- 1.0  */
7817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
7827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
7837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].sel  = 249;
7847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
7857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
7867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
7877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
7887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
7897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.last = 1;
7907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
7917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
7927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
7930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
7940bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
7950bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
7966a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
7976a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
7986a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
7990bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = log(src.y) */
8000bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
8010bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED;
8027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
8030bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
8040bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
8057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
8060bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
8070bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
8080bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
8090bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
8100bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
8110bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
8120bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
8130bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
8146a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
8156a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
8160bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
8170bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */
8180bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
8190bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT;
8207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
8210bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
8227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
8237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], 3);
8240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].sel  = sel;
8250bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].chan = chan;
8267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[0], &alu.src[2]);
8270bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
8280bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
8297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[2].chan = tgsi_chan(&inst->Src[0], 0);
8300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
8310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
8320bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
8330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
8340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
8350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
8360bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
8370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
8380bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
8390bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = exp(tmp.x) */
8400bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
8410bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE;
8420bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].sel = ctx->temp_reg;
8430bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].chan = 0;
8440bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
8450bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
8460bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
8470bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
8480bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
8490bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
8500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
8510bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
8520bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
8530bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
8540bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
8555cc2974dff346f3fa53881dbcc158e4563915487Jerome Glissestatic int tgsi_trans(struct r600_shader_ctx *ctx)
8565cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse{
8575cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
8585cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	struct r600_bc_alu alu;
8595cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	int i, j, r;
8605cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse
8615cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	for (i = 0; i < 4; i++) {
8625cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
8635cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		if (inst->Dst[0].Register.WriteMask & (1 << i)) {
8645cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			alu.inst = ctx->inst_info->r600_opcode;
8655cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
8667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				r = tgsi_src(ctx, &inst->Src[j], &alu.src[j]);
8675cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				if (r)
8685cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse					return r;
8697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
8705cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			}
8715cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
8725cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			if (r)
8735cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				return r;
8745cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			alu.last = 1;
8755cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			r = r600_bc_add_alu(ctx->bc, &alu);
8765cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			if (r)
8775cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				return r;
8785cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		}
8795cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	}
8805cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	return 0;
8815cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse}
8825cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse
8837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
8847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
8857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
8867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
8877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	int i, j, r;
8887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
8897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
8907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
8917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
8927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[j], &alu.src[j]);
8937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
8947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
8957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[j].chan = tgsi_chan(&inst->Src[j], 0);
8967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
8977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.sel = ctx->temp_reg;
8987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = 1;
8997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.last = 1;
9007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
9017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
9027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
9037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* replicate result */
9047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
9057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
9067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
9077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
9087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
9097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
9107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
9117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
9127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
9137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
9147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
9157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
9167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
9177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
9187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
9197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
9207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
9217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
922cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
923cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
924cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
925cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
926cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
9279961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
9289961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse	if (r)
9299961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse		return r;
930cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
931cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
932cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
933cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP;
9346c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
935cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
936cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
937cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
938cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (r)
939cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				return r;
940cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
941cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
942cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
943cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
944cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
945cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
946cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
947cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
948cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
949cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
950cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
951cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
952cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
953de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
954de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
955de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
9567e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
957de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
958de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
959de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
9607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
9617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
9627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
963de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* do it in 2 step as op3 doesn't support writemask */
964de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
965de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
966de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
967de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
9687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j] = r600_src[j];
9697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
970de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
971de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.sel = ctx->temp_reg;
972de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
973cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
974de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
975de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
976de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
977de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
978de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
979de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
980de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
981de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
982cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return tgsi_helper_copy(ctx, inst);
983cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
984cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
985cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
986cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
987cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
9887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
989cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
990cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
991cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
9927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
9937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
9947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
995de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
996de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
997cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
998cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
9997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j] = r600_src[j];
10007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
1001cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1002cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1003cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
1004cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
1005cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
1006cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1007cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
1008cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
1009cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].sel = alu.src[1].sel = 248;
1010cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1011cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1012cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1013cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
1014cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
1015cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].sel = alu.src[1].sel = 248;
1016cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1017cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1018cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1019cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
1020cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1021de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1022de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
1023de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1024de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1025de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1026de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1027de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1028de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1029cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return tgsi_helper_copy(ctx, inst);
1030de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1031de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
103233241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
103333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
103433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
103533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct r600_bc_tex tex;
1036641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	struct r600_bc_alu alu;
1037641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
1038b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	int r, i;
1039641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1040641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index;
1041641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1042b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
1043b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
1044b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1045b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE;
1046b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].sel = src_gpr;
1047b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 3);
1048b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1049b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1050b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1051b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
1052b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1053b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1054b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
1055b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie
1056b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
1057b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1058b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL;
1059b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
1060b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].chan = 3;
1061b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[1].sel = src_gpr;
1062b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
1063b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1064b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1065b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1066b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1067b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1068b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1069b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
1070b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1071b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
1072b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].sel = 249;
1073b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
1074b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1075b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1076b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1077b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
1078b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1079b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1080b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
1081b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1082b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	} else if (inst->Src[0].Register.File != TGSI_FILE_TEMPORARY) {
1083b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
1084b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1085b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
1086b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = src_gpr;
1087b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].chan = i;
1088b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1089b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1090b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
1091b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
1092b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1093b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1094b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1095b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1096b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
1097b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1098b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
109933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
110033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	memset(&tex, 0, sizeof(struct r600_bc_tex));
110133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.inst = ctx->inst_info->r600_opcode;
110233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.resource_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index;
110333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.sampler_id = tex.resource_id;
1104641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
11056c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
110633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_x = 0;
110733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_y = 1;
110833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_z = 2;
110933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_w = 3;
111033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_x = 0;
111133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_y = 1;
111233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_z = 2;
111333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_w = 3;
11149a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
111501984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
111601984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
111701984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
11187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		tex.coord_type_z = 1;
111901984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_w = 1;
112001984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
112133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	return r600_bc_add_tex(ctx->bc, &tex);
112233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
112333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
1124b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
1125b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
1126b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
11277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1128b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct r600_bc_alu alu;
1129b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
1130b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
1131b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
11327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
11337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
11347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
1135b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
1136b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
1137b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1138b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD;
1139b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = 249;
1140b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
11417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[0];
11427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
1143b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[1].neg = 1;
1144b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1145b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1146b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
1147b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1148b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1149b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
1150b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1151b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1152b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1153b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1154b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
1155b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	if (r)
1156b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		return r;
1157b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
1158b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
1159b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
1160b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1161b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL;
1162b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1163b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
11647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[2];
11657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[2], i);
1166b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1167b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1168b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
1169b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1170b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1171b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
1172b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1173b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1174b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1175b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1176b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
1177b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	if (r)
1178b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		return r;
1179b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
1180b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
1181b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
1182b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1183b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD;
1184b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
11857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0] = r600_src[0];
11867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
11877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[1];
11887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[1], i);
1189b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
1190b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
1191b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1192b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1193b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
1194b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1195b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1196b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1197b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1198b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1199b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1200b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	return tgsi_helper_copy(ctx, inst);
1201b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
1202b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
1203de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
1204de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1205de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
12060bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
12077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
12087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans_srcx_replicate},
1209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
1212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
1213cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
1214cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
1215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1216dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
1217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
1218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_slt},
1219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
1221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
1222b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
1223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1227de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1228de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1230de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1232de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
12347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
12354558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
1236de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1237de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1238de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
12407a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
1241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1242de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1243de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1244de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DDX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1245de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DDY,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1246de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},  /* predicated kill */
1247de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1248de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1249de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1250de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1251de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1252de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1253de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1254de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1255de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1256de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1257de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1259b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
1260de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1261b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
1262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1265de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1266de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1268de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1271de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1272de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, /* SGN */
1273de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1274de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1275de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1276de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1278cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
1279de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1280de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRK,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1281de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1282de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1283de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1284de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1285de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1286de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1287de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1288de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1289de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1290de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1291de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1292de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1293de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1294de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
12954558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate},
1296de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1297de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1298de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1299de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1300de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1301de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1302de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1303de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1304de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CONT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1308de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1309de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1318de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1319de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1326de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1328094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
1329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
1330de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1333de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1334de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1340de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1341de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1342de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1343de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1345de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1346de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1347de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1348de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1349de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1350de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1351de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1352de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1353de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1354de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1355de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1356de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1357de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1359de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
1360