r600_shader.c revision 1bb0427a856ffa3fea1b177ea5b0395a00de3833
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	}
497457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* set export done on last export of each type */
498457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
499457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (i == (noutput - 1)) {
500457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].end_of_program = 1;
501457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
502b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse		if (!(output_done & (1 << output[i].type))) {
503b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse			output_done |= (1 << output[i].type);
504c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse			output[i].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE;
505c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		}
506c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
507457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add output to bytecode */
508457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0; i < noutput; i++) {
509c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		r = r600_bc_add_output(ctx.bc, &output[i]);
510de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
511de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
512de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
513de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
515de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
516de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
517de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
519de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode);
523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
525de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
530de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx,
532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_src_register *tgsi_src,
533de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_src *r600_src)
534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
5357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(r600_src, 0, sizeof(struct r600_bc_alu_src));
536de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel = tgsi_src->Register.Index;
537de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r600_src->sel = 0;
539de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
5401bb0427a856ffa3fea1b177ea5b0395a00de3833Jerome Glisse	r600_src->neg = tgsi_src->Register.Negate;
541de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
542de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
543de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx,
546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_dst_register *tgsi_dst,
547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			unsigned swizzle,
548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_dst *r600_dst)
549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
5507a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
5517a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
554de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
555de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
5567a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
5577a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
5587a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
560de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
5627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic unsigned tgsi_chan(const struct tgsi_full_src_register *tgsi_src, unsigned swizzle)
5637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
5647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	switch (swizzle) {
5657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 0:
5667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleX;
5677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 1:
5687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleY;
5697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 2:
5707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleZ;
5717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 3:
5727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleW;
5737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	default:
5747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return 0;
5757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
5767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
5777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
5787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic int tgsi_split_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3])
5797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
5807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
5817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
5827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	int i, j, k, nconst, r;
5837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
5847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
5857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
5867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			nconst++;
5877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
5887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[i], &r600_src[i]);
5897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r) {
5907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
5917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
5927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
5937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
5947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (inst->Src[j].Register.File == TGSI_FILE_CONSTANT && j > 0) {
5957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			for (k = 0; k < 4; k++) {
5967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				memset(&alu, 0, sizeof(struct r600_bc_alu));
5977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
5987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[0].sel = r600_src[0].sel;
5997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[0].chan = k;
6007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.sel = ctx->temp_reg + j;
6017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.chan = k;
6027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.write = 1;
6037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				if (k == 3)
6047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse					alu.last = 1;
6057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				r = r600_bc_add_alu(ctx->bc, &alu);
6067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				if (r)
6077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse					return r;
6087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			}
6097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			r600_src[0].sel = ctx->temp_reg + j;
6107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			j--;
6117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
6127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
6137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
6147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
6157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
616de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op2(struct r600_shader_ctx *ctx)
617de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
6197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
620de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
621de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
622de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
6237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
6247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
6257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
626de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
627de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
628de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
629de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP;
6306c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
631de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		} else {
632de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.inst = ctx->inst_info->r600_opcode;
633de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
6347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j] = r600_src[j];
6357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
636de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
637de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
638de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
639de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
640de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
641de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
642de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
643de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.src[1].neg = 1;
645de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
6467a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
6477a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			alu.src[0].abs = 1;
6487a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
649de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
650de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
651de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
654de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
655de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
656de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
657de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
658de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
659de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
660de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
661de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
662094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
663094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
664094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
665094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct r600_bc_alu alu;
666094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
667094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
668094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
669094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
670094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
671094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
672094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.src[0].sel = 248;
6737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]);
674094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
675094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
6767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
677094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
678094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
679094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
680094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
681094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
682094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
683094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
684094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
685094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
686094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
687de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_slt(struct r600_shader_ctx *ctx)
688de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
689de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
6907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
691de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
692de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, r;
693de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
6947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
6957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
6967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
697de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
698de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
699de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
700de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP;
7016c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
702de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		} else {
703de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.inst = ctx->inst_info->r600_opcode;
7047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[1] = r600_src[0];
7057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
7067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[0] = r600_src[1];
7077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[0].chan = tgsi_chan(&inst->Src[1], i);
708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
709de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
713de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
715de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
716de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
717de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
718de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
719de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
72072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
721de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
7220bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
7230bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
7240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
7250bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct r600_bc_alu alu;
7260bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
7270bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
7287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.x, <- 1.0  */
7297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
7307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
7317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].sel  = 249; /*1.0*/
7327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
7337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
7347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
7357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
7367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
7377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
7387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
7397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
7400bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
7417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.y = max(src.x, 0.0) */
7427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
7437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX;
7447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
7457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
7467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
7477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[1].sel  = 248; /*0.0*/
7487e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[1].chan = tgsi_chan(&inst->Src[0], 0);
7497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
7507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
7517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
7527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
7537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
7547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
7557e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
7560bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
7577e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.z = NOP - fill Z slot */
7587e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
7597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP;
7607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.chan = 2;
7617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
7627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
7637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
7640bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
7657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.w, <- 1.0  */
7667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
7677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
7687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].sel  = 249;
7697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
7707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
7717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
7727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
7737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
7747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.last = 1;
7757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
7767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
7777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
7780bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
7790bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
7800bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
7816a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
7826a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
7836a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
7840bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = log(src.y) */
7850bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
7860bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED;
7877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
7880bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
7890bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
7907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
7910bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
7920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
7930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
7940bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
7950bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
7960bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
7970bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
7980bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
7996a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
8006a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
8010bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
8020bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */
8030bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
8040bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT;
8057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
8060bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
8077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
8087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], 3);
8090bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].sel  = sel;
8100bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].chan = chan;
8117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[0], &alu.src[2]);
8120bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
8130bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
8147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[2].chan = tgsi_chan(&inst->Src[0], 0);
8150bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
8160bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
8170bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
8180bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
8190bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
8200bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
8210bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
8220bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
8230bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
8240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = exp(tmp.x) */
8250bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
8260bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE;
8270bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].sel = ctx->temp_reg;
8280bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].chan = 0;
8290bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
8300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
8310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
8320bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
8330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
8340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
8350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
8360bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
8370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
8380bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
8390bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
8405cc2974dff346f3fa53881dbcc158e4563915487Jerome Glissestatic int tgsi_trans(struct r600_shader_ctx *ctx)
8415cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse{
8425cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
8435cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	struct r600_bc_alu alu;
8445cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	int i, j, r;
8455cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse
8465cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	for (i = 0; i < 4; i++) {
8475cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
8485cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		if (inst->Dst[0].Register.WriteMask & (1 << i)) {
8495cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			alu.inst = ctx->inst_info->r600_opcode;
8505cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
8517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				r = tgsi_src(ctx, &inst->Src[j], &alu.src[j]);
8525cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				if (r)
8535cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse					return r;
8547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
8555cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			}
8565cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
8575cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			if (r)
8585cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				return r;
8595cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			alu.last = 1;
8605cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			r = r600_bc_add_alu(ctx->bc, &alu);
8615cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			if (r)
8625cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				return r;
8635cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		}
8645cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	}
8655cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	return 0;
8665cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse}
8675cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse
8687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
8697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
8707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
8717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
8727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	int i, j, r;
8737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
8747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
8757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
8767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
8777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[j], &alu.src[j]);
8787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
8797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
8807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[j].chan = tgsi_chan(&inst->Src[j], 0);
8817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
8827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.sel = ctx->temp_reg;
8837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = 1;
8847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.last = 1;
8857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
8867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
8877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
8887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* replicate result */
8897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
8907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
8917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
8927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
8937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
8947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
8957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
8967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
8977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
8987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
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	}
9047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
9057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
9067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
907cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
908cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
909cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
910cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
911cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
9129961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
9139961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse	if (r)
9149961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse		return r;
915cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
916cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
917cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
918cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP;
9196c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
920cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
921cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
922cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
923cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (r)
924cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				return r;
925cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
926cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
927cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
928cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
929cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
930cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
931cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
932cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
933cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
934cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
935cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
936cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
937cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
938de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
939de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
940de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
9417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
942de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
943de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
944de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
9457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
9467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
9477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
948de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* do it in 2 step as op3 doesn't support writemask */
949de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
950de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
951de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
952de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
9537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j] = r600_src[j];
9547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
955de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
956de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.sel = ctx->temp_reg;
957de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
958cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
959de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
960de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
961de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
962de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
963de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
964de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
965de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
966de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
967cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return tgsi_helper_copy(ctx, inst);
968cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
969cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
970cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
971cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
972cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
9737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
974cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
975cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
976cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
9777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
9787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
9797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
980de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
981de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
982cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
983cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
9847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j] = r600_src[j];
9857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
986cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
987cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.sel = ctx->temp_reg;
988cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
989cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
990cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
991cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
992cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
993cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
994cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].sel = alu.src[1].sel = 248;
995cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
996cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
997cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
998cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
999cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
1000cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].sel = alu.src[1].sel = 248;
1001cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1002cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1003cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1004cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
1005cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1006de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1007de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
1008de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1009de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1010de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1011de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1012de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1013de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1014cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return tgsi_helper_copy(ctx, inst);
1015de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1016de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
101733241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
101833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
101933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
102033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct r600_bc_tex tex;
1021641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	struct r600_bc_alu alu;
1022641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
1023641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	int r;
1024641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1025641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index;
1026641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1027641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	/* Add perspective divide */
10289a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
10299a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE;
10309a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.src[0].sel = src_gpr;
10319a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.src[0].chan = tgsi_chan(&inst->Src[0], 3);
10329a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.dst.sel = ctx->temp_reg;
10339a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.dst.chan = 3;
10349a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.last = 1;
10359a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.dst.write = 1;
10369a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
10379a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	if (r)
10389a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse		return r;
1039641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
10409a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
10419a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL;
10429a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
10439a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.src[0].chan = 3;
10449a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.src[1].sel = src_gpr;
10459a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.src[1].chan = tgsi_chan(&inst->Src[0], 0);
10469a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.dst.sel = ctx->temp_reg;
10479a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.dst.chan = 0;
10489a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.dst.write = 1;
10499a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
10509a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	if (r)
10519a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse		return r;
10529a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
10539a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL;
10549a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
10559a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.src[0].chan = 3;
10569a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.src[1].sel = src_gpr;
10579a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.src[1].chan = tgsi_chan(&inst->Src[0], 1);
10589a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.dst.sel = ctx->temp_reg;
10599a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.dst.chan = 1;
10609a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.dst.write = 1;
10619a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
10629a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	if (r)
10639a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse		return r;
10649a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
10659a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL;
10669a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
10679a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.src[0].chan = 3;
10689a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.src[1].sel = src_gpr;
10699a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.src[1].chan = tgsi_chan(&inst->Src[0], 2);
10709a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.dst.sel = ctx->temp_reg;
10719a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.dst.chan = 2;
10729a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.dst.write = 1;
10739a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
10749a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	if (r)
10759a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse		return r;
10769a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
10779a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
10789a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.src[0].sel = 249;
10799a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.src[0].chan = 0;
10809a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.dst.sel = ctx->temp_reg;
10819a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.dst.chan = 3;
10829a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.last = 1;
10839a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	alu.dst.write = 1;
10849a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
10859a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	if (r)
10869a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse		return r;
10879a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse	src_gpr = ctx->temp_reg;
108833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
1089641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	/* TODO use temp if src_gpr is not a temporary reg (File != TEMPORARY) */
109033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	memset(&tex, 0, sizeof(struct r600_bc_tex));
109133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.inst = ctx->inst_info->r600_opcode;
109233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.resource_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index;
109333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.sampler_id = tex.resource_id;
1094641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
10956c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
109633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_x = 0;
109733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_y = 1;
109833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_z = 2;
109933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_w = 3;
110033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_x = 0;
110133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_y = 1;
110233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_z = 2;
110333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_w = 3;
11049a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
110501984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
110601984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
110701984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
11087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		tex.coord_type_z = 1;
110901984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_w = 1;
111001984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
111133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	return r600_bc_add_tex(ctx->bc, &tex);
111233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
111333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
1114b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
1115b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
1116b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
11177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1118b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct r600_bc_alu alu;
1119b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
1120b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
1121b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
11227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
11237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
11247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
1125b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
1126b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
1127b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1128b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD;
1129b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = 249;
1130b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
11317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[0];
11327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
1133b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[1].neg = 1;
1134b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1135b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1136b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
1137b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1138b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1139b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
1140b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1141b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1142b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1143b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1144b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
1145b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	if (r)
1146b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		return r;
1147b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
1148b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
1149b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
1150b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1151b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL;
1152b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1153b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
11547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[2];
11557e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[2], i);
1156b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1157b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1158b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
1159b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1160b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1161b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
1162b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1163b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1164b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1165b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1166b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
1167b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	if (r)
1168b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		return r;
1169b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
1170b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
1171b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
1172b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1173b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD;
1174b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
11757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0] = r600_src[0];
11767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
11777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[1];
11787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[1], i);
1179b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
1180b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
1181b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1182b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1183b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
1184b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1185b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1186b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1187b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1188b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1189b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1190b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	return tgsi_helper_copy(ctx, inst);
1191b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
1192b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
1193de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
1194de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1195de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
11960bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
11977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
11987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans_srcx_replicate},
1199de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1200de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1201de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
1202de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
1203cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
1204cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
1205de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1206dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
1207de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
1208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_slt},
1209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
1211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
1212b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
1213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1222de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
12247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
1225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1227de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1228de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
12307a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
1231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1232de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DDX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DDY,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1236de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},  /* predicated kill */
1237de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1238de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1242de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1243de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1244de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1245de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1246de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1247de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1248de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1249641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	{TGSI_OPCODE_TEX,	0, 0x10, tgsi_tex},
1250de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
125133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	{TGSI_OPCODE_TXP,	0, 0x10, tgsi_tex},
1252de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1253de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1254de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1255de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1256de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1257de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1259de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1260de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1261de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported}, /* SGN */
1263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1265de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1266de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1268cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
1269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRK,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1271de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1272de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1273de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1274de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1275de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1276de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1278de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1279de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1280de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1281de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1282de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1283de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1284de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1285de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1286de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1287de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1288de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1289de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1290de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1291de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1292de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1293de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1294de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1295de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1296de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CONT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1297de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1298de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1299de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1300de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1301de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1302de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1303de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1304de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1308de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1309de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1318094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
1319de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
1320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1326de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1328de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1330de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1333de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1334de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1340de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1341de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1342de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1343de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1345de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1346de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1347de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1348de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1349de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
1350