r600_shader.c revision 0e6a02d29915db2ca460206656ab517ddaf0b455
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
10836efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse//fprintf(stderr, "--------------------------------------------------------------\n");
10936efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse//tgsi_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	}
12336efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse//fprintf(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;
153ed99c28d12579bb8ee79eb9cfa55452785be7b6eJerome Glisse	rpshader->rstate->placement[2] = RADEON_GEM_DOMAIN_GTT;
15472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	return radeon_state_pm4(state);
15572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
15672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
1576f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader_ps(struct pipe_context *ctx, struct r600_context_state *rpshader)
15872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
159457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	const struct pipe_rasterizer_state *rasterizer;
160ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_screen *rscreen = r600_screen(ctx->screen);
16172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct r600_shader *rshader = &rpshader->shader;
162457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	struct r600_context *rctx = r600_context(ctx);
16372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct radeon_state *state;
1645f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie	unsigned i, tmp, exports_ps, num_cout;
16572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
166457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	rasterizer = &rctx->rasterizer->state.rasterizer;
1676e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate = radeon_state_decref(rpshader->rstate);
1686e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	state = radeon_state(rscreen->rw, R600_PS_SHADER_TYPE, R600_PS_SHADER);
1696e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	if (state == NULL)
1706e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse		return -ENOMEM;
17172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	for (i = 0; i < rshader->ninput; i++) {
1726c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse		tmp = S_028644_SEMANTIC(i);
17372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		tmp |= S_028644_SEL_CENTROID(1);
17435e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		if (rshader->input[i].name == TGSI_SEMANTIC_COLOR ||
17535e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse			rshader->input[i].name == TGSI_SEMANTIC_BCOLOR) {
17635e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse			tmp |= S_028644_FLAT_SHADE(rshader->flat_shade);
17735e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		}
178457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (rasterizer->sprite_coord_enable & (1 << i)) {
179457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			tmp |= S_028644_PT_SPRITE_TEX(1);
180457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
18172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		state->states[R600_PS_SHADER__SPI_PS_INPUT_CNTL_0 + i] = tmp;
18272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
1835f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie
1845f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie	exports_ps = 0;
1855f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie	num_cout = 0;
1865f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie	for (i = 0; i < rshader->noutput; i++) {
1875f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie		if (rshader->output[i].name == TGSI_SEMANTIC_POSITION)
1885f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			exports_ps |= 1;
1895f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie		else if (rshader->output[i].name == TGSI_SEMANTIC_COLOR) {
1905f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			exports_ps |= (1 << (num_cout+1));
1915f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			num_cout++;
1925f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie		}
1935f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie	}
194bcf7f66a934ebd9c91da90d6e1f9b169c33c746cJerome Glisse	if (!exports_ps) {
195bcf7f66a934ebd9c91da90d6e1f9b169c33c746cJerome Glisse		/* always at least export 1 component per pixel */
196bcf7f66a934ebd9c91da90d6e1f9b169c33c746cJerome Glisse		exports_ps = 2;
197bcf7f66a934ebd9c91da90d6e1f9b169c33c746cJerome Glisse	}
19872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	state->states[R600_PS_SHADER__SPI_PS_IN_CONTROL_0] = S_0286CC_NUM_INTERP(rshader->ninput) |
19972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse							S_0286CC_PERSP_GRADIENT_ENA(1);
20072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	state->states[R600_PS_SHADER__SPI_PS_IN_CONTROL_1] = 0x00000000;
201de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	state->states[R600_PS_SHADER__SQ_PGM_RESOURCES_PS] = S_028868_NUM_GPRS(rshader->bc.ngpr);
2025f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie	state->states[R600_PS_SHADER__SQ_PGM_EXPORTS_PS] = exports_ps;
2036e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate = state;
2046e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate->bo[0] = radeon_bo_incref(rscreen->rw, rpshader->bo);
2056e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate->nbo = 1;
2066e6103004c9c737297b842a4aff298da920e7c33Jerome Glisse	rpshader->rstate->placement[0] = RADEON_GEM_DOMAIN_GTT;
20772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	return radeon_state_pm4(state);
20872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
20972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
2106f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_context_state *rpshader)
21172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
212ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_screen *rscreen = r600_screen(ctx->screen);
213ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_context *rctx = r600_context(ctx);
21472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct r600_shader *rshader = &rpshader->shader;
21572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	int r;
21672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
21772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	/* copy new shader */
21872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	radeon_bo_decref(rscreen->rw, rpshader->bo);
21972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->bo = NULL;
220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	rpshader->bo = radeon_bo(rscreen->rw, 0, rshader->bc.ndw * 4,
22172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse				4096, NULL);
22272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (rpshader->bo == NULL) {
22372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		return -ENOMEM;
22472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
22572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	radeon_bo_map(rscreen->rw, rpshader->bo);
226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	memcpy(rpshader->bo->data, rshader->bc.bytecode, rshader->bc.ndw * 4);
22772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	radeon_bo_unmap(rscreen->rw, rpshader->bo);
22872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	/* build state */
22972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rshader->flat_shade = rctx->flat_shade;
230de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (rshader->processor_type) {
231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_PROCESSOR_VERTEX:
23272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		r = r600_pipe_shader_vs(ctx, rpshader);
23372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_PROCESSOR_FRAGMENT:
23572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		r = r600_pipe_shader_ps(ctx, rpshader);
23672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
23772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	default:
23872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		r = -EINVAL;
23972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
24072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
24172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	return r;
24272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
24372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
2446f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisseint r600_pipe_shader_update(struct pipe_context *ctx, struct r600_context_state *rpshader)
24572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
246de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_context *rctx = r600_context(ctx);
24772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	int r;
24872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
24972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (rpshader == NULL)
250de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
251de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* there should be enough input */
252de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (rctx->vertex_elements->count < rpshader->shader.bc.nresource) {
253de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("%d resources provided, expecting %d\n",
254de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			rctx->vertex_elements->count, rpshader->shader.bc.nresource);
255de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
25672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
257de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_shader_update(ctx, &rpshader->shader);
258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r)
259de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return r;
260de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r600_pipe_shader(ctx, rpshader);
261de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
265de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
266de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
268de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
27172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
272de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
273de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
274de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
275c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
276de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
278de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
27972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
280de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
281de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i->Src[j].Register.Indirect ||
282de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			i->Src[j].Register.Dimension ||
283de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			i->Src[j].Register.Absolute) {
284de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported src (indirect|dimension|absolute)\n");
285de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
286de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
287de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
288de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
289de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i->Dst[j].Register.Indirect || i->Dst[j].Register.Dimension) {
290de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported dst (indirect|dimension)\n");
291de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
292de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
293de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
294de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
29572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
29672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
297de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
29872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
299de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
300de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_vtx vtx;
301de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
302de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int r;
30372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
304de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
308de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
30935e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->input[i].interpolate = d->Declaration.Interpolate;
310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i;
311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (ctx->type == TGSI_PROCESSOR_VERTEX) {
312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			/* turn input into fetch */
313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			memset(&vtx, 0, sizeof(struct r600_bc_vtx));
314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.inst = 0;
315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.fetch_type = 0;
316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.buffer_id = i;
317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			/* register containing the index into the buffer */
318de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.src_gpr = 0;
319de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.src_sel_x = 0;
320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.mega_fetch_count = 0x1F;
321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_gpr = ctx->shader->input[i].gpr;
322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_x = 0;
323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_y = 1;
324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_z = 2;
325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_w = 3;
326de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = r600_bc_add_vtx(ctx->bc, &vtx);
327de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
328de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
330de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
333de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
334de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i;
33635e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->output[i].interpolate = d->Declaration.Interpolate;
337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
34033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
341de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
342de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
343de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
345de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
346de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
34772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
34872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
349de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader)
35072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
351de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
352de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
353c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	struct r600_bc_output output[32];
354457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	unsigned output_done, noutput;
355de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
356de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, r = 0, pos0;
35772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
359de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
360de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_bc_init(ctx.bc, shader->family);
361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r)
362de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return r;
363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
364de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
366de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
367de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
368de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
369de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
370076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	/* Values [0,127] correspond to GPR[0..127].
371076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [128,159] correspond to constant buffer bank 0
372076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [160,191] correspond to constant buffer bank 1
373076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [256,511] correspond to cfile constants c[0..255].
374de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
375076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 244  ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+)
376076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 245  ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+)
377076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 246  ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+)
378076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 247  ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+)
379de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
380de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
381de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
382de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
383de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
384de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
385de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
386de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
388de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
389de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
390de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
391de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
392de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
393de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
394de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] +
395de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_INPUT];
396de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
397de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_OUTPUT];
398de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_CONSTANT] = 256;
399de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_IMMEDIATE] = 253;
400de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
401de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			ctx.info.file_count[TGSI_FILE_TEMPORARY];
402de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
403de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
404de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
406de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
407de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
4082b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			ctx.value[0] = immediate->u[0].Uint;
4092b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			ctx.value[1] = immediate->u[1].Uint;
4102b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			ctx.value[2] = immediate->u[2].Uint;
4112b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			ctx.value[3] = immediate->u[3].Uint;
412de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
413de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
414de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
415de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
416de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
417de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
418de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
419de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
420de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
421de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
422de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
423de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
424de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
425de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
426de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
4272b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			r = r600_bc_add_literal(ctx.bc, ctx.value);
428de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
429de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
430de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
431de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
432de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
433de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
434de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
435de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
436de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* export output */
438457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	noutput = shader->noutput;
439457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0, pos0 = 0; i < noutput; i++) {
440c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		memset(&output[i], 0, sizeof(struct r600_bc_output));
441c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].gpr = shader->output[i].gpr;
442c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].elem_size = 3;
443c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_x = 0;
444c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_y = 1;
445c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_z = 2;
446c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_w = 3;
447c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].barrier = 1;
448c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
449c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].array_base = i - pos0;
450c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT;
451457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		switch (ctx.type) {
452de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
453de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
454c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 60;
455c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
456de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				/* position doesn't count in array_base */
457457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
458457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
459457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) {
460457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].array_base = 61;
461457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
462457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				/* position doesn't count in array_base */
463457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
464de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
465de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
466de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
467de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
468b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse				output[i].array_base = shader->output[i].sid;
469c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
4705f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
471c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 61;
472c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
473de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
474de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
475de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
476de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
477de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
478de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
479de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
480de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
481de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
482de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
48372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
484457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	}
485457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add fake param output for vertex shader if no param is exported */
486457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
487457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		for (i = 0, pos0 = 0; i < noutput; i++) {
488457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) {
489457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0 = 1;
490457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				break;
491457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
492457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
493457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (!pos0) {
494457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			memset(&output[i], 0, sizeof(struct r600_bc_output));
495457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].gpr = 0;
496457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].elem_size = 3;
497457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_x = 0;
498457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_y = 1;
499457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_z = 2;
500457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_w = 3;
501457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].barrier = 1;
502457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
503457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].array_base = 0;
504457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT;
505457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			noutput++;
506de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
507c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
508481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	/* add fake pixel export */
509481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) {
510481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		memset(&output[0], 0, sizeof(struct r600_bc_output));
511481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].gpr = 0;
512481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].elem_size = 3;
513481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_x = 7;
514481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_y = 7;
515481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_z = 7;
516481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_w = 7;
517481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].barrier = 1;
518608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse		output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
519481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].array_base = 0;
520481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT;
521481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		noutput++;
522481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	}
523457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* set export done on last export of each type */
524457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
525457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (i == (noutput - 1)) {
526457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].end_of_program = 1;
527457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
528b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse		if (!(output_done & (1 << output[i].type))) {
529b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse			output_done |= (1 << output[i].type);
530c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse			output[i].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE;
531c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		}
532c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
533457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add output to bytecode */
534457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0; i < noutput; i++) {
535c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		r = r600_bc_add_output(ctx.bc, &output[i]);
536de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
537de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
539de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
541de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
542de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
543de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode);
549de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
550de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
554de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
555de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
556de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
557de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx,
558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_src_register *tgsi_src,
559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_src *r600_src)
560de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
5617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(r600_src, 0, sizeof(struct r600_bc_alu_src));
562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel = tgsi_src->Register.Index;
563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r600_src->sel = 0;
565de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
5661bb0427a856ffa3fea1b177ea5b0395a00de3833Jerome Glisse	r600_src->neg = tgsi_src->Register.Negate;
567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
568de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
571de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx,
572de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_dst_register *tgsi_dst,
573de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			unsigned swizzle,
574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_dst *r600_dst)
575de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
5767a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
5777a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
578de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
579de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
580de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
581de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
5827a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
5837a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
5847a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
585de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
586de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
587de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
5887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic unsigned tgsi_chan(const struct tgsi_full_src_register *tgsi_src, unsigned swizzle)
5897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
5907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	switch (swizzle) {
5917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 0:
5927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleX;
5937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 1:
5947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleY;
5957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 2:
5967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleZ;
5977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 3:
5987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleW;
5997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	default:
6007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return 0;
6017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
6027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
6037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
6047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic int tgsi_split_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3])
6057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
6067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
6077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
6087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	int i, j, k, nconst, r;
6097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
6107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
6117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
6127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			nconst++;
6137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
6147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[i], &r600_src[i]);
6157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r) {
6167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
6177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
6187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
6197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
6207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (inst->Src[j].Register.File == TGSI_FILE_CONSTANT && j > 0) {
6217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			for (k = 0; k < 4; k++) {
6227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				memset(&alu, 0, sizeof(struct r600_bc_alu));
6237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
6247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[0].sel = r600_src[0].sel;
6257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[0].chan = k;
6267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.sel = ctx->temp_reg + j;
6277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.chan = k;
6287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.write = 1;
6297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				if (k == 3)
6307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse					alu.last = 1;
6317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				r = r600_bc_add_alu(ctx->bc, &alu);
6327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				if (r)
6337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse					return r;
6347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			}
6357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			r600_src[0].sel = ctx->temp_reg + j;
6367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			j--;
6377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
6387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
6397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
6407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
6417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
642de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op2(struct r600_shader_ctx *ctx)
643de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
6457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
646de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
647de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
648de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
6497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
6507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
6517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
653de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
654de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
655de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP;
6566c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
657de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		} else {
658de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.inst = ctx->inst_info->r600_opcode;
659de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
6607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j] = r600_src[j];
6617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
662de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
663de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
664de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
665de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
667de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
668de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
669de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
670de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.src[1].neg = 1;
671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
6727a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
6737a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			alu.src[0].abs = 1;
6747a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
675de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
676de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
677de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
678de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
679de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
680de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
681de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
682de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
683de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
684de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
685de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
686de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
687de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
68888f5976484842671ecb2cefcfa91838a43032359Dave Airlie/*
68988f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range
69088f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI
69188f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901
69288f5976484842671ecb2cefcfa91838a43032359Dave Airlie */
69388f5976484842671ecb2cefcfa91838a43032359Dave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx)
69488f5976484842671ecb2cefcfa91838a43032359Dave Airlie{
69588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
69688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	struct r600_bc_alu_src r600_src[3];
69788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	struct r600_bc_alu alu;
69888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	int i, r;
69988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	uint32_t lit_vals[4];
70088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
70188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(lit_vals, 0, 4*4);
70288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
70388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
70488f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
70588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	lit_vals[0] = fui(1.0 /(3.1415926535 * 2));
70688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	lit_vals[1] = fui(0.5f);
70788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
70888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
70988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD;
71088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
71188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
71288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
71388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
71488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
71588f5976484842671ecb2cefcfa91838a43032359Dave Airlie
71688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0] = r600_src[0];
71788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
71888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
719921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
72088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
721921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
72288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[2].chan = 1;
72388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
72488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
72588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
72688f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
72788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_literal(ctx->bc, lit_vals);
72888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
72988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
73088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
73188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
73288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT;
73388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
73488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
73588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
73688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
73788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
73888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
73988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
74088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
74188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
74288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
74388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
74488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
74588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (ctx->bc->chiprev == 0) {
74688f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[0] = fui(3.1415926535897f * 2.0f);
74788f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[1] = fui(-3.1415926535897f);
74888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	} else {
74988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[0] = fui(1.0f);
75088f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[1] = fui(-0.5f);
75188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
75288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
75388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
75488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD;
75588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
75688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
75788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
75888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
75988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
76088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
76188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
76288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
76388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
764921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
76588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
766921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
76788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[2].chan = 1;
76888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
76988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
77088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
77188f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
77288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_literal(ctx->bc, lit_vals);
77388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
77488f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
77588f5976484842671ecb2cefcfa91838a43032359Dave Airlie
77688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
77788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = ctx->inst_info->r600_opcode;
77888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
77988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
78088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
78188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
78288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
78388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
78488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
78588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
78688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
78788f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
78888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
78988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	/* replicate result */
79088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	for (i = 0; i < 4; i++) {
79188f5976484842671ecb2cefcfa91838a43032359Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
79288f5976484842671ecb2cefcfa91838a43032359Dave Airlie		alu.src[0].sel = ctx->temp_reg;
79388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
79488f5976484842671ecb2cefcfa91838a43032359Dave Airlie		alu.dst.chan = i;
79588f5976484842671ecb2cefcfa91838a43032359Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
79688f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
79788f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
79888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
79988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (i == 3)
80088f5976484842671ecb2cefcfa91838a43032359Dave Airlie			alu.last = 1;
80188f5976484842671ecb2cefcfa91838a43032359Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
80288f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
80388f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
80488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
80588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	return 0;
80688f5976484842671ecb2cefcfa91838a43032359Dave Airlie}
80788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
808094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
809094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
810094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
811094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct r600_bc_alu alu;
812094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
813094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
814094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
815094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
816094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
817094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
818921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_0;
8197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]);
820094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
821094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
8227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
823094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
824094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
825094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
826094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
827094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
828094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
829094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
830094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
831094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
832094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
833de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_slt(struct r600_shader_ctx *ctx)
834de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
835de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
8367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
837de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
838de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, r;
839de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
8407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
8417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
8427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
843de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
844de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
845de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
846de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP;
8476c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
848de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		} else {
849de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.inst = ctx->inst_info->r600_opcode;
8507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[1] = r600_src[0];
8517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
8527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[0] = r600_src[1];
8537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[0].chan = tgsi_chan(&inst->Src[1], i);
854de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
855de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
856de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
857de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
858de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
859de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
860de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
861de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
862de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
863de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
864de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
865de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
86672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
867de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
8680bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
8690bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
8700bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
8710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct r600_bc_alu alu;
8720bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
8730bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
8747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.x, <- 1.0  */
8757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
8767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
877921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
8787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
8797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
8807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
8817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
8827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
8837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
8847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
8857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
8860bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
8877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.y = max(src.x, 0.0) */
8887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
8897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX;
8907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
8917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
8927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
893921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
8947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[1].chan = tgsi_chan(&inst->Src[0], 0);
8957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
8967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
8977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
8987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
8997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
9007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
9017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
9020bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
9037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.z = NOP - fill Z slot */
9047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
9057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP;
9067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.chan = 2;
9077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
9087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
9097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
9100bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
9117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.w, <- 1.0  */
9127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
9137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
914921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[0].sel  = V_SQ_ALU_SRC_1;
9157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
9167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
9177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
9187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
9197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
9207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.last = 1;
9217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
9227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
9237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
9240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
9250bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
9260bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
9276a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
9286a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
9296a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
9300bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = log(src.y) */
9310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
9320bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED;
9337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
9340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
9350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
9367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
9370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
9380bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
9390bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
9400bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
9410bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
9420bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
9430bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
9440bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
9456a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
9466a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
9470bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
9480bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */
9490bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
9500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT;
9517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
9520bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
9537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
9547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], 3);
9550bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].sel  = sel;
9560bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].chan = chan;
9577e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[0], &alu.src[2]);
9580bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
9590bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
9607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[2].chan = tgsi_chan(&inst->Src[0], 0);
9610bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
9620bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
9630bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
9640bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
9650bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
9660bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
9670bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
9680bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
9690bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
9700bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = exp(tmp.x) */
9710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
9720bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE;
9730bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].sel = ctx->temp_reg;
9740bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].chan = 0;
9750bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
9760bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
9770bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
9780bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
9790bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
9800bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
9810bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
9820bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
9830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
9840bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
9850bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
9865cc2974dff346f3fa53881dbcc158e4563915487Jerome Glissestatic int tgsi_trans(struct r600_shader_ctx *ctx)
9875cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse{
9885cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
9895cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	struct r600_bc_alu alu;
9905cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	int i, j, r;
9915cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse
9925cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	for (i = 0; i < 4; i++) {
9935cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
9945cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		if (inst->Dst[0].Register.WriteMask & (1 << i)) {
9955cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			alu.inst = ctx->inst_info->r600_opcode;
9965cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
9977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				r = tgsi_src(ctx, &inst->Src[j], &alu.src[j]);
9985cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				if (r)
9995cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse					return r;
10007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
10015cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			}
10025cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
10035cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			if (r)
10045cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				return r;
10055cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			alu.last = 1;
10065cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			r = r600_bc_add_alu(ctx->bc, &alu);
10075cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			if (r)
10085cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				return r;
10095cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		}
10105cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	}
10115cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	return 0;
10125cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse}
10135cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse
1014a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
10157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
10167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
10177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
1018a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
10197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
10207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
10217e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
10227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
10237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
10247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
10257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
10267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
10277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
10287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
10297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
10307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
10317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
10327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
10337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
10347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
10357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
10367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
10377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
1038a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
1039a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1040a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1041a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1042a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
1043a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1044a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1045a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
1046a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
1047a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]);
1048a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		if (r)
1049a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse			return r;
1050a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		alu.src[i].chan = tgsi_chan(&inst->Src[i], 0);
1051a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	}
1052a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1053a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1054a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1055a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1056a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1057a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1058a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* replicate result */
1059a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1060a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1061a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1062a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx)
1063a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1064a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1065a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1066a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int r;
1067a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1068a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* LOG2(a) */
1069a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1070a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE;
1071a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
1072a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1073a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1074a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
1075a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1076a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1077a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1078a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1079a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1080a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1081a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* b * LOG2(a) */
1082a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1083a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL_IEEE;
1084a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = tgsi_src(ctx, &inst->Src[1], &alu.src[0]);
1085a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1086a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1087a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].chan = tgsi_chan(&inst->Src[1], 0);
1088a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[1].sel = ctx->temp_reg;
1089a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1090a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1091a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1092a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1093a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1094a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1095a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* POW(a,b) = EXP2(b * LOG2(a))*/
1096a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1097a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE;
1098a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
1099a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1100a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1101a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1102a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1103a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1104a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1105a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1106a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1107a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
11080d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
11090d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
11100d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
11110d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct r600_bc_alu alu;
11120d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct r600_bc_alu_src r600_src[3];
1113921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
11140d48925a56ad4fb253386110b545abda82a25464Dave Airlie
11150d48925a56ad4fb253386110b545abda82a25464Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
11160d48925a56ad4fb253386110b545abda82a25464Dave Airlie	if (r)
11170d48925a56ad4fb253386110b545abda82a25464Dave Airlie		return r;
11180d48925a56ad4fb253386110b545abda82a25464Dave Airlie
11190d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
11200d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
11210d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
11220d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT;
11230d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
11240d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
11250d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.write = 1;
11260d48925a56ad4fb253386110b545abda82a25464Dave Airlie
11270d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0] = r600_src[0];
11280d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
11290d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1130921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
11310d48925a56ad4fb253386110b545abda82a25464Dave Airlie
11320d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2] = r600_src[0];
11330d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].chan = tgsi_chan(&inst->Src[0], i);
11340d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
11350d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
11360d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
11370d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
11380d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
11390d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
11400d48925a56ad4fb253386110b545abda82a25464Dave Airlie
11410d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
11420d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
11430d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
11440d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT;
11450d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
11460d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
11470d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
11480d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
11490d48925a56ad4fb253386110b545abda82a25464Dave Airlie
11500d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
11510d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
11520d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1153921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
11540d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
11550d48925a56ad4fb253386110b545abda82a25464Dave Airlie
11560d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
11570d48925a56ad4fb253386110b545abda82a25464Dave Airlie
11580d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.write = 1;
11590d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
11600d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
11610d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
11620d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
11630d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
11640d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
11650d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
11660d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
11670d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1168cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
1169cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1170cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1171cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
1172cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
11739961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
11749961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse	if (r)
11759961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse		return r;
1176cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
1177cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1178cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
1179cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP;
11806c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
1181cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
1182cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
1183cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1184cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (r)
1185cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				return r;
1186cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
1187cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
1188cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1189cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
1190cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
1191cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1192cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1193cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
1194cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
1195cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
1196cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
1197cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1198cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1199de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
1200de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1201de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
12027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1203de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
1204de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
1205de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
12067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
12077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
12087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
1209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* do it in 2 step as op3 doesn't support writemask */
1210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
1211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
12147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j] = r600_src[j];
12157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
1216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
1219cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
1220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
1221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
1222de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1227de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1228cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return tgsi_helper_copy(ctx, inst);
1229cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1230cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1231cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
1232cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1233cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
12347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1235cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1236cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
1237cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
12387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
12397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
12407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
1241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
1242de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1243cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1244cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
12457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j] = r600_src[j];
12467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
1247cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1248cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1249cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
1250cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
1251cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
1252cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1253cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
1254cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
1255921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1256cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1257cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1258cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1259cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
1260cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
1261921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1262cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1263cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1264cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1265cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
1266cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1268de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
1269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1271de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1272de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1273de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1274de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1275cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return tgsi_helper_copy(ctx, inst);
1276de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
127833241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
127933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
128033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
128133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct r600_bc_tex tex;
1282641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	struct r600_bc_alu alu;
1283641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
1284b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	int r, i;
1285641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1286641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index;
1287641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1288b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
1289b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
1290b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1291b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE;
1292b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].sel = src_gpr;
1293b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 3);
1294b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1295b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1296b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1297b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
1298b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1299b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1300b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
1301b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie
1302b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
1303b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1304b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL;
1305b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
1306b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].chan = 3;
1307b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[1].sel = src_gpr;
1308b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
1309b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1310b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1311b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1312b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1313b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1314b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1315b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
1316b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1317b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
1318921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
1319b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
1320b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1321b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1322b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1323b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
1324b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1325b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1326b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
1327b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1328b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	} else if (inst->Src[0].Register.File != TGSI_FILE_TEMPORARY) {
1329b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
1330b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1331b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV;
1332b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = src_gpr;
1333b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].chan = i;
1334b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1335b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1336b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
1337b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
1338b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1339b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1340b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1341b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1342b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
1343b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1344b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
134533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
134633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	memset(&tex, 0, sizeof(struct r600_bc_tex));
134733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.inst = ctx->inst_info->r600_opcode;
134833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.resource_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index;
134933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.sampler_id = tex.resource_id;
1350641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
13516c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
135233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_x = 0;
135333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_y = 1;
135433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_z = 2;
135533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_w = 3;
135633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_x = 0;
135733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_y = 1;
135833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_z = 2;
135933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_w = 3;
13609a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
136101984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
136201984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
136301984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
13647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		tex.coord_type_z = 1;
136501984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_w = 1;
136601984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
136733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	return r600_bc_add_tex(ctx->bc, &tex);
136833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
136933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
1370b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
1371b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
1372b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
13737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1374b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct r600_bc_alu alu;
1375b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
1376b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
1377b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
13787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
13797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
13807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
1381b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
1382b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
1383b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1384b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD;
1385921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
1386b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
13877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[0];
13887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
1389b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[1].neg = 1;
1390b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1391b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1392b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
1393b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1394b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1395b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
1396b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1397b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1398b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1399b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1400b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
1401b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	if (r)
1402b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		return r;
1403b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
1404b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
1405b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
1406b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1407b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL;
1408b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1409b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
14107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[2];
14117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[2], i);
1412b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1413b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1414b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
1415b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1416b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1417b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
1418b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1419b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1420b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1421b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1422b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
1423b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	if (r)
1424b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		return r;
1425b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
1426b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
1427b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
1428b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1429b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD;
1430b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
14317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0] = r600_src[0];
14327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
14337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[1];
14347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[1], i);
1435b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
1436b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
1437b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1438b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1439b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
1440b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1441b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1442b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1443b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1444b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1445b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1446b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	return tgsi_helper_copy(ctx, inst);
1447b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
1448b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
144987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
145087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
145187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
145287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct r600_bc_alu_src r600_src[3];
145387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct r600_bc_alu alu;
145487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int use_temp = 0;
145587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
145687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
145787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	r = tgsi_split_constant(ctx, r600_src);
145887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	if (r)
145987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		return r;
146087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
146187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
146287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		use_temp = 1;
146387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
146487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	for (i = 0; i < 4; i++) {
146587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
146687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE;
146787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[0] = r600_src[0];
146887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
146987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
147087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[1] = r600_src[2];
147187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[1].chan = tgsi_chan(&inst->Src[2], i);
147287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
147387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[2] = r600_src[1];
147487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[2].chan = tgsi_chan(&inst->Src[1], i);
147587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
147687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (use_temp)
147787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.dst.sel = ctx->temp_reg;
147887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		else {
147987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
148087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			if (r)
148187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie				return r;
148287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		}
148387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
148487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
148587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
148687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (i == 3)
148787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
148887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
148987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
149087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
149187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	}
149287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	if (use_temp)
149387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		return tgsi_helper_copy(ctx, inst);
149487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
149587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
149687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
14970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
14980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
14990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
15000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct r600_bc_alu_src r600_src[3];
15010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct r600_bc_alu alu;
15020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
15030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
15040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
15060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
15070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
15090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (r)
15100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return r;
15110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
15130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
15140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL;
15150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[0] = r600_src[0];
15170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
15180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
15190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 2);
15200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
15220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
15230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
15250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
15260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
15280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
15290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
15300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
15310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[1] = r600_src[1];
15330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
15340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
15350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 1);
15360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
15380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 2);
15390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
15410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 0);
15420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
15440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
15450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
15460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
15470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
15490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
15500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
15510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
15530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
15540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
15550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
15560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
15570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
15580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
15600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
15610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.inst = V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD;
15620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[0] = r600_src[0];
15640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
15650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
15660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
15670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
15690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 2);
15700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
15720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
15730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
15750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
15760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
15770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
15780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[1] = r600_src[1];
15800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
15810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
15820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 2);
15830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
15850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 0);
15860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
15880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 1);
15890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
15900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
15910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
15920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
15930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
15940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
15960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
15970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
15980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
15990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
16000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
16010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		else {
16020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
16030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			if (r)
16040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie				return r;
16050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
16060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
16070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
16080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
16090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
16100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
16110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
16120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
16130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
16140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
16150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
16160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
16170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
16180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
16190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
162087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
1621de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
1622de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1623de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
16240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
16257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
16267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans_srcx_replicate},
1627de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1628de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1629de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
1630de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
1631cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
1632cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
1633de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1634dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
1635de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
1636de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_slt},
1637be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
1638de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
1639de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
1640b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
1641de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1642de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1643de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1645de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1646de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1647de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
16483af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
1649de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
16503af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
1651de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
16527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
16534558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
1654a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
16550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
1656de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1657de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
16587a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
1659de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1660de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
166188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
16623af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
16633af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
1664de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},  /* predicated kill */
1665de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1666de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1667de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1668de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1669de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
16700d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
1671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
16720d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
167388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
1674be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_slt},
16750d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
1676de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1677b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
1678de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1679b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
1680de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1681de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1682de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1683de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1684de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1685de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1686de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1687de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1688de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1689de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
16900d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
169187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
1692de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1693d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
1694de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1695de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1696cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
1697de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1698de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRK,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1699de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1700de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1701de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1702de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1703de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1704de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1705de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1706de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1709de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1711de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1712de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
17134558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate},
1714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1715de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1716de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1717de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1718de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1719de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1720de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1721de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CONT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1726de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1727de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1728de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1729de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1730de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1731de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1732de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1733de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1734de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1735de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1736de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1737de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1738de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1739de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1740de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1741de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1743de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1745de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1746094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
1747de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
1748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
1749de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1750de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1751de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1752de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1753de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1754de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1755de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1756de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1757de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1758de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1760de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1761de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1762de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1763de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1764de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1765de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1766de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1767de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1768de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1769de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1770de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1771de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1772de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1773de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1774de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1775de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1776de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
1777de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
1778