r600_shader.c revision 460c5304aba646143938b76d536a6fc13a302ca8
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;
54be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	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
642b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[];
65de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader);
6642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx);
67de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
68de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int r600_shader_update(struct pipe_context *ctx, struct r600_shader *shader)
69de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
70de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_context *rctx = r600_context(ctx);
71de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	const struct util_format_description *desc;
72de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	enum pipe_format resource_format[160];
73de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i, nresources = 0;
74de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc *bc = &shader->bc;
75de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_cf *cf;
76de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_vtx *vtx;
77de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
78de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (shader->processor_type != TGSI_PROCESSOR_VERTEX)
79de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return 0;
80de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < rctx->vertex_elements->count; i++) {
81de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		resource_format[nresources++] = rctx->vertex_elements->elements[i].src_format;
82de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
83de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	LIST_FOR_EACH_ENTRY(cf, &bc->cf, list) {
84de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (cf->inst) {
85de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case V_SQ_CF_WORD1_SQ_CF_INST_VTX:
86de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case V_SQ_CF_WORD1_SQ_CF_INST_VTX_TC:
87de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			LIST_FOR_EACH_ENTRY(vtx, &cf->vtx, list) {
88de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				desc = util_format_description(resource_format[vtx->buffer_id]);
89de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				if (desc == NULL) {
90de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse					R600_ERR("unknown format %d\n", resource_format[vtx->buffer_id]);
91de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse					return -EINVAL;
92de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				}
93de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				vtx->dst_sel_x = desc->swizzle[0];
94de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				vtx->dst_sel_y = desc->swizzle[1];
95de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				vtx->dst_sel_z = desc->swizzle[2];
96de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				vtx->dst_sel_w = desc->swizzle[3];
97de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
98de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
99de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
100de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
101de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
102de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
103de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r600_bc_build(&shader->bc);
104de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
105de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
1066f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisseint r600_pipe_shader_create(struct pipe_context *ctx,
1076f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse			struct r600_context_state *rpshader,
1086f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse			const struct tgsi_token *tokens)
109de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
110de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_screen *rscreen = r600_screen(ctx->screen);
111de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int r;
112de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
11336efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse//fprintf(stderr, "--------------------------------------------------------------\n");
11436efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse//tgsi_dump(tokens, 0);
115de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (rpshader == NULL)
1166f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		return -ENOMEM;
117de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	rpshader->shader.family = radeon_get_family(rscreen->rw);
118d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie	rpshader->shader.use_mem_constant = rscreen->use_mem_constant;
119de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_shader_from_tgsi(tokens, &rpshader->shader);
120de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r) {
121de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("translation from TGSI failed !\n");
1226f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		return r;
123de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
124de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_bc_build(&rpshader->shader.bc);
125de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r) {
126de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("building bytecode failed !\n");
1276f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse		return r;
128de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
12936efb86c0570d86d8dfce87fd2416125e0e91b40Jerome Glisse//fprintf(stderr, "______________________________________________________________\n");
1306f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisse	return 0;
131de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
13272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
1336f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader_vs(struct pipe_context *ctx, struct r600_context_state *rpshader)
13472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
1359ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie	struct r600_context *rctx = r600_context(ctx);
13672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct radeon_state *state;
13772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
13867234b4b42a8285a9b14da48dd113cbe2ee871fdJerome Glisse	state = &rpshader->rstate[0];
13967234b4b42a8285a9b14da48dd113cbe2ee871fdJerome Glisse	radeon_state_fini(&rpshader->rstate[0]);
1409ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie
1419ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie	return rctx->vtbl->vs_shader(rctx, rpshader, state);
14272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
14372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
1446f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader_ps(struct pipe_context *ctx, struct r600_context_state *rpshader)
14572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
146457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	struct r600_context *rctx = r600_context(ctx);
14772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct radeon_state *state;
14872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
14967234b4b42a8285a9b14da48dd113cbe2ee871fdJerome Glisse	state = &rpshader->rstate[0];
15066e4cb1cd5a55402606a09417349d2be8b009e89Jerome Glisse	radeon_state_fini(state);
1515f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie
1529ef1c51be16ea360481cf9f82ebb1e3eb01efb18Dave Airlie	return rctx->vtbl->ps_shader(rctx, rpshader, state);
15372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
15472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
1556f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glissestatic int r600_pipe_shader(struct pipe_context *ctx, struct r600_context_state *rpshader)
15672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
157ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_screen *rscreen = r600_screen(ctx->screen);
158ffd0a2e215d83222f5e1e148b8e7cddeac6025d2Marek Olšák	struct r600_context *rctx = r600_context(ctx);
15972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	struct r600_shader *rshader = &rpshader->shader;
16072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	int r;
16172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
16272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	/* copy new shader */
16372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	radeon_bo_decref(rscreen->rw, rpshader->bo);
16472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rpshader->bo = NULL;
165de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	rpshader->bo = radeon_bo(rscreen->rw, 0, rshader->bc.ndw * 4,
16672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse				4096, NULL);
16772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (rpshader->bo == NULL) {
16872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		return -ENOMEM;
16972128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
17072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	radeon_bo_map(rscreen->rw, rpshader->bo);
171de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	memcpy(rpshader->bo->data, rshader->bc.bytecode, rshader->bc.ndw * 4);
17272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	radeon_bo_unmap(rscreen->rw, rpshader->bo);
17372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	/* build state */
17472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	rshader->flat_shade = rctx->flat_shade;
175de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (rshader->processor_type) {
176de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_PROCESSOR_VERTEX:
17772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		r = r600_pipe_shader_vs(ctx, rpshader);
17872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
179de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_PROCESSOR_FRAGMENT:
18072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		r = r600_pipe_shader_ps(ctx, rpshader);
18172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
18272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	default:
18372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		r = -EINVAL;
18472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		break;
18572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
18672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	return r;
18772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
18872128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
1896f0f6c64596b7bbbfa96e8af6715565e37efa91eJerome Glisseint r600_pipe_shader_update(struct pipe_context *ctx, struct r600_context_state *rpshader)
19072128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
191de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_context *rctx = r600_context(ctx);
19272128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	int r;
19372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
19472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	if (rpshader == NULL)
195de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
196de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* there should be enough input */
197de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (rctx->vertex_elements->count < rpshader->shader.bc.nresource) {
198de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("%d resources provided, expecting %d\n",
199de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			rctx->vertex_elements->count, rpshader->shader.bc.nresource);
200de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
20172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
202de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_shader_update(ctx, &rpshader->shader);
203de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r)
204de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return r;
205de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r600_pipe_shader(ctx, rpshader);
206de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
207de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
208de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_is_supported(struct r600_shader_ctx *ctx)
209de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
210de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *i = &ctx->parse.FullToken.FullInstruction;
211de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int j;
212de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
213de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.NumDstRegs > 1) {
214de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("too many dst (%d)\n", i->Instruction.NumDstRegs);
215de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
21672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
217de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Predicate) {
218de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("predicate unsupported\n");
219de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
220c6131879eb7dfdf26cd068109f6680608d608ab4Jerome Glisse	}
221a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#if 0
222de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (i->Instruction.Label) {
223de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("label unsupported\n");
224de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
22572128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse	}
226a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie#endif
227de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumSrcRegs; j++) {
22847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		if (i->Src[j].Register.Dimension ||
229de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			i->Src[j].Register.Absolute) {
23047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie			R600_ERR("unsupported src %d (dimension %d|absolute %d)\n", j,
23147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie				 i->Src[j].Register.Dimension,
23247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie				 i->Src[j].Register.Absolute);
233de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
234de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
235de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
236de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (j = 0; j < i->Instruction.NumDstRegs; j++) {
23747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		if (i->Dst[j].Register.Dimension) {
23847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie			R600_ERR("unsupported dst (dimension)\n");
239de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return -EINVAL;
240de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
241de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
242de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
24372128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
24472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
245de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_declaration(struct r600_shader_ctx *ctx)
24672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
247de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration;
248de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_vtx vtx;
249de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned i;
250de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int r;
25172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
252de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	switch (d->Declaration.File) {
253de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_INPUT:
254de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->ninput++;
255de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].name = d->Semantic.Name;
256de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].sid = d->Semantic.Index;
25735e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->input[i].interpolate = d->Declaration.Interpolate;
258de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + i;
259de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (ctx->type == TGSI_PROCESSOR_VERTEX) {
260de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			/* turn input into fetch */
261de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			memset(&vtx, 0, sizeof(struct r600_bc_vtx));
262de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.inst = 0;
263de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.fetch_type = 0;
264de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.buffer_id = i;
265de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			/* register containing the index into the buffer */
266de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.src_gpr = 0;
267de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.src_sel_x = 0;
268de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.mega_fetch_count = 0x1F;
269de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_gpr = ctx->shader->input[i].gpr;
270de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_x = 0;
271de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_y = 1;
272de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_z = 2;
273de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			vtx.dst_sel_w = 3;
274de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = r600_bc_add_vtx(ctx->bc, &vtx);
275de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
276de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				return r;
277de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
278de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
279de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_OUTPUT:
280de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		i = ctx->shader->noutput++;
281de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].name = d->Semantic.Name;
282de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].sid = d->Semantic.Index;
283de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + i;
28435e044ab562b65aa53f9d9d7b5885e6a887774bbJerome Glisse		ctx->shader->output[i].interpolate = d->Declaration.Interpolate;
285de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
286de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_CONSTANT:
287de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	case TGSI_FILE_TEMPORARY:
28833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	case TGSI_FILE_SAMPLER:
28947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	case TGSI_FILE_ADDRESS:
290de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		break;
291de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	default:
292de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
293de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return -EINVAL;
294de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
295de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
29672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse}
29772128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
298be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int r600_get_temp(struct r600_shader_ctx *ctx)
299be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
300be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return ctx->temp_reg + ctx->max_driver_temp_used++;
301be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
302be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
303de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseint r600_shader_from_tgsi(const struct tgsi_token *tokens, struct r600_shader *shader)
30472128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse{
305de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_immediate *immediate;
306de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_shader_ctx ctx;
307c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	struct r600_bc_output output[32];
308457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	unsigned output_done, noutput;
309de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	unsigned opcode;
310de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, r = 0, pos0;
31172128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse
312de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.bc = &shader->bc;
313de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.shader = shader;
314de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r = r600_bc_init(ctx.bc, shader->family);
315de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (r)
316de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		return r;
317d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie	ctx.bc->use_mem_constant = shader->use_mem_constant;
318de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.tokens = tokens;
319de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_scan_shader(tokens, &ctx.info);
320de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_init(&ctx.parse, tokens);
321de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.type = ctx.parse.FullHeader.Processor.Processor;
322de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	shader->processor_type = ctx.type;
323de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
324de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* register allocations */
325076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	/* Values [0,127] correspond to GPR[0..127].
326076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [128,159] correspond to constant buffer bank 0
327076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [160,191] correspond to constant buffer bank 1
328076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * Values [256,511] correspond to cfile constants c[0..255].
329de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * Other special values are shown in the list below.
330076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 244  ALU_SRC_1_DBL_L: special constant 1.0 double-float, LSW. (RV670+)
331076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 245  ALU_SRC_1_DBL_M: special constant 1.0 double-float, MSW. (RV670+)
332076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 246  ALU_SRC_0_5_DBL_L: special constant 0.5 double-float, LSW. (RV670+)
333076c53879b90855ecf38602584f22e4ab6db7569Alex Deucher	 * 247  ALU_SRC_0_5_DBL_M: special constant 0.5 double-float, MSW. (RV670+)
334de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 248	SQ_ALU_SRC_0: special constant 0.0.
335de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 249	SQ_ALU_SRC_1: special constant 1.0 float.
336de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 250	SQ_ALU_SRC_1_INT: special constant 1 integer.
337de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 251	SQ_ALU_SRC_M_1_INT: special constant -1 integer.
338de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 252	SQ_ALU_SRC_0_5: special constant 0.5 float.
339de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 253	SQ_ALU_SRC_LITERAL: literal constant.
340de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 254	SQ_ALU_SRC_PV: previous vector result.
341de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 * 255	SQ_ALU_SRC_PS: previous scalar result.
342de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	 */
343de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < TGSI_FILE_COUNT; i++) {
344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[i] = 0;
345de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
346de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
347de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		ctx.file_offset[TGSI_FILE_INPUT] = 1;
348de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
349de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT] +
350de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_INPUT];
351de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_TEMPORARY] = ctx.file_offset[TGSI_FILE_OUTPUT] +
352de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse						ctx.info.file_count[TGSI_FILE_OUTPUT];
353d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie	if (ctx.shader->use_mem_constant)
354d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie		ctx.file_offset[TGSI_FILE_CONSTANT] = 128;
355d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie	else
356d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie		ctx.file_offset[TGSI_FILE_CONSTANT] = 256;
357d42efb9e8df6ef872ab4f142e3daf1b6cb9eff11Dave Airlie
358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.file_offset[TGSI_FILE_IMMEDIATE] = 253;
359de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	ctx.temp_reg = ctx.file_offset[TGSI_FILE_TEMPORARY] +
360de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			ctx.info.file_count[TGSI_FILE_TEMPORARY];
361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
362cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.nliterals = 0;
363cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	ctx.literals = NULL;
364cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen
365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	while (!tgsi_parse_end_of_tokens(&ctx.parse)) {
366de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		tgsi_parse_token(&ctx.parse);
367de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx.parse.FullToken.Token.Type) {
368de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_IMMEDIATE:
369de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			immediate = &ctx.parse.FullToken.FullImmediate;
370cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals = realloc(ctx.literals, (ctx.nliterals + 1) * 16);
371cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			if(ctx.literals == NULL) {
372cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				r = -ENOMEM;
373cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen				goto out_err;
374cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			}
375cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 0] = immediate->u[0].Uint;
376cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 1] = immediate->u[1].Uint;
377cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 2] = immediate->u[2].Uint;
378cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.literals[ctx.nliterals * 4 + 3] = immediate->u[3].Uint;
379cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen			ctx.nliterals++;
380de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
381de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_DECLARATION:
382de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_declaration(&ctx);
383de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
384de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
385de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
386de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_TOKEN_TYPE_INSTRUCTION:
387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = tgsi_is_supported(&ctx);
388de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
389de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
390be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			ctx.max_driver_temp_used = 0;
391be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			/* reserve first tmp for everyone */
392be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r600_get_temp(&ctx);
393de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			opcode = ctx.parse.FullToken.FullInstruction.Instruction.Opcode;
394de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
395de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = ctx.inst_info->process(&ctx);
396de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
397de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
3982b3b76a4a0e21eb4bd4f1a4da5ff6ed26ccbabd1Jerome Glisse			r = r600_bc_add_literal(ctx.bc, ctx.value);
399de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (r)
400de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
401de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
402de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
403de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported token type %d\n", ctx.parse.FullToken.Token.Type);
404de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
405de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
406de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
407de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
408de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* export output */
409457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	noutput = shader->noutput;
410457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0, pos0 = 0; i < noutput; i++) {
411c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		memset(&output[i], 0, sizeof(struct r600_bc_output));
412c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].gpr = shader->output[i].gpr;
413c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].elem_size = 3;
414c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_x = 0;
415c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_y = 1;
416c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_z = 2;
417c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].swizzle_w = 3;
418c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].barrier = 1;
419c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
420c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		output[i].array_base = i - pos0;
421a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
422457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		switch (ctx.type) {
423de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_VERTEX:
424de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
425c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 60;
426c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
427de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				/* position doesn't count in array_base */
428457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
429457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
430457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_PSIZE) {
431457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].array_base = 61;
432457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_POS;
433457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				/* position doesn't count in array_base */
434457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0++;
435de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
436de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
437de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_PROCESSOR_FRAGMENT:
438de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			if (shader->output[i].name == TGSI_SEMANTIC_COLOR) {
439b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse				output[i].array_base = shader->output[i].sid;
440c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
4415f6ab5e259de826bb3795d90fdb0235c8997acb9Dave Airlie			} else if (shader->output[i].name == TGSI_SEMANTIC_POSITION) {
442c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].array_base = 61;
443b87b6e5bf798fcfa486e8082a09b4425a40cf3c4Dave Airlie				output[i].swizzle_x = 2;
444b87b6e5bf798fcfa486e8082a09b4425a40cf3c4Dave Airlie				output[i].swizzle_y = output[i].swizzle_z = output[i].swizzle_w = 7;
445c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse				output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
446de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			} else {
447de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				R600_ERR("unsupported fragment output name %d\n", shader->output[i].name);
448de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				r = -EINVAL;
449de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse				goto out_err;
450de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
451de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
452de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
453de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			R600_ERR("unsupported processor type %d\n", ctx.type);
454de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			r = -EINVAL;
455de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
45672128962d640846472c1b0dc22cf4ac6ce875dc9Jerome Glisse		}
457457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	}
458457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add fake param output for vertex shader if no param is exported */
459457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_VERTEX) {
460457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		for (i = 0, pos0 = 0; i < noutput; i++) {
461457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			if (output[i].type == V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM) {
462457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				pos0 = 1;
463457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse				break;
464457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			}
465457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
466457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (!pos0) {
467457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			memset(&output[i], 0, sizeof(struct r600_bc_output));
468457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].gpr = 0;
469457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].elem_size = 3;
470457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_x = 0;
471457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_y = 1;
472457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_z = 2;
473457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].swizzle_w = 3;
474457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].barrier = 1;
475457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PARAM;
476457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].array_base = 0;
477457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].inst = V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT;
478457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			noutput++;
479de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
480c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
481481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	/* add fake pixel export */
482481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	if (ctx.type == TGSI_PROCESSOR_FRAGMENT && !noutput) {
483481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		memset(&output[0], 0, sizeof(struct r600_bc_output));
484481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].gpr = 0;
485481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].elem_size = 3;
486481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_x = 7;
487481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_y = 7;
488481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_z = 7;
489481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].swizzle_w = 7;
490481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].barrier = 1;
491608f749ec3fc655d3e67e572fa2e256a42c16878Jerome Glisse		output[0].type = V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL;
492481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		output[0].array_base = 0;
493a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		output[0].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT);
494481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse		noutput++;
495481b65abaedb271d0da24c75b8c60f7bcf6d8ce9Jerome Glisse	}
496457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* set export done on last export of each type */
497457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = noutput - 1, output_done = 0; i >= 0; i--) {
498457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		if (i == (noutput - 1)) {
499457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse			output[i].end_of_program = 1;
500457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse		}
501b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse		if (!(output_done & (1 << output[i].type))) {
502b474478f206c6d81af78696d3d5ce156d4d413d7Jerome Glisse			output_done |= (1 << output[i].type);
503a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			output[i].inst = BC_INST(ctx.bc, V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE);
504c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		}
505c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse	}
506457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	/* add output to bytecode */
507457378e031ffb89a2011604c7798a6f5f2142207Jerome Glisse	for (i = 0; i < noutput; i++) {
508c3ad060488ffd98f1c6dc9127b46324c5201f434Jerome Glisse		r = r600_bc_add_output(ctx.bc, &output[i]);
509de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
510de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			goto out_err;
511de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
512cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
513de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
515de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisseout_err:
516cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	free(ctx.literals);
517de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	tgsi_parse_free(&ctx.parse);
518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return r;
519de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_unsupported(struct r600_shader_ctx *ctx)
522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
523de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	R600_ERR("%d tgsi opcode unsupported\n", ctx->inst_info->tgsi_opcode);
524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return -EINVAL;
525de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
527de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_end(struct r600_shader_ctx *ctx)
528de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
529de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
530de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_src(struct r600_shader_ctx *ctx,
533de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_src_register *tgsi_src,
534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_src *r600_src)
535de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
536cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen	int index;
5377e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(r600_src, 0, sizeof(struct r600_bc_alu_src));
538de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel = tgsi_src->Register.Index;
539de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	if (tgsi_src->Register.File == TGSI_FILE_IMMEDIATE) {
540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r600_src->sel = 0;
541cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		index = tgsi_src->Register.Index;
542cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[0] = ctx->literals[index * 4 + 0];
543cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[1] = ctx->literals[index * 4 + 1];
544cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[2] = ctx->literals[index * 4 + 2];
545cd4bd4fb53f82361480f388923ef9e2fa7379d68Bas Nieuwenhuizen		ctx->value[3] = ctx->literals[index * 4 + 3];
546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
54747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_src->Register.Indirect)
54847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_src->rel = V_SQ_REL_RELATIVE;
5491bb0427a856ffa3fea1b177ea5b0395a00de3833Jerome Glisse	r600_src->neg = tgsi_src->Register.Negate;
550de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_src->sel += ctx->file_offset[tgsi_src->Register.File];
551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
552de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
554de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_dst(struct r600_shader_ctx *ctx,
555de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			const struct tgsi_full_dst_register *tgsi_dst,
556de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			unsigned swizzle,
557de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			struct r600_bc_alu_dst *r600_dst)
558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
5597a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
5607a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse
561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel = tgsi_dst->Register.Index;
562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->sel += ctx->file_offset[tgsi_dst->Register.File];
563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->chan = swizzle;
564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	r600_dst->write = 1;
56547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (tgsi_dst->Register.Indirect)
56647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		r600_dst->rel = V_SQ_REL_RELATIVE;
5677a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	if (inst->Instruction.Saturate) {
5687a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		r600_dst->clamp = 1;
5697a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	}
570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
571de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
572de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
5737e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic unsigned tgsi_chan(const struct tgsi_full_src_register *tgsi_src, unsigned swizzle)
5747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
5757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	switch (swizzle) {
5767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 0:
5777e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleX;
5787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 1:
5797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleY;
5807e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 2:
5817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleZ;
5827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	case 3:
5837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return tgsi_src->Register.SwizzleW;
5847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	default:
5857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return 0;
5867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
5877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
5887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
5897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glissestatic int tgsi_split_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3])
5907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
5917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
5927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
5937e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	int i, j, k, nconst, r;
5947e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
5957e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0, nconst = 0; i < inst->Instruction.NumSrcRegs; i++) {
5967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT) {
5977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			nconst++;
5987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
5997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_src(ctx, &inst->Src[i], &r600_src[i]);
6007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r) {
6017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
6027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
6037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
6047e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0, j = nconst - 1; i < inst->Instruction.NumSrcRegs; i++) {
6057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (inst->Src[j].Register.File == TGSI_FILE_CONSTANT && j > 0) {
606be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			int treg = r600_get_temp(ctx);
6077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			for (k = 0; k < 4; k++) {
6087e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				memset(&alu, 0, sizeof(struct r600_bc_alu));
609a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
6109bbc54a10d225679a180a085f7ca5bb88ee2bd15Dave Airlie				alu.src[0].sel = r600_src[j].sel;
6117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[0].chan = k;
612be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.sel = treg;
6137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.chan = k;
6147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.dst.write = 1;
6157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				if (k == 3)
6167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse					alu.last = 1;
6177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				r = r600_bc_add_alu(ctx->bc, &alu);
6187e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				if (r)
6197e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse					return r;
6207e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			}
621be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r600_src[j].sel = treg;
6227e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			j--;
6237e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		}
6247e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
6257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
6267e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
6277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
628be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie/* need to move any immediate into a temp - for trig functions which use literal for PI stuff */
629be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airliestatic int tgsi_split_literal_constant(struct r600_shader_ctx *ctx, struct r600_bc_alu_src r600_src[3])
630be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie{
631be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
632be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	struct r600_bc_alu alu;
633be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	int i, j, k, nliteral, r;
634be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
635be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0, nliteral = 0; i < inst->Instruction.NumSrcRegs; i++) {
636be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (inst->Src[i].Register.File == TGSI_FILE_IMMEDIATE) {
637be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			nliteral++;
638be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		}
639be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	}
640be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0, j = 0; i < inst->Instruction.NumSrcRegs; i++) {
641be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (inst->Src[j].Register.File == TGSI_FILE_IMMEDIATE) {
642be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			int treg = r600_get_temp(ctx);
643be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			for (k = 0; k < 4; k++) {
644be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				memset(&alu, 0, sizeof(struct r600_bc_alu));
645a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie				alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
646be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.src[0].sel = r600_src[j].sel;
647be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.src[0].chan = k;
648be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.sel = treg;
649be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.chan = k;
650be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				alu.dst.write = 1;
651be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				if (k == 3)
652be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie					alu.last = 1;
653be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				r = r600_bc_add_alu(ctx->bc, &alu);
654be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				if (r)
655be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie					return r;
656be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			}
657be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r = r600_bc_add_literal(ctx->bc, ctx->value);
658be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			if (r)
659be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie				return r;
660be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			r600_src[j].sel = treg;
661be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			j++;
662be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		}
663be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	}
664be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	return 0;
665be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie}
666be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
667d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_s(struct r600_shader_ctx *ctx, int swap)
668de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
669de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
6707e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
671de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
672de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
673d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	int lasti = 0;
674d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
675d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < 4; i++) {
676d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (inst->Dst[0].Register.WriteMask & (1 << i)) {
677d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			lasti = i;
678d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		}
679d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	}
680de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
6817e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
6827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
6837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
684d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	for (i = 0; i < lasti + 1; i++) {
685d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
686d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			continue;
687d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
688de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
689d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
690d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (r)
691d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			return r;
692d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
693d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		alu.inst = ctx->inst_info->r600_opcode;
694d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (!swap) {
695de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
6967e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j] = r600_src[j];
6977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
698de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			}
699d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		} else {
700d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[0] = r600_src[1];
701d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[1], i);
702d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
703d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[1] = r600_src[0];
704d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
705de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
706de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		/* handle some special cases */
707de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
708de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		case TGSI_OPCODE_SUB:
709de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.src[1].neg = 1;
710de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
7117a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse		case TGSI_OPCODE_ABS:
7127a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			alu.src[0].abs = 1;
7137a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse			break;
714de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		default:
715de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			break;
716de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
717d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie		if (i == lasti) {
718de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
719de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
720de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
721de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
722de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
723de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
724de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	return 0;
725de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
726de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
727d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2(struct r600_shader_ctx *ctx)
728d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
729d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 0);
730d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
731d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
732d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airliestatic int tgsi_op2_swap(struct r600_shader_ctx *ctx)
733d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie{
734d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	return tgsi_op2_s(ctx, 1);
735d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie}
736d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie
73788f5976484842671ecb2cefcfa91838a43032359Dave Airlie/*
73888f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r600 - trunc to -PI..PI range
73988f5976484842671ecb2cefcfa91838a43032359Dave Airlie * r700 - normalize by dividing by 2PI
74088f5976484842671ecb2cefcfa91838a43032359Dave Airlie * see fdo bug 27901
74188f5976484842671ecb2cefcfa91838a43032359Dave Airlie */
74292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_setup_trig(struct r600_shader_ctx *ctx,
74392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie			   struct r600_bc_alu_src r600_src[3])
74488f5976484842671ecb2cefcfa91838a43032359Dave Airlie{
74588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
74692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int r;
74788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	uint32_t lit_vals[4];
74892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
74992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
75088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(lit_vals, 0, 4*4);
75188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
75288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
75388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
754be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
755be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	r = tgsi_split_literal_constant(ctx, r600_src);
756be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	if (r)
757be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		return r;
758be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
75988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	lit_vals[0] = fui(1.0 /(3.1415926535 * 2));
76088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	lit_vals[1] = fui(0.5f);
76188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
76288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
763a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
76488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
76588f5976484842671ecb2cefcfa91838a43032359Dave Airlie
76688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
76788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
76888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
76988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
77088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0] = r600_src[0];
77188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
77288f5976484842671ecb2cefcfa91838a43032359Dave Airlie
773921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
77488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
775921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
77688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[2].chan = 1;
77788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
77888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
77988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
78088f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
78188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_literal(ctx->bc, lit_vals);
78288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
78388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
78488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
78588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
786a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
78788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
78888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
78988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
79088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
79188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
79288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
79388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
79488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
79588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
79688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
79788f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
79888f5976484842671ecb2cefcfa91838a43032359Dave Airlie
79988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (ctx->bc->chiprev == 0) {
80088f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[0] = fui(3.1415926535897f * 2.0f);
80188f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[1] = fui(-3.1415926535897f);
80288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	} else {
80388f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[0] = fui(1.0f);
80488f5976484842671ecb2cefcfa91838a43032359Dave Airlie		lit_vals[1] = fui(-0.5f);
80588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
80688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
80788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
808a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
80988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.is_op3 = 1;
81088f5976484842671ecb2cefcfa91838a43032359Dave Airlie
81188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
81288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
81388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
81488f5976484842671ecb2cefcfa91838a43032359Dave Airlie
81588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
81688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
81788f5976484842671ecb2cefcfa91838a43032359Dave Airlie
818921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel = V_SQ_ALU_SRC_LITERAL;
81988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[1].chan = 0;
820921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
82188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[2].chan = 1;
82288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
82388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
82488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
82588f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
82688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_literal(ctx->bc, lit_vals);
82788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
82888f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
82992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
83092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
83192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
83292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_trig(struct r600_shader_ctx *ctx)
83392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
83492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
83592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu_src r600_src[3];
83692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
83792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int i, r;
838be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	int lasti = 0;
83992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
84092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	r = tgsi_setup_trig(ctx, r600_src);
84192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
84292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
84388f5976484842671ecb2cefcfa91838a43032359Dave Airlie
84488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
84588f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.inst = ctx->inst_info->r600_opcode;
84688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.chan = 0;
84788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.sel = ctx->temp_reg;
84888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.dst.write = 1;
84988f5976484842671ecb2cefcfa91838a43032359Dave Airlie
85088f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].sel = ctx->temp_reg;
85188f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.src[0].chan = 0;
85288f5976484842671ecb2cefcfa91838a43032359Dave Airlie	alu.last = 1;
85388f5976484842671ecb2cefcfa91838a43032359Dave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
85488f5976484842671ecb2cefcfa91838a43032359Dave Airlie	if (r)
85588f5976484842671ecb2cefcfa91838a43032359Dave Airlie		return r;
85688f5976484842671ecb2cefcfa91838a43032359Dave Airlie
85788f5976484842671ecb2cefcfa91838a43032359Dave Airlie	/* replicate result */
85888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	for (i = 0; i < 4; i++) {
859be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (inst->Dst[0].Register.WriteMask & (1 << i))
860be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			lasti = i;
861be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	}
862be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie	for (i = 0; i < lasti + 1; i++) {
863be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (!(inst->Dst[0].Register.WriteMask & (1 << i)))
864be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie			continue;
865be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
86688f5976484842671ecb2cefcfa91838a43032359Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
867a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
868be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie
869be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		alu.src[0].sel = ctx->temp_reg;
87088f5976484842671ecb2cefcfa91838a43032359Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
87188f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
87288f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
873be7816f2b7f0b064a47fb3f101477ad5dba74017Dave Airlie		if (i == lasti)
87488f5976484842671ecb2cefcfa91838a43032359Dave Airlie			alu.last = 1;
87588f5976484842671ecb2cefcfa91838a43032359Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
87688f5976484842671ecb2cefcfa91838a43032359Dave Airlie		if (r)
87788f5976484842671ecb2cefcfa91838a43032359Dave Airlie			return r;
87888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	}
87988f5976484842671ecb2cefcfa91838a43032359Dave Airlie	return 0;
88088f5976484842671ecb2cefcfa91838a43032359Dave Airlie}
88188f5976484842671ecb2cefcfa91838a43032359Dave Airlie
88292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airliestatic int tgsi_scs(struct r600_shader_ctx *ctx)
88392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie{
88492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
88592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu_src r600_src[3];
88692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	struct r600_bc_alu alu;
88792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	int r;
88892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
88992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	r = tgsi_setup_trig(ctx, r600_src);
89092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
89192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
89292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
89392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
89492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.x = COS */
89592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
896a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS);
89792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
89892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
89992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
90092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
90192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	alu.src[0].sel = ctx->temp_reg;
90292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	alu.src[0].chan = 0;
90392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	alu.last = 1;
90492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
90592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
90692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
90792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
90892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	/* dst.y = SIN */
90992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
910a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN);
91192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
91292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
91392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
91492f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
91592f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	alu.src[0].sel = ctx->temp_reg;
91692f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	alu.src[0].chan = 0;
91792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	alu.last = 1;
91892f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	r = r600_bc_add_alu(ctx->bc, &alu);
91992f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	if (r)
92092f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie		return r;
92192f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	return 0;
92292f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie}
92392f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie
924094d66f45992830929d620782c70836b4b9b4a37Jerome Glissestatic int tgsi_kill(struct r600_shader_ctx *ctx)
925094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse{
926094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
927094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	struct r600_bc_alu alu;
928094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	int i, r;
929094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
930094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	for (i = 0; i < 4; i++) {
931094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
932094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
9334502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
934094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		alu.dst.chan = i;
9354502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
936921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_0;
9374502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
9384502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		if (ctx->inst_info->tgsi_opcode == TGSI_OPCODE_KILP) {
9394502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
9404502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].neg = 1;
9414502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		} else {
9424502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]);
9434502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			if (r)
9444502b17901ad491e0598ee59a12d372c008ae03bDave Airlie				return r;
9454502b17901ad491e0598ee59a12d372c008ae03bDave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
9464502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		}
947094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (i == 3) {
948094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			alu.last = 1;
949094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		}
950094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
951094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse		if (r)
952094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse			return r;
953094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	}
9544502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	r = r600_bc_add_literal(ctx->bc, ctx->value);
9554502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	if (r)
9564502b17901ad491e0598ee59a12d372c008ae03bDave Airlie		return r;
9574502b17901ad491e0598ee59a12d372c008ae03bDave Airlie
9584502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	/* kill must be last in ALU */
9594502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->bc->force_add_cf = 1;
9604502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	ctx->shader->uses_kill = TRUE;
961094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	return 0;
962094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse}
963094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse
9640bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmidstatic int tgsi_lit(struct r600_shader_ctx *ctx)
9650bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid{
9660bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
9670bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	struct r600_bc_alu alu;
968ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	struct r600_bc_alu_src r600_src[3];
9690bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	int r;
9700bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
971ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
972ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	if (r)
973ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		return r;
974d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie	r = tgsi_split_literal_constant(ctx, r600_src);
975d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie	if (r)
976d3fa92584b109bf59dce32501eec73f8de74f42bDave Airlie		return r;
977ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie
9787e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.x, <- 1.0  */
9797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
980a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
981921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[0].sel  = V_SQ_ALU_SRC_1; /*1.0*/
9827e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
9837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 0, &alu.dst);
9847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
9857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
9867e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 0) & 1;
9877e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
9887e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
9897e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
9900bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
9917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.y = max(src.x, 0.0) */
9927e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
993a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX);
994ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie	alu.src[0] = r600_src[0];
995921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[1].sel  = V_SQ_ALU_SRC_0; /*0.0*/
99685e401d8bfd80450a31eac234e13008e33e64227Dave Airlie	alu.src[1].chan = 0;
9977e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 1, &alu.dst);
9987e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
9997e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
10007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 1) & 1;
10017e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
10027e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
10037e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
10040bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
10057e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	/* dst.w, <- 1.0  */
10067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1007a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1008921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	alu.src[0].sel  = V_SQ_ALU_SRC_1;
10097e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.src[0].chan = 0;
10107e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_dst(ctx, &inst->Dst[0], 3, &alu.dst);
10117e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
10127e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
10137e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.dst.write = (inst->Dst[0].Register.WriteMask >> 3) & 1;
10147e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	alu.last = 1;
10157e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
10167e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
10177e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
10180bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
10195ea238b7991331c854e66a16911d616d36965dc9Dave Airlie	r = r600_bc_add_literal(ctx->bc, ctx->value);
10205ea238b7991331c854e66a16911d616d36965dc9Dave Airlie	if (r)
10215ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		return r;
10225ea238b7991331c854e66a16911d616d36965dc9Dave Airlie
10230bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	if (inst->Dst[0].Register.WriteMask & (1 << 2))
10240bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{
10256a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int chan;
10266a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		int sel;
10276a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee
10280bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = log(src.y) */
10290bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
1030a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_CLAMPED);
1031ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[0] = r600_src[0];
1032ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
10330bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
10340bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
10350bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
10360bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
10370bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
10380bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
10390bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
10400bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
10415ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
10425ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
10435ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
104485e401d8bfd80450a31eac234e13008e33e64227Dave Airlie
10456a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		chan = alu.dst.chan;
10466a20539580e1b7ae921d497fbf66a8fd545efea4Vinson Lee		sel = alu.dst.sel;
10470bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
10480bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* tmp.x = amd MUL_LIT(src.w, dst.z, src.x ) */
10490bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
1050a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MUL_LIT);
1051ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[0] = r600_src[0];
10527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], 3);
10530bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].sel  = sel;
10540bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[1].chan = chan;
1055ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie
1056ee0153f891bb75ee14db579e6628d592032d6801Dave Airlie		alu.src[2] = r600_src[0];
10577e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[2].chan = tgsi_chan(&inst->Src[0], 0);
10580bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.sel = ctx->temp_reg;
10590bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.chan = 0;
10600bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.dst.write = 1;
10610bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.is_op3 = 1;
10620bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
10630bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
10640bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
10650bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
10660bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
10675ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
10685ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
10695ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
10700bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		/* dst.z = exp(tmp.x) */
10710bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		memset(&alu, 0, sizeof(struct r600_bc_alu));
1072a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
10730bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].sel = ctx->temp_reg;
10740bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.src[0].chan = 0;
10750bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = tgsi_dst(ctx, &inst->Dst[0], 2, &alu.dst);
10760bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
10770bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
10780bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		alu.last = 1;
10790bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		r = r600_bc_add_alu(ctx->bc, &alu);
10800bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid		if (r)
10810bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid			return r;
10820bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	}
10830bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	return 0;
10840bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid}
10850bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid
108642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeckstatic int tgsi_rsq(struct r600_shader_ctx *ctx)
108742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck{
108842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
108942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	struct r600_bc_alu alu;
109042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	int i, r;
109142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
109242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	memset(&alu, 0, sizeof(struct r600_bc_alu));
109342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIPSQRT_IEEE);
109442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
109542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]);
109642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		if (r)
109742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck			return r;
109842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		alu.src[i].chan = tgsi_chan(&inst->Src[i], 0);
109942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		alu.src[i].abs = 1;
110042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	}
110142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.sel = ctx->temp_reg;
110242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.dst.write = 1;
110342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	alu.last = 1;
110442c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	r = r600_bc_add_alu(ctx->bc, &alu);
110542c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
110642c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
110742c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	r = r600_bc_add_literal(ctx->bc, ctx->value);
110842c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	if (r)
110942c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck		return r;
111042c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	/* replicate result */
111142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	return tgsi_helper_tempx_replicate(ctx);
111242c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck}
111342c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck
11145cc2974dff346f3fa53881dbcc158e4563915487Jerome Glissestatic int tgsi_trans(struct r600_shader_ctx *ctx)
11155cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse{
11165cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
11175cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	struct r600_bc_alu alu;
11185cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	int i, j, r;
11195cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse
11205cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	for (i = 0; i < 4; i++) {
11215cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
11225cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		if (inst->Dst[0].Register.WriteMask & (1 << i)) {
11235cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			alu.inst = ctx->inst_info->r600_opcode;
11245cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
11257e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				r = tgsi_src(ctx, &inst->Src[j], &alu.src[j]);
11265cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				if (r)
11275cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse					return r;
11287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse				alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
11295cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			}
11305cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
11315cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			if (r)
11325cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				return r;
11335cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			alu.last = 1;
11345cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			r = r600_bc_add_alu(ctx->bc, &alu);
11355cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse			if (r)
11365cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse				return r;
11375cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse		}
11385cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	}
11395cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse	return 0;
11405cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse}
11415cc2974dff346f3fa53881dbcc158e4563915487Jerome Glisse
1142a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)
11437e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse{
11447e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
11457e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu alu;
1146a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
11477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
11487e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	for (i = 0; i < 4; i++) {
11497e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
11507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1151a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
11527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.chan = i;
11537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
11547e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
11557e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
11567e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.dst.write = (inst->Dst[0].Register.WriteMask >> i) & 1;
11577e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (i == 3)
11587e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.last = 1;
11597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
11607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		if (r)
11617e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			return r;
11627e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	}
11637e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	return 0;
11647e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse}
11657e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse
1166a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_trans_srcx_replicate(struct r600_shader_ctx *ctx)
1167a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1168a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1169a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1170a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int i, r;
1171a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1172a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1173a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.inst = ctx->inst_info->r600_opcode;
1174a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
1175a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		r = tgsi_src(ctx, &inst->Src[i], &alu.src[i]);
1176a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		if (r)
1177a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse			return r;
1178a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		alu.src[i].chan = tgsi_chan(&inst->Src[i], 0);
1179a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	}
1180a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1181a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1182a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1183a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1184a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1185a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
11865ea238b7991331c854e66a16911d616d36965dc9Dave Airlie	r = r600_bc_add_literal(ctx->bc, ctx->value);
11875ea238b7991331c854e66a16911d616d36965dc9Dave Airlie	if (r)
11885ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		return r;
1189a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* replicate result */
1190a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1191a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1192a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1193a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glissestatic int tgsi_pow(struct r600_shader_ctx *ctx)
1194a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse{
1195a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
1196a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	struct r600_bc_alu alu;
1197a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	int r;
1198a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
1199a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* LOG2(a) */
1200a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1201a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
1202a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
1203a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1204a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1205a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
1206a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1207a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1208a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1209a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1210a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1211a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1212e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	r = r600_bc_add_literal(ctx->bc,ctx->value);
1213e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	if (r)
1214e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen		return r;
1215a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* b * LOG2(a) */
1216a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1217a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL_IEEE);
1218a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = tgsi_src(ctx, &inst->Src[1], &alu.src[0]);
1219a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1220a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1221a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].chan = tgsi_chan(&inst->Src[1], 0);
1222a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[1].sel = ctx->temp_reg;
1223a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1224a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1225a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1226a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1227a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1228a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1229e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	r = r600_bc_add_literal(ctx->bc,ctx->value);
1230e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	if (r)
1231e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen		return r;
1232a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	/* POW(a,b) = EXP2(b * LOG2(a))*/
1233a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	memset(&alu, 0, sizeof(struct r600_bc_alu));
1234a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
1235a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.src[0].sel = ctx->temp_reg;
1236a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.sel = ctx->temp_reg;
1237a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.dst.write = 1;
1238a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	alu.last = 1;
1239a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	r = r600_bc_add_alu(ctx->bc, &alu);
1240a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	if (r)
1241a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse		return r;
1242e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	r = r600_bc_add_literal(ctx->bc,ctx->value);
1243e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen	if (r)
1244e77b1e777d585254db62e872a74e23351bb36f85Bas Nieuwenhuizen		return r;
1245a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	return tgsi_helper_tempx_replicate(ctx);
1246a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse}
1247a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse
12480d48925a56ad4fb253386110b545abda82a25464Dave Airliestatic int tgsi_ssg(struct r600_shader_ctx *ctx)
12490d48925a56ad4fb253386110b545abda82a25464Dave Airlie{
12500d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
12510d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct r600_bc_alu alu;
12520d48925a56ad4fb253386110b545abda82a25464Dave Airlie	struct r600_bc_alu_src r600_src[3];
1253921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse	int i, r;
12540d48925a56ad4fb253386110b545abda82a25464Dave Airlie
12550d48925a56ad4fb253386110b545abda82a25464Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
12560d48925a56ad4fb253386110b545abda82a25464Dave Airlie	if (r)
12570d48925a56ad4fb253386110b545abda82a25464Dave Airlie		return r;
12580d48925a56ad4fb253386110b545abda82a25464Dave Airlie
12590d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* tmp = (src > 0 ? 1 : src) */
12600d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
12610d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1262a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
12630d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
1264cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie
12650d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.dst.sel = ctx->temp_reg;
1266cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.dst.chan = i;
12670d48925a56ad4fb253386110b545abda82a25464Dave Airlie
12680d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0] = r600_src[0];
12690d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
12700d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1271921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
12720d48925a56ad4fb253386110b545abda82a25464Dave Airlie
12730d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2] = r600_src[0];
12740d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].chan = tgsi_chan(&inst->Src[0], i);
12750d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
12760d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
12770d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
12780d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
12790d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
12800d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
1281cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie	r = r600_bc_add_literal(ctx->bc, ctx->value);
1282cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie	if (r)
1283cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		return r;
12840d48925a56ad4fb253386110b545abda82a25464Dave Airlie
12850d48925a56ad4fb253386110b545abda82a25464Dave Airlie	/* dst = (-tmp > 0 ? -1 : tmp) */
12860d48925a56ad4fb253386110b545abda82a25464Dave Airlie	for (i = 0; i < 4; i++) {
12870d48925a56ad4fb253386110b545abda82a25464Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1288a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGT);
12890d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.is_op3 = 1;
12900d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
12910d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
12920d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
12930d48925a56ad4fb253386110b545abda82a25464Dave Airlie
12940d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1295cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[0].chan = i;
12960d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[0].neg = 1;
12970d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1298921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[1].sel = V_SQ_ALU_SRC_1;
12990d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[1].neg = 1;
13000d48925a56ad4fb253386110b545abda82a25464Dave Airlie
13010d48925a56ad4fb253386110b545abda82a25464Dave Airlie		alu.src[2].sel = ctx->temp_reg;
1302cb08b9fa84bf432dcca2e685daadd2df651b3025Dave Airlie		alu.src[2].chan = i;
13030d48925a56ad4fb253386110b545abda82a25464Dave Airlie
13040d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (i == 3)
13050d48925a56ad4fb253386110b545abda82a25464Dave Airlie			alu.last = 1;
13060d48925a56ad4fb253386110b545abda82a25464Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
13070d48925a56ad4fb253386110b545abda82a25464Dave Airlie		if (r)
13080d48925a56ad4fb253386110b545abda82a25464Dave Airlie			return r;
13090d48925a56ad4fb253386110b545abda82a25464Dave Airlie	}
13100d48925a56ad4fb253386110b545abda82a25464Dave Airlie	return 0;
13110d48925a56ad4fb253386110b545abda82a25464Dave Airlie}
13120d48925a56ad4fb253386110b545abda82a25464Dave Airlie
1313cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_helper_copy(struct r600_shader_ctx *ctx, struct tgsi_full_instruction *inst)
1314cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1315cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1316cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, r;
1317cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
13189961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
13199961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse	if (r)
13209961a0b92de7afed2afec62dadad08d76d1d3374Jerome Glisse		return r;
1321cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	for (i = 0; i < 4; i++) {
1322cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1323cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (!(inst->Dst[0].Register.WriteMask & (1 << i))) {
1324a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP);
13256c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse			alu.dst.chan = i;
1326cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		} else {
1327a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1328cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
1329cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (r)
1330cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				return r;
1331cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].sel = ctx->temp_reg;
1332cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.src[0].chan = i;
1333cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1334cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (i == 3) {
1335cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			alu.last = 1;
1336cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1337cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1338cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		if (r)
1339cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			return r;
1340cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	}
1341cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return 0;
1342cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1343cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1344de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic int tgsi_op3(struct r600_shader_ctx *ctx)
1345de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse{
1346de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
13477e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1348de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	struct r600_bc_alu alu;
1349de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	int i, j, r;
1350de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
13517e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
13527e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
13537e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
1354de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* do it in 2 step as op3 doesn't support writemask */
1355de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
1356de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1357de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1358de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
13597e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j] = r600_src[j];
13607e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
1361de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1362de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1363de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.dst.chan = i;
1364cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
1365de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		alu.is_op3 = 1;
1366de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
1367de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1368de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1369de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1370de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1371de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1372de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1373cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return tgsi_helper_copy(ctx, inst);
1374cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse}
1375cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
1376cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glissestatic int tgsi_dp(struct r600_shader_ctx *ctx)
1377cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse{
1378cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
13797e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1380cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	struct r600_bc_alu alu;
1381cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	int i, j, r;
1382cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse
13837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
13847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
13857e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
1386de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	for (i = 0; i < 4; i++) {
1387de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1388cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.inst = ctx->inst_info->r600_opcode;
1389cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
13907e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j] = r600_src[j];
13917e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse			alu.src[j].chan = tgsi_chan(&inst->Src[j], i);
1392cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		}
1393cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1394cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.chan = i;
1395cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		alu.dst.write = 1;
1396cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		/* handle some special cases */
1397cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		switch (ctx->inst_info->tgsi_opcode) {
1398cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP2:
1399cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 1) {
1400921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1401cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1402cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1403cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1404cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		case TGSI_OPCODE_DP3:
1405cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			if (i > 2) {
1406921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse				alu.src[0].sel = alu.src[1].sel = V_SQ_ALU_SRC_0;
1407cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse				alu.src[0].chan = alu.src[1].chan = 0;
1408cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			}
1409cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1410e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie		case TGSI_OPCODE_DPH:
1411e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			if (i == 3) {
1412e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].sel = V_SQ_ALU_SRC_1;
1413e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].chan = 0;
1414e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie				alu.src[0].neg = 0;
1415e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			}
1416e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie			break;
1417cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse		default:
1418cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse			break;
1419de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1420de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (i == 3) {
1421de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			alu.last = 1;
1422de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		}
1423de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1424de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse		if (r)
1425de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse			return r;
1426de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	}
1427cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	return tgsi_helper_copy(ctx, inst);
1428de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse}
1429de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse
143033241134e6e3d5bf19141eceff90fd854b23386aJerome Glissestatic int tgsi_tex(struct r600_shader_ctx *ctx)
143133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse{
143233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
143333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	struct r600_bc_tex tex;
1434641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	struct r600_bc_alu alu;
1435641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	unsigned src_gpr;
1436b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	int r, i;
1437bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	int opcode;
1438bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	boolean src_not_temp = inst->Src[0].Register.File != TGSI_FILE_TEMPORARY;
1439bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	uint32_t lit_vals[4];
1440641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1441641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	src_gpr = ctx->file_offset[inst->Src[0].Register.File] + inst->Src[0].Register.Index;
1442641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse
1443b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) {
1444b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		/* Add perspective divide */
1445b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1446a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1447bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
1448bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1449bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1450bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1451b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 3);
1452b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1453b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1454b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1455b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
1456b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1457b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1458b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
1459b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie
1460b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 3; i++) {
1461b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1462a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
1463b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = ctx->temp_reg;
1464b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].chan = 3;
1465bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]);
1466bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1467bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1468b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
1469b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1470b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1471b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1472b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1473b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1474b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1475b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
1476b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1477a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1478921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
1479b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.src[0].chan = 0;
1480b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.sel = ctx->temp_reg;
1481b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.chan = 3;
1482b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.last = 1;
1483b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		alu.dst.write = 1;
1484b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1485b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		if (r)
1486b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			return r;
1487bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		src_not_temp = false;
1488b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1489bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1490bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1491bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
1492bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		int src_chan, src2_chan;
1493bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1494bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.xyzw = CUBE(R0.zzxy, R0.yxzz) */
1495bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		for (i = 0; i < 4; i++) {
1496bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1497a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_CUBE);
1498bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			switch (i) {
1499bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 0:
1500bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 2;
1501bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 1;
1502bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
1503bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 1:
1504bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 2;
1505bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 0;
1506bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
1507bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 2:
1508bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 0;
1509bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 2;
1510bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
1511bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			case 3:
1512bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src_chan = 1;
1513bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				src2_chan = 2;
1514bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				break;
1515bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			}
1516bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
1517bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1518bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1519bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], src_chan);
1520bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[1]);
1521bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1522bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1523bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[0], src2_chan);
1524bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.sel = ctx->temp_reg;
1525bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.chan = i;
1526bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (i == 3)
1527bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				alu.last = 1;
1528bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			alu.dst.write = 1;
1529bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1530bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			if (r)
1531bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie				return r;
1532bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		}
1533bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1534bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* tmp1.z = RCP_e(|tmp1.z|) */
1535bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1536a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE);
1537bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1538bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 2;
1539bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].abs = 1;
1540bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1541bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 2;
1542bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1543bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
1544bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1545bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1546bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1547bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1548bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		/* MULADD R0.x,  R0.x,  PS1,  (0x3FC00000, 1.5f).x
1549bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * MULADD R0.y,  R0.y,  PS1,  (0x3FC00000, 1.5f).x
1550bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 * muladd has no writemask, have to use another temp
1551bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		 */
1552bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1553a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1554bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
1555bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1556bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1557bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 0;
1558bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
1559bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
1560bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1561bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1562bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
1563bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1564bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1565bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 0;
1566bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1567bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1568bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1569bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1570bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1571bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1572bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1573a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1574bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.is_op3 = 1;
1575bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1576bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].sel = ctx->temp_reg;
1577bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[0].chan = 1;
1578bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].sel = ctx->temp_reg;
1579bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[1].chan = 2;
1580bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1581bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].sel = V_SQ_ALU_SRC_LITERAL;
1582bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.src[2].chan = 0;
1583bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1584bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.sel = ctx->temp_reg;
1585bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.chan = 1;
1586bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.dst.write = 1;
1587bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1588bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		alu.last = 1;
1589bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
1590bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1591bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1592bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1593bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		lit_vals[0] = fui(1.5f);
1594bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1595bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		r = r600_bc_add_literal(ctx->bc, lit_vals);
1596bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		if (r)
1597bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie			return r;
1598bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		src_not_temp = false;
1599bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		src_gpr = ctx->temp_reg;
1600bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1601bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1602bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (src_not_temp) {
1603b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		for (i = 0; i < 4; i++) {
1604b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			memset(&alu, 0, sizeof(struct r600_bc_alu));
1605a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie			alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
1606b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].sel = src_gpr;
1607b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.src[0].chan = i;
1608b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.sel = ctx->temp_reg;
1609b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.chan = i;
1610b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (i == 3)
1611b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				alu.last = 1;
1612b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			alu.dst.write = 1;
1613b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			r = r600_bc_add_alu(ctx->bc, &alu);
1614b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie			if (r)
1615b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie				return r;
1616b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		}
1617b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie		src_gpr = ctx->temp_reg;
1618b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	}
1619bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1620bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	opcode = ctx->inst_info->r600_opcode;
1621bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (opcode == SQ_TEX_INST_SAMPLE &&
1622bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	    (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D))
1623bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		opcode = SQ_TEX_INST_SAMPLE_C;
162433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
162533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	memset(&tex, 0, sizeof(struct r600_bc_tex));
1626bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	tex.inst = opcode;
162733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.resource_id = ctx->file_offset[inst->Src[1].Register.File] + inst->Src[1].Register.Index;
162833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.sampler_id = tex.resource_id;
1629641c9adb09e8707f659d42be600d16902ebf8895Jerome Glisse	tex.src_gpr = src_gpr;
16306c288d06ac512be6eb7f19a9005389dd46d5a26aJerome Glisse	tex.dst_gpr = ctx->file_offset[inst->Dst[0].Register.File] + inst->Dst[0].Register.Index;
163133241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_x = 0;
163233241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_y = 1;
163333241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_z = 2;
163433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.dst_sel_w = 3;
163533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_x = 0;
163633241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_y = 1;
163733241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_z = 2;
163833241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse	tex.src_sel_w = 3;
16399a78e790dc4c40362b971ad5eff2505c02b73ed7Jerome Glisse
1640bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_CUBE) {
1641bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_x = 1;
1642bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_y = 0;
1643bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_z = 3;
1644bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		tex.src_sel_w = 1;
1645bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	}
1646bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
164701984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
164801984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_x = 1;
164901984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_y = 1;
16507e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		tex.coord_type_z = 1;
165101984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie		tex.coord_type_w = 1;
165201984cf34fa4e6d564d06a126795468b5718ecb0Dave Airlie	}
1653bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1654bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D)
16555d5f693cefe452bd8bd7e45f8b5d7ed991ae5115Dave Airlie		tex.src_sel_w = 2;
1656bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1657bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	r = r600_bc_add_tex(ctx->bc, &tex);
1658bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	if (r)
1659bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie		return r;
1660bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
1661bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	/* add shadow ambient support  - gallium doesn't do it yet */
1662bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie	return 0;
1663bea5f559a6f52e8fb7c32ee8e9f9c5f04c05b582Dave Airlie
166433241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse}
166533241134e6e3d5bf19141eceff90fd854b23386aJerome Glisse
1666b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glissestatic int tgsi_lrp(struct r600_shader_ctx *ctx)
1667b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse{
1668b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
16697e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	struct r600_bc_alu_src r600_src[3];
1670b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	struct r600_bc_alu alu;
1671b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	unsigned i;
1672b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	int r;
1673b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
16747e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	r = tgsi_split_constant(ctx, r600_src);
16757e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	if (r)
16767e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		return r;
1677b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* 1 - src0 */
1678b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
1679b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1680a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD);
1681921c987c6f43b4d63a98b61013d43bac97baff21Jerome Glisse		alu.src[0].sel = V_SQ_ALU_SRC_1;
1682b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = 0;
16837e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[0];
16847e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[0], i);
1685b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[1].neg = 1;
1686b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1687b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1688b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
1689b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1690b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1691b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
1692b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1693b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1694b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1695b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1696b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
1697b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	if (r)
1698b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		return r;
1699b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
1700b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* (1 - src0) * src2 */
1701b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
1702b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1703a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
1704b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].sel = ctx->temp_reg;
1705b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[0].chan = i;
17067e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[2];
17077e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[2], i);
1708b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1709b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1710b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
1711b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1712b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1713b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.write = 1;
1714b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1715b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1716b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1717b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1718b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	r = r600_bc_add_literal(ctx->bc, ctx->value);
1719b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	if (r)
1720b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		return r;
1721b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
1722b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	/* src0 * src1 + (1 - src0) * src2 */
1723b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	for (i = 0; i < 4; i++) {
1724b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		memset(&alu, 0, sizeof(struct r600_bc_alu));
1725a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
1726b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.is_op3 = 1;
17277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0] = r600_src[0];
17287e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
17297e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1] = r600_src[1];
17307e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse		alu.src[1].chan = tgsi_chan(&inst->Src[1], i);
1731b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].sel = ctx->temp_reg;
1732b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.src[2].chan = i;
1733b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.sel = ctx->temp_reg;
1734b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		alu.dst.chan = i;
1735b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (i == 3) {
1736b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			alu.last = 1;
1737b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		}
1738b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		r = r600_bc_add_alu(ctx->bc, &alu);
1739b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse		if (r)
1740b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse			return r;
1741b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	}
1742b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	return tgsi_helper_copy(ctx, inst);
1743b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse}
1744b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse
174587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airliestatic int tgsi_cmp(struct r600_shader_ctx *ctx)
174687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie{
174787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
174887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct r600_bc_alu_src r600_src[3];
174987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	struct r600_bc_alu alu;
175087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int use_temp = 0;
175187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	int i, r;
175287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
175387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	r = tgsi_split_constant(ctx, r600_src);
175487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	if (r)
175587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		return r;
175687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
175787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
175887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		use_temp = 1;
175987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
176087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	for (i = 0; i < 4; i++) {
176187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1762a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_CNDGE);
176387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[0] = r600_src[0];
176487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
176587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
176687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[1] = r600_src[2];
176787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[1].chan = tgsi_chan(&inst->Src[2], i);
176887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
176987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[2] = r600_src[1];
177087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.src[2].chan = tgsi_chan(&inst->Src[1], i);
177187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
177287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (use_temp)
177387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.dst.sel = ctx->temp_reg;
177487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		else {
177587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
177687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			if (r)
177787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie				return r;
177887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		}
177987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.chan = i;
178087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.dst.write = 1;
178187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		alu.is_op3 = 1;
178287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (i == 3)
178387f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			alu.last = 1;
178487f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
178587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		if (r)
178687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie			return r;
178787f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	}
178887f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	if (use_temp)
178987f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie		return tgsi_helper_copy(ctx, inst);
179087f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	return 0;
179187f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie}
179287f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
17930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airliestatic int tgsi_xpd(struct r600_shader_ctx *ctx)
17940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie{
17950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
17960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct r600_bc_alu_src r600_src[3];
17970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	struct r600_bc_alu alu;
17980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	uint32_t use_temp = 0;
17990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	int i, r;
18000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
18010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (inst->Dst[0].Register.WriteMask != 0xf)
18020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		use_temp = 1;
18030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
18040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	r = tgsi_split_constant(ctx, r600_src);
18050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (r)
18060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return r;
18070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
18080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
18090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1810a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
18110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
18120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[0] = r600_src[0];
18130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
18140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
18150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 2);
18160e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
18170e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
18180e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
18190e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
18200e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
18210e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
18220e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
18230e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
18240e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
18250e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
18260e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
18270e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
18280e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[1] = r600_src[1];
18290e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
18300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
18310e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 1);
18320e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
18330e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
18340e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 2);
18350e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
18360e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
18370e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 0);
18380e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
18390e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
18400e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
18410e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
18420e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
18430e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
18440e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.sel = ctx->temp_reg;
18450e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
18460e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
18470e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
18480e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
18490e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
18500e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
18510e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
18520e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
18530e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
18540e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
18550e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	for (i = 0; i < 4; i++) {
18560e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1857a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD);
18580e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
18590e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[0] = r600_src[0];
18600e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
18610e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
18620e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 1);
18630e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
18640e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
18650e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 2);
18660e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
18670e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
18680e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
18690e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
18700e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
18710e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_0;
18720e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[0].chan = i;
18730e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
18740e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
18750e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[1] = r600_src[1];
18760e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		switch (i) {
18770e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 0:
18780e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 2);
18790e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
18800e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 1:
18810e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 0);
18820e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
18830e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 2:
18840e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], 1);
18850e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			break;
18860e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		case 3:
18870e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_0;
18880e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.src[1].chan = i;
18890e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
18900e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
18910e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].sel = ctx->temp_reg;
18920e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].neg = 1;
18930e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.src[2].chan = i;
18940e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
18950e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (use_temp)
18960e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.dst.sel = ctx->temp_reg;
18970e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		else {
18980e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
18990e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			if (r)
19000e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie				return r;
19010e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		}
19020e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.chan = i;
19030e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.dst.write = 1;
19040e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		alu.is_op3 = 1;
19050e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (i == 3)
19060e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			alu.last = 1;
19070e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
19080e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		if (r)
19090e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie			return r;
19100e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	}
19110e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	if (use_temp)
19120e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie		return tgsi_helper_copy(ctx, inst);
19130e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	return 0;
19140e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie}
19150e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie
191636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airliestatic int tgsi_exp(struct r600_shader_ctx *ctx)
191736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie{
191836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
191936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct r600_bc_alu_src r600_src[3];
192036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	struct r600_bc_alu alu;
192109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int r;
192236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
192336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.x = 2^floor(src); */
192436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if (inst->Dst[0].Register.WriteMask & 1) {
192536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
192636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
1927a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
192836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
192936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
193036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
193136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
193236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
193336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
193436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
193536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
193636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
193736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
193836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
193936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
194036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
194136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
19425ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
19435ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
19445ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
19455ea238b7991331c854e66a16911d616d36965dc9Dave Airlie
1946a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
194736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = ctx->temp_reg;
194836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
194936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
195036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
195136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 0;
195236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
195336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
195436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
195536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
195636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
19575ea238b7991331c854e66a16911d616d36965dc9Dave Airlie
19585ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
19595ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
19605ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
196136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
196236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
196336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.y = tmp - floor(tmp); */
196436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
196536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
196636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
1967a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT);
196836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0] = r600_src[0];
196936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
197036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
197136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
197236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
197336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
197436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
197536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
197636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//		if (r)
197736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie//			return r;
197836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
197936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 1;
198036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
198136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
198236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
198336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
198436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
198536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
19865ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
19875ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
19885ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
198936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
199036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
199136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.z = RoughApprox2ToX(tmp);*/
199236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 2) & 0x1) {
199336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
1994a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE);
199536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
199636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
199736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
199836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
199936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
200036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
200136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
200236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 2;
200336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
200436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
200536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
200636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
200736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
200836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
20095ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
20105ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
20115ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
201236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
201336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
201436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	/* result.w = 1.0;*/
201536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	if ((inst->Dst[0].Register.WriteMask >> 3) & 0x1) {
201636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
201736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
2018a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
201936d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].sel = V_SQ_ALU_SRC_1;
202036d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.src[0].chan = 0;
202136d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie
202236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.sel = ctx->temp_reg;
202336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.chan = 3;
202436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.dst.write = 1;
202536d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		alu.last = 1;
202636d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
202736d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie		if (r)
202836d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie			return r;
20295ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		r = r600_bc_add_literal(ctx->bc, ctx->value);
20305ea238b7991331c854e66a16911d616d36965dc9Dave Airlie		if (r)
20315ea238b7991331c854e66a16911d616d36965dc9Dave Airlie			return r;
203236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	}
203336d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	return tgsi_helper_copy(ctx, inst);
203436d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie}
203587f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie
2036460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeckstatic int tgsi_log(struct r600_shader_ctx *ctx)
2037460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck{
2038460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
2039460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct r600_bc_alu_src r600_src[3];
2040460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	struct r600_bc_alu alu;
2041460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	int r;
2042460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2043460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.x = floor(log2(src)); */
2044460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if (inst->Dst[0].Register.WriteMask & 1) {
2045460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2046460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2047460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
2048460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
2049460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2050460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2051460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2052460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
2053460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2054460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2055460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
2056460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2057460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2058460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2059460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2060460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2061460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2062460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2063460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2064460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2065460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2066460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR);
2067460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = ctx->temp_reg;
2068460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2069460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2070460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2071460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 0;
2072460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2073460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2074460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2075460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2076460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2077460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2078460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2079460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2080460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2081460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2082460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2083460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2084460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.y = FIXME; */
2085460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 1) & 1) {
2086460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2087460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2088460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2089460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
2090460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2091460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2092460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2093460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 1;
2094460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2095460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2096460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2097460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2098460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2099460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2100460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2101460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2102460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2103460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2104460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2105460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2106460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.z = log2(src);*/
2107460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 2) & 1) {
2108460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2109460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2110460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE);
2111460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
2112460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2113460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2114460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2115460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
2116460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2117460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2118460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2119460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 2;
2120460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2121460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2122460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2123460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2124460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2125460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2126460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2127460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2128460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2129460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2130460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2131460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	/* result.w = 1.0; */
2132460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	if ((inst->Dst[0].Register.WriteMask >> 3) & 1) {
2133460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		memset(&alu, 0, sizeof(struct r600_bc_alu));
2134460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2135460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV);
2136460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].sel = V_SQ_ALU_SRC_1;
2137460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.src[0].chan = 0;
2138460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2139460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.sel = ctx->temp_reg;
2140460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.chan = 3;
2141460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.dst.write = 1;
2142460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		alu.last = 1;
2143460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2144460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_alu(ctx->bc, &alu);
2145460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2146460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2147460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2148460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		r = r600_bc_add_literal(ctx->bc, ctx->value);
2149460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck		if (r)
2150460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck			return r;
2151460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	}
2152460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
2153460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	return tgsi_helper_copy(ctx, inst);
2154460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck}
2155460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck
215647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airliestatic int tgsi_arl(struct r600_shader_ctx *ctx)
215747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie{
215847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	/* TODO from r600c, ar values don't persist between clauses */
215947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
216047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	struct r600_bc_alu alu;
216147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	int r;
216247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
216347d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
216447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	alu.inst = V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_FLOOR;
216547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
216647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
216747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (r)
216847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		return r;
216947d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
217047d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
217147d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	alu.last = 1;
217247d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
2173a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU));
217447d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	if (r)
217547d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie		return r;
217647d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	return 0;
217747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie}
217847d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie
217957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airliestatic int tgsi_opdst(struct r600_shader_ctx *ctx)
218057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie{
218157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
218257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	struct r600_bc_alu alu;
218357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	int i, r = 0;
218457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
218557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	for (i = 0; i < 4; i++) {
218657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		memset(&alu, 0, sizeof(struct r600_bc_alu));
218757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2188a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie		alu.inst = CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL);
218957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst);
219057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
219157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
219257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
219357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	        if (i == 0 || i == 3) {
219457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].sel = V_SQ_ALU_SRC_1;
219557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
219657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
219757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			if (r)
219857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie				return r;
219957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[0].chan = tgsi_chan(&inst->Src[0], i);
220057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
220157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
220257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	        if (i == 0 || i == 2) {
220357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].sel = V_SQ_ALU_SRC_1;
220457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		} else {
220557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			r = tgsi_src(ctx, &inst->Src[1], &alu.src[1]);
220657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			if (r)
220757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie				return r;
220857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.src[1].chan = tgsi_chan(&inst->Src[1], i);
220957eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		}
221057eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (i == 3)
221157eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			alu.last = 1;
221257eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		r = r600_bc_add_alu(ctx->bc, &alu);
221357eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie		if (r)
221457eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie			return r;
221557eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	}
221657eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	return 0;
221757eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie}
221857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie
2219a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int emit_logic_pred(struct r600_shader_ctx *ctx, int opcode)
2220a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2221a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction;
222209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_bc_alu alu;
2223a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	int r;
2224a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2225a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	memset(&alu, 0, sizeof(struct r600_bc_alu));
2226a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.inst = opcode;
2227a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.predicate = 1;
2228a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2229a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.sel = ctx->temp_reg;
2230a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.write = 1;
2231a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.dst.chan = 0;
2232a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2233a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r = tgsi_src(ctx, &inst->Src[0], &alu.src[0]);
2234a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
2235a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
2236a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[0].chan = tgsi_chan(&inst->Src[0], 0);
2237a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].sel = V_SQ_ALU_SRC_0;
2238a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.src[1].chan = 0;
2239a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2240a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	alu.last = 1;
2241a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2242a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r = r600_bc_add_alu_type(ctx->bc, &alu, CTX_INST(V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE));
2243a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (r)
2244a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return r;
2245a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2246a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2247a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2248a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int pops(struct r600_shader_ctx *ctx, int pops)
2249a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2250a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_POP));
2251a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = pops;
2252a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2253a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2254a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
225509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_decrease_current(struct r600_shader_ctx *ctx, unsigned reason)
2256a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
225709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch(reason) {
225809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
225909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current--;
226009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
226109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
226209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
226309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current -= 4;
226409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
226509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
226609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		/* TOODO : for 16 vp asic should -= 2; */
226709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current --;
226809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
226909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
227009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2271a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
227209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic inline void callstack_check_depth(struct r600_shader_ctx *ctx, unsigned reason, unsigned check_max_only)
227309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
227409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (check_max_only) {
227509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		int diff;
227609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		switch (reason) {
227709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_VPM:
227809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 1;
227909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
228009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		case FC_PUSH_WQM:
228109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			diff = 4;
228209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
228309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
228409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if ((ctx->bc->callstack[ctx->bc->call_sp].current + diff) >
228509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		    ctx->bc->callstack[ctx->bc->call_sp].max) {
228609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].max =
228709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie				ctx->bc->callstack[ctx->bc->call_sp].current + diff;
228809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		}
228909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return;
229009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
229109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	switch (reason) {
229209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_VPM:
229309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
229409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
229509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_PUSH_WQM:
229609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_LOOP:
229709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current += 4;
229809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
229909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	case FC_REP:
230009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].current++;
230109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		break;
230209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
230309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
230409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if ((ctx->bc->callstack[ctx->bc->call_sp].current) >
230509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	    ctx->bc->callstack[ctx->bc->call_sp].max) {
230609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->callstack[ctx->bc->call_sp].max =
230709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			ctx->bc->callstack[ctx->bc->call_sp].current;
230809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
230909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
231009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
231109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_set_mid(struct r600_shader_ctx *ctx, int fc_sp)
231209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
231309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[fc_sp];
231409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
231509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid = (struct r600_bc_cf **)realloc((void *)sp->mid,
231609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie						sizeof(struct r600_bc_cf *) * (sp->num_mid + 1));
231709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->mid[sp->num_mid] = ctx->bc->cf_last;
231809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid++;
231909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2320a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
232109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_pushlevel(struct r600_shader_ctx *ctx, int type)
232209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2323a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_sp++;
232409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].type = type;
232509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start = ctx->bc->cf_last;
232609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
232709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
232809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void fc_poplevel(struct r600_shader_ctx *ctx)
232909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
233009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	struct r600_cf_stack_entry *sp = &ctx->bc->fc_stack[ctx->bc->fc_sp];
233109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (sp->mid) {
233209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		free(sp->mid);
233309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		sp->mid = NULL;
233409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
233509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->num_mid = 0;
233609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->start = NULL;
233709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	sp->type = 0;
233809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_sp--;
233909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
234009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
234109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#if 0
234209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_return(struct r600_shader_ctx *ctx)
234309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
234409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_RETURN);
234509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
234609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
234709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
234809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_jump_to_offset(struct r600_shader_ctx *ctx, int pops, int offset)
234909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
235009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2351a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	r600_bc_add_cfinst(ctx->bc, V_SQ_CF_WORD1_SQ_CF_INST_JUMP);
235209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = pops;
235309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO work out offset */
235409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
235509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
2356a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
235709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int emit_setret_in_loop_flag(struct r600_shader_ctx *ctx, unsigned flag_value)
235809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
235909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
236009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
236109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
236209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_testflag(struct r600_shader_ctx *ctx)
236309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
236409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
236509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
236609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
236709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void emit_return_on_flag(struct r600_shader_ctx *ctx, unsigned ifidx)
236809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
236909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
237009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_jump_to_offset(ctx, 1, 4);
237109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_setret_in_loop_flag(ctx, V_SQ_ALU_SRC_0);
237209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, ifidx + 1);
237309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_return(ctx);
237409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
237509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
237609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic void break_loop_on_flag(struct r600_shader_ctx *ctx, unsigned fc_sp)
237709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
237809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	emit_testflag(ctx);
237909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
238009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
238109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
238209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
238309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fc_sp);
238409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
238509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
238609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
238709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie#endif
238809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
238909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_if(struct r600_shader_ctx *ctx)
239009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2391a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	emit_logic_pred(ctx, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE));
239209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2393a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_JUMP));
239409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
239509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_IF);
239609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
239709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 0);
2398a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2399a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2400a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2401a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_else(struct r600_shader_ctx *ctx)
2402a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2403a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_ELSE));
2404a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->cf_last->pop_count = 1;
2405a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
240609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, ctx->bc->fc_sp);
2407a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id;
2408a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2409a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2410a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2411a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airliestatic int tgsi_endif(struct r600_shader_ctx *ctx)
2412a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie{
2413a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	pops(ctx, 1);
2414a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_IF) {
2415a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		R600_ERR("if/endif unbalanced in shader\n");
2416a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		return -1;
2417a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
2418a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2419a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].mid == NULL) {
2420a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
2421a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].start->pop_count = 1;
2422a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	} else {
242309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[0]->cf_addr = ctx->bc->cf_last->id + 2;
2424a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	}
242509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
242609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
242709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_PUSH_VPM);
242809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
242909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
243009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
243109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_bgnloop(struct r600_shader_ctx *ctx)
243209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
2433a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL));
243409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
243509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_pushlevel(ctx, FC_LOOP);
2436a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
243709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* check stack depth */
243809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_LOOP, 0);
243909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
244009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
244109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
244209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_endloop(struct r600_shader_ctx *ctx)
244309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
244409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	int i;
244509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
2446a3a94554f5a12f0626d9712ddcdc81b1e21d36c2Dave Airlie	r600_bc_add_cfinst(ctx->bc, CTX_INST(V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END));
244709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
244809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (ctx->bc->fc_stack[ctx->bc->fc_sp].type != FC_LOOP) {
244909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("loop/endloop in shader code are not paired.\n");
245009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
245109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
245209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
245309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* fixup loop pointers - from r600isa
245409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP END points to CF after LOOP START,
245509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   LOOP START point to CF after LOOP END
245609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	   BRK/CONT point to LOOP END CF
245709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	*/
245809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->cf_addr = ctx->bc->fc_stack[ctx->bc->fc_sp].start->id + 2;
245909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
246009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->fc_stack[ctx->bc->fc_sp].start->cf_addr = ctx->bc->cf_last->id + 2;
246109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
246209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (i = 0; i < ctx->bc->fc_stack[ctx->bc->fc_sp].num_mid; i++) {
246309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		ctx->bc->fc_stack[ctx->bc->fc_sp].mid[i]->cf_addr = ctx->bc->cf_last->id;
246409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
246509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	/* TODO add LOOPRET support */
246609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_poplevel(ctx);
246709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_decrease_current(ctx, FC_LOOP);
246809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	return 0;
246909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie}
247009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
247109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airliestatic int tgsi_loop_brk_cont(struct r600_shader_ctx *ctx)
247209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie{
247309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	unsigned int fscp;
247409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
247509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	for (fscp = ctx->bc->fc_sp; fscp > 0; fscp--)
247609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{
247709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		if (FC_LOOP == ctx->bc->fc_stack[fscp].type)
247809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie			break;
247909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
248009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
248109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	if (fscp == 0) {
248209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		R600_ERR("Break not inside loop/endloop pair\n");
248309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie		return -EINVAL;
248409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	}
248509547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
248609547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	r600_bc_add_cfinst(ctx->bc, ctx->inst_info->r600_opcode);
248709547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	ctx->bc->cf_last->pop_count = 1;
248809547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
248909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	fc_set_mid(ctx, fscp);
249009547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie
249109547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	pops(ctx, 1);
249209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	callstack_check_depth(ctx, FC_PUSH_VPM, 1);
2493a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	return 0;
2494a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie}
2495a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie
2496de553d906b4a205d811a9e1651f14212ec284e29Jerome Glissestatic struct r600_shader_tgsi_instruction r600_shader_tgsi_instruction[] = {
249747d5a19df1e7760c4f5f0e340bfc56355c2e428bDave Airlie	{TGSI_OPCODE_ARL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_arl},
2498de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
24990bebdc230ff09f191cfa269c2cbcbb257fd2e0fcStephan Schmid	{TGSI_OPCODE_LIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lit},
25007e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_RCP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_RECIP_IEEE, tgsi_trans_srcx_replicate},
250142c966bc496d4049d98eb1d45dd7bb0b55fa41bdTilman Sauerbeck	{TGSI_OPCODE_RSQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_rsq},
250236d91be75ea9b79878fdf4b789ea022d781e87f4Dave Airlie	{TGSI_OPCODE_EXP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_exp},
2503460c5304aba646143938b76d536a6fc13a302ca8Tilman Sauerbeck	{TGSI_OPCODE_LOG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_log},
2504de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MUL, tgsi_op2},
2505de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
2506cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP3,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
2507cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
250857eecbbf6c57fbf5a46b8b81d8d4fbb6bd78ea12Dave Airlie	{TGSI_OPCODE_DST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_opdst},
2509dd863bf5e7c6680075cf7c355a026b1da69ee9e3Jerome Glisse	{TGSI_OPCODE_MIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MIN, tgsi_op2},
2510de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MAX, tgsi_op2},
2511d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2_swap},
2512be288c3505429811adc2743c1be2c1971f4483a2Dave Airlie	{TGSI_OPCODE_SGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2},
2513de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MAD,	1, V_SQ_ALU_WORD1_OP3_SQ_OP3_INST_MULADD, tgsi_op3},
2514de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_ADD, tgsi_op2},
2515b346c4205dc19c9ffbff48ed8bd89687772a96f8Jerome Glisse	{TGSI_OPCODE_LRP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_lrp},
2516de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2517de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2518de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{20,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2519de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DP2A,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2520de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2521de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{22,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2522de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{23,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
25233af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FRC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FRACT, tgsi_op2},
2524de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CLAMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
25253af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_FLR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_FLOOR, tgsi_op2},
2526de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ROUND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
25277e42b7e5d2aebcda0e6bf081b6661411731e6df2Jerome Glisse	{TGSI_OPCODE_EX2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_EXP_IEEE, tgsi_trans_srcx_replicate},
25284558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_LG2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_LOG_IEEE, tgsi_trans_srcx_replicate},
2529a4b10a56145ea253def4cf958410d770d0640bc9Jerome Glisse	{TGSI_OPCODE_POW,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_pow},
25300e6a02d29915db2ca460206656ab517ddaf0b455Dave Airlie	{TGSI_OPCODE_XPD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_xpd},
2531de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2532de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{32,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
25337a73390f9126fd270d9891cd9d2bf38ef56d9b80Jerome Glisse	{TGSI_OPCODE_ABS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOV, tgsi_op2},
2534de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RCC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2535e57437ccd6814ffd4534fd46512afeb0b9e06eedDave Airlie	{TGSI_OPCODE_DPH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
253688f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_COS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_COS, tgsi_trig},
25373af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDX,	0, SQ_TEX_INST_GET_GRADIENTS_H, tgsi_tex},
25383af87162cd0d3107cb2af0812ce4e4680b177725Dave Airlie	{TGSI_OPCODE_DDY,	0, SQ_TEX_INST_GET_GRADIENTS_V, tgsi_tex},
25394502b17901ad491e0598ee59a12d372c008ae03bDave Airlie	{TGSI_OPCODE_KILP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* predicated kill */
2540de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2541de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2542de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2543de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PK4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2544de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
25450d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETE, tgsi_op2},
2546de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SFL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
25470d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SGT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGT, tgsi_op2},
254888f5976484842671ecb2cefcfa91838a43032359Dave Airlie	{TGSI_OPCODE_SIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SIN, tgsi_trig},
2549d8fb13bae30b6ff214c5d5158b9bcaf430f56b43Dave Airlie	{TGSI_OPCODE_SLE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETGE, tgsi_op2_swap},
25500d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_SETNE, tgsi_op2},
2551de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_STR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2552b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TEX,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
2553de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2554b777db32541b360516203865a0fa41f4b8cebf7cDave Airlie	{TGSI_OPCODE_TXP,	0, SQ_TEX_INST_SAMPLE, tgsi_tex},
2555de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2H,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2556de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP2US,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2557de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4B,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2558de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UP4UB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2559de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_X2D,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2560de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2561de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ARR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2562de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BRA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2563de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CAL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2564de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_RET,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
25650d48925a56ad4fb253386110b545abda82a25464Dave Airlie	{TGSI_OPCODE_SSG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_ssg},
256687f44d5723ebb3a2efe0dddc1a6edb6536adea4dDave Airlie	{TGSI_OPCODE_CMP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_cmp},
256792f5c7a597aaf098f4e6b4793e4b89ae539e328aDave Airlie	{TGSI_OPCODE_SCS,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_scs},
2568d01c0025e81e713d99f4de9ed7f4cdd12a1d08b5Dave Airlie	{TGSI_OPCODE_TXB,	0, SQ_TEX_INST_SAMPLE_L, tgsi_tex},
2569de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2570de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2571cf864fd58b2a4780482a108cd3ff86779e8fa965Jerome Glisse	{TGSI_OPCODE_DP2,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_DOT4, tgsi_dp},
2572de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
257309547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BRK,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK, tgsi_loop_brk_cont},
2574a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_IF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_if},
2575de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2576de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{75,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2577de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{76,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2578a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ELSE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_else},
2579a03d456f5a41926e39194de70b2d50776e64b8a2Dave Airlie	{TGSI_OPCODE_ENDIF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endif},
2580de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2581de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{79,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2582de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{80,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2583de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_PUSHA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2584de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_POPA,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2585de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CEIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2586de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_I2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2587de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
25884558b634556f42867449a6e60d4badc72099f10dDave Airlie	{TGSI_OPCODE_TRUNC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_TRUNC, tgsi_trans_srcx_replicate},
2589de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SHL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2590de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2591de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{88,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2592de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_AND,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2593de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_OR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2594de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_MOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2595de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_XOR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2596de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2597de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXF,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2598de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_TXQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
259909547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_CONT,	0, V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE, tgsi_loop_brk_cont},
2600de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_EMIT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2601de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDPRIM,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
260209547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_BGNLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_bgnloop},
2603de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BGNSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
260409547e1bcee7df3444dd8682770d1b31da1a5822Dave Airlie	{TGSI_OPCODE_ENDLOOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_endloop},
2605de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSUB,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2606de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2607de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{103,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2608de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{104,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2609de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{105,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2610de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{106,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2611de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NOP,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2612de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2613de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{108,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2614de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{109,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2615de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{110,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2616de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{111,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2617de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_NRM4,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2618de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CALLNZ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2619de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IFC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2620de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_BREAKC,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2621094d66f45992830929d620782c70836b4b9b4a37Jerome Glisse	{TGSI_OPCODE_KIL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_KILLGT, tgsi_kill},  /* conditional kill */
2622de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_END,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_end},  /* aka HALT */
2623de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	/* gap */
2624de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{118,			0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2625de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2I,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2626de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2627de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2628de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_IMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2629de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_INEG,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2630de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2631de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2632de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ISLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2633de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_F2U,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2634de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_U2F,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2635de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UADD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2636de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UDIV,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2637de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2638de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMAX,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2639de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMIN,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2640de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMOD,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2641de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_UMUL,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2642de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USEQ,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2643de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USGE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2644de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USHR,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2645de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USLT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2646de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_USNE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2647de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_SWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2648de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_CASE,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2649de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_DEFAULT,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2650de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_ENDSWITCH,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2651de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse	{TGSI_OPCODE_LAST,	0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP, tgsi_unsupported},
2652de553d906b4a205d811a9e1651f14212ec284e29Jerome Glisse};
2653