r600_shader.c revision 84b2773f00161441c4fe06ce6dbf979c5ce78dae
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"
33a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie#include "r600_opcodes.h"
3472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse#include "r600d.h"
35de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <stdio.h>
36de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse#include <errno.h>
37de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
382b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
392b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction;
402b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
412b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_ctx {
422b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_shader_info			info;
432b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct tgsi_parse_context		parse;
442b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	const struct tgsi_token			*tokens;
452b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				type;
462b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				file_offset[TGSI_FILE_COUNT];
472b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned				temp_reg;
482b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader_tgsi_instruction	*inst_info;
492b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_bc				*bc;
502b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	struct r600_shader			*shader;
512b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	u32					value[4];
52cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					*literals;
53cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	u32					nliterals;
54e0b6df4fcce0964ea7930efeb40cb487b4c53337John Doe	u32					max_driver_temp_used;
552b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
562b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
572b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestruct r600_shader_tgsi_instruction {
582b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	tgsi_opcode;
592b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	is_op3;
602b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	unsigned	r600_opcode;
612b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse	int (*process)(struct r600_shader_ctx *ctx);
622b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse};
632b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse
6450526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[], eg_shader_tgsi_instruction[];
6542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx);
66de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
6759276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie/* called from hw states files to find VS->FS mapping */
6859276b8541049a2d07d32fbb139fb14e21e387fcDave Airlieint r600_find_vs_semantic_index(struct r600_context *rctx, struct r600_shader *rshader, int id)
6959276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie{
7059276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie	int i;
7159276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie	struct r600_shader *vs = &rctx->vs_shader->shader;
7259276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie	struct r600_shader_io *input = &rshader->input[id];
7359276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie
7459276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie	for (i = 0; i < vs->noutput; i++) {
7559276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie		if (input->name == vs->output[i].name &&
7659276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie		    input->sid == vs->output[i].sid) {
7759276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie			return i - 1;
7859276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie		}
7959276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie	}
8059276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie	return 0;
8159276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie}
8259276b8541049a2d07d32fbb139fb14e21e387fcDave Airlie
83de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int r600_shader_update(struct pipe_context *ctx, struct r600_shader *shader)
84de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
85de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_context *rctx = r600_context(ctx);
86de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	const struct util_format_description *desc;
87de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	enum pipe_format resource_format[160];
88de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i, nresources = 0;
89de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc *bc = &shader->bc;
90de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_cf *cf;
91de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_vtx *vtx;
92de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
93de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (shader->processor_type != TGSI_PROCESSOR_VERTEX)
94de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return 0;
95de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < rctx->vertex_elements->count; i++) {
96de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		resource_format[nresources++] = rctx->vertex_elements->elements[i].src_format;
97de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
98de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	LIST_FOR_EACH_ENTRY(cf, &bc->cf, list) {
99de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (cf->inst) {
100de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case V_SQ_CF_WORD1_SQ_CF_INST_VTX:
101de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case V_SQ_CF_WORD1_SQ_CF_INST_VTX_TC:
102de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			LIST_FOR_EACH_ENTRY(vtx, &cf->vtx, list) {
103de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				desc = util_format_description(resource_format[vtx->buffer_id]);
104de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				if (desc == NULL) {
105de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse					R600_ERR("unknown format %d\n", resource_format[vtx->buffer_id]);
106de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse					return -EINVAL;
107de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				}
108de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				vtx->dst_sel_x = desc->swizzle[0];
109de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				vtx->dst_sel_y = desc->swizzle[1];
110de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				vtx->dst_sel_z = desc->swizzle[2];
111de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				vtx->dst_sel_w = desc->swizzle[3];
112de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
113de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
114de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
115de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
116de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
117de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
118de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r600_bc_build(&shader->bc);
119de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
120de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1216f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisseint r600_pipe_shader_create(struct pipe_context *ctx,
1226f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse			struct r600_context_state *rpshader,
1236f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse			const struct tgsi_token *tokens)
124de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
125de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_screen *rscreen = r600_screen(ctx->screen);
126de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int r;
127de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
12836efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse//fprintf(stderr, "--------------------------------------------------------------\n");
12936efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse//tgsi_dump(tokens, 0);
130de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (rpshader == NULL)
1316f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		return -ENOMEM;
132de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	rpshader->shader.family = radeon_get_family(rscreen->rw);
133d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie	rpshader->shader.use_mem_constant = rscreen->use_mem_constant;
134de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_shader_from_tgsi(tokens, &rpshader->shader);
135de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r) {
136de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("translation from TGSI failed !\n");
1376f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		return r;
138de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
139de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_bc_build(&rpshader->shader.bc);
140de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r) {
141de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("building bytecode failed !\n");
1426f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		return r;
143de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
14436efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse//fprintf(stderr, "______________________________________________________________\n");
1456f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	return 0;
146de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
14772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
1486f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader_vs(struct pipe_context *ctx, struct r600_context_state *rpshader)
14972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
1509ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie	struct r600_context *rctx = r600_context(ctx);
15172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct radeon_state *state;
15272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
15367234b4b42a8285a9b14da48dd113cbe2ee871fdJerome Glisse	state = &rpshader->rstate[0];
15467234b4b42a8285a9b14da48dd113cbe2ee871fdJerome Glisse	radeon_state_fini(&rpshader->rstate[0]);
1559ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie
1569ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie	return rctx->vtbl->vs_shader(rctx, rpshader, state);
15772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
15872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
1596f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader_ps(struct pipe_context *ctx, struct r600_context_state *rpshader)
16072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
161457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	struct r600_context *rctx = r600_context(ctx);
16272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct radeon_state *state;
16372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
16467234b4b42a8285a9b14da48dd113cbe2ee871fdJerome Glisse	state = &rpshader->rstate[0];
16566e4cb1cd5a55402606a09417349d2be8b009e89Jerome Glisse	radeon_state_fini(state);
1665f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie
1679ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie	return rctx->vtbl->ps_shader(rctx, rpshader, state);
16872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
16972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
1706f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_context_state *rpshader)
17172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
172ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_screen *rscreen = r600_screen(ctx->screen);
173ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_context *rctx = r600_context(ctx);
17472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct r600_shader *rshader = &rpshader->shader;
17572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	int r;
176f70f79f6f6027bdf2f7de09bb39e12a24420f338Dave Airlie	void *data;
17772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
17872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	/* copy new shader */
179f70f79f6f6027bdf2f7de09bb39e12a24420f338Dave Airlie	radeon_ws_bo_reference(rscreen->rw, &rpshader->bo, NULL);
18072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->bo = NULL;
181f70f79f6f6027bdf2f7de09bb39e12a24420f338Dave Airlie	rpshader->bo = radeon_ws_bo(rscreen->rw, rshader->bc.ndw * 4,
1827c1fcc41be15b6d648f84c8c1870a3a00575a48fDave Airlie				    4096, 0);
18372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (rpshader->bo == NULL) {
18472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		return -ENOMEM;
18572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
1860f099f2906773690210661fb533e207626dc8e40Jerome Glisse	data = radeon_ws_bo_map(rscreen->rw, rpshader->bo, 0, ctx);
187f70f79f6f6027bdf2f7de09bb39e12a24420f338Dave Airlie	memcpy(data, rshader->bc.bytecode, rshader->bc.ndw * 4);
188f70f79f6f6027bdf2f7de09bb39e12a24420f338Dave Airlie	radeon_ws_bo_unmap(rscreen->rw, rpshader->bo);
18972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	/* build state */
19072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rshader->flat_shade = rctx->flat_shade;
191de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (rshader->processor_type) {
192de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_PROCESSOR_VERTEX:
19372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		r = r600_pipe_shader_vs(ctx, rpshader);
19472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
195de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_PROCESSOR_FRAGMENT:
19672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		r = r600_pipe_shader_ps(ctx, rpshader);
19772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
19872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	default:
19972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		r = -EINVAL;
20072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
20172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
20272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	return r;
20372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
20472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
2056f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisseint r600_pipe_shader_update(struct pipe_context *ctx, struct r600_context_state *rpshader)
20672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
207de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_context *rctx = r600_context(ctx);
20872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	int r;
20972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
21072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (rpshader == NULL)
211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* there should be enough input */
213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (rctx->vertex_elements->count < rpshader->shader.bc.nresource) {
214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("%d resources provided, expecting %d\n",
215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			rctx->vertex_elements->count, rpshader->shader.bc.nresource);
216de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
21772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_shader_update(ctx, &rpshader->shader);
219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r)
220de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return r;
221de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r600_pipe_shader(ctx, rpshader);
222de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
225de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
226de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
227de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
228de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
230de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
231de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
23272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
236c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
237a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0
238de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
24172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
242a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif
243de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
24447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		if (i->Src[j].Register.Dimension ||
245de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			i->Src[j].Register.Absolute) {
24647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie			R600_ERR("unsupported src %d (dimension %d|absolute %d)\n", j,
24747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie				 i->Src[j].Register.Dimension,
24847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie				 i->Src[j].Register.Absolute);
249de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
250de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
251de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
252de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
25347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		if (i->Dst[j].Register.Dimension) {
25447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie			R600_ERR("unsupported dst (dimension)\n");
255de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
256de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
257de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
25972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
26072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
26150526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic int evergreen_interp_alu(struct r600_shader_ctx *ctx, int gpr)
26250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{
26350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	int i, r;
26450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	struct r600_bc_alu alu;
26550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
26650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	for (i = 0; i < 8; i++) {
26750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
26850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
26950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (i < 4)
27050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_ZW;
27150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		else
27250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.inst = EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INTERP_XY;
27350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
27450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i > 1) && (i < 6)) {
27550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.dst.sel = ctx->shader->input[gpr].gpr;
27650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.dst.write = 1;
27750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
27850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
27950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.dst.chan = i % 4;
28050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.src[0].chan = (1 - (i % 2));
28150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.src[1].sel = V_SQ_ALU_SRC_PARAM_BASE + gpr;
28250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
28350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		alu.bank_swizzle_force = SQ_ALU_VEC_210;
28450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if ((i % 4) == 3)
28550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			alu.last = 1;
28650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
28750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (r)
28850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			return r;
28950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	}
29050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	return 0;
29150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie}
29250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
29350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
294de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
29572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
296de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
297de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_vtx vtx;
298de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
299de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int r;
30072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
301de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
302de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
303de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
304de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
30635e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->input[i].interpolate = d->Declaration.Interpolate;
307de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i;
308de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (ctx->type == TGSI_PROCESSOR_VERTEX) {
309de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			/* turn input into fetch */
310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			memset(&vtx, 0, sizeof(struct r600_bc_vtx));
311de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.inst = 0;
312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.fetch_type = 0;
313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.buffer_id = i;
314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			/* register containing the index into the buffer */
315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.src_gpr = 0;
316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.src_sel_x = 0;
317de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.mega_fetch_count = 0x1F;
318de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_gpr = ctx->shader->input[i].gpr;
319de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_x = 0;
320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_y = 1;
321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_z = 2;
322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_w = 3;
323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = r600_bc_add_vtx(ctx->bc, &vtx);
324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
325de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
326de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
32750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chiprev == 2) {
32850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			/* turn input into interpolate on EG */
32950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			evergreen_interp_alu(ctx, i);
33050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie		}
331de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
332de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
333de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
334de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i;
33735e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->output[i].interpolate = d->Declaration.Interpolate;
338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
340de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
34133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
34247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	case TGSI_FILE_ADDRESS:
343de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
345de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
346de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
347de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
348de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
34972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
35072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
351be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx)
352be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
353be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return ctx->temp_reg + ctx->max_driver_temp_used++;
354be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
355be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
356de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader)
35772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
359de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
360c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	struct r600_bc_output output[32];
361457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	unsigned output_done, noutput;
362de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, r = 0, pos0;
36472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
366de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
367de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_bc_init(ctx.bc, shader->family);
368de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r)
369de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return r;
370d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie	ctx.bc->use_mem_constant = shader->use_mem_constant;
371de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
372de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
373de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
374de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
375de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
376de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
377de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
378076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	/* Values [0,127] correspond to GPR[0..127].
379076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [128,159] correspond to constant buffer bank 0
380076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [160,191] correspond to constant buffer bank 1
381076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [256,511] correspond to cfile constants c[0..255].
382de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
383076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 244  ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+)
384076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 245  ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+)
385076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 246  ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+)
386076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 247  ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+)
387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
388de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
389de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
390de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
391de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
392de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
393de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
394de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
395de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
396de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
397de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
398de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
399de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
400de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
401de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
402de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] +
403de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_INPUT];
404de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_OUTPUT];
406d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie	if (ctx.shader->use_mem_constant)
407d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie		ctx.file_offset[TGSI_FILE_CONSTANT] = 128;
408d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie	else
409d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie		ctx.file_offset[TGSI_FILE_CONSTANT] = 256;
410d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie
411de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_IMMEDIATE] = 253;
412de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
413de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			ctx.info.file_count[TGSI_FILE_TEMPORARY];
414de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
415cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.nliterals = 0;
416cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.literals = NULL;
417cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen
418de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
419de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
420de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
421de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
422de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
423cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16);
424cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			if(ctx.literals == NULL) {
425cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				r = -ENOMEM;
426cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				goto out_err;
427cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			}
428cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint;
429cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint;
430cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint;
431cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint;
432cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.nliterals++;
433de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
434de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
435de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
436de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
438de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
439de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
440de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
441de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
442de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
443be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			ctx.max_driver_temp_used = 0;
444be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			/* reserve first tmp for everyone */
445be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r600_get_temp(&ctx);
446de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
44750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			if (ctx.bc->chiprev == 2)
44850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &eg_shader_tgsi_instruction[opcode];
44950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie			else
45050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie				ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
451de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
452de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
453de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
4542b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			r = r600_bc_add_literal(ctx.bc, ctx.value);
455de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
456de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
457de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
458de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
459de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
460de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
461de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
462de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
463de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
464de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* export output */
465457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	noutput = shader->noutput;
466457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0, pos0 = 0; i < noutput; i++) {
467c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		memset(&output[i], 0, sizeof(struct r600_bc_output));
468c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].gpr = shader->output[i].gpr;
469c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].elem_size = 3;
470c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_x = 0;
471c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_y = 1;
472c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_z = 2;
473c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_w = 3;
474c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].barrier = 1;
475c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
476c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].array_base = i - pos0;
477a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
478457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		switch (ctx.type) {
479de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
480de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
481c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 60;
482c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
483de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				/* position doesn't count in array_base */
484457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
485457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
486457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) {
487457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].array_base = 61;
488457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
489457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				/* position doesn't count in array_base */
490457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
491de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
492de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
493de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
494de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
495b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse				output[i].array_base = shader->output[i].sid;
496c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
4975f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
498c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 61;
499b87b6e5bf798fcfa486e8082a09b4425a40cf3c4Dave Airlie				output[i].swizzle_x = 2;
500b87b6e5bf798fcfa486e8082a09b4425a40cf3c4Dave Airlie				output[i].swizzle_y = output[i].swizzle_z = output[i].swizzle_w = 7;
501c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
502de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
503de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
504de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
505de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
506de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
507de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
508de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
509de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
510de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
511de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
51272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
513457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	}
514457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add fake param output for vertex shader if no param is exported */
515457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
516457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		for (i = 0, pos0 = 0; i < noutput; i++) {
517457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) {
518457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0 = 1;
519457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				break;
520457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
521457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
522457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (!pos0) {
523457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			memset(&output[i], 0, sizeof(struct r600_bc_output));
524457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].gpr = 0;
525457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].elem_size = 3;
526457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_x = 0;
527457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_y = 1;
528457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_z = 2;
529457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_w = 3;
530457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].barrier = 1;
531457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
532457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].array_base = 0;
5337e5173d065f0da450cf553e3e3084a0f774919a3Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
534457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			noutput++;
535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
536c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
537481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	/* add fake pixel export */
538481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) {
539481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		memset(&output[0], 0, sizeof(struct r600_bc_output));
540481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].gpr = 0;
541481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].elem_size = 3;
542481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_x = 7;
543481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_y = 7;
544481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_z = 7;
545481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_w = 7;
546481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].barrier = 1;
547608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse		output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
548481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].array_base = 0;
549a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
550481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		noutput++;
551481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	}
552457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* set export done on last export of each type */
553457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
554457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (i == (noutput - 1)) {
555457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].end_of_program = 1;
556457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
557b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse		if (!(output_done & (1 << output[i].type))) {
558b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse			output_done |= (1 << output[i].type);
559a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE);
560c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		}
561c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
562457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add output to bytecode */
563457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0; i < noutput; i++) {
564c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		r = r600_bc_add_output(ctx.bc, &output[i]);
565de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
566de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
567de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
568cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
571de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
572cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
573de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
574de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
575de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
576de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
577de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
578de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
579de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode);
580de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
581de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
582de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
583de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
584de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
585de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
586de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
587de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
588de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx,
589de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_src_register *tgsi_src,
590de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_src *r600_src)
591de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
592cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	int index;
5937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(r600_src, 0, sizeof(struct r600_bc_alu_src));
594de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel = tgsi_src->Register.Index;
595de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
596de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r600_src->sel = 0;
597cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		index = tgsi_src->Register.Index;
598cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[0] = ctx->literals[index * 4 + 0];
599cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[1] = ctx->literals[index * 4 + 1];
600cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[2] = ctx->literals[index * 4 + 2];
601cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[3] = ctx->literals[index * 4 + 3];
602de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
60347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_src->Register.Indirect)
60447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_src->rel = V_SQ_REL_RELATIVE;
6051bb0427a856ffa3fea1b177ea5b0395a00de3833Jerome Glisse	r600_src->neg = tgsi_src->Register.Negate;
606de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
607de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
608de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
609de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
610de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx,
611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_dst_register *tgsi_dst,
612de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			unsigned swizzle,
613de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_dst *r600_dst)
614de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
6157a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
6167a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
617de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
620de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
62147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_dst->Register.Indirect)
62247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_dst->rel = V_SQ_REL_RELATIVE;
6237a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
6247a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
6257a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
626de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
627de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
628de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
6297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic unsigned tgsi_chan(const struct tgsi_full_src_register *tgsi_src, unsigned swizzle)
6307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
6317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	switch (swizzle) {
6327e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 0:
6337e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleX;
6347e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 1:
6357e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleY;
6367e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 2:
6377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleZ;
6387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 3:
6397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleW;
6407e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	default:
6417e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return 0;
6427e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
6437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
6447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
6457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic int tgsi_split_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3])
6467e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
6477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
6487e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
6497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	int i, j, k, nconst, r;
6507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
6517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
6527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
6537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			nconst++;
6547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
6557e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[i], &r600_src[i]);
6567e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r) {
6577e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
6587e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
6597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
6607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
6617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (inst->Src[j].Register.File == TGSI_FILE_CONSTANT && j > 0) {
662be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			int treg = r600_get_temp(ctx);
6637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			for (k = 0; k < 4; k++) {
6647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				memset(&alu, 0, sizeof(struct r600_bc_alu));
665a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
6669bbc54a10d225679a180a085f7ca5bb88ee2bd15Dave Airlie				alu.src[0].sel = r600_src[j].sel;
6677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[0].chan = k;
668be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.sel = treg;
6697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.chan = k;
6707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.write = 1;
6717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				if (k == 3)
6727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse					alu.last = 1;
6737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				r = r600_bc_add_alu(ctx->bc, &alu);
6747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				if (r)
6757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse					return r;
6767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			}
677be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r600_src[j].sel = treg;
6787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			j--;
6797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
6807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
6817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
6827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
6837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
684be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */
685be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3])
686be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
687be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
688be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	struct r600_bc_alu alu;
689be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	int i, j, k, nliteral, r;
690be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
691be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) {
692be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (inst->Src[i].Register.File == TGSI_FILE_IMMEDIATE) {
693be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			nliteral++;
694be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		}
695be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	}
696be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0, j = 0; i < inst->Instruction.NumSrcRegs; i++) {
697be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (inst->Src[j].Register.File == TGSI_FILE_IMMEDIATE) {
698be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			int treg = r600_get_temp(ctx);
699be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			for (k = 0; k < 4; k++) {
700be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
701a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
702be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.src[0].sel = r600_src[j].sel;
703be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.src[0].chan = k;
704be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.sel = treg;
705be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.chan = k;
706be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.write = 1;
707be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				if (k == 3)
708be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie					alu.last = 1;
709be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
710be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				if (r)
711be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie					return r;
712be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			}
713be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r = r600_bc_add_literal(ctx->bc, ctx->value);
714be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			if (r)
715be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				return r;
716be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r600_src[j].sel = treg;
717be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			j++;
718be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		}
719be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	}
720be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return 0;
721be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
722be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
723d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap)
724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
7267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
727de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
728de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
729d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	int lasti = 0;
730d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
731d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < 4; i++) {
732d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (inst->Dst[0].Register.WriteMask & (1 << i)) {
733d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			lasti = i;
734d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		}
735d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	}
736de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
7377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
7387e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
7397e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
740d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < lasti + 1; i++) {
741d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
742d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			continue;
743d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
745d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
746d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (r)
747d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			return r;
748d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
749d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
750d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!swap) {
751de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
7527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j] = r600_src[j];
7537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
754de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
755d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		} else {
756d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[0] = r600_src[1];
757d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[1], i);
758d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
759d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[1] = r600_src[0];
760d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
761de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
762de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
763de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
764de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
765de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.src[1].neg = 1;
766de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
7677a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
7687a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			alu.src[0].abs = 1;
7697a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
770de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
771de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
772de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
773d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (i == lasti) {
774de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
775de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
776de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
777de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
778de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
779de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
780de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
781de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
782de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
783d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx)
784d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
785d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 0);
786d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
787d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
788d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx)
789d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
790d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 1);
791d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
792d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
79388f5976484842671ecb2cefcfa91838a43032359Dave Airlie/*
79488f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range
79588f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI
79688f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901
79788f5976484842671ecb2cefcfa91838a43032359Dave Airlie */
79892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_setup_trig(struct r600_shader_ctx *ctx,
79992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie			   struct r600_bc_alu_src r600_src[3])
80088f5976484842671ecb2cefcfa91838a43032359Dave Airlie{
80188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
80292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int r;
80388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	uint32_t lit_vals[4];
80492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
80592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
80688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(lit_vals, 0, 4*4);
80788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
80888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
80988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
810be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
811be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	r = tgsi_split_literal_constant(ctx, r600_src);
812be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	if (r)
813be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		return r;
814be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
81588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	lit_vals[0] = fui(1.0 /(3.1415926535 * 2));
81688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	lit_vals[1] = fui(0.5f);
81788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
81888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
819a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
82088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
82188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
82288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
82388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
82488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
82588f5976484842671ecb2cefcfa91838a43032359Dave Airlie
82688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0] = r600_src[0];
82788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
82888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
829921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
83088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
831921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
83288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[2].chan = 1;
83388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
83488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
83588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
83688f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
83788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_literal(ctx->bc, lit_vals);
83888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
83988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
84088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
84188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
842a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
84388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
84488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
84588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
84688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
84788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
84888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
84988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
85088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
85188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
85288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
85388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
85488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
85588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (ctx->bc->chiprev == 0) {
85688f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[0] = fui(3.1415926535897f * 2.0f);
85788f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[1] = fui(-3.1415926535897f);
85888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	} else {
85988f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[0] = fui(1.0f);
86088f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[1] = fui(-0.5f);
86188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
86288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
86388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
864a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
86588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
86688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
86788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
86888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
86988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
87088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
87188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
87288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
87388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
874921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
87588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
876921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
87788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[2].chan = 1;
87888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
87988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
88088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
88188f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
88288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_literal(ctx->bc, lit_vals);
88388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
88488f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
88592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
88692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
88792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
88892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx)
88992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
89092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
89192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu_src r600_src[3];
89292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
89392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int i, r;
894be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	int lasti = 0;
89592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
89692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	r = tgsi_setup_trig(ctx, r600_src);
89792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
89892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
89988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
90088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
90188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = ctx->inst_info->r600_opcode;
90288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
90388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
90488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
90588f5976484842671ecb2cefcfa91838a43032359Dave Airlie
90688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
90788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
90888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
90988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
91088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
91188f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
91288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
91388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	/* replicate result */
91488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	for (i = 0; i < 4; i++) {
915be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (inst->Dst[0].Register.WriteMask & (1 << i))
916be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			lasti = i;
917be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	}
918be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0; i < lasti + 1; i++) {
919be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
920be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			continue;
921be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
92288f5976484842671ecb2cefcfa91838a43032359Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
923a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
924be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
925be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		alu.src[0].sel = ctx->temp_reg;
92688f5976484842671ecb2cefcfa91838a43032359Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
92788f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
92888f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
929be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (i == lasti)
93088f5976484842671ecb2cefcfa91838a43032359Dave Airlie			alu.last = 1;
93188f5976484842671ecb2cefcfa91838a43032359Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
93288f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
93388f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
93488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
93588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	return 0;
93688f5976484842671ecb2cefcfa91838a43032359Dave Airlie}
93788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
93892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx)
93992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
94092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
94192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu_src r600_src[3];
94292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
94392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int r;
94492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
94557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	/* We'll only need the trig stuff if we are going to write to the
94657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 * X or Y components of the destination vector.
94757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	 */
94857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (likely(inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_XY)) {
94957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = tgsi_setup_trig(ctx, r600_src);
95057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
95157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
95257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
95392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
95492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.x = COS */
95557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) {
95657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
95757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
95857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
95957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
96057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
96192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
96257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
96357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].chan = 0;
96457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.last = 1;
96557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
96657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
96757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
96857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
96992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
97092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.y = SIN */
97157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) {
97257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
97357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
97457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
97557bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
97657bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
97757bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck
97857bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
97957bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.src[0].chan = 0;
98057bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		alu.last = 1;
98157bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
98257bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck		if (r)
98357bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck			return r;
98457bf96b43be2abcbadc387d7b5466b772125a093Tilman Sauerbeck	}
98592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
986ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.z = 0.0; */
987ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) {
988ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
989ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
990ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
991ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
992ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
993ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
994ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
995ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
996ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_0;
997ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
998ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
999ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1000ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1001ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
1002ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1003ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1004ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1005ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
1006ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1007ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1008ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1009ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1010ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	/* dst.w = 1.0; */
1011ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) {
1012ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
1013ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1014ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1015ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1016ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
1017ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1018ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1019ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1020ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
1021ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.src[0].chan = 0;
1022ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1023ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		alu.last = 1;
1024ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1025ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
1026ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1027ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1028ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
1029ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
1030ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck		if (r)
1031ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck			return r;
1032ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck	}
1033ef419599d9b18de2a9077c5f0a7f02bfc11d1762Tilman Sauerbeck
103492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
103592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
103692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
1037094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
1038094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
1039094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1040094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct r600_bc_alu alu;
1041094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
1042094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
1043094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
1044094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1045094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
10464502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1047094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
10484502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
1049921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_0;
10504502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
10514502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) {
10524502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
10534502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].neg = 1;
10544502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		} else {
10554502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]);
10564502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			if (r)
10574502b17901ad491e0598ee59a12d372c008ae03bDave Airlie				return r;
10584502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
10594502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		}
1060094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
1061094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
1062094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
1063094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1064094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
1065094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
1066094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
10674502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	r = r600_bc_add_literal(ctx->bc, ctx->value);
10684502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	if (r)
10694502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		return r;
10704502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
10714502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	/* kill must be last in ALU */
10724502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->bc->force_add_cf = 1;
10734502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->shader->uses_kill = TRUE;
1074094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
1075094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
1076094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
10770bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
10780bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
10790bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
10800bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct r600_bc_alu alu;
1081ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	struct r600_bc_alu_src r600_src[3];
10820bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
10830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
1084ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
1085ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	if (r)
1086ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		return r;
1087d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie	r = tgsi_split_literal_constant(ctx, r600_src);
1088d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie	if (r)
1089d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie		return r;
1090ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie
10917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.x, <- 1.0  */
10927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1093a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1094921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
10957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
10967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
10977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
10987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
10997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
11007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
11017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
11027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
11030bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
11047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.y = max(src.x, 0.0) */
11057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1106a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
1107ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	alu.src[0] = r600_src[0];
1108921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
110985e401d8bfd80450a31eac234e13008e33e64227Dave Airlie	alu.src[1].chan = 0;
11107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
11117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
11127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
11137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
11147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
11157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
11167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
11170bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
11187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.w, <- 1.0  */
11197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1120a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1121921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[0].sel  = V_SQ_ALU_SRC_1;
11227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
11237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
11247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
11257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
11267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
11277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.last = 1;
11287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
11297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
11307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
11310bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
11325ea238b7991331c854e66a16911d616d36965dc9Dave Airlie	r = r600_bc_add_literal(ctx->bc, ctx->value);
11335ea238b7991331c854e66a16911d616d36965dc9Dave Airlie	if (r)
11345ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		return r;
11355ea238b7991331c854e66a16911d616d36965dc9Dave Airlie
11360bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
11370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
11386a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
11396a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
11406a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
11410bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = log(src.y) */
11420bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
1143a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
1144ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[0] = r600_src[0];
1145ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
11460bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
11470bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
11480bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
11490bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
11500bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
11510bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
11520bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
11530bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
11545ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
11555ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
11565ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
115785e401d8bfd80450a31eac234e13008e33e64227Dave Airlie
11586a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
11596a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
11600bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
11610bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */
11620bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
1163a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT);
1164ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[0] = r600_src[0];
11657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], 3);
11660bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].sel  = sel;
11670bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].chan = chan;
1168ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie
1169ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[2] = r600_src[0];
11707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[2].chan = tgsi_chan(&inst->Src[0], 0);
11710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
11720bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
11730bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
11740bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
11750bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
11760bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
11770bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
11780bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
11790bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
11805ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
11815ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
11825ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
11830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = exp(tmp.x) */
11840bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
1185a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
11860bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].sel = ctx->temp_reg;
11870bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].chan = 0;
11880bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
11890bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
11900bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
11910bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
11920bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
11930bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
11940bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
11950bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
11960bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
11970bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
11980bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
119942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx)
120042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{
120142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
120242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct r600_bc_alu alu;
120342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	int i, r;
120442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
120542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	memset(&alu, 0, sizeof(struct r600_bc_alu));
1206df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
1207df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
1208df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
1209df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIPSQRT_IEEE instead.
1210df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
1211df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_CLAMPED);
1212df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
121342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
121442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]);
121542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		if (r)
121642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck			return r;
121742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		alu.src[i].chan = tgsi_chan(&inst->Src[i], 0);
121842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		alu.src[i].abs = 1;
121942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	}
122042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.sel = ctx->temp_reg;
122142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.write = 1;
122242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.last = 1;
122342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	r = r600_bc_add_alu(ctx->bc, &alu);
122442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
122542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
122642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	r = r600_bc_add_literal(ctx->bc, ctx->value);
122742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
122842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
122942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	/* replicate result */
123042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	return tgsi_helper_tempx_replicate(ctx);
123142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck}
123242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
12335cc2974dff346f3fa53881dbcc158e4563915487Jerome Glissestatic int tgsi_trans(struct r600_shader_ctx *ctx)
12345cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse{
12355cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
12365cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	struct r600_bc_alu alu;
12375cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	int i, j, r;
12385cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse
12395cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	for (i = 0; i < 4; i++) {
12405cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
12415cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		if (inst->Dst[0].Register.WriteMask & (1 << i)) {
12425cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			alu.inst = ctx->inst_info->r600_opcode;
12435cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
12447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				r = tgsi_src(ctx, &inst->Src[j], &alu.src[j]);
12455cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				if (r)
12465cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse					return r;
12477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
12485cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			}
12495cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
12505cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			if (r)
12515cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				return r;
12525cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			alu.last = 1;
12535cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			r = r600_bc_add_alu(ctx->bc, &alu);
12545cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			if (r)
12555cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				return r;
12565cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		}
12575cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	}
12585cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	return 0;
12595cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse}
12605cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse
1261a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
12627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
12637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
12647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
1265a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
12667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
12677e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
12687e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
12697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1270a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
12717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
12727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
12737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
12747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
12757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
12767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
12777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
12787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
12797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
12807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
12817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
12827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
12837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
12847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
1285a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
1286a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1287a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1288a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1289a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
1290a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1291a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1292a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
1293a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
1294a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]);
1295a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		if (r)
1296a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse			return r;
1297a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		alu.src[i].chan = tgsi_chan(&inst->Src[i], 0);
1298a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	}
1299a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1300a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1301a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1302a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1303a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1304a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
13055ea238b7991331c854e66a16911d616d36965dc9Dave Airlie	r = r600_bc_add_literal(ctx->bc, ctx->value);
13065ea238b7991331c854e66a16911d616d36965dc9Dave Airlie	if (r)
13075ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		return r;
1308a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* replicate result */
1309a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1310a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1311a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1312a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx)
1313a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1314a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1315a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1316a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int r;
1317a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1318a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* LOG2(a) */
1319a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1320a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
1321a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
1322a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1323a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1324a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
1325a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1326a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1327a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1328a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1329a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1330a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1331e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	r = r600_bc_add_literal(ctx->bc,ctx->value);
1332e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	if (r)
1333e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen		return r;
1334a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* b * LOG2(a) */
1335a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1336a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL_IEEE);
1337a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = tgsi_src(ctx, &inst->Src[1], &alu.src[0]);
1338a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1339a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1340a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].chan = tgsi_chan(&inst->Src[1], 0);
1341a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[1].sel = ctx->temp_reg;
1342a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1343a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1344a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1345a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1346a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1347a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1348e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	r = r600_bc_add_literal(ctx->bc,ctx->value);
1349e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	if (r)
1350e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen		return r;
1351a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* POW(a,b) = EXP2(b * LOG2(a))*/
1352a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1353a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
1354a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
1355a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1356a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1357a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1358a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1359a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1360a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1361e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	r = r600_bc_add_literal(ctx->bc,ctx->value);
1362e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	if (r)
1363e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen		return r;
1364a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1365a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1366a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
13670d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
13680d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
13690d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
13700d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct r600_bc_alu alu;
13710d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct r600_bc_alu_src r600_src[3];
1372921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
13730d48925a56ad4fb253386110b545abda82a25464Dave Airlie
13740d48925a56ad4fb253386110b545abda82a25464Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
13750d48925a56ad4fb253386110b545abda82a25464Dave Airlie	if (r)
13760d48925a56ad4fb253386110b545abda82a25464Dave Airlie		return r;
13770d48925a56ad4fb253386110b545abda82a25464Dave Airlie
13780d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
13790d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
13800d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1381a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
13820d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
1383cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie
13840d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
1385cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.dst.chan = i;
13860d48925a56ad4fb253386110b545abda82a25464Dave Airlie
13870d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0] = r600_src[0];
13880d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
13890d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1390921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
13910d48925a56ad4fb253386110b545abda82a25464Dave Airlie
13920d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2] = r600_src[0];
13930d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].chan = tgsi_chan(&inst->Src[0], i);
13940d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
13950d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
13960d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
13970d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
13980d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
13990d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
1400cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie	r = r600_bc_add_literal(ctx->bc, ctx->value);
1401cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie	if (r)
1402cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		return r;
14030d48925a56ad4fb253386110b545abda82a25464Dave Airlie
14040d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
14050d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
14060d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1407a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
14080d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
14090d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
14100d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
14110d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
14120d48925a56ad4fb253386110b545abda82a25464Dave Airlie
14130d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1414cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[0].chan = i;
14150d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
14160d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1417921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
14180d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
14190d48925a56ad4fb253386110b545abda82a25464Dave Airlie
14200d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
1421cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[2].chan = i;
14220d48925a56ad4fb253386110b545abda82a25464Dave Airlie
14230d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
14240d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
14250d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
14260d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
14270d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
14280d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
14290d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
14300d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
14310d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1432cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
1433cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1434cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1435cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
1436cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
14379961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
14389961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse	if (r)
14399961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse		return r;
1440cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
1441cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1442cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
1443a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP);
14446c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
1445cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
1446a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1447cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1448cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (r)
1449cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				return r;
1450cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
1451cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
1452cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1453cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
1454cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
1455cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1456cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1457cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
1458cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
1459cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
1460cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
1461cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1462cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1463de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
1464de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1465de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
14667e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1467de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
1468de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
1469de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
14707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
14717e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
14727e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
1473de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* do it in 2 step as op3 doesn't support writemask */
1474de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
1475de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1476de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1477de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
14787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j] = r600_src[j];
14797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
1480de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1481de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1482de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
1483cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
1484de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
1485de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
1486de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1487de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1488de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1489de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1490de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1491de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1492cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return tgsi_helper_copy(ctx, inst);
1493cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1494cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1495cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
1496cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1497cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
14987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1499cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1500cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
1501cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
15027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
15037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
15047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
1505de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
1506de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1507cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1508cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
15097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j] = r600_src[j];
15107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
1511cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1512cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1513cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
1514cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
1515cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
1516cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1517cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
1518cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
1519921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1520cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1521cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1522cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1523cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
1524cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
1525921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1526cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1527cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1528cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1529e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie		case TGSI_OPCODE_DPH:
1530e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			if (i == 3) {
1531e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].sel = V_SQ_ALU_SRC_1;
1532e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].chan = 0;
1533e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].neg = 0;
1534e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			}
1535e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			break;
1536cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
1537cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1539de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
1540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1541de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1542de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1543de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1545de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1546cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return tgsi_helper_copy(ctx, inst);
1547de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1548de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
154933241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
155033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
155133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
155233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct r600_bc_tex tex;
1553641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	struct r600_bc_alu alu;
1554641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
1555b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	int r, i;
1556bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	int opcode;
1557bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	boolean src_not_temp = inst->Src[0].Register.File != TGSI_FILE_TEMPORARY;
1558bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	uint32_t lit_vals[4];
1559641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1560641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index;
1561641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1562b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
1563b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
1564b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1565a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1566bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
1567bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1568bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1569bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1570b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 3);
1571b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1572b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1573b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1574b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
1575b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1576b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1577b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
1578b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie
1579b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
1580b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1581a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
1582b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
1583b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].chan = 3;
1584bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]);
1585bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1586bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1587b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
1588b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1589b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1590b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1591b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1592b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1593b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1594b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
1595b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1596a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1597921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
1598b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
1599b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1600b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1601b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1602b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
1603b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1604b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1605b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
160607b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson		src_not_temp = FALSE;
1607b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1608bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1609bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1610bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
1611bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		int src_chan, src2_chan;
1612bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1613bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */
1614bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		for (i = 0; i < 4; i++) {
1615bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1616a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE);
1617bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			switch (i) {
1618bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 0:
1619bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 2;
1620bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 1;
1621bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
1622bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 1:
1623bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 2;
1624bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 0;
1625bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
1626bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 2:
1627bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 0;
1628bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 2;
1629bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
1630bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 3:
1631bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 1;
1632bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 2;
1633bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
163484b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee			default:
163584b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				assert(0);
163684b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				src_chan = 0;
163784b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				src2_chan = 0;
163884b2773f00161441c4fe06ce6dbf979c5ce78daeVinson Lee				break;
1639bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			}
1640bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
1641bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1642bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1643bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], src_chan);
1644bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]);
1645bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1646bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1647bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], src2_chan);
1648bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.sel = ctx->temp_reg;
1649bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.chan = i;
1650bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (i == 3)
1651bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				alu.last = 1;
1652bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.write = 1;
1653bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1654bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1655bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1656bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		}
1657bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1658bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.z = RCP_e(|tmp1.z|) */
1659bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1660a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1661bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1662bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 2;
1663bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].abs = 1;
1664bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1665bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 2;
1666bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1667bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
1668bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1669bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1670bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1671bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1672bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* MULADD R0.x,  R0.x,  PS1,  (0x3FC00000, 1.5f).x
1673bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * MULADD R0.y,  R0.y,  PS1,  (0x3FC00000, 1.5f).x
1674bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * muladd has no writemask, have to use another temp
1675bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 */
1676bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1677a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1678bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
1679bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1680bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1681bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 0;
1682bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
1683bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
1684bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1685bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1686bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
1687bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1688bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1689bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 0;
1690bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1691bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1692bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1693bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1694bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1695bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1696bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1697a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1698bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
1699bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1700bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1701bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 1;
1702bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
1703bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
1704bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1705bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1706bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
1707bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1708bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1709bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 1;
1710bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1711bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1712bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
1713bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1714bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1715bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1716bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1717bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		lit_vals[0] = fui(1.5f);
1718bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1719bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_literal(ctx->bc, lit_vals);
1720bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1721bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
172207b9e22a1f587026672a00a31cebaef5aae964c6Corbin Simpson		src_not_temp = FALSE;
1723bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		src_gpr = ctx->temp_reg;
1724bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1725bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1726bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (src_not_temp) {
1727b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
1728b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1729a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1730b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = src_gpr;
1731b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].chan = i;
1732b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1733b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1734b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
1735b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
1736b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1737b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1738b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1739b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1740b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
1741b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1742b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
1743bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1744bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	opcode = ctx->inst_info->r600_opcode;
1745bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (opcode == SQ_TEX_INST_SAMPLE &&
1746bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	    (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D))
1747bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		opcode = SQ_TEX_INST_SAMPLE_C;
174833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
174933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	memset(&tex, 0, sizeof(struct r600_bc_tex));
1750bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	tex.inst = opcode;
175133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.resource_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index;
175233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.sampler_id = tex.resource_id;
1753641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
17546c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
175533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_x = 0;
175633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_y = 1;
175733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_z = 2;
175833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_w = 3;
175933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_x = 0;
176033241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_y = 1;
176133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_z = 2;
176233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_w = 3;
17639a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
1764bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
1765bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_x = 1;
1766bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_y = 0;
1767bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_z = 3;
1768bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_w = 1;
1769bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1770bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
177101984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
177201984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
177301984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
17747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		tex.coord_type_z = 1;
177501984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_w = 1;
177601984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
1777bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1778bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D)
17795d5f693cefe452bd8bd7e45f8b5d7ed991ae5115Dave Airlie		tex.src_sel_w = 2;
1780bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1781bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	r = r600_bc_add_tex(ctx->bc, &tex);
1782bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (r)
1783bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		return r;
1784bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1785bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	/* add shadow ambient support  - gallium doesn't do it yet */
1786bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	return 0;
1787bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
178833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
178933241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
1790b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
1791b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
1792b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1794b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct r600_bc_alu alu;
1795b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
1796b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
1797b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
17987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
17997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
18007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
1801b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
1802b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
1803b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1804a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
1805921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
1806b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
18077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[0];
18087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
1809b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[1].neg = 1;
1810b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1811b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1812b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
1813b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1814b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1815b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
1816b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1817b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1818b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1819b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1820b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
1821b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	if (r)
1822b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		return r;
1823b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
1824b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
1825b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
1826b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1827a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
1828b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1829b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
18307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[2];
18317e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[2], i);
1832b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1833b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1834b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
1835b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1836b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1837b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
1838b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1839b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1840b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1841b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1842b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
1843b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	if (r)
1844b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		return r;
1845b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
1846b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
1847b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
1848b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1849a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1850b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
18517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0] = r600_src[0];
18527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
18537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[1];
18547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[1], i);
1855b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
1856b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
1857b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1858b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1859b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
1860b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1861b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1862b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1863b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1864b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1865b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1866b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	return tgsi_helper_copy(ctx, inst);
1867b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
1868b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
186987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
187087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
187187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
187287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct r600_bc_alu_src r600_src[3];
187387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct r600_bc_alu alu;
187487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int use_temp = 0;
187587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
187687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
187787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	r = tgsi_split_constant(ctx, r600_src);
187887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	if (r)
187987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		return r;
188087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
188187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
188287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		use_temp = 1;
188387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
188487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	for (i = 0; i < 4; i++) {
188587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1886a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE);
188787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[0] = r600_src[0];
188887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
188987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
189087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[1] = r600_src[2];
189187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[1].chan = tgsi_chan(&inst->Src[2], i);
189287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
189387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[2] = r600_src[1];
189487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[2].chan = tgsi_chan(&inst->Src[1], i);
189587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
189687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (use_temp)
189787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.dst.sel = ctx->temp_reg;
189887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		else {
189987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
190087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			if (r)
190187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie				return r;
190287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		}
190387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
190487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
190587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
190687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (i == 3)
190787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
190887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
190987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
191087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
191187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	}
191287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	if (use_temp)
191387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		return tgsi_helper_copy(ctx, inst);
191487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
191587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
191687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
19170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
19180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
19190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
19200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct r600_bc_alu_src r600_src[3];
19210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct r600_bc_alu alu;
19220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
19230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
19240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
19250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
19260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
19270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
19280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
19290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (r)
19300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return r;
19310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
19320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
19330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1934a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
19350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
19360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[0] = r600_src[0];
19370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
19380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
19390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 2);
19400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
19410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
19420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
19430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
19440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
19450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
19460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
19470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
19480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
19490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
19500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
19510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
19520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[1] = r600_src[1];
19530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
19540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
19550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 1);
19560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
19570e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
19580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 2);
19590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
19600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
19610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 0);
19620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
19630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
19640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
19650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
19660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
19670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
19680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
19690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
19700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
19710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
19720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
19730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
19740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
19750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
19760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
19771e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck
19781e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
19791e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck		if (r)
19801e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck			return r;
19810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
19820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
19830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
19840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1985a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
19860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
19870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[0] = r600_src[0];
19880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
19890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
19900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
19910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
19920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
19930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 2);
19940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
19950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
19960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
19970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
19980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
19990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
20000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
20010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
20020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
20030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[1] = r600_src[1];
20040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
20050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
20060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 2);
20070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
20080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
20090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 0);
20100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
20110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
20120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 1);
20130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
20140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
20150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
20160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
20170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
20180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
20190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
20200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
20210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
20220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
20230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
20240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
20250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		else {
20260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
20270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			if (r)
20280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie				return r;
20290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
20300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
20310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
20320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
20330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
20340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
20350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
20360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
20370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
20381e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck
20391e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
20401e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck		if (r)
20411e28dd4ebe73f85cdc38a6bdaeef23fd10223cf3Tilman Sauerbeck			return r;
20420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
20430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
20440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
20450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
20460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
20470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
204836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx)
204936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{
205036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
205136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct r600_bc_alu_src r600_src[3];
205236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct r600_bc_alu alu;
205309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int r;
205436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
205536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.x = 2^floor(src); */
205636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if (inst->Dst[0].Register.WriteMask & 1) {
205736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
205836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2059a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
206036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
206136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
206236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
206336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
206436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
206536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
206636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
206736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
206836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
206936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
207036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
207136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
207236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
207336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
20745ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
20755ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
20765ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
20775ea238b7991331c854e66a16911d616d36965dc9Dave Airlie
2078a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
207936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
208036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
208136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
208236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
208336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
208436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
208536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
208636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
208736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
208836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
20895ea238b7991331c854e66a16911d616d36965dc9Dave Airlie
20905ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
20915ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
20925ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
209336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
209436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
209536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.y = tmp - floor(tmp); */
209636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
209736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
209836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2099a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
210036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0] = r600_src[0];
210136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
210236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
210336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
210436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
210536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
210636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
210736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
210836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//		if (r)
210936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//			return r;
211036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
211136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 1;
211236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
211336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
211436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
211536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
211636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
211736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
21185ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
21195ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
21205ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
212136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
212236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
212336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.z = RoughApprox2ToX(tmp);*/
212436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
212536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
2126a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
212736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
212836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
212936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
213036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
213136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
213236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
213336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
213436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 2;
213536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
213636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
213736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
213836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
213936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
214036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
21415ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
21425ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
21435ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
214436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
214536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
214636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.w = 1.0;*/
214736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
214836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
214936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2150a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
215136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_1;
215236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
215336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
215436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
215536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 3;
215636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
215736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
215836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
215936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
216036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
21615ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
21625ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
21635ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
216436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
216536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	return tgsi_helper_copy(ctx, inst);
216636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie}
216787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
2168460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx)
2169460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{
2170460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2171460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct r600_bc_alu alu;
2172460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	int r;
2173460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2174460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.x = floor(log2(src)); */
2175460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & 1) {
2176460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2177460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2178460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
2179460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
2180460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2181460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2182460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2183460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
2184460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2185460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2186460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
2187460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2188460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2189460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2190460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2191460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2192460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2193460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2194460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2195460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2196460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2197460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
2198460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
2199460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2200460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2201460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2202460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
2203460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2204460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2205460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2206460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2207460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2208460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2209460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2210460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2211460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2212460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2213460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2214460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
221596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck	/* result.y = src.x / (2 ^ floor(log2(src.x))); */
2216460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
2217460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2218460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
221996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
222096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
222196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
222296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
222396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
222496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
222596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
222696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
222796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
222896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
222996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
223096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
223196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
223296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
223396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
223496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
223596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
223696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
223796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
223896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
223996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
224096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
224196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
224296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
224396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
224496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
224596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
224696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
224796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
224896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
224996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
225096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
225196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
225296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
225396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
225496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
225596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
225696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
225796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
225896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
225996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
226096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
226196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
226296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
226396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
226496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
226596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
226696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
226796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
226896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
226996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
227096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
227196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
227296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
227396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
227496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
227596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
227696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
227796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
227896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
227996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
228096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
228196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = 1;
228296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
228396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
228496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.chan = 1;
228596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.dst.write = 1;
228696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.last = 1;
228796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
228896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
228996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
229096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
229196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
229296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
229396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
229496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
229596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
229696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
229796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
229896a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
229996a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
230096a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
230196a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		if (r)
230296a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck			return r;
230396a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
230496a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
230596a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck
230696a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].sel = ctx->temp_reg;
230796a4edb8ccb4bc1125918b972e8b3a080f496d0dTilman Sauerbeck		alu.src[1].chan = 1;
2308460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2309460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2310460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 1;
2311460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2312460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2313460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2314460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2315460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2316460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2317460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2318460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2319460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2320460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2321460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2322460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2323460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.z = log2(src);*/
2324460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 2) & 1) {
2325460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2326460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2327460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
2328460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
2329460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2330460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2331460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2332460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
2333460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2334460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2335460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2336460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 2;
2337460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2338460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2339460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2340460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2341460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2342460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2343460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2344460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2345460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2346460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2347460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2348460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.w = 1.0; */
2349460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 3) & 1) {
2350460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2351460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2352460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2353460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
2354460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2355460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2356460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2357460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 3;
2358460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2359460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2360460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2361460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2362460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2363460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2364460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2365460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2366460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2367460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2368460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2369460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2370460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	return tgsi_helper_copy(ctx, inst);
2371460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck}
2372460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
237350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie/* r6/7 only for now */
237447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airliestatic int tgsi_arl(struct r600_shader_ctx *ctx)
237547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{
237647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	/* TODO from r600c, ar values don't persist between clauses */
237747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
237847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct r600_bc_alu alu;
237947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	int r;
238047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
238147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
238247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_FLOOR;
238347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
238447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
238547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (r)
238647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		return r;
238747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
238847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
238947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	alu.last = 1;
239047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
2391a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU));
239247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (r)
239347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		return r;
2394c5edfcc410bdf3dbe4f37418de8f0009746c9578Dave Airlie	ctx->bc->cf_last->r6xx_uses_waterfall = 1;
239547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	return 0;
239647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie}
239747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
239857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx)
239957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{
240057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
240157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct r600_bc_alu alu;
240257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	int i, r = 0;
240357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
240457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	for (i = 0; i < 4; i++) {
240557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
240657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2407a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
240857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
240957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
241057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
241157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
241257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	        if (i == 0 || i == 3) {
241357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_1;
241457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
241557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
241657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			if (r)
241757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie				return r;
241857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
241957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
242057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
242157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	        if (i == 0 || i == 2) {
242257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
242357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
242457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			r = tgsi_src(ctx, &inst->Src[1], &alu.src[1]);
242557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			if (r)
242657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie				return r;
242757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], i);
242857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
242957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (i == 3)
243057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.last = 1;
243157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
243257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
243357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
243457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	}
243557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	return 0;
243657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie}
243757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2438a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
2439a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2440a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
244109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_bc_alu alu;
2442a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	int r;
2443a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2444a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
2445a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.inst = opcode;
2446a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.predicate = 1;
2447a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2448a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.sel = ctx->temp_reg;
2449a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.write = 1;
2450a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.chan = 0;
2451a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2452a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
2453a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
2454a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
2455a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
2456a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].sel = V_SQ_ALU_SRC_0;
2457a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].chan = 0;
2458a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2459a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.last = 1;
2460a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2461a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
2462a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
2463a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
2464a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2465a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2466a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2467a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops)
2468a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2469a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
2470a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = pops;
2471a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2472a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2473a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
247409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
2475a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
247609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch(reason) {
247709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
247809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current--;
247909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
248009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
248109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
248209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
248309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
248409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
248509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		/* TOODO : for 16 vp asic should -= 2; */
248609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current --;
248709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
248809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
248909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2490a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
249109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
249209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
249309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (check_max_only) {
249409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		int diff;
249509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		switch (reason) {
249609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_VPM:
249709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 1;
249809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
249909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_WQM:
250009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 4;
250109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
2502a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee		default:
2503a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			assert(0);
2504a712e193a3f58f4f40402c34adf16de255afa760Vinson Lee			diff = 0;
250509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
250609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
250709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		    ctx->bc->callstack[ctx->bc->call_sp].max) {
250809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].max =
250909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie				ctx->bc->callstack[ctx->bc->call_sp].current + diff;
251009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
251109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return;
251209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
251309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch (reason) {
251409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
251509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
251609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
251709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
251809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
251909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current += 4;
252009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
252109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
252209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
252309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
252409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
252509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
252609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
252709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	    ctx->bc->callstack[ctx->bc->call_sp].max) {
252809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].max =
252909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].current;
253009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
253109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
253209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
253309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
253409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
253509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
253609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
253709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid = (struct r600_bc_cf **)realloc((void *)sp->mid,
253809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie						sizeof(struct r600_bc_cf *) * (sp->num_mid + 1));
253909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid[sp->num_mid] = ctx->bc->cf_last;
254009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid++;
254109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2542a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
254309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
254409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2545a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp++;
254609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
254709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
254809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
254909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
255009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx)
255109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
255209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
255309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (sp->mid) {
255409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		free(sp->mid);
255509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		sp->mid = NULL;
255609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
255709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid = 0;
255809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->start = NULL;
255909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->type = 0;
256009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_sp--;
256109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
256209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
256309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0
256409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx)
256509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
256609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_RETURN);
256709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
256809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
256909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
257009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
257109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
257209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2573a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP);
257409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = pops;
257509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO work out offset */
257609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
257709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2578a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
257909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
258009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
258109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
258209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
258309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
258409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx)
258509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
258609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
258709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
258809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
258909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
259009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
259109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
259209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_jump_to_offset(ctx, 1, 4);
259309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
259409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, ifidx + 1);
259509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_return(ctx);
259609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
259709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
259809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
259909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
260009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
260109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
260209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
260309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
260409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
260509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fc_sp);
260609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
260709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
260809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
260909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif
261009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
261109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx)
261209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2613a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE));
261409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2615a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
261609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
261709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_IF);
261809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
261909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
2620a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2621a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2622a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2623a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx)
2624a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2625a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE));
2626a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = 1;
2627a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
262809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, ctx->bc->fc_sp);
2629a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
2630a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2631a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2632a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2633a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx)
2634a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2635a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	pops(ctx, 1);
2636a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
2637a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		R600_ERR("if/endif unbalanced in shader\n");
2638a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return -1;
2639a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
2640a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2641a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
2642a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
2643a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
2644a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	} else {
264509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
2646a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
264709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
264809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
264909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_PUSH_VPM);
265009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
265109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
265209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
265309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx)
265409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2655a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL));
265609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
265709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_LOOP);
2658a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
265909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* check stack depth */
266009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_LOOP, 0);
266109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
266209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
266309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
266409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx)
266509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
266609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int i;
266709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2668a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END));
266909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
267009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
267109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("loop/endloop in shader code are not paired.\n");
267209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
267309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
267409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
267509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* fixup loop pointers - from r600isa
267609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP END points to CF after LOOP START,
267709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP START point to CF after LOOP END
267809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   BRK/CONT point to LOOP END CF
267909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	*/
268009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
268109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
268209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
268309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
268409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
268509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
268609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
268709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO add LOOPRET support */
268809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
268909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_LOOP);
269009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
269109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
269209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
269309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
269409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
269509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	unsigned int fscp;
269609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
269709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
269809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{
269909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
270009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
270109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
270209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
270309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (fscp == 0) {
270409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("Break not inside loop/endloop pair\n");
270509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
270609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
270709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
270809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
270909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
271009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
271109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fscp);
271209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
271309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
271409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 1);
2715a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2716a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2717a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2718de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
271947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_arl},
2720de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
27210bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
2722df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
2723df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	/* FIXME:
2724df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * For state trackers other than OpenGL, we'll want to use
2725df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 * _RECIP_IEEE instead.
2726df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	 */
2727df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_CLAMPED, tgsi_trans_srcx_replicate},
2728df62338c491f2cace1a48f99de78e83b5edd82fdTilman Sauerbeck
272942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq},
273036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
2731460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
2732de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
2733de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
2734cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
2735cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
273657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
2737dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
2738de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
2739d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
2740be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
2741de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
2742de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
2743b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
2744de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2745de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2746de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2747de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2748de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2749de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2750de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
27513af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
2752de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
27533af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
2754de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
27557e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
27564558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
2757a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
27580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
2759de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2760de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
27617a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
2762de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2763e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
276488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
27653af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
27663af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
27674502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
2768de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2769de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2770de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2771de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2772de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
27730d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
2774de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
27750d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
277688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
2777d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
27780d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
2779de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2780b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
2781de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2782b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
2783de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2784de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2785de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2786de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2787de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2788de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2789de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2790de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2791de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2792de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
27930d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
279487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
279592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
2796d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
2797de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2798de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2799cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
2800de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
280109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BRK,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
2802a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
2803de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2804de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2805de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2806a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
2807a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
2808de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2809de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2810de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2811de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2812de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2813de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2814de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2815de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
28164558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate},
2817de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2818de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2819de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2820de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2821de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2822de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2823de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2824de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2825de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2826de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
282709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_CONT,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
2828de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2829de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
283009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
2831de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
283209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
2833de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2834de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2835de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2836de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2837de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2838de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2839de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2840de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2841de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2842de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2843de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2844de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2845de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2846de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2847de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2848de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2849094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
2850de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
2851de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2852de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2853de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2854de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2855de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2856de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2857de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2858de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2859de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2860de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2861de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2862de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2863de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2864de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2865de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2866de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2867de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2868de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2869de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2870de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2871de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2872de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2873de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2874de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2875de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2876de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2877de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2878de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2879de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2880de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
288150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie
288250526e094f4c66957c7f74c190c35903bc82fb62Dave Airliestatic struct r600_shader_tgsi_instruction eg_shader_tgsi_instruction[] = {
288350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
288450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
288550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
288650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
288750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RSQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE, tgsi_trans_srcx_replicate},
288850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EXP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
288950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LOG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
289050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
289150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
289250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP3,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
289350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
289450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
289550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
289650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
289750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
289850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
289950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MAD,	1, EG_V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
290050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
290150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LRP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
290250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
290350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
290450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{20,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
290550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2A,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
290650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
290750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{22,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
290850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{23,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
290950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FRC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
291050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CLAMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
291150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_FLR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
291250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ROUND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
291350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EX2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
291450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LG2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
291550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POW,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
291650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XPD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
291750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
291850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{32,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
291950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ABS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
292050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RCC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
292150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DPH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
292250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_COS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
292350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
292450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
292550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KILP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
292650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
292750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
292850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
292950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PK4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
293050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
293150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
293250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SFL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
293350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SGT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
293450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
293550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SLE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
293650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
293750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_STR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
293850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
293950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
294050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
294150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2H,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
294250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP2US,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
294350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4B,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
294450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UP4UB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
294550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_X2D,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
294650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
294750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ARR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
294850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
294950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CAL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
295050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_RET,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
295150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SSG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
295250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CMP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
295350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SCS,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
295450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
295550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
295650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
295750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DP2,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
295850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
295950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BRK,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
296050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
296150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
296250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{75,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
296350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{76,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
296450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ELSE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
296550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDIF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
296650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
296750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{79,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
296850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{80,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
296950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_PUSHA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
297050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_POPA,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
297150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CEIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
297250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_I2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
297350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
297450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TRUNC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate},
297550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SHL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
297650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
297750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{88,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
297850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_AND,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
297950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_OR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
298050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_MOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
298150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_XOR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
298250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
298350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXF,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
298450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_TXQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
298550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CONT,	0, EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
298650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_EMIT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
298750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDPRIM,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
298850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
298950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BGNSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
299050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
299150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSUB,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
299250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
299350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{103,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
299450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{104,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
299550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{105,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
299650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{106,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
299750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NOP,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
299850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
299950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{108,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
300050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{109,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
300150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{110,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
300250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{111,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
300350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_NRM4,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
300450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CALLNZ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
300550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IFC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
300650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_BREAKC,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
300750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_KIL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
300850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_END,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
300950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	/* gap */
301050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{118,			0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
301150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2I,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
301250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
301350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
301450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_IMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
301550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_INEG,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
301650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
301750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
301850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ISLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
301950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_F2U,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
302050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_U2F,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
302150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UADD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
302250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UDIV,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
302350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
302450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMAX,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
302550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMIN,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
302650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMOD,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
302750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_UMUL,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
302850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USEQ,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
302950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USGE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
303050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USHR,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
303150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USLT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
303250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_USNE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
303350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_SWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
303450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_CASE,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
303550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_DEFAULT,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
303650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_ENDSWITCH,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
303750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie	{TGSI_OPCODE_LAST,	0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
303850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie};
3039